From 3eba8fc9e4c921af233e15ebad4afbccd38f4e13 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 09:16:49 +0000 Subject: [PATCH 01/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index 52ba1281d2..aaf421f012 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759306817829,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759306817917},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759310209183,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759310209268},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From 702de7d1838861e180e7592e54a90e962e8b62e8 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 09:28:37 +0000 Subject: [PATCH 02/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From 54a88701d9d11c7b052479397752468e5c78533e Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 10:16:18 +0000 Subject: [PATCH 03/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index aaf421f012..62c7d1ffa3 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759310209183,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759310209268},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759313778416,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759313778494},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From 0f428acb6e47eabb1f841aac29ec70dba023177c Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 10:29:08 +0000 Subject: [PATCH 04/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From b85da25b80789b5ea3d262d83e3302caafebd5af Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 11:12:54 +0000 Subject: [PATCH 05/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------ static/meta.json | 2 +- static/my/solutions.json | 2 +- 3 files changed, 108 insertions(+), 93 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index 62c7d1ffa3..c333c9a4b6 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759313778416,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759313778494},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759317173890,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759317173978},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file diff --git a/static/my/solutions.json b/static/my/solutions.json index bd9695c11c..037f706e31 100644 --- a/static/my/solutions.json +++ b/static/my/solutions.json @@ -1 +1 @@ -{"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[],"10":[],"11":[],"12":[],"13":[],"14":[],"15":[],"16":[],"17":[],"18":[],"19":[],"20":[],"21":[],"22":[],"23":[],"24":[],"25":[],"26":[],"27":[],"28":[],"29":[],"30":[],"31":[],"32":[],"33":[],"34":[],"35":[],"36":[],"37":[],"38":[],"39":[],"40":[],"41":[],"42":[],"43":[],"44":[],"45":[],"46":[],"47":[],"48":[],"49":[],"50":[],"51":[],"52":[],"53":[],"54":[],"55":[],"56":[],"57":[],"58":[],"59":[],"60":[],"61":[],"62":[],"63":[],"64":[],"65":[],"66":[],"67":[],"68":[],"69":[],"70":[],"71":[],"72":[],"73":[],"74":[],"75":[],"76":[],"77":[],"78":[],"79":[],"80":[],"81":[],"82":[],"83":[],"84":[],"85":[],"86":[],"87":[],"88":[],"89":[],"90":[],"91":[],"839781960":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"954545647":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"1541732340":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"michaelxi3":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"darknightwriter":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"findlayzhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"laofuwf":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lbc546":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zch-bit":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"frankelzeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xingzhaodev":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joeymoso":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hackbl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"q815101630":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shiyishuoshuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aouos":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"thinkfurther":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wengzhouyunfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whisht":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bzlff":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzzkains":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chenmengyu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uancen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nuomituxedo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhongranherz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gr52":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hydelovegood":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nikojxie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fangxianshen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jokertzw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cyang258":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kernelsue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erikahuang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kuang-mou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"iloveqier":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"duke-github":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"caterpillar-0":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ashleyyma6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuki-yzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zpc7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yujian920":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kiirii4":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ucashurui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xixiao51":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"feikerwu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"heng518":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yaya-bb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tlntin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richypang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fenchuiyun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jerry-lllman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nickyk319":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"herbertpan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wsmmxmm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fan-svg":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuzejia":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunnyyujf":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"phoenixflyingsky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nehchsuy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lzyxts":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elainekuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ll491119940":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"2learnsomething":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ataraxyadong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wzasd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miluowzt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maylinglin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weijie-he":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brodxie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"y525":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"leungogogo":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074242240","body":"## Main Idea\nFirst, it looks like we can convert the array `num` to integer and add it to `k`, but `num.length <= 1E+4` so this approach will cause integer overflow. So we will have to do the addition in array form.\n\nThen the idea is to simulate the entire process, add each digit of `num` and `k` with a `carry` bit. We will terminate the loop when we run out of digits for both `num` and `k` and `carry == 0`.\n\n## Code\n```java\nclass Solution {\n public List addToArrayForm(int[] num, int k) {\n int n = num.length, carry = 0, i = n - 1;\n List res = new ArrayList<>();\n \n while (i >= 0 || k > 0 || carry > 0) {\n int kDigit = k % 10;\n k /= 10;\n int sum = i >= 0 ? carry + kDigit + num[i] : carry + kDigit;\n res.add(sum % 10);\n carry = sum >= 10 ? 1 : 0;\n --i;\n }\n \n Collections.reverse(res);\n return res;\n }\n}\n```\n\n## Complexity Analysis\nTime: `O(2*max(N, log(K)))`\n* Given a number `K`, its length will be `O(log_{2}(K))`, the time complexity depends on the length of `N` and `K`, whichever is longer.\n* Notice we want to insert digits at the end of the array and then reverse it after we finish the addition (reverse takes `O(res.size())`). If we insert at the head of array, then it will take `O(n^2)` of time.\n\nSpace: `O(1)`, as we didn't use additional spaces except the return array.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077454608","body":"#### Main Idea\nThe problem asks for the shortest distance from each character in a string s to a given character c. Since c may appear multiple times, we must compute the shortest distance to any occurrence of c for each index.\n\nThe key idea is to perform two passes over the string:\n\nLeft-to-right pass: Calculate distance from the nearest c to the left.\n\nRight-to-left pass: Refine the distance by checking for any closer c on the right.\n\nBy using two passes, we can efficiently compute the minimal distance to the nearest c for each character.\n\n#### Code\n\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n int n = s.length();\n int[] dist = new int[n];\n Arrays.fill(dist, Integer.MAX_VALUE);\n for (int i = 0; i < n; ++i) {\n if (s.charAt(i) == c) {\n dist[i] = 0;\n } else if (i > 0 && dist[i - 1] < Integer.MAX_VALUE) {\n dist[i] = dist[i - 1] + 1;\n }\n }\n\n for (int i = n - 1; i >= 0; --i) {\n if (i < n - 1 && dist[i + 1] != Integer.MAX_VALUE) {\n dist[i] = Math.min(dist[i], dist[i + 1] + 1);\n }\n }\n\n return dist;\n }\n}\n```\n\n#### Complexity\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082949045","body":"## Main Idea\nA stack can be implemented with an array, but usually we only have access to stack top due to encapsulation, while we can actually access/modify any elements in the array internally.\n\nWe can implement the stack API with `array`:\n* `push()`: append at the end of array (`O(1)`)\n* `pop()`: remove the end of array (`O(1)`)\n* `increment()`: use a for loop to increment `array[0:k]` (`O(k)`).\n\n### Optimization. Range Update && Lazy Evaluation\nNotice the time complexity of `increment()` is too high due to range update, and we can use a difference array to optimize it.\n\nAlso we don't really care about the values of elements until we `pop` them, so we can evaluate them when we pop them out of the stack.\n\n## Code\n```java\nclass CustomStack {\n private Deque stack;\n private int[] arr;\n public CustomStack(int maxSize) {\n stack = new ArrayDeque<>();\n arr = new int[maxSize];\n }\n \n public void push(int x) {\n if (stack.size() < arr.length) {\n stack.push(x);\n } \n }\n \n public int pop() {\n if (stack.isEmpty()) {\n return -1;\n }\n int index = stack.size() - 1, ret = stack.pop() + arr[index];\n if (index > 0) {\n arr[index - 1] += arr[index];\n }\n arr[index] = 0;\n return ret;\n }\n \n public void increment(int k, int val) {\n k = Math.min(k - 1, stack.size() - 1);\n if (k >= 0) {\n arr[k] += val;\n }\n }\n}\n```\n## Complexity Analysis\nTime: `O(1)` for all operations\nSpace: `O(n)` as we used 2 arrays.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087312725","body":"### Main Idea\n\nStoring everything in one stack will lead to so many pushes/pops, so we can use two stacks, one stack for string, one stack for number.\n\nIterate the input string:\n\n* If `str[i]` is a number, parse the number, push that number to number stack, and push current string to string stack, then empty the string to start over.\n* If `str[i]` is a closed bracket, then we pop the number stack to get `count`, pop the string stack to get `str`, then append the current string with `count` times to the `str`.\n* Else, append the character to current string.\n\n### Code\n\n* Java\n\n```java\nclass Solution {\n public String decodeString(String s) {\n int n = s.length();\n Deque strStack = new ArrayDeque<>();\n Deque numStack = new ArrayDeque<>();\n StringBuilder sb = new StringBuilder();\n \n for (int i = 0; i < n; i++) {\n if (Character.isDigit(s.charAt(i))) {\n int j = i + 1;\n while (Character.isDigit(s.charAt(j))) {\n j++;\n }\n int count = Integer.parseInt(s.substring(i, j));\n numStack.push(count);\n strStack.push(sb);\n sb = new StringBuilder();\n i = j - 1;\n } else if (s.charAt(i) == ']') {\n int count = numStack.pop();\n StringBuilder top = strStack.isEmpty() ? new StringBuilder() : strStack.pop();\n while (count-- > 0) {\n top.append(sb);\n }\n sb = top;\n } else {\n if (s.charAt(i) != '[') {\n sb.append(s.charAt(i));\n }\n }\n }\n \n return sb.toString();\n }\n}\n```\n\n### Complexity Analysis\n\nTime: `O(max(k) * n)`, each digit will be pushed/popped at most `max(k)` times","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092141722","body":"## Main Idea\nWe can use `stack1` as the input stack, and `stack2` as the output stack. \n\n* `push()`: Push to `stack1`, so this new element will be on the stack top of `stack1` (which is the end of our queue).\n* `pop()` and `peek()`: Since we use `stack2` as our output stack, when we call `pop()` or `peek()`:\n* If `stack2` is empty, we want to move all elements from `stack1` to `stack2`, and their order will be reversed, so the bottom of `stack1` will be the top of `stack2`, which is the head of our queue.\n* If not, then we have access to the top of `stack2` already.\n\n## Code\n\n```java\nclass MyQueue {\n Deque stack1;\n Deque stack2;\n \n public MyQueue() {\n stack1 = new ArrayDeque<>();\n stack2 = new ArrayDeque<>();\n }\n \n public void push(int x) {\n stack1.push(x);\n }\n \n public int pop() {\n if (stack2.isEmpty()) {\n move();\n }\n return stack2.pop();\n }\n \n public int peek() {\n if (stack2.isEmpty()) {\n move();\n }\n \n return stack2.peek();\n }\n \n public boolean empty() {\n return stack1.isEmpty() && stack2.isEmpty();\n }\n \n private void move() {\n while (!stack1.isEmpty()) {\n stack2.push(stack1.pop());\n }\n }\n}\n```\n## Complexity Analysis\nTime:\n* `push()`: `O(1)`\n* `pop()` and `peek()`: \n\t* The **worst case** of `pop()` and `peek()` will be `O(n)`, where we have to move all elements from `stack1` to `stack2`.\n\t* **Amortized Analysis**: Say we have `n` elements in `stack1`, and `0` elements in `stack2`, and we want to call `pop()` or `peek()` `n` times. The first call will take `n` operations to move all elements from `stack2` to `stack1`. But after the first call we will have at least `n - 1` elemetns in `stack2`, which makes the next `n - 1` calls `O(1)`. So the amrotized time will be `O(n + 1 + 1 +...+1 / n) = O((2n-1)/n) = O(1)`.\n\nSpace: `O(1)`, the two stacks are given and we didn't use any extra spaces.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3093992695","body":"### Main Idea\nFor chunks `[c1, c2, c3, ..., cn]`, we have to maintain the property: `max(ci) <= min(cj)` if `i < j`. So we can create a monotonously increasing stack `stack` to **keep track of the max value for each previous chunk**. \n\nIf `arr[i] >= stack.peek()`, we can greedily create a new chunk and `stack.push(arr[i])`. Else, we need to find the previous chunk with max value smaller or equal to `arr[i]`, say `ck`, and we need to merge all the chunks `[c_k+1, ... c_cur]` with `arr[i]`.\n\nTo merge chunks, we can just pop all the max values representing those chunks off the stack, and push back the max among them (in our case, it will be stack top cuz this stack is increasing) as the max of the new chunk. \n\nFinally the size of the stack will be the number of chunks.\n### Code\n```java\nclass Solution {\n public int maxChunksToSorted(int[] arr) {\n int n = arr.length;\n Deque stack = new ArrayDeque<>();\n for (int num : arr) {\n int max = num;\n while (!stack.isEmpty() && stack.peek() > num) {\n max = Math.max(max, stack.pop());\n }\n stack.push(max);\n }\n return stack.size();\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095444824","body":"\n### Main Idea\n1. Find the length of the linked list. If `length == 0`, return `head`.\n2. If `k >= n`, then we can do `k = k % n` which doesn't affect the final result but reduce the number of rotations.\n3. Use two pointers to traverse the linked list to find the last kth element and its previous node.\n4. Modify the linked list.\n\n\n### Code\n```java\nclass Solution {\n public ListNode rotateRight(ListNode head, int k) {\n int n = getLength(head);\n if (n == 0) return head;\n k %= n;\n \n // Find the last kth element as new head\n ListNode fast = head, slow = head;\n for (int i = 0; i < k; ++i) {\n fast = fast.next;\n }\n \n while (fast.next != null) {\n fast = fast.next;\n slow = slow.next;\n }\n \n fast.next = head;\n ListNode newHead = slow.next;\n slow.next = null;\n return newHead;\n \n }\n \n private int getLength(ListNode head) {\n int len = 0;\n while (head != null) {\n ++len;\n head = head.next;\n }\n return len;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(1)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100701991","body":"### Main Idea\n1. If the current list has length smaller than 2, don't need to swap.\n2. Else, recursivly swap the list `head.next.next`, and the swap function should return the `next` node.\n3. Swap the current 2 nodes, `newHead = head.next`, `newHead.next = head` and `head.next = next`.\n\n### Code\n```java\nclass Solution {\n public ListNode swapPairs(ListNode head) {\n if (head == null || head.next == null) return head;\n ListNode next = swapPairs(head.next.next);\n ListNode newHead = head.next;\n newHead.next = head;\n head.next = next;\n return newHead;\n }\n}\n```\n\n### Complexity Analysis\n* Time: `O(n)`\n* Space: `O(n)` for the recursive call.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109183645","body":"### Main Idea\n1. Define `inOrder(int i, int j)` to be the problem of the converting `list[i:j]` to BST.\n2. Base case: if `i > j`, return `null`.\n3. Calculate `mid = i + (j - i) / 2`, left subtree will be `inOrder(i, mid - 1)`, and then we create our root with the current node `cur`, then the next node to create will be `cur.next`, and we build the right sutree with `inOrder(mid + 1, j)`.\n\n### Code\n```java\nclass Solution {\n private ListNode cur;\n public TreeNode sortedListToBST(ListNode head) {\n if (head == null) return null;\n cur = head;\n int n = getLength(head);\n return inOrder(0, n - 1);\n }\n\n private TreeNode inOrder(int l, int r) {\n if (l > r) return null;\n int m = l + (r - l) / 2;\n TreeNode left = inOrder(l, m - 1);\n TreeNode root = new TreeNode(cur.val);\n cur = cur.next;\n TreeNode right = inOrder(m + 1, r);\n root.left = left;\n root.right = right;\n return root;\n }\n\n private int getLength(ListNode head) {\n int cnt = 0;\n while (head != null) {\n head = head.next;\n ++cnt;\n }\n return cnt;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(logn)` for recursive calls.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112278406","body":"Say the length of `a_1` to `a_i` is `a`, `b_1` to `b_i` is `b`, and `c_1` to `c_n` is `c`. If there is no interseciton, then `c = 0`. And `a + b = b + a`. If there is an intersection, then `a + c + b = b + c + a`, and the two pointers will meet at the intersection point.\n```\npublic ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n ListNode h1 = headA, h2 = headB;\n while (h1 != h2) {\n\n h1 = h1 == null ? headB : h1.next;\n h2 = h2 == null ? headA : h2.next;\n }\n return h1; \n }\n```\n\nSo we can just go over both linked list once, and switch the pointers.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3118087746","body":"### Main Idea\nDefine two pointers `fast` and `slow`, each iteration, `fast` moves 2 steps forward while `slow` moves 1 step. If there is a cycle, then `fast` will equals `slow` eventually, and if not, we will exit the loop.\n\nIf a cycle is detected, we need to find the starting point. \n\n```\nfast = 2 * slow\n\nfast = l + n1 * c + t\nslow = l + n2 * c + t\n\n\nl + n1 * c + t = 2 * l + 2 * n2 * c + 2 * t\nl = n1 * c - 2 * n2 * c = c * (n1 - 2 * n2) = n' * c - t\n```\n\n```\n L\n-------- ----I-----\n | | D\n ----------\n```\n### Code\n```java\npublic class Solution {\n public ListNode detectCycle(ListNode head) {\n if (head == null) return null;\n ListNode fast = head, slow = head;\n while (fast != null && fast.next != null) {\n fast = fast.next.next;\n slow = slow.next;\n if (fast == slow) {\n while (slow != head) {\n slow = slow.next;\n head = head.next;\n }\n return head;\n }\n }\n return null;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(1)`","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3126063970","body":"### Main Idea\n* Base case 1, both `p` and `q` are `null`, return `true`.\n* Base case 2, else if either of them is `null` or their values are not equal, return `false`.\n* Recursive case: both left and right subtrees are equal.\n\n### Code\n```java\nclass Solution {\n public boolean isSameTree(TreeNode p, TreeNode q) {\n if (p == null && q == null) {\n return true;\n } else if (p == null || q == null || p.val != q.val) {\n return false;\n }\n return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n }\n}\n```\n\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(h) = O(n)`","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136827599","body":"### Main Idea\nThis problem is asking for the leftmost node of the last layer, and when it comes to traversal by layer, BFS comes in handy.\n\nIn a standard BFS algorithm, we use a queue to keep track of the nodes on each layer, we just need to modify the algorithm to record the first node of the current layer, and if we exit the loop from the current layer, that means this is the last layer, and the node we recorded will be the one we want to find.\n\n### Code\n```java\nclass Solution {\n public int findBottomLeftValue(TreeNode root) {\n Queue q = new ArrayDeque<>();\n q.offer(root);\n int res = 0;\n while (!q.isEmpty()) {\n res = q.peek().val;\n int size = q.size();\n for (int i = 0; i < size; ++i) {\n TreeNode n = q.poll();\n if (n.left != null) q.offer(n.left);\n if (n.right != null) q.offer(n.right);\n }\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144871038","body":"### main Idea\n1. We store `Pair` in our pq, where `TreeNode` is the node and `int[]` is its coordinate.\n2. Since we want to maintain the row order, we compare pairs by their row order, smaller row has higher priority.\n3. If row numbers are the same, we compare values, since we don't really care about the order we process columns each row.\n4. Use a map that maps `col` to `list` to store the node values.\n\n\n### Code\n* Java\n\n```java\nclass Solution {\n public List> verticalTraversal(TreeNode root) {\n // column -> list\n Map> map = new HashMap<>();\n PriorityQueue> queue = new PriorityQueue<>((p1, p2) -> {\n int loc1[] = p1.getValue();\n int loc2[] = p2.getValue();\n if (loc1[0] == loc2[0]) {\n return p1.getKey().val - p2.getKey().val;\n } else {\n return loc1[0] - loc2[0];\n }\n });\n queue.offer(new Pair(root, new int[] {0, 0}));\n while (!queue.isEmpty()) {\n int size = queue.size();\n for (int i = 0; i < size; ++i) {\n Pair p = queue.poll();\n TreeNode node = p.getKey();\n int loc[] = p.getValue();\n List list = map.getOrDefault(loc[1], new ArrayList<>());\n list.add(node.val);\n map.put(loc[1], list);\n if (node.left != null) {\n queue.offer(new Pair(node.left, new int[] {loc[0] + 1, loc[1] - 1}));\n }\n\n if (node.right != null) {\n queue.offer(new Pair(node.right, new int[] {loc[0] + 1, loc[1] + 1}));\n }\n }\n }\n\n List> res = new ArrayList<>();\n for (int i = -1000; i <= 1000; ++i) {\n if (map.containsKey(i)) {\n res.add(map.get(i));\n }\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(nlogn)`\nSpace: `O(n)`","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162435845","body":"```java\nclass Solution {\n public int minSubarray(int[] nums, int p) {\n int n = nums.length;\n long arraySum = Arrays.stream(nums).asLongStream().sum(); \n int targetRemainder = (int) (arraySum % p);\n if (targetRemainder == 0) {\n return 0;\n } else if (arraySum < p) {\n return -1;\n }\n \n Map remainderToIndex = new HashMap<>();\n remainderToIndex.put(0, -1);\n \n long preSum = 0;\n int minLen = Integer.MAX_VALUE;\n for (int i = 0; i < n; ++i) {\n preSum += nums[i];\n int remainder = (int) (preSum % p);\n int remainderToCheck = (int) (remainder - targetRemainder);\n if (remainderToCheck < 0) {\n remainderToCheck += p;\n }\n \n if (remainderToIndex.containsKey(remainderToCheck)) {\n int index = remainderToIndex.get(remainderToCheck);\n minLen = Math.min(minLen, i - index);\n }\n \n remainderToIndex.put(remainder, i);\n }\n \n return minLen >= n ? -1 : minLen;\n }\n}\n\n/*\n [3, 1, 4, 2], p = 6\n \n arraySum = 10, targetRemainder = 4\n \n preSum = 3,\n\n [3, 1, 4, 2] = 10\n \n [0, 3, 4, 8, 10]\n \n [7, ]\n \n Sum: 9 p=6\n \n a mod b = (a + b) mod b\n \n (S_j - S_i) mod p == sum mod p\n \n \n x mod p = a\n y mod p = b\n \n (x - y) mod p = a - b (if a >= b)\n a - b + p (if a < b)\n*/\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182362544","body":"## Method 1. BFS\n### Main Idea\nBasically, this problem is asking if we can mark the graph with 2 colors, where adjacent vertices can't have the same color.\n\nSo we can apply BFS to traverse the graph, say we mark a vertex `v` with color 1, then we have to mark all its neighbors with color 2. If any of them was marked color 1, then we know it's impossible to mark the graph with 2 colors, so we can return `false`.\n\nIf no such contradictions found, that means the graph can be 2-colored, so return `true`.\n### Code\n* Java\n\n```java\nclass Solution {\n public boolean possibleBipartition(int n, int[][] dislikes) {\n List[] graph = new ArrayList[n + 1];\n for (int i = 0; i <= n; ++i) graph[i] = new ArrayList<>();\n \n for (int[] edge : dislikes) {\n graph[edge[0]].add(edge[1]);\n graph[edge[1]].add(edge[0]);\n }\n \n int[] colors = new int[n + 1];\n for (int i = 1; i <= n; ++i) {\n if (colors[i] != 0) continue;\n Queue q = new ArrayDeque<>();\n q.offer(i);\n colors[i] = 1;\n while (!q.isEmpty()) {\n int size = q.size();\n while (size-- > 0) {\n int v = q.poll(), c = colors[v];\n for (int nei : graph[v]) {\n if (colors[nei] == c) return false;\n if (colors[nei] != 0) continue;\n colors[nei] = -1 * c;\n q.offer(nei);\n }\n }\n }\n }\n return true;\n }\n}\n```\n### Complexity Analysis\nTime: `O(E + V)`\n\nSpace: `O(E + V)`","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204204644","body":"```java\nclass Solution {\n public int mySqrt(int x) {\n int left = 0, right = x;\n\n while (left < right - 1) {\n int mid = left + (right - left) / 2;\n long midSquare = 1l * mid * mid;\n if (midSquare == x) {\n return mid;\n } else if (midSquare < x) {\n left = mid;\n } else {\n right = mid - 1;\n }\n }\n long rightSqaure = 1l * right * right;\n return rightSqaure > x ? left : right;\n }\n}\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222726555","body":"```java\nclass Solution {\n public int maxVowels(String s, int k) {\n String vowels = \"aeiou\";\n int n = s.length(), l = 0, r = 0, res = 0, cnt = 0;\n while (r < n) {\n while (r < n && r - l < k) {\n if (vowels.indexOf(s.charAt(r)) != -1) {\n ++cnt;\n }\n ++r;\n }\n\n res = Math.max(res, cnt);\n if (vowels.indexOf(s.charAt(l)) != -1) {\n --cnt;\n }\n ++l;\n }\n\n return res;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243695565","body":"```java\nclass Solution {\n public int maxAreaOfIsland(int[][] grid) {\n int m = grid.length, n = grid[0].length;\n int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};\n \n int ret = 0;\n for (int i = 0; i < m; i++) {\n for (int j = 0; j < n; j++) {\n if (grid[i][j] == 0) {\n continue;\n }\n \n Queue queue = new ArrayDeque<>();\n queue.offer(new int[] {i, j});\n grid[i][j] = 0;\n int area = 1;\n while (!queue.isEmpty()) {\n int[] loc = queue.poll();\n for (int[] dir : dirs) {\n int x = loc[0] + dir[0], y = loc[1] + dir[1];\n if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == 0) {\n continue;\n }\n queue.offer(new int[] {x, y});\n grid[x][y] = 0;\n area++;\n }\n }\n \n ret = Math.max(ret, area);\n }\n }\n \n return ret;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269054068","body":"## Method 1. DP + Count\n### Main Idea\nSimilar to the DP solution of the LIS problem, but we also need to count how many shorter subsequences contribute to each subsequence ending at index `i`.\n\nSo we define `dp[i][0]` to be the max len of subsequence ending at `i`, and `dp[i][1]` to be the number of shorter subsequences contributing to \n### Code\n* Java\n\n```java\nclass Solution {\n public int findNumberOfLIS(int[] nums) {\n int n = nums.length, res = 0, max = 0;\n // \n int[][] dp = new int[n][2];\n \n for (int i = 0; i < n; ++i) {\n dp[i][0] = 1;\n int cnt = 1;\n for (int j = 0; j < i; ++j) {\n if (nums[i] > nums[j]) {\n if (dp[j][0] + 1 > dp[i][0]) {\n dp[i][0] = dp[j][0] + 1;\n cnt = dp[j][1];\n } else if (dp[j][0] + 1 == dp[i][0]) {\n cnt += dp[j][1];\n }\n }\n }\n \n if (dp[i][0] > max) {\n max = dp[i][0];\n res = cnt;\n } else if (dp[i][0] == max) {\n res += cnt;\n }\n dp[i][1] = cnt;\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n^2)`\n\nSpace: `O(n)`","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3295757426","body":"```java\nclass Solution {\n public int change(int amount, int[] coins) {\n int n = coins.length;\n int[] dp1 = new int[amount + 1], dp2 = new int[amount +1];\n for (int i = 0; i < n; i++) {\n for (int j = 0; j <= amount; j++) {\n if (i == 0 || j == 0) {\n if (j % coins[i] == 0) {\n dp2[j] = 1;\n }\n continue;\n }\n \n if (j - coins[i] >= 0) {\n dp2[j] = dp1[j] + dp2[j - coins[i]];\n } else {\n dp2[j] = dp1[j];\n }\n }\n \n int[] tmp = dp1;\n dp1 = dp2;\n dp2 = tmp;\n }\n return dp1[amount];\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322650611","body":"```java\nclass Solution {\n public int[] singleNumber(int[] nums) {\n int xor = 0;\n for (int num : nums) {\n xor ^= num;\n }\n \n\n int rightmostBit = xor & (-xor);\n \n int num1 = 0, num2 = 0;\n for (int num : nums) {\n if ((num & rightmostBit) != 0) {\n num1 ^= num;\n } else {\n num2 ^= num;\n }\n }\n \n return new int[]{num1, num2};\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"suukii":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mirrors-cl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xqy97":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jakkiabc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyoneday":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chouqin99":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhaogeg111":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawnhu23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ye2222":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uyplayer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guixian001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"serena9":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"junzmer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hx-code":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"admu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xxiaomm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pgquestions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eldinzhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiangwenzhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawnwu6688":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tomtao626":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aiweng1981":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richard-lime":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"acoada":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"duanyaqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ccslience":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaiykk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cachezhou0617":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangtuo1999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cytrue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyryan-web":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"naomiwufzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuajingliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miss1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"johnxizhao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"incipe-win":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"revisegoal":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckysq999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dereklisdr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"perfqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mryao1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"likeyousmile":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhg1992":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liquanluo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aq666888":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"samlu-ecnu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhongxiangxiang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hatorimain":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"neado":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaojunjun1110":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wxleah":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunl1ght":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kerrhl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"orangejuz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flyzenr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"c1f2h3":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dlm001128":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuxy94":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aconcert":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"linjunhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hyqqq22":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yibenxiao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elon-lau":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nowkizzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gsgtgyb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"irenia111":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"suiyi8760":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"saltychess":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rabbit2010520":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ellie-wu05":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yopming":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckytwj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzz607":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zoulufeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xxoojs":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"okkband":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wyz999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hacker90":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ricjli":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luhaoling":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flaming-cl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gelxgx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gaominghao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jessie725":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lsunxh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lanceli424":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qycoder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qilin88":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hengheng-yun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"smz1995":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"size-of":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"moyuanhua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"9vivian88":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guxuehua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kirosola":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"biscuit279":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maoting":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"youzhaing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jawn-ha":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hanwangxxx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dujt-x":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"degndaixingqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gzgzgzgzgzgz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gentleman-goodman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xinyi-arch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zenwangzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"andyyxw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fourierhai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yangz001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mannnn6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"haoyangxie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chjillout":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wenjialu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mhcn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"coconutice":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jackgaoyuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xingzhan0312":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yufeng727":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fontendart":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yingchehu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cobayaz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tomato-tomato":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xfliudx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"djd28176":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xilutian":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xy147":[null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091443042","body":"### js代码\n```JavaScript\n\nvar MyQueue = function() {\n this.inStack = [];\n this.outStack = [];\n};\nMyQueue.prototype.push = function(x) {\n this.inStack.push(x);\n};\n\nMyQueue.prototype.pop = function() {\n if (!this.outStack.length) {\n this.in2out();\n }\n return this.outStack.pop();\n};\n\nMyQueue.prototype.peek = function() {\n if (!this.outStack.length) {\n this.in2out();\n }\n return this.outStack[this.outStack.length - 1];\n};\n\nMyQueue.prototype.empty = function() {\n return this.outStack.length === 0 && this.inStack.length === 0;\n};\n\nMyQueue.prototype.in2out = function() {\n while (this.inStack.length) {\n this.outStack.push(this.inStack.pop());\n }\n};\n\n```\n\n### 复杂度分析\n时间复杂度:O(1)\n空间复杂度:O(n)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3120847716","body":"```\nclass ListNode {\n constructor(key, value) {\n this.key = key\n this.value = value\n this.next = null\n this.prev = null\n }\n}\n\nclass LRUCache {\n constructor(capacity) {\n this.capacity = capacity\n this.hash = {}\n this.count = 0\n this.dummyHead = new ListNode()\n this.dummyTail = new ListNode()\n this.dummyHead.next = this.dummyTail\n this.dummyTail.prev = this.dummyHead\n }\n\n get(key) {\n let node = this.hash[key]\n if (node == null) return -1\n this.moveToHead(node)\n return node.value\n }\n\n put(key, value) {\n let node = this.hash[key]\n if (node == null) {\n if (this.count == this.capacity) {\n this.removeLRUItem()\n }\n let newNode = new ListNode(key, value)\n this.hash[key] = newNode\n this.addToHead(newNode)\n this.count++\n } else {\n node.value = value\n this.moveToHead(node)\n }\n }\n\n moveToHead(node) {\n this.removeFromList(node)\n this.addToHead(node)\n }\n \n removeFromList(node) {\n let temp1 = node.prev\n let temp2 = node.next\n temp1.next = temp2\n temp2.prev = temp1\n }\n\n addToHead(node) {\n node.prev = this.dummyHead\n node.next = this.dummyHead.next\n this.dummyHead.next.prev = node\n this.dummyHead.next = node\n }\n\n removeLRUItem() {\n let tail = this.popTail()\n delete this.hash[tail.key]\n this.count--\n }\n\n popTail() {\n let tail = this.dummyTail.prev\n this.removeFromList(tail)\n return tail\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146107002","body":"```const twoSum = (nums, target) => {\n const prevNums = {};\n\n for (let i = 0; i < nums.length; i++) {\n const curNum = nums[i];\n const targetNum = target - curNum;\n const targetNumIndex = prevNums[targetNum];\n if (targetNumIndex !== undefined) {\n return [targetNumIndex, i];\n } else {\n prevNums[curNum] = i;\n }\n }\n}```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3167532564","body":"### js代码\n```JavaScript\nvar middleNode = function(head) {\n let slow = fast = head\n while(fast && fast.next){\n slow = slow.next\n fast = fast.next.next\n }\n return slow\n};\n\n```\n\n### 复杂度分析\n时间复杂度:O(N)\n空间复杂度:O(1)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190926614","body":"### js代码\n```JavaScript\nvar judgeCircle = function(moves) {\n return moves.split('L').length === moves.split('R').length && moves.split('U').length === moves.split('D').length\n};\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"itsjacob":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shunanch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yppah-eb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"raychenlei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"woshichuanqilz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"willuuu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"christina-soda":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jia98shanliang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"user-vannnn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tobepellucid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"johnvsd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yueza":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawyuan97":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"victorhuang99":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cusanity":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jay-xzj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shiradaone":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xinyue-ma":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"taojin1992":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joyce94":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"steven72574":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tian-pengfei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"asuka1h":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaowangcoding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"james0608":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaneyang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"azl397985856":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whgsh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chengfengfengwang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bulingbulingbuling":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"c2tr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eden-ye":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"codingtrains":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"starorbiting":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mo-xiaoxiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"passengersa":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073445770","body":"思维:\n1、将数组num和k转换为字符,\n2、使用BigInt方法相加\n3、最后使用将相加得到转换为数字数组\n时间复杂度:O(n)\n代码:\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function (num, k) {\n let numStr = num.join('')\n let sum = BigInt(numStr) + BigInt(k)\n return sum.toString().split('').map(Number)\n};","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084084442","body":"时间复杂度:O(n)\n代码:\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.maxSize = maxSize;\n this.stack = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.stack.length < this.maxSize) {\n this.stack.push(x);\n }\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.stack.length === 0) {\n return -1;\n }\n return this.stack.pop();\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n const len = this.stack.length;\n const count = Math.min(k, len);\n for (let i = 0; i < count; i++) {\n this.stack[i] += val;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097108121","body":"思路:\n首先,计算链表的长度 n。\n接着,将 k 对 n 取模,因为旋转 n 次后链表会回到原来的状态,所以取模可以避免不必要的旋转操作。\n然后,找到新的链表头节点和尾节点。新的链表头节点是原链表中第 n - k 个节点,新的链表尾节点是原链表的最后一个节点。\n最后,将原链表的尾节点连接到原链表的头节点,形成一个环形链表,再从新的链表头节点处断开,得到旋转后的链表。\n时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表两次,第一次计算链表的长度,第二次找到新的链表头节点的前一个节点。\n代码:\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n // 定义链表节点类\nclass ListNode {\n constructor(val = 0, next = null) {\n this.val = val;\n this.next = next;\n }\n}\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n if (!head || !head.next) return head;\n\n // 计算链表的长度\n let n = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n n++;\n }\n\n // 对 k 取模\n k %= n;\n\n // 如果 k 为 0,说明不需要旋转,直接返回原链表\n if (k === 0) return head;\n\n // 找到新的链表头节点的前一个节点\n let newTail = head;\n for (let i = 0; i < n - k - 1; i++) {\n newTail = newTail.next;\n }\n\n // 新的链表头节点\n let newHead = newTail.next;\n\n // 断开原链表,形成新的链表\n newTail.next = null;\n tail.next = head;\n\n return newHead; \n};\n\n// 辅助函数:将数组转换为链表\nfunction arrayToList(arr) {\n if (arr.length === 0) return null;\n let head = new ListNode(arr[0]);\n let current = head;\n for (let i = 1; i < arr.length; i++) {\n current.next = new ListNode(arr[i]);\n current = current.next;\n }\n return head;\n}\n\n// 辅助函数:将链表转换为数组\nfunction listToArray(head) {\n let result = [];\n let current = head;\n while (current) {\n result.push(current.val);\n current = current.next;\n }\n return result;\n}","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shellylcooper":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"testplm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tom-zhouch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"skylarxu214":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"taihui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huaxueguakele":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yang-chenyu104":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mlking15":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"-3":[],"cyonline":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rzhao010":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zywang0":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jetery":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"klspta":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bookyue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jancerwu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"buer1121":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ceramickitten":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gg925407590":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alyenor":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chenming-cao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ggohem":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dark-volute":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ronething":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jmastella":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"paopaohua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dd2001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mayloveless":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuexi001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nineis7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"abby-xu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gsw9818":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaomingshixiaotang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"snmyj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flipn9":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wabw1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xqmmy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"a-pricity":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sclihuiming":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"amazeding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"astrking":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tzuikuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ringo1597":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brucezhang-utf-8":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luanxing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"moin-jer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lihua1997":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cuizezhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xuanaxuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tiandao043":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"restlessbreeze":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ruikiwi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huiminren":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"saitochen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wtdcai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"albert556":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wuxiaoshawn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zrtch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhuzhu096":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whoam-challenge":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weisday":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"syh-coder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaaller":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kyrie96521":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cavecrypto":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cxgbro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erjian96":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"a-polarbear":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alexno1no2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yetfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhiyuanpeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bwspsu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"arinzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mdge":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allenfeng666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yin02":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elsa-zhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"asur4s":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"littlesugarman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhihaowan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"apockira":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guowei0223":[null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077086971","body":"```\n首先需要找到所有c出现的index,存在c_index list里为后续的pointer搜索做好准备\npointer = 0 定义好pointer的起点\n遍历s,在c_index的范围内,对比pointer和pointer + 1 和s中各个位置的绝对距离,如果发现pointer和s的距离大于pointer +1,那么说明s的index已经走到了离pointer+1更近的距离,那么这时候我们更新pointer,+ 1, 指到下一个c_index中c的位置。\nres.append()c_index中pointer和s中index的距离\n\nclass Solution:\n def shortestToChar(self, s: str, c: str) -> List[int]:\n c_index = []\n for i in range(len(s)):\n if s[i] == c:\n c_index.append(i)\n pointer = 0\n res = []\n for i in range(len(s)):\n if pointer < len(c_index) -1:\n if abs(i-c_index[pointer])> abs(i-c_index[pointer+1]):\n pointer += 1\n res.append(abs(i-c_index[pointer]))\n return res\n\n因为用了指针,所以时间复杂度 O(n)。 空间复杂度 O(n)。 \n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087516204","body":"```\n使用栈的经典题型。遇见数字就num*10 + item处理。 遇见【 左括号说明要开始处理括号内部,用stack先存好之前已经处理的结果,遇见】后括号说明括号完成,则需要stack。pop()出保存的结果加上括号里的内容。是字母的话,则res+ item更新括号内信息。\n空间复杂度 O(n)\n时间复杂度 O(n)\n\nclass Solution:\n def decodeString(self, s: str) -> str:\n res = \"\"\n stack = []\n num = 0\n for item in s:\n if item.isdigit():\n num = num * 10 + int(item)\n elif item == \"[\":\n stack.append([num, res])\n num = 0\n res = \"\"\n elif item == \"]\":\n pre_num, pre_res = stack.pop()\n res = pre_res + pre_num * res\n else:\n res += item\n return res\n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3101341120","body":"还是链表的老套路,设置一个dummy head。 判断cur.next and cur.next.next: 是否存在,存在了再进行下一步。\n用tmp,tmp1 来保存cur。next和cur.next.next.next。 然后我们开始进行交换步骤。\n\n```\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n dummy_head = ListNode(next =head)\n cur = dummy_head\n while cur.next and cur.next.next:\n temp = cur.next\n temp1 = cur.next.next.next\n cur.next = cur.next.next\n cur.next.next = temp\n temp.next = temp1\n cur = cur.next.next\n return dummy_head.next\n\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125611734","body":"可以利用bfs的方法解决。 把每个点放入queue中,然后popleft()两个node进行比较。\n\n```\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if not p and not q:\n return True\n if not p or not q:\n return False\n \n que = deque([p,q])\n \n while que:\n cur1 = que.popleft()\n cur2 = que.popleft()\n if not cur1 and not cur2:\n continue\n\n if not cur1 or not cur2 or cur1.val != cur2.val:\n return False\n \n que.append(cur1.left)\n que.append(cur2.left)\n que.append(cur1.right)\n que.append(cur2.right)\n return True\n\n```\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148705374","body":"```\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n ans = 0\n for x1, y1 in points:\n cnt = defaultdict(int)\n for x2, y2 in points:\n d2 = (x1 - x2) ** 2 + (y1 - y2) ** 2\n ans += cnt[d2] * 2\n cnt[d2] += 1\n return ans\n\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuqianyang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sj941127":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zjsuper":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yongxi-zhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"darwintk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"h-steven":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mischaqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wurongronga":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miduoliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyshenzhengkang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"y4h2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yoco323":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"forschers":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shanshuiqiankun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"annabellhyx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hwfrankfung":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"frederickfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huibinny":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ggmybro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"myleetcodejourney":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"want2333":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"staringwhere":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allenfeng8":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ryanbaiyansong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dou-yu-xuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hyxupup":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cs12300":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chiehw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aesir-idun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaldsk12":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hxj2001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"for123s":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzhilin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yfu6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mengsixing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"import-ant":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joriscai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangqianqian202301":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"airwalkers":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhumengcheng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kofzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"leonalhq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hjy-u":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"csthaha":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zepherust":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"feefeefee":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hughlin07":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huizsh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chanceyliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hshen11":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"horace7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangzh0114":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dragonfcl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huifeng248":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sarah11qing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"el1as7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zcytm3000":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pangjiadai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xb798298436":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ywang525":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"limbo42":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dorapocket":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zoeyzyzyzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jasonqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lp1506947671":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"texamc2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joemonkeylee":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"northseacoder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dominique9898":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wl678":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"meisgithub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sye9286":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fuku-l":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kangliqi1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richardtaok":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chocolate-emperor":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lydia61":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangjiahuan17":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"seanutf":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangyong-hub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erquaner":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiujingxukong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"x1aox1a":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"drinkmorekaik":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dinjufen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuzmt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"munmust":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yan-jie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hktangshuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zpbc007":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"linlizzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"krabbejing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"firehaosky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chao-cc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jinjin680":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cruiseyugh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"quieter2018":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jadeliu13":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaoq777":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiangyanlineu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuxiner":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yufanzh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"franciszq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kangqinsen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"manwzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jerry9926":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"soso1105":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pkuphy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhenya-zhu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wty9sky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"skyoct":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bingzxy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaodingc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jyjsunny":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aoxiangw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"enrilwang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aswrise":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aneureka":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ljqchlsw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jingyuzhou123":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dianlandu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jameswangxin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhenxied":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nuozhouzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shin-guid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bochengwan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kyo-tom":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uratora":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guitarys":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sosdogecoin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zol013":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lrwhc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wwewwt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cyk1337":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangyu1131":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"diana21170648":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"61hhh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"quaaaaaack":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"acy925":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bi9potato":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guangsizhongbin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhaoygcq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"catkathy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yqycs":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhuxinyu-znb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"freesan44":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mo660":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sencc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"randong22":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"beginner-jamji":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yzhyzhyzh123":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunstrongchina":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dongzegithub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"metsystem":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miller-em":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dorian-byte":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yizhewill":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qiaojunch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhouliuhuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"beanza":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kingxiaozhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ygnauh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wzbwzt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"iambigchen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weiboshi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"master-guang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jennyjgao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangjay408":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chang-you":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rocjemaintiendrai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ainfinitedz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"christ36":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hengistchan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huiyingc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"andyli4":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"momogir":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jamjid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"freeroo2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ycan253":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"laurallalala":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"danielyan86":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rennzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"larscheng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qingkediguo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"adfvcdxv":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"javajianghu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chloe-c11":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"verkru":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eggeggliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dr-kkk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jinhma":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"emergence23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"0christ1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"junru281":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joe-the-plumber":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jsaki":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"witerth":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ludwig-ll":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luster-lyl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"smallppgirl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"realduxy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"awilekong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wwz223":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangjinzhepro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"atom-set":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"coderxiaowq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hillsonziqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alexzhang-mini":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xil324":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bordergong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hawkins-hjq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cathyshang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"greyqt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yanglimbo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rao-qianlin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dtjk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"martina001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lxy1108":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"franklinsworld666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brainlds":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huamulanyyds":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eclairs46":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maike-hps":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sanjiu81":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qinmengx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yashuning":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luzhaofeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lizhao-liu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yukibei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hermione666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yyyyytc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zin-next":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pandapls":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jackinai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"godkun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dadahui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"akxuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fightforcoding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jialigogogo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"celestexiong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zjy-debug":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"peggyhao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sleepydog25":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"edwineo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"panfx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liudi9047":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allanli-lhh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xchen172":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qiaoeve":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tangyi23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shangjiaw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tongxw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"haodongwang1995":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuichicx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qunshanhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hebingliang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"baiqz":[null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092397229","body":"\n### 思路:\n通过元素在栈之间的转移来模拟队列的先进先出。\n\n\n```python\nclass MyQueue:\n \"\"\"使用两个栈实现的队列类\"\"\"\n\n def __init__(self):\n # 初始化两个栈:stack_in 用于入队操作,stack_out 用于出队操作\n self.stack_in = []\n self.stack_out = []\n\n def push(self, x: int) -> None:\n \"\"\"将元素 x 添加到队列的尾部\n 直接将元素压入 stack_in\n \"\"\"\n self.stack_in.append(x)\n\n def pop(self) -> int:\n \"\"\"移除并返回队列头部的元素\n 1. 如果 stack_out 为空,将 stack_in 中的所有元素弹出并压入 stack_out\n 2. 这样能确保元素以先进先出的顺序出栈\n 3. 弹出 stack_out 的栈顶元素\n \"\"\"\n if not self.stack_out:\n while self.stack_in:\n self.stack_out.append(self.stack_in.pop())\n return self.stack_out.pop()\n\n def peek(self) -> int:\n \"\"\"返回队列头部的元素,但不删除它\n 复用 pop 方法获取队首元素,然后将其压回 stack_out 以保持队列状态不变\n \"\"\"\n res = self.pop()\n self.stack_out.append(res)\n return res\n\n def empty(self) -> bool:\n \"\"\"检查队列是否为空\n 当且仅当两个栈都为空时,队列为空\n \"\"\"\n return not (self.stack_in or self.stack_out)\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaogaoddd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tuuna":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lxy12l":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chxbilly":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sentiy-hub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fea1220":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wtbkevin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"awenbocc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hallcia":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huzhipeng-hu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tongtz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lindo146":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"heye0507":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lmw6412036":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/1#issuecomment-3072932165","body":"@azl397985856 需要建day1啦","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3076893308","body":"## 思路1\n\n枚举每个普通字符,分别找到其左侧,右侧**最近**特殊字符的位置,求出距离,并取最小值。\n\n1. 预处理每个特殊字符的位置,保存至数组data;\n2. 枚举每个普通字符,在data中查找其左侧,右侧**最近**特殊字符的位置,求出距离,并取最小值。查找过程用可以**二分**实现,也可以用\n **单个指针记录最后一次位置**实现;\n3. 返回结果。\n\n## 思路1代码\n\n```javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function (s, c) {\n let n = s.length, data = [];\n for (let i = 0; i < n; i++) {\n if (s[i] === c) data.push(i);\n }\n\n // 双指针\n // left 左侧最近的c索引\n // right 右侧最近的c索引 right = left + 1\n let left = -1, right = -1, m = data.length;\n let ans = new Array(n).fill(0);\n for (let i = 0; i < n; i++) {\n let char = s[i];\n if (char === c) continue;\n\n let ldis = Infinity, rdis = Infinity;\n // 在data中寻找左侧最近的c索引\n // left 指针移动的条件:data[left + 1] < i,确保data[left] 是在i的左侧,距离i更近\n while (left + 1 < m && data[left + 1] < i) left++;\n if (left >= 0) ldis = i - data[left];\n \n right = left + 1;\n if (right < m) rdis = data[right] - i;\n ans[i] = Math.min(ldis, rdis);\n }\n return ans;\n };\n```\n\n## 思路1复杂度分析\n\n- 时间复杂度:O(n + m),n为字符串s的长度,m为data的长度,遍历字符串s2次,left也只是从左往右移动一次,为O(m),所以总的时间复杂度为O(n + m)。\n- 空间复杂度:O(m),m为data的长度,不考虑返回值的话,需要一个额外的长度为m的数组来保存c的位置,所以空间复杂度为O(m);考虑返回值,需要一个额外的长度为n的数组来保存结果,间复杂度为O(n)。\n\n---\n\n## 思路2\n\n也可以枚举每个特殊字符c的位置,处理c往左、往右能覆盖的普通字符,记录每个普通字符的最小值即可。\n\n1. 预处理每个特殊字符的位置,保存至数组data;\n2. 从左往右遍历data,处理每个特殊字符c左侧的普通字符的距离,保存至数组答案ans;可以使用思路1单指针记录最后一个位置的方式,降低时间复杂度;具体可以看代码;\n3. 从右往左遍历data,处理每个特殊字符c右侧的普通字符的距离,与答案ans对应位置比较,取最小值;\n4. 返回答案ans。\n\n## 思路2代码\n```javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function (s, c) {\n let n = s.length, data = [], ans = new Array(n).fill(Infinity);\n for (let i = 0; i < n; i++) {\n if (s[i] === c) {\n ans[i] = 0;\n data.push(i);\n }\n }\n\n const m = data.length;\n\n // 从左往右遍历\n let left = 0;//从左往右开始,第一个普通字符的索引\n for (let j of data) {\n while (left < n && s[left] === c) left++;\n while (left < n && s[left] !== c && left < j) {\n // console.log('处理left',left,j);\n ans[left] = Math.min(ans[left], j - left);\n left++;\n }\n }\n\n // 从右往左遍历\n let right = n - 1;// 从右往左开始,第一个普通字符的索引\n for (let i = m - 1; i >= 0; i--) {\n let j = data[i];\n while (right >= 0 && s[right] === c) right--;\n while (right >= 0 && s[right] !== c && right > j) {\n ans[right] = Math.min(ans[right], right - j);\n right--;\n }\n }\n return ans;\n };\n```\n## 思路2复杂度分析\n\n- 时间复杂度:O(n + m),n为字符串s的长度,遍历字符串s1次,遍历data两次,left、right也只是各移动一次,所以总的时间复杂度为O(n + m)。\n- 空间复杂度:O(m),m为data的长度,不考虑返回值的话,需要一个额外的长度为m的数组来保存c的位置,所以空间复杂度为O(m);考虑返回值,需要一个额外的长度为n的数组来保存结果,间复杂度为O(n)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082655797","body":"## 思路1\n这是一个典型的栈设计题,数据规模不大的情况下,按照常规操作即可。可以使用数组或链表来存储。\n## 代码1\n```javascript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.data = []\n this.maxSize = maxSize;\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if(this.data.length < this.maxSize) this.data.push(x);\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if(this.data.length === 0) return -1;\n return this.data.pop(); \n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n let n = this.data.length;\n for(let i = 0;i < k;i++){\n if(i < n) this.data[i] += val;\n else break;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n## 复杂度分析1\n* 时间复杂度:O(n*k)。n表示操作次数。插入和删除的时间复杂度都是O(1),每次increment都要遍历数组,时间复杂度是O(k);所以总的复杂度为O(n*k)。\n* 空间复杂度:O(n)。n为maxSize。\n---\n## 思路2\n如果k较大,increment是个非常耗时的操作,所以我们需要优化increment的操作。\n优化思路:increment是批量更新的,可以用差分数组来实现。但是又要支持高效的查询与删除操作,所以可以用树状数组来维护这个差分数组。\n## 代码2\n```javascript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function (maxSize) {\n this.cnt = 0;\n this.data = new Array(maxSize + 1).fill(0);\n this.maxSize = maxSize;\n};\n\n/**\n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function (x) {\n if (this.cnt === this.maxSize) return;\n this.cnt++;\n this.update(this.cnt - 1, x);\n if(this.cnt <= this.maxSize - 1) this.update(this.cnt, -x);\n //console.log('push ',x,this.data);\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function () {\n if(this.cnt === 0) return -1;\n let ans = this.query(this.cnt - 1);\n this.update(this.cnt - 1, -ans);\n if(this.cnt <= this.maxSize - 1) this.update(this.cnt,ans);\n this.cnt--;\n //console.log('pop ',ans,this.data);\n return ans;\n};\n\n/**\n * @param {number} k\n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function (k, val) {\n if(this.cnt === 0) return;\n this.update(0, val);\n let r = Math.min(k,this.maxSize,this.cnt);\n if(r <= this.maxSize - 1) this.update(r,-val);\n};\n\n\nCustomStack.prototype.query = function (i) {\n i = i + 1;\n let ans = 0;\n while (i) {\n ans += this.data[i];\n i -= this.lowbit(i);\n }\n return ans;\n}\n\nCustomStack.prototype.update = function (i, val) {\n i = i + 1;\n while (i <= this.maxSize) {\n this.data[i] += val;\n i += this.lowbit(i);\n }\n}\n\n\nCustomStack.prototype.lowbit = function (i) {\n return i & (-i);\n}\n\n/**\n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n\n```\n\n## 复杂度分析2\n* 时间复杂度:O(n*log(maxSize))。n表示操作次数。插入、删除、批量更新的时间复杂度都是O(log(maxSize));所以总的复杂度为O(n*log(maxSize))。\n* 空间复杂度:O(n)。n为maxSize。\n---\n## 思路3\n有没有保持插入,删除O(1),批量更新O(1)的算法呢?官方题解给出了一个懒删除的技巧。小伙伴们可以尝试一下。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087040795","body":"## 思路一:栈\n这是一个典型的括号匹配问题,可以用栈来解决。 \n步骤:\n1. 创建一个栈sStack,栈顶元素标示当前答案,初始元素为空字符串;\n2. 创建一个栈nStack,存储需要重复的数字k;\n3. 声明一个全局变量num,用来记录数字。遍历字符串:\n 1. 如果当前字符为数字,追加到num中;\n 2. 如果当前字符为左括号,将num压入栈nStack,将一个新的空字符串压入栈sStack,并清空num。**遇到左括号表示要开启新一轮的字符串重复过程,因此数字栈压入需要重复的数字k,字符串栈压入一个空字符串来存储本轮重复过程产生的答案**;\n 3. 如果当前字符为字母,追加到栈sStack的栈顶元素中;\n 4. 如果当前字符为右括号,取出栈sStack的栈顶元素s,取出栈nStack的栈顶元素k,s重复k次;并追加到栈sStack的栈顶元素中。**遇到右括号表示本轮重复过程结束,因此将栈sStack的栈顶元素重复k次,并追加到栈sStack的栈顶元素中,继续前一轮的重复**。\n 5. 最后栈sStack的栈顶元素即为结果。\n## 代码一\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n let sStack = [''],nStack = [],n = s.length;\n let num = 0;\n for(let i = 0;i < n;i++){\n let c = s[i];\n if(/\\d/.test(c)) num = num * 10 + Number(c);\n else if(c === '[') {\n nStack.push(num);\n num = 0;\n sStack.push('');\n }else if(/[a-z]/.test(c)){\n // console.log(sStack)\n sStack[sStack.length - 1] += c;\n }else{\n let s = sStack.pop(),k = nStack.pop();\n // console.log(s,k);\n if(s) s = s.repeat(k);\n sStack[sStack.length - 1] += s;\n // console.log(sStack)\n }\n }\n return sStack[0];\n };\n```\n## 复杂度分析一\n* 时间复杂度:O(n),其中n为字符串s的长度。\n* 空间复杂度:O(n),需要两个最长长度为n的栈保存答案及数字,其中n为字符串s的长度。\n--- \n## 思路二:递归\n括号匹配问题,一般可以用递归来解决。 \n步骤:\n1. 预处理字符串s,记录与每个“\\[”匹配的“\\]”的位置,保存至数组left中。\n> 预处理匹配括号位置是这类递归问题常见的技巧。\n2. 从左往右遍历字符串s: \n 1. 如果当前字符为字母,则将当前字符添加到结果res中;\n 2. 如果当前字符为数字,则将数字保存在变量num中;\n 3. 如果当前字符为左括号,递归调用f,处理\\[i + 1, left\\[i] - 1]的子串,得到的结果重复num次,并追加到结果res中;num清空;\n4. 返回res。\n\n## 代码二\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n let stack = [],n = s.length,left = new Array(n).fill(-1);\n for(let i = 0;i < n;i++){\n let c = s[i];\n if(c === '[') stack.push(i);\n else if(c === ']') left[stack.pop()] = i;\n }\n return f(0,n - 1);\n // -----------------------------------\n function f(l,r){\n let ans = '',num = 0;\n for(let i = l;i <= r;i++){\n let c = s[i];\n if(/\\d/.test(c)) num = num * 10 + Number(c);\n else if(c === '['){\n ans += f(i + 1,left[i] - 1).repeat(num);\n num = 0;\n i = left[i];\n }else if(/[a-z]/.test(c)) ans += c;\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析二\n* 时间复杂度:O(n),其中n为字符串s的长度。\n* 空间复杂度:O(n),即递归栈深度,最大为n,其中n为字符串s的长度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091479392","body":"## 思路\n1. 设计双栈,一个用于存放入队数据,一个用于存放出队数据。\n2. 各个操作的实现思路:\n 1. push:将数据压入pushData栈中。\n 2. pop:如果popData栈为空,则将pushData栈中的数据全部弹出并压入popData栈中。然后弹出popData栈的栈顶元素。\n 3. peek:同pop操作,最后一步返回popData栈的栈顶元素。 \n 4. empty:判断两个栈是否为空。 \n\n> js中可以用数组模拟栈。\n## 代码\n```javascript\nvar MyQueue = function() {\n this.pushData = []\n this.popData = [] \n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.pushData.push(x) \n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n if(this.popData.length === 0 && this.pushData.length) while(this.pushData.length) this.popData.push(this.pushData.pop());\n return this.popData.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if(this.popData.length === 0 && this.pushData.length) while(this.pushData.length) this.popData.push(this.pushData.pop());\n return this.popData[this.popData.length - 1];\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return this.pushData.length === 0 && this.popData.length === 0\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```\n## 复杂度分析\n- 时间复杂度:O(1):插入、删除、查找操作的均摊时间复杂度都是O(1)\n- 空间复杂度:O(n):栈的存储空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094576990","body":"## 思路\n比较容易的思路是,排序后,每个块和排序前元素的种类和数量完全相同,可以用哈希表或前缀和来求解。此思路的时间复杂度是O(n),空间复杂度是O(nlog(n))。 \n后来看了看题解,发现可以用单调栈或维护前后缀的思路来求解。\n\n### 排序块性质\n**我们要想划分最多的块,并且保证排序后的结果和原数组的排序结果相同,则块中的元素必须保证,块中的最大值都比右边的元素小或者相同,块中的最小值都比左边的元素大或者相同。**\n则我们维护一个前缀最大值和后缀最小值两个数组,只要前缀的最大值,小于等于后缀的最小值,则可划分(相当于给数组划一条线)。\n## 代码\n```javascript\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n let n = arr.length, prefixMax = new Array(n).fill(-Infinity),suffixMin = new Array(n).fill(Infinity);\n for(let i = 0;i < n;i++){\n prefixMax[i] = Math.max(i ? prefixMax[i - 1] : -Infinity,arr[i]);\n let j = n - 1 - i;\n suffixMin[j] = Math.min(j + 1 < n ? suffixMin[j + 1] : Infinity,arr[j]);\n }\n\n let ans = 1;\n for(let i = 0;i < n - 1;i++){\n if(prefixMax[i] <= suffixMin[i + 1]) ans++;\n }\n return ans\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(n)\n\n## 参考题解\n[https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solutions/1/zui-duo-neng-wan-cheng-pai-xu-de-kuai-by-z0wz/](https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solutions/1/zui-duo-neng-wan-cheng-pai-xu-de-kuai-by-z0wz/)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095130877","body":"## 思路\n旋转链表的本质上是将链表尾部k个节点移动到链表头部。按照这个思路步骤如下:\n1. 计算链表长度l;\n2. 如果 k % l === 0 或者 l === 0,即k为l的整数倍,或者链表为空,则不需要旋转,直接返回head;否则 k = k % l;\n3. 声明两个指针fast、slow,fast先移动k步;\n4. fast、slow同时移动,直到fast到达链表末尾;\n5. 此时:\n 1. slow的下一个节点即为新的头结点\n 2. slow.next 指向 null\n 3. fast.next 指向 head\n 4. 返回新的头结点\n\n## JavaScript代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n if(!head || k === 0) return head;\n let l = 0,curr = head;\n while(curr){\n l++;\n curr = curr.next;\n }\n k = k % l;\n if(k === 0) return head;\n let fast = head,slow = head;\n while(k){\n fast = fast.next;\n k--;\n }\n\n while(fast.next){\n fast = fast.next;\n slow = slow.next;\n }\n\n let newHead = slow.next;\n slow.next = null;\n fast.next = head;\n return newHead;\n\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中n为链表的长度。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100439586","body":"## 思路\n因为是两两交换,所以可以声明四个指针记录涉及到交换的节点,修改相关指针的next指向即可。具体步骤如下:\n1. 特判:链表为空或链表只有一个节点,直接返回原链表。\n2. 为了简化代码,声明一个哨兵节点dummy,dummy.next = head,方便统一处理。\n3. 声明指针prev,指向前一次交换后的结束节点;声明指针curr,指向本次交换的开始节点。初始值prev = dummy,curr = head,开始循环:\n 1. 循环终止条件:curr为空或者curr的下一个节点为空(即curr没有可以交换的节点了)。\n 2. 声明next指针,next = curr.next;声明nextCurr指针,nextCurr = curr.next.next;\n 3. 两两交换:curr.next = nextCurr,next.next = curr;\n 4. 重新设置头尾指向,确保下一轮循环正确执行:prev.next = next;\n 5. 重新设置prev,curr:prev = curr; curr = nextCurr;继续循环,直到循环终止条件。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n if(!head || !head.next) return head;\n const dummy = new ListNode();\n dummy.next = head;\n \n let prev = dummy,curr = dummy.next;\n while(curr && curr.next){\n let next = curr.next,nextCurr = next.next;\n curr.next = nextCurr;\n next.next = curr;\n \n prev.next = next;\n\n prev = curr;\n curr = curr.next;\n }\n\n return dummy.next;\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是链表的长度。\n- 空间复杂度:O(1),仅使用有限个指针。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105520636","body":"## 思路\n* 本题目标是将一个有序单链表(升序排列)转换为一棵高度平衡的二叉搜索树(Height Balanced Binary Search Tree)。\n* 核心思想是使用递归方式构建树,每次选择链表的中间节点作为当前子树的根节点,以保证左右子树的高度差不超过 1。\n* 利用快慢指针(slow 和 fast)找到链表的中间节点,并将链表分割为左子链表和右子链表,分别递归构建左右子树。\n* 实现步骤如下:\n 1. 递归终止条件:\n * 如果链表为空(!head),返回 null。\n * 如果只有一个节点(!head.next),直接构建一个 TreeNode 返回。\n 2. 寻找中间节点:\n * 使用快慢指针法,fast 每次走两步,slow 每次走一步,当 fast 到达末尾时,slow 正好指向中间节点。使用一个临时变量 prev 记录 slow 的前一个节点,方便后续断开连接。\n 3. 分割链表:\n * 将 slow 前面的节点作为左子链表,断开连接。\n * slow.next 作为右子链表继续递归处理。\n 4. 构建树节点:\n * 当前 slow.val 作为根节点,递归构建左右子树。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if(!head) return head;\n // display(head)\n if(!head.next) return new TreeNode(head.val);\n\n // 寻找中间节点\n let slow = head,fast = head,prev = null;\n while(fast.next && fast.next.next){\n fast = fast.next.next;\n prev = slow;\n slow = slow.next;\n }\n // 此时,slow是中间节点,slow.next是右子树的根\n let next = slow.next;\n if(prev) prev.next = null;\n slow.next = null;\n\n const root = new TreeNode(slow.val);\n root.left = sortedListToBST(prev ? head : null);\n root.right = sortedListToBST(next);\n return root;\n};\n\nfunction display(head){\n let ans = [],p = head;\n while(p){\n ans.push(p.val);\n p = p.next;\n }\n console.log('处理的树:',ans)\n}\n```\n## 复杂度分析\n* 时间复杂度:O(n log n)\n * 每一层递归都需要遍历链表的一半来找中间节点(O(n)),递归深度为 log n,因此总时间复杂度为 O(n log n)。\n* 空间复杂度:O(log n)\n * 主要是递归调用栈的空间,取决于树的高度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111762311","body":"## 思路\n- 定义两个指针 `pA` 和 `pB`,分别从 `headA` 和 `headB` 开始遍历。\n- 当 `pA` 和 `pB` 不相遇时,它们会继续向前移动:\n - 如果 `pA` 到达末尾 (`null`),则跳转到 `headB`。\n - 如果 `pB` 到达末尾 (`null`),则跳转到 `headA`。\n- 这样,两个指针最终会在相交点相遇,或者同时到达末尾 (`null`),从而退出循环。\n- 返回 `pA`,即相交节点或 `null`。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function (headA, headB) {\n let pA = headA, pB = headB;\n while (pA !== pB) {\n pA = pA ? pA.next : headB;\n pB = pB ? pB.next : headA;\n }\n return pA;\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n + m),其中 n 和 m 分别为链表 headA 和 headB 的长度。\n- 空间复杂度:O(1),只使用了两个指针变量,没有额外的空间。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116200386","body":"## 思路\n- 首先处理边界情况:如果head为空,直接返回\n- 快慢指针同时遍历链表,快指针每次走两步,慢指针每次走一步\n- 当两指针相遇时停止第一阶段\n- 如果fast为null,说明无环,返回null\n- 将slow重置为head,两个指针以相同速度继续移动直到相遇\n- 相遇点即为环的起始节点\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n if(!head) return head;\n let slow = head,fast = head;\n while(fast){\n fast = fast.next;\n if(fast) fast = fast.next;\n\n slow = slow.next;\n\n if(slow === fast) break;\n }\n\n if(!fast) return fast;\n\n slow = head;\n\n while(slow !== fast){\n slow = slow.next;\n fast = fast.next;\n }\n\n return slow\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3125594702","body":"## LRU Cache 算法思路分析\n\nLRU (Least Recently Used) 缓存是一种常用的缓存淘汰策略,当缓存满时,会优先淘汰最近最少使用的元素。\n\n### 核心数据结构\n\n1. **双向链表**:维护元素的访问顺序,头部是最近最少使用的元素,尾部是最近使用的元素\n2. **哈希表(Map)**:提供O(1)时间复杂度的元素查找\n\n### 主要操作实现\n\n#### 1. 初始化\n- 设置缓存容量\n- 初始化当前元素计数器\n- 创建哈希表存储键值对\n- 创建虚拟头节点和尾节点,方便操作\n\n#### 2. 获取元素get\n- 如果元素不存在,返回-1\n- 如果元素存在:\n - 将该节点从当前位置删除\n - 将该节点插入到链表尾部(标记为最近使用)\n - 返回节点值\n\n#### 3. 插入/更新元素put\n- **新元素插入**:\n - 如果缓存已满,删除链表头部节点(最近最少使用的元素)\n - 创建新节点并添加到哈希表\n - 将新节点插入链表尾部\n- **更新元素**:\n - 更新节点值\n - 将节点从当前位置删除并移到链表尾部\n\n#### 4. 辅助方法\n- insertToTail:将节点插入链表尾部\n- deleteFromHead:删除链表头部节点\n- deleteNode:删除指定节点\n\n## 代码\n```javascript\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.cnt = 0;\n this.map = new Map();\n this.head = new DoubleNode();\n this.tail = new DoubleNode();\n this.head.next = this.tail;\n this.tail.prev = this.head; \n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n // console.log('get',key)\n \n if(this.map.has(key) === false) return -1;\n let node = this.map.get(key);\n\n this.deleteNode(node);\n \n this.insertToTail(node);\n // this.map.set(key,node);\n \n // this.display();\n\n return node.val;\n};\n\n/** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\nLRUCache.prototype.put = function(key, value) {\n if(this.map.has(key) === false){// 插入操作\n let node = new DoubleNode(key,value);\n if(this.cnt === this.capacity) this.deleteFromHead(); \n else this.cnt++\n this.map.set(key,node);\n this.insertToTail(node);\n }else{\n let node = this.map.get(key);\n node.val = value;\n\n this.deleteNode(node);\n\n this.insertToTail(node);\n // this.map.set(key,node);\n }\n\n // console.log('put',key,value);\n // this.display();\n};\n\nLRUCache.prototype.insertToTail = function(node){\n let prev = this.tail.prev;\n \n prev.next = node;\n node.next = this.tail;\n \n this.tail.prev = node;\n node.prev = prev;\n}\n\nLRUCache.prototype.deleteFromHead = function(){\n let node = this.head.next;\n let next = node.next;\n \n this.head.next = next;\n next.prev = this.head;\n\n this.map.delete(node.key);\n}\n\nLRUCache.prototype.deleteNode = function(node){\n let prev = node.prev,next = node.next;\n prev.next = next;\n next.prev = prev;\n\n node.prev = null;\n node.next = null;\n\n // this.map.delete(node.key);\n}\n\nLRUCache.prototype.display = function(){\n let k = this.cnt,p = this.head.next;\n let ans = []\n while(k){\n ans.push(p.key + '=>' + p.val);\n k--;\n p = p.next;\n }\n console.log(ans);\n}\n\nfunction DoubleNode(key,val){\n this.key = key;\n this.val = val;\n this.next = null;\n this.prev = null;\n}\n\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```\n## 复杂度分析\n### 时间复杂度\n- get操作:O(1)\n- put操作:O(1)\n\n### 空间复杂度\n- O(capacity),需要存储最多capacity个元素\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123739061","body":"## 思路\n\n使用了递归的思想来解决问题:\n\n1. **基础情况(Base Case)**:如果当前节点为空(`!root`),则返回深度0,因为空节点没有深度。\n\n2. **递归关系(Recursive Relation)**:\n - 分别计算左子树和右子树的最大深度:`maxDepth(root.left)` 和 `maxDepth(root.right)`\n - 取两者中的较大值:`Math.max(maxDepth(root.left), maxDepth(root.right))`\n - 加上当前节点的1层高度:`+1`\n\n### 算法执行过程\n\n1. 对于任意节点,先递归计算其左子树的最大深度\n2. 再递归计算其右子树的最大深度\n3. 比较左右子树的深度,取较大值\n4. 将较大值加1(代表当前节点所在的层),作为以当前节点为根的子树的最大深度\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if(!root) return 0;\n return Math.max(maxDepth(root.left),maxDepth(root.right))+1;\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n),其中n是二叉树的节点数。因为需要遍历每个节点一次。\n- **空间复杂度**:O(h),其中h是二叉树的高度。这是由于递归调用栈的深度,最坏情况下(完全不平衡的树)可能达到O(n),最好情况下(完全平衡的树)为O(log n)。\n\n这是一个典型的分治算法应用,将问题分解为更小的子问题(左右子树的深度),然后合并结果得到最终答案。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125568669","body":"## 代码思路分析\n\n这是一个经典的二叉树递归问题,采用深度优先搜索(DFS)的方式解决:\n\n1. **基本情况处理**:\n - 如果两个节点都为null,则认为相同,返回true\n - 如果其中一个节点为null,另一个不是,则不同,返回false\n\n2. **递归比较**:\n - 比较当前节点的值是否相等\n - 递归比较左子树是否相同\n - 递归比较右子树是否相同\n - 只有当值相等且左右子树都相同时,才返回true\n\n## 代码实现\n\n```javascript\nvar isSameTree = function(p, q) {\n // 如果两个节点都为空,则相同\n if(p===null && q===null) return true;\n // 如果只有一个节点为空,则不同\n if(p===null) return false;\n if(q===null) return false;\n // 比较当前节点值,并递归比较左右子树\n return p.val===q.val && isSameTree(p.left,q.left) && isSameTree(p.right,q.right);\n};\n```\n\n\n## 复杂度分析\n\n- **时间复杂度**:O(min(m,n)),其中m和n分别是两个二叉树的节点数。在最坏情况下,需要遍历两个树中所有节点。\n- **空间复杂度**:O(min(m,n)),递归调用的层数最多为较小树的高度,最坏情况下为O(min(m,n))。\n\n这个算法通过递归方式同时遍历两棵树的相同位置节点,并比较它们的值是否相等,从而判断两棵树是否完全相同。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130348089","body":"## 思路\n\n### 核心思路\n- 使用深度优先搜索(DFS)遍历二叉树\n- 在遍历过程中维护从根节点到当前节点形成的数字\n- 当到达叶节点时,将形成的数字加到结果中\n\n### 具体实现\n\n1. **函数定义与参数**:\n - `sumNumbers(root, prev = 0)` 接收当前节点 `root` 和之前形成的数字 `prev`\n - `prev` 参数有默认值 0,用于累积从根到当前节点的数字\n\n2. **边界条件处理**:\n ```javascript\n if(!root) return 0;\n ```\n\n - 如果当前节点为空,返回 0\n\n3. **数字累积**:\n ```javascript\n prev = prev * 10 + root.val;\n ```\n\n - 将当前节点值添加到路径数字中\n - 通过 `prev * 10 + root.val` 实现数字的逐位构建\n\n4. **叶节点判断**:\n ```javascript\n if(!root.left && !root.right) return prev;\n ```\n\n - 如果当前节点是叶节点(无左右子节点),返回累积的数字\n\n5. **递归处理**:\n ```javascript\n return sumNumbers(root.left,prev) + sumNumbers(root.right,prev);\n ```\n\n - 分别递归处理左右子树\n - 将左右子树的结果相加返回\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root,prev = 0) {\n if(!root) return 0;\n prev = prev * 10 + root.val;\n if(!root.left && !root.right) return prev;\n return sumNumbers(root.left,prev) + sumNumbers(root.right,prev);\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n),其中 n 是二叉树的节点数,需要遍历每个节点一次\n- **空间复杂度**:O(h),其中 h 是二叉树的高度,主要是递归调用栈的空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134622736","body":"## 思路\n\n### 1. 核心思想\n使用深度优先搜索(DFS)遍历二叉树,记录每一层最左边的节点值。\n\n### 2. 关键实现点\n\n- **层级记录**:通过 `level` 参数跟踪当前节点所在的层级\n- **每层只记录一次**:利用 `level === left.length` 条件确保每层只记录第一个访问的节点值\n- **先左后右遍历**:先遍历左子树再遍历右子树,保证每层第一个访问的是最左边的节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let left = [];\n dfs(root,0)\n return left[left.length - 1];\n // ----------------------\n function dfs(root,level){\n if(!root) return;\n if(level === left.length) left.push(root.val);\n dfs(root.left,level + 1);\n dfs(root.right,level + 1);\n }\n};\n```\n## 优化后的代码\n优化思路:没必要用数组保存整个左侧值,只需要记录左侧值第一次出现即可\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let left = 0,ans;\n dfs(root,0)\n return ans;\n // ----------------------\n function dfs(root,level){\n if(!root) return;\n if(level === left) {\n left++;\n ans = root.val;\n }\n dfs(root.left,level + 1);\n dfs(root.right,level + 1);\n }\n};\n```\n\n\n## 复杂度分析\n- **时间复杂度**:O(n),其中 n 是二叉树的节点数,需要遍历每个节点一次\n- **空间复杂度**:O(h),其中 h 是二叉树的高度,主要是递归调用栈的空间开销","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138308014","body":"## 思路\n\n### 1. 序列化 (`serialize`)\n- 使用前序遍历(根-左-右)遍历二叉树\n- 对于每个节点:\n - 如果节点为空,将 `null` 添加到结果数组\n - 如果节点不为空,将节点值添加到结果数组,然后递归处理左右子树\n- 最后将数组转换为 JSON 字符串返回\n\n### 2. 反序列化 (`deserialize`)\n- 将 JSON 字符串解析为数组\n- 使用递归方式重建二叉树:\n - 按顺序读取数组元素\n - 如果当前元素是 `null`,返回 `null`\n - 如果当前元素不是 `null`,创建新节点,并递归构建左右子树\n - 利用前序遍历的特点,按顺序处理就能重建原来的树结构\n\n## 关键特点\n\n1. **前序遍历**:保证了根节点在子节点之前被处理,便于重建时确定父子关系\n2. **空节点标记**:用 `null` 标记空节点,确保能完全还原树的结构\n3. **递归实现**:两个函数都使用递归方式实现,代码简洁清晰\n\n## 示例说明\n\n假设有一棵二叉树:\n```\n 1\n / \\\n 2 3\n / \\\n 4 5\n```\n\n\n- 序列化结果:`[1,2,null,null,3,4,null,null,5,null,null]`\n- 反序列化时按此顺序重建树结构\n\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n let ans = [];\n dfs(root);\n return JSON.stringify(ans);\n // -----------------\n function dfs(root){\n if(!root){\n ans.push(null);\n return;\n }\n ans.push(root.val);\n dfs(root.left);\n dfs(root.right);\n }\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n let arr = JSON.parse(data),i = 0;\n //console.log(arr);\n return dfs();\n // if(arr.length === 0) return null;\n // ---------------------\n function dfs(){\n let node;\n // console.log(i,arr[i]);\n if(arr[i] === null) node = null;\n else node = new TreeNode(arr[i]);\n i++;\n if(node) {\n node.left = dfs();\n node.right = dfs();\n }\n return node;\n }\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```\n\n## 复杂度分析\n- 时间复杂度:序列化和反序列化的时间复杂度都是 O(n),其中 n 是二叉树的节点数。\n- 空间复杂度:考虑到返回值的话,序列化和反序列化的空间复杂度都是 O(n),其中 n 是二叉树的节点数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3141895435","body":"## 思路\n\n### 具体实现步骤\n\n1. **数据结构选择**\n - 使用一个大小为2001的数组 cols 每个元素是一个优先队列 `PriorityQueue`\n - 优先队列用于处理同一列中节点的排序问题\n\n2. **排序规则**\n - 主要按行号 row 排序(上到下)\n - 行号相同时按节点值 `node.val` 排序\n\n3. **DFS遍历**\n - 通过 dfs 函数遍历整个二叉树\n - 将每个节点按其列号存入对应的优先队列中\n - 列号通过 `col + 1000` 映射到数组索引,处理负数列号\n\n4. **结果构建**\n - 遍历 cols 数组,跳过空队列\n - 从每个非空队列中依次取出元素,构建每列的结果\n - 按列顺序组合成最终结果\n\n## 关键点\n\n- **坐标系统**:以根节点为原点(0,0),向左列号减1,向右列号加1,向下行号加1\n- **偏移处理**:通过 `col + 1000` 将可能的负数列号映射到正数索引\n- **排序逻辑**:同一位置优先按行排序,其次按值排序\n\n这种方法确保了垂直遍历的正确顺序。\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n let cols = new Array(2000 + 1).fill(0).map(()=>new PriorityQueue((a,b)=>{\n if(a[0] !== b[0]) return a[0] - b[0];\n return a[2] - b[2];\n }));\n\n dfs(root,0,0);\n let ans = [];\n for(let i = 0;i <= 2000;i++){\n let data = cols[i];\n if(data.size() === 0) continue;\n let temp = []\n while(data.size()) temp.push(data.dequeue()[2]);\n ans.push(temp);\n }\n return ans;\n\n // --------------------------------\n function dfs(node,row,col){\n if(!node) return;\n cols[col + 1000].enqueue([row,col,node.val]);\n dfs(node.left,row + 1,col - 1);\n dfs(node.right,row + 1,col + 1);\n }\n \n};\n```\n\n## 复杂度分析\n\n### 时间复杂度\n\n1. **初始化阶段**\n - 创建大小为2001的数组并初始化优先队列:O(2001) = O(1)\n\n2. **DFS遍历阶段**\n - 对每个节点执行一次 dfs 调用\n - 假设树有 N 个节点,则 DFS 总共执行 N 次\n - 每次 enqueue 操作在优先队列中的时间复杂度为 O(log M),其中 M 是队列中元素个数\n - 最坏情况下,所有节点都在同一列,M 最大为 N\n - 因此 DFS 阶段时间复杂度为 O(N log N)\n\n3. **结果构建阶段**\n - 遍历2001个位置的数组:O(2001) = O(1)\n - 从优先队列中 dequeue 所有元素:每个元素 dequeue 一次,总共 N 个元素\n - 每次 dequeue 操作为 O(log M)\n - 总时间复杂度为 O(N log N)\n\n**总时间复杂度:O(N log N)**,其中 N 是二叉树中节点的数量\n\n### 空间复杂度\n\n1. **存储结构**\n - cols 数组:大小固定为 2001,每个元素是一个优先队列\n - 所有优先队列总共存储 N 个节点信息:O(N)\n - 每个节点信息是一个包含3个元素的数组:O(1) 每节点\n\n2. **递归调用栈**\n - dfs 函数的递归深度最多为树的高度 H\n - 在最坏情况下(树退化为链表),H = N\n - 平均情况下,对于平衡二叉树,H = log N\n\n3. **结果数组**\n - ans 数组存储最终结果:O(N)\n\n**总空间复杂度:O(N)**,其中 N 是二叉树中节点的数量\n\n### 总结\n\n- **时间复杂度:O(N log N)**\n- **空间复杂度:O(N)**\n\n其中 N 为二叉树的节点总数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146457266","body":"## 思路:\n\n1. **使用哈希表存储已遍历元素**:\n - 创建一个空对象 [map](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\454\\2.js#L5-L5) 作为哈希表\n - 用于存储已经遍历过的元素值和其对应的索引\n\n2. **一次遍历查找**:\n - 遍历数组中的每个元素 `nums[i]`,记为 [a](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\1.js#L14-L14)\n - 计算目标差值 `b = target - a`\n - 检查 `b` 是否已经在哈希表中存在\n - 如果存在,说明找到了两个数,它们的和等于目标值,直接返回这两个数的索引 `[map[b], i]`\n - 如果不存在,将当前元素 [a](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\1.js#L14-L14) 和它的索引 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 存入哈希表,继续遍历\n\n### 算法优势:\n1. **时间复杂度优化**:从暴力解法的 O(n²) 降低到 O(n)\n2. **空间换时间**:使用额外的哈希表存储,换取查找时间的优化\n3. **一次遍历**:只需要遍历一次数组就能得到结果\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n let map = {}\n for(let i = 0;i < nums.length;i++){\n let a = nums[i],b = target - a;\n if(map[b] !== undefined) return [map[b],i];\n map[a] = i;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是数组的长度。\n- 空间复杂度:O(n),哈希表 map 的大小为 n。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3146924002","body":"## 思路\n### 主要步骤:\n\n1. **统计频次**:使用 [map](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题04.01.节点间通路/main.js#L13-L13) 对象统计每个数字在数组中出现的频次\n ```javascript\n let map = {};\n for(let i of nums) map[i] = (map[i] || 0) + 1;\n ```\n\n\n2. **维护大小为 K 的最小堆**:使用最小堆来保存频率最高的 K 个元素\n ```javascript\n let q = new MinPriorityQueue(v=>v[1]); // 基于元素出现频次的优先队列\n ```\n\n\n遍历统计结果,将元素和其频次作为数组加入堆中,当堆的大小超过 K 时,移除堆顶(即当前堆中频次最低的元素):\n ```javascript\n for(let key in map){\n q.enqueue([+key,map[key]]);\n if(q.size() > k) q.dequeue();\n }\n ```\n\n\n3. **构建结果数组**:依次从堆中取出元素,因为是最小堆,所以频次低的先出堆,最终得到的就是频次最高的 K 个元素\n ```javascript\n let ans = [];\n while(q.size()){\n ans.push(q.dequeue()[0]);\n }\n ```\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function(nums, k) {\n let q = new MinPriorityQueue(v=>v[1]);\n let map = {};\n for(let i of nums) map[i] = (map[i] || 0) + 1;\n for(let key in map){\n q.enqueue([+key,map[key]]);\n if(q.size() > k) q.dequeue();\n } \n let ans = [];\n while(q.size()){\n ans.push(q.dequeue()[0]);\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(N log K),其中 N 是数组的长度\n- 空间复杂度:O(N),用于存储频次映射表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148902680","body":"## 思路\n\n### 1. 数据结构选择\n- 使用 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 数组存储每个点到其他点的距离统计\n- `map[i]` 是一个 Map,记录第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 个点到其他各点的距离及出现次数\n\n### 2. 核心逻辑\n- **距离计算**:遍历所有点对,计算两点间距离的平方(避免开根号运算)\n- **距离统计**:将每对点的距离信息分别记录到两个点的统计中\n- **结果计算**:对于每个点,如果到其他点有相同距离的点超过1个,则可以组成回旋镖\n\n### 3. 关键步骤详解\n\n```javascript\n// 计算两点间距离的平方\nfunction calc(i,j){\n let a = Math.abs(points[i][0] - points[j][0]),b = Math.abs(points[i][1] - points[j][1]);\n return a * a + b * b;\n}\n```\n这段代码计算两个点之间的欧几里得距离的平方,使用平方避免浮点运算。\n\n```javascript\n// 统计每个点到其他点的距离\nfunction addMap(i,dis){\n let m = map[i];\n m.set(dis,(m.get(dis) || 0) + 1);\n}\n```\n将距离信息记录到对应点的统计Map中。\n\n### 4. 结果计算原理\n\n对于每个点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6),如果存在 `v` 个点与它距离相同(`v>1`),则可以从这 `v` 个点中选择 2 个点与点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 组成回旋镖,选择方式有 `v*(v-1)` 种。\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} points\n * @return {number}\n */\nvar numberOfBoomerangs = function(points) {\n let n = points.length;\n if(n < 3) return 0;\n let map = new Array(n).fill(0).map(()=>new Map());\n for(let i = 0;i < n;i++){\n for(let j = i + 1;j < n;j++){\n let dis = calc(i,j);\n addMap(i,dis);\n addMap(j,dis);\n }\n }\n let ans = 0;\n for(let i = 0;i < n;i++){\n for(let [k,v] of map[i]){\n if(v <= 1) continue;\n ans += v * (v - 1);\n }\n }\n\n return ans;\n\n \n\n\n // ------------------------------\n function calc(i,j){\n let a = Math.abs(points[i][0] - points[j][0]),b = Math.abs(points[i][1] - points[j][1]);\n return a * a + b * b;\n }\n\n function addMap(i,dis){\n let m = map[i];\n m.set(dis,(m.get(dis) || 0) + 1);\n\n }\n};\n```\n\n## 算法复杂度\n- 时间复杂度:O(n²)\n- 空间复杂度:O(n²)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3152979976","body":"## 思路\n\n### 核心思想\n使用**滑动窗口**(Sliding Window)技术配合**哈希表**来解决这个问题。\n\n### 关键变量说明\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31): 滑动窗口的左边界\n- [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6): 滑动窗口的右边界(循环变量)\n- [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5): 用于记录窗口内每个字符出现的次数\n- `ans`: 记录最长无重复子串的长度\n\n### 算法步骤\n\n1. **初始化**:设置左边界 `l = 0`,创建字符计数的 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5),初始化结果 `ans = 0`\n\n2. **扩展窗口**:使用 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 从左到右遍历字符串,逐步扩展窗口右边界\n\n3. **处理重复字符**:\n - 当遇到重复字符时(`map.has(c)` 为 true),不断右移左边界 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31)\n - 移动过程中减少对应字符的计数,如果计数为0则从 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 中删除\n - 直到窗口中不再包含当前字符为止\n\n4. **更新结果**:\n - 计算当前窗口长度 `i - l + 1`\n - 与历史最大值比较,更新 `ans`\n\n5. **维护窗口状态**:将当前字符加入 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 并增加其计数\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n let l = 0, map = new Map(),n = s.length,ans = 0;\n for(let i = 0;i < n;i++){\n let c = s[i]\n while(map.has(c)){\n map.set(s[l],map.get(s[l]) - 1);\n if(map.get(s[l]) === 0) map.delete(s[l]);\n l++;\n }\n // console.log(l,i,s.slice(l,i + 1));\n ans = Math.max(i - l + 1,ans);\n map.set(c,(map.get(c) || 0 ) + 1)\n }\n return ans;\n};\n```\n\n\n## 复杂度分析\n- **时间复杂度**: O(n),其中 n 是字符串长度,每个字符最多被访问两次\n- **空间复杂度**: O(min(m,n)),其中 m 是字符集大小","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3157255368","body":"## 思路\n\n### 1. 建立单词频次映射\n```javascript\nlet map = new Map();\nwords.forEach((word,i)=>{\n map.set(word,(map.get(word) || 0) + 1);\n});\n```\n\n- 使用 `Map` 统计 `words` 数组中每个单词的出现次数\n- 处理 `words` 中可能存在重复单词的情况\n\n### 2. 初始化参数\n```javascript\nlet n = s.length,m = words.length,k = words[0].length,l = k * m;\n```\n\n- [n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6): 字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- `m`: 单词数组的长度\n- `k`: 每个单词的长度(题目保证所有单词等长)\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31): 所有单词连接后的总长度\n\n### 3. 遍历可能的起始位置\n```javascript\nfor(let i = 0;i <= n - l;i++){}\n```\n\n- 只需检查到 `n - l` 位置,因为更后面不可能容纳完整的连接串\n\n### 4. 检查每个窗口\n```javascript\nlet j = i,result = new Map(),total = 0;\nwhile(j < i + l){\n let c = s.slice(j,j + k);\n if(map.has(c) === false) break;\n let found = false;\n result.set(c,(result.get(c) || 0) + 1);\n if(result.get(c) <= map.get(c)) found = true;\n if(found === false) break;\n j += k;\n total++;\n}\n```\n\n- 从位置 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 开始,每次取长度为 `k` 的子串进行匹配\n- 使用 `result` 记录当前窗口中各单词的出现次数\n- 如果遇到不在 `words` 中的单词或某个单词出现次数超过要求,则提前终止\n- `total` 记录成功匹配的单词数\n\n### 5. 判断结果\n```javascript\nif(total === m) ans.push(i);\n```\n\n- 当成功匹配的单词数等于 `words` 长度时,说明找到了一个有效子串\n\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n let map = new Map();\n words.forEach((word,i)=>{\n map.set(word,(map.get(word) || 0) + 1);\n });\n let n = s.length,m = words.length,k = words[0].length,l = k * m;\n if(n < l) return [];\n let ans = [];\n for(let i = 0;i <= n - l;i++){\n let j = i,result = new Map(),total = 0;\n while(j < i + l){\n // console.log('check',s.slice(i,i + m * k));\n let c = s.slice(j,j + k);\n if(map.has(c) === false) break;\n let found = false;\n result.set(c,(result.get(c) || 0) + 1);\n if(result.get(c) <= map.get(c)) found = true;\n if(found === false) break;\n j += k;\n total++;\n }\n if(total === m) ans.push(i); \n }\n return ans;\n};\n```\n## 复杂度分析\n### 时间复杂度\n- 外层循环: O(n - l)\n- 内层循环: O(m)\n- 总体复杂度: O((n - l) × m)\n### 空间复杂度\nO(n):存储单词频次映射和结果数组\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162347437","body":"## 思路\n\n使用前缀和 + 哈希表的方法,基于以下数学原理:\n\n1. 如果总和 `totalSum % p = delta`,我们需要找到一个子数组,其和模 `p` 也等于 `delta`\n2. 这样删除该子数组后,剩余元素和就能被 `p` 整除\n\n## 代码步骤分析\n\n### 1. 前缀和计算\n```javascript\nlet n = nums.length, sum = new Array(n + 1).fill(0);\nfor(let i = 0; i < n; i++) sum[i + 1] = sum[i] + nums[i];\n```\n\n- 构建前缀和数组 `sum`,其中 `sum[i]` 表示前 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 个元素的和\n- `sum[0] = 0`,`sum[i] = nums[0] + nums[1] + ... + nums[i-1]`\n\n### 2. 计算目标余数\n```javascript\nlet delta = sum[n] % p;\nif(delta === 0) return 0;\n```\n\n- `sum[n]` 是所有元素的总和\n- `delta` 是总和对 `p` 的余数\n- 如果 `delta` 为 0,说明总和已能被 `p` 整除,返回 0\n\n### 3. 寻找最短子数组\n```javascript\nlet ans = Infinity;\nlet map = new Map();\nfor(let i = 0; i <= n; i++){\n let b = sum[i], a = (b % p - delta % p + p) % p;\n map.set(b % p, i);\n if(map.has(a)) ans = Math.min(ans, i - map.get(a));\n}\n```\n\n\n关键数学关系:\n- 对于子数组 `nums[j...i-1]`,其和为 `sum[i] - sum[j]`\n- 我们希望 `(sum[i] - sum[j]) % p = delta`\n- 即 `sum[i] % p = (sum[j] + delta) % p`\n- 变形得:`sum[j] % p = (sum[i] % p - delta) % p`\n\n具体实现:\n- `b = sum[i]`:当前前缀和\n- `a = (b % p - delta % p + p) % p`:需要找到的前缀和余数\n- 用 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 记录每个余数值最后一次出现的位置\n- 如果找到对应的余数 [a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27),则更新最短长度\n\n### 4. 返回结果\n```javascript\nreturn ans === n ? -1 : ans;\n```\n\n- 如果最短长度等于数组长度,说明需要删除整个数组,返回 -1\n- 否则返回找到的最短子数组长度\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar minSubarray = function(nums, p) {\n let n = nums.length,sum = new Array(n + 1).fill(0);\n for(let i = 0;i < n;i++) sum[i + 1] = sum[i] + (nums[i]);\n // p = BigInt(p);\n let delta = sum[n] % p;\n if(delta === 0) return 0;\n let ans = Infinity;\n let map = new Map();\n for(let i = 0;i <= n;i++){\n let b = sum[i],a = (b % p - delta % p + p) % p;\n map.set(b % p,i);\n if(map.has(a)) ans = Math.min(ans,i - map.get(a));\n }\n return ans === n ? -1 : ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),只需遍历一次数组\n- 空间复杂度:O(n),用于存储前缀和数组和哈希表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166424389","body":"\n## 思路\n使用了经典的**快慢指针**(龟兔赛跑)算法。\n\n1. **双指针技巧**:\n - `slow` 指针每次移动一步\n - `fast` 指针每次移动两步\n - 当 `fast` 到达链表末尾时,`slow` 正好在中间位置\n\n## 代码执行流程\n\n- **初始化**:两个指针 `slow` 和 `fast` 都指向链表头节点 [head](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题02.04.分割链表\\main.js#L50-L50)\n- **循环条件**:`while (fast && fast.next)` 确保 `fast` 可以安全地移动两步\n- **指针移动**:\n - `fast` 连续移动两步:`fast = fast.next; fast = fast.next;`\n - `slow` 移动一步:`slow = slow.next;`\n- **返回结果**:当循环结束时,`slow` 指向中间节点\n\n## 处理奇偶数节点的情况\n\n- **奇数个节点**:返回正中间的节点\n- **偶数个节点**:返回第二个中间节点(如链表有4个节点,则返回第3个节点)\n\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n let slow = head,fast = head;\n while(fast && fast.next){\n fast = fast.next;\n fast = fast.next;\n slow = slow.next;\n }\n return slow;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是链表的节点数。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169628215","body":"## 思路\n\n1. 使用双指针技术:\n - [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 指针(慢指针):指向不重复序列的最后一个元素位置\n - [i](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题08.07.无重复字符串的排列组合/main.js#L9-L22) 指针(快指针):用于遍历整个数组\n\n2. 初始化:\n - [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 从 0 开始,表示第一个元素肯定是要保留的\n - [i](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题08.07.无重复字符串的排列组合/main.js#L9-L22) 从 1 开始遍历\n\n3. 核心逻辑:\n - 当 `nums[i] > nums[r]` 时,说明找到了一个新的不重复元素\n - 此时将 [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 向前移动一位,并将 `nums[i]` 与 `nums[r]` 交换\n - 由于数组是排序的,所以只需要比较大小就能判断是否是新元素\n\n4. 返回值:\n - 返回 [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) + 1,即不重复元素的个数\n\n### 示例演示:\n\n假设数组为 [0, 0, 1, 1, 2, 2]:\n\n1. 初始:r = 0, i = 1,nums[1] = 0, nums[0] = 0,不满足 `nums[i] > nums[r]`\n2. i = 2,nums[2] = 1, nums[0] = 0,满足 `nums[2] > nums[0]`,r 变为 1,交换 nums[2] 和 nums[1]\n - 数组变为 [0, 1, 0, 1, 2, 2],r = 1\n3. i = 3,nums[3] = 1, nums[1] = 1,不满足 `nums[i] > nums[r]`\n4. i = 4,nums[4] = 2, nums[1] = 1,满足 `nums[4] > nums[1]`,r 变为 2,交换 nums[4] 和 nums[2]\n - 数组变为 [0, 1, 2, 1, 0, 2],r = 2\n5. i = 5,nums[5] = 2, nums[2] = 2,不满足 `nums[i] > nums[r]`\n6. 结束,返回 r + 1 = 3\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n let n = nums.length,r = 0;\n for(let i = 1;i < n;i++){\n if(nums[i] > nums[r]) {\n r++;\n swap(i,r);\n }\n //console.log(nums);\n }\n return r + 1;\n // ------------------------\n function swap(i,j){\n [nums[i],nums[j]] = [nums[j],nums[i]]\n }\n};\n```\n\n### 复杂度分析:\n\n- 时间复杂度:O(n),只需要遍历一次数组\n- 空间复杂度:O(1),只使用了常数级别的额外空间\n- 利用了数组已经排序的特性,通过比较大小判断是否重复\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172297646","body":"## 思路\n经典的二分查找算法,用于在有序数组中找到目标值的插入位置\n1. **初始化变量**:\n - `n`:数组长度\n - `l`:左边界,初始为0\n - `r`:右边界,初始为n-1\n - `ans`:结果位置,初始为n(表示插入到数组末尾)\n\n2. **二分查找逻辑**:\n - 使用标准二分查找模板,当`l <= r`时继续查找\n - `mid = (l + r) >> 1`:计算中间位置(相当于除以2取整)\n - 关键判断:`if(nums[mid] >= target)`\n - 如果中间元素大于等于目标值,说明目标值应该在左半部分(包括mid位置)\n - 更新`ans = mid`,并将右边界移动到`mid - 1`\n - 否则,目标值在右半部分,将左边界移动到`mid + 1`\n\n3. **返回结果**:\n - 返回找到的插入位置`ans`\n\n### 特殊情况处理\n\n- 如果target小于所有元素,ans保持为0(正确位置)\n- 如果target大于所有元素,ans保持为n(数组长度,正确位置)\n- 如果target等于某个元素,ans为该元素的索引\n- 如果target介于两个元素之间,ans为较大元素的位置\n\n这个实现非常优雅,通过一个变量ans记录可能的答案,避免了在循环外再进行额外判断,使得代码简洁且易于理解。\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let n = nums.length;\n let l = 0, r = n - 1,ans = n;\n while(l <= r){\n let mid = (l + r) >> 1;\n if(nums[mid] >= target){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n};\n```\n\n### 复杂度分析\n\n1. **时间复杂度**:O(log n),典型的二分查找时间复杂度\n2. **空间复杂度**:O(1),只使用了常数级别的额外空间\n3. **核心思想**:寻找第一个大于等于target的元素位置","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173065451","body":"## 思路\n\n这段代码使用**单调队列**(双端队列)来解决滑动窗口最大值问题,时间复杂度为 O(n)。\n\n### 实现步骤\n\n1. **数据结构选择**\n - 使用 `q` 数组作为双端队列,存储数组元素的**索引**\n - 队列中保持索引对应的值**单调递减**的特性\n\n2. **维护单调性**\n ```javascript\n while(q.length && back() < nums[i]) q.pop();\n q.push(i);\n ```\n\n - 在每次添加新元素前,移除队尾所有小于当前元素的索引\n - 这样保证队首始终是当前窗口的最大值索引\n\n3. **窗口处理**\n ```javascript\n if(i >= k - 1){\n ans.push(nums[q[0]]); // 队首即为窗口最大值\n if(i - q[0] + 1 === k) q.shift(); // 移除窗口外的元素\n }\n ```\n\n - 当达到窗口大小时开始记录结果\n - 及时移除超出窗口范围的索引\n\n### 关键技巧\n\n- 存储索引而非值,便于判断元素是否在窗口范围内\n- 利用单调性快速获取窗口最大值(队首元素)\n- 通过索引差值判断元素是否需要移出窗口\n\n### 缺陷\n在javascript中,使用数组模拟双端队列,队首出队、入队的时间复杂度均为O(n),性能较差,可以考虑手动实现一个双端队列,例如使用双向链表,优化性能。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar maxSlidingWindow = function(nums, k) {\n let q = [],n = nums.length;\n let ans = [];\n for(let i = 0;i < n;i++){\n while(q.length && back() < nums[i]) q.pop();\n q.push(i);\n if(i >= k - 1){\n ans.push(nums[q[0]]);\n if(i - q[0] + 1 === k) q.shift();\n }\n }\n return ans;\n // ------------------------\n function back(){\n return nums[q[q.length - 1]];\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是数组的长度。单调队列的维护时间复杂度为 O(n),窗口处理时间复杂度为 O(n),因此总时间复杂度为 O(n)。\n- 空间复杂度:O(n),单调队列最多存储 n 个元素,因此空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3177500710","body":"## 思路\n\n### 1. 数据结构设计\n- 使用两个数组 `ind` 和 `outd` 分别记录每个人的入度和出度\n- 数组长度为 `n+1` 是为了方便使用1到n的索引对应人编号\n\n### 2. 统计过程\n```javascript\nfor(let [a,b] of trust){\n outd[a]++; // a相信别人,出度+1\n ind[b]++; // b被别人相信,入度+1\n}\n```\n\n- 遍历信任关系数组,统计每个人的入度和出度\n\n### 3. 法官判断\n```javascript\nfor(let i = 1;i <= n;i++){\n if(outd[i] === 0 && ind[i] === n - 1) return i;\n}\n```\n\n- 遍历所有人,寻找满足条件的人:\n - `outd[i] === 0`:不相信任何人\n - `ind[i] === n - 1`:被其他所有人相信\n\n这是典型的图论中利用入度出度解决问题的方法。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n let ind = new Array(n + 1).fill(0),// 入度\n outd = new Array(n + 1).fill(0);// 出度\n for(let [a,b] of trust){\n outd[a]++;\n ind[b]++;\n }\n for(let i = 1;i <= n;i++){\n if(outd[i] === 0 && ind[i] === n - 1) return i;\n }\n return -1;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(T + N),其中T是信任关系数,N是人数\n- 空间复杂度:O(N),用于存储入度和出度数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182022991","body":"## 思路\n\n### 1. 图的构建\n- 使用邻接表`g`存储不喜欢关系\n- 对于每一对`[a,b]`,在[a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27)的邻接表中添加`b`,在`b`的邻接表中添加[a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27)\n- 这样构建出一个无向图,表示不喜欢关系\n\n### 2. 二分图判断\n- 使用染色法判断是否为二分图\n- `color`数组记录每个节点的颜色状态:\n - `0`表示未染色\n - `1`表示第一组\n - `2`表示第二组\n\n### 3. DFS遍历\n- 遍历所有节点,对未染色节点开始DFS\n- [f(i, val)](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)函数:\n - 将节点[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)染成颜色[val](file://E:\\其他项目\\algorithm_exercises\\libs\\LinkedList.js#L34-L34)\n - 遍历[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)的所有邻居节点`j`\n - 如果邻居`j`已有颜色且与[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)相同,返回`false`\n - 如果邻居`j`未染色,递归将其染成相反颜色\n - 所有情况满足则返回`true`\n\n### 4. 核心逻辑\n- 主函数中遍历所有节点,对未染色节点调用[f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)函数\n- 如果任何一次调用返回`false`,说明无法二分,返回`false`\n- 全部成功则返回`true`\n\n这是典型的二分图判定问题,通过图的遍历和染色来解决。\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nvar possibleBipartition = function(n, dislikes) {\n let g = new Array(n + 1).fill(0).map(()=>[]);\n for(let [a,b] of dislikes){\n g[a].push(b);\n g[b].push(a);\n }\n let color = new Array(n + 1).fill(0);\n for(let i = 1;i <= n;i++){\n if(color[i] === 0 && !f(i,1)) return false;\n }\n return true;\n\n // ------------------------\n function f(i,val){\n color[i] = val;\n for(let j of g[i]){\n if(color[j] && color[j] === val) return false;\n if(!color[j] && !f(j,val === 1 ? 2 : 1)) return false; \n }\n return true;\n }\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n + dislikes.length) - 线性时间复杂度\n- 空间复杂度:O(n + dislikes.length) - 主要用于存储图结构和递归栈","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186678361","body":"## 主要思路\n\n### 1. 预处理阶段\n- **处理未分配项目**:将 `group[i] === -1` 的项目分配给新的虚拟组\n- **构建组内项目映射**:建立 `groupItems` 数组,记录每个组包含的项目\n\n### 2. 构建依赖图\n- **项目依赖图** (`itemG`):记录项目间的依赖关系\n- **小组依赖图** (`groupG`):记录小组间的依赖关系\n- **计算入度**:\n - `inID`:每个项目的入度\n - `inGD`:每个小组的入度\n\n### 3. 双层拓扑排序\n- **组间拓扑排序**:先对小组进行拓扑排序\n- **组内拓扑排序**:对每个小组内的项目进行拓扑排序\n\n## 关键函数分析\n\n### 主函数流程\n```javascript\n// 初始化和构建图结构\n// ...\n\n// 组间拓扑排序\nfor(let i = 0;i <= m;i++){\n if(inGD[i] === 0) qG.enqueue(i);\n}\nwhile(qG.size()){\n let i = qG.dequeue();\n getItemsFromGroup(i); // 处理组内项目\n // 更新小组依赖\n}\n```\n\n\n### 组内拓扑排序函数 `getItemsFromGroup`\n```javascript\nfunction getItemsFromGroup(g){\n // 对特定组内的项目进行拓扑排序\n // 只处理组内依赖关系\n}\n```\n\n## 核心思想\n采用**分层拓扑排序**策略:\n1. 先确保小组间的依赖关系满足\n2. 再确保每个小组内部的项目依赖关系满足\n3. 通过双层 BFS 实现完整的排序逻辑\n\n这种解法有效地将复杂的依赖关系分解为两个相对简单的拓扑排序问题。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n for(let i = 0;i < n;i++){\n if(group[i] === -1) group[i] = m++;\n }\n\n let groupItems = new Array(m).fill(0).map(()=>[]);\n for(let i = 0;i < n;i++){\n groupItems[group[i]].push(i);\n }\n\n\n\n let itemG = new Array(n).fill(0).map(()=>[]);// 项目依赖关系建图\n let groupG = new Array(m).fill(0).map(()=>new Set());// 小组依赖关系建图\n let inID = new Array(n).fill(0);//每个项目的入度\n let inGD = new Array(m).fill(0);//每个小组的入度\n beforeItems.forEach((prevs,curr)=>{\n inID[curr] += prevs.length;\n for(let prev of prevs) {\n itemG[prev].push(curr);\n let u = group[prev],v = group[curr];\n if(u === v) continue;\n if(groupG[u].has(v)) continue;\n groupG[u].add(v);\n inGD[v]++;\n }\n });\n\n //console.log('小组依赖',groupG,groupItems);\n\n let ans = [],qG = new Queue();\n\n\n for(let i = 0;i <= m;i++){\n if(inGD[i] === 0) qG.enqueue(i);\n }\n while(qG.size()){\n let i = qG.dequeue();\n getItemsFromGroup(i);\n for(let j of groupG[i]){\n inGD[j]--;\n if(inGD[j] === 0) qG.enqueue(j);\n }\n }\n return ans.length === n ? ans : [];\n\n // ---------------------------------\n function getItemsFromGroup(g){\n let items = groupItems[g];\n let qI = new Queue();\n for(let i of items){\n if(inID[i] === 0) qI.enqueue(i);\n }\n while(qI.size()){\n let i = qI.dequeue();\n ans.push(i);\n for(let j of itemG[i]){\n inID[j]--;\n if(inID[j] === 0 && group[j] === g) qI.enqueue(j);\n }\n }\n }\n\n };\n```\n## 复杂度分析\n- **时间复杂度**:O(n + m + |beforeItems|) - 每个项目和依赖关系只被处理一次\n- **空间复杂度**:O(n + m) - 存储图结构和队列","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190382685","body":"## 思路\n没啥好说的,模拟就完了\n## 代码\n```javascript\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let x = 0,y = 0;\n for(let move of moves){\n if(move === 'U') x--;\n else if(move === 'D') x++;\n else if(move === 'L') y--;\n else y++;\n } \n return x === 0 && y === 0\n};\n```\n## 复杂度分析\n- 时间复杂度O(n)\n- 空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193453621","body":"## 思路\n\n### 主要步骤:\n\n1. **数据预处理**:\n - 将原始任务数组 [enqueueTime, processingTime] 扩展为 [enqueueTime, processingTime, index],保留原始索引信息\n - 按照入队时间(enqueueTime)对任务进行排序\n\n2. **使用优先队列**:\n - 创建一个优先队列,排序规则是:\n - 首先按处理时间(processingTime)升序排列\n - 如果处理时间相同,则按下标(index)升序排列\n\n3. **任务处理逻辑**:\n - 初始化结果数组和当前时间点(end)\n - 当还有未处理任务或优先队列不为空时:\n - 如果优先队列为空,将当前时间点更新为下一个任务的入队时间\n - 将所有在当前时间点之前或刚好到达的未处理任务加入优先队列\n - 从优先队列中取出优先级最高的任务执行\n - 更新当前时间点(加上该任务的处理时间)\n - 将该任务的原始索引加入结果数组\n\n### 关键点解释:\n\n- **优先队列的作用**:确保在可执行的任务中,总是选择处理时间最短的任务执行(最短作业优先调度算法)\n- **时间管理**:通过 [end] 变量追踪当前时间点,确保任务按时间顺序被考虑\n- **边界处理**:当优先队列为空时,直接跳转到下一个任务的入队时间,避免不必要的循环\n\n## 代码\n```javascript\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n let data = [],n = tasks.length;\n // 按任务入队时间排序,同时不丢失下标信息。\n tasks.forEach((v,i)=>data.push([...v,i])); \n data.sort((a,b)=>a[0] - b[0]);\n // 优先队列,优先级为:先按任务时长,再按下标\n let i = 0,q = new PriorityQueue((a,b)=>{\n if(a[1] !== b[1]) return a[1] - b[1];\n return a[2] - b[2];\n });\n\n let ans = [],end = 0;\n while(i < n || q.size()){\n if(q.size() === 0) end = Math.max(end,data[i][0]);\n while(i < n && data[i][0] <= end) q.enqueue(data[i++]);\n let [_,p,index] = q.dequeue();\n ans.push(index);\n end += p;\n }\n return ans;\n};\n```\n\n## 复杂度分析\n### 时间复杂度:\n- 排序:O(n log n)\n- 优先队列操作:每个任务最多入队和出队一次,每次操作 O(log n)\n- 总体复杂度:O(n log n)\n### 空间复杂度:\n- 需要一个优先队列及一个数组保存数据,空间复杂度为 O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194152066","body":"## 思路\n\n### 主要函数功能\n\n1. [numberOfRounds](file:///E:/力扣刷题/algorithm_exercises/.md#L4-L13) - 主函数,计算从登录到登出之间的完整游戏回合数\n2. [parseTime](file:///E:/力扣刷题/algorithm_exercises/.md#L16-L18) - 辅助函数,将时间字符串解析为小时和分钟\n3. [calc](file:///E:/力扣刷题/algorithm_exercises/.md#L20-L37) - 核心计算函数,计算两个时间之间的回合数\n\n### 解题思路\n\n1. **时间解析**:首先将登录时间和登出时间解析为小时和分钟的数组\n2. **跨天处理**:如果登出时间早于登录时间,说明跨越了午夜,需要在登出时间上加24小时\n3. **回合计算**:\n - 将登录时间向上取整到最近的15分钟倍数(下一回合开始时间)\n - 计算登出时间和登录时间之间的15分钟间隔数\n - 如果结果为负数,则返回0\n\n### 代码细节\n\n```javascript\n// 时间取整逻辑\nif(m1 <= 0) m1 = 0;\nelse if(m1 <= 15) m1 = 15;\nelse if(m1 <= 30) m1 = 30;\nelse if(m1 <= 45) m1 = 45;\nelse {\n m1 = 0;\n h1++;\n}\n```\n\n这个逻辑将登录时间向上取整到下一个回合开始时间(每15分钟为一个回合)。\n\n```javascript\nlet ans = Math.floor((h2 * 60 + m2 - (h1 * 60 + m1)) / 15);\n```\n这行代码计算两个时间点之间有多少个完整的15分钟时间段。\n\n## 代码\n```javascript\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n let [h1,m1] = parseTime(loginTime),[h2,m2] = parseTime(logoutTime);\n if(h1 < h2 || h1 === h2 && m1 < m2) return calc(h1,m1,h2,m2);\n return calc(h1,m1,h2 + 24,m2);\n // -------------------------\n function parseTime(time){\n return time.split(':').map(v=>Number(v));\n }\n\n function calc(h1,m1,h2,m2){\n if(m1 <= 0) m1 = 0;\n else if(m1 <= 15) m1 = 15;\n else if(m1 <= 30) m1 = 30;\n else if(m1 <= 45) m1 = 45;\n else {\n m1 = 0;\n h1++;\n }\n // console.log(h1,m1,h2,m2)\n let ans = Math.floor((h2 * 60 + m2 - (h1 * 60 + m1)) / 15);\n if(ans < 0) return 0;\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(1),因为解析时间和计算都是常数时间操作。\n- 空间复杂度:O(1),因为只使用了常数个变量。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3195140726","body":"## 思路\n\n### 主函数 `minCharacters`\n- 通过比较三种情况的最小值来得到最终答案:\n - `altb(a,b)`: 使 a 中所有字符 < b 中所有字符需要的操作数\n - `altb(b,a)`: 使 b 中所有字符 < a 中所有字符需要的操作数\n - `aeqb(a,b)`: 使两个字符串都由同一字符组成需要的操作数\n\n### 辅助函数分析\n\n1. **`altb(a,b)` 函数**\n - 遍历分割点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) (1-25,对应字符 'b'-'z')\n - 计算需要修改的字符数:\n - [a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27) 中所有 ≥ i 的字符都需要修改\n - `b` 中所有 < i 的字符都需要修改\n - 返回最小操作数\n\n2. **`aeqb(a,b)` 函数**\n - 统计两个字符串中各字符出现次数\n - 找到出现频率最高的字符\n - 将其他所有字符都修改为该字符即为最少操作数\n\n3. **`getCharValue` 函数**\n - 将字符转换为对应的数值 (a=0, b=1, ..., z=25)\n\n## 代码\n```javascript\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n return Math.min(altb(a,b),altb(b,a),aeqb(a,b));\n // --------------------------------------\n function altb(a,b){\n let ans = Infinity;\n for(let i = 1;i < 26;i++){\n let temp = 0;\n for(let c of a) if(getCharValue(c) >= i) temp++;\n for(let c of b) if(getCharValue(c) < i) temp++;\n ans = Math.min(ans,temp);\n }\n return ans;\n }\n\n function aeqb(a,b){\n let data = new Array(26).fill(0);\n for(let c of a) data[getCharValue(c)]++;\n for(let c of b) data[getCharValue(c)]++;\n let max = data.reduce((a,b)=>Math.max(a,b),0);\n return a.length + b.length - max;\n }\n\nfunction getCharValue(char){\n return char.charCodeAt(0) - 'a'.charCodeAt(0);\n }\n};\n```\n\n\n## 复杂度分析\n- 时间复杂度:O((m+n)×26) = O(m+n),其中 m 和 n 分别是字符串 a 和 b 的长度\n- 空间复杂度:O(1),只使用了固定大小的额外空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199063845","body":"## 思路\n使用**三路快排(Three-way QuickSort)**的实现,主要通过以下步骤完成排序:\n1. **选择基准值(pivot)**:使用 `viot` 函数选择一个合适的基准值\n2. **分区操作(partition)**:将数组分为三部分:小于基准值、等于基准值、大于基准值\n3. **递归排序**:对小于和大于基准值的两个子数组递归进行快排\n\n## 关键函数分析\n\n### 1. 主排序函数 `quickSort`\n```javascript\nfunction quickSort(l,r){\n if(l >= r) return;\n let i = viot(l,r); // 选择基准值位置\n if(r - l === 1) return;\n if(i !== l) swap(i,l); // 将基准值移到最左边\n let [low,up] = partition(l,r); // 三路分区\n quickSort(l,low - 1); // 递归排序小于基准值的部分\n quickSort(up + 1,r); // 递归排序大于基准值的部分\n}\n```\n\n\n### 2. 基准值选择 `viot`\n```javascript\nfunction viot(l,r){\n // 选择左、中、右三个元素作为候选\n let a = nums[l], c = nums[r];\n let mid = (l + r) >> 1, b = nums[mid];\n \n // 通过比较这三个值选择一个较优的基准值位置\n // 实现了三数取中法的思想\n}\n```\n\n\n### 3. 三路分区 [partition](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题02.04.分割链表\\main.js#L15-L48)\n```javascript\nfunction partition(i,j){\n let viot = nums[i], l = i - 1, r = j + 1;\n for(let k = i; k < r; k++){\n let c = nums[k];\n if(c > viot){\n r--;\n swap(k,r);\n k--; // 交换后需要重新检查当前位置\n }else if(c < viot){\n l++;\n swap(k,l);\n }\n // c === viot 时,元素保持在中间区域\n }\n return [l + 1, r - 1]; // 返回等于基准值的区间边界\n}\n```\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function(nums) {\n quickSort(0,nums.length - 1);\n return nums;\n // -------------------------\n function quickSort(l,r){\n if(l >= r) return;\n // console.log(l,r,nums);\n // 找基准值位置\n let i = viot(l,r);\n if(r - l === 1) return;\n if(i !== l) swap(i,l);\n // console.log('viot',nums[l]);\n let [low,up] = partition(l,r);\n // console.log(mid,nums);\n quickSort(l,low - 1);\n quickSort(up + 1,r);\n }\n\n function partition(i,j){\n let viot = nums[i],l = i - 1,r = j + 1;\n for(let k = i;k < r;k++){\n let c = nums[k];\n if(c > viot){\n r--;\n swap(k,r);\n k--;\n }else if(c < viot){\n l++;\n swap(k,l);\n }\n }\n return [l + 1,r - 1];\n }\n\n function viot(l,r){\n let a = nums[l],c = nums[r];\n if(a > c){\n swap(l,r);\n a = nums[l];\n c = nums[r];\n }\n if(r - l === 1) return;\n let mid = (l + r) >> 1,b = nums[mid];\n // if(a === c && a === b) return l;\n if(a === c) return a < b ? l : mid;\n if(b === a || b === c) return l;\n else if(b < a) return l;\n else if(b > a && b < c) return mid;\n return r;\n }\n\n function swap(l,r){\n [nums[l],nums[r]] = [nums[r],nums[l]];\n }\n };\n```\n\n## 复杂度分析\n- **三路快排**:能够很好地处理有重复元素的数组,将相等元素聚集在一起\n- **优化的基准值选择**:使用三数取中法减少最坏情况的发生\n- **原地排序**:不需要额外的存储空间\n- **时间复杂度**:平均 O(n log n),最坏 O(n²)\n- **空间复杂度**:O(log n)(递归调用栈)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204104013","body":"## 思路\n\n### 2. 初始化变量\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31):二分查找的左边界,初始值为 `0`。\n- `r`:二分查找的右边界,初始值为 `x`。\n- `ans`:用于记录当前找到的满足条件的最大整数平方根,初始值为 `0`。\n\n### 3. 二分查找过程\n- 循环条件为 `l <= r`,表示在左边界小于等于右边界时继续查找。\n- 计算中间值 `mid`:\n ```javascript\n let mid = l + ((r - l) >> 1);\n ```\n\n 这里使用了位运算 `>> 1` 来代替除以 `2` 的操作,目的是提高计算效率。\n- 判断逻辑:\n - 如果 `mid * mid <= x`,说明 `mid` 可能是答案,但还可能有更大的值满足条件,因此更新 `ans = mid` 并将左边界右移:`l = mid + 1`。\n - 否则,说明 `mid` 太大,需要将右边界左移:`r = mid - 1`。\n\n### 4. 返回结果\n- 最终返回 `ans`,即找到的满足条件的最大整数平方根。\n\n\n## 代码\n```javascript\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n let l = 0,r = x,ans = 0;\n while(l <= r){\n let mid = l + ((r - l) >> 1);\n if(mid * mid <= x){\n ans = mid\n l = mid + 1;\n }else{\n r = mid - 1;\n }\n }\n return ans;\n};\n```\n### 复杂度分析\n- 时间复杂度为 `O(log x)`,因为采用了二分查找策略。\n- 空间复杂度为 `O(1)`,只使用了常数级别的额外空间。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208885502","body":"## 思路\n\n### 1. 二分查找策略\n- 使用 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31) 和 `r` 维护搜索区间 `[1, n]`\n- 通过 `mid = l + ((r - l) >> 1)` 计算中点,避免整数溢出\n- 根据 `isBadVersion(mid)` 的结果调整搜索区间\n\n### 2. 搜索逻辑\n- 如果 `isBadVersion(mid)` 返回 `true`(当前版本是错误的):\n - 记录当前版本为候选答案 `ans = mid`\n - 在左半区间继续搜索 `r = mid - 1`\n- 如果返回 `false`(当前版本是正确的):\n - 在右半区间继续搜索 `l = mid + 1`\n\n\n\n## 代码\n```javascript\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let l = 1,r = n,ans = 1;\n while(l <= r){\n let mid = l + ((r - l) >> 1);\n if(isBadVersion(mid)){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n };\n};\n```\n## 复杂度分析\n- 时间复杂度:O(log n)\n- 空间复杂度:O(1)\n- 通过不断缩小区间范围,最终找到第一个错误版本","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3213065724","body":"## 思路\n\n1. **归并排序框架**:使用分治思想,将数组不断二分,递归处理左右两部分\n2. **关键逻辑**:在合并两个有序数组时,统计满足 `nums[i] > 2 * nums[j]` 条件的翻转对数量\n\n## 代码结构分析\n\n### 主函数 `reversePairs`\n- 初始化变量和临时数组\n- 调用 `sort` 函数进行归并排序\n- 返回统计结果 `ans`\n\n### 排序函数 `sort`\n- 标准的归并排序递归结构\n- 将数组 `[l, r]` 分为 `[l, mid]` 和 `[mid+1, r]` 两部分\n- 递归排序后调用 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 合并\n\n### 合并函数 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37)\n包含两个主要步骤:\n\n1. **统计翻转对**:\n ```javascript\n if(nums[i] / 2 > nums[j]){\n ans += mid - i + 1;\n j++;\n }else i++;\n ```\n\n - 利用左右两部分已排序的特性\n - 当 `nums[i] > 2 * nums[j]` 时,说明从 `i` 到 `mid` 的所有元素都与 `nums[j]` 构成翻转对\n\n2. **标准归并**:\n - 将两个有序数组合并为一个有序数组\n - 使用 `temp` 数组作为临时存储\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n let n = nums.length,ans = 0;\n let temp = new Array(n);\n sort(0,n - 1);\n return ans;\n // -----------------------\n function sort(l,r){\n if(l >= r) return;\n let mid = (l + r) >> 1;\n sort(l,mid);\n sort(mid + 1,r);\n merge(l,r,mid);\n }\n\n function merge(left,right,mid){\n let i = left,j = mid + 1,p = left;\n while(i <= mid && j <= right){\n if(nums[i] / 2 > nums[j]){\n ans += mid - i + 1;\n j++;\n }else i++;\n }\n\n i = left;\n j = mid + 1;\n while(i <= mid || j <= right){\n if(j > right || i <= mid && nums[i] < nums[j]) temp[p++] = nums[i++];\n else temp[p++] = nums[j++];\n }\n\n for(let i = left;i <= right;i++) nums[i] = temp[i];\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n)\n- 空间复杂度:O(n)\n- 利用归并排序过程中数组局部有序的特性,高效统计翻转对\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216251902","body":"\n## 思路\n\n1. **排序处理**:\n - 首先对供暖器数组进行排序,这样便于后续的二分查找操作。\n\n2. **边界处理**:\n - 在供暖器数组的两端分别添加`-Infinity`和`Infinity`,这样可以简化边界条件的处理,避免在查找过程中需要特殊判断边界情况。\n\n3. **核心算法**:\n - 对每个房屋,通过[egt](file:///E:/力扣刷题/algorithm_exercises/91天学算法/day40/.md#L22-L33)函数找到第一个大于等于该房屋位置的供暖器位置\n - 然后比较该房屋与前一个供暖器和后一个供暖器的距离,取较小值作为该房屋所需的最小加热半径\n - 在所有房屋所需的最小加热半径中取最大值,就是能覆盖所有房屋的最小加热半径\n\n4. **二分查找优化**:\n - [egt](file:///E:/力扣刷题/algorithm_exercises/91天学算法/day40/.md#L22-L33)函数使用二分查找来快速定位第一个大于等于目标值的供暖器位置,时间复杂度从O(n)降低到O(log n)\n\n## 具体实现细节\n\n- `heaters[j] - house`表示房屋到右边最近供暖器的距离\n- `house - heaters[i]`表示房屋到左边最近供暖器的距离\n- `Math.min(heaters[j] - house, house - heaters[i])`得到该房屋需要的最小加热半径\n- `Math.max(ans, r)`维护所有房屋中需要的最大加热半径\n\n## 代码\n```javascript\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n const compare = (a,b) => a - b;\n heaters.sort(compare);\n heaters.push(Infinity);\n heaters.unshift(-Infinity);\n let ans = -Infinity;\n for(let house of houses){\n let j = egt(house),i = j - 1;\n r = Math.min(heaters[j] - house,house - heaters[i]);\n ans = Math.max(ans,r);\n }\n return ans;\n // -------------------------\n function egt(target){\n let l = 0,r = heaters.length - 1,ans = r + 1;\n while(l <= r){\n let mid = (l + r) >> 1\n if(heaters[mid] >= target){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(mlogn + nlogn),其中m是房屋数量。排序的时间复杂度为O(nlogn),二分查找的时间复杂度为O(logn),因此总时间复杂度为O(nlogn + mlogn)。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217776735","body":"## 思路\n\n使用了**二分搜索 + 双指针**的方法来解决问题:\n\n### 1. 排序\n```javascript\nnums.sort((a,b) => a - b);\n```\n\n首先对数组进行排序,这样可以方便后续计算距离和使用双指针技巧。\n\n### 2. 二分搜索框架\n```javascript\nlet n = nums.length;\nlet r = nums[n - 1] - nums[0], l = 0, ans = 0;\nwhile(l <= r){\n let mid = (l + r) >> 1;\n let cnt = calc(mid);\n if(cnt >= k){\n ans = mid;\n r = mid - 1;\n } else {\n l = mid + 1;\n }\n}\n```\n\n这里使用二分搜索来查找第k小的距离:\n- 搜索范围是 `[0, max_distance]`,其中 `max_distance = nums[n-1] - nums[0]`\n- 对于每个中间值 `mid`,计算有多少个数对的距离小于等于 `mid`\n- 如果数量大于等于 `k`,说明第k小的距离可能就是 `mid` 或者比 `mid` 更小\n- 如果数量小于 `k`,说明第k小的距离一定比 `mid` 更大\n\n### 3. 计算函数 calc\n```javascript\nfunction calc(mid){\n let l = 0, r = -1, ans = 0;\n while(l < n){\n while(r + 1 < n && nums[r + 1] - nums[l] <= mid) r++;\n if(r >= l) ans += r - l;\n l++;\n }\n return ans\n}\n```\n\n这个函数使用双指针技巧计算有多少个数对的距离小于等于给定值 [mid](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\462\\2.js#L20-L20):\n- 外层循环固定左指针 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\461\\3.js#L34-L34)\n- 内层循环移动右指针 `r`,直到 `nums[r] - nums[l] > mid`\n- 此时对于固定的 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\461\\3.js#L34-L34),有 `r - l` 个数对的距离小于等于 [mid](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\462\\2.js#L20-L20)\n- 累加所有可能的数对数量\n\n\n\n## 举例说明\n\n以 `nums = [1,3,1]`, `k = 1` 为例:\n1. 排序后:`[1,1,3]`\n2. 距离范围:`[0, 2]`\n3. 二分搜索过程:\n - `mid = 1`,计算距离 <= 1 的数对有 1 个(`(1,1)`)\n - 因为 1 >= k(1),所以 `ans = 1`,继续搜索左半部分\n - `mid = 0`,计算距离 <= 0 的数对有 1 个(`(1,1)`)\n - 因为 1 >= k(1),所以 `ans = 0`\n4. 返回结果 0\n\n这个解法非常巧妙地结合了二分搜索和双指针技巧,避免了直接计算所有数对距离的 O(n²) 复杂度。\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a,b) => a - b);\n let n = nums.length;\n let r = nums[n - 1] - nums[0],l = 0,ans = 0;\n while(l <= r){\n let mid = (l + r) >> 1;\n let cnt = calc(mid);\n if(cnt >= k){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n // ----------------------\n function calc(mid){\n let l = 0,r = -1,ans = 0;\n while(l < n){\n while(r + 1 < n && nums[r + 1] - nums[l] <= mid) r++;\n if(r >= l) ans += r - l;\n l++;\n }\n return ans\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n + n log D),其中 n 是数组长度,D 是最大距离\n - 排序需要 O(n log n)\n - 二分搜索需要 log D 次,每次调用 calc 函数需要 O(n)\n- 空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218701829","body":"## 思路\n\n1. **使用优先队列的BFS**:\n - 采用 `MinPriorityQueue` 实现 Dijkstra 算法变体\n - 每个元素存储 `[行, 列, 高度]`,按高度排序\n\n2. **状态表示**:\n - `vis` 数组标记已访问的格子,防止重复访问\n - `ans` 记录到达当前位置所需的最大高度(即所需最低水位)\n\n3. **搜索过程**:\n - 从起点 `(0,0)` 开始,每次选择高度最低的相邻格子\n - 更新所需最低水位为路径上遇到的最大高度\n - 直到到达终点 `(n-1,n-1)`\n\n## 关键步骤\n\n- **初始化**:标记起点已访问,将起点加入优先队列\n- **主循环**:不断取出队列中高度最低的位置\n- **更新答案**:记录路径上的最大高度值\n- **探索邻居**:向四个方向扩展未访问的邻居节点\n- **终止条件**:到达右下角时结束搜索\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n let n = grid.length,vis = new Array(n).fill(0).map(()=>new Array(n).fill(0));\n vis[0][0] = 1;\n const q = new MinPriorityQueue(v=>v[2]);\n q.enqueue([0,0,grid[0][0]]);\n let ans = 0;\n const direction = [[0,1],[1,0],[0,-1],[-1,0]];\n while(q.size()){\n let [i,j,t] = q.dequeue();\n ans = Math.max(ans,t);\n if(i === n - 1 && j === n - 1) break;\n for(let d of direction){\n let x = d[0] + i,y = d[1] + j;\n if(x >= 0 && x < n && y >= 0 && y < n){\n if(vis[x][y]) continue;\n vis[x][y] = 1;\n q.enqueue([x,y,grid[x][y]]);\n }\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n²logn),其中 n 是矩阵的边长。\n- 空间复杂度:O(n²),用于存储 vis 数组和优先队列。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222257413","body":"## 思路\n\n使用**滑动窗口**(Sliding Window)技术来解决这个问题,通过维护一个固定大小为 `k` 的窗口来遍历整个字符串。\n\n## 关键变量说明\n\n- `r`: 右指针,初始化为 -1\n- [n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6): 字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- `ans`: 记录找到的最大元音字母数\n- `total`: 当前窗口内元音字母的总数\n- [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6): 左指针,表示窗口的起始位置\n\n## 算法流程\n\n1. **外层循环**:[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 从 0 到 `n-k`,表示窗口的左边界\n ```javascript\n for(let i = 0; i <= n - k; i++)\n ```\n\n\n2. **扩展窗口**:使用 `while` 循环将右指针 `r` 向右扩展,直到窗口大小达到 `k`\n ```javascript\n while(r + 1 < n && r - i + 1 < k){\n r++;\n if(isYuanYin(s[r])) total++;\n }\n ```\n\n - 条件 `r + 1 < n` 确保不越界\n - 条件 `r - i + 1 < k` 确保窗口大小不超过 `k`\n - 每次扩展时检查新加入的字符是否为元音,并更新 `total`\n\n3. **更新最大值**:比较当前窗口的元音数量与历史最大值\n ```javascript\n ans = Math.max(ans, total);\n ```\n\n\n4. **收缩窗口**:移动左指针前,如果当前左边界字符是元音,则从总数中减去\n ```javascript\n if(isYuanYin(s[i])) total--;\n ```\n\n\n## 辅助函数\n\n```javascript\nfunction isYuanYin(c){\n return ['a','e','i','o','u'].includes(c);\n}\n```\n\n用于判断字符是否为元音字母。\n\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n let r = -1, n = s.length,ans = 0,total = 0;\n for(let i = 0;i <= n - k;i++){\n while(r + 1 < n && r - i + 1 < k){\n r++;\n if(isYuanYin(s[r])) total++;\n }\n ans = Math.max(ans,total);\n if(isYuanYin(s[i])) total--;\n }\n return ans;\n // -------------------------\n function isYuanYin(c){\n return ['a','e','i','o','u'].includes(c);\n }\n };\n```\n## 复杂度分析\n\n- 时间复杂度:O(n),其中 n 是字符串长度,每个字符最多被访问两次\n- 空间复杂度:O(1),只使用了常数额外空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3227100052","body":"## 思路\n\n### 核心技巧\n- 维护一个大小为maxPts的滑动窗口\n- 使用`sum`变量维护当前窗口内所有可能结果的概率和\n- 通过`sum -= r`和`sum += dp[i]`维护窗口滑动\n\n### 1. 边界条件处理\n```javascript\nif(0 >= k) return 0 <= n ? 1 : 0;\n```\n\n- 当目标分数`k`为0或负数时,游戏一开始就结束\n- 如果[n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6)非负,则概率为1,否则为0\n\n### 2. 初始化阶段\n```javascript\nlet sum = 0;\nfor(let i = k;i < k + maxPts;i++){\n if(i <= n) sum += 1;\n}\n```\n\n- 计算从刚好达到`k`分开始,可能到达的最高分数范围`[k, k+maxPts-1]`中满足≤n的数目\n- 这些状态的概率都是1(因为游戏结束)\n\n### 3. 动态规划倒推\n```javascript\nlet j = k + maxPts - 1, r = j <= n ? 1 : 0;\nlet dp = new Array(k).fill(0);\nfor(let i = k - 1;i >= 0;i--){\n dp[i] = sum / maxPts;\n sum -= r;\n sum += dp[i];\n j--;\n if(j >= k) r = j <= n ? 1 : 0;\n else r = dp[j];\n}\n```\n\n\n- 从`k-1`分开始倒推到0分\n- `dp[i]`表示从[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)分开始游戏获胜的概率\n- 状态转移方程:`dp[i] = (dp[i+1] + dp[i+2] + ... + dp[i+maxPts]) / maxPts`\n- 使用滑动窗口优化:维护`sum`为窗口内所有概率之和\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n if(0 >= k) return 0 <= n ? 1 : 0;\n \n let sum = 0;\n for(let i = k;i < k + maxPts;i++){\n if(i <= n) sum += 1;\n }\n let j = k + maxPts - 1, r = j <= n ? 1 : 0;\n let dp = new Array(k).fill(0);\n for(let i = k - 1;i >= 0;i--){\n dp[i] = sum / maxPts;\n sum -= r;\n sum += dp[i];\n j--;\n if(j >= k) r = j <= n ? 1 : 0;\n else r = dp[j];\n }\n return dp[0];\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(k + maxPts),其中k为`k`的取值范围\n- 空间复杂度:O(k)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3231026577","body":"## 思路\n\n1. **滑动窗口 + 字符频次统计**\n - 使用两个长度为26的数组(`pMap` 和 `sMap`)分别统计模式串 `p` 和当前窗口内子串的字符频次\n - 通过滑动窗口在 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 中寻找与 `p` 字符频次完全相同的子串\n\n2. **算法流程**\n - 首先调用 `getPmap()` 统计 `p` 中各字符出现次数\n - 初始化滑动窗口左右边界 `l=0, r=-1`\n - 在每次循环中:\n - 扩展右边界直到窗口大小等于 `p` 的长度\n - 比较当前窗口字符频次与 `p` 的字符频次是否相同\n - 如果相同,则将左边界位置加入结果数组\n - 移动左边界,更新窗口字符频次\n\n## 关键函数说明\n\n- `getPmap()`: 统计模式串 `p` 中每个字符的出现次数\n- `equal(arr1, arr2)`: 比较两个字符频次数组是否完全相同\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nvar findAnagrams = function(s, p) {\n const pMap = new Array(26).fill(0),k = p.length;\n getPmap();\n let ans = []\n let n = s.length,l = 0,r = -1,sMap = new Array(26).fill(0);\n while(l <= n - k){\n while(r + 1 < n && r - l + 1 < k){\n r++;\n let c = s[r]\n sMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;\n }\n if(equal(pMap,sMap)) ans.push(l);\n let c = s[l++];\n sMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]--;\n }\n return ans;\n // --------------------------------------------------------\n function getPmap(){\n for(let c of p){\n pMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;\n }\n }\n function equal(arr1,arr2){\n for(let i = 0;i < 26;i++){\n if(arr1[i] !== arr2[i]) return false;\n }\n return true;\n }\n };\n```\n## 复杂度分析\n\n- 时间复杂度:O(n),其中 n 是字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- 空间复杂度:O(1),只使用了固定大小的数组存储字符频次","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235816649","body":"## 思路\n\n### 核心思想\n- 使用**滑动窗口**技术\n- 维护一个动态窗口 `[l, r]`,通过双指针扩展和收缩窗口\n- 统计窗口内字符频次,确保包含 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中所有字符及其所需数量\n\n### 主要步骤\n\n1. **初始化阶段**\n - `tMap`:统计字符串 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中各字符出现次数\n - `LIMIT`:记录 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中不同字符的数量\n - `sMap`:统计当前窗口中各字符出现次数\n - `total`:记录窗口中已满足数量要求的字符种类数\n\n2. **滑动窗口主循环**\n - 外层循环移动左指针 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31)\n - 内层循环扩展右指针 `r`,直到窗口包含 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的所有字符\n - 当窗口满足条件时,尝试更新最优解\n\n3. **结果更新**\n - 使用 `check` 函数比较当前窗口与历史最优解\n - 选择更短的子串,长度相同时选择字典序更小的\n\n### check函数作用\n用于比较两个子串,选择更优的结果:\n- 优先选择长度更短的子串\n- 长度相同时选择字典序更小的\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nvar minWindow = function(s, t) {\n let tMap = {},ans = '';\n for(let c of t) tMap[c] = (tMap[c] || 0) + 1;\n const LIMIT = Object.keys(tMap).length;\n let n = s.length,l = 0,r = -1,total = 0,sMap = {};\n while(l < n){\n while(r + 1 < n && total < LIMIT){\n r++;\n let c = s[r];\n sMap[c] = (sMap[c] || 0) + 1;\n if(sMap[c] === tMap[c]) total++;\n }\n if(total === LIMIT){\n let tmp = s.slice(l,r + 1);\n if(check(tmp)) ans = tmp;\n }\n let c = s[l];\n if(sMap[c] === tMap[c]) total--;\n sMap[c]--;\n l++;\n }\n return ans;\n // ------------------------\n function check(tmp){\n if(ans === '') return true;\n if(tmp.length < ans.length) return true;\n if(tmp.length > ans.length) return false;\n for(let i = 0;i < tmp.length;i++){\n let a = tmp.charCodeAt(i),b = ans.charCodeAt(i);\n if(a < b) return true;\n if(a === b) continue;\n if(a > b) return false;\n }\n return false;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是字符串 [s](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的长度。\n- 空间复杂度:O(t),其中 t 是字符串 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的字符串种类。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/50#issuecomment-3238889944","body":"## 思路\n\n1. **前缀和与后缀和预处理**:\n - [preSum](file:///E:/力扣刷题/algorithm_exercises/周赛/458/2.js#L10-L10)数组存储从左端开始的前缀和\n - [sufSum](file:///E:/力扣刷题/algorithm_exercises/周赛/458/2.js#L15-L15)数组存储从右端开始的后缀和\n\n2. **核心思想**:\n - 我们需要从两端取k张卡牌,可以是左边取i张,右边取k-i张(i从0到k)\n - 通过预处理的前缀和与后缀和数组,可以快速计算任意数量卡牌的点数和\n\n3. **遍历所有可能的组合**:\n - 遍历i从0到k,表示从左边取i张卡牌\n - 对应从右边取k-i张卡牌\n - 计算总和并更新最大值\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} cardPoints\n * @param {number} k\n * @return {number}\n */\nvar maxScore = function(cardPoints, k) {\n let n = cardPoints.length;\n const preSum = new Array(n + 1).fill(0),sufSum = new Array(n + 1).fill(0);\n for(let i = 0;i < n;i++){\n preSum[i + 1] = preSum[i] + cardPoints[i];\n sufSum[i + 1] = sufSum[i] + cardPoints[n - i - 1];\n }\n let ans = -Infinity;\n for(let i = 0;i <= k;i++){\n ans = Math.max(ans,preSum[i] + sufSum[k - i]);\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(n+k),\n- 空间复杂度是O(n),其中n是数组长度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3239927488","body":"## 代路\n\n采用预计算和枚举的方法来解决问题:\n\n1. **预计算 *<60* 以内每个数字的二进制1的个数**:\n ```javascript\n const CNT = new Array(60).fill(0);\n for(let i = 0;i <= 59;i++){\n let n = i,t = 0;\n while(n){\n if(n & 1) t++;\n n >>= 1;\n }\n CNT[i] = t;\n }\n ```\n\n\n2. **枚举小时和分钟的分配**:\n ```javascript\n for(let i = 0;i <= 4;i++){\n let j = turnedOn - i;\n if(j > 6) continue;\n // ...\n }\n ```\n\n 这里将turnedOn个LED灯分为两部分:i个给小时部分,j个给分钟部分。由于小时最多由4个LED表示,分钟最多由6个LED表示,所以i最多为4,j最多为6。\n\n3. **获取符合条件的小时和分钟**:\n 通过`getHour(cnt)`和`getM(cnt)`函数获取二进制中恰好有cnt个1的小时数和分钟数。\n\n4. **组合时间**:\n 将符合条件的小时和分钟组合成时间字符串,格式为`H:MM`。\n\n## 代码优点\n\n1. **预计算优化**:提前计算所有0-59数字的二进制1的个数,避免重复计算\n2. **分离关注点**:将获取小时和分钟的逻辑分别封装在独立函数中\n3. **合理的边界处理**:考虑到小时(0-11)和分钟(0-59)的范围限制\n4. **正确的格式化**:分钟数始终显示为两位数\n\n\n## 代码\n```javascript\nconst CNT = new Array(60).fill(0);\nfor(let i = 0;i <= 59;i++){\n let n = i,t = 0;\n while(n){\n if(n & 1) t++;\n n >>= 1;\n }\n CNT[i] = t;\n}\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n let ans = []\n for(let i = 0;i <= 4;i++){\n let j = turnedOn - i;\n if(j > 6) continue;\n for(let h of getHour(i)){\n for(let m of getM(j)){\n ans.push(`${h}:${m}`)\n }\n }\n }\n return ans;\n\n // ------------------------------\n function getHour(cnt){\n let ans = [];\n for(let i = 0;i <= 11;i++){\n if(CNT[i] === cnt) ans.push(i);\n }\n return ans\n }\n\n function getM(cnt){\n let ans = [];\n for(let i = 0;i <= 59;i++){\n if(CNT[i] === cnt) ans.push(i < 10 ? '0' + i : i);\n }\n return ans\n }\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(1),因为小时和分钟的范围是固定的(12*60种组合)\n- **空间复杂度**:O(1),只使用了固定大小的额外空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240725656","body":"\n## 思路\n\n### 1. 位运算优化\n- 使用位运算来表示和检查约束条件:\n - `colSet`:记录已被占用的列\n - `pieSet`:记录已被占用的主对角线(撇)\n - `naSet`:记录已被占用的副对角线(捺)\n\n### 2. 对角线编号\n- 主对角线(撇):用 `i + j` 编号\n- 副对角线(捺):用 `i - j + N` 编号(确保非负)\n\n### 3. DFS 回溯过程\n- 逐行放置皇后(第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 行)\n- 对每行的每一列 `j` 检查是否可放置:\n - 通过位运算检查列、主对角线、副对角线是否冲突\n- 若无冲突则放置皇后并更新状态,递归处理下一行\n- 回溯时撤销状态更改\n\n### 4. 位操作技巧\n- `(x >> k) & 1`:检查第 k 位是否为 1\n- `x ^= (1 << k)`:翻转第 k 位(设置或取消占用)\n\n当成功放置完所有 n 行皇后时,返回 1(找到一种方案),最终统计所有可行方案数。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let colSet = 0,N = 2 * n - 1,pieSet = 0,naSet = 0;\n return dfs(0);\n // -------------------\n function dfs(i){\n if(i === n) return 1;\n let ans = 0;\n for(let j = 0;j < n;j++){\n let col = j,pie = i + j,na = (i - j + N) % N;\n if(((colSet >> col) & 1) || ((pieSet >> pie) & 1) ||((naSet >> na) & 1)) continue;\n colSet ^= (1 << col);\n pieSet ^= (1 << pie);\n naSet ^= (1 << na);\n ans += dfs(i + 1);\n colSet ^= (1 << col);\n pieSet ^= (1 << pie);\n naSet ^= (1 << na);\n }\n return ans;\n }\n};\n```\n## 复杂度分析\n- 时间复杂度:O(N!),其中 N 为输入的行数。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243912780","body":"## 思路\n\n1. **初始化**:\n - 获取网格的行数(m)和列数(n)\n - 创建访问标记数组vis,避免重复访问\n - 初始化最大面积ans为0\n\n2. **遍历网格**:\n - 遍历每个格子,如果当前格子是0(海洋)或已被访问,则跳过\n - 否则,从当前位置开始进行BFS搜索整个岛屿\n\n3. **BFS搜索**:\n - 使用队列实现广度优先搜索\n - 从起始点开始,向四个方向扩展\n - 对于每个有效的相邻陆地格子(值为1且未访问),标记为已访问并加入队列\n - 统计当前岛屿的面积\n\n4. **更新结果**:\n - 每次BFS完成后,比较当前岛屿面积和已知最大面积,保留较大值\n\n## 具体实现细节\n\n- 使用Queue数据结构实现BFS\n- 四个方向数组dirs用于简化方向处理\n- vis数组防止重复访问同一格子\n- 边界检查确保不越界\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n let m = grid.length,n = grid[0].length;\n let ans = 0;\n let vis = new Array(m).fill(0).map(()=>new Array(n).fill(0));\n for(let i = 0;i < m;i++){\n for(let j = 0;j = 0 && r < m && c >= 0 && c < n){\n if(grid[r][c] === 0) continue;\n if(vis[r][c]) continue;\n vis[r][c] = 1;\n q.enqueue([r,c]);\n }\n }\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(m×n)\n- 空间复杂度是O(m×n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247579876","body":"## 思路\n\n这是一个典型的多源BFS(广度优先搜索)问题。代码采用逆向思维,不是从海洋格子找最近的陆地,而是从所有陆地格子出发,向外扩展到海洋格子,计算每个海洋格子到最近陆地的距离。\n\n## 算法步骤\n\n1. 初始化一个与原网格同样大小的距离矩阵`dis`,所有值初始化为无穷大\n2. 遍历原网格,将所有陆地格子(值为1)的坐标和距离0加入队列,作为BFS的起点\n3. 使用BFS遍历:\n - 从队列中取出一个位置\n - 如果当前位置的距离小于记录的距离,则更新距离\n - 如果当前位置是海洋,则更新最大距离\n - 向四个方向扩展,将合法的海洋格子加入队列\n4. 返回找到的最大距离,如果不存在海洋或陆地则返回-1\n\n## 代码\n\n```javascript\nvar maxDistance = function(grid) {\n let n = grid.length;\n // 创建一个距离矩阵,初始化为无穷大\n let dis = new Array(n).fill(0).map(()=>new Array(n).fill(Infinity));\n let q = new Queue();\n \n // 将所有陆地格子(值为1)作为BFS的起始点\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(grid[i][j] === 0) continue;\n q.enqueue([i,j,0]); // [行, 列, 距离]\n }\n }\n\n // 四个方向的移动:右、下、左、上\n const dirs = [[0,1],[1,0],[0,-1],[-1,0]];\n let ans = -Infinity;\n \n // BFS遍历\n while(q.size()){\n let [i,j,d] = q.dequeue();\n \n // 如果当前距离大于等于已记录的距离,则跳过\n if(d >= dis[i][j]) continue;\n \n // 更新当前位置的距离\n dis[i][j] = d;\n \n // 如果当前位置是海洋(值为0),更新最大距离\n if(grid[i][j] === 0) ans = Math.max(ans,dis[i][j]);\n \n // 向四个方向扩展\n for(let [x,y] of dirs.map(v=>[v[0] + i,v[1] + j])){\n // 检查边界\n if(x < 0 || x >= n || y < 0 || y >= n) continue;\n // 如果是陆地则跳过\n if(grid[x][y] === 1) continue;\n // 如果新距离大于等于已记录距离则跳过\n if(d + 1 >= dis[x][y]) continue;\n // 将新位置加入队列\n q.enqueue([x,y,d + 1]);\n }\n }\n \n // 返回结果,如果没找到海洋格子则返回-1\n return ans === -Infinity ? -1 : ans === Infinity ? -1 : ans; \n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n²),每个格子最多被访问一次\n- 空间复杂度:O(n²),需要存储距离矩阵和队列\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251721463","body":"## 问题理解\n\n这个问题是一个图遍历问题,涉及以下概念:\n- 有n个盒子,每个盒子可能包含糖果、钥匙和内部盒子\n- 某些盒子是打开的(status[i] = 1),某些是关闭的(status[i] = 0)\n- 只有拿到钥匙才能打开关闭的盒子\n- 初始时有一些盒子(initialBoxes)\n- 目标是获得尽可能多的糖果\n\n## 思路\n\n### 1. 初始化阶段\n```javascript\nlet n = status.length, ans = 0,\nhas_key = new Array(n).fill(0),\nhas_box = new Array(n).fill(0);\n```\n\n- `n`: 盒子总数\n- `ans`: 最终获得的糖果总数\n- `has_key`: 标记是否拥有某个盒子的钥匙\n- `has_box`: 标记是否拥有某个盒子\n\n### 2. 设置初始状态\n```javascript\nfor(let i = 0; i < n; i++) if(status[i]) has_key[i] = 1;\nfor(let i of initialBoxes) has_box[i] = 1;\n```\n\n- 将所有本来就是打开状态的盒子(status[i] = 1)标记为拥有钥匙\n- 将初始拥有的盒子标记为已拥有\n\n### 3. DFS遍历获取糖果\n```javascript\nlet vis = new Array(n).fill(0);\nfor(let i of initialBoxes){\n if(has_box[i] && has_key[i] && !vis[i]) dfs(i);\n}\n```\n\n- `vis`: 标记盒子是否已经访问过\n- 对于每个初始盒子,如果既拥有盒子又有钥匙且未访问过,则进行DFS\n\n### 4. DFS函数实现\n```javascript\nfunction dfs(i){\n ans += candies[i]; // 收集当前盒子的糖果\n vis[i] = 1; // 标记为已访问\n for(let j of keys[i]){ // 遍历当前盒子中的钥匙\n has_key[j] = 1; // 获得钥匙\n if(has_box[j] && !vis[j]) dfs(j); // 如果拥有对应盒子且未访问,则继续DFS\n }\n for(let j of containedBoxes[i]){ // 遍历当前盒子中的内部盒子\n has_box[j] = 1; // 获得盒子\n if(has_key[j]&& !vis[j]) dfs(j); // 如果拥有对应钥匙且未访问,则继续DFS\n }\n}\n```\n\n\n## 算法流程总结\n\n1. **初始化状态**:记录每个盒子的初始状态(是否打开)和初始拥有的盒子\n2. **深度优先搜索**:从初始盒子开始,只有当同时拥有盒子和钥匙时才能打开盒子\n3. **收集资源**:打开盒子后获得糖果、钥匙和内部盒子\n4. **继续探索**:利用新获得的钥匙或盒子继续打开新的盒子\n5. **避免重复**:使用vis数组确保每个盒子只被访问一次\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n let n = status.length,ans = 0,\n has_key = new Array(n).fill(0),\n has_box = new Array(n).fill(0);\n for(let i = 0;i < n;i++) if(status[i]) has_key[i] = 1;\n for(let i of initialBoxes) has_box[i] = 1;\n let vis = new Array(n).fill(0);\n for(let i of initialBoxes){\n if(has_box[i] && has_key[i] && !vis[i]) dfs(i);\n }\n return ans;\n // ----------------------------------------\n function dfs(i){\n ans += candies[i];\n vis[i] = 1;\n for(let j of keys[i]){\n has_key[j] = 1;\n if(has_box[j] && !vis[j]) dfs(j);\n }\n for(let j of containedBoxes[i]){\n has_box[j] = 1;\n if(has_key[j]&& !vis[j]) dfs(j);\n }\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度为O(N + E),其中N是盒子数量,E是钥匙和内部盒子的总数。\n- 空间复杂度为O(N)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3257477257","body":"\n## 思路\n\n1. **坐标系统设定**:\n - 为每个节点分配坐标,根节点为原点(0, 0)\n - 向左子树移动时,列坐标减1;向右子树移动时,列坐标加1\n - 行坐标随着深度增加而增加(向下为正方向)\n\n2. **DFS遍历收集信息**:\n - 使用深度优先搜索遍历所有节点\n - 记录每个节点的值、行坐标、列坐标\n\n3. **自定义排序**:\n - 按列坐标升序排列(从左到右)\n - 列相同时按行坐标升序(从上到下)\n - 行列都相同时按节点值升序\n\n4. **分组输出**:\n - 将相同列坐标的节点值归为一组\n - 每组构成结果数组中的一个子数组\n\n## 代码:\n\n```javascript\nvar verticalTraversal = function(root) {\n let ans = [] // 存储[节点值, 行, 列]信息\n \n // DFS遍历,收集每个节点的值和坐标\n dfs(root,0,0);\n \n // 自定义排序:先按列,再按行,最后按值\n ans.sort((a,b)=>a[2] - b[2] || a[1] - b[1] || a[0] - b[0]);\n \n let col = Infinity, res = [];\n // 按列分组,将相同列的节点值组成子数组\n for(let [v,r,c] of ans){\n if(col === c) res[res.length - 1].push(v);\n else{\n res.push([v]);\n col = c;\n }\n }\n return res;\n \n // 辅助函数:深度优先遍历并记录坐标\n function dfs(root,row,col){\n if(!root) return;\n ans.push([root.val,row,col]);\n dfs(root.left,row + 1,col - 1) // 左子树:行+1,列-1\n dfs(root.right,row + 1,col + 1) // 右子树:行+1,列+1\n }\n};\n```\n## 复杂度分析\n### 时间复杂度:\n- DFS遍历:O(N),N为节点数\n- 排序:O(N log N)\n- 分组:O(N)\n- 总体:O(N log N)\n\n### 空间复杂度:\n- 存储信息:O(N)\n- 递归栈:O(H),H为树高度\n- 总体:O(N)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260240769","body":"\n\n## 思路\n\n使用了动态规划的思想,并进行了空间优化:\n\n## 具体分析\n\n1. **状态定义**:\n - `prevprev` 表示到达第 i-2 个位置的最小花费\n - `prev` 表示到达第 i-1 个位置的最小花费\n - `curr` 表示到达当前位置的最小花费\n\n2. **状态转移方程**:\n - `curr = v + Math.min(prevprev, prev)`\n - 其中 v 是当前位置的花费(顶部为0)\n\n3. **优化点**:\n - 使用滚动数组优化空间复杂度,从O(n)降到O(1)\n - 只保存前两个状态值,而不是整个dp数组\n\n4. **边界处理**:\n - 当 i < n 时,v = cost[i](正常台阶费用)\n - 当 i = n 时,v = 0(到达楼顶,没有费用)\n - 最后的返回值根据数组长度做了特殊处理\n\n\n这是一个经典的空间优化动态规划解法,通过只保留必要的状态值来减少空间使用。\n## 代码\n```javascript\nvar minCostClimbingStairs = function(cost) {\n let n = cost.length,\n prevprev = cost[0], // 表示到达第0个台阶的最小花费\n prev = cost[1], // 表示到达第1个台阶的最小花费\n curr;\n \n // 从第2个台阶开始遍历到楼梯顶部\n for(let i = 2;i <= n;i++){\n let v = 0;\n // 当i[1,1]);\n```\n\n\n1. 创建一个二维DP数组`dp`,其中`dp[i][0]`表示以`nums[i]`结尾的最长递增子序列的长度,`dp[i][1]`表示以`nums[i]`结尾的最长递增子序列的个数。\n2. 初始时,每个元素自身构成一个长度为1的递增子序列,所以都初始化为`[1,1]`。\n\n```javascript\n for(let i = 1; i < n; i++){\n for(j = i - 1; j >= 0; j--){\n if(nums[i] > nums[j]){\n if(dp[j][0] + 1 > dp[i][0]){\n dp[i][0] = dp[j][0] + 1;\n dp[i][1] = dp[j][1];\n }else if(dp[j][0] + 1 === dp[i][0]){\n dp[i][1] += dp[j][1];\n }\n }\n }\n }\n```\n\n\n3. 对于每个位置[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6),遍历它之前的所有位置`j`:\n - 如果`nums[i] > nums[j]`,说明可以将`nums[i]`接在以`nums[j]`结尾的递增子序列后面\n - 如果通过`j`得到的子序列长度(`dp[j][0] + 1`)比当前记录的长度(`dp[i][0]`)更长,则更新长度和数量\n - 如果长度相等,则将通过`j`得到的子序列数量加到当前的数量上\n\n```javascript\n let ans = 0, max = -Infinity;\n for(let [len,cnt] of dp){\n if(len > max){\n max = len;\n ans = cnt;\n }else if(max === len){\n ans += cnt;\n }\n }\n return ans;\n```\n\n\n4. 最后遍历整个DP数组,找出最长的递增子序列长度,并累加所有具有该长度的子序列的数量。\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findNumberOfLIS = function(nums) {\n let n = nums.length,dp = new Array(n).fill(0).map(()=>[1,1]);\n for(let i = 1;i < n;i++){\n for(j = i - 1;j >= 0;j--){\n if(nums[i] > nums[j]){\n if(dp[j][0] + 1 > dp[i][0]){\n dp[i][0] = dp[j][0] + 1;\n dp[i][1] = dp[j][1];\n }else if(dp[j][0] + 1 === dp[i][0]){\n dp[i][1] += dp[j][1];\n }\n }\n }\n }\n let ans = 0,max = -Infinity;\n for(let [len,cnt] of dp){\n if(len > max){\n max = len;\n ans = cnt;\n }else if(max === len){\n ans += cnt;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(n²),\n- 空间复杂度是O(n)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269148142","body":"\n## 思路\n\n### 1. 问题定义\n最长公共子序列是找出两个字符串中最长的共同子序列(不要求连续,但要保持相对顺序)。\n\n### 2. 动态规划状态定义\n```javascript\nlet m = text1.length, n = text2.length, dp = new Array(m).fill(0).map(() => new Array(n).fill(0));\n```\n\n创建一个二维数组 `dp[i][j]`,表示 `text1[0...i]` 和 `text2[0...j]` 的最长公共子序列长度。\n\n### 3. 初始化边界条件\n```javascript\nif(text1[0] === text2[0]) dp[0][0] = 1;\n\nfor(let i = 1;i < m;i++) {\n dp[i][0] = text1[i] === text2[0] ? 1 : dp[i - 1][0];\n}\nfor(let i = 1;i < n;i++) {\n dp[0][i] = text1[0] === text2[i] ? 1 : dp[0][i - 1];\n}\n```\n\n- 首先处理两个字符串的第一个字符,如果相同则 `dp[0][0] = 1`\n- 分别初始化第一列和第一行:\n - 如果当前字符匹配,则值为1\n - 否则继承前一个位置的值\n\n### 4. 状态转移方程\n```javascript\nfor(let i = 1;i < m;i++){\n for(let j = 1;j < n;j++){\n if(text1[i] === text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;\n else dp[i][j] = Math.max(\n dp[i - 1][j],\n dp[i][j - 1],\n dp[i - 1][j - 1]\n );\n }\n}\n```\n\n对于每个位置 `(i,j)`:\n- 如果 `text1[i] === text2[j]`,说明当前字符匹配,则 `dp[i][j] = dp[i-1][j-1] + 1`\n- 否则取三种情况的最大值:\n - `dp[i-1][j]`:text1[0...i-1] 与 text2[0...j] 的LCS长度\n - `dp[i][j-1]`:text1[0...i] 与 text2[0...j-1] 的LCS长度\n - `dp[i-1][j-1]`:text1[0...i-1] 与 text2[0...j-1] 的LCS长度\n\n### 5. 返回结果\n```javascript\nreturn dp[m - 1][n - 1];\n```\n\n返回 `dp[m-1][n-1]` 即为两个完整字符串的最长公共子序列长度。\n\n\n## 代码\n```javascript\n/**\n * @param {string} text1\n * @param {string} text2\n * @return {number}\n */\nvar longestCommonSubsequence = function(text1, text2) {\n let m = text1.length,n = text2.length,dp = new Array(m).fill(0).map(() => new Array(n).fill(0));\n if(text1[0] === text2[0]) dp[0][0] = 1;\n\n for(let i = 1;i < m;i++) {\n dp[i][0] = text1[i] === text2[0] ? 1 : dp[i - 1][0];\n }\n for(let i = 1;i < n;i++) {\n dp[0][i] = text1[0] === text2[i] ? 1 : dp[0][i - 1];\n }\n for(let i = 1;i < m;i++){\n for(let j = 1;j < n;j++){\n if(text1[i] === text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;\n else dp[i][j] = Math.max(\n dp[i - 1][j],\n dp[i][j - 1],\n dp[i - 1][j - 1]\n );\n }\n }\n return dp[m - 1][n - 1];\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(m×n),其中 m 和 n 分别是两个字符串的长度\n- 空间复杂度:O(m×n),用于存储 dp 数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273217746","body":"## 思路\n使用了组合数学的方法来解决不同路径问题:\n\n1. **问题转换**:\n - 机器人需要从左上角走到右下角,总共需要向右走 (n-1) 步,向下走 (m-1) 步\n - 总共需要走 (m-1)+(n-1) = m+n-2 步\n - 问题转化为:在这 m+n-2 步中,如何选择 m-1 步向下走(或 n-1 步向右走)\n\n2. **数学公式**:\n - 这是一个组合问题,答案是 C(m+n-2, m-1) 或 C(m+n-2, n-1)\n - 组合数公式:C(n,k) = n! / (k! * (n-k)!)\n - 为了避免计算阶乘导致的溢出,代码采用了逐步相乘的方式\n\n3. **实现细节**:\n - `k = m + n - 2` 表示总步数\n - `t = m - 1` 表示需要选择的步数(向下走的步数)\n - 通过循环计算组合数,每次将 `k/t` 的值乘到结果中,并递减 k 和 t\n - 最后使用 `Math.round()` 是为了处理浮点数计算可能产生的精度误差\n\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} m\n * @param {number} n\n * @return {number}\n */\nvar uniquePaths = function(m, n) {\n let k = m + n - 2;\n if(k === 0) return 1;\n let t = Math.min(m - 1,n - 1), ans = 1;\n while (t){\n ans *= k / t;\n k--;\n t--;\n }\n return Math.round(ans);\n};\n```\n\n## 复杂度分析\n- 时间复杂度为 O(min(m,n)),\n- 空间复杂度为 O(1)。\n相比动态规划方法,这种方法更加高效。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3277237117","body":"## 思路\n\n### 问题理解\n1. 骑士按照象棋规则移动(日字形,8个方向)\n2. 骑士从 (row, column) 位置开始\n3. 骑士进行 K 次随机移动\n4. 求骑士最终仍在棋盘上的概率\n\n### 解决方案\n使用记忆化递归(动态规划):\n\n1. **状态定义**:f(i, j, k) 表示骑士在位置 (i, j) 并且还能移动 k 步时,在棋盘上的概率\n\n2. **边界条件**:\n - 当 k = 0 时,如果位置在棋盘内则返回 1,否则返回 0\n - 当位置超出棋盘边界时,返回 0\n\n3. **状态转移**:\n - 对于骑士的 8 个可能移动方向,递归计算每个方向移动后的情况\n - 结果为所有可能移动结果的平均值(除以 8)\n\n4. **记忆化优化**:\n - 使用 memo 三维数组存储已经计算过的结果,避免重复计算\n\n## 代码\n\n```javascript\nvar knightProbability = function(n, k, row, column) {\n // 骑士的8个移动方向\n const dirs = [[1,2],[2,1],[1,-2],[2,-1],[-1,2],[-2,1],[-1,-2],[-2,-1]];\n \n // 记忆化数组,存储 (i,j,k) 状态下的结果\n const memo = new Array(n + 1).fill(0).map(()=>{\n return new Array(n + 1).fill(0).map(()=>{\n return new Array(k + 1).fill(-1);\n })\n })\n \n // 调用递归函数\n return f(row, column, k);\n \n function f(i, j, k) {\n // 基础情况:没有移动次数了\n if (k === 0) return i >= 0 && i < n && j >= 0 && j < n ? 1 : 0;\n \n // 超出边界\n if (i < 0 || i >= n || j < 0 || j >= n) return 0;\n \n // 已经计算过该状态\n if (memo[i][j][k] !== -1) return memo[i][j][k];\n \n let ans = 0;\n // 遍历8个方向\n for (let d of dirs) {\n let x = d[0] + i, y = d[1] + j;\n ans += f(x, y, k - 1);\n }\n \n // 每个方向的概率是 1/8,所以取平均值\n memo[i][j][k] = ans / 8;\n return ans / 8;\n } \n};\n```\n\n\n### 复杂度分析\n- 时间复杂度:O(N²×K),因为有 N×N 个位置和 K 步\n- 空间复杂度:O(N²×K),用于存储记忆化数组\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3283550644","body":"## 思路\n\n### 1. 初始判断\n```javascript\nif((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;\n```\n\n首先计算所有可选数字的总和,如果总和小于目标值,则无论如何都无法达到目标,返回false。\n\n### 2. 核心递归函数f\n```javascript\nfunction f(type,total,state){}\n```\n\n- `type`: 当前玩家类型(0表示我方,1表示对方)\n- `total`: 剩余需要达到的目标值\n- `state`: 用位掩码表示的已选择数字状态\n\n### 3. 记忆化搜索\n使用`memo`来存储已经计算过的状态结果,避免重复计算。通过`query`和[add](file://E:\\其他项目\\algorithm_exercises\\9.js#L13-L21)函数来操作这个多层Map结构。\n\n### 4. 状态转移\n对于每个未选择的数字:\n- 如果选择该数字可以直接获胜(`i + 1 >= total`),则当前玩家获胜\n- 否则,递归调用[f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)计算对手在新状态下的结果\n- 如果存在一种选择使得对手必败,则当前玩家必胜\n\n### 5. 博弈论思想\n这是一个典型的极小化极大算法应用:\n- 当前玩家希望找到至少一种选择使得对手必败(返回false)\n- 如果所有选择都导致对手必胜(都返回false),则当前玩家必败\n\n## 代码\n```javascript\n/**\n * @param {number} maxChoosableInteger\n * @param {number} desiredTotal\n * @return {boolean}\n */\nvar canIWin = function(maxChoosableInteger, desiredTotal) {\n let memo = new Map();\n if((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;\n return f(0,desiredTotal,0);\n // -------------------------------\n function f(type,total,state){\n let params = [state];\n if(query(params) !== -1) return query(params);\n let ans = false;\n for(let i = 0;i < maxChoosableInteger;i++){\n if(state & (1 << i)) continue;\n if(i + 1 >= total) {\n ans = true;\n break;\n }\n let a = f(type === 0 ? 1 : 0,total - i - 1, state | (1 << i));\n if(a === false) {\n ans = true;\n break;\n }\n }\n add(params,ans)\n return ans;\n }\n\n function query(params){\n let ans = memo;\n for(let param of params){\n if(ans.has(param) === false) return -1;\n ans = ans.get(param);\n }\n return ans;\n }\n\n function add(params,val){\n let m = memo,n = params.length, rest = params.slice(0,n - 1),last = params[n - 1];\n for(let param of rest){\n if(m.has(param) === false) m.set(param,new Map());\n m = m.get(param);\n }\n m.set(last,val);\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:$O(n*2^{n})$\n- 空间复杂度:$O(n)$","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3287375518","body":"## 思路\n\n\n1. **预处理**:\n - 计算数组总和,如果为奇数则直接返回false\n - 确定目标值target为总和的一半\n\n2. **初始化DP数组**:\n - dp[j]表示是否可以用数组中的元素组成和为j的子集\n - 初始时只考虑第一个元素nums[0],只有当j等于nums[0]时才为true\n\n3. **状态转移**:\n - 对于每个元素nums[i],更新dp数组\n - 从target到0逆序遍历,避免重复使用同一元素\n - 状态转移方程:`dp[j] = dp[j] || dp[j - nums[i]]`\n - 要么不使用当前元素,保持原来的状态dp[j]\n - 要么使用当前元素,前提是dp[j - nums[i]]为true\n\n4. **返回结果**:\n - 如果dp[target]为true,表示可以组成和为target的子集,返回true\n - 否则返回false\n\n\n## 代码\n```javascript\nvar canPartition = function(nums) {\n // 获取数组长度和总和\n let n = nums.length,sum = nums.reduce((a,b)=>a + b,0);\n \n // 如果总和是奇数,则无法分成两个相等的子集\n if(sum & 1) return false;\n \n // 目标是找到和为总和一半的子集\n const target = sum / 2;\n \n // 创建dp数组,dp[j]表示是否可以用前面的数字组成和为j的子集\n const dp = new Array(target + 1).fill(false);\n \n // 初始化:第一个数字能否组成和为j的子集\n for(let j = 0;j <= target;j++) dp[j] = nums[0] === j;\n \n // 从第二个数字开始遍历\n for(let i = 1;i < n;i++){\n // 从target到0逆序遍历(避免重复使用同一元素)\n for(let j = target;j >= 0;j--){\n // 状态转移方程:\n // dp[j] = dp[j] || dp[j - nums[i]]\n // 要么之前就能组成j,要么使用当前数字nums[i]组成j\n dp[j] = dp[j] || (j - nums[i] >= 0 ? dp[j - nums[i]] : false);\n }\n }\n \n // 返回是否能组成和为target的子集\n return dp[target];\n};\n```\n\n## 时间和空间复杂度\n\n- 时间复杂度:O(n × target),其中n是数组长度,target是数组元素和的一半\n- 空间复杂度:O(target),只使用了一维dp数组\n\n这是一个经典的0-1背包问题的应用,通过动态规划解决了分割等和子集问题。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289197873","body":"\n## 思路\n\n\n1. **递归函数 [f(i, total)](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\2.js#L16-L29)**:\n - [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 表示当前处理到数组中的第 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素\n - [total](file://E:\\力扣刷题\\algorithm_exercises\\双周赛\\165\\3.js#L5-L5) 表示前 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素通过添加 '+' 或 '-' 符号后得到的总和\n - 函数返回从第 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素开始到最后一个元素,能够得到目标值的方案数\n\n2. **边界条件**:\n - 当 `i === n` 时,表示已经处理完所有元素,如果 `total === target` 则找到一种有效方案,返回 1,否则返回 0\n\n3. **状态转移**:\n - 对于当前元素 `nums[i]`,可以选择加上它或减去它\n - 所以递归调用 `f(i+1, total-nums[i]) + f(i+1, total+nums[i])`\n\n4. **记忆化优化**:\n - 使用 [memo](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\430\\2.js#L7-L7) 数组存储已经计算过的状态,避免重复计算\n - `memo[i][total + abs_sum]` 中使用 `total + abs_sum` 是为了避免负数索引\n\n## 代码亮点\n\n1. 计算 `abs_sum` 来确定可能的和的范围,这样可以正确地映射负数到数组索引\n2. 使用记忆化递归避免重复计算,提高效率\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar findTargetSumWays = function(nums, target) {\n let n = nums.length;\n let abs_sum = nums.reduce((prev,curr)=>{\n if(curr >= 0) return curr + prev;\n return prev - curr;\n },0)\n // console.log(abs_sum);\n let memo = new Array(n + 1).fill(0).map(()=>new Array(2 * abs_sum + 1).fill(-1));\n return f(0,0);\n // ---------------------------\n function f(i,total){\n if(i === n) return target === total ? 1 : 0;\n let t = memo[i][total + abs_sum];\n // console.log(i,target,target + abs_sum,t);\n if(t !== -1) return t;\n let ans = f(i + 1,total - nums[i]) + f(i + 1,total + nums[i]);\n memo[i][total + abs_sum] = ans; \n return ans;\n }\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n × S),其中 n 是数组长度,S 是数组元素绝对值之和\n- **空间复杂度**:O(n × S),主要由 memo 数组占用","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290259438","body":"## 思路\n\n这是一个典型的完全背包问题:\n1. **状态定义**:`dp[i][j]` 表示使用前 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 种硬币凑成金额 `j` 所需的最少硬币数\n2. **状态转移**:对于第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 种硬币,我们有两种选择:\n - 不使用该硬币:`dp[i-1][j]`\n - 使用该硬币:`1 + dp[i][j-coins[i-1]]`(因为硬币可以重复使用,所以是`dp[i]`而不是`dp[i-1]`)\n3. **边界条件**:`dp[0][0] = 0`,表示不使用任何硬币凑成金额0需要0个硬币\n## 代码\n\n```javascript\nvar coinChange = function(coins, amount) {\n let n = coins.length;\n // 创建二维DP数组,dp[i][j]表示使用前i种硬币凑成金额j的最少硬币数\n let dp = new Array(n + 1).fill(0).map(()=>new Array(amount + 1).fill(Infinity));\n // 初始状态:使用0种硬币凑成金额0需要0个硬币\n dp[0][0] = 0;\n \n // 遍历每种硬币\n for(let i = 1; i <= n; i++){\n // 遍历所有可能的金额\n for(let j = 0; j <= amount; j++){\n // 状态转移方程:\n // 1. 不使用第i种硬币:dp[i - 1][j]\n // 2. 使用第i种硬币:1 + dp[i][j - coins[i - 1]] (前提是j - coins[i - 1] >= 0)\n dp[i][j] = Math.min(\n dp[i - 1][j],\n j - coins[i - 1] >= 0 ? 1 + dp[i][j - coins[i - 1]] : Infinity\n );\n }\n }\n \n // 返回结果,如果为无穷大说明无法凑成,返回-1\n return dp[n][amount] === Infinity ? -1 : dp[n][amount]\n};\n```\n\n## 时间和空间复杂度\n- 时间复杂度:O(n × amount),其中 n 是硬币种类数\n- 空间复杂度:O(n × amount)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3295404263","body":"## 思路\n\n### 状态定义\n\n- `dp[i][j]` 表示使用前 i 种硬币凑成金额 j 的组合数\n\n### 初始化\n\n- `dp[0][0] = 1`:使用 0 种硬币凑成金额 0 的方法数为 1(即什么都不选)\n\n### 状态转移方程\n\n对于第 i 种硬币(面值为 c):\n\n- `dp[i][j] = dp[i-1][j] + (j-c >= 0 ? dp[i][j-c] : 0)`\n- 其中:\n - `dp[i-1][j]`:不使用第 i 种硬币,仅使用前 i-1 种硬币凑成金额 j 的组合数\n - `dp[i][j-c]`:使用第 i 种硬币,即在凑成金额 j-c 的基础上再加一个第 i 种硬币\n\n### 关键点\n\n1. 这是一个\"完全背包\"问题:每种硬币可以使用无限次\n2. 使用的是二维DP,其中行代表硬币种类,列代表金额\n3. 转移方程中 `dp[i][j-c]`(而非 `dp[i-1][j-c]`)体现了每种硬币可重复使用的特性\n\n## 代码\n\n```javascript\n/**\n * @param {number} amount\n * @param {number[]} coins\n * @return {number}\n */\nvar change = function (amount, coins) {\n let n = coins.length, dp = new Array(n + 1).fill(0).map(() => new Array(amount + 1).fill(0));\n dp[0][0] = 1;\n for (let i = 1; i <= n; i++) {\n let c = coins[i - 1]\n for (let j = 0; j <= amount; j++) dp[i][j] = dp[i - 1][j] + (j - c >= 0 ? dp[i][j - c] : 0);\n }\n return dp[n][amount];\n };\n```\n### 时间和空间复杂度\n\n- 时间复杂度:O(n × amount),其中 n 是硬币种类数\n- 空间复杂度:O(n × amount)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3300884457","body":"## 思路\n\n1. **排序策略**:将孩子贪心值数组`g`和饼干尺寸数组[s](file://E:\\其他项目\\algorithm_exercises\\1.js)都按降序排列\n2. **贪心策略**:用最大的饼干去满足贪心值最大的孩子(即最难以满足的孩子)\n3. **双指针遍历**:使用两个指针分别遍历孩子和饼干数组\n4. **匹配逻辑**:如果当前饼干能满足当前孩子,则两个指针都前进;否则只移动孩子指针(尝试用同一块饼干满足贪心值更低的孩子)\n\n这种从最大到最小的分配方式体现了贪心思想:优先满足需求大的孩子,这样能保证整体效果最优。\n\n## 代码\n```javascript\n/**\n * @param {number[]} g\n * @param {number[]} s\n * @return {number}\n */\nvar findContentChildren = function(g, s) {\n const compare = (a,b)=>b - a;\n g.sort(compare);\n s.sort(compare);\n let i = 0,j = 0,m = g.length,n = s.length;\n let ans = 0;\n while(i < m && j < n){\n if(s[j] >= g[i]){\n ans++;\n j++;\n i++;\n }else i++;\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度为O(m log m + n log n),主要消耗在排序上,\n- 空间复杂度为O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3305173933","body":"\n## 思路\n\n贪心策略是:**尽可能选择结束时间早的区间,这样能为后续区间留出更多空间**。\n\n\n1. **按结束时间排序**:\n ```javascript\n intervals.sort((a,b)=>a[1] - b[1]);\n ```\n\n 将所有区间按照结束时间升序排列,优先考虑结束早的区间。\n\n2. **贪心选择**:\n ```javascript\n let lastEnd = -Infinity;\n for(let [s,e] of intervals){\n if(s >= lastEnd) {\n ans++;\n lastEnd = e;\n }\n }\n ```\n\n 遍历排序后的区间,如果当前区间的开始时间不早于上一个选中区间的结束时间,就选择这个区间。这确保了选中的区间互不重叠。\n\n3. **计算结果**:\n ```javascript\n return n - ans;\n ```\n\n 返回总区间数减去可以保留的区间数,即需要移除的区间数。\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} intervals\n * @return {number}\n */\nvar eraseOverlapIntervals = function(intervals) {\n intervals.sort((a,b)=>a[1] - b[1]);\n let ans = 0,n = intervals.length;\n let lastEnd = -Infinity;\n for(let [s,e] of intervals){\n if(s >= lastEnd) {\n ans++;\n lastEnd = e;\n }\n }\n return n - ans;\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n),主要消耗在排序上\n- 空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3312499521","body":"## 思路-:动态规划\n\n1. **问题目标**:判断是否能从数组的第一个位置跳到最后一个位置\n2. **解法**:使用动态规划从后往前推导\n3. **状态定义**:`dp[i]` 表示从位置 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 是否能到达最后一个位置\n4. **状态转移**:\n - 从倒数第二个位置开始往前推导\n - 对于每个位置 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22),检查能否通过跳跃到达后续的某个可达位置\n - 如果能跳到某个 `dp[j]` 为 `true` 的位置,则 `dp[i]` 也为 `true`\n\n```javascript\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canJump = function(nums) {\n let n = nums.length, dp = new Array(n).fill(false);\n dp[n - 1] = true;\n \n // 从倒数第二个位置开始向前遍历\n for(let i = n - 2; i >= 0; i--){\n let steps = nums[i];\n \n // 检查从当前位置 i 能否跳到某个可达的位置\n for(let delta = 1; delta <= steps && i + delta < n; delta++){\n let j = i + delta;\n if(dp[j]) {\n dp[i] = true;\n break;\n }\n }\n }\n \n return dp[0];\n};\n```\n\n\n## 思路总结\n\n1. **初始化**:创建一个布尔数组 [dp](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\467\\3.js#L22-L22),长度与输入数组相同,所有元素初始化为 `false`\n2. **边界条件**:最后一个位置默认为 `true`(已经在最后一个位置了)\n3. **状态转移**:从倒数第二个位置开始,对每个位置检查:\n - 根据当前位置的值,确定可以跳跃的步数范围\n - 在这个范围内,检查是否存在某个可达的位置(`dp[j]` 为 `true`)\n - 如果存在,则当前位置也是可达的\n4. **结果**:返回 `dp[0]`,即从起始位置是否可达\n\n## 复杂度分析\n这是一种典型的动态规划解法,\n- 时间复杂度为 O(n²),\n- 空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/71#issuecomment-3314420253","body":"## 思路:\n\n1. **状态定义**:`dp[i]` 表示由 i 个不同节点能构成的不同二叉搜索树的数量\n\n2. **状态转移方程**:\n - 对于 i 个节点,我们可以让其中任意一个节点 j (1 ≤ j ≤ i) 作为根节点\n - 当节点 j 作为根时:\n - 左子树包含比 j 小的 j-1 个节点,能构成 `dp[j-1]` 种不同的二叉搜索树\n - 右子树包含比 j 大的 i-j 个节点,能构成 `dp[i-j]` 种不同的二叉搜索树\n - 根据乘法原理,以 j 为根的二叉搜索树总数为 `dp[j-1] * dp[i-j]`\n - 遍历所有可能的根节点,将结果累加得到 `dp[i]`\n\n3. **边界条件**:\n - `dp[0] = 1`:空树也算一种情况\n - `dp[1] = 1`:只有一个节点时,只能构成一种二叉搜索树\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar numTrees = function(n) {\n // 创建dp数组,dp[i]表示由i个不同节点能构成的不同二叉搜索树的数量\n let dp = new Array(n + 1).fill(0);\n \n // 边界条件:0个节点可以构成1棵空树,1个节点只能构成1种二叉搜索树\n dp[0] = 1;\n dp[1] = 1;\n \n // 计算2到n个节点能构成的不同二叉搜索树数量\n for(let i = 2; i <= n; i++){\n // 对于i个节点,尝试让每个节点作为根节点\n for(let j = 1; j <= i; j++){\n // 当第j个节点作为根时:\n // 左子树有j-1个节点,可以构成dp[j-1]种不同的二叉搜索树\n // 右子树有i-j个节点,可以构成dp[i-j]种不同的二叉搜索树\n // 根据乘法原理,以j为根的二叉搜索树数量为dp[j-1] * dp[i-j]\n dp[i] += dp[j - 1] * dp[i - j]\n }\n }\n \n // 返回n个节点能构成的不同二叉搜索树数量\n return dp[n]\n};\n```\n\n\n\n\n\n## 复杂度分析\n- 时间复杂度为 O(n²),\n- 空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3315877464","body":"\n## 思路\n\n使用了**最小优先队列**来解决合并K个有序链表的问题,这是一种非常高效的解决方案。\n\n### 核心思想\n\n1. **使用最小优先队列维护所有链表的头部节点**:\n - 将K个链表的头节点都放入最小优先队列中\n - 优先队列会根据节点值进行排序,确保队首始终是最小值节点\n\n2. **逐步构建结果链表**:\n - 每次从优先队列中取出值最小的节点\n - 将该节点连接到结果链表末尾\n - 如果该节点还有后续节点,则将后续节点加入优先队列\n\n3. **重复过程直到优先队列为空**:\n - 当优先队列为空时,说明所有节点都已处理完毕\n\n### 代码详解\n\n```javascript\nvar mergeKLists = function(lists) {\n // 创建虚拟头节点,便于操作\n let dummy = new ListNode(), dh = dummy;\n \n // 创建最小优先队列,比较函数是基于节点值\n let q = new MinPriorityQueue(v => v.val);\n \n // 将所有非空链表的头节点加入优先队列\n for(let i = 0; i < lists.length; i++) \n if(lists[i]) q.enqueue(lists[i]);\n \n // 当优先队列不为空时继续处理\n while(q.size()){\n // 取出值最小的节点\n let n = q.dequeue();\n \n // 将该节点连接到结果链表\n dh.next = n;\n dh = dh.next;\n \n // 如果该节点有后续节点,将其加入优先队列\n if(n.next) q.enqueue(n.next);\n }\n \n // 返回合并后的链表\n return dummy.next;\n};\n```\n\n\n## 复杂度分析\n\n1. **时间复杂度优化**:\n - 时间复杂度为 O(N log K),其中 N 是所有节点总数,K 是链表数量\n\n2. **空间复杂度**:\n - 空间复杂度为 O(K),只需要存储K个链表的头部节点\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/73#issuecomment-3322038797","body":"## 思路:\n\n1. **分治思想**:\n - 将问题分解为两个子问题:分别处理奇数和偶数\n - `oushu = n >> 1` 计算偶数的个数(相当于 n/2 的整数部分)\n - `jishu = n - oushu` 计算奇数的个数\n\n2. **递归处理**:\n - `l1 = beautifulArray(jishu)` 递归生成奇数个数对应的漂亮数组\n - `l2 = beautifulArray(oushu)` 递归生成偶数个数对应的漂亮数组\n\n3. **映射构造**:\n - 对于奇数部分:`for(let i of l1) ans.push(2 * i - 1)` 将每个元素映射为奇数\n - 对于偶数部分:`for(let i of l2) ans.push(2 * i)` 将每个元素映射为偶数\n\n4. **核心思想**:\n - 通过将数组分为奇数和偶数两部分,确保不会在奇数和偶数之间形成等差数列\n - 因为如果一个数是奇数,另一个是偶数,那么它们的平均数不可能是整数,也就不可能在数组中找到第三个数构成等差数列\n\n## 关键点:\n\n- 基础情况:当 n=1 时,直接返回 [1]\n- 使用位运算 `>>` 实现整数除法,提高效率\n- 通过分别处理奇数和偶数部分,巧妙地避免了等差数列的形成\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number[]}\n */\nvar beautifulArray = function(n) {\n if(n === 1) return [1];\n let oushu = n >> 1,jishu = n - oushu;\n let l1 = beautifulArray(jishu),l2 = beautifulArray(oushu);\n let ans = [];\n for(let i of l1) ans.push(2 * i - 1);\n for(let i of l2) ans.push(2 * i);\n return ans\n};\n```\n\n## 复杂度分析\n- 时间复杂度为 O(n log n)。\n- 空间复杂度为 O(n log n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322078023","body":"## 思路:\n\n1. **异或运算的性质**:\n - 相同数字异或结果为0:`a ^ a = 0`\n - 任何数字与0异或等于自身:`a ^ 0 = a`\n - 异或运算满足交换律和结合律\n\n2. **第一步:计算所有数字的异或结果**:\n ```javascript\n let xor = 0;\n nums.forEach(n=>xor = xor ^ n);\n ```\n\n 这一步得到的是两个只出现一次的数字的异或结果,因为出现两次的数字都会相互抵消。\n\n3. **第二步:找到区分两个目标数字的位**:\n ```javascript\n let type = xor & (-xor);\n ```\n\n 这一步很关键,通过 `xor & (-xor)` 找到 `xor` 中最右边的1位。这个位必定在两个目标数字中一个为1,一个为0,因为只有这样它们的异或结果才会是1。\n\n4. **第三步:根据该位将数组分为两组**:\n ```javascript\n let a = 0, b = 0;\n for(let num of nums){\n if(type & num) a = a ^ num; // 该位为1的数字分为一组\n else b ^= num; // 该位为0的数字分为一组\n }\n ```\n\n 通过这种方式,将两个目标数字分到不同的组中,而相同的数字由于该位相同会被分到同一组,在组内异或后会被抵消,最终每组只剩下各自的目标数字。\n\n## 复杂度分析\n\n- 时间复杂度是 O(n),\n- 空间复杂度是 O(1),非常高效。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar singleNumber = function(nums) {\n let xor = 0;\n nums.forEach(n=>xor = xor ^ n);\n let type = xor & (-xor);\n let a = 0,b = 0;\n for(let num of nums){\n if(type & num) a = a ^ num;\n else b ^= num;\n }\n return [a,b];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3326222352","body":"## 思路\n\n1. `let n = 1 << (nums.length)`:通过左移运算计算出子集的总数。对于长度为n的数组,其子集总数为2^n。这里使用位运算`1 << nums.length`等价于2的nums.length次方。\n\n2. 外层循环`for(let i = 0;i < n;i++)`:遍历从0到2^n-1的每个数字,每个数字代表一个子集。\n\n3. 对于每个数字i(用变量j来操作):\n - 使用`j & 1`检查j的最低位是否为1\n - 如果是1,则将nums[k]加入当前子集temp中\n - 然后将j右移一位(`j >>= 1`),检查下一位\n - 同时k递增,指向nums中的下一个元素\n\n4. 内层while循环结束后,将生成的子集temp添加到结果数组ans中。\n\n## 复杂度分析\n使用位运算生成所有子集的方法,\n- 时间复杂度为O(n*2^n),\n- 空间复杂度为O(n*2^n)。\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[][]}\n */\nvar subsets = function(nums) {\n let n = 1 << (nums.length),ans = [];\n for(let i = 0;i < n;i++){\n let temp = [],j = i,k = 0;\n while(j){\n if(j & 1) temp.push(nums[k]);\n j >>= 1;\n k++;\n }\n ans.push(temp);\n }\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3331626491","body":"## 思路\n\n1. **TrieNode(Trie节点)**\n - `isEnd`:标记该节点是否为某个单词的结尾\n - `children`:大小为26的数组,存储指向子节点的指针(对应26个小写字母)\n\n2. **辅助函数**\n - `getCharIndex(c)`:将字符转换为其在字母表中的索引(0-25)\n\n### 1. 初始化(`Trie`构造函数)\n- 创建一个根节点 `root`,作为整个Trie树的起点\n\n### 2. 插入单词(`insert`方法)\n- 从根节点开始,逐字符遍历要插入的单词\n- 对于每个字符:\n - 计算其在字母表中的索引\n - 如果对应子节点不存在,则创建新节点\n - 移动到该子节点\n- 遍历完所有字符后,将最后一个节点标记为单词结尾(`isEnd = true`)\n\n### 3. 搜索单词(`search`方法)\n- 从根节点开始,逐字符遍历要搜索的单词\n- 对于每个字符:\n - 计算索引并检查对应子节点是否存在\n - 如果不存在,返回 `false`\n - 如果存在,移动到该子节点\n- 遍历完所有字符后,检查最后一个节点是否为单词结尾(`isEnd`为`true`)\n\n### 4. 前缀匹配(`startsWith`方法)\n- 与`search`类似,但不检查最后一个节点是否为单词结尾\n- 只要能完整遍历前缀中的所有字符,就返回`true`\n\n## 时间复杂度\n- 插入和搜索操作的时间复杂度均为O(m),其中m为单词或前缀的长度\n\n## 空间复杂度\n- O(ALPHABET_SIZE × N × M),其中N为插入的单词数,M为平均单词长度\n\n## 代码\n```javascript\nfunction TrieNode(){\n this.isEnd = false;\n this.children = new Array(26);\n}\n\nfunction getCharIndex(c){\n return c.charCodeAt(0) - 'a'.charCodeAt(0);\n}\n\nvar Trie = function() {\n this.root = new TrieNode();\n};\n\n/** \n * @param {string} word\n * @return {void}\n */\nTrie.prototype.insert = function(word) {\n let root = this.root;\n for(let c of word){\n let i = getCharIndex(c);\n if(!root.children[i]) root.children[i] = new TrieNode();\n root = root.children[i];\n }\n root.isEnd = true;\n};\n\n/** \n * @param {string} word\n * @return {boolean}\n */\nTrie.prototype.search = function(word) {\n let root = this.root;\n for(let c of word){\n let i = getCharIndex(c);\n if(!root.children[i]) return false;\n root = root.children[i];\n }\n return root.isEnd;\n};\n\n/** \n * @param {string} prefix\n * @return {boolean}\n */\nTrie.prototype.startsWith = function(prefix) {\n let root = this.root;\n for(let c of prefix){\n let i = getCharIndex(c);\n if(!root.children[i]) return false;\n root = root.children[i];\n }\n return !!root\n};\n\n/** \n * Your Trie object will be instantiated and called as such:\n * var obj = new Trie()\n * obj.insert(word)\n * var param_2 = obj.search(word)\n * var param_3 = obj.startsWith(prefix)\n */\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3336492052","body":"## 思路\n\n### 1. TrieNode 结构\n- `TrieNode` 是一个前缀树节点结构。\n- 每个节点包含:\n - `value`: 当前节点对应的值总和。\n - [end](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14): 标记该节点是否为某个单词的结尾。\n - `children`: 长度为26的数组,存储子节点(对应字母a-z)。\n\n### 2. MapSum 类\n- 使用前缀树(Trie)和哈希表(Map)实现键值映射与前缀求和功能。\n- `root`: Trie树的根节点。\n- [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5): 存储已插入的键值对。\n\n## 核心方法\n\n### insert(key, val)\n- 插入或更新键值对:\n - 如果键已存在,更新所有相关节点的值(先减去旧值,再加上新值)。\n - 如果是新键,则在Trie中创建路径,并在路径上的每个节点累加值。\n - 最后更新哈希表中的键值对。\n\n### sum(prefix)\n- 查询指定前缀的所有键值总和:\n - 遍历前缀,在Trie中查找对应的节点。\n - 若找不到完整前缀则返回0。\n - 返回前缀末尾节点的 `value` 值(即以该前缀开头的所有键的值总和)。\n\n## 工具函数\n\n### getCharIndex(char)\n- 将字符转换为其在字母表中的索引(0-25)。\n\n\n\n\n## 代码\n```javascript\nfunction TrieNode(){\n this.value = 0;\n this.end = false;\n this.children = new Array(26);\n}\n\nfunction getCharIndex(a){return a.charCodeAt(0) - 'a'.charCodeAt(0)}\nvar MapSum = function() {\n this.root = new TrieNode();\n this.map = new Map();\n};\n\n/** \n * @param {string} key \n * @param {number} val\n * @return {void}\n */\nMapSum.prototype.insert = function(key, val) {\n if(this.map.has(key)){\n let root = this.root;\n for(let c of key){\n let i = getCharIndex(c);\n root.children[i].value -= this.map.get(key);\n root.children[i].value += val;\n root = root.children[i];\n }\n }else{\n let root = this.root;\n for(let c of key){\n let i = getCharIndex(c);\n if(!root.children[i]) root.children[i] = new TrieNode();\n root = root.children[i];\n root.value += val;\n }\n root.end = true;\n }\n this.map.set(key,val);\n};\n\n/** \n * @param {string} prefix\n * @return {number}\n */\nMapSum.prototype.sum = function(prefix) {\n let root = this.root;\n let ans = 0\n for(let c of prefix){\n let i = getCharIndex(c);\n if(!root.children[i]) return 0;\n root = root.children[i];\n }\n return root.value;\n};\n\n/** \n * Your MapSum object will be instantiated and called as such:\n * var obj = new MapSum()\n * obj.insert(key,val)\n * var param_2 = obj.sum(prefix)\n */\n```\n\n\n## 复杂度分析\n- 时间复杂度:O(n),n位单词的长度。\n- 空间复杂度:O(m * n),m为单词个数,n为单词长度。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/78#issuecomment-3340984021","body":"## 算法思路\n\n1. **构建 Trie 树**:\n - 将 `smalls` 数组中的所有字符串插入到 Trie 树中\n - 每个节点记录是否为单词结尾([end](file://E:\\力扣刷题\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14) 标志)以及对应的索引位置([i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22))\n\n2. **搜索过程**:\n - 遍历 `big` 字符串的每个位置作为起始点\n - 对每个起始点,使用 [dfs](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\465\\2.js#L9-L25) 函数在 Trie 树中进行匹配\n - 当匹配到完整单词时,将起始位置记录到对应的结果数组中\n\n3. **Trie 树结构**:\n - `TrieNode`:包含 [end](file://E:\\力扣刷题\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14) 标志、子节点数组和索引 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22)\n - `Trie`:提供插入方法,将单词和其索引存储到树中\n\n## 关键函数分析\n\n- **`multiSearch` 主函数**:\n - 初始化 Trie 树并插入所有 smalls 单词\n - 遍历 big 字符串每个位置进行搜索\n\n- **[dfs](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\465\\2.js#L9-L25) 辅助函数**:\n - 从当前 Trie 节点继续匹配字符\n - 找到匹配单词时记录位置信息\n\n## 时间复杂度\n\n- **构建 Trie**:O(∑|smalls[i]|),即所有 smalls 字符串长度之和\n- **搜索过程**:O(|big| × max_match_length)\n - 外层循环遍历 `big` 字符串:O(|big|)\n - 每次 dfs 最坏情况遍历到最长匹配:O(max_match_length)\n- **总体复杂度**:O(∑|smalls[i]| + |big| × max_match_length)\n\n## 空间复杂度\n\n- **Trie 树存储**:O(∑|smalls[i]| × 26) = O(∑|smalls[i]|)\n- **结果数组**:O(∑结果数量)\n- **总体空间复杂度**:O(∑|smalls[i]| + 结果数量)\n\n## 代码\n```javascript\n/**\n * @param {string} big\n * @param {string[]} smalls\n * @return {number[][]}\n */\nvar multiSearch = function(big, smalls) {\n let trie = new Trie(),n = smalls.length;\n for(let i = 0;i < n;i++) trie.insert(smalls[i],i);\n let ans = new Array(n).fill(0).map(()=>[]);\n for(let i = 0;i < big.length;i++){\n let root = trie.root;\n let c = big[i],j = getCharIndex(c);\n if(!root.children[j]) continue;\n dfs(root,i,i);\n }\n\n return ans;\n\n // --------------------------\n function dfs(root,index,j){\n if(index === big.length) return;\n let c = big[index],i = getCharIndex(c);\n if(!root.children[i]) return;\n root = root.children[i];\n if(root.end) ans[root.i].push(j);\n dfs(root,index + 1,j);\n }\n};\n\n\n\n\nfunction Trie(){\n this.root = new TrieNode();\n}\n\nTrie.prototype.insert = function(word,i){\n let root = this.root;\n for(let c of word){\n let j = getCharIndex(c);\n if(!root.children[j]) root.children[j] = new TrieNode();\n root = root.children[j]\n }\n root.i = i;\n root.end = true;\n}\n\n\nfunction TrieNode(){\n this.end = false;\n this.children = new Array(26);\n this.i = -1;\n}\n\nfunction getCharIndex(c){\n return c.charCodeAt(0) - 'a'.charCodeAt(0);\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/79#issuecomment-3342189359","body":"## 思路\n\n1. **并查集初始化**:\n - 创建一个长度为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6) 的数组 [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17),其中 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6) 是城市数量\n - 初始化时,每个城市都指向自己,即 `f[i] = i`,表示每个城市初始时都是独立的集合\n\n2. **连接城市**:\n - 遍历 `isConnected` 矩阵,对于每一对相连的城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 和 `j`\n - 调用 [merge(i, j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28) 函数将它们合并到同一个集合中\n\n3. **并查集操作**:\n - [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24) 函数:查找城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 所属集合的根节点,并进行路径压缩优化\n - [merge(i, j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28) 函数:将城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 和 `j` 所在的集合合并\n\n## 关键点分析\n\n- **路径压缩**:在 [find](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\2.js#L26-L29) 函数中使用了 `f[i] = find(f[i])` 来压缩路径,提高查找效率\n- **集合合并**:每次成功合并两个不同的集合时,省份数量 [ans](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6) 减一\n- **初始值**:[ans](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6) 初始化为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6),表示最坏情况下每个城市都是一个独立省份\n\n## 代码\n```javascript\n/**\n * @param {number[][]} isConnected\n * @return {number}\n */\nvar findCircleNum = function(isConnected) {\n let n = isConnected.length,f = new Array(n).fill(0).map((_,i)=>i);\n let ans = n;\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(isConnected[i][j]) merge(i,j);\n }\n }\n return ans;\n // ------------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n let fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n ans--;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n^2),其中 n 是城市数量\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/80#issuecomment-3344661787","body":"## 思路\n\n1. **并查集初始化**\n - 使用并查集(Union-Find)数据结构来管理节点连接关系\n - [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17) 数组存储每个节点的父节点,初始时每个节点的父节点是自身\n - [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 数组存储每个连通分量的大小,初始时每个分量大小为1\n\n2. **构建连通分量**\n - 遍历 `graph` 矩阵,对于每条边 `graph[i][j]`,将节点 i 和 j 合并到同一连通分量中\n - 通过 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 函数实现节点合并,并更新连通分量大小\n\n3. **统计初始感染节点**\n - 使用 `initialMap` 统计每个连通分量中有多少个初始感染节点\n - 通过 [find](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\2.js#L26-L29) 函数找到每个初始感染节点所属的连通分量\n\n4. **选择最优移除节点**\n - 遍历所有初始感染节点,寻找满足以下条件的节点:\n - 所在连通分量只有1个初始感染节点(否则移除该节点无法减少传播)\n - 能够拯救最多节点的连通分量\n - 如果拯救数量相同,选择索引最小的节点\n\n5. **边界情况处理**\n - 如果所有初始感染节点所在的连通分量都包含多个感染节点,则返回 `initial` 中的最小索引\n\n## 关键函数\n\n- [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24): 查找节点 i 的根节点(带路径压缩优化)\n- [merge(i,j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28): 合并节点 i 和 j 所在的连通分量\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} graph\n * @param {number[]} initial\n * @return {number}\n */\nvar minMalwareSpread = function(graph, initial) {\n let n = graph.length;\n let f = new Array(n).fill(0).map((_,i)=>i);\n let s = new Array(n).fill(1);\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(graph[i][j]) merge(i,j);\n }\n }\n\n\n let initialMap = new Map();\n for(let i of initial){\n let fi = find(i);\n initialMap.set(fi,initialMap.has(fi) ? initialMap.get(fi) + 1 : 1);\n }\n let ans = n,max = 0;\n for(let i of initial){\n let fi = find(i);\n if(initialMap.get(fi) > 1) continue;\n if(s[fi] > max || s[fi] === max && i < ans) {\n max = s[fi];\n ans = i\n }\n }\n\n return ans === n ? initial.reduce((prev,curr)=>Math.min(prev,curr),n) : ans;\n\n\n\n // -----------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n let fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n s[fj] += s[fi];\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n^2),\n- 空间复杂度:O(n),其中 n 是节点数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/81#issuecomment-3349592362","body":"\n\n## 思路\n\n1. **并查集数据结构**:\n - 使用数组 [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17) 实现并查集,初始化时每台计算机的父节点是自身\n - [size](file://E:\\其他项目\\algorithm_exercises\\libs\\Stack.js#L19-L21) 记录当前连通分量的数量,初始为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6)\n\n2. **可行性判断**:\n - 如果连接数 `cnt` 小于 `n-1`,则无法连接所有计算机,返回 `-1`\n\n3. **连通分量合并**:\n - 遍历所有连接关系,通过 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 函数合并对应的计算机\n - 每次成功合并都会减少连通分量数量\n\n4. **结果计算**:\n - 最终需要的操作次数等于连通分量数减一(`size - 1`)\n\n## 关键函数\n\n- [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24):查找计算机 [i](file://E:\\其他项目\\algorithm_exercises\\周赛\\469\\2.js#L23-L23) 所在集合的根节点(带路径压缩优化)\n- [merge(i,j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28):合并计算机 [i](file://E:\\其他项目\\algorithm_exercises\\周赛\\469\\2.js#L23-L23) 和 `j` 所在的集合\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} connections\n * @return {number}\n */\nvar makeConnected = function(n, connections) {\n const cnt = connections.length;\n if(cnt < n - 1) return -1;\n const f = new Array(n).fill(0).map((_,i)=>i);\n let size = n;\n for(let [i,j] of connections) merge(i,j);\n return size - 1;\n\n // ----------------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n const fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n size--;\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(m×α(n)),其中 m 是连接数,α 是阿克曼函数的反函数\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3354314699","body":"## 思路\n\n使用**后序遍历**的方式递归处理二叉树,删除所有值为0的叶子节点及其所属的全0子树。\n\n## 具体实现分析\n\n1. **基础情况处理**\n - `if(!root) return root;` - 空节点直接返回\n - `if(root && !root.left && !root.right) return root.val === 0 ? null : root;` - 叶子节点判断:如果是值为0的叶子节点则删除\n\n2. **递归处理**\n - `let l = pruneTree(root.left), r = pruneTree(root.right);` - 递归处理左右子树\n - 处理后的左右子树结果保存在 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\468\\2.js#L7-L7) 和 [r](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\447\\1.js#L31-L31) 中\n\n3. **当前节点判断**\n - `if(!l && !r && root.val === 0) return null;` - 如果左右子树都被删除且当前节点值为0,则删除当前节点\n - 否则更新当前节点的左右子树引用并返回当前节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {TreeNode}\n */\nvar pruneTree = function(root) {\n if(!root) return root;\n if(root && !root.left && !root.right) return root.val === 0 ? null : root;\n\n let l = pruneTree(root.left),r = pruneTree(root.right);\n if(!l && !r && root.val === 0) return null;\n root.left = l;\n root.right = r;\n return root;\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**: O(n),需要访问每个节点一次\n- **空间复杂度**: O(h),h为树的高度,递归调用栈的深度\n- **关键点**: 后序遍历确保了从叶子节点开始处理,逐步向上删除符合条件的节点","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null],"haoyuliaocurb":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073435345","body":"```\n// Time Complexity: O(max(num.length, k))\n// Space Complexity: O(max(num.length, k))\n\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(num, k) {\n const num1 = num;\n const num2 = String(k).split('').map(v => Number(v));\n const sum = [];\n\n for (let i = 0; i < Math.max(num1.length, num2.length); i += 1) {\n const s = (num1[num1.length - 1 - i] ?? 0) + (num2[num2.length - 1 - i] ?? 0) + (sum[i] ?? 0);\n\n sum[i] = s % 10;\n sum[i + 1] = (s - (s % 10)) / 10;\n }\n\n if (sum[sum.length - 1] === 0) sum.pop();\n sum.reverse();\n\n return sum;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078842293","body":"【解題方向】\n\n第一想法:對於每一個 s[i] 都遍歷一次找最近的 c,Time Complexity 為 O(n^2) \n\n第二想法:先遍歷一遍 s 找到所有的 c,然後從所有的 c 開始向兩邊走\n\t=> 不過想到如何記錄狀態就覺得太複雜,而且可能最糟情況還是 Time Complexity 為 O(n^2) \n\n第三想法:看了提示,想到正向遍歷、反向遍歷一次,記錄 s[i] 與左右兩邊的 c 的最小距離\n\t=> 由於題目保證至少有一個 s 中至少有一個 c,對於每個 s[i],其左或右必然會有一個 c\n\n【程式碼】\n```\n// Time Complexity: O(n), n = s.length;\n// Space Complexity: O(n), n = s.length;\n\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const chars = s.split('');\n const res = new Array(chars.length).fill(Infinity);\n\n let leftTargetCharIndex = -1;\n for (let i = 0; i < chars.length; i += 1) {\n if (chars[i] === c) leftTargetCharIndex = i;\n if (leftTargetCharIndex > -1) {\n res[i] = Math.min(res[i], Math.abs(leftTargetCharIndex - i));\n }\n }\n\n let rightTargetCharIndex = -1;\n for (let i = chars.length - 1; i > -1; i -= 1) {\n if (chars[i] === c) rightTargetCharIndex = i;\n if (rightTargetCharIndex > -1) {\n res[i] = Math.min(res[i], Math.abs(rightTargetCharIndex - i));\n }\n }\n\n return res;\n};\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089452516","body":"1. 第一個直覺是用 recursion 來解題,不過過程中會遇到很多 edge case 沒有考慮到而 error thrown\n2. 後來改用 stack 來實踐,也很清楚,不過需要搞懂什麼應該被放進 stack,以及 pop and push 的時機\n\n```\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * Recursive version of decodeString\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const helper = (str, index) => {\n let result = '';\n let num = 0;\n \n while (index < str.length) {\n const char = str[index];\n \n if (char >= '0' && char <= '9') {\n num = num * 10 + parseInt(char);\n index++;\n } else if (char === '[') {\n // Recursively decode the content inside brackets\n const [decodedStr, newIndex] = helper(str, index + 1);\n result += decodedStr.repeat(num);\n num = 0; // Reset number after using it\n index = newIndex;\n } else if (char === ']') {\n // End of current bracket section - return result and current index\n return [result, index + 1];\n } else {\n // Regular character\n result += char;\n index++;\n }\n }\n \n return [result, index];\n };\n \n return helper(s, 0)[0];\n};\n\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let currentStr = '';\n let currentNum = 0;\n \n for (let i = 0; i < s.length; i++) {\n const char = s[i];\n \n if (char >= '0' && char <= '9') {\n currentNum = currentNum * 10 + parseInt(char);\n } else if (char === '[') {\n // Push current state to stack\n stack.push([currentStr, currentNum]);\n currentStr = '';\n currentNum = 0;\n } else if (char === ']') {\n // Pop from stack and decode\n const [prevStr, num] = stack.pop();\n currentStr = prevStr + currentStr.repeat(num);\n } else {\n // Regular character\n currentStr += char;\n }\n }\n \n return currentStr;\n};\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091467280","body":"透過第二個 stack 倒轉第一個 in-stack 的順序,以達到 FIFO 的效果\n```\n// Time Complexity: O(1) for push, pop, peek, empty;\n// Space Complexity: O(n)\n\nclass MyQueue {\n constructor() {\n this.inStack = [];\n this.outStack = [];\n }\n\n /** \n * @param {number} x\n * @return {void}\n */\n push(x) {\n this.inStack.push(x);\n }\n\n /**\n * @return {number}\n */\n pop() {\n if (!this.outStack.length) {\n this.pushToOutStack();\n }\n\n return this.outStack.pop();\n }\n\n /**\n * @return {number}\n */\n peek() {\n if (!this.outStack.length) {\n this.pushToOutStack();\n }\n\n return this.outStack[this.outStack.length - 1];\n }\n\n /**\n * @return {boolean}\n */\n empty() {\n return this.peek() === undefined;\n }\n\n pushToOutStack() {\n while (this.inStack.length) {\n this.outStack.push(this.inStack.pop());\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094426027","body":"// Time Complexity: O(n);\n// Space Complexity: O(n);\n\n```\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const sortedArr = [...arr].sort((a, b) => a - b);\n let counts = {};\n let chunkAmount = 0;\n\n for (let i = 0; i < arr.length; i += 1) {\n counts[arr[i]] = (counts[arr[i]] ?? 0) + 1;\n counts[sortedArr[i]] = (counts[sortedArr[i]] ?? 0) - 1;\n\n if (Object.values(counts).every((value) => value === 0)) {\n chunkAmount += 1;\n }\n }\n\n return chunkAmount;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095908728","body":"```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\nvar rotateRight = function (head, k) {\n if (!head || !head.next) return head;\n\n let length = 0;\n let cur = head;\n\n while (cur) {\n cur = cur.next;\n length += 1;\n }\n\n k = k % length;\n let left = head;\n let right = head;\n\n while (right.next) {\n if (k <= 0) left = left.next;\n right = right.next;\n k -= 1;\n }\n\n right.next = head; // Handle the case when left and right point to the same node.\n let res = left.next;\n left.next = null;\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3102283858","body":"建立一個 dummy 連結在 head 之前,便可以將 head 當作中間節點處理。每次互換節點會牽涉四個節點,pre, cur, next, next.next,其中 pre 的初始值為 dummy,因此在每個迴圈保證有值,而真正要互換的 cur, next,其兩有值為 while 迴圈繼續的必要條件,next.next 為 null 則沒關係。\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n const dummy = { val: 0, next: head };\n\n let pre = dummy;\n let cur = pre.next;\n let next = cur?.next;\n\n while (cur && next) {\n pre.next = next;\n cur.next = next.next;\n next.next = cur;\n\n [pre, cur, next] = [cur, cur.next, cur.next?.next];\n }\n\n return dummy.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105649705","body":"# 想法\n轉換成 Height Balanced Binary Search Tree 會需要進行 Binary Search,考慮到單向鏈錶不方便直接存取 node,因此直接將鏈錶轉成數組,並直接以數組配合 Binary Search 遞迴建立樹。\n\n```\n\n// Time Complexity: O(n);\n// Space Complexity: O(n);\n\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if (head === null) return null;\n\n const dummy = new ListNode(0, head);\n const arr = [];\n\n let tail = dummy;\n\n while (tail) {\n const next = tail.next;\n next && arr.push(next.val);\n tail = next;\n }\n\n const inner = (l, r) => {\n if (l > r) return null;\n if (l === r) return new TreeNode(arr[r]);\n\n const m = Math.ceil((l + r) / 2);\n\n return new TreeNode(arr[m], inner(l, m - 1), inner(m + 1, r));\n };\n\n return inner(0, arr.length - 1);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112936097","body":"## 思考方向\n### 雙指針\n用兩個指針分別從 headA, headB 開始走,走到盡頭換到另一個 head。過程中若指向同一個點則為兩鏈錶的交點,若皆遍歷一遍後無交點,則兩鏈錶無相交。\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function(headA, headB) {\n let pointerA = headA;\n let pointerB = headB;\n let switchCounts = 0;\n\n while (switchCounts < 3) {\n if (pointerA === pointerB) return pointerA;\n\n if (pointerA?.next) {\n pointerA = pointerA.next;\n } else {\n switchCounts += 1;\n pointerA = headB;\n }\n\n if (pointerB?.next) {\n pointerB = pointerB.next;\n } else {\n switchCounts += 1;\n pointerB = headA;\n }\n }\n\n return null;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116343077","body":"## 解題方向\n- 快慢指針法\n\n## Edge Cases\n- 當快指針走到 null 代表沒有環\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n let fast = head;\n let slow = head;\n\n do {\n if (fast === null) return null;\n\n fast = fast?.next?.next ?? null;\n slow = slow?.next ?? null;\n } while (fast !== slow);\n\n fast = head;\n\n while (fast !== slow) {\n fast = fast?.next ?? null;\n slow = slow?.next ?? null;\n }\n\n return fast;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121584769","body":"## 解題方向\n- 看到 FISO 的第一個想法是用 Queue,搭配 hash 也可以達到 get O(1) 的要求,不過 put 更新既有的值,就沒辦法 O(1)。\n若是 put 更新既有的值要 O(1),還是需要使用鏈表。\n- 中間有一度 debug 卡關,主要是原本在 put 時無論如何都先把既有的 node 刪掉再新增,但這可能造成一些 state 更新上的錯誤,後來簡化為直接移動 node 才 AC。\n\n```\n// Time Complexity: O(1) for LRUCache.prototype.get, put\n// Space Complexity: O(n)\n\nfunction ListNode(key, val) {\n this.key = key;\n this.val = val;\n this.next = null;\n this.pre = null;\n }\n\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.length = 0;\n this.head = new ListNode();\n this.tail = new ListNode();\n this.head.next = this.tail;\n this.tail.pre = this.head;\n this.map = {};\n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n const node = this.map[key];\n\n if (node !== undefined) {\n this.appendToTail(this.remove(node));\n return node.val\n };\n\n return -1;\n};\n\n/** \n * @param {number} key \n * @param {number} val\n * @return {void}\n */\nLRUCache.prototype.put = function(key, val) {\n const node = this.map[key];\n\n if (node !== undefined) {\n node.val = val;\n this.appendToTail(this.remove(node));\n } else {\n if (this.length === this.capacity) {\n const old = this.head.next;\n delete this.map[old.key];\n this.length -= 1;\n this.remove(old);\n }\n\n const node = new ListNode(key, val);\n this.map[key] = node;\n this.length += 1;\n this.appendToTail(node);\n }\n};\n\nLRUCache.prototype.appendToTail = function(node) {\n if (node.pre) node.pre.next = node.next;\n if (node.next) node.next.pre = node.pre;\n this.tail.pre.next = node;\n node.pre = this.tail.pre;\n node.next = this.tail;\n this.tail.pre = node;\n}\n\nLRUCache.prototype.remove = function(node) {\n node.pre.next = node.next;\n node.next.pre = node.pre;\n node.pre = null;\n node.next = null;\n\n return node;\n}\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123752698","body":"## 解題方向\n### DFS\n- 需注意當 helper 的 params root 為 null 時,應回傳 0\n\n```\n// Time Complexity: O(n), n for numbers of nodes.\n// Space Complexity: O(h), h for the max depth of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n const helper = (root) => {\n if (!root) return 0;\n if (!root.left && !root.right) return 1;\n return Math.max(helper(root.left), helper(root.right)) + 1;\n };\n\n return helper(root);\n};\n```\n\n### Layer Iteration\n- 由於 stack 的起始值就有一個 root node,因此要先處理 root 為 null 的狀況\n\n```\n// Time Complexity: O(n), n for numbers of nodes.\n// Space Complexity: O(w), w for the max numbers of nodes in the same layer of tree.\n\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if (!root) return 0;\n\n const stack = [{ node: root, depth: 1 }];\n let maxDepth = 0;\n\n while (stack.length) {\n const { node, depth } = stack.shift();\n if (node.left) stack.push({ node: node.left, depth: depth + 1 });\n if (node.right) stack.push({ node: node.right, depth: depth + 1 });\n maxDepth = Math.max(maxDepth, depth);\n }\n\n return maxDepth;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125050709","body":"## 解題方向\n- 須理解兩棵樹一樣的意思是,其遍歷的結果會一樣,又題目有提到左右節點位置不同也不行,因此可以用多個遍歷結果來確認,或者可以將中間的空節點印出。可優化空間是不需要若於遍歷過程比較兩棵樹的節點,就不需要儲存遍歷結果。\n\n```javascript\n// Time Complexity: O(m + n), m, n are numbers of two tree nodes respectively.\n// Space Complexity: O(m + n)\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} p\n * @param {TreeNode} q\n * @return {boolean}\n */\nvar isSameTree = function(p, q) {\n const iterate = (root) => {\n const arr = [];\n const stack = [root];\n\n while (stack.length) {\n const node = stack.shift();\n\n arr.push(node?.val);\n\n if (node?.left || node?.right) {\n stack.push(node?.left);\n stack.push(node?.right);\n }\n }\n\n return arr;\n };\n\n return JSON.stringify(iterate(p)) === JSON.stringify(iterate(q));\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3131156971","body":"## 解題方向\n- 需要計算所有從 root 走到 leaf 的路線,這可以用 Recursion 來完成(回溯)\n- 用一個數字來紀錄 state:增加位數為「runningNumber * 10 + node.val」,減去位數為「Math.floor(runningNumber / 10)」\n\n```javascript\n// Time Complexity: O(n), n is the number of the tree nodes\n// Space Complexity: O(d), d is the depth of the tree\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root) {\n let sum = 0;\n let runningNumber = 0;\n\n const inner = (root) => {\n if (root) {\n runningNumber = runningNumber * 10 + root.val;\n\n if (!root.left && !root.right) {\n sum += runningNumber;\n } else {\n inner(root.left);\n inner(root.right);\n }\n\n runningNumber = Math.floor(runningNumber / 10);\n }\n };\n\n inner(root);\n\n return sum;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134845036","body":"## 解題方向\n- 可以使用 DFS 或 BFS 來解題\n- DFS 記錄最深深度的第一個節點數值,深度可作為參數於每次遞迴時傳遞\n- BFS 紀錄每層第一個節點數值\n- 題目保證 root 一定不為 null\n\n### DFS\n```javascript\n// Time Complexity: O(n), n is the number of tree nodes.\n// Space Complexity: O(d), d is the max depth of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let maxDepth = 0;\n let res = null;\n\n const dfs = (root, depth) => {\n if (depth > maxDepth) {\n maxDepth = depth;\n res = root.val;\n }\n\n root.left && dfs(root.left, depth + 1);\n root.right && dfs(root.right, depth + 1);\n };\n\n dfs(root, 1);\n\n return res;\n};\n```\n\n### BFS\n```javascript\n// Time Complexity: O(n), n is the number of tree nodes.\n// Space Complexity: O(w), w is the max width of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n const stack = [[root]];\n let res = null;\n\n while (stack.length) {\n const nodes = stack.pop();\n\n res = nodes[0].val;\n\n const nextNodes = [];\n\n for (const node of nodes) {\n node.left && nextNodes.push(node.left);\n node.right && nextNodes.push(node.right);\n }\n\n nextNodes.length && stack.push(nextNodes);\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138426787","body":"## 解題方向\n* 使用 DNS 前序遍歷,在 deserialize 時透過遞迴建立樹會較 BFS 容易。\n* 使用原生的 JSON.stringify and JSON.parse 來轉換 array 及 string\n* 優化方向:優化 Space Complexity 至 O(h),h 為樹的高度\n * 能直接產生 serialized string 而非在最後轉化\n * 一邊 deserialize 需要的 string 部分,而不需要在一開始開一個 array 儲存\n\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n// Time Complexity: O(n), n is number of tree nodes.\n// Space Complexity: O(n), n is number of tree nodes.\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n const preOrder = [];\n const dns = (root) => {\n preOrder.push(root?.val);\n if (root) {\n dns(root.left);\n dns(root.right);\n }\n };\n dns(root);\n\n return JSON.stringify(preOrder);\n};\n\n// Time Complexity: O(n), n is number of tree nodes.\n// Space Complexity: O(n), n is number of tree nodes.\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n const preOrder = JSON.parse(data);\n\n if (preOrder[0] === null || preOrder[0] === undefined) return preOrder[0];\n\n const createNode = () => {\n const val = preOrder.shift();\n\n if (val === null) return null;\n\n const node = new TreeNode(val);\n node.left = createNode();\n node.right = createNode();\n return node;\n };\n\n return createNode();\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144639245","body":"## 解題方向\n- 不一樣的遍歷方式會有差嗎? => 由於打算取值後再排序,因此沒差\n- 如何儲存最後的輸出最省力 => 用 hashmap\n\n```javascript\n// Time Complexity: O(nlogn), n is the number of tree.\n// Space Complexity: O(n), n is the number of tree.\n\n// /**\n// * Definition for a binary tree node.\n// * function TreeNode(val, left, right) {\n// * this.val = (val===undefined ? 0 : val)\n// * this.left = (left===undefined ? null : left)\n// * this.right = (right===undefined ? null : right)\n// * }\n// */\n// /**\n// * @param {TreeNode} root\n// * @return {number[][]}\n// */\nvar verticalTraversal = function(root) {\n const map = {};\n\n const traverse = (root, row, col) => {\n if (!root) return;\n\n if (!map[col]) {\n map[col] = [];\n }\n\n map[col].push([row, root.val]);\n traverse(root.left, row + 1, col - 1);\n traverse(root.right, row + 1, col + 1);\n };\n\n traverse(root, 0, 0);\n\n const keys = Object.keys(map).sort((a, b) => a - b);\n\n const res = keys.map((k) => {\n const arr = map[k];\n\n return arr.sort(([rowA, valA], [rowB, valB]) => {\n if (rowA === rowB) return valA - valB;\n return rowA - rowB;\n }).map(([,val]) => val);\n });\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146092009","body":"## 解題方向\n- 遍歷 nums 時使用 hashmap 來記錄曾出現過的數字及其 index,並看 hashmap 是否記錄 target - nums[i] 是否曾出現過\n- 可以特別注意題目要求同個元素不能被使用兩次,所以應將配對到的元素移出 hashmap(不過因為題目也說只有一組數字為答案,所以不做也沒關係)\n\n```javascript\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(1) \n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n const map = {};\n const res = [];\n\n for (let i = 0; i < nums.length; i += 1) {\n const num = nums[i];\n\n if (map[target - num] !== undefined) {\n res.push(i, map[target - num]);\n delete map[target - num];\n } else {\n map[num] = i;\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3146907342","body":"## 解法\n- 第一個想法是遍歷後得到 num 與其 frequency 的 hashmap,將其轉成 array 後排序並取前 k 者\n- 看了題解後可優化部分是,由於題目允許回傳值不需要依據 frequency 排序,因此可將原解法 sort 的部分改成 quick selection,將平均時間複查度從 O(nlogn) 將至 O(n)\n```javascript\n// Time Complexity: O(nlogn), n is nums.length.\n// Space Complexity: O(n), n is nums.length.\n\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function (nums, k) {\n const map = {};\n\n for (const num of nums) {\n map[num] = (map[num] ?? 0) + 1;\n }\n\n return Object.entries(map)\n .sort(([numA, freqA], [numB, freqB]) => {\n return freqB - freqA;\n })\n .filter((_, i) => i < k)\n .map(([num]) => Number(num));\n};\n```\n\n## 解法\n- 找 max frequent num\n- 回傳 left, right index range\n- 需要考慮當兩個 num frequency 相等時,應保留 range 較小者!\n```javascript\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(n), n is nums.length.\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findShortestSubArray = function (nums) {\n let maxFreqNum = nums[0];\n const map = {};\n\n for (let i = 0; i < nums.length; i += 1) {\n const num = nums[i];\n const { freq, left, right } = map[num] ?? { freq: 0, left: i, right: i };\n map[num] = {\n freq: freq + 1,\n left: i < left ? i : left,\n right: i > right ? i : right,\n };\n\n if (map[num].freq > map[maxFreqNum].freq) {\n maxFreqNum = num;\n } else if (map[num].freq === map[maxFreqNum].freq) {\n if (\n map[num].right - map[num].left <\n map[maxFreqNum].right - map[maxFreqNum].left\n ) {\n maxFreqNum = num;\n }\n }\n }\n\n const { left, right } = map[maxFreqNum];\n\n return right - left + 1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149617346","body":"```javascript\n// Time Complexity: O(n^2), n is points.length.\n// Space Complexity: O(n), n is points.length.\n\n/**\n * @param {number[][]} points\n * @return {number}\n */\nfunction numberOfBoomerangs(points) {\n const n = points.length;\n let ans = 0;\n \n for (let i = 0; i < n; i++) {\n const distanceMap = {};\n \n for (let j = 0; j < n; j++) {\n const dist = Math.pow(points[i][0] - points[j][0], 2) + Math.pow(points[i][1] - points[j][1], 2);\n distanceMap[dist] = (distanceMap[dist] ?? 0) + 1;\n }\n \n for (const count of Object.values(distanceMap)) {\n ans += count * (count - 1);\n }\n }\n \n return ans;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153048738","body":"## 解法\n- 經典的滑動視窗題目,與用 hashmap 紀錄字元的出現次數,並於迴圈中判斷下個字元是否已出現過,無則加入,有則刪除。\n- 需要特別注意\n- (1) 迴圈的邊界條件應為 right < s.length - 1,不然會讓 right 跑到 s.length\n- (2) 應先刪掉 map[s[left]] 再 left++\n\n```javascript\n// Time Complexity: O(n), n is s.length.\n// Space Complexity: O(m), m is types of characters in s.\n\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n if (!s.length) return 0;\n \n const chars = new Map();\n chars.set(s[0], 1);\n\n let max = 1;\n let left = 0;\n let right = 0;\n\n while (right < s.length - 1) {\n const cond = !chars.has(s[right + 1]);\n if (!chars.has(s[right + 1])) {\n right++;\n chars.set(s[right], 1);\n } else {\n chars.delete(s[left]);\n left++;\n }\n\n const number = right - left + 1;\n if (number > max) max = number;\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160434225","body":"## 解法\n- 一開始分析方向錯了,以為每個 substring 間不可重疊\n- 之後想到的是用 hashmap 存可能 substring 的結果,再遍歷一次,但是時間複雜度為階乘\n- 最後則是直接遍歷,再驗證 substring 是否正確,然而需考慮 words 的 element 是否會重複\n\n```javascript\n// Time Complexity: O(n * m * k), n is s.length, m is words[0].length, k is words.lenght.\n// Space Complexity: O(m).\n\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n const defaultMap = (() => {\n const m = {};\n for (const word of words) {\n m[word] = (m[word] ?? 0) + 1;\n }\n return m;\n })();\n let map = JSON.parse(JSON.stringify(defaultMap));\n const wordLength = words[0].length;\n const substringLength = wordLength * words.length;\n\n const validate = (substring) => {\n let cur = 0;\n map = JSON.parse(JSON.stringify(defaultMap));\n\n while (cur < substring.length) {\n const target = substring.substring(cur, cur + wordLength);\n if (map[target]) {\n map[target] -= 1;\n cur += wordLength;\n } else return false;\n }\n\n return true;\n };\n\n const res = []\n\n for (let i = 0; i < s.length - substringLength + 1; i++) {\n const substring = s.substring(i, i + substringLength);\n if (validate(substring)) res.push(i);\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3164019442","body":"## 解法\n- 一開始漏看了連續短數組的條件,之後想到暴力法,也有個感覺優化必定涉及數學技巧,因此直接看題解\n- 需要理解兩個技巧:負數取模 floorMod 和 map.set(0, -1) 以處理欲從 sum[i] - sum[j] 計算 i 至 j 範圍時,當 j 為 0 遇到的計算問題\n\n```javasciprt\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(min(n, k))\n\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar floorMod = function (a, b) {\n return ((a % b) + b) % b;\n};\n\nfunction minSubarray(nums, k) {\n var map = new Map();\n map.set(0, -1);\n var res = nums.length;\n var target = 0;\n var currSum = 0;\n for (let i = 0; i < nums.length; i++) {\n target += nums[i];\n }\n target = target % k;\n if (target === 0) return 0;\n for (let i = 0; i < nums.length; i++) {\n currSum = (nums[i] + currSum) % k;\n\n var prevSum = floorMod(currSum - target, k);\n if (map.has(prevSum)) {\n res = Math.min(res, i - map.get(prevSum));\n }\n map.set(currSum, i);\n }\n return res === nums.length ? -1 : res;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168248088","body":"## 解法\n- 窮舉前面的例子就可以得到規律:先處理只有一個 node 的 edge case,當 fast.next?.next 不為 null,即存在下下個 node 的情況下移動快慢指針,不然慢指針的下個 node 即是中間節點。\n```javascript\n// 1 => 1\n\n// 1, 2 => 2 => slow 1, fast 2\n// 1, 2, 3 => 2 => slow 1, fast 2\n\n// 1, 2, 3, 4 => 3 => slow 2, fast 4\n// 1, 2, 3, 4, 5 => 3 => slow 2, fast 4\n\n// 1, 2, 3, 4, 5, 6 => 4\n// 1, 2, 3, 4, 5, 6, 7 => 4\n\n// 1, 2, 3, 4, 5, 6, 7, 8 => 5\n// 1, 2, 3, 4, 5, 6, 7, 8, 9 => 5\n```\n\n```javascript\n// Time Complexity: O(n), n is linked list length,\n// Space Complexity: O(1)\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n if (!head.next) return head;\n\n let slow = head;\n let fast = head.next;\n\n while (fast.next?.next) {\n slow = slow.next;\n fast = fast.next.next;\n };\n\n return slow.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170547569","body":"## 解法\n- 一開始沒注意到 Space Complexity O(1) 的要求,因此用 map 來記錄曾遍歷過的數字,並使用 nums.splice 來原地刪除重複元素\n- 若限制 Space Complexity 為 O(1),則需要如題解用快慢指針來做\n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n let slow = 0;\n let fast = 0;\n\n while (fast < nums.length) {\n if (nums[fast] !== nums[slow]) {\n slow++;\n nums[slow] = nums[fast];\n }\n \n fast++;\n }\n\n return slow + 1;\n};\n\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n const map = {};\n let res = 0;\n let i = nums.length - 1;\n\n while (i >= 0) {\n const num = nums[i];\n\n if (map[num]) {\n nums.splice(i, 1);\n } else {\n map[num] = 1;\n res += 1;\n };\n\n i--;\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172259657","body":"## 解法\n- 經典的二分查找,需注意沒有找到 target 的 edge case\n\n```javascript\n// Time Complexity: O(logn), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let l = 0;\n let r = nums.length - 1;\n let m = -1;\n\n while (l <= r) {\n m = l + Math.floor((r - l) / 2);\n\n if (nums[m] === target) return m;\n else if (nums[m] > target) r = m - 1;\n else l = m + 1;\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173778506","body":"## 解法\n- 第一泡茶的確是暴力解,之後會想到 max heap,但每次 push 仍需要耗費 O(logn)\n- 有想過使用 monotonic stack 來做,但卡沒仔細想就覺得可能無法正確排除 sliding window 外的元素而作罷,而這其實可以靠題解中的 shift 來完成,又因為不是嚴格遞增棧,所以遇到相等數值時,前者仍會被保留,而確保 shift 的操作都是正確的\n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(k)\n\nvar maxSlidingWindow = function (nums, k) {\n const res = [];\n const dequeue = new Dequeue([]);\n\n for (let i = 0; i < k - 1; i++) {\n dequeue.push(nums[i]);\n }\n\n for (let i = k - 1; i < nums.length; i++) {\n dequeue.push(nums[i]);\n res.push(dequeue.max());\n dequeue.shift(nums[i - k + 1]);\n }\n\n return res;\n};\n\nclass Dequeue {\n constructor(nums) {\n this.list = nums; // Should be implemented as a linked list to make time complexity of dequeue.shift() as O(1).\n }\n\n push(val) {\n const nums = this.list;\n\n while (nums[nums.length - 1] < val) {\n nums.pop();\n }\n\n nums.push(val);\n }\n\n shift(val) {\n let nums = this.list;\n\n if (nums[0] === val) {\n nums.shift();\n }\n }\n\n max() {\n return this.list[0];\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178234382","body":"## 解法\n- 第一泡茶,可以透過紀錄一個人信任及被信任的人數來解題。其中可以不斷紀錄目前被信任人數最高者方便最後判斷是否為法官\n- 看了題解後發現可以用圖來解,之後補上\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n const trustFroms = new Array(n).fill(0);\n const trustTos = new Array(n).fill(0);\n let maybeJudge = { index: 0, trustTo: 0 };\n\n for (const t of trust) {\n const [from, to] = [t[0] - 1, t[1] - 1];\n trustFroms[from]++;\n trustTos[to]++;\n if (trustTos[to] > maybeJudge.trustTo) maybeJudge = { index: to, trustTo: trustTos[to] };\n }\n\n if (maybeJudge.trustTo === n - 1) {\n if (trustFroms[maybeJudge.index] === 0) return maybeJudge.index + 1;\n }\n\n return -1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3184149014","body":"```javascript\n// Time Complexity: O(v + e)\n// Space Complexity: O(v + e)\n\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nconst possibleBipartition = (n, dislikes) => {\n const graph = new Array(n + 1).fill().map(() => new Array())\n const colors = new Array(n + 1).fill(-1);\n\n for (const [a, b] of dislikes) {\n graph[a].push(b);\n graph[b].push(a);\n }\n\n const dfs = (cur, color = 0) => {\n colors[cur] = color;\n\n for (const nxt of graph[cur]) {\n if (colors[nxt] !== -1 && colors[nxt] === color) return false;\n if (colors[nxt] === -1 && !dfs(nxt, color ^ 1)) return false;\n }\n\n return true;\n };\n\n for (let i = 0; i < n + 1; i++) {\n if (colors[i] === -1 && !dfs(i, 0)) return false;\n }\n\n return true;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186799518","body":"```javascript\n// Time Complexity: O(n + e), e is sum of beforeItems.flat().length\n// Space Complexity: O(n + e)\n\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n const topologicalSort = (items, indegree, neighbors) => {\n const queue = [];\n const result = [];\n \n for (const item of items) {\n if (indegree[item] === 0) {\n queue.push(item);\n }\n }\n \n while (queue.length > 0) {\n const current = queue.shift();\n result.push(current);\n \n const currentNeighbors = neighbors[current] || [];\n for (const neighbor of currentNeighbors) {\n indegree[neighbor]--;\n if (indegree[neighbor] === 0) {\n queue.push(neighbor);\n }\n }\n }\n \n return result;\n };\n \n let maxGroupId = m;\n for (let item = 0; item < n; item++) {\n if (group[item] === -1) {\n group[item] = maxGroupId;\n maxGroupId++;\n }\n }\n \n const itemIndegree = Array.from({length: n}, () => 0);\n const groupIndegree = Array.from({length: maxGroupId}, () => 0);\n const itemNeighbors = Array.from({length: n}, () => []);\n const groupNeighbors = Array.from({length: maxGroupId}, () => []);\n const groupItems = Array.from({length: maxGroupId}, () => []);\n \n for (let item = 0; item < n; item++) {\n groupItems[group[item]].push(item);\n }\n \n for (let item = 0; item < n; item++) {\n const dependencies = beforeItems[item] || [];\n \n for (const dependency of dependencies) {\n if (group[dependency] !== group[item]) {\n groupIndegree[group[item]]++;\n groupNeighbors[group[dependency]].push(group[item]);\n } else {\n itemIndegree[item]++;\n itemNeighbors[dependency].push(item);\n }\n }\n }\n \n const groups = Array.from({length: maxGroupId}, (_, i) => i);\n const sortedGroups = topologicalSort(groups, groupIndegree, groupNeighbors);\n \n if (sortedGroups.length !== maxGroupId) {\n return [];\n }\n \n const result = [];\n \n for (const groupId of sortedGroups) {\n const items = groupItems[groupId];\n const sorteditems = topologicalSort(items, itemIndegree, itemNeighbors);\n \n if (sorteditems.length !== items.length) {\n return [];\n }\n \n result.push(...sorteditems);\n }\n \n return result;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190479297","body":"```javascript\n// Time Complexity: O(n), n is moves.length\n// Space Complexity: O(1)\n\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let [x, y] = [0, 0];\n\n for (let i = 0; i < moves.length; i++) {\n const action = moves.substring(i, i + 1);\n if (action === 'R') x++;\n if (action === 'L') x--;\n if (action === 'U') y++;\n if (action === 'D') y--;\n }\n\n return x === 0 && y === 0;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193447956","body":"## 題解\n- 一開始使用 Array + Sort 的方法實作,不過由於 Time Complexity 為 O(n^2logn),在資料量 1 <= n <= 10^5 的條件下,會沒辦法 AC\n- 需要將資料結構改成 Min Heap 來降低時間複雜度\n\n```javascript\n// Min Heap\n// Time Complexity: O(nlogn)\n// Space Complexity: O(logn)\n\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function (tasks) {\n const indices = Array.from({ length: tasks.length }, (_, i) => i);\n\n indices.sort((a, b) => { return tasks[a][0] - tasks[b][0] });\n\n const minHeap = new PriorityQueue((a, b) => {\n if (tasks[a][1] !== tasks[b][1]) {\n return tasks[a][1] - tasks[b][1];\n }\n return a - b;\n });\n\n const res = [];\n let time = 0;\n let i = 0;\n\n while (!minHeap.isEmpty() || i < tasks.length) {\n while (i < tasks.length && tasks[indices[i]][0] <= time) {\n minHeap.enqueue(indices[i]);\n i++;\n }\n\n if (minHeap.size() === 0) {\n time = tasks[indices[i]][0];\n } else {\n const nextIndex = minHeap.dequeue();\n time += tasks[nextIndex][1];\n res.push(nextIndex);\n }\n }\n\n return res;\n};\n\n// Array + Sort\n// Time Complexity: O(n^2logn)\n// Space Complexity: O(n)\n\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n tasks = tasks.map((t, i) => [...t, i]);\n tasks.sort((a, b) => a[0] === b[0] ? a[2] - b[2] : a[0] - b[0]);\n\n let i = 0;\n let curTime = 0;\n const queue = [];\n const res = [];\n\n while (i < tasks.length || queue.length) {\n while (i < tasks.length && tasks[i][0] <= curTime) {\n queue.push(tasks[i]);\n queue.sort((a, b) => a[1] === b[1] ? a[2] - b[2] : a[1] - b [1]);\n i++;\n }\n\n if (!queue.length) {\n curTime = tasks[i][0];\n } else {\n const curTask = queue.shift();\n res.push(curTask[2]);\n curTime += curTask[1];\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194091917","body":"```javascript\n// Time Complexity: O(1)\n// Space Complexity: O(1)\n\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n const getMinSum = (time, carry) => {\n let [hour, min] = time.split(':').map(s => Number(s));\n const remainer = min % 15;\n const q = (min - remainer) / 15;\n\n if (!carry) {\n return (hour * 60) + min;\n } else if (remainer && carry === 'ceil') {\n return (hour * 4 + q + 1) * 15;\n } else {\n return (hour * 4 + q) * 15;\n }\n };\n\n let [loginMinSum, logoutMinSum] = [getMinSum(loginTime, 'ceil'), getMinSum(logoutTime, 'floor')];\n\n if (getMinSum(loginTime) > getMinSum(logoutTime)) {\n logoutMinSum += 24 * 60;\n }\n\n return Math.max((logoutMinSum - loginMinSum) / 15, 0)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3196057927","body":"## 題解\n- 原本想針對三種狀況,直接找 a 和 b 中最符合的 char 來做計算,但會發現很多 edge case 要考量,要一直修正\n- 看題解之後,在有限的解空間中(頂多常數 26),枚舉的確是一個簡單、可讀性更好的做法\n\n```javascript\n// Time Complexity: O(n + m), n is a.length, m is b.length\n// Space Complexity: O(26)\n\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n const createCounter = (str) => {\n const counter = {};\n\n for (let i = 0; i < 26; i++) {\n counter[String.fromCharCode(97 + i)] = 0;\n }\n\n for (const char of str) {\n counter[char]++;\n }\n return counter;\n };\n \n const ca = createCounter(a);\n const cb = createCounter(b);\n\n const greaterCost = (ca, cb) => {\n let ans = Infinity;\n\n for (let i = 1; i < 26; i++) {\n let count = 0;\n \n for (let j = 0; j < i; j++) {\n count += ca[String.fromCharCode(97 + j)];\n }\n \n for (let j = i; j < 26; j++) {\n count += cb[String.fromCharCode(97 + j)];\n }\n ans = Math.min(ans, count);\n }\n return ans;\n };\n \n const equalCost = (ca, cb) => {\n let ans = Infinity;\n for (let i = 0; i < 26; i++) {\n const char = String.fromCharCode(97 + i);\n ans = Math.min(ans, a.length + b.length - ca[char] - cb[char]);\n }\n return ans;\n };\n \n return Math.min(\n greaterCost(ca, cb),\n greaterCost(cb, ca),\n equalCost(ca, cb)\n );\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199125049","body":"## 題解\n- 直覺就是用快速排序來做,不過實踐上,這次發現 partition 有兩種方法可以做:hoarePartition、lomutoPartition。其中 lomutoPartition 普遍認為較簡單,但因為交換數值的次數較多,會遇到 TLE,因此此題需用 hoarePartition 來做。\n\n```javascript\nconst lomutoPartition = (nums, left, right) => {\n const pivot = nums[right];\n let i = left - 1;\n\n for (let j = left; j < right; j++) {\n if (nums[j] <= pivot) {\n i++;\n [nums[i], nums[j]] = [nums[j], nums[i]];\n }\n }\n\n i++;\n [nums[i], nums[right]] = [nums[right], nums[i]];\n\n return i;\n};\n\nconst hoarePartition = (nums, left, right) => {\n const p = left + ((right - left) >>> 1);\n const pivot = nums[p];\n let [i, j] = [left, right];\n\n while (i <= j) {\n while (nums[i] < pivot) i++;\n while (nums[j] > pivot) j--;\n if (i <= j) {\n [nums[i], nums[j]] = [nums[j], nums[i]];\n i++;\n j--;\n }\n }\n\n return [i, j];\n};\n\nconst quickSort = (nums, left, right) => {\n // if (left < right) {\n // const p = lomutoPartition(nums, left, right);\n // quickSort(nums, left, p - 1);\n // quickSort(nums, p + 1, right);\n // }\n\n if (left < right) {\n const [i, j] = hoarePartition(nums, left, right);\n quickSort(nums, left, j);\n quickSort(nums, i, right);\n }\n};\n\n// Time Complexity: O(nlogn), n is nums.length\n// Space Complexity: O(logn)\n\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function (nums) {\n quickSort(nums, 0, nums.length - 1);\n return nums;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204182883","body":"```javascript\n// Time Complexity: O(logn)\n// Space Complexity: O(1)\n\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n let res = 0;\n let l = 0;\n let r = x;\n\n while (l <= r) {\n const m = l + ((r - l) >>> 2);\n\n if (m * m > x) {\n r = m - 1;\n } else {\n res = m;\n l = m + 1;\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3209343494","body":"## 題解\n- 可以將這題轉化成「尋找最左邊符合條件者」,即可套入模板\n\n```javascript\n// Time Complexity: O(logn)\n// Space Complexity: O(1)\n\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let [l, r] = [1, n];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 2);\n\n if (isBadVersion(m)) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n };\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3212999531","body":"## 題解\n- 二分:對於每一個元素前者排序,並找到大於 a * 2 者(重複 a * 2 的右界)。需注意是,應在每次加入新元素時,直接尋找其應該插入的位置,而非將整個陣列排序,不然會 TLE。\n\n```javascript\nclass SortedList {\n constructor() {\n this.arr = [];\n }\n\n bisectRight(target) {\n let [l, r] = [0, this.arr.length - 1];\n\n while (l <= r) {\n const mid = l + ((r - l) >>> 1);\n\n if (this.arr[mid] <= target) {\n l = mid + 1;\n } else {\n r = mid - 1;\n }\n }\n\n return l;\n }\n \n push(value) {\n const pos = this.bisectRight(value);\n this.arr.splice(pos, 0, value);\n }\n \n get length() {\n return this.arr.length;\n }\n}\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n const sortedRunningNums = new SortedList();\n sortedRunningNums.push(nums[0]);\n let ans = 0;\n\n for (let i = 1; i < nums.length; i++) {\n ans += (i - sortedRunningNums.bisectRight(nums[i] * 2));\n sortedRunningNums.push(nums[i]);\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216534944","body":"## 題解\n- 依序遍歷 houses,尋找每個 house 與 heater 最近距離,最大者為答案。其中尋找最近距離的實踐,可以使用 bisectRight 來做\n\n```javascript\n// Time Complexity: O(nlog m + mlog m), n is houses.length, m is heaters.length\n// Space Complexity: O(1)\n\nconst getHouseHeaterMinDistance = (house, heaters) => {\n if (heaters.length === 0) return Infinity;\n if (heaters.length === 1) return Math.abs(house - heaters[0]);\n\n let [l, r] = [0, heaters.length - 1];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (house === heaters[m]) {\n return 0;\n } else if (house > heaters[m]) {\n l = m + 1;\n } else {\n r = m - 1;\n };\n }\n\n const leftDistance = l === 0 ? Infinity : house - heaters[l - 1];\n const rightDistance = r === heaters.length - 1 ? Infinity : heaters[l] - house;\n\n return Math.min(leftDistance, rightDistance);\n};\n\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n heaters.sort((a, b) => a - b);\n\n let maxRadius = 0;\n\n for (const house of houses) {\n const minDistance = getHouseHeaterMinDistance(house, heaters);\n maxRadius = Math.max(maxRadius, minDistance);\n }\n\n return maxRadius;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217908480","body":"## 題解\n- 計數二分經典的題目,排序後解空間為 0 至 nums[lnums.ength - 1] - nums[0]\n\n```javascript\n// Time Complexity: O(nlogn)\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a, b) => a - b);\n\n const countDistanceNotGreaterThan = (maxDistance) => {\n let count = 0;\n let l = 0;\n\n for (let r = 1; r < nums.length; r++) {\n while (nums[r] - nums[l] > maxDistance) {\n l++;\n }\n\n count += r - l;\n }\n\n return count;\n };\n\n let [l, r] = [0, nums[nums.length - 1] - nums[0]];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (countDistanceNotGreaterThan(m) >= k) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218836123","body":"## 題解\n- 用二分在解空間 [0, maxElevation] 中尋找答案,對於每個可能的 m,再 dns 尋找可能路徑\n- 需注意因為 dns 時多了 grid[ni][nj] <= elevation 的條件,不需重置 visited[i][j],因為就算從其他點進來該點,依舊會沒辦法繼續走下去,與尋找所有路徑的 dns 略有不同\n\n```javascript\n// Time Complexity: O(n^2logn)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n const n = grid.length;\n\n const maxElevation = (() => {\n let e = 0;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n e = Math.max(e, grid[i][j]);\n }\n }\n return e;\n })();\n\n const canReachBottomRight = (elevation) => {\n const visited = Array.from({ length: n}).map(() => Array.from({ length: n }).map(() => false));\n\n const dns = (i, j) => {\n if (i === n - 1 && j === n - 1) return true;\n\n visited[i][j] = true;\n\n const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];\n\n for (const [di, dj] of directions) {\n const ni = i + di;\n const nj = j + dj;\n\n if (ni >= 0 && ni < n && nj >= 0 && nj < n) {\n if (!visited[ni][nj] && grid[ni][nj] <= elevation) {\n if (dns(ni, nj)) return true;\n }\n }\n }\n\n // visited[i][j] = false;\n\n return false;\n };\n\n if (grid[0][0] <= elevation) return dns(0, 0);\n else return false;\n };\n\n let l = 0;\n let r = maxElevation;\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (canReachBottomRight(m)) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222489820","body":"## 題解\n- 典型的 sliding window 題型\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(1)\n\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n const vowel = 'aeiou';\n let l = 0;\n let r = 0;\n let cur = 0;\n let max = cur;\n\n while (r < s.length) {\n if (vowel.includes(s.charAt(r))) cur++;\n r++;\n\n if (r - l > k) {\n if (vowel.includes(s.charAt(l))) cur--;\n l++;\n }\n\n max = Math.max(max, cur);\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3226683449","body":"```javascript\n// Time Complexity: O(k + maxPts)\n// Space Complexity: O(k + maxPts)\n\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n const dp = Array.from({ length: k + maxPts }).map(() => 0);\n let sum = 0;\n\n for (let i = k; i < k + maxPts; i++) {\n if (i <= n) dp[i] = 1;\n sum += dp[i];\n }\n\n for (let j = k - 1; j >= 0; j--) {\n dp[j] = sum / maxPts;\n sum -= dp[j + maxPts];\n sum += dp[j];\n }\n\n return dp[0];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3234016259","body":"```javascript\n// Time Complexity: O(n), n is s.length\n// Space COmplexity: O(1)\n\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nfunction findAnagrams(s, p) {\n function arraysEqual(arr1, arr2) {\n for (let i = 0; i < 26; i++) {\n if (arr1[i] !== arr2[i]) return false;\n }\n return true;\n }\n\n const result = [];\n const sLen = s.length;\n const pLen = p.length;\n \n if (sLen < pLen) return result;\n \n const pCount = new Array(26).fill(0);\n const windowCount = new Array(26).fill(0);\n \n for (let i = 0; i < pLen; i++) {\n pCount[p.charCodeAt(i) - 97]++;\n }\n \n let left = 0;\n \n for (let right = 0; right < sLen; right++) {\n const rightIndex = s.charCodeAt(right) - 97;\n windowCount[rightIndex]++;\n \n if (right - left + 1 > pLen) {\n const leftIndex = s.charCodeAt(left) - 97;\n windowCount[leftIndex]--;\n left++;\n }\n \n if (right - left + 1 === pLen) {\n if (arraysEqual(windowCount, pCount)) {\n result.push(left);\n }\n }\n }\n \n return result;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3237104151","body":"```javascript\n// Time Complexity: O(n + m), n is s.length, m is t.length\n// Space Complexity: O(k), k is different char count in t\n\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nfunction minWindow(s, t) {\n let l = 0;\n const counter = {};\n const N = s.length;\n const ct = {};\n \n for (let char of t) {\n ct[char] = (ct[char] || 0) + 1;\n }\n \n let k = 0;\n let ret = Infinity;\n let ans = \"\";\n \n for (let r = 0; r < N; r++) {\n counter[s[r]] = (counter[s[r]] || 0) + 1;\n \n if (s[r] in ct && counter[s[r]] === ct[s[r]]) {\n k++;\n }\n \n while (k === Object.keys(ct).length) {\n if (r - l + 1 < ret) {\n ans = s.substring(l, r + 1);\n ret = r - l + 1;\n }\n \n counter[s[l]]--;\n if (s[l] in ct && counter[s[l]] === ct[s[l]] - 1) {\n k--;\n }\n l++;\n }\n }\n \n return ans;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3239924106","body":"```javascript\n// Time Complexity: O(1)\n// Space Complexity: O(1)\n\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n const countBits = (num) => {\n let count = 0;\n while (num) {\n count += num & 1;\n num >>= 1;\n }\n return count;\n };\n\n const res = [];\n\n for (let hour = 0; hour < 12; hour++) {\n for (let minute = 0; minute < 60; minute++) {\n if ((countBits(hour) + countBits(minute)) === turnedOn) {\n const formattedMinute = minute < 10 ? `0${minute}` : `${minute}`\n res.push(`${hour}:${formattedMinute}`);\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240825737","body":"```javascript\n// Time Complexity: O(n!)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n\n const backtrack = (row, cols, dias1, dias2) => {\n if (row === n) {\n count++;\n return;\n }\n\n let availablePostions = ((1 << n) - 1) & (~(cols | dias1 | dias2));\n\n while (availablePostions) {\n const position = availablePostions & (-availablePostions);\n availablePostions &= availablePostions - 1;\n\n backtrack(\n row + 1,\n cols | position,\n (dias1 | position) << 1,\n (dias2 | position) >> 1,\n );\n }\n };\n\n backtrack(0, 0, 0, 0);\n\n return count;\n};\n\n// Time Complexity: O(n!)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n const cols = new Array(n).fill(false);\n const dias1 = new Array(2 * n - 1).fill(false); // row - col\n const dias2 = new Array(2 * n - 1).fill(false); // row + col\n\n const backtrack = (row) => {\n if (row === n) {\n count++;\n return;\n }\n\n for (let col = 0; col < n; col++) {\n const d1 = row - col + n - 1;\n const d2 = row + col;\n\n if (cols[col] || dias1[d1] || dias2[d2]) continue;\n\n cols[col] = dias1[d1] = dias2[d2] = true;\n backtrack(row + 1);\n cols[col] = dias1[d1] = dias2[d2] = false;\n }\n };\n\n backtrack(0);\n\n return count;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245083899","body":"## 題解\n- 遍歷每個 (i, j) 進行 dfs,遇到邊界或 grid[i][j] === 0 者即返回 0,反之則返回 1 加四個方向 dns 的結果\n- 優化:訪問過者可將原 grid[i][j] 改成 0,如此便不需要重新宣告一個空間來存取\n\n```javascript\n// Time Complexity: O(m * n)\n// Space Complexity: O(m * n)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n const [m, n] = [grid.length, grid[0].length];\n const direction = [[1, 0], [-1, 0], [0, 1], [0, -1]];\n let max = 0;\n\n const dfs = (x, y) => {\n if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y]) {\n grid[x][y] = 0;\n\n let area = 1;\n\n for (const [dx, dy] of direction) {\n area += dfs(x + dx, y + dy);\n }\n\n return area;\n }\n\n return 0;\n };\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n max = Math.max(max, dfs(i, j));\n }\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249843138","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nfunction maxDistance(grid) {\n const n = grid.length;\n const queue = [];\n \n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n queue.push([i, j, 0]);\n }\n }\n }\n \n if (queue.length === 0 || queue.length === n * n) {\n return -1;\n }\n \n const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];\n let maxDist = 0;\n \n while (queue.length > 0) {\n const [x, y, dist] = queue.shift();\n maxDist = Math.max(maxDist, dist);\n \n for (const [dx, dy] of directions) {\n const nx = x + dx;\n const ny = y + dy;\n \n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] === 0) {\n grid[nx][ny] = 1;\n queue.push([nx, ny, dist + 1]);\n }\n }\n }\n \n return maxDist;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251291240","body":"```javascript\n// Time Complexity: O(n + k), n is candies.length, k is number of keys\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n const boxes = new Set(initialBoxes);\n const q = [];\n \n for (const i of boxes) {\n if (status[i]) {\n q.push(i);\n }\n }\n \n for (let idx = 0; idx < q.length; idx++) {\n const i = q[idx];\n \n for (const j of containedBoxes[i]) {\n boxes.add(j);\n if (status[j]) {\n q.push(j);\n }\n }\n \n for (const j of keys[i]) {\n if (status[j] === 0 && boxes.has(j)) {\n q.push(j);\n }\n status[j] = 1;\n }\n }\n \n return q.reduce((sum, i) => sum + candies[i], 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3258808498","body":"```javascript\n// Time Complexity: O(nlogn), n is the number of tree.\n// Space Complexity: O(n), n is the number of tree.\n\n// /**\n// * Definition for a binary tree node.\n// * function TreeNode(val, left, right) {\n// * this.val = (val===undefined ? 0 : val)\n// * this.left = (left===undefined ? null : left)\n// * this.right = (right===undefined ? null : right)\n// * }\n// */\n// /**\n// * @param {TreeNode} root\n// * @return {number[][]}\n// */\nvar verticalTraversal = function(root) {\n const map = {};\n\n const traverse = (root, row, col) => {\n if (!root) return;\n\n if (!map[col]) {\n map[col] = [];\n }\n\n map[col].push([row, root.val]);\n traverse(root.left, row + 1, col - 1);\n traverse(root.right, row + 1, col + 1);\n };\n\n traverse(root, 0, 0);\n\n const keys = Object.keys(map).sort((a, b) => a - b);\n\n const res = keys.map((k) => {\n const arr = map[k];\n\n return arr.sort(([rowA, valA], [rowB, valB]) => {\n if (rowA === rowB) return valA - valB;\n return rowA - rowB;\n }).map(([,val]) => val);\n });\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3262161616","body":"## 題解\n- 重點是找到 dp 的關鍵核心 d[i] = Math.min(d[i - 1] + cost[i], d[i - 2] + cost[i]);\n- 需注意 cost[i] 為空值的情況\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} cost\n * @return {number}\n */\nvar minCostClimbingStairs = function(cost) {\n const n = cost.length;\n const d = [];\n\n d[0] = cost[0];\n d[1] = Math.min(d[0] + cost[1], cost[1]);\n\n for (let i = 2; i <= n; i++) {\n const c = cost[i] ?? 0;\n d[i] = Math.min(d[i - 1] + c, d[i - 2] + c);\n }\n\n return d[n];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263843103","body":"## 解題\n- 一樣需要去辨認 dp 的關係式,d[i] = Math.max(d[i - 1], d[i - 2] + nums[i])\n- 需要特別注意 n 為 1, 2 的 edge case \n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar rob = function(nums) {\n const n = nums.length;\n\n if (n === 1) return nums[0];\n if (n === 2) return Math.max(nums[0], nums[1]);\n\n const d = [];\n\n d[0] = nums[0];\n d[1] = Math.max(nums[0], nums[1]);\n\n for (i = 2; i < n; i++) {\n d[i] = Math.max(d[i - 1], d[i - 2] + nums[i])\n }\n\n return d[n - 1];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3266927805","body":"```javascript\n// Time Complexity: O(n^2), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findNumberOfLIS = function(nums) {\n const n = nums.length;\n const dp = Array(n).fill(null).map(() => [1, 1]);\n let longest = 1;\n \n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n if (nums[j] > nums[i]) {\n if (dp[i][0] + 1 > dp[j][0]) {\n dp[j][0] = dp[i][0] + 1;\n dp[j][1] = dp[i][1];\n longest = Math.max(longest, dp[j][0]);\n } else if (dp[i][0] + 1 === dp[j][0]) {\n dp[j][1] += dp[i][1];\n }\n }\n }\n }\n \n return dp.reduce((sum, [length, count]) => {\n return length === longest ? sum + count : sum;\n }, 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3270111521","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n)\n\n/**\n * @param {string} text1\n * @param {string} text2\n * @return {number}\n */\nvar longestCommonSubsequence = function(text1, text2) {\n const [n, m] = [text1.length, text2.length];\n const dp = Array.from({ length: n + 1 }).map(() => new Array(m + 1).fill(0));\n let res = 0;\n\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n if (text1.charAt(i - 1) === text2.charAt(j - 1)) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n res = Math.max(res, dp[i][j]);\n } else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273250794","body":"## 題解\n- dp 的遞增式為 `d[i][j] = d[i - 1][j] + d[i][j - 1];`,意思是,dp[i][j] 表示能到達該格子的路線數量,其為 d[i - 1][j] 和 d[i][j - 1] 的總和(從其左或其上格子來)\n- 其中需注意當 i 或 j 為 0,即最上或最左列的格子,其 d[i][j] 值為 1,因為只可能從其上或其左格子而來\n\n```javascript\n// Time Complexity: O(m * n)\n// Space Complexity: O(m * n)\n\n/**\n * @param {number} m\n * @param {number} n\n * @return {number}\n */\nvar uniquePaths = function(m, n) {\n const d = Array.from({ length: m }).map(() => new Array(n).fill(1));\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (i !== 0 && j !== 0) {\n d[i][j] = d[i - 1][j] + d[i][j - 1];\n }\n }\n }\n\n return d[m - 1][n - 1];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3279921315","body":"```javascript\n// Time Complexity: O(n^2 * k)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} row\n * @param {number} column\n * @return {number}\n */\nvar knightProbability = function(n, k, row, column) {\n let dp = Array.from({ length: n }, () => new Array(n).fill(0));\n const directions = [[2, 1], [1, 2], [-1, 2], [-2, 1], [-2, -1], [-1, -2], [1, -2], [2, -1]];\n\n dp[row][column] = 1;\n\n for (let step = 0; step < k; step++) {\n let dpTemp = Array.from({ length: n }, () => new Array(n).fill(0));\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n for (const [dx, dy] of directions) {\n const [px, py] = [i - dx, j - dy];\n\n if (px >= 0 && px < n && py >= 0 && py < n) {\n dpTemp[i][j] += dp[px][py] * 0.125;\n }\n }\n }\n }\n\n dp = dpTemp;\n }\n\n let sumProp = 0;\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n sumProp += dp[i][j];\n }\n }\n\n return sumProp;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3285364984","body":"```javascript\n/**\n * @param {number} maxChoosableInteger\n * @param {number} desiredTotal\n * @return {boolean}\n */\nvar canIWin = function(maxChoosableInteger, desiredTotal) {\n if (maxChoosableInteger >= desiredTotal) {\n return true;\n }\n \n const totalSum = (maxChoosableInteger * (maxChoosableInteger + 1)) / 2;\n if (totalSum < desiredTotal) {\n return false;\n }\n \n const memo = new Map();\n \n const dfs = (used, currentSum) => {\n if (memo.has(used)) {\n return memo.get(used);\n }\n \n for (let i = 1; i <= maxChoosableInteger; i++) {\n const bit = 1 << (i - 1);\n \n if ((used & bit) === 0) {\n if (currentSum + i >= desiredTotal) {\n memo.set(used, true);\n return true;\n }\n \n if (!dfs(used | bit, currentSum + i)) {\n memo.set(used, true);\n return true;\n }\n }\n }\n \n memo.set(used, false);\n return false;\n };\n \n return dfs(0, 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3288487076","body":"```javascript\n// Time Complexity: O(n * k), n is nums.length, k is sum of nums / 2\n// Space Complexity: O(n * k)\n\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canPartition = function (nums) {\n let sum = nums.reduce((acc, num) => acc + num, 0);\n\n if (sum % 2) return false;\n else sum = sum / 2;\n\n const dp = Array.from(nums).map(() => Array.from({ length: sum + 1 }).fill(false));\n\n for (let i = 0; i < nums.length; i++) {\n dp[i][0] = true;\n }\n\n for (let i = 0; i < dp.length - 1; i++) {\n for (let j = 0; j < dp[0].length; j++) {\n dp[i + 1][j] = j - nums[i] >= 0 ? dp[i][j] || dp[i][j - nums[i]] : dp[i][j];\n }\n }\n\n return dp[nums.length - 1][sum];\n};\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289632643","body":"```javascript\n// Time Complexity: O(n * k), n is nums.length, k is sum of nums\n// Space Complexity: O(k)\n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar findTargetSumWays = function(nums, target) {\n const total = nums.reduce((sum, num) => sum + num, 0);\n \n if (Math.abs(target) > total || (total + target) % 2 !== 0) {\n return 0;\n }\n \n const sum = (total + target) / 2;\n const dp = new Array(sum + 1).fill(0);\n dp[0] = 1;\n \n for (const num of nums) {\n for (let j = sum; j >= num; j--) {\n dp[j] += dp[j - num];\n }\n }\n \n return dp[sum];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3292845699","body":"```javascript\n/**\n * @param {number[]} coins\n * @param {number} amount\n * @return {number}\n */\nvar coinChange = function(coins, amount) {\n const dp = new Array(amount + 1).fill(Infinity);\n\n dp[0] = 0;\n\n for (i = 1; i <= amount; i += 1) {\n for (const coin of coins) {\n if (i - coin >= 0 && dp[i - coin] !== Infinity) {\n dp[i] = Math.min(dp[i - coin] + 1, dp[i]);\n }\n }\n }\n\n return dp[amount] === Infinity ? -1 : dp[amount];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3297467048","body":"```javascript\n// Time Complexity: O(n * m), n is amount, m is coins.length\n// Space Complexity: O(n)\n\n/**\n * @param {number} amount\n * @param {number[]} coins\n * @return {number}\n */\nvar change = function(amount, coins) {\n const dp = new Array(amount + 1).fill(0);\n dp[0] = 1;\n\n for (const coin of coins) {\n for (let i = coin; i <= amount; i++) {\n dp[i] += dp[i - coin];\n }\n }\n \n return dp[amount];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3303059077","body":"## 題解\n- 先排序,以 g[j] 為主,遍歷符合的 s[i]\n```javascript\n// Time Complexity: O(nlogn + mlogm), n is g.length, m is s.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} g\n * @param {number[]} s\n * @return {number}\n */\nvar findContentChildren = function(g, s) {\n g.sort((a, b) => a - b);\n s.sort((a, b) => a - b);\n\n let [i, j] = [0, 0];\n let ans = 0;\n\n while (i < s.length && j < g.length) {\n if (s[i] >= g[j]) {\n ans++;\n j++;\n }\n\n i++;\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3307711246","body":"```javascript\n// Time Complexity: O(nlogn)\n// Space Complexity: O(1)\n\n/**\n * @param {number[][]} intervals\n * @return {number}\n */\nfunction eraseOverlapIntervals(intervals) {\n if (intervals.length <= 1) return 0;\n \n intervals.sort((a, b) => a[1] - b[1]);\n \n let count = 0;\n let end = intervals[0][1];\n \n for (let i = 1; i < intervals.length; i++) {\n if (intervals[i][0] < end) {\n count++;\n } else {\n end = intervals[i][1];\n }\n }\n \n return count;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3311687568","body":"```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canJump = function (nums) {\n let max = 0;\n\n for (let i = 0; i < nums.length; i++) {\n if (max < i) return false;\n\n max = Math.max(nums[i] + i, max);\n }\n\n return max >= nums.length - 1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/71#issuecomment-3314986282","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nconst memories = {};\nvar numTrees = function(n) {\n if (memories[n] !== undefined) return memories[n];\n if (n <= 1) return 1;\n\n let ans = 0;\n\n for (let i = 1; i <= n; i++) {\n ans += numTrees(i - 1) * numTrees(n - i);\n }\n\n memories[n] = ans;\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316043984","body":"```javascript\n// Time Complexity: O(nlogk), n is total number of nodes across all lists, k is number of lists\n// Space Complexity: O(1)\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode[]} lists\n * @return {ListNode}\n */\nvar mergeKLists = function(lists) {\n if (!lists || lists.length === 0) return null;\n \n while (lists.length > 1) {\n let mergedLists = [];\n \n for (let i = 0; i < lists.length; i += 2) {\n let l1 = lists[i];\n let l2 = i + 1 < lists.length ? lists[i + 1] : null;\n mergedLists.push(mergeTwoLists(l1, l2));\n }\n \n lists = mergedLists;\n }\n \n return lists[0];\n};\n\nfunction mergeTwoLists(l1, l2) {\n let dummy = new ListNode(0);\n let current = dummy;\n \n while (l1 && l2) {\n if (l1.val <= l2.val) {\n current.next = l1;\n l1 = l1.next;\n } else {\n current.next = l2;\n l2 = l2.next;\n }\n current = current.next;\n }\n \n current.next = l1 || l2;\n return dummy.next;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3324003764","body":"```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar singleNumber = function(nums) {\n let bitmask = 0;\n\n for (let n of nums) {\n bitmask ^= n;\n }\n\n bitmask &= -bitmask;\n\n const ans = [0, 0];\n\n for (let n of nums) {\n if ((n & bitmask) === 0) ans[0] ^= n;\n else ans[1] ^= n;\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3327535650","body":"```javascript\n// Time Complexity: O(n * 2^n)\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number[][]}\n */\nfunction subsets(nums) {\n const result = [];\n \n function backtrack(start, current) {\n result.push([...current]);\n \n for (let i = start; i < nums.length; i++) {\n current.push(nums[i]);\n backtrack(i + 1, current);\n current.pop();\n }\n }\n \n backtrack(0, []);\n return result;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3338173897","body":"```javascript\n// Time Complexity\n// - insert: O(k), k is key.length\n// - searchValue: O(k), k is key.length\n// - sum: O(p), p is prefix.length\n\n// Space Complexity: O(n * m), n is the number of unique keys inserted, m is the average length of the keys\n\nclass MapSum {\n constructor() {\n this.root = new TrieNode();\n }\n \n insert(key, val) {\n let temp = this.root;\n \n let oldVal = this.searchValue(key);\n \n for (let i = 0; i < key.length; i++) {\n if (temp.children[key.charCodeAt(i) - 97] == null)\n temp.children[key.charCodeAt(i) - 97] = new TrieNode();\n \n temp = temp.children[key.charCodeAt(i) - 97];\n \n temp.count = temp.count - oldVal + val;\n }\n \n temp.val = val;\n temp.isWord = true;\n }\n\n searchValue(key) {\n let temp = this.root;\n for (let i = 0; i < key.length; i++) {\n if (temp.children[key.charCodeAt(i) - 97] == null)\n return 0;\n \n temp = temp.children[key.charCodeAt(i) - 97];\n }\n \n return temp.isWord ? temp.val : 0;\n }\n\n sum(prefix) {\n let temp = this.root;\n \n for (let i = 0; i < prefix.length; i++) {\n if (temp.children[prefix.charCodeAt(i) - 97] == null)\n return 0;\n \n temp = temp.children[prefix.charCodeAt(i) - 97];\n }\n \n return temp.count;\n }\n}\n\nclass TrieNode {\n constructor() {\n this.count = 0;\n this.children = new Array(26);\n this.isWord = false;\n this.val = 0;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/78#issuecomment-3341802963","body":"```javascript\n// Time Complexity: O(n*m + b*b + n)\n// - Building Trie: O(n*m) where n = number of smalls, m = average length of smalls\n// - Searching: O(b*b) where b = length of big string (worst case: check every position against every possible substring)\n// - Converting result: O(n)\n\n// Space Complexity: O(n*m + n*k)\n// - Trie storage: O(n*m) for storing all small strings\n// - Result storage: O(n*k) where k = average number of matches per small string\n\n\nclass Node {\n constructor() {\n this.children = new Array(26).fill(null);\n this.isWord = false;\n this.id = 0;\n }\n}\n\nclass Solution {\n constructor() {\n this.root = new Node();\n }\n\n multiSearch(big, smalls) {\n const n = smalls.length;\n const res = Array(n).fill().map(() => []);\n \n for (let i = 0; i < smalls.length; i++) {\n this.insert(smalls[i], i);\n }\n\n for (let i = 0; i < big.length; i++) {\n let tmp = this.root;\n\n for (let j = i; j < big.length; j++) {\n if (tmp.children[big.charCodeAt(j) - 97] === null) {\n break;\n }\n\n tmp = tmp.children[big.charCodeAt(j) - 97];\n\n if (tmp.isWord) {\n res[tmp.id].push(i);\n }\n }\n }\n\n const ret = new Array(n);\n\n for (let i = 0; i < n; i++) {\n ret[i] = new Array(res[i].length);\n for (let j = 0; j < ret[i].length; j++) {\n ret[i][j] = res[i][j];\n }\n }\n\n return ret;\n }\n\n insert(word, id) {\n let tmp = this.root;\n\n for (let i = 0; i < word.length; i++) {\n if (tmp.children[word.charCodeAt(i) - 97] === null) {\n tmp.children[word.charCodeAt(i) - 97] = new Node();\n }\n\n tmp = tmp.children[word.charCodeAt(i) - 97];\n }\n\n tmp.isWord = true;\n tmp.id = id;\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wutxuan":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073568207","body":"第一次思路:将num数组转换为int数字A,计算A+K,将A+K结果转换为List类型,但没有观察数据范围,导致int类型溢出,没有通过全部样例\n第二次思路:从后往前,逐位相加K%10,直到遍历完全部数组,再判断K是否还有,通过全部样例\n第三次思路:看完题解后,学习到了可以将k和某一位看作一个整体,不用每次计算k%10,而是k+num[i]","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078154786","body":"第一次思路:遍历每个字符,在每个字符上向左向右移动,直到找到字符c,继续遍历下一个字符,但想到时间复杂度一定很高,因此继续想其他方法\n\n第二次思路:先遍历字符串,用List先记录每个字符c的索引。然后遍历字符串每个字符,计算这个字符的位置距离List中位置的最小距离,通过全部用例,时间复杂度O(N*K) N为字符串长度,K为c在字符串中出现的次数\n\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n List indexList = new ArrayList<>();\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == c){\n indexList.add(i);\n }\n }\n\n int[] res = new int[s.length()];\n Arrays.fill(res,10001);\n for(int i = 0;i < res.length;i++){\n for(int index : indexList){\n res[i] = Math.min(res[i],Math.abs(i - index));\n }\n \n }\n return res;\n }\n}\n\n```\n第三次思路:看完题解后,学习到了两次遍历求解,从左到右记录每个字符左侧最近的字符c的距离,记为left数组,从右到左记录每个字符右侧最近的字符c的距离,记为right数组。再遍历一遍整个字符串,在left数组和right数组中取最小值为最终结果。在代码实现时,省去了记录right数组再比较,而是直接比较。时间复杂度O(N)\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n int index = -s.length();\n int[] left = new int[s.length()];\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == c){\n index = i;\n }\n left[i] = i - index;\n }\n\n index = 2 * s.length();\n for(int i = s.length() - 1;i >= 0;i--){\n if(s.charAt(i) == c){\n index = i;\n }\n left[i] = Math.min(left[i],index - i);\n }\n return left;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3083567541","body":"因为要设计的栈有最大长度,因此使用数组来模拟栈。否则使用栈或List来模拟。\n使用数组模拟:使用一个指针变量,指向当前栈顶。入栈时,val存入栈顶处,指针++,出栈时,指针- -,返回栈顶元素。实现inc函数时,只需要对数组中0-k位置的数每个+val即可。通过全部样例\n```java\nclass CustomStack {\n int size = 0; // 指向第一个空位置\n int[] arr;\n\n public CustomStack(int maxSize) {\n arr = new int[maxSize];\n }\n \n public void push(int x) {\n if(size < arr.length){\n arr[size] = x;\n size++;\n }\n }\n \n public int pop() {\n if(size > 0){\n size--;\n return arr[size];\n }else{\n return -1;\n }\n }\n \n public void increment(int k, int val) {\n int cut = Math.min(k,size);\n\n for(int i = 0;i < cut;i++){\n arr[i] += val;\n }\n }\n}\n```\n\n看完题解后学会了前缀和方法:- 因为每次的increment函数都会对栈底[0,k]的数据val操作,而是否val操作了只有在pop时才会体现。所以我们可以通过一个数组incremental记录每个val,即第i位置下面的元素都要加incremental[i]。在pop第i个数的时候加上它需要加的所有val,即incremental[i]。 所以increment函数只需要维护incremental数组。但要记得记得pop后,incremental函数用过的地方要清零,并且得累加到前面一位\n\n```java\nclass CustomStack {\n\n Stack stack;\n int[] incremental;\n\n public CustomStack(int maxSize) {\n stack = new Stack();\n incremental = new int[maxSize];\n }\n \n public void push(int x) {\n if(stack.size() < incremental.length){\n stack.push(x);\n }\n }\n \n public int pop() {\n int cut = stack.size() - 1;\n if(cut < 0) return -1;\n\n int res = stack.pop() + incremental[cut];\n\n if(cut > 0){\n incremental[cut-1] += incremental[cut]; \n }\n incremental[cut] = 0;\n return res;\n\n }\n \n public void increment(int k, int val) {\n int cut = Math.min(k,stack.size())-1;\n if(cut >= 0){\n incremental[cut] += val;\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089071815","body":"看到有括号,需要对括号匹配,则优先想到栈。遍历字符串,当遇到非】字符时,全部入栈。当遇到】字符时,开始向回看,取出字符c,构成字符串s。再向回看,取出数字x,重复x次字符串s得到字符串ss,再将ss入栈,继续遍历,直到遍历结束。\n \n最后得到的栈,就是存储了最终解码后的字符串。取出栈后记得反转字符串\n```java\nclass Solution {\n public String decodeString(String s) {\n Stack stack = new Stack<>();\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == ']'){\n StringBuilder sb = new StringBuilder();\n StringBuilder count = new StringBuilder();\n\n while(!stack.isEmpty() && stack.peek() != '['){\n sb.append(stack.pop());\n } \n sb.reverse();\n stack.pop();\n while(!stack.isEmpty() && stack.peek() >= '0' && stack.peek() <= '9'){\n count.append(stack.pop());\n }\n count.reverse();\n int t = Integer.valueOf(count.toString());\n StringBuilder res = new StringBuilder();\n res.repeat(sb,t);\n\n for(char c : res.toString().toCharArray()){\n stack.push(c);\n }\n \n }else{\n stack.push(s.charAt(i));\n }\n }\n StringBuilder re = new StringBuilder();\n while(!stack.isEmpty()){\n re.append(stack.pop());\n }\n re.reverse();\n return re.toString();\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3095194789","body":"- push操作:输入栈入栈\n- pop操作:如果输出栈不为空,则直接输出输出栈的元素。如果输出栈为空,则把输入栈的数据全部导入到输出栈中\n- peek操作:如果输出栈不为空,则直接peek输出栈的元素。如果输出栈为空,则把输入栈的数据全部导出到输入栈中\n```java\nclass MyQueue {\n Stack stackIn;\n Stack stackOut;\n\n public MyQueue() {\n stackIn = new Stack<>();\n stackOut = new Stack<>();\n }\n \n public void push(int x) {\n stackIn.push(x);\n }\n \n public int pop() {\n refresh();\n return stackOut.pop();\n }\n \n public int peek() {\n refresh();\n return stackOut.peek();\n }\n \n public boolean empty() {\n return stackIn.isEmpty() && stackOut.isEmpty();\n }\n\n public void refresh(){\n if(!stackOut.isEmpty()){\n return;\n }\n while(!stackIn.isEmpty()){\n stackOut.push(stackIn.pop());\n }\n }\n}\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094513644","body":"想象成将原始数组和排序后的数组并列排在一起,切一刀。如果这刀的左侧两个数组的数字出现的频次相同,那么右侧的频次也一定相同。这里就是一个分割点。\n继续向右,有同样情况就切一刀。直到走到最后,一定会切最后一刀。记录的每一个分割点,就是分的组数。\n```java\nclass Solution {\n public int maxChunksToSorted(int[] arr) {\n Map map = new HashMap<>();\n int[] sortedArr = new int[arr.length];\n for(int i = 0;i < arr.length;i++){\n sortedArr[i] = arr[i];\n }\n Arrays.sort(sortedArr);\n\n int res = 0;\n for(int i = 0;i < arr.length;i++){\n map.put(arr[i],map.getOrDefault(arr[i],0) + 1);\n if(map.get(arr[i]) == 0){\n map.remove(arr[i]);\n }\n map.put(sortedArr[i],map.getOrDefault(sortedArr[i],0) - 1);\n if(map.get(sortedArr[i]) == 0){\n map.remove(sortedArr[i]);\n }\n if(map.isEmpty()){\n res++;\n }\n }\n return res;\n }\n}\n```\n因为存在sort排序,时间复杂度O(NlogN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095217604","body":"先将链表连成一个环,再找到需要断开的位置断开即可\n```java\nclass Solution {\n public ListNode rotateRight(ListNode head, int k) {\n if(head == null) return null;\n ListNode dummy = head;\n int count = 1;\n while(dummy.next != null){\n count++;\n dummy = dummy.next;\n }\n dummy.next = head;\n\n k = k % count;\n dummy = head;\n count = count - k;\n for(int i = 1;i < count;i++){\n dummy = dummy.next;\n }\n ListNode res = dummy.next;\n dummy.next = null;\n return res;\n }\n}\n```\n\n因为遍历了链表,时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100949135","body":"因为要交换两个节点,所以需要记录两个节点+两个节点前的节点+两个节点后的节点,一共四个节点。分别用cur,one,two,three记录\n交换完后,cur指向下一组需要交换节点的前一个节点\n```java\nclass Solution {\n public ListNode swapPairs(ListNode head) {\n ListNode dummy = new ListNode(0);\n dummy.next = head;\n ListNode cur = dummy;\n ListNode one = null;\n ListNode two = null;\n ListNode three = null;\n while(cur.next != null && cur.next.next != null)\n {\n one = cur.next;\n two = cur.next.next;\n three = cur.next.next.next;\n cur.next = two;\n cur.next.next = one;\n cur.next.next.next = three;\n cur = cur.next.next;\n }\n return dummy.next;\n }\n}\n```\n遍历了链表,时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105789931","body":"考验的是二分查找和分治构建二叉树,中间大小的数构成root根节点,左侧的数组部分分治构成左节点,右侧的数组部分分治构成右节点。这里用的是链表,只需要额外增加一些链表的操作(getMid函数)。也可以将链表转化为数组,再构造,查找起来就很快。以空间换时间\n```java\nclass Solution {\n public TreeNode sortedListToBST(ListNode head) {\n ListNode dummy = head;\n int end = 0;\n while(head != null){\n end++;\n head = head.next;\n }\n\n return dfs(dummy,0,end);\n }\n\n public TreeNode dfs(ListNode head,int start,int end){\n if(start >= end) return null;\n int mid = start + (end - start) / 2;\n ListNode midNode = getMid(head,mid);\n TreeNode node = new TreeNode(midNode.val);\n node.left = dfs(head,start,mid);\n node.right = dfs(head,mid+1,end);\n\n return node;\n }\n \n public ListNode getMid(ListNode head,int mid){\n while(mid > 0){\n mid--;\n head = head.next;\n }\n return head;\n }\n}\n```\n时间复杂度O(NlogN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111943009","body":"两个指针从head出发同时往前移动,当某一个指针指向null的时候,使其指向另一个head。直至两个指针相遇,该节点为相遇节点。直到相遇,第一个指针走了A+C+B的路程,另一个指针走了B+C+A的路程\n```java\npublic class Solution {\n public ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n ListNode A = headA;\n ListNode B = headB;\n while(A != B)\n {\n if(A == null) A = headB;\n else A = A.next;\n if(B == null) B = headA;\n else B = B.next;\n }\n return A;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116973002","body":"- 判断是否有环:两个快慢指针分别从头节点出发,慢指针一次走一格,快指针一次走两个,如果有环,则二者一定会在环内相遇,如果没环,则快指针会先到达null处。可以类比于跑步,跑得快的会套跑的慢的一圈\n- 判断环入口:快指针和慢指针相遇的时候,慢指针走了x+y步,快指针走了x+y+n*(y+z)步骤,n为圈数,大于等于1,如图所示,图片节选自代码随想录。因为快指针是慢指针的两倍速,所以2x+2y=x+y+n*(y+z)。化简后发现当n=1时,x=z,当n大于1时,x=z+(n-1)(y+z)。也就是说,头节点到环入口的距离等于z或z+多圈。因此,用两个指针,一个从头节点出发,一个从相遇节点出发,最终一定会相遇在环入口,无论第二个指针在环里绕了多少圈\n```java\npublic class Solution {\n public ListNode detectCycle(ListNode head) {\n ListNode fast = head;\n ListNode slow = head;\n while(fast != null && fast.next != null)\n {\n slow = slow.next;\n fast = fast.next.next;\n if(slow == fast){\n ListNode index1 = head;\n ListNode index2 = slow;\n while(index1 != index2)\n {\n index1 = index1.next;\n index2 = index2.next;\n }\n return index1;\n }\n }\n return null;\n }\n}\n```\n时间复杂度O(N) 空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121046113","body":"Java可以使用LinkedHashMap实现LRU,内置的函数就可以实现按插入顺序排列的hashmap,手动实现LinkedHashMap代码如下:\n```java\npublic class LRUCache {\n class DLinkedNode {\n int key;\n int value;\n DLinkedNode prev;\n DLinkedNode next;\n public DLinkedNode() {}\n public DLinkedNode(int _key, int _value) {key = _key; value = _value;}\n }\n\n private Map cache = new HashMap();\n private int size;\n private int capacity;\n private DLinkedNode head, tail;\n\n public LRUCache(int capacity) {\n this.size = 0;\n this.capacity = capacity;\n head = new DLinkedNode();\n tail = new DLinkedNode();\n head.next = tail;\n tail.prev = head;\n }\n\n public int get(int key) {\n DLinkedNode node = cache.get(key);\n if (node == null) {\n return -1;\n }\n moveToHead(node);\n return node.value;\n }\n\n public void put(int key, int value) {\n DLinkedNode node = cache.get(key);\n if (node == null) {\n DLinkedNode newNode = new DLinkedNode(key, value);\n cache.put(key, newNode);\n addToHead(newNode);\n ++size;\n if (size > capacity) {\n DLinkedNode tail = removeTail();\n cache.remove(tail.key);\n --size;\n }\n }\n else {\n node.value = value;\n moveToHead(node);\n }\n }\n\n private void addToHead(DLinkedNode node) {\n node.prev = head;\n node.next = head.next;\n head.next.prev = node;\n head.next = node;\n }\n\n private void removeNode(DLinkedNode node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n }\n\n private void moveToHead(DLinkedNode node) {\n removeNode(node);\n addToHead(node);\n }\n\n private DLinkedNode removeTail() {\n DLinkedNode res = tail.prev;\n removeNode(res);\n return res;\n }\n}\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123845190","body":"递归,每一层返回max(左子树深度,右子树深度)+1\n```java\nclass Solution {\n public int maxDepth(TreeNode root) {\n if (root == null) {\n return 0;\n }\n int leftDepth = maxDepth(root.left);\n int rightDepth = maxDepth(root.right);\n return Math.max(leftDepth, rightDepth) + 1;\n }\n}\n```\n层序遍历,使用队列。每遍历一层,深度+1,直到遍历到最下面一层\n\n```java\nclass Solution {\n public int maxDepth(TreeNode root) {\n if(root == null) return 0;\n Queue queue = new LinkedList<>();\n queue.add(root);\n int depth = 0;\n while(!queue.isEmpty())\n {\n int size = queue.size();\n for(int i = 0;i < size;i++){\n TreeNode node = queue.poll();\n if(node.left != null) queue.add(node.left);\n if(node.right != null) queue.add(node.right);\n }\n depth++;\n }\n\n return depth;\n }\n}\n```\n时间复杂度O(N) N为二叉树节点个数","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125223416","body":"先判断当前两个节点是否相同,如果不同,直接返回false。如果相同无法得出最终结论,需要递归进入下一层继续判断子树\n```java\nclass Solution {\n public boolean isSameTree(TreeNode p, TreeNode q) {\n if(p == null && q != null) return false;\n if(p != null && q == null) return false;\n if(p == null && q == null) return true;\n if(p.val != q.val) return false;\n\n boolean l = isSameTree(p.left,q.left);\n boolean r = isSameTree(p.right,q.right);\n\n return l && r;\n }\n}\n```\n时间复杂度O(N) N为树的节点数量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130457949","body":"回溯维护一个List,当递归到叶子节点时,List中保存的数字就是一路从root到当前根节点的所有数字。使用StringBbuilder拼接所有数字,即是当前路径表示的数字\n\n```java\nclass Solution {\n List path = new ArrayList<>();\n int res = 0;\n public int sumNumbers(TreeNode root) {\n path.add(root.val);\n recursion(root);\n return res;\n }\n\n public void recursion(TreeNode root){\n if(root.left == null && root.right == null){\n StringBuilder sb = new StringBuilder();\n for(int num : path){\n sb.append(num);\n }\n res += Integer.parseInt(sb.toString());\n return;\n }\n\n if(root.left != null){\n path.add(root.left.val);\n recursion(root.left);\n path.remove(path.size() - 1);\n }\n\n if(root.right != null){\n path.add(root.right.val);\n recursion(root.right);\n path.remove(path.size() - 1);\n }\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134853681","body":"层序遍历,记录每一层的最左侧的值,不断覆盖变量,最终记录的是最深一层的最左侧的值\n```java\nclass Solution {\n public int findBottomLeftValue(TreeNode root) {\n Queue queue = new LinkedList<>();\n queue.add(root);\n int res = 0;\n while(!queue.isEmpty())\n {\n int size = queue.size();\n for(int i = 0;i < size;i++){\n TreeNode node = queue.poll();\n if(i == 0){\n res = node.val;\n }\n if(node.left != null) queue.add(node.left);\n if(node.right != null) queue.add(node.right);\n }\n }\n\n return res;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138992061","body":"序列化时:前序遍历记录每个节点用逗号分开,空节点记为#\n反序列化:将序列化结果以逗号分开,存储进队列,用队列递归构造树\n```java\npublic class Codec {\n StringBuilder sb = new StringBuilder();\n int count = 1;\n\n public String serialize(TreeNode root) {\n if(root == null){\n sb.append(\"#\").append(\",\");\n return sb.toString();\n }\n\n sb.append(root.val).append(\",\");\n serialize(root.left);\n serialize(root.right);\n return sb.toString();\n }\n\n public TreeNode deserialize(String data) {\n Queue queue = new LinkedList<>();\n String[] pre = data.split(\",\");\n for(String s : pre){\n queue.offer(s);\n }\n return build(queue);\n }\n\n public TreeNode build(Queue queue){\n if(queue.isEmpty()) return null;\n String rootStringVal = queue.poll();\n if(rootStringVal.equals(\"#\")) return null;\n int rootVal = Integer.parseInt(rootStringVal);\n \n TreeNode root = new TreeNode(rootVal);\n root.left = build(queue);\n root.right = build(queue);\n\n return root;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3142198278","body":"遍历二叉树,记录一个三元组,分别表示列、行和节点的值。再按照要求进行排序,列升序,行升序,值升序。最后按规则放入List\n```java\nclass Solution {\n public List> verticalTraversal(TreeNode root) {\n List nodes = new ArrayList();\n dfs(root, 0, 0, nodes);\n Collections.sort(nodes, new Comparator() {\n public int compare(int[] tuple1, int[] tuple2) {\n if (tuple1[0] != tuple2[0]) {\n return tuple1[0] - tuple2[0];\n } else if (tuple1[1] != tuple2[1]) {\n return tuple1[1] - tuple2[1];\n } else {\n return tuple1[2] - tuple2[2];\n }\n }\n });\n List> ans = new ArrayList>();\n int size = 0;\n int lastcol = Integer.MIN_VALUE;\n for (int[] tuple : nodes) {\n int col = tuple[0], row = tuple[1], value = tuple[2];\n if (col != lastcol) {\n lastcol = col;\n ans.add(new ArrayList());\n size++;\n }\n ans.get(size - 1).add(value);\n }\n return ans;\n }\n\n public void dfs(TreeNode node, int row, int col, List nodes) {\n if (node == null) {\n return;\n }\n nodes.add(new int[]{col, row, node.val});\n dfs(node.left, row + 1, col - 1, nodes);\n dfs(node.right, row + 1, col + 1, nodes);\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146508830","body":"先将数组中所有值和其对应索引存入hashmap,再遍历一遍数组,如果遍历到的num对应的target-num在map中,即是找到的两个索引。注意要避免一个数算两次\n```java\nclass Solution {\n public int[] twoSum(int[] nums, int target) {\n Map map = new HashMap<>();\n for(int i = 0;i < nums.length;i++){\n map.put(nums[i],i);\n }\n\n for(int i = 0;i < nums.length;i++){\n if(map.containsKey(target - nums[i]) && map.get(target - nums[i]) != i){\n int[] res = new int[2];\n res[0] = i;\n res[1] = map.get(target - nums[i]);\n return res;\n }\n }\n return null;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148286271","body":"遍历数组,先用hashmap记录每个数字出现的次数。用优先队列定义好排序规则,将map中的内容放入优先队列中,再按照要求从队列中取\n```java\nclass Solution {\n public int[] topKFrequent(int[] nums, int k) {\n Map map = new HashMap<>();\n for(int num : nums){\n map.put(num,map.getOrDefault(num,0)+1);\n }\n PriorityQueue p = new PriorityQueue<>((a,b) -> (b[1]-a[1]));\n for(Map.Entry m : map.entrySet()){\n p.add(new int[]{m.getKey(),m.getValue()});\n }\n int[] result = new int[k];\n for(int i = 0;i < k;i++){\n result[i] = p.poll()[0];\n }\n return result;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149131512","body":"二层遍历,第一层遍历i,第二层遍历,使用map记录每个元组与第一层的i的距离dis出现的次数time。最终由i组成的回旋镖数量为time*(time-1)\n```java\nclass Solution {\n public int numberOfBoomerangs(int[][] points) {\n int res = 0;\n for(int[] a : points){\n Map map = new HashMap<>();\n for(int[] b : points){\n int dis = (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]);\n map.put(dis,map.getOrDefault(dis,0) + 1);\n }\n for(int key : map.keySet()){\n int val = map.get(key);\n res += val * (val - 1);\n }\n }\n return res;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153104469","body":"滑动窗口,定义left指针和right指针,两个指针窗口内即是符合题目要求的子串。不断向右移right指针,如果窗口内的子串不符合题目要求了,就右移left指针缩小窗口直到符合题目要求。\n在遍历过程中,记录窗口长度最大值\n使用hashSet判断窗口内是否符合题目要求\n```java\nclass Solution {\n public int lengthOfLongestSubstring(String s) {\n Set set = new HashSet<>();\n int left = 0;\n int res = 0;\n for(int right = 0;right < s.length();right++){\n char c = s.charAt(right);\n while(set.contains(c)){\n set.remove(s.charAt(left));\n left++;\n }\n\n set.add(c);\n res = Math.max(res,right - left + 1); \n }\n return res;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3157250607","body":"滑动窗口\n```java\nclass Solution {\n public List findSubstring(String s, String[] words) {\n int wordLen = words[0].length(); \n int windowLen = wordLen * words.length; \n\n Map targetCnt = new HashMap<>();\n for (String w : words) {\n targetCnt.put(w,targetCnt.getOrDefault(w,0) + 1);\n }\n\n List ans = new ArrayList<>();\n for (int start = 0; start < wordLen; start++) {\n Map cnt = new HashMap<>();\n int overload = 0;\n for (int right = start + wordLen; right <= s.length(); right += wordLen) {\n String inWord = s.substring(right - wordLen, right);\n if (cnt.getOrDefault(inWord, 0).equals(targetCnt.getOrDefault(inWord, 0))) {\n overload++;\n }\n cnt.merge(inWord, 1, Integer::sum); \n\n int left = right - windowLen;\n if (left < 0) { \n continue;\n }\n if (overload == 0) {\n ans.add(left);\n }\n\n String outWord = s.substring(left, left + wordLen);\n cnt.merge(outWord, -1, Integer::sum); \n if (cnt.get(outWord).equals(targetCnt.getOrDefault(outWord, 0))) {\n overload--;\n }\n }\n }\n\n return ans;\n }\n}\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162563860","body":"前缀和\n```java\nclass Solution {\n public int minSubarray(int[] nums, int p) {\n int n = nums.length;\n int[] s = new int[n + 1];\n for (int i = 0; i < n; i++) {\n s[i + 1] = (s[i] + nums[i]) % p;\n }\n int x = s[n];\n if (x == 0) {\n return 0; \n }\n\n int ans = n;\n Map last = new HashMap<>();\n for (int i = 0; i <= n; i++) {\n last.put(s[i], i);\n int j = last.getOrDefault((s[i] - x + p) % p, -n);\n ans = Math.min(ans, i - j);\n }\n return ans < n ? ans : -1;\n }\n}\n\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170443755","body":"双指针,慢指针用于存数字,快指针用于检验数字是否重复\n```java\nclass Solution {\n public int removeDuplicates(int[] nums) {\n if(nums.length == 1) return 1;\n int slow = 0;\n for(int fast = 1;fasttarget){\n right = middle;\n }else if(nums[middle] queue;\n public MyQueue(){\n queue = new LinkedList<>();\n } \n\n public void add(int val){\n while(!queue.isEmpty() && val > queue.getLast()){\n queue.removeLast();\n }\n queue.add(val);\n }\n\n public void poll(int val){\n if(queue.peek() == val){\n queue.poll();\n }\n }\n\n public int max(){\n return queue.peek();\n }\n}\n```\n时间复杂度O(nlogn)\n优先队列插入的复杂度是logn","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3177951924","body":"两个数组计算每个人的入度和出度\n```java\nclass Solution {\n public int findJudge(int n, int[][] trust) {\n int[] inDegrees = new int[n + 1];\n int[] outDegrees = new int[n + 1];\n for (int[] edge : trust) {\n int x = edge[0], y = edge[1];\n ++inDegrees[y];\n ++outDegrees[x];\n }\n for (int i = 1; i <= n; ++i) {\n if (inDegrees[i] == n - 1 && outDegrees[i] == 0) {\n return i;\n }\n }\n return -1;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182597716","body":"染色法,如果染色过程冲突,则无法实现、返回false\n```java\nclass Solution {\n boolean[] visited;\n boolean[] color;\n boolean flag = false;\n public boolean possibleBipartition(int n, int[][] dislikes) {\n List[] graph = build(dislikes,n);\n visited = new boolean[graph.length];\n color = new boolean[graph.length];\n for(int i = 1;i < graph.length;i++){\n if(visited[i] == false){\n traverse(graph,i);\n }\n }\n return !flag;\n }\n\n public List[] build(int[][] dislikes,int n){\n List[] graph = new List[n + 1];\n for(int i = 0;i < n + 1;i++){\n graph[i] = new LinkedList<>();\n }\n\n for(int[] edge : dislikes){\n int x = edge[0];\n int y = edge[1];\n graph[x].add(y);\n graph[y].add(x);\n }\n return graph;\n }\n\n public void traverse(List[] graph,int s){\n if(flag) return;\n visited[s] = true;\n for(int x : graph[s]){\n if(visited[x] == false){\n color[x] = !color[s];\n traverse(graph,x);\n }else{\n if(color[x] == color[s]) flag = true;\n }\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186848399","body":"拓扑排序\n```java\nclass Solution {\n public int[] sortItems(int n, int m, int[] group, List> beforeItems) {\n List> groupItem = new ArrayList>();\n for (int i = 0; i < n + m; ++i) {\n groupItem.add(new ArrayList());\n }\n\n // 组间和组内依赖图\n List> groupGraph = new ArrayList>();\n for (int i = 0; i < n + m; ++i) {\n groupGraph.add(new ArrayList());\n }\n List> itemGraph = new ArrayList>();\n for (int i = 0; i < n; ++i) {\n itemGraph.add(new ArrayList());\n }\n\n // 组间和组内入度数组\n int[] groupDegree = new int[n + m];\n int[] itemDegree = new int[n];\n \n List id = new ArrayList();\n for (int i = 0; i < n + m; ++i) {\n id.add(i);\n }\n\n int leftId = m;\n // 给未分配的 item 分配一个 groupId\n for (int i = 0; i < n; ++i) {\n if (group[i] == -1) {\n group[i] = leftId;\n leftId += 1;\n }\n groupItem.get(group[i]).add(i);\n }\n // 依赖关系建图\n for (int i = 0; i < n; ++i) {\n int curGroupId = group[i];\n for (int item : beforeItems.get(i)) {\n int beforeGroupId = group[item];\n if (beforeGroupId == curGroupId) {\n itemDegree[i] += 1;\n itemGraph.get(item).add(i); \n } else {\n groupDegree[curGroupId] += 1;\n groupGraph.get(beforeGroupId).add(curGroupId);\n }\n }\n }\n\n // 组间拓扑关系排序\n List groupTopSort = topSort(groupDegree, groupGraph, id); \n if (groupTopSort.size() == 0) {\n return new int[0];\n }\n int[] ans = new int[n];\n int index = 0;\n // 组内拓扑关系排序\n for (int curGroupId : groupTopSort) {\n int size = groupItem.get(curGroupId).size();\n if (size == 0) {\n continue;\n }\n List res = topSort(itemDegree, itemGraph, groupItem.get(curGroupId));\n if (res.size() == 0) {\n return new int[0];\n }\n for (int item : res) {\n ans[index++] = item;\n }\n }\n return ans;\n }\n\n public List topSort(int[] deg, List> graph, List items) {\n Queue queue = new LinkedList();\n for (int item : items) {\n if (deg[item] == 0) {\n queue.offer(item);\n }\n }\n List res = new ArrayList();\n while (!queue.isEmpty()) {\n int u = queue.poll(); \n res.add(u);\n for (int v : graph.get(u)) {\n if (--deg[v] == 0) {\n queue.offer(v);\n }\n }\n }\n return res.size() == items.size() ? res : new ArrayList();\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190861492","body":"模拟机器人移动\n```java\nclass Solution {\n public boolean judgeCircle(String moves) {\n int x = 0, y = 0;\n int length = moves.length();\n for (int i = 0; i < length; i++) {\n char move = moves.charAt(i);\n if (move == 'U') {\n y--;\n } else if (move == 'D') {\n y++;\n } else if (move == 'L') {\n x--;\n } else if (move == 'R') {\n x++;\n }\n }\n return x == 0 && y == 0;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193745750","body":"模拟\n```java\nclass Solution {\n public int[] getOrder(int[][] ts) {\n int n = ts.length;\n // 将 ts 转存成 nts,保留任务编号\n int[][] nts = new int[n][3];\n for (int i = 0; i < n; i++) nts[i] = new int[]{ts[i][0], ts[i][1], i};\n // 根据任务入队时间进行排序\n Arrays.sort(nts, (a,b)->a[0]-b[0]);\n // 根据题意,先按照「持续时间」排序,再根据「任务编号」排序\n PriorityQueue q = new PriorityQueue<>((a,b)->{\n if (a[1] != b[1]) return a[1] - b[1];\n return a[2] - b[2];\n });\n int[] ans = new int[n];\n for (int time = 1, j = 0, idx = 0; idx < n; ) {\n \t// 如果当前任务可以添加到「队列」中(满足入队时间)则进行入队\n while (j < n && nts[j][0] <= time) q.add(nts[j++]);\n if (q.isEmpty()) {\n\t // 如果当前「队列」没有任务,直接跳到下个任务的入队时间\n time = nts[j][0];\n } else {\n \t// 如果有可执行任务的话,根据优先级将任务出队(记录下标),并跳到该任务完成时间点\n int[] cur = q.poll();\n ans[idx++] = cur[2];\n time += cur[1];\n }\n }\n return ans;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194379645","body":"转化为分钟\n```java\nclass Solution {\n public int numberOfRounds(String loginTime, String logoutTime) {\n int loginHour = Integer.parseInt(loginTime.substring(0, 2));\n int loginMinute = Integer.parseInt(loginTime.substring(3));\n int logoutHour = Integer.parseInt(logoutTime.substring(0, 2));\n int logoutMinute = Integer.parseInt(logoutTime.substring(3));\n int loginTotalMinute = loginHour * 60 + loginMinute;\n int logoutTotalMinute = logoutHour * 60 + logoutMinute;\n if (loginTotalMinute > logoutTotalMinute) {\n logoutTotalMinute += 1440;\n }\n if (loginTotalMinute % 15 != 0) {\n loginTotalMinute += 15 - loginTotalMinute % 15;\n }\n logoutTotalMinute -= logoutTotalMinute % 15;\n return Math.max((logoutTotalMinute - loginTotalMinute) / 15, 0);\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3195332635","body":"分别模拟三个情况\n```java\nclass Solution {\n public int minCharacters(String a, String b) {\n int n = a.length(), m = b.length(), ans = 0x3f3f3f3f;\n int[] c1 = new int[26], c2 = new int[26];\n for (char c : a.toCharArray()) c1[c - 'a']++;\n for (char c : b.toCharArray()) c2[c - 'a']++;\n for (int i = 0; i < 26 && ans != 0; i++) {\n // 3\n int ca = n - c1[i], cb = m - c2[i];\n ans = Math.min(ans, ca + cb);\n if (i == 0) continue;\n int r1 = 0, r2 = 0;\n // 1\n for (int j = i; j < 26; j++) r1 += c1[j];\n for (int j = 0; j < i; j++) r1 += c2[j];\n // 2\n for (int j = i; j < 26; j++) r2 += c2[j];\n for (int j = 0; j < i; j++) r2 += c1[j];\n ans = Math.min(ans, Math.min(r1, r2));\n }\n return ans;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199298563","body":"归并排序\n\n```java\nclass Solution {\n public int[] sortArray(int[] nums) {\n sort(nums,0,nums.length - 1);\n return nums;\n }\n\n public void sort(int[] nums,int start,int end){\n if(start >= end) return;\n int p = para(nums,start,end);\n\n sort(nums,start,p - 1);\n sort(nums,p + 1,end);\n }\n\n public int para(int[] nums,int l,int h){\n\n int x = nums[l];\n int i = l,j = h;\n while(i < j)\n {\n while(i < j && nums[j] >= x) j--;\n if(i < j) nums[i++] = nums[j];\n\n while(i < j && nums[i] < x) i++;\n if(i < j) nums[j--] = nums[i];\n }\n\n nums[i] = x;\n return i;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204106258","body":"二分查找\n```java\nclass Solution {\n public int mySqrt(int x) {\n if(x == 0) return 0;\n if(x == 1) return 1;\n int left = 0;\n int right = x;\n while(left < right)\n {\n int middle = left + (right - left) / 2;\n if(middle > x / middle){\n right = middle;\n }else if(middle < x / middle){\n left = middle + 1;\n }else{\n return middle;\n }\n }\n if(right == x / right){\n return right;\n }else{\n return right - 1;\n }\n\n \n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208985528","body":"二分查找\n```java\npublic class Solution extends VersionControl {\n public int firstBadVersion(int n) {\n int left = 1, right = n;\n while (left < right) { \n int mid = left + (right - left) / 2; \n if (isBadVersion(mid)) {\n right = mid; \n } else {\n left = mid + 1; \n }\n }\n return left;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3213255556","body":"```java\nclass Solution {\n public int reversePairs(int[] nums) {\n if (nums.length == 0) {\n return 0;\n }\n return reversePairsRecursive(nums, 0, nums.length - 1);\n }\n\n public int reversePairsRecursive(int[] nums, int left, int right) {\n if (left == right) {\n return 0;\n } else {\n int mid = (left + right) / 2;\n int n1 = reversePairsRecursive(nums, left, mid);\n int n2 = reversePairsRecursive(nums, mid + 1, right);\n int ret = n1 + n2;\n\n // 首先统计下标对的数量\n int i = left;\n int j = mid + 1;\n while (i <= mid) {\n while (j <= right && (long) nums[i] > 2 * (long) nums[j]) {\n j++;\n }\n ret += j - mid - 1;\n i++;\n }\n\n // 随后合并两个排序数组\n int[] sorted = new int[right - left + 1];\n int p1 = left, p2 = mid + 1;\n int p = 0;\n while (p1 <= mid || p2 <= right) {\n if (p1 > mid) {\n sorted[p++] = nums[p2++];\n } else if (p2 > right) {\n sorted[p++] = nums[p1++];\n } else {\n if (nums[p1] < nums[p2]) {\n sorted[p++] = nums[p1++];\n } else {\n sorted[p++] = nums[p2++];\n }\n }\n }\n for (int k = 0; k < sorted.length; k++) {\n nums[left + k] = sorted[k];\n }\n return ret;\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216192351","body":"```java\nclass Solution {\n public int findRadius(int[] houses, int[] heaters) {\n int ans = 0;\n Arrays.sort(heaters);\n for (int house : houses) {\n int i = binarySearch(heaters, house);\n int j = i + 1;\n int leftDistance = i < 0 ? Integer.MAX_VALUE : house - heaters[i];\n int rightDistance = j >= heaters.length ? Integer.MAX_VALUE : heaters[j] - house;\n int curDistance = Math.min(leftDistance, rightDistance);\n ans = Math.max(ans, curDistance);\n }\n return ans;\n }\n\n public int binarySearch(int[] nums, int target) {\n int left = 0, right = nums.length - 1;\n if (nums[left] > target) {\n return -1;\n }\n while (left < right) {\n int mid = (right - left + 1) / 2 + left;\n if (nums[mid] > target) {\n right = mid - 1;\n } else {\n left = mid;\n }\n }\n return left;\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"falsity":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073705405","body":"# 思路\n\n从低位往高位计算, 每次计算保留进位数据,本位留下余数\n\n```python\nclass Solution(object):\n def addToArrayForm(self, num, k):\n \"\"\"\n :type num: List[int]\n :type k: int\n :rtype: List[int]\n \"\"\"\n result = []\n i = len(num) - 1\n while i >=0 or k > 0:\n if i >= 0:\n k += num[i]\n i -= 1\n result.append(k % 10)\n k = k // 10\n return result[::-1]\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3079013152","body":"# 【Day 2】821. 字符的最短距离\n\n## 思路\n\n先遍历一遍获取c的位置列表, 再遍历每个位置计算最近的距离\n\n```python\nclass Solution(object):\n def shortestToChar(self, s, c):\n \"\"\"\n :type s: str\n :type c: str\n :rtype: List[int]\n \"\"\"\n locations = []\n result = []\n for i, char in enumerate(s):\n if char == c:\n locations.append(i)\n \n for i in range(len(s)):\n shortest = min(abs(i - location) for location in locations)\n result.append(shortest)\n return result\n```\n\n时间复杂度: O(n*m), m为字符c出现次数,最差为O(n^2)\n\n空间复杂度: O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084580543","body":"**【Day 3】1381. 设计一个支持增量操作的栈**\n\n*** 思路***\n\n用数组模拟栈\n\n```python\nclass CustomStack(object):\n\n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def __init__(self, maxSize):\n \"\"\"\n :type maxSize: int\n \"\"\"\n self.stack = [0] * maxSize\n self.top = -1\n \n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n if self.top < len(self.stack) - 1:\n self.top += 1\n self.stack[self.top] = x\n \n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if self.top == -1:\n return -1\n value = self.stack[self.top]\n self.top -= 1\n return value\n \n # 时间复杂度: O(k)\n # 空间复杂度: O(n)\n def increment(self, k, val):\n \"\"\"\n :type k: int\n :type val: int\n :rtype: None\n \"\"\"\n lim = min(k, self.top + 1)\n for i in range(lim):\n self.stack[i] += val\n \n\n\n# Your CustomStack object will be instantiated and called as such:\n# obj = CustomStack(maxSize)\n# obj.push(x)\n# param_2 = obj.pop()\n# obj.increment(k,val)\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089882117","body":"**【Day 4】394. 字符串解码**\n\n**思路**\n\n参照[Krahets的字符串解码题解](https://leetcode.cn/problems/decode-string/solutions/19447/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd/)中的辅助栈解法,利用栈来存储每一层[]中的字符串和需要重复的次数逐层拼接字符串,最后得到结果.\n\n**代码**\n\n```python\nclass Solution(object):\n def decodeString(self, s):\n \"\"\"\n :type s: str\n :rtype: str\n \"\"\"\n stack, res, multi = [], \"\", 0\n for c in s:\n if c == '[':\n stack.append([multi, res])\n res, multi = \"\", 0\n elif c == ']':\n cur_multi, last_res = stack.pop()\n res = last_res + cur_multi * res\n elif '0' <= c <= '9':\n multi = multi * 10 + int(c)\n else:\n res += c\n return res \n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(N)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092420487","body":"**【Day 5】232. 用栈实现队列**\n\n**思路**\n\n利用栈先进后出的性质,通过stack1完成元素的倒序放置,再将stack1的元素放入stack2中,前面的元素就放在了栈顶. 此时经过两次入栈出栈的操作stack2中的元素就满足了先进先出的要求.\n\n但是要注意以下问题:\n\n1. 只有在stack2中元素为空时才能将stack1中的元素放入stack2中,这样才能保证有序性\n2. 遍历list元素要使用while, 不能用for,否则会有元素被跳过\n\n**代码**\n\n```python\nclass MyQueue(object):\n\n def __init__(self):\n self.stack1, self.stack2 = [], []\n \n\n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n self.stack1.append(x)\n \n\n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n res = self.peek()\n return self.stack2.pop()\n \n\n def peek(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if self.stack2:\n return self.stack2[-1]\n elif self.stack1:\n while self.stack1:\n self.stack2.append(self.stack1.pop())\n return self.stack2[-1]\n else:\n return -1\n \n\n def empty(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n return not self.stack1 and not self.stack2\n \n\n\n# Your MyQueue object will be instantiated and called as such:\n# obj = MyQueue()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.peek()\n# param_4 = obj.empty()\n```\n\n**复杂度分析**\n\n时间复杂度: push, empty 是O(1), pop, peek是O(N)\n空间复杂度: O(N)\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097331008","body":"**【Day 7】61. 旋转链表**\n\n**思路**\n\nk可能会大于链表长度导致循环遍历链表. 所以真实的旋转偏移是k%n,n为链表长度. 使用双指针找到需要断开的节点位置,将链表进行断开和重新拼接即可得到结果\n\n```pyth\nclass Solution(object):\n def rotateRight(self, head, k):\n \"\"\"\n :type head: Optional[ListNode]\n :type k: int\n :rtype: Optional[ListNode]\n \"\"\"\n if k == 0 or not head or not head.next:\n return head\n\n node = head\n l = 0\n while node:\n l += 1\n node = node.next\n \n if k % l == 0:\n return head\n k = k % l\n slow = fast = head\n for i in range(k):\n fast = fast.next\n \n while fast.next:\n slow = slow.next\n fast = fast.next\n\n new_head = slow.next\n slow.next = None\n fast.next = head\n return new_head\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103411213","body":"**【Day 8】24. 两两交换链表中的节点**\n\n**思路**\n\n类似于反转链表, 用两个指针来对链表指向进行修改,唯一的区别是cur需要间隔一个进行遍历,而不是逐个遍历\n\n```python\nclass Solution(object):\n def swapPairs(self, head):\n \"\"\"\n :type head: Optional[ListNode]\n :rtype: Optional[ListNode]\n \"\"\"\n dummy = ListNode()\n dummy.next = head\n pre = dummy\n cur = head\n while cur and cur.next:\n nxt = cur.next\n cur.next = nxt.next\n nxt.next = cur\n pre.next = nxt\n pre = cur\n cur = cur.next\n \n return dummy.next\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109176294","body":"**【Day 9】109. 有序链表转换二叉搜索树**\n\n**思路**\n\n首先获取链表的长度,再根据二叉树的中序遍历方式递归构建BST, 根节点的值在遍历完左子树后刚好移动了m次到达中间节点,即根节点位置\n\n\n\n```python\nclass Solution:\n def sortedListToBST(self, head: Optional[ListNode]) -> Optional[TreeNode]:\n def getLength(head: ListNode) -> int:\n count = 0\n while head:\n count += 1\n head = head.next\n return count\n\n def buildBST(left: int, right: int) -> TreeNode:\n if left > right:\n return None\n m = (left + right) // 2\n root = TreeNode()\n left_node = buildBST(left, m - 1)\n nonlocal head\n root.val = head.val\n head = head.next\n \n right_node = buildBST(m+1, right)\n root.left = left_node\n root.right = right_node\n return root\n\n l = getLength(head)\n return buildBST(0, l - 1)\n```\n\n**复杂度分析**\n\n时间复杂度: O(n)\n空间复杂度: O(log n)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3122088595","body":"**【Day 12】146. LRU 缓存机制**\n\n**思路**\n\n`get` 和 `put` 必须以 `O(1)` 的平均时间复杂度运行, 说明需要使用到map. 需要记录关键字使用过的顺序需要使用到链表\n\nget方法需要查询map, 如果key存在则返回值,如果不存在则返回-1. 查询完成后,需要把该节点移动到队首(删除后再插入队首)\n\nput方法需要先查询map容量,如果容量已满,需要通过list找到队尾元素删除, 并将新元素插入队首\n\nnode需要知道前后节点,所以使用双向链表,map和node之间建立映射方便查询数据\n\n\n\n需要的内部函数: 删除元素, 将元素插入队首\n\n```python\nclass LRUCache:\n class Node:\n def __init__(self, key: int, val: int):\n self.key = key\n self.val = val\n self.pre = pre\n self.next = next\n\n def __init__(self, capacity: int):\n self.capacity = capacity\n self.dummy = self.Node(-1, -1)\n self.dummy.pre = self.dummy\n self.dummy.next = self.dummy\n self.map = {}\n\n def add_node_to_head(self, node: Node):\n node.pre = self.dummy\n node.next = self.dummy.next\n self.dummy.next.pre = node\n self.dummy.next = node\n\n def remove_node(self, node: Node):\n node.pre.next = node.next\n node.next.pre = node.pre\n\n def get(self, key: int) -> int:\n if key not in self.map:\n return -1\n\n node = self.map[key]\n self.remove_node(node)\n self.add_node_to_head(node)\n return node.val\n\n def put(self, key: int, value: int) -> None:\n if key in self.map:\n node = self.map[key]\n node.val = value\n self.remove_node(node)\n self.add_node_to_head(node)\n return\n\n new_node = self.Node(key, value)\n self.map[key] = new_node\n self.add_node_to_head(new_node)\n\n if len(self.map) > self.capacity:\n tail = self.dummy.pre\n del self.map[tail.key]\n self.remove_node(tail)\n\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124440801","body":"**【Day 13】104. 二叉树的最大深度**\n\n**思路**\n\n二叉树的最大深度为max(左子树深度, 右子树深度) + 1, 这就变成了一个递归问题\n\n```python\nclass Solution(object):\n def maxDepth(self, root):\n \"\"\"\n :type root: Optional[TreeNode]\n :rtype: int\n \"\"\"\n if root is None:\n return 0\n if root is not None and root.left is None and root.right is None:\n return 1\n return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1\n\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127200969","body":"**【Day 14】100. 相同的树**\n\n**思路**\n\n相同的树一定根节点相同,并且左子树和右子树都相同, 可以进行递归判断所有子树是否相同\n\n```python\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if p is None or q is None:\n return p is q\n \n if p.val == q.val:\n return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)\n else:\n return False\n```\n\n**复杂度分析**\n\n时间复杂度: O(min(m,n)) m为p节点个数,n为q节点个数\n空间复杂度: O(min(m,n)) m为p节点个数,n为q节点个数","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136787502","body":"**【Day 16】513. 找树左下角的值**\n\n**思路**\n\n从右往左层序遍历,最后一个节点就是左下角的点\n\n```python\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n q = deque([root])\n while q:\n node = q.popleft()\n if node.right: q.append(node.right)\n if node.left: q.append(node.left)\n return node.val\n```\n\n**复杂度分析**\n\n时间复杂度: O(n) \n空间复杂度: O(n)\n\n","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3151014729","body":"**【Day 21】447. 回旋镖的数量**\n\n**思路**\n\n首先计算距离相等的点的数量,在计算相同距离点之间的排列组合数量\n\n```python\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n res = 0\n n = len(points)\n if n < 3:\n return 0\n \n for i in range(n):\n x0, y0 = points[i]\n dist_count = {}\n \n for j in range(n):\n if i == j:\n continue\n \n x1, y1 = points[j]\n dx = x1 - x0\n dy = y1 - y0\n dist_sq = dx * dx + dy * dy\n \n dist_count[dist_sq] = dist_count.get(dist_sq, 0) + 1\n \n for cnt in dist_count.values():\n res += cnt * (cnt - 1)\n \n return res\n```\n\n时间复杂度: O(n ^ 2)\n\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3175046868","body":"**【Day 28】239. 滑动窗口最大值**\n\n```python\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n n = len(nums)\n if n == 0 or k == 0:\n return []\n \n res = []\n q = deque() \n for i in range(n):\n while q and q[0] < i - k + 1:\n q.popleft()\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n if i >= k - 1:\n res.append(nums[q[0]])\n return res\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3179722453","body":"\n\n```python\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n in_list = [0] * (n + 1)\n out_list = [0] * (n + 1)\n for i in trust:\n in_list[i[1]] += 1\n out_list[i[0]] += 1\n\n for i in range(1, n+1):\n if in_list[i] == n - 1 and out_list[i] == 0:\n return i\n\n return -1\n```\n\n时间复杂度: O(n + m), m为trust列表长度\n\n空间复杂度: O(n)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194443006","body":"```python\nclass Solution:\n def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:\n start = 60 * int(loginTime[:2]) + int(loginTime[3:])\n end = 60 * int(logoutTime[:2]) + int(logoutTime[3:])\n if start > end:\n end += 24 * 60\n start = math.ceil(start / 15) * 15\n end = end // 15 * 15\n return max(0, (end - start) // 15)\n```\n\n时间复杂度: O(1)\n\n空间复杂度: O(1)\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3200900420","body":"快排\n```java\n class Solution {\n public int[] sortArray(int[] nums) {\n quickSort(nums, 0, nums.length - 1);\n return nums;\n }\n\n private void quickSort(int[] nums, int low, int high){\n if(low < high){\n int mid = partition(nums, low, high);\n quickSort(nums, low, mid - 1);\n quickSort(nums, mid + 1, high);\n }\n }\n\n private int partition(int[] nums, int low, int high){\n int pivot = low + (int) (Math.random() * (high - low + 1));\n swap(nums, pivot, low);\n int i = low, j = low + 1;\n while (j <= high){\n if(nums[j] < nums[low]){\n swap(nums, j, ++i);\n }\n j++;\n }\n swap(nums, low, i);\n return i;\n }\n\n private void swap(int[] nums, int i, int j){\n int tmp = nums[i];\n nums[i] = nums[j];\n nums[j] = tmp;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3224529913","body":"思路: 采用定长滑动窗口的做法, 先初始化定长窗口,再移动更新结果\n\n```python\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n ans = count = 0\n vowels = set(['a', 'e', 'i', 'o', 'u'])\n chars = list(s)\n n = len(chars)\n left = right = 0\n while right < k:\n if chars[right] in vowels:\n count += 1\n right += 1\n ans = count\n while right < n:\n if chars[right] in vowels:\n count += 1\n if chars[left] in vowels:\n count -= 1\n ans = max(count, ans)\n left += 1\n right += 1\n return ans\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3228513919","body":"\n\n```java\nclass Solution {\n public double new21Game(int n, int k, int maxPts) {\n if( k > n){\n return 0;\n }\n if((k == 0 && n >= 0) && n > k + maxPts){\n return 1;\n }\n\n int len = k + maxPts;\n double[] dp = new double[len];\n double sum = 0;\n\n for(int i = k; i < len && i <= n; i++){\n dp[i] = 1;\n sum++;\n }\n\n for(int i = k - 1; i >= 0; i--){\n dp[i] = sum / maxPts;\n sum = sum - dp[i + maxPts] + dp[i];\n }\n return dp[0];\n }\n}\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(n)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3240213950","body":"**\n\n```python\nclass Solution:\n def readBinaryWatch(self, turnedOn: int) -> List[str]:\n ans = []\n for h in range(12):\n for m in range(60):\n if bin(h).count('1') + bin(m).count('1') == turnedOn:\n ans.append(f\"{h}:{m:02d}\")\n \n return ans\n```\n\n时间复杂度: O(1)\n\n空间复杂度: O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245665636","body":"\n\n```python\nclass Solution:\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n # 时间复杂度: O(mn)\n # 空间复杂度: O(mn)\n ans = 0\n m, n = len(grid), len(grid[0])\n\n def dfs(i: int, j: int) -> int:\n count = 1\n grid[i][j] = 0\n for x, y in (i-1, j), (i+1, j), (i, j-1), (i, j+1):\n if 0<= x < m and 0 <= y < n and grid[x][y]:\n count += dfs(x, y)\n return count\n\n for i, row in enumerate(grid):\n for j, x in enumerate(row):\n if x:\n ans = max(ans, dfs(i, j))\n\n return ans\n \n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3253854706","body":"\n```python\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n # 时间复杂度: O(n)\n # 空间复杂度: O(n)\n ans = 0\n q = initialBoxes\n while q:\n p = []\n for i in q:\n if status[i] == 0:\n p.append(i)\n continue\n ans += candies[i]\n for key in keys[i]:\n status[key] = 1\n for c in containedBoxes[i]:\n p.append(c)\n if p == q or not p:\n break\n q = p\n return ans\n```","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3271174778","body":"\n\n```java\nclass Solution {\n public int longestCommonSubsequence(String text1, String text2) {\n # 时间复杂度: O(mn)\n # 空间复杂度: O(mn)\n int m = text1.length(), n = text2.length();\n int[][] dp = new int[m+1][n+1];\n for (int i = 1; i <= m; i++) {\n char c1 = text1.charAt(i - 1);\n for (int j = 1; j <= n; j++) {\n char c2 = text2.charAt(j - 1);\n if (c1 == c2){\n dp[i][j] = dp[i - 1][j-1] + 1;\n }else{\n dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);\n }\n\n }\n }\n return dp[m][n];\n }\n}\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3275118967","body":"时间复杂度: O(m * n)\n\n空间复杂度: ~~O(n)~~ 题解指正行列可以交换, 所以为O(min(m, n))\n\n```python\nclass Solution:\n def uniquePaths(self, m: int, n: int) -> int:\n f = [1] * n\n\n for i in range(1, m):\n for j in range(1, n):\n f[j] += f[j - 1]\n return f[n - 1]\n \n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289638493","body":"```python\nclass Solution:\n def findTargetSumWays(self, nums: List[int], target: int) -> int:\n # 时间复杂度: O(n * target)\n # 空间复杂度: O(n * target)\n @cache\n def dfs(i: int, c: int) -> int:\n if i < 0:\n return 1 if c == 0 else 0\n \n return dfs(i - 1, c - nums[i]) + dfs(i - 1, c + nums[i])\n \n return dfs(len(nums) - 1, target)\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3298968000","body":"```python\nclass Solution:\n def change(self, amount: int, coins: List[int]) -> int:\n \t# 时间复杂度(n * amount)\n # 空间复杂度(amount)\n f = [1] + [0] * amount\n for x in coins:\n for c in range(x, amount + 1):\n f[c] += f[c - x]\n return f[-1]\n```","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316065059","body":"```python\nclass Solution:\n def mergeTwoLists(self, list1:Optional[ListNode], list2:Optional[ListNode]) -> Optional[ListNode]:\n cur = dummy = ListNode()\n while list1 and list2:\n if list1.val < list2.val:\n cur.next = list1\n list1 = list1.next\n else:\n cur.next = list2\n list2 = list2.next\n cur = cur.next\n cur.next = list1 if list1 else list2\n return dummy.next\n\n def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:\n # 时间复杂度: O(L * logm) m 为 lists 的长度,L 为所有链表的长度之和\n # 空间复杂度: O(1)\n m = len(lists)\n if m == 0:\n return None\n step = 1\n while step < m:\n for i in range(0, m - step, step * 2):\n lists[i] = self.mergeTwoLists(lists[i], lists[i + step])\n step *= 2\n return lists[0]\n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3334653673","body":"思路: 用Node来创建一个树, 每个node下面可以存下一个字母的node, 并且每个node有个end标志位,用来表示单词结尾\n\n```python\nclass Node:\n __slots__ = \"son\", \"end\"\n\n def __init__(self):\n self.son = {}\n self.end = False\n\n\nclass Trie:\n def __init__(self):\n self.root = Node()\n\n # 时间复杂度: O(n)\n def insert(self, word: str) -> None:\n cur = self.root\n for c in word:\n if c not in cur.son:\n cur.son[c] = Node()\n cur = cur.son[c]\n cur.end = True\n\n # 时间复杂度: O(n)\n def find(self, word: str) -> int:\n cur = self.root\n for c in word:\n if c not in cur.son:\n return 0\n cur = cur.son[c]\n return 2 if cur.end else 1\n \n # 时间复杂度: O(n)\n def search(self, word: str) -> bool:\n return self.find(word) == 2\n\n # 时间复杂度: O(n)\n def startsWith(self, prefix: str) -> bool:\n return self.find(prefix) != 0\n```\n\n空间复杂度: O(m * n) m为insert次数, n为单词长度","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuetong3yu":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073754281","body":"```js\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(nums, k) {\n let str1 = '', str2 = String(k)\n for(let i = 0; i < nums.length; i++) {\n str1 += nums[i];\n }\n // swap to make sure str1 is longer than str2\n if (str1.length < str2.length) {\n const t = str1;\n str1 = str2;\n str2 = t;\n }\n const res = new Array(str1.length).fill(0);\n let p1 = str1.length - 1, p2 = str2.length - 1;\n while(p1 >= 0) {\n res[p1] = Number(str1[p1]) + Number(str2[p2] ?? 0);\n p1 --, p2 --;\n }\n const len = res.length\n let need_shift = false\n for (let i = len - 1; i >= 0; i--) {\n if (res[i] >= 10) {\n if (i === 0) {\n need_shift = true\n } else {\n res[i - 1] = res[i - 1] + 1;\n }\n res[i] = res[i] % 10\n }\n }\n if (need_shift) res.unshift(1)\n return res;\n};\n```\n\n尝试了几个不同的方法。。。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078802551","body":"模拟题意AC,但感觉第二遍 for 循环没必要循环整个 indexes 数组,indexes 数组是天然有序的,应该可以用双指针优化\n\n```js\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const indexes = []\n for(let i = 0; i < s.length; i++) {\n if (s[i] === c) indexes.push(i);\n }\n const res = [];\n for(let i = 0; i < s.length; i++) {\n let min = Infinity\n for(let j = 0; j < indexes.length; j++) {\n min = Math.min(min, Math.abs(i - indexes[j]));\n }\n res.push(min)\n }\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082104676","body":"思路一直接模拟题意,increment 操作循环遍历一遍让元素自增:\n\n```js\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.stack = []\n this.size = 0\n this.maxSize = maxSize\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.size === this.maxSize) return;\n this.stack.push(x);\n this.size ++\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.size === 0) return -1\n const res = this.stack.pop();\n this.size --\n return res;\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n for(let i = 0; i < this.size;i ++) {\n if (i < k) {\n this.stack[i] += val;\n }\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n---\n\n\n思路二使用一个 hashmap 维护自增量,只有在 pop 操作的时候才去运算:\n\n```js\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.stack = []\n this.size = 0\n this.maxSize = maxSize\n this.map = {}\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.size === this.maxSize) return;\n this.stack.push(x);\n this.size ++\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.size === 0) return -1\n const inc = this.map[this.size - 1] || 0;\n const res = this.stack.pop();\n // update inc\n if (inc) {\n this.map[this.size - 1] = 0;\n this.map[this.size - 2] = this.map[this.size - 2] ? this.map[this.size - 2] + inc : inc;\n }\n this.size --\n\n return res + inc;\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n const key = Math.min(k - 1, this.size - 1);\n this.map[key] = this.map[key] ? this.map[key] + val : val;\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n🥲 结果跑出来只打败了 18% 的人,应该是题目给的数据量量太小了 <= 1000,操作 hashmap 的 cost 超过了循环 stack 的时间,不如方法一暴力循环。。。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089570929","body":"用栈秒了\n\n```js\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let i = 0;\n while(i < s.length) {\n const char = s[i];\n if (char !== ']') {\n stack.push(char)\n i ++\n } else {\n let repeatStr = ''\n while(stack[stack.length - 1] !== '[') {\n const new_char = stack.pop();\n repeatStr = new_char + repeatStr;\n }\n // pop '['\n stack.pop()\n // get number \n let repeat_times = ''\n while(/[0-9]/.test(stack[stack.length - 1])) {\n repeat_times = stack.pop() + repeat_times\n }\n repeat_times = Number(repeat_times)\n stack.push(repeatStr.repeat(repeat_times));\n i ++\n }\n }\n let res = ''\n while(stack.length) {\n res = stack.pop() + res;\n }\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091373955","body":"思路:用两个栈模拟操作,在 peek 的时候出第二个栈的顶部即可\n\n\n```js\nvar MyQueue = function() {\n this.a = [];\n this.b = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.a.push(x);\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n this.peek();\n return this.b.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if (this.b.length) {\n return this.b[this.b.length - 1]\n } else {\n while(this.a.length) {\n this.b.push(this.a.pop())\n }\n return this.peek()\n }\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return !this.a.length && !this.b.length\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094511265","body":"用了一个简单的前缀和 AC 了,时间复杂度也是 NlogN\n\n```js\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const sorted_arr = [...arr].sort((a, b) => a - b);\n let count_a = count_b = res = 0;\n\n for(let i = 0; i < arr.length;i ++) {\n count_a += sorted_arr[i];\n count_b += arr[i];\n\n if (count_a === count_b) res ++ \n }\n\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3096927980","body":"```js\nvar rotateRight = function(head, k) {\n if (!head || !head.next || k === 0) return head;\n\n // Count the length of the list\n let length = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n length++;\n }\n\n // Normalize k\n k %= length;\n if (k === 0) return head;\n\n // Find the new tail: (length - k - 1)th node\n let newTail = head;\n for (let i = 0; i < length - k - 1; i++) {\n newTail = newTail.next;\n }\n\n // Rotate\n let newHead = newTail.next;\n newTail.next = null;\n tail.next = head;\n\n return newHead;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100186608","body":"考察交换链表节点的基本操作,需要注意的是“什么时候使用 dummy 节点”的技巧。我的理解是在需要涉及到头节点操作的时候,就创建 dummy 节点。比如这一题 - 交换头两个节点的时候就会涉及到头节点的变更。\n\n\n```js\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n const dummy = new ListNode(null, head);\n let p = dummy;\n while(p.next && p.next.next) {\n const p1 = p.next, p2 = p.next.next;\n p.next = p2;\n p1.next = p2.next;\n p2.next = p1;\n p = p1\n }\n return dummy.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3108866758","body":"Same solution with Problem108. But this problem is giving List instead plain array. So will need to use the trick of two pointers to get the mid node of a Single List.\n\n```js\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if (!head) return null\n return helper(head, null)\n\n function helper(head, tail) {\n if (head === tail) return null;\n let fast = head;\n let slow = head;\n while(fast !== tail && fast.next !== tail) {\n fast = fast.next.next;\n slow = slow.next;\n }\n const root = new TreeNode(slow.val);\n root.left = helper(head, slow);\n root.right = helper(slow.next, tail);\n return root\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111667789","body":"A small trick here is `pa !== pb` and `return pa`. For negative scenarios, if given Lists were not intersected, then one of the Lists must be pointing to `null`, and then returning `null` is expected answer. \n\n```js\nvar getIntersectionNode = function(headA, headB) {\n let pa = headA, pb = headB;\n while(pa !== pb) {\n pa = pa ? pa.next : headB;\n pb = pb ? pb.next : headA;\n }\n return pa\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3115364562","body":"Find the intersection node first, and move the slow pointer to the head, and slowly move both of the pointers till they meet each other(can be proved)\n\n```js\nvar detectCycle = function(head) {\n if (!head) return head;\n let fast = head, slow = head;\n // step1: find the intersection node\n while(fast && fast.next) {\n fast = fast.next.next;\n slow = slow.next;\n // step2: find the entry of the cycle\n if (fast === slow) {\n slow = head;\n while(fast !== slow) {\n fast = fast.next\n slow = slow.next\n }\n return slow;\n }\n }\n return null;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3120830111","body":"In JS, we need to build a double linked list data structure by our own. The rest of the logic is quite straight forward - which use hashmap to save key-node, and use linked list to store access frequency. \n\n```js\nclass DoubleLinkedListNode {\n constructor(key, value) {\n this.key = key;\n this.value = value;\n this.prev = null;\n this.next = null;\n }\n}\n\nclass LRUCache {\n constructor(capacity) {\n this.capacity = capacity;\n this.usedSpace = 0;\n\n this.hashmap = {};\n this.dummyHead = new DoubleLinkedListNode(null, null);\n this.dummyTail = new DoubleLinkedListNode(null, null);\n this.dummyHead.next = this.dummyTail;\n this.dummyTail.prev = this.dummyHead;\n }\n\n _isFull() {\n return this.usedSpace === this.capacity;\n }\n _addToHead(node) {\n const currentHead = this.dummyHead.next;\n\n node.next = currentHead;\n node.prev = this.dummyHead;\n currentHead.prev = node;\n this.dummyHead.next = node;\n\n return node;\n }\n _removeNode(node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n node.next = null\n node.prev = null\n return node\n }\n\n get(key) {\n if (this.hashmap[key] !== undefined) {\n const node = this.hashmap[key];\n this._addToHead(this._removeNode(node));\n return node.value\n } else {\n return -1\n }\n }\n put(key, value) {\n if (this.hashmap[key] !== undefined) {\n const node = this.hashmap[key];\n node.value = value;\n this._addToHead(this._removeNode(node))\n } else {\n if (this._isFull()) {\n const nodeNeedToEvict = this.dummyTail.prev;\n delete this.hashmap[nodeNeedToEvict.key];\n this._removeNode(nodeNeedToEvict);\n this.usedSpace --\n }\n const node = new DoubleLinkedListNode(key, value);\n this.hashmap[key] = node;\n this._addToHead(node);\n this.usedSpace ++\n }\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123671763","body":"Easy\n\n```js\nvar maxDepth = function(root) {\n if (!root) return 0\n return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3124879038","body":"DFS\n\n```js\nvar isSameTree = function(p, q) {\n if (!p && !q) return true\n if (!p || !q) return false\n return p.val === q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130312988","body":"DFS will be much simpler. BFS will need to pass a lot of context(params) into helper function which I don't like and not maintainable as well.\n\n\n```js\nvar sumNumbers = function(root) {\n const res = [];\n dfs(root, '')\n return res.reduce((prev, cur) => prev + cur, 0);\n\n\n function dfs(node, str) {\n if (!node.left && !node.right) {\n res.push(+`${str}${node.val}`);\n return;\n }\n if (node.left) dfs(node.left, `${str}${node.val}`);\n if (node.right) dfs(node.right, `${str}${node.val}`);\n } \n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135220392","body":"Using BFS when accessing the first in the queue, that's the leftest node. And because BFS is looping thru by level, so the last time going thru the queue is the most bottom level. \n\n```js\nvar findBottomLeftValue = function(root) {\n const queue = [root];\n let min = null;\n while(queue.length) {\n const size = queue.length;\n for(let i = 0; i < size; i++) {\n const node = queue.shift();\n if (i === 0) min = node.val\n \n\n if (node.left) queue.push(node.left);\n if (node.right) queue.push(node.right);\n }\n }\n return min;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138261960","body":"Can use either `DFS` or `BFS` to solve the problem. DFS is more simple to me: \n\n```js\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n let res = [];\n function dfs(node) {\n if (!node) {\n res.push('null');\n return;\n }\n res.push(String(node.val));\n dfs(node.left)\n dfs(node.right)\n }\n dfs(root);\n console.log(res.join(','))\n return res.join(',')\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n const datas = data.split(',');\n let i = 0;\n return dfs()\n\n function dfs() {\n const char = datas[i];\n if (char === 'null') {\n i ++\n return null\n }\n const node = new TreeNode(+char);\n i ++\n node.left = dfs()\n node.right = dfs()\n return node;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144933267","body":"Use BFS to save the row and column as index, and then sort these indexes. I think the complexity of this problem is how to mange those keys, 2 dimensions keys are quite intricate. \n\nRuntime complexity: O(nlogn), looping over the nodes is O(n), and using `sort` functions are O(nlogn), the bottle neck is sorting functions\nMemory complexity: O(n), use a hashmap to store all nodes\n\n```js\nvar verticalTraversal = function(root) {\n const map = {}\n const queue = [{\n node: root,\n col: 0,\n }];\n let row = 0;;\n while(queue.length) {\n const size = queue.length;\n for(let i = 0; i < size; i++) {\n const cur = queue.shift();\n const node = cur.node;\n if (map[cur.col]?.[row] === undefined) {\n map[cur.col] = {\n ...map[cur.col],\n [row]: [node.val]\n }\n } else {\n map[cur.col][row].push(node.val);\n }\n if (node.left) queue.push({\n node: node.left, \n col: cur.col - 1,\n })\n if (node.right) queue.push({\n node: node.right,\n col: cur.col + 1\n })\n }\n row ++\n }\n const orderByColumn = Object.entries(map).sort(([key1, _], [key2, __]) => Number(key1) - Number(key2));\n const flatternByColumn = orderByColumn.map(i => {\n const column = i[1];\n const arr = [];\n Object.entries(column).sort(([row1], [row2]) => row1 - row2).forEach(([_row, nodes]) => {\n const orderedNodes = nodes.sort((a, b) => a - b);\n arr.push(...orderedNodes)\n })\n return arr\n })\n return flatternByColumn\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146516199","body":"```js\nvar twoSum = function(nums, target) {\n const map = {}\n for(let i = 0; i < nums.length; i ++) {\n const num = nums[i];\n const diff = target - num\n if (map[diff] !== undefined) {\n return [map[diff], i];\n } else {\n map[num] = i;\n }\n }\n return [-1, -1]\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148419003","body":"```js\nvar topKFrequent = function(nums, k) {\n const map = {};\n for(let i = 0; i < nums.length; i++) {\n map[nums[i]] = map[nums[i]] ? map[nums[i]] + 1 : 1;\n }\n const maxCnt = Math.max(...Object.values(map));\n\n const buckets = Array.from({length: maxCnt + 1}, () => []);\n for(let [num, count] of Object.entries(map)) {\n buckets[count].push(num);\n }\n\n const res = [];\n for(let i = maxCnt; i >= 0 && res.length < k; i--) {\n res.push(...buckets[i])\n }\n \n return res.map(i => +i)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149124973","body":"Using brute force at the beginning, and didn't think of can use map to reduce runtime: \n\n```js\nvar numberOfBoomerangs = function(points) {\n let res = 0;\n let map = {}\n for(let [x1, y1] of points) {\n map = {}\n for(let [x2, y2] of points) {\n const distance = (x1 - x2) ** 2 + (y1 - y2) ** 2;\n const count = map[distance] ?? 0;\n res += count * 2;\n map[distance] = count + 1 \n }\n }\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3155367267","body":"Two pointers classic problem (sliding window): \n\n```js\nvar lengthOfLongestSubstring = function(s) {\n let left = 0, right = 0, res = 0\n const window = {};\n while(right < s.length) {\n const right_char = s[right ++];\n window[right_char] = window[right_char] ? window[right_char] + 1 : 1;\n while (window[right_char] > 1) {\n let remove_char = s[left ++];\n window[remove_char] --;\n }\n res = Math.max(right - left, res);\n }\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160227870","body":"so hard: \n\n\n```js\nvar findSubstring = function(s, words) {\n\n const wordLen = words[0].length;\n const numWords = words.length;\n const totalLen = wordLen * numWords;\n const n = s.length;\n const res = [];\n\n if (n < totalLen) return [];\n\n const wordCount = new Map();\n for (let word of words) {\n wordCount.set(word, (wordCount.get(word) || 0) + 1);\n }\n\n // we loop over wordLen offsets\n for (let offset = 0; offset < wordLen; offset++) {\n let left = offset, count = 0;\n const seen = new Map();\n\n for (let right = offset; right + wordLen <= n; right += wordLen) {\n const word = s.slice(right, right + wordLen);\n\n if (wordCount.has(word)) {\n seen.set(word, (seen.get(word) || 0) + 1);\n count++;\n\n // we shrink window if word is overused\n while (seen.get(word) > wordCount.get(word)) {\n const leftWord = s.slice(left, left + wordLen);\n seen.set(leftWord, seen.get(leftWord) - 1);\n left += wordLen;\n count--;\n }\n\n // Valid window\n if (count === numWords) {\n res.push(left);\n const firstWord = s.slice(left, left + wordLen);\n seen.set(firstWord, seen.get(firstWord) - 1);\n left += wordLen;\n count--;\n }\n } else {\n seen.clear();\n count = 0;\n left = right + wordLen;\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3164450266","body":"```js\nvar minSubarray = function(nums, p) {\n let totalSum = nums.reduce((a, b) => a + b, 0);\n\n // Find the remainder when total sum is divided by p\n let rem = totalSum % p;\n if (rem === 0) return 0; // If the remainder is 0, no subarray needs to be removed\n\n let prefixMod = new Map();\n prefixMod.set(0, -1); // Initialize to handle full prefix\n let prefixSum = 0;\n let minLength = nums.length;\n\n for (let i = 0; i < nums.length; i++) {\n prefixSum += nums[i];\n let currentMod = prefixSum % p;\n let targetMod = (currentMod - rem + p) % p;\n\n if (prefixMod.has(targetMod)) {\n minLength = Math.min(minLength, i - prefixMod.get(targetMod));\n }\n\n prefixMod.set(currentMod, i);\n }\n\n return minLength === nums.length ? -1 : minLength;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168150001","body":"```js\nvar middleNode = function(head) {\n if (!head || !head.next) return head;\n let fast = head, slow = head;\n while(fast && fast.next) {\n fast = fast.next.next;\n slow = slow.next\n } \n return slow;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170748221","body":"```js\nvar removeDuplicates = function(nums) {\n let fast = 0, slow = 0;\n while(fast < nums.length) {\n if (nums[slow] !== nums[fast]) {\n nums[++slow] = nums[fast];\n }\n fast ++\n }\n return slow + 1\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172646559","body":"Binary Search\n\n```js\nvar searchInsert = function(nums, target) {\n let left = 0, right = nums.length;\n while(left < right) {\n const mid = left + Math.floor((right - left) / 2);\n if (nums[mid] >= target) {\n right = mid\n } else {\n left = mid + 1\n }\n }\n return left;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173319860","body":" Too long to put down DeQueue implementation in JS. Don't think this will be asked in an interview: \n\n```js\nvar maxSlidingWindow = function (nums, k) {\n const res = [];\n const dequeue = new Dequeue([]);\n // 前 k - 1 个数入队\n for (let i = 0; i < k - 1; i++) {\n dequeue.push(nums[i]);\n }\n\n // 滑动窗口\n for (let i = k - 1; i < nums.length; i++) {\n dequeue.push(nums[i]);\n res.push(dequeue.max());\n dequeue.shift(nums[i - k + 1]);\n }\n return res;\n};\n\nclass Dequeue {\n constructor(nums) {\n this.list = nums;\n }\n\n push(val) {\n const nums = this.list;\n // 保证数据从队头到队尾递减\n while (nums[nums.length - 1] < val) {\n nums.pop();\n }\n nums.push(val);\n }\n\n // 队头出队\n shift(val) {\n let nums = this.list;\n if (nums[0] === val) {\n // 这里的js实现shift()理论上复杂度应该是O(k), 就不去真实实现一个O(1)出队的队列了,意思到位即可\n nums.shift();\n }\n }\n\n max() {\n return this.list[0];\n }\n}\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3179501468","body":"```js\nvar findJudge = function (n, trust) {\n const count = new Array(n + 1).fill(0);\n for (const edge of trust) {\n const x = edge[0];\n const y = edge[1];\n count[y]++;\n count[x]--;\n }\n for (let i = 1; i <= n; ++i) {\n if (count[i] === n - 1) {\n return i;\n }\n }\n return -1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3184086046","body":"```js\nvar possibleBipartition = function(N, dislikes) {\n const graph = [...Array(N+1)].map(() => []);\n const visited = Array(N+1).fill(false);\n const color = Array(N+1).fill(0);\n\n for(let [u, v] of dislikes) {\n graph[u].push(v);\n graph[v].push(u);\n }\n\n for(let i = 1; i <= N; i++) {\n if(!colorNodes(i)) return false;\n }\n return true;\n\n function colorNodes(node) {\n if(visited[node]) return true;\n const currColor = new Set([1, 2]);\n\n\t\t// remove colors used by neighbors\n for(let child of graph[node]) {\n if(color[child] === 1) currColor.delete(1);\n if(color[child] === 2) currColor.delete(2);\n }\n\n\t\t// no color is available return false\n if(currColor.size === 0) return false;\n\t\t\n\t\t// assign the smallest available color\n color[node] = Math.min(...currColor);\n visited[node] = true; \n\n for(let child of graph[node]) {\n if(!colorNodes(child)) return false; \n }\n return true;\n }\n};\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"stonehl":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073791924","body":"C++代码:\n`class Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n vector res;\n int n = num.size();\n for (int i=n-1; i>=0; --i) {\n int sum = num[i] + k % 10;\n k /= 10;\n if (sum >= 10) {\n k++;\n sum -= 10;\n }\n res.push_back(sum);\n }\n for (; k > 0; k /= 10) {\n res.push_back(k % 10);\n }\n reverse(res.begin(), res.end());\n return res;\n }\n};`","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097159903","body":"### 思路:\n1. 异常情况判断;\n2. 统计链表长度, 同时将链表的收尾相连;\n3. 将k对链表长度取余,余数为0表示刚好旋转了链表长度的整数倍,链表节点位置不变;\n4. 新的链表头节点是原链表中第 n - k 个节点。\n### C++代码\n```\nclass Solution {\npublic:\n ListNode* rotateRight(ListNode* head, int k) {\n if (head == nullptr || head->next == nullptr || k == 0)\n return head;\n int count = 1; // 用来统计链表长度\n ListNode* tmp = head;\n while (tmp->next != nullptr) {\n count++;\n tmp = tmp->next; // 滑动到链表尾部\n }\n k %= count;\n //如果刚好是链表长度的倍数,则不进行旋转\n if (k == 0)\n return head;\n tmp->next = head;\n // \n for (int i=0; i < count - k; i++) {\n tmp = tmp->next;\n }\n ListNode* newHead = tmp->next;\n tmp->next = nullptr;\n return newHead;\n }\n};\n```\n### 时间复杂度\nO(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103550594","body":"### 思路:\n使用递归的方法解题\n1. 找递归终止条件,当链表为空或链表只有一个元素时,没法交换,终止递归,返回当前节点;\n2. 每一次递归需要返回的值是交换后的子链表的头节点;\n\n### 代码:\n```\nclass Solution {\npublic:\n ListNode* swapPairs(ListNode* head) {\n if (head == nullptr || head->next == nullptr) {\n return head;\n }\n ListNode* next = head->next;\n head->next = swapPairs(next->next);\n next->next = head;\n return next;\n }\n};\n\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127754666","body":"### 思路:\n使用深度优先搜索的方法,\n1. 先找返回条件, 如果两个节点都为空,则返回true;\n2. 如果两个节点都不为空,并且这两个节点的值相等则分别递归判断这两个节点的左子树和右子树的值是否相等,如果相等,则返回true, 否则返回false。\n\n### 代码:\n```\nclass Solution {\npublic:\n bool isSameTree(TreeNode* p, TreeNode* q) {\n if(p==nullptr && q==nullptr) {\n return true;\n }\n if (p && q && (p->val == q->val)) {\n return isSameTree(p->right, q->right) && isSameTree(p->left, q->left);\n }\n return false;\n\n }\n};\n```\n### 复杂度分析:\n时间复杂度O(N),N为两棵树节点的最小值","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3151160755","body":"### 思路:\n将每个距离的出现次数记录在哈希表中,然后遍历哈希表,计算并累加回旋镖的个数。\n\n### 代码:\n```\nclass Solution {\npublic:\n int numberOfBoomerangs(vector>& points) {\n int n = points.size();\n int res = 0;\n if (n < 3)\n return res;\n\n int ans = 0;\n for (auto &p : points) {\n unordered_map cnt;\n for (auto &q : points) {\n int dis = (p[0] - q[0]) * (p[0] - q[0]) + (p[1] - q[1]) * (p[1] - q[1]);\n ++cnt[dis];\n }\n for (auto &[_, m] : cnt) {\n ans += m * (m - 1);\n }\n }\n return ans;\n\n }\n};\n```\n时间复杂度:O(n2)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3174960911","body":"### 思路:\n使用双端队列来维护滑动窗口内的最大值\n### 代码:\n```\nclass Solution {\npublic:\n vector maxSlidingWindow(vector& nums, int k) {\n deque q;\n int n = nums.size();\n vector res;\n for(int i = 0; i < n; i++) {\n if(q.size() && i - q.front() >= k)\n q.pop_front();\n while(q.size() && nums[q.back()] <= nums[i]) q.pop_back();\n q.push_back(i);\n if(i >= k - 1) {\n res.push_back(nums[q.front()]);\n }\n }\n return res;\n }\n};\n```\n### 复杂度:\n时间复杂度:O(n)","onTime":true},null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3201130868","body":"### 思路:\n基数排序\n### 代码:\n```\nclass Solution {\npublic:\n vector sortArray(vector& nums) {\n const int NUM = 50000;\n int arr[NUM*10+10];\n bzero(arr,sizeof(arr));\n for(int&num:nums){\n num+=NUM;\n arr[num]+=1;\n }\n int cur = 0;\n for(int i = 0;i<(NUM*10+10);++i){\n int tmp = arr[i];\n while(tmp--){\n nums[cur++] = i-NUM;\n }\n }\n return nums;\n }\n};\n```\n### 时间复杂度: O(N)","onTime":true},null,null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3234026083","body":"### 思路:\n1. 先统计t中每个字符出现的次数;\n2. 初始化左右指针,以及记录答案的变量;\n3. 右指针移动,更新计数。如果当前字符是t中的字符(即计数大于0),则减小cntT;\n4. 当cntT为0时,说明当前窗口包含了t的所有字符,然后尝试移动左指针缩小窗口;\n5. 在缩小窗口时,如果移除了t中的字符,则增加cntT,并更新答案;\n6. 最后根据是否找到答案返回相应的子串。\n### 代码:\n```\nclass Solution {\npublic:\n string minWindow(string s, string t) {\n vector cnt(128, 0);\n for (char c : t) {\n cnt[c]++;\n }\n \n int l = 0, r = 0, ansL = 0, ansR = 0, ans = INT_MAX, cntT = t.length();\n \n while (r < s.length()) {\n if (cnt[s[r]]-- > 0) {\n cntT--;\n }\n r++;\n \n while (cntT == 0) {\n if (r - l < ans) {\n ans = r - l;\n ansL = l;\n ansR = r;\n }\n if (cnt[s[l]]++ == 0) {\n cntT++;\n }\n l++;\n }\n }\n \n return ans == INT_MAX ? \"\" : s.substr(ansL, ansR - ansL);\n }\n};\n```\n### 时间复杂度:O(n)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245701951","body":"### 思路:\n1. 初始化标记数组 visited,避免重复访问;\n2. 遍历每个格子,使用DFS搜索整个岛屿。\n\n### 代码:\n```\nclass Solution {\nprivate:\n int count;\n int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向\n void dfs(vector>& grid, vector>& visited, int x, int y) {\n for (int i = 0; i < 4; i++) {\n int nextx = x + dir[i][0];\n int nexty = y + dir[i][1];\n if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过\n if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的\n\n visited[nextx][nexty] = true;\n count++;\n dfs(grid, visited, nextx, nexty);\n }\n }\n }\n\npublic:\n int maxAreaOfIsland(vector>& grid) {\n int n = grid.size(), m = grid[0].size();\n vector> visited = vector>(n, vector(m, false));\n\n int result = 0;\n for (int i = 0; i < n; i++) {\n for (int j = 0; j < m; j++) {\n if (!visited[i][j] && grid[i][j] == 1) {\n count = 1;\n visited[i][j] = true;\n dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true\n result = max(result, count);\n }\n }\n }\n return result;\n }\n};\n```\n### 时间复杂度: O(MN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249613575","body":"### 思路:\n使用多源广度优先搜索,先找到所有陆地放入队列,然后从陆地开始向外搜索,最后被触及的海洋就是离所有陆地最远的海洋。\n### 代码:\n```\nclass Solution {\npublic:\n int maxDistance(vector>& grid) {\n int n = grid.size();\n vector> directions = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};\n queue> q;\n \n for (int i = 0; i < n; i++) {\n for (int j = 0; j < n; j++) {\n if (grid[i][j] == 1) {\n q.push({i, j});\n }\n }\n }\n \n // 如果全是海洋或者全是陆地\n if (q.empty() || q.size() == n * n) return -1;\n \n int distance = -1;\n \n // 2. 多源 BFS\n while (!q.empty()) {\n int size = q.size();\n distance++;\n \n for (int s = 0; s < size; s++) {\n auto [x, y] = q.front();\n q.pop();\n \n for (auto [dx, dy] : directions) {\n int nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] == 0) {\n grid[nx][ny] = 1; // 标记为已访问(变为陆地)\n q.push({nx, ny});\n }\n }\n }\n }\n \n return distance;\n }\n};\n```\n### 时间复杂度: O(N²)","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3271218211","body":"### 代码:\n```\nclass Solution {\npublic:\n int longestCommonSubsequence(string text1, string text2) {\n int m = text2.length();\n vector f(m + 1);\n for (char x : text1) {\n for (int j = 0, pre = 0; j < m; j++) {\n int tmp = f[j + 1];\n f[j + 1] = x == text2[j] ? pre + 1 : max(f[j + 1], f[j]);\n pre = tmp;\n }\n }\n return f[m];\n }\n};\n```\n### 时间复杂度:O(nm)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289595360","body":"\n### 代码:\n```\nclass Solution {\npublic:\n int findTargetSumWays(vector& nums, int target) {\n int s = reduce(nums.begin(), nums.end()) - abs(target);\n if (s < 0 || s % 2) {\n return 0;\n }\n\n int m = s / 2; // 背包容量\n int n = nums.size();\n vector memo(n, vector(m + 1, -1)); // -1 表示没有计算过\n\n // lambda 递归函数\n auto dfs = [&](this auto&& dfs, int i, int c) -> int {\n if (i < 0) {\n return c == 0;\n }\n int& res = memo[i][c]; // 注意这里是引用\n if (res != -1) { // 之前计算过\n return res;\n }\n if (c < nums[i]) {\n return res = dfs(i - 1, c); // 只能不选\n }\n return res = dfs(i - 1, c) + dfs(i - 1, c - nums[i]); // 不选 + 选\n };\n\n return dfs(n - 1, m);\n }\n};\n```\n时间复杂度:O(nm)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316013499","body":"### 代码:\n```\nclass Solution {\npublic:\n ListNode* mergeKLists(vector& lists) {\n auto cmp = [](const ListNode* a, const ListNode* b) {\n return a->val > b->val; // 最小堆\n };\n priority_queue, decltype(cmp)> pq;\n for (auto head : lists) {\n if (head) {\n pq.push(head); // 把所有非空链表的头节点入堆\n }\n }\n\n ListNode dummy{}; // 哨兵节点,作为合并后链表头节点的前一个节点\n auto cur = &dummy;\n while (!pq.empty()) { // 循环直到堆为空\n auto node = pq.top(); // 剩余节点中的最小节点\n pq.pop();\n if (node->next) { // 下一个节点不为空\n pq.push(node->next); // 下一个节点有可能是最小节点,入堆\n }\n cur->next = node; // 把 node 添加到新链表的末尾\n cur = cur->next; // 准备合并下一个节点\n }\n return dummy.next; // 哨兵节点的下一个节点就是新链表的头节点\n }\n};\n```\n### 时间复杂度:\nO(Llogm),其中 m 为 lists 的长度,L 为所有链表的长度之和。","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuyuanzhang118":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074090351","body":"## 算法思路分析\n\n这是一个将数组形式的整数与普通整数相加的算法,采用了模拟手工加法的思路:\n\n### 核心思路\n1. **从右到左逐位相加**:模拟手工加法,从最低位开始处理\n2. **处理进位**:当两位数字相加结果 ≥ 10 时,产生进位\n3. **处理不同长度**:通过 `num[len-1] || 0` 处理数组已遍历完的情况\n4. **逆序构建结果**:由于是从低位到高位计算,最后需要反转数组\n\n```JavaScript\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(num, k) {\n let res = []\n let len = num.length\n let carry = 0\n while(len > 0 || k > 0) {\n let a = num[len - 1] || 0\n let b = k % 10\n let sum = a + b + carry\n res.push(sum % 10)\n carry = sum >= 10 ? 1 : 0\n len--\n k = Math.floor(k / 10)\n }\n if (carry) {\n res.push(1)\n }\n return res.reverse()\n};\n```\n\n### 时间复杂度\n**O(max(N, log K))**\n- N 是数组 `num` 的长度\n- log K 是整数 k 的位数\n- 循环次数取决于较长的那个数\n\n### 空间复杂度\n**O(max(N, log K))**\n- 结果数组 `res` 的长度最多为 max(N, log K) + 1\n- 其他变量占用常数空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3079209775","body":"## 算法思路分析\n核心思想:双向遍历\n\n这个算法使用了一种巧妙的双向遍历方法来解决问题:\n\n1. 第一次遍历(从左到右) :\n \n - 记录每个位置到其左边最近字符c的距离\n - 使用变量 prev 记录上一个字符c的位置\n - 对于每个位置i,距离为 i - prev\n2. 第二次遍历(从右到左) :\n \n - 计算每个位置到其右边最近字符c的距离\n - 与第一次遍历的结果取最小值,得到最终答案\n - 对于每个位置i,距离为 prev - i\n\n## 代码\n```Javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const n = s.length;\n const answer = new Array(n).fill(Infinity);\n \n // 第一次遍历:从左到右,记录每个位置到左边最近字符c的距离\n let prev = -Infinity;\n for (let i = 0; i < n; i++) {\n if (s[i] === c) {\n prev = i;\n }\n answer[i] = i - prev;\n }\n \n // 第二次遍历:从右到左,更新每个位置到右边最近字符c的距离\n prev = Infinity;\n for (let i = n - 1; i >= 0; i--) {\n if (s[i] === c) {\n prev = i;\n }\n answer[i] = Math.min(answer[i], prev - i);\n }\n \n return answer;\n};\n```\n\n## 复杂度分析\n\n时间复杂度:O(n)\n- 需要遍历字符串两次,每次遍历都是O(n)\n- 总时间复杂度为O(n) + O(n) = O(n)\n- 这是最优的时间复杂度,因为至少需要访问每个字符一次\n\n空间复杂度:O(n)\n- 需要创建一个长度为n的结果数组 answer\n- 除了结果数组外,只使用了常数个额外变量( prev , i , n )\n- 如果不计算返回值所需的空间,额外空间复杂度为O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084609047","body":"### 算法设计思路\n\n**核心数据结构:**\n- 使用数组 `stack` 作为底层存储结构\n- 使用 `maxSize` 记录栈的最大容量\n- 数组索引 0 为栈底,数组末尾为栈顶\n\n### 代码\n\n```JavaScript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.maxSize = maxSize;\n this.stack = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.stack.length < this.maxSize) {\n this.stack.push(x);\n }\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.stack.length === 0) {\n return -1;\n }\n return this.stack.pop();\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n // 对栈底的k个元素进行增量操作\n // 如果栈中元素总数小于k,则对所有元素进行增量操作\n const elementsToIncrement = Math.min(k, this.stack.length);\n for (let i = 0; i < elementsToIncrement; i++) {\n this.stack[i] += val;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n### 时间复杂度分析\n\n| 方法 | 时间复杂度 | 分析 |\n|------|------------|------|\n| **构造函数** | O(1) | 仅初始化两个变量 |\n| **push(x)** | O(1) | 数组末尾添加元素,均摊时间复杂度为 O(1) |\n| **pop()** | O(1) | 数组末尾删除元素 |\n| **increment(k, val)** | O(min(k, n)) | 需要遍历栈底的 k 个元素,n 为当前栈大小 |\n\n### 空间复杂度分析\n\n| 方面 | 空间复杂度 | 分析 |\n|------|------------|------|\n| **整体空间** | O(maxSize) | 最坏情况下数组存储 maxSize 个元素 |\n| **辅助空间** | O(1) | 除了存储栈元素外,只使用常数额外空间 |\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3092430277","body":"### 算法思路分析\n\n**核心思想:使用栈处理嵌套结构**\n\n这是一个典型的括号匹配问题,需要处理嵌套的编码结构。算法的关键在于:\n1. **识别模式** - `k[encoded_string]` 表示重复 k 次\n2. **处理嵌套** - 可能存在多层嵌套,如 `3[a2[c]]`\n3. **状态管理** - 需要记录当前的数字、字符串和历史状态\n\n**算法步骤:**\n1. 遍历字符串的每个字符\n2. 遇到数字:累积构建重复次数(支持多位数)\n3. 遇到 `[`:将当前状态(字符串和数字)压入栈,重置当前状态\n4. 遇到 `]`:从栈中弹出之前的状态,重复当前字符串并拼接\n5. 遇到字母:直接添加到当前字符串\n\n### 代码实现\n\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let currentNum = 0;\n let currentStr = '';\n \n for (let i = 0; i < s.length; i++) {\n const char = s[i];\n \n if (char >= '0' && char <= '9') {\n // 构建数字(可能是多位数)\n currentNum = currentNum * 10 + parseInt(char);\n } else if (char === '[') {\n // 遇到左括号,将当前状态入栈\n stack.push([currentStr, currentNum]);\n currentStr = '';\n currentNum = 0;\n } else if (char === ']') {\n // 遇到右括号,出栈并重复字符串\n const [prevStr, num] = stack.pop();\n currentStr = prevStr + currentStr.repeat(num);\n } else {\n // 普通字符,直接添加到当前字符串\n currentStr += char;\n }\n }\n \n return currentStr;\n};\n```\n\n### 复杂度分析\n\n**时间复杂度:O(n + m)**\n- n:输入字符串长度\n- m:输出字符串长度\n- 每个字符最多被处理一次\n- 字符串重复操作的总时间与最终输出长度成正比\n\n**空间复杂度:O(n + m)**\n- **栈空间**:O(d) - d 为最大嵌套深度,最坏情况 O(n)\n- **字符串存储**:O(m) - 存储中间结果和最终结果\n- **总空间**:O(n + m)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092434643","body":"## 核心算法思路\n\n使用两个栈实现队列:\n- `inStack`: 用于接收新元素的输入\n- `outStack`: 用于输出元素\n\n当需要 pop 或 peek 时,如果 outStack 为空,就将 inStack 中的所有元素转移到 outStack 中,这样就实现了先入先出的特性。\n\n## 代码实现\n\n```javascript\n\nvar MyQueue = function() {\n this.inStack = []; // 用于输入的栈\n this.outStack = []; // 用于输出的栈\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.inStack.push(x);\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n if (this.outStack.length === 0) {\n // 将inStack中的所有元素转移到outStack\n while (this.inStack.length > 0) {\n this.outStack.push(this.inStack.pop());\n }\n }\n return this.outStack.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if (this.outStack.length === 0) {\n // 将inStack中的所有元素转移到outStack\n while (this.inStack.length > 0) {\n this.outStack.push(this.inStack.pop());\n }\n }\n return this.outStack[this.outStack.length - 1];\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return this.inStack.length === 0 && this.outStack.length === 0;\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```\n\n## 复杂度分析\n\n**时间复杂度**:\n- push: O(1)\n- pop: 均摊 O(1)\n- peek: 均摊 O(1) \n- empty: O(1)\n\n**空间复杂度**: O(n)\n\n**均摊 O(1) 的原理**:虽然单次 pop 或 peek 操作在最坏情况下可能需要 O(n) 时间,但每个元素最多只会被转移一次,所以 n 个操作的总时间复杂度为 O(n),均摊下来每个操作为 O(1)。\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094581867","body":"## 算法思路\n- 关键观察:如果前缀[0...i]的最大值 ≤ 后缀[i+1...n-1]的最小值,则可以在位置i处分块\n- 这保证了前面块的所有元素都不大于后面块的任何元素,分别排序后连接仍然有序\n\n## 代码\n```javascript\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const n = arr.length;\n if (n <= 1) return n;\n \n // 计算前缀最大值数组\n const prefixMax = new Array(n);\n prefixMax[0] = arr[0];\n for (let i = 1; i < n; i++) {\n prefixMax[i] = Math.max(prefixMax[i-1], arr[i]);\n }\n \n // 计算后缀最小值数组\n const suffixMin = new Array(n);\n suffixMin[n-1] = arr[n-1];\n for (let i = n-2; i >= 0; i--) {\n suffixMin[i] = Math.min(suffixMin[i+1], arr[i]);\n }\n \n let chunks = 1; // 至少有一个分块\n \n // 检查每个可能的分块点\n for (let i = 0; i < n-1; i++) {\n // 如果前缀最大值 <= 后缀最小值,可以在i处分块\n if (prefixMax[i] <= suffixMin[i+1]) {\n chunks++;\n }\n }\n \n return chunks;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 需要三次遍历数组\n- 空间复杂度:O(n) - 需要两个额外数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097244383","body":"## 核心思路 :\n- 计算链表长度并找到尾节点\n- 优化k值避免重复旋转\n- 找到新的尾节点(第length-k个节点)\n- 重新连接:断开新尾节点与新头节点,原尾节点连接原头节点\n\n## 代码:\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n // 边界情况处理\n if (!head || !head.next || k === 0) {\n return head;\n }\n \n // 1. 计算链表长度并找到尾节点\n let length = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n length++;\n }\n \n // 2. 优化k值,避免不必要的旋转\n k = k % length;\n if (k === 0) {\n return head;\n }\n \n // 3. 找到新的尾节点(从头开始第length-k个节点)\n let newTail = head;\n for (let i = 0; i < length - k - 1; i++) {\n newTail = newTail.next;\n }\n \n // 4. 新的头节点是新尾节点的下一个节点\n let newHead = newTail.next;\n \n // 5. 断开连接并重新连接\n newTail.next = null; // 断开新尾节点与新头节点的连接\n tail.next = head; // 原尾节点连接到原头节点\n \n return newHead;\n};\n```\n\n## 复杂度分析 :\n- 时间复杂度 :O(n) - 需要遍历链表计算长度和找到切分点\n- 空间复杂度 :O(1) - 只使用常数个额外变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103625610","body":"## 算法思路\n- 虚拟头节点技巧: 简化边界条件处理\n- 三指针法: prev, first, second 精确控制交换过程\n- 原地交换: 只修改指针,不创建新节点\n- 边界处理: 空链表和单节点的特殊情况\n\n## 代码实现\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n // 边界情况:空链表或只有一个节点\n if (!head || !head.next) {\n return head;\n }\n \n // 创建虚拟头节点,简化操作\n let dummy = new ListNode(0);\n dummy.next = head;\n let prev = dummy;\n \n // 当存在至少两个节点时进行交换\n while (prev.next && prev.next.next) {\n // 定义要交换的两个节点\n let first = prev.next;\n let second = prev.next.next;\n \n // 执行交换操作\n // 步骤:prev -> first -> second -> ... \n // 变为:prev -> second -> first -> ...\n prev.next = second;\n first.next = second.next;\n second.next = first;\n \n // 移动prev指针到已交换的第二个节点(现在是first)\n prev = first;\n }\n \n return dummy.next;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) \n- 空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109219828","body":"## 算法思路\n- 算法的核心思想是利用有序链表的特性:\n- 选择中间节点作为根节点,保证树的平衡性\n- 递归地将左半部分构建为左子树,右半部分构建为右子树\n- 最优解使用中序遍历的特性,避免重复遍历链表\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n // 计算链表长度\n function getLength(head) {\n let length = 0;\n while (head) {\n length++;\n head = head.next;\n }\n return length;\n }\n \n const length = getLength(head);\n let current = head;\n \n // 中序遍历构建BST\n function buildBST(start, end) {\n if (start > end) return null;\n \n const mid = Math.floor((start + end) / 2);\n \n // 先构建左子树\n const left = buildBST(start, mid - 1);\n \n // 创建根节点(当前链表节点)\n const root = new TreeNode(current.val);\n current = current.next;\n \n // 再构建右子树\n const right = buildBST(mid + 1, end);\n \n root.left = left;\n root.right = right;\n \n return root;\n }\n \n return buildBST(0, length - 1);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 每个节点只访问一次\n- 空间复杂度:O(log n) - 仅递归栈深度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3117083288","body":"## 算法思路\n双指针法 :让两个指针分别从两个链表头部开始遍历,当指针到达链表末尾时跳转到另一个链表的头部。这样可以消除两个链表的长度差异,如果有交点,两个指针会在交点相遇;如果没有交点,两个指针最终都会变成 null。\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function(headA, headB) {\n // 如果任一链表为空,直接返回null\n if (!headA || !headB) {\n return null;\n }\n \n // 双指针法:让两个指针分别遍历两个链表\n // 当指针到达链表末尾时,跳转到另一个链表的头部\n // 这样可以消除长度差,如果有交点,两指针会在交点相遇\n let pA = headA;\n let pB = headB;\n \n // 当两个指针不相等时继续遍历\n while (pA !== pB) {\n // 如果pA到达末尾,跳转到headB;否则继续下一个节点\n pA = pA === null ? headB : pA.next;\n // 如果pB到达末尾,跳转到headA;否则继续下一个节点\n pB = pB === null ? headA : pB.next;\n }\n \n // 返回交点(如果没有交点,两指针都会变成null)\n return pA;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(m + n),其中 m 和 n 分别是两个链表的长度。每个指针最多遍历两个链表一次。\n- 空间复杂度 :O(1),只使用了两个指针变量,没有使用额外的数据结构。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3117100989","body":"## 算法思路\n- 第一阶段 :使用快慢指针检测是否有环\n- 慢指针每次移动1步,快指针每次移动2步\n- 如果有环,快慢指针必定会相遇\n- 第二阶段 :找到环的起始节点\n- 基于数学原理:从头节点到环入口的距离等于从相遇点到环入口的距离\n- 将一个指针重置到头节点,两指针同速移动直到相遇\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n // 边界情况:空链表或只有一个节点且无环\n if (!head || !head.next) {\n return null;\n }\n \n // 第一阶段:使用快慢指针检测是否有环\n let slow = head;\n let fast = head;\n \n // 快指针每次走两步,慢指针每次走一步\n while (fast && fast.next) {\n slow = slow.next;\n fast = fast.next.next;\n \n // 如果快慢指针相遇,说明存在环\n if (slow === fast) {\n break;\n }\n }\n \n // 如果没有环,返回null\n if (!fast || !fast.next) {\n return null;\n }\n \n // 第二阶段:找到环的起始节点\n // 将一个指针重置到头节点,两个指针同时以相同速度移动\n // 它们相遇的地方就是环的起始节点\n slow = head;\n while (slow !== fast) {\n slow = slow.next;\n fast = fast.next;\n }\n \n return slow; // 返回环的起始节点\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 最多遍历链表两次\n- 空间复杂度 :O(1) - 只使用常数个额外变量,满足进阶要求","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3124469572","body":"## 算法思路\n这个LRU(Least Recently Used)缓存实现采用了 哈希表 + 双向链表 的经典设计模式:\n数据结构组合 :\n - Map :用于O(1)时间复杂度的键值查找\n - 双向链表:用于维护访问顺序,支持O(1)的插入和删除操作\n - 虚拟头尾节点:简化边界条件处理\n\n## 代码\n```javascript\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.cache = new Map(); // 使用Map存储键值对\n this.head = {}; // 虚拟头节点\n this.tail = {}; // 虚拟尾节点\n this.head.next = this.tail;\n this.tail.prev = this.head;\n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n if (!this.cache.has(key)) {\n return -1;\n }\n \n // 存在则将节点移到链表头部(表示最近使用)\n const node = this.cache.get(key);\n this.removeFromList(node);\n this.addToHead(node);\n \n return node.value;\n};\n\n/** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\nLRUCache.prototype.put = function(key, value) {\n // 如果已存在,先删除旧节点\n if (this.cache.has(key)) {\n const oldNode = this.cache.get(key);\n this.removeFromList(oldNode);\n this.cache.delete(key);\n }\n \n // 创建新节点并添加到头部\n const newNode = { key, value, prev: null, next: null };\n this.cache.set(key, newNode);\n this.addToHead(newNode);\n \n // 如果超出容量,删除尾部节点(最久未使用)\n if (this.cache.size > this.capacity) {\n const tailNode = this.tail.prev;\n this.removeFromList(tailNode);\n this.cache.delete(tailNode.key);\n }\n};\n\n// 辅助方法:将节点添加到链表头部\nLRUCache.prototype.addToHead = function(node) {\n node.next = this.head.next;\n node.prev = this.head;\n this.head.next.prev = node;\n this.head.next = node;\n};\n\n// 辅助方法:从链表中删除节点\nLRUCache.prototype.removeFromList = function(node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n};\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```\n\n## 复杂度分析\n- 时间复杂度:O(1)\n- 空间复杂度:O(capacity)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124496973","body":"## 算法思路\n使用广度优先搜索(BFS)的方法来计算二叉树的最大深度:\n- 初始化 :如果根节点为空,直接返回0\n- 队列存储 :使用队列存储节点和对应的深度信息,初始将根节点和深度1入队\n- 层序遍历 :通过队列进行层序遍历,每次取出队首元素\n- 深度更新 :更新最大深度值,并将当前节点的左右子节点(如果存在)连同深度+1一起入队\n- 返回结果 :遍历完成后返回记录的最大深度\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if (!root) return 0;\n let queue = [[root, 1]];\n let maxDepth = 0;\n\n while (queue.length > 0) {\n let [node, depth] = queue.shift();\n if (node) {\n maxDepth = Math.max(maxDepth, depth);\n if (node.left) queue.push([node.left, depth + 1]);\n if (node.right) queue.push([node.right, depth + 1]);\n }\n }\n\n return maxDepth;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 O(n) ,其中n是二叉树中节点的总数\n- 空间复杂度 O(w) ,其中w是二叉树的最大宽度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3126191127","body":"## 算法思路\n使用递归的深度优先搜索(DFS)方法:\n- 基本情况 :如果两个节点都为空,返回 true\n- 边界情况 :如果只有一个节点为空,返回 false\n- 值比较 :如果两个节点的值不相等,返回 false\n- 递归检查 :同时检查左子树和右子树是否相同\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} p\n * @param {TreeNode} q\n * @return {boolean}\n */\nvar isSameTree = function(p, q) {\n if (p === null && q === null) {\n return true;\n }\n if (p === null || q === null || p.val !== q.val) {\n return false;\n }\n return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(min(m, n)),其中 m 和 n 分别是两棵树的节点数。在最坏情况下需要遍历较小树的所有节点。\n- 空间复杂度 :O(min(m, n)),递归调用栈的深度取决于树的高度。在完全平衡的树中为 O(log(min(m, n))),在完全不平衡的树中为 O(min(m, n))。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3133136375","body":"## 算法思路\n这是一个典型的二叉树深度优先搜索(DFS)问题。核心思想是:\n- 从根节点开始,沿着每条路径向下遍历\n- 在遍历过程中,将当前路径形成的数字逐步构建(当前数字 = 之前数字 × 10 + 当前节点值)\n- 当到达叶节点时,将该路径形成的完整数字加入总和\n- 递归处理左右子树,最终返回所有路径数字的总和\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root) {\n // 深度优先搜索函数\n function dfs(node, currentSum) {\n // 如果节点为空,返回0\n if (!node) {\n return 0;\n }\n \n // 计算当前路径的数字:之前的数字*10 + 当前节点值\n currentSum = currentSum * 10 + node.val;\n \n // 如果是叶节点(没有左右子树),返回当前路径形成的数字\n if (!node.left && !node.right) {\n return currentSum;\n }\n \n // 递归计算左右子树的路径数字之和\n return dfs(node.left, currentSum) + dfs(node.right, currentSum);\n }\n \n return dfs(root, 0);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) ,其中 n 是二叉树中节点的数量,需要访问每个节点一次\n- 空间复杂度:O(h) ,其中 h 是二叉树的高度,递归调用栈的深度等于树的高度\n - 最坏情况(完全不平衡的树):O(n)\n - 最好情况(完全平衡的树):O(log n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136794752","body":"## 算法思路\n广度优先搜索(BFS)\n- 使用层序遍历,从右到左遍历每一层\n- 通过队列实现,先添加右子节点再添加左子节点\n- 最后访问到的节点就是最底层最左边的节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n // 使用层序遍历(BFS)从右到左遍历每一层\n // 最后访问到的节点就是最底层最左边的节点\n let queue = [root];\n let result = root.val;\n \n while (queue.length > 0) {\n let levelSize = queue.length;\n \n // 遍历当前层的所有节点\n for (let i = 0; i < levelSize; i++) {\n let node = queue.shift();\n result = node.val; // 更新结果为当前节点值\n \n // 先添加右子节点,再添加左子节点\n // 这样在同一层中,左边的节点会后被访问到\n if (node.right) {\n queue.push(node.right);\n }\n if (node.left) {\n queue.push(node.left);\n }\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),需要遍历所有节点\n- 空间复杂度:O(w),w为树的最大宽度(队列空间)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3140223821","body":"## 算法思路\n序列化过程 :\n- 采用前序遍历(根-左-右)的方式遍历二叉树\n- 空节点用 'null' 字符串表示\n- 所有节点值用逗号连接成字符串\n- 前序遍历的优势是根节点总在最前面,便于重构\n\n反序列化过程 :\n- 将字符串按逗号分割成数组\n- 使用递归按前序遍历顺序重构二叉树\n- 维护索引指针依次处理数组元素\n- 遇到 'null' 返回空节点,否则创建新节点并递归构建左右子树\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n const result = [];\n \n function preorder(node) {\n if (node === null) {\n result.push('null');\n return;\n }\n \n result.push(node.val.toString());\n preorder(node.left);\n preorder(node.right);\n }\n \n preorder(root);\n return result.join(',');\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n if (!data || data === 'null') {\n return null;\n }\n \n const values = data.split(',');\n let index = 0;\n \n function buildTree() {\n if (index >= values.length || values[index] === 'null') {\n index++;\n return null;\n }\n \n const node = new TreeNode(parseInt(values[index]));\n index++;\n \n node.left = buildTree();\n node.right = buildTree();\n \n return node;\n }\n \n return buildTree();\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```\n\n## 复杂度分析\n时间复杂度 :\n- 序列化:O(n) - 需要访问每个节点一次\n- 反序列化:O(n) - 需要处理每个序列化值一次\n\n空间复杂度 :\n- 序列化:O(n) - 递归栈深度最坏情况为O(n),结果数组大小为O(n)\n- 反序列化:O(n) - 递归栈深度最坏情况为O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3148418818","body":"## 算法思路\n- DFS遍历 :使用深度优先搜索遍历二叉树,记录每个节点的坐标(row, col)和值\n- 坐标规则 :根据题目要求,左子节点坐标为(row+1, col-1),右子节点坐标为(row+1, col+1)\n- 分组排序 :将节点按列索引分组,对每列内的节点先按行排序,同行按值排序\n- 结果输出 :按列索引从小到大的顺序返回垂序遍历结果\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n if (!root) return [];\n \n // 存储节点信息:[row, col, val]\n const nodes = [];\n \n // DFS遍历,记录每个节点的坐标和值\n function dfs(node, row, col) {\n if (!node) return;\n \n nodes.push([row, col, node.val]);\n \n // 左子节点:row+1, col-1\n dfs(node.left, row + 1, col - 1);\n // 右子节点:row+1, col+1\n dfs(node.right, row + 1, col + 1);\n }\n \n // 从根节点开始遍历,根节点坐标为(0, 0)\n dfs(root, 0, 0);\n \n // 按列索引分组\n const columnMap = new Map();\n for (const [row, col, val] of nodes) {\n if (!columnMap.has(col)) {\n columnMap.set(col, []);\n }\n columnMap.get(col).push([row, val]);\n }\n \n // 获取所有列索引并排序\n const columns = Array.from(columnMap.keys()).sort((a, b) => a - b);\n \n const result = [];\n for (const col of columns) {\n const columnNodes = columnMap.get(col);\n // 对每列内的节点排序:先按行排序,同行按值排序\n columnNodes.sort((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按行排序\n }\n return a[1] - b[1]; // 同行按值排序\n });\n \n // 提取值\n result.push(columnNodes.map(node => node[1]));\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n log n),其中n是节点数,主要消耗在排序操作\n- 空间复杂度 :O(n),用于存储节点信息和分组数据","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3148426517","body":"## 算法思路\n- 使用哈希表存储已遍历的数值和索引\n- 对每个数值计算其配对数值,在哈希表中O(1)时间查找\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n // 创建哈希表,key为数值,value为索引\n const map = new Map();\n \n for (let i = 0; i < nums.length; i++) {\n // 计算当前数值需要配对的数值\n const complement = target - nums[i];\n \n // 在哈希表中查找配对数值\n if (map.has(complement)) {\n // 找到配对,返回两个索引\n return [map.get(complement), i];\n }\n \n // 将当前数值和索引存入哈希表\n map.set(nums[i], i);\n }\n \n return []; // 题目保证有解,这里不会执行到\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148432520","body":"## 算法思路\n采用桶排序的思想来实现:\n- 频率统计 :使用哈希表统计每个元素的出现频率\n- 桶排序 :创建频率桶,桶的索引表示频率,桶中存储具有该频率的元素\n- 结果收集 :从最高频率的桶开始遍历,收集前k个元素\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function(nums, k) {\n // 步骤1: 统计频率\n const freqMap = new Map();\n for (const num of nums) {\n freqMap.set(num, (freqMap.get(num) || 0) + 1);\n }\n \n // 步骤2: 创建频率桶\n // 桶的索引表示频率,桶中存储具有该频率的元素\n const buckets = new Array(nums.length + 1).fill(null).map(() => []);\n \n for (const [num, freq] of freqMap) {\n buckets[freq].push(num);\n }\n \n // 步骤3: 从高频率到低频率收集前k个元素\n const result = [];\n for (let i = buckets.length - 1; i >= 0 && result.length < k; i--) {\n if (buckets[i].length > 0) {\n result.push(...buckets[i]);\n }\n }\n \n // 返回前k个元素\n return result.slice(0, k);\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 满足题目要求的优于O(n log n)\n- 统计频率:O(n)\n- 创建桶并填充:O(n)\n- 收集结果:O(n)\n\n- 空间复杂度 :O(n)\n- 哈希表:O(n)\n- 桶数组:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3153115326","body":"## 算法思路\n- 核心思想 :枚举每个点作为回旋镖的中心点i\n- 距离计算 :计算中心点到所有其他点的欧式距离(使用距离平方避免开方运算)\n- 哈希统计 :使用Map统计相同距离的点的数量\n- 组合计算 :如果有n个点到中心点距离相同,可形成n×(n-1)个回旋镖\n- 顺序考虑 :回旋镖(i,j,k)和(i,k,j)是不同的,需要考虑j和k的顺序\n\n## 代码\n```javascript\n/**\n * @param {number[][]} points\n * @return {number}\n */\nvar numberOfBoomerangs = function(points) {\n let count = 0;\n \n // 遍历每个点作为回旋镖的中心点i\n for (let i = 0; i < points.length; i++) {\n // 使用Map记录从点i到其他点的距离及对应的点的数量\n const distanceMap = new Map();\n \n // 计算点i到其他所有点的距离\n for (let j = 0; j < points.length; j++) {\n if (i !== j) {\n // 计算欧式距离的平方(避免开方运算,提高效率)\n const distance = getDistanceSquared(points[i], points[j]);\n \n // 记录该距离对应的点的数量\n distanceMap.set(distance, (distanceMap.get(distance) || 0) + 1);\n }\n }\n \n // 对于每个距离,如果有n个点,则可以形成n*(n-1)个回旋镖\n // 因为回旋镖(i,j,k)中j和k的顺序是有意义的\n for (const [distance, pointCount] of distanceMap) {\n if (pointCount >= 2) {\n count += pointCount * (pointCount - 1);\n }\n }\n }\n \n return count;\n};\n\n/**\n * 计算两点间欧式距离的平方\n * @param {number[]} point1 \n * @param {number[]} point2 \n * @return {number}\n */\nfunction getDistanceSquared(point1, point2) {\n const dx = point1[0] - point2[0];\n const dy = point1[1] - point2[1];\n return dx * dx + dy * dy;\n}\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n²) - 外层循环n次,内层循环n-1次\n- 空间复杂度 :O(n) - 最坏情况下Map存储n-1个不同距离","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153126755","body":"## 算法思路\n- 滑动窗口技术 :使用双指针 left 和 right 构成滑动窗口\n- 哈希表优化 :记录每个字符最后出现的位置\n- 动态调整 :遇到重复字符时,将左指针移动到重复字符的下一个位置\n- 实时更新 :持续更新最大长度\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n if (s.length === 0) return 0;\n \n let left = 0; // 滑动窗口左指针\n let maxLength = 0; // 记录最大长度\n let charMap = new Map(); // 哈希表:字符 -> 最后出现的索引\n \n for (let right = 0; right < s.length; right++) {\n const char = s[right];\n \n // 如果字符已存在且在当前窗口内,移动左指针\n if (charMap.has(char) && charMap.get(char) >= left) {\n left = charMap.get(char) + 1;\n }\n \n // 更新字符的最新位置\n charMap.set(char, right);\n \n // 更新最大长度\n maxLength = Math.max(maxLength, right - left + 1);\n }\n \n return maxLength;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 每个字符最多被访问两次\n- 空间复杂度 :O(min(m,n)) - m是字符集大小,n是字符串长度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3158322222","body":"## 算法思路\n- 滑动窗口 + 哈希表 :避免生成所有排列组合,直接在原字符串上滑动匹配\n- 分层遍历 :由于words中所有单词长度相同,按单词长度为步长进行遍历\n- 频次匹配 :使用哈希表记录words中单词频次,滑动窗口中维护当前单词频次\n- 智能重置 :遇到不在words中的单词时,直接重置窗口位置\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n if (!s || !words || words.length === 0) return [];\n \n const wordLen = words[0].length;\n const totalLen = wordLen * words.length;\n const result = [];\n \n // 创建words的频次映射\n const wordCount = new Map();\n for (const word of words) {\n wordCount.set(word, (wordCount.get(word) || 0) + 1);\n }\n \n // 对于每个可能的起始位置(0到wordLen-1),使用滑动窗口\n for (let i = 0; i < wordLen; i++) {\n let left = i;\n let right = i;\n let validWords = 0;\n const windowCount = new Map();\n \n while (right + wordLen <= s.length) {\n // 扩展右边界,添加新单词\n const rightWord = s.substring(right, right + wordLen);\n right += wordLen;\n \n if (wordCount.has(rightWord)) {\n windowCount.set(rightWord, (windowCount.get(rightWord) || 0) + 1);\n if (windowCount.get(rightWord) <= wordCount.get(rightWord)) {\n validWords++;\n }\n \n // 如果窗口大小超过目标长度,收缩左边界\n while (right - left > totalLen) {\n const leftWord = s.substring(left, left + wordLen);\n left += wordLen;\n \n if (wordCount.has(leftWord)) {\n if (windowCount.get(leftWord) <= wordCount.get(leftWord)) {\n validWords--;\n }\n windowCount.set(leftWord, windowCount.get(leftWord) - 1);\n }\n }\n \n // 检查是否找到有效的串联子串\n if (validWords === words.length && right - left === totalLen) {\n result.push(left);\n }\n } else {\n // 遇到不在words中的单词,重置窗口\n windowCount.clear();\n validWords = 0;\n left = right;\n }\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n × m),其中n是字符串s的长度,m是单词长度\n- 外层循环m次(每个可能的起始偏移)\n- 内层每个字符最多被访问2次(加入和移出窗口)\n\n- 空间复杂度 :O(k),其中k是words数组的长度\n- 主要用于存储单词频次的哈希表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162949952","body":"## 算法思路\n- 数学原理 :如果数组总和 sum % p = remainder ,需要找到一个子数组,其和也等于 remainder ,移除后剩余部分就能被p整除\n- 技术方案 :使用前缀和 + 哈希表来高效查找目标子数组\n- 关键公式 : prefixSum[i] % p = (prefixSum[j] % p - remainder + p) % p\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar minSubarray = function(nums, p) {\n // 计算数组总和\n const totalSum = nums.reduce((sum, num) => sum + num, 0);\n \n // 如果总和已经能被p整除,不需要移除任何元素\n const remainder = totalSum % p;\n if (remainder === 0) {\n return 0;\n }\n \n // 使用哈希表记录前缀和的余数及其对应的索引\n const prefixMap = new Map();\n prefixMap.set(0, -1); // 初始化,前缀和为0时索引为-1\n \n let prefixSum = 0;\n let minLength = nums.length; // 初始化为数组长度(最坏情况)\n \n for (let i = 0; i < nums.length; i++) {\n prefixSum += nums[i];\n const currentRemainder = prefixSum % p;\n \n // 我们需要找到一个前缀和,使得当前前缀和减去它等于remainder\n // 即:currentRemainder - targetRemainder = remainder (mod p)\n // 所以:targetRemainder = (currentRemainder - remainder + p) % p\n const targetRemainder = (currentRemainder - remainder + p) % p;\n \n if (prefixMap.has(targetRemainder)) {\n const prevIndex = prefixMap.get(targetRemainder);\n const subarrayLength = i - prevIndex;\n minLength = Math.min(minLength, subarrayLength);\n }\n \n // 更新当前前缀和余数的索引\n prefixMap.set(currentRemainder, i);\n }\n \n // 如果最小长度等于数组长度,说明无法找到合适的子数组\n return minLength === nums.length ? -1 : minLength;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 只需要遍历数组一次,哈希表操作为O(1)\n- 空间复杂度 :O(min(n, p)) - 哈希表最多存储min(n, p)个不同的余数","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166733694","body":"## 算法思路\n使用 快慢指针 (Floyd's Tortoise and Hare Algorithm)技术:\n- 设置两个指针:慢指针每次移动一步,快指针每次移动两步\n- 当快指针到达链表末尾时,慢指针恰好位于链表的中间位置\n- 对于偶数长度的链表,返回第二个中间节点\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n // 使用快慢指针法(Floyd's Tortoise and Hare Algorithm)\n // 慢指针每次移动一步,快指针每次移动两步\n // 当快指针到达链表末尾时,慢指针正好在中间位置\n \n let slow = head; // 慢指针\n let fast = head; // 快指针\n \n // 当快指针和快指针的下一个节点都不为空时继续循环\n while (fast !== null && fast.next !== null) {\n slow = slow.next; // 慢指针移动一步\n fast = fast.next.next; // 快指针移动两步\n }\n \n // 当循环结束时,slow指针指向中间节点\n // 如果链表长度为奇数,slow指向唯一的中间节点\n // 如果链表长度为偶数,slow指向第二个中间节点\n return slow;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 需要遍历链表一次,其中n是链表的长度\n- 空间复杂度:O(1) - 只使用了两个额外的指针变量,不随输入规模增长","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3172634872","body":"## 算法思路\n- 双指针技术 :使用 slow 指针指向当前不重复元素的位置, fast 指针遍历数组\n- 原地修改 :当发现不重复元素时,将其复制到 slow+1 位置\n- 利用排序特性 :由于数组已排序,相同元素必然相邻,只需比较相邻元素\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n // 边界情况:空数组或只有一个元素\n if (nums.length <= 1) {\n return nums.length;\n }\n \n // slow指针指向当前不重复元素的位置\n let slow = 0;\n \n // fast指针遍历数组,从第二个元素开始\n for (let fast = 1; fast < nums.length; fast++) {\n // 如果当前元素与前一个不重复元素不同\n if (nums[fast] !== nums[slow]) {\n // 将slow指针向前移动一位\n slow++;\n // 将当前不重复元素复制到slow位置\n nums[slow] = nums[fast];\n }\n // 如果相同,fast继续向前,slow保持不变\n }\n \n // 返回不重复元素的个数(slow指向最后一个不重复元素的索引)\n return slow + 1;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 只需遍历数组一次\n- 空间复杂度 :O(1) - 只使用常数额外空间,符合原地修改要求","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172638327","body":"## 算法思路\n- 二分查找核心思想 :通过比较中间元素与目标值,每次排除一半搜索空间\n- 查找逻辑 :如果找到目标值返回索引,否则返回应插入的位置\n- 关键实现 :循环结束时left指针就是插入位置\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let left = 0;\n let right = nums.length - 1;\n \n // 二分查找\n while (left <= right) {\n // 计算中间位置,避免整数溢出\n let mid = Math.floor(left + (right - left) / 2);\n \n if (nums[mid] === target) {\n // 找到目标值,返回索引\n return mid;\n } else if (nums[mid] < target) {\n // 目标值在右半部分\n left = mid + 1;\n } else {\n // 目标值在左半部分\n right = mid - 1;\n }\n }\n \n // 没找到目标值,left就是应该插入的位置\n return left;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(log n) - 满足题目要求,每次迭代将搜索范围缩小一半\n- 空间复杂度 :O(1) - 只使用常数级别的额外变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3174034461","body":"## 算法思路\n使用双端队列维护一个单调递减的队列,队列中存储数组元素的索引:\n\n- 队首始终是当前窗口的最大值索引\n- 移除超出窗口范围的元素\n- 维护单调性:移除队尾所有小于等于当前元素的索引\n- 当窗口形成时,队首就是最大值\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar maxSlidingWindow = function(nums, k) {\n if (!nums || nums.length === 0 || k <= 0) {\n return [];\n }\n \n const result = [];\n const deque = []; // 存储数组索引的双端队列\n \n for (let i = 0; i < nums.length; i++) {\n // 移除队列中超出窗口范围的元素\n while (deque.length > 0 && deque[0] <= i - k) {\n deque.shift();\n }\n \n // 维护单调递减队列:移除队尾所有小于当前元素的索引\n while (deque.length > 0 && nums[deque[deque.length - 1]] <= nums[i]) {\n deque.pop();\n }\n \n // 将当前元素索引加入队尾\n deque.push(i);\n \n // 当窗口大小达到k时,开始记录结果\n if (i >= k - 1) {\n result.push(nums[deque[0]]); // 队首是当前窗口最大值\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 每个元素最多进队列和出队列各一次\n- 空间复杂度 :O(k) - 队列最多存储k个元素","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178188012","body":"## 算法思路:\n- 使用度数统计法,将问题转化为图论中的入度和出度计算\n- 法官的特征:不信任任何人(出度=0)+ 被所有其他人信任(入度=n-1)\n- 通过计算每个人的\"信任度\"(入度-出度)来找到法官\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n // 特殊情况:只有一个人且没有信任关系,那么这个人就是法官\n if (n === 1 && trust.length === 0) {\n return 1;\n }\n \n // 初始化信任度数组,trustScore[i] = 入度 - 出度\n const trustScore = new Array(n + 1).fill(0);\n \n // 遍历所有信任关系\n for (const [a, b] of trust) {\n trustScore[a]--; // a信任别人,出度+1,所以信任度-1\n trustScore[b]++; // b被信任,入度+1,所以信任度+1\n }\n \n // 查找信任度为n-1的人(法官候选人)\n for (let i = 1; i <= n; i++) {\n if (trustScore[i] === n - 1) {\n return i;\n }\n }\n \n // 没有找到法官\n return -1;\n};\n```\n\n## 算法复杂度分析\n- 时间复杂度: O(E + n)\n- 遍历trust数组:O(E),其中E是信任关系数量\n- 查找法官:O(n)\n\n- 空间复杂度: O(n)\n- 需要额外的信任度数组存储每个人的统计信息","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182100538","body":"## 算法思路\n这是一个经典的二分图判断问题。核心思想是:\n\n- 将问题转化为图着色问题\n- 构建无向图,其中dislikes数组中的每一对表示图中的一条边\n- 使用DFS图着色算法判断是否能用两种颜色给所有节点着色\n- 如果相邻节点都能着不同颜色,则可以分成两组\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nvar possibleBipartition = function(n, dislikes) {\n // 构建邻接表表示图\n const graph = new Array(n + 1).fill(null).map(() => []);\n for (const [a, b] of dislikes) {\n graph[a].push(b);\n graph[b].push(a);\n }\n \n // 用于记录每个节点的颜色,0表示未着色,1和-1表示两种不同的颜色\n const colors = new Array(n + 1).fill(0);\n \n // DFS着色函数\n const dfs = (node, color) => {\n colors[node] = color;\n \n // 遍历所有邻接节点\n for (const neighbor of graph[node]) {\n if (colors[neighbor] === 0) {\n // 如果邻接节点未着色,给它着相反的颜色\n if (!dfs(neighbor, -color)) {\n return false;\n }\n } else if (colors[neighbor] === color) {\n // 如果邻接节点已经着色且颜色相同,说明不能构成二分图\n return false;\n }\n }\n return true;\n };\n \n // 遍历所有节点,处理可能存在的多个连通分量\n for (let i = 1; i <= n; i++) {\n if (colors[i] === 0) {\n if (!dfs(i, 1)) {\n return false;\n }\n }\n }\n \n return true;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(V + E),其中V是节点数量(n个人),E是边的数量(dislikes数组长度)\n- 空间复杂度 :O(V + E),主要用于邻接表存储、颜色数组和DFS递归栈","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186630947","body":"## 算法思路分析:\n这是一个双层拓扑排序问题\n- 首先需要对小组进行拓扑排序,确保依赖的小组在前面\n- 然后对每个小组内的项目进行拓扑排序\n- 最后按小组顺序合并结果\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n // 为没有小组的项目分配虚拟小组ID\n let groupId = m;\n for (let i = 0; i < n; i++) {\n if (group[i] === -1) {\n group[i] = groupId++;\n }\n }\n \n // 构建小组图和项目图\n const groupGraph = new Array(groupId).fill(0).map(() => []);\n const groupIndegree = new Array(groupId).fill(0);\n const itemGraph = new Array(n).fill(0).map(() => []);\n const itemIndegree = new Array(n).fill(0);\n \n // 构建依赖关系图\n const groupEdges = new Set(); // 用于去重小组间的边\n \n for (let i = 0; i < n; i++) {\n for (const beforeItem of beforeItems[i]) {\n const beforeGroup = group[beforeItem];\n const currentGroup = group[i];\n \n // 项目依赖关系\n itemGraph[beforeItem].push(i);\n itemIndegree[i]++;\n \n // 小组依赖关系(只有当项目属于不同小组时)\n if (beforeGroup !== currentGroup) {\n const edgeKey = `${beforeGroup}->${currentGroup}`;\n if (!groupEdges.has(edgeKey)) {\n groupEdges.add(edgeKey);\n groupGraph[beforeGroup].push(currentGroup);\n groupIndegree[currentGroup]++;\n }\n }\n }\n }\n \n // 拓扑排序函数\n function topologicalSort(graph, indegree) {\n const queue = [];\n const result = [];\n \n // 找到所有入度为0的节点\n for (let i = 0; i < indegree.length; i++) {\n if (indegree[i] === 0) {\n queue.push(i);\n }\n }\n \n while (queue.length > 0) {\n const node = queue.shift();\n result.push(node);\n \n // 更新相邻节点的入度\n for (const neighbor of graph[node]) {\n indegree[neighbor]--;\n if (indegree[neighbor] === 0) {\n queue.push(neighbor);\n }\n }\n }\n \n return result.length === graph.length ? result : [];\n }\n \n // 对小组进行拓扑排序\n const sortedGroups = topologicalSort(groupGraph, [...groupIndegree]);\n if (sortedGroups.length === 0) {\n return []; // 小组间存在循环依赖\n }\n \n // 对项目进行拓扑排序\n const sortedItems = topologicalSort(itemGraph, [...itemIndegree]);\n if (sortedItems.length === 0) {\n return []; // 项目间存在循环依赖\n }\n \n // 按小组分类项目\n const groupToItems = new Map();\n for (const item of sortedItems) {\n const itemGroup = group[item];\n if (!groupToItems.has(itemGroup)) {\n groupToItems.set(itemGroup, []);\n }\n groupToItems.get(itemGroup).push(item);\n }\n \n // 按小组顺序合并结果\n const result = [];\n for (const groupId of sortedGroups) {\n if (groupToItems.has(groupId)) {\n result.push(...groupToItems.get(groupId));\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n时间复杂度:O(n + E)\n- 构建图:O(E),E为所有依赖关系总数\n- 小组拓扑排序:O(V_g + E_g)\n- 项目拓扑排序:O(V_i + E_i)\n- 结果合并:O(n)\n\n空间复杂度:O(n + E + m)\n- 图存储:O(n + E)\n- 入度数组:O(n + m)\n- 辅助数据结构:O(n + m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3191484423","body":"## 算法思路\n机器人要回到原点(0,0),必须满足两个条件:\n- 向左移动的次数 = 向右移动的次数\n- 向上移动的次数 = 向下移动的次数\n\n## 代码\n```javascript\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let x = 0, y = 0; // 当前坐标\n \n for (let move of moves) {\n switch (move) {\n case 'L':\n x--;\n break;\n case 'R':\n x++;\n break;\n case 'U':\n y++;\n break;\n case 'D':\n y--;\n break;\n }\n }\n \n return x === 0 && y === 0;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n),其中n是moves字符串的长度,需要遍历一次字符串\n- 空间复杂度 :O(1),只使用了常数个额外变量,不随输入规模变化","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3194108225","body":"## 算法思路\n- 预处理 :为每个任务添加原始索引,按进入时间排序\n- 模拟执行 :使用最小堆维护可执行任务队列,按执行时间最短优先、索引最小优先的规则选择任务\n- 时间管理 :CPU空闲时直接跳转到下一个任务的进入时间,避免无效等待\n\n## 代码\n```javascript\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n const n = tasks.length;\n \n // 为每个任务添加原始索引,然后按进入时间排序\n const taskWithIndex = tasks.map((task, index) => [task[0], task[1], index]);\n taskWithIndex.sort((a, b) => a[0] - b[0]); // 按enqueueTime排序\n \n const result = [];\n // 优先队列:按执行时间升序,相同时按索引升序\n const availableTasks = new MinHeap((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按processingTime升序\n }\n return a[1] - b[1]; // 按originalIndex升序\n });\n \n let currentTime = 0;\n let taskIndex = 0; // 指向下一个要加入队列的任务\n \n while (result.length < n) {\n // 将所有在当前时间或之前进入队列的任务加入可执行队列\n while (taskIndex < n && taskWithIndex[taskIndex][0] <= currentTime) {\n const [enqueueTime, processingTime, originalIndex] = taskWithIndex[taskIndex];\n availableTasks.push([processingTime, originalIndex]);\n taskIndex++;\n }\n \n if (availableTasks.size() === 0) {\n // CPU空闲,直接跳到下一个任务的进入时间\n if (taskIndex < n) {\n currentTime = taskWithIndex[taskIndex][0];\n }\n } else {\n // 从可执行任务中选择执行时间最短的(相同时选择索引最小的)\n const [processingTime, originalIndex] = availableTasks.pop();\n result.push(originalIndex);\n currentTime += processingTime;\n }\n }\n \n return result;\n};\n\n// 最小堆实现\nclass MinHeap {\n constructor(compareFn) {\n this.heap = [];\n this.compare = compareFn || ((a, b) => a - b);\n }\n \n push(val) {\n this.heap.push(val);\n this.bubbleUp(this.heap.length - 1);\n }\n \n pop() {\n if (this.heap.length === 0) return undefined;\n if (this.heap.length === 1) return this.heap.pop();\n \n const top = this.heap[0];\n this.heap[0] = this.heap.pop();\n this.bubbleDown(0);\n return top;\n }\n \n size() {\n return this.heap.length;\n }\n \n bubbleUp(index) {\n while (index > 0) {\n const parentIndex = Math.floor((index - 1) / 2);\n if (this.compare(this.heap[index], this.heap[parentIndex]) >= 0) break;\n \n [this.heap[index], this.heap[parentIndex]] = [this.heap[parentIndex], this.heap[index]];\n index = parentIndex;\n }\n }\n \n bubbleDown(index) {\n while (true) {\n let minIndex = index;\n const leftChild = 2 * index + 1;\n const rightChild = 2 * index + 2;\n \n if (leftChild < this.heap.length && \n this.compare(this.heap[leftChild], this.heap[minIndex]) < 0) {\n minIndex = leftChild;\n }\n \n if (rightChild < this.heap.length && \n this.compare(this.heap[rightChild], this.heap[minIndex]) < 0) {\n minIndex = rightChild;\n }\n \n if (minIndex === index) break;\n \n [this.heap[index], this.heap[minIndex]] = [this.heap[minIndex], this.heap[index]];\n index = minIndex;\n }\n }\n}\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n log n)\n - 排序:O(n log n)\n - 堆操作:每个任务最多进出堆一次,总计O(n log n)\n- 空间复杂度 :O(n)\n - 存储任务信息、最小堆和结果数组","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194111949","body":"## 算法核心思路\n- 1.时间转换 :将 \"HH:MM\" 格式转换为分钟数便于计算\n- 2.对局编号计算 :\n - 开始时间: Math.ceil(minutes / 15) 确保只计算完整参与的对局\n - 结束时间: Math.floor(minutes / 15) 确保只计算完整参与的对局\n- 3.分情况处理 :\n - 同一天:结束时间对局编号 - 开始时间对局编号\n - 跨夜:(96 - 开始时间对局编号) + 结束时间对局编号\n\n## 代码\n```javascript\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n // 将时间字符串转换为分钟数\n function timeToMinutes(time) {\n const [hours, minutes] = time.split(':').map(Number);\n return hours * 60 + minutes;\n }\n \n const startMinutes = timeToMinutes(loginTime);\n const endMinutes = timeToMinutes(logoutTime);\n \n // 如果结束时间早于开始时间,说明跨越了午夜\n if (endMinutes < startMinutes) {\n // 跨夜情况:从开始时间到午夜 + 从午夜到结束时间\n // 计算从开始时间到午夜能完成的对局数\n const roundsBeforeMidnight = 96 - Math.ceil(startMinutes / 15);\n // 计算从午夜到结束时间能完成的对局数\n const roundsAfterMidnight = Math.floor(endMinutes / 15);\n return roundsBeforeMidnight + roundsAfterMidnight;\n } else {\n // 同一天情况\n // 能完成的对局数 = 结束时间所在的对局编号 - 开始时间所在的对局编号\n const result = Math.floor(endMinutes / 15) - Math.ceil(startMinutes / 15);\n return Math.max(0, result); // 确保不返回负数\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(1) - 所有操作都是常数时间的数学计算\n- 空间复杂度 :O(1) - 只使用固定数量的变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3197064559","body":"## 算法思路\n- 1.统计字符频率\n- 2.条件三:变成同一个字母\n- 3.条件一 & 条件二:字母严格大小比较\n- 4.综合最优解\n\n## 代码\n```javascript\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n let n = a.length, m = b.length;\n\n let freqA = new Array(26).fill(0);\n let freqB = new Array(26).fill(0);\n\n for (let ch of a) freqA[ch.charCodeAt(0) - 97]++;\n for (let ch of b) freqB[ch.charCodeAt(0) - 97]++;\n\n // 前缀和\n let prefixA = new Array(27).fill(0);\n let prefixB = new Array(27).fill(0);\n for (let i = 0; i < 26; i++) {\n prefixA[i+1] = prefixA[i] + freqA[i];\n prefixB[i+1] = prefixB[i] + freqB[i];\n }\n\n // 条件三:相同字母\n let ops3 = Infinity;\n for (let i = 0; i < 26; i++) {\n ops3 = Math.min(ops3, n + m - (freqA[i] + freqB[i]));\n }\n\n // 条件一 & 二\n let ops1 = Infinity, ops2 = Infinity;\n for (let c = 0; c < 25; c++) { // 0~24,分割点\n // a < b\n ops1 = Math.min(ops1, (n - prefixA[c+1]) + prefixB[c+1]);\n // b < a\n ops2 = Math.min(ops2, (m - prefixB[c+1]) + prefixA[c+1]);\n }\n\n return Math.min(ops1, ops2, ops3);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n + m)\n- 空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199072283","body":"## 算法思路\n- 1.将数组构建为一个 最大堆(heapify)\n 最大堆性质:父节点值 ≥ 子节点值。\n- 2.交换堆顶(最大值)和堆尾元素,把最大值放到最终位置。\n- 3.缩小堆的范围(长度减 1),重新 heapify。\n- 4.重复步骤 2–3,直到整个数组有序。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function(nums) {\n let n = nums.length;\n\n // 建堆(从最后一个非叶子节点开始向下调整)\n for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {\n heapify(nums, n, i);\n }\n\n // 不断取出堆顶(最大值)放到数组末尾\n for (let i = n - 1; i > 0; i--) {\n // 交换堆顶和堆尾\n [nums[0], nums[i]] = [nums[i], nums[0]];\n // 调整剩余部分\n heapify(nums, i, 0);\n }\n\n return nums;\n};\n\n// 调整为最大堆\nfunction heapify(arr, heapSize, root) {\n let largest = root;\n let left = 2 * root + 1;\n let right = 2 * root + 2;\n\n if (left < heapSize && arr[left] > arr[largest]) {\n largest = left;\n }\n\n if (right < heapSize && arr[right] > arr[largest]) {\n largest = right;\n }\n\n if (largest !== root) {\n [arr[root], arr[largest]] = [arr[largest], arr[root]];\n heapify(arr, heapSize, largest);\n }\n}\n```\n\n## 复杂度分析\n- 时间复杂度\n建堆:O(n)\n每次取出最大值并 heapify:O(log n),共 n 次\n总计:O(n log n)\n- 空间复杂度\n堆排序在原数组上操作,只需要 O(1) 额外空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204787436","body":"## 算法思路:\n- 平方根一定在 1 ~ x/2 之间(除了 0 和 1 特殊处理)。\n- 用二分查找,比较 mid * mid 与 x。\n- 如果等于就直接返回。\n- 如果小于,就把 mid 作为候选答案,继续往右找。\n- 如果大于,就往左缩。\n\n## 代码\n```javascript\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n if (x < 2) return x; // 0 -> 0, 1 -> 1\n\n let left = 1, right = Math.floor(x / 2), ans = 0;\n while (left <= right) {\n let mid = Math.floor((left + right) / 2);\n let square = mid * mid;\n\n if (square === x) {\n return mid;\n } else if (square < x) {\n ans = mid; // mid 可能是答案\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 O(log n)\n- 空间复杂度 O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3209498631","body":"## 算法思路\n- 设定搜索区间 [1, n]。\n- 取中点 mid = Math.floor((left + right) / 2)。\n- 调用 isBadVersion(mid):\n- 如果是坏的(true),说明答案在 左边或就是 mid,更新 right = mid。\n- 如果不是坏的(false),说明答案在 右边,更新 left = mid + 1。\n- 循环直到 left == right,此时 left 就是第一个坏版本。\n\n## 代码\n```javascript\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let left = 1, right = n;\n while (left < right) {\n let mid = Math.floor((left + right) / 2);\n if (isBadVersion(mid)) {\n // mid 可能是第一个坏版本,所以不能跳过它\n right = mid;\n } else {\n // mid 不是坏的,第一个坏版本在右边\n left = mid + 1;\n }\n }\n return left; // 或者 right,二者相等\n };\n};\n```\n\n## 复杂度分析\n- 时间复杂度:每次二分区间缩小一半,最多调用 isBadVersion O(log n) 次。\n- 空间复杂度:我们只用到了几个变量,额外空间复杂度是 O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3214357168","body":"## 算法思路\n- 1.分治思想(归并排序)\n- 把数组分为两半,分别统计左半部分和右半部分的翻转对数量。\n- 在合并的时候,再统计「跨左右两部分」的翻转对数量。\n- 2.跨区间统计方法\n- 假设左半部分是 left[],右半部分是 right[],它们都是有序的。\n- 对于每个 left[i],我们需要统计右边有多少个 right[j] 满足left[i]>2×right[j]\n- 因为 right[] 已经排序,可以用一个指针 双指针扫描,避免嵌套循环。\n- 3.合并排序\n- 统计完跨区间的翻转对数量后,把两个有序数组合并,递归回溯。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n if (!nums || nums.length === 0) return 0;\n\n const mergeSort = (arr, left, right) => {\n if (left >= right) return 0;\n\n let mid = Math.floor((left + right) / 2);\n let count = mergeSort(arr, left, mid) + mergeSort(arr, mid + 1, right);\n\n // 统计跨区间翻转对\n let j = mid + 1;\n for (let i = left; i <= mid; i++) {\n while (j <= right && arr[i] > 2 * arr[j]) {\n j++;\n }\n count += (j - (mid + 1));\n }\n\n // 合并两个有序数组\n let temp = [];\n let p1 = left, p2 = mid + 1;\n while (p1 <= mid && p2 <= right) {\n if (arr[p1] <= arr[p2]) {\n temp.push(arr[p1++]);\n } else {\n temp.push(arr[p2++]);\n }\n }\n while (p1 <= mid) temp.push(arr[p1++]);\n while (p2 <= right) temp.push(arr[p2++]);\n\n for (let i = 0; i < temp.length; i++) {\n arr[left + i] = temp[i];\n }\n\n return count;\n };\n\n return mergeSort(nums, 0, nums.length - 1);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(nlogn)\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3218651000","body":"## 算法思路\n\n- 排序\n- 对 houses 和 heaters 进行排序,方便二分查找。\n- 二分查找\n- 对于每个房屋 h,在 heaters 中二分查找,找到最接近 h 的供暖器位置。\n- 计算 |h - heater_left| 和 |h - heater_right| 的最小值。\n- 得到该房屋的最小供暖距离。\n- 取最大值\n- 遍历所有房屋,取最小距离的最大值。\n\n## 代码\n```javascript\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n houses.sort((a, b) => a - b);\n heaters.sort((a, b) => a - b);\n\n let radius = 0;\n\n for (let house of houses) {\n // 二分查找\n let left = 0, right = heaters.length - 1;\n while (left <= right) {\n let mid = Math.floor((left + right) / 2);\n if (heaters[mid] < house) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n // left 是第一个 >= house 的位置\n let dist1 = (left < heaters.length) ? Math.abs(heaters[left] - house) : Infinity;\n let dist2 = (right >= 0) ? Math.abs(heaters[right] - house) : Infinity;\n\n let nearest = Math.min(dist1, dist2);\n radius = Math.max(radius, nearest);\n }\n\n return radius;\n};\n```\n\n## 复杂度分析\n- 排序\n- houses 排序:O(n log n)\n- heaters 排序:O(m log m)\n- 二分查找\n- 每个房屋做一次二分:O(log m)\n- 共 n 个房屋:O(n log m)\n- 总时间复杂度:O(nlogn+mlogm+nlogm)\n- 空间复杂度:O(1)(除了排序外,常数额外空间)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3218659174","body":"## 排序数组\n- 先对 nums 排序。这样数对距离 = 两个数的差,可以利用单调性。\n- 二分查找答案\n- 距离范围:最小值 0,最大值 max(nums) - min(nums)。\n- 设二分中间值为 mid,问题转化为:\n- 数组中有多少对数对距离 ≤ mid。\n- 双指针统计 ≤ mid 的数对数量\n- 排序后数组 nums 单调递增。\n- 用两个指针 i、j:\n- 固定右端点 j,向左找满足 nums[j] - nums[i] <= mid 的最小 i。\n- 那么从 i 到 j-1 的所有元素都和 j 构成合法数对,总数是 j - i。\n- 整个过程是 O(n)。\n- 二分逻辑\n- 如果 ≤ mid 的数对数目 ≥ k,说明答案可能更小,右边界收缩。\n- 否则说明距离太小,左边界右移。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a, b) => a - b);\n\n // 统计差值 <= mid 的数对个数\n function countPairs(mid) {\n let count = 0;\n let i = 0;\n for (let j = 0; j < nums.length; j++) {\n while (nums[j] - nums[i] > mid) {\n i++;\n }\n count += j - i;\n }\n return count;\n }\n\n let left = 0, right = nums[nums.length - 1] - nums[0];\n while (left < right) {\n let mid = Math.floor((left + right) / 2);\n if (countPairs(mid) >= k) {\n right = mid; // 答案可能是 mid 或更小\n } else {\n left = mid + 1;\n }\n }\n return left;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 排序:O(n log n)\n- 二分查找:查找范围是 max(nums) - min(nums),最大 1e6,二分次数约 log(1e6) ≈ 20。\n- 每次 countPairs:O(n)(双指针扫描一遍)。\n- 总复杂度:O(n log n + n log W),其中 W = max(nums) - min(nums)。对 n = 1e4,完全可行。\n- 空间复杂度\n- 只用了常数级变量,O(1)(不算排序)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218668542","body":"## 算法思路\n- 二分 + BFS/DFS\n- 时间范围是 [max(grid[0][0], grid[n-1][n-1]), n^2-1]。\n- 二分水位 mid,检查是否能在 mid 水位下从 (0,0) 到 (n-1,n-1)。\n- 如果可以,则收缩右边界,否则收缩左边界。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n const n = grid.length;\n const directions = [[1,0],[-1,0],[0,1],[0,-1]];\n \n // 检查是否能在水位 t 下到达终点\n function canReach(t) {\n if (grid[0][0] > t) return false;\n const visited = Array.from({length: n}, () => Array(n).fill(false));\n const queue = [[0,0]];\n visited[0][0] = true;\n\n while (queue.length > 0) {\n const [x, y] = queue.shift();\n if (x === n-1 && y === n-1) return true;\n for (const [dx, dy] of directions) {\n const nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n &&\n !visited[nx][ny] && grid[nx][ny] <= t) {\n visited[nx][ny] = true;\n queue.push([nx, ny]);\n }\n }\n }\n return false;\n }\n\n // 二分查找最小可行水位\n let low = Math.max(grid[0][0], grid[n-1][n-1]);\n let high = n * n - 1;\n let ans = high;\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (canReach(mid)) {\n ans = mid;\n high = mid - 1; // 尝试更小的水位\n } else {\n low = mid + 1;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- BFS 最多访问 n^2 个格子,复杂度 O(n^2)。\n- 二分查找 范围大小约为 n^2,二分次数 O(log(n^2)) = O(log n)。\n- 总时间复杂度:O(n^2 log n)。\n- 空间复杂度:需要 visited 数组 O(n^2)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3226685252","body":"## 核心思路\n- 滑动窗口(Sliding Window)\n- 定义元音集合\n- vowels = new Set(['a','e','i','o','u'])\n- 初始化窗口\n- 先统计前 k 个字符里元音的数量 count。\n- 这就是第一个窗口的元音数。\n- 滑动窗口\n- 从 i = k 开始,窗口向右滑动:\n- 移除窗口最左边的字符(如果它是元音则 count--)。\n- 加入窗口最右边的字符(如果它是元音则 count++)。\n- 每次更新最大值 maxCount = Math.max(maxCount, count)。\n- 提前终止\n- 如果 maxCount === k,说明某个窗口里全是元音,直接返回结果(不可能更大了)。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n const vowels = new Set(['a', 'e', 'i', 'o', 'u']);\n let count = 0, maxCount = 0;\n\n // 初始化前 k 个字符\n for (let i = 0; i < k; i++) {\n if (vowels.has(s[i])) count++;\n }\n maxCount = count;\n\n // 滑动窗口\n for (let i = k; i < s.length; i++) {\n if (vowels.has(s[i - k])) count--; // 移除最左边\n if (vowels.has(s[i])) count++; // 加入最右边\n maxCount = Math.max(maxCount, count);\n if (maxCount === k) return k; // 提前终止\n }\n\n return maxCount;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 初始化前 k 个字符统计需要 O(k)。\n- 然后遍历整个字符串一次 O(n)。\n- 总体复杂度:O(n)。\n- 空间复杂度:\n- 仅使用一个集合 Set 存元音,空间 O(1)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3226702074","body":"## 思路分析\n- 边界情况\n- 如果 k == 0:Alice 一开始就停,不抽牌,分数是 0。如果 0 <= n,返回 1;否则返回 0。\n- 如果 n >= k - 1 + maxPts:Alice 不可能超过 n,因为最大分数就是 k-1 + maxPts。此时概率是 1。\n- 动态规划建模\n- 定义 dp[i] = 从分数 i 出发,Alice 最终分数不超过 n 的概率。\n- 最终答案是 dp[0]。\n- 如果 i >= k:表示 Alice 已经停了。\n- 如果 i <= n:返回 1(安全)。\n- 否则返回 0(爆掉)。\n- 如果 i < k:Alice 会继续抽。\n- 优化:滑动窗口\n- 用一个变量 windowSum 维护滑动和,就能做到 O(n)。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n // 速返:一开始就停;或最高可能分也不超过 n\n if (k === 0 || n >= k - 1 + maxPts) return 1.0;\n\n const dp = new Array(n + 1).fill(0.0);\n // 终止区间:达到/超过 k 后立即停;在 [k, n] 内都是成功状态\n for (let i = k; i <= n; i++) dp[i] = 1.0;\n\n // 初始窗口和:dp[k]..dp[k+maxPts-1],这些里面只有 <= n 的是 1\n let windowSum = Math.min(n - k + 1, maxPts);\n\n // 从后往前做滑动平均\n for (let i = k - 1; i >= 0; i--) {\n dp[i] = windowSum / maxPts;\n // 更新窗口:加上新放入的 dp[i],减去滑出窗口的 dp[i + maxPts](越界视为 0)\n windowSum += dp[i] - (i + maxPts <= n ? dp[i + maxPts] : 0);\n // 也可写成:windowSum += dp[i] - (dp[i + maxPts] ?? 0);\n }\n return dp[0];\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 只遍历了一次数组,每个状态 O(1) 计算。\n- 时间复杂度:O(n)\n- 空间复杂度\n- 需要一个 dp 数组大小为 O(n)。\n- 也可以优化成 O(maxPts)(因为只依赖一个窗口)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3231363055","body":"## 算法思路\n- 核心观察\n- 一个字符串的异位词就是 字符相同但顺序不同 的字符串。\n- 如果子串和 p 的 字符频率统计完全相同,那么它就是一个异位词。\n- 滑动窗口\n- 用两个数组(或哈希表)存放字符频率:\n- pCount 记录 p 中各字符出现次数。\n- sCount 记录当前窗口(长度等于 p.length)的各字符出现次数。\n- 每次窗口滑动:\n- 移入一个字符,更新 sCount。\n- 移出一个字符,更新 sCount。\n- 如果 sCount 和 pCount 相等,则记录当前窗口起始位置。\n- 优化比较\n- 不需要每次都完整比较两个数组(O(26))。\n- 但因为字符集仅 26 个,比较成本很小,可以直接比较数组,整体复杂度依旧可接受。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nvar findAnagrams = function(s, p) {\n let res = [];\n let m = p.length, n = s.length;\n if (n < m) return res;\n\n // 频次数组,26个小写字母\n let pCount = new Array(26).fill(0);\n let sCount = new Array(26).fill(0);\n\n // 统计 p 的频率\n for (let ch of p) {\n pCount[ch.charCodeAt(0) - 97]++;\n }\n\n // 初始化第一个窗口\n for (let i = 0; i < m; i++) {\n sCount[s.charCodeAt(i) - 97]++;\n }\n\n // 比较初始窗口\n if (sCount.join() === pCount.join()) res.push(0);\n\n // 滑动窗口\n for (let i = m; i < n; i++) {\n sCount[s.charCodeAt(i) - 97]++; // 加入右边字符\n sCount[s.charCodeAt(i - m) - 97]--; // 移出左边字符\n\n if (sCount.join() === pCount.join()) {\n res.push(i - m + 1);\n }\n }\n\n return res;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 初始化统计频率:O(m)\n- 滑动窗口遍历 s:O(n)\n- 每次比较频率数组:O(26) = O(1)\n- 总复杂度:O(n + m)\n- 空间复杂度\n- 两个长度为 26 的数组:O(26) ≈ O(1)\n- 结果数组存储下标,最坏情况 O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3236034367","body":"## 算法思路\n- 核心思想:滑动窗口\n- 我们在字符串 s 上维护一个动态窗口 [left, right)。\n- 用 need 记录字符串 t 中每个字符需要的次数。\n- 用 window 记录当前窗口中每个字符出现的次数。\n- 不断扩展 right 指针,直到窗口内满足 t 的要求。\n- 然后收缩 left,尽量缩小窗口,直到不满足要求为止。\n- 在满足要求的情况下,更新最小子串。\n- 满足条件的判断\n- 我们可以维护一个 valid 变量,表示窗口中满足 need 的字符种类数。\n- 当 valid === need.size 时,说明窗口包含了所有需要的字符。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nvar minWindow = function(s, t) {\n let need = new Map();\n let window = new Map();\n\n for (let c of t) {\n need.set(c, (need.get(c) || 0) + 1);\n }\n\n let left = 0, right = 0;\n let valid = 0;\n let start = 0, len = Infinity;\n\n while (right < s.length) {\n let c = s[right];\n right++;\n if (need.has(c)) {\n window.set(c, (window.get(c) || 0) + 1);\n if (window.get(c) === need.get(c)) {\n valid++;\n }\n }\n\n // 收缩左边界\n while (valid === need.size) {\n if (right - left < len) {\n start = left;\n len = right - left;\n }\n let d = s[left];\n left++;\n if (need.has(d)) {\n if (window.get(d) === need.get(d)) {\n valid--;\n }\n window.set(d, window.get(d) - 1);\n }\n }\n }\n\n return len === Infinity ? \"\" : s.substr(start, len);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 每个字符最多被左右指针访问一次,所以是 O(m + n),其中 m = s.length, n = t.length。\n- 空间复杂度:\n- 哈希表 need 和 window 至多包含全部字符,大小为 O(Σ),Σ 是字符集大小(对英文就是 O(26) 或 O(52) 或 O(128))。\n- 所以空间复杂度 O(Σ)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/50#issuecomment-3247555036","body":"## 算法思路\n- 一共要拿 k 张牌,可以从数组两端取。\n- 等价于:我们留下 n - k 张牌(连续子数组),这些是不能拿的。\n- 因此,最大得分 = 总和 - 最小的长度为 (n - k) 的子数组的和。\n- 先计算数组总和 total。\n- 如果 k == n,那就直接返回 total。\n- 否则,使用滑动窗口大小为 (n - k),找到 最小窗口和。\n- 答案就是 total - min_window_sum。\n\n## 代码\n```javascript\n/**\n * @param {number[]} cardPoints\n * @param {number} k\n * @return {number}\n */\nvar maxScore = function(cardPoints, k) {\n const n = cardPoints.length;\n const total = cardPoints.reduce((a, b) => a + b, 0);\n \n // 特殊情况:拿所有卡牌\n if (k === n) return total;\n \n const windowSize = n - k;\n // 初始化窗口和\n let windowSum = 0;\n for (let i = 0; i < windowSize; i++) {\n windowSum += cardPoints[i];\n }\n let minWindowSum = windowSum;\n \n // 滑动窗口\n for (let i = windowSize; i < n; i++) {\n windowSum += cardPoints[i] - cardPoints[i - windowSize];\n minWindowSum = Math.min(minWindowSum, windowSum);\n }\n \n return total - minWindowSum;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 计算总和 O(n)\n- 滑动窗口遍历一次数组 O(n)\n- 总复杂度 O(n)\n- 空间复杂度:\n- 只用常数级变量存储 O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3247564267","body":"## 算法思路\n- 枚举所有可能的小时和分钟\n- 小时范围:0–11\n- 分钟范围:0–59\n- 总共 12 × 60 = 720 种组合。\n- 统计二进制表示中 1 的个数\n- bitCount(h) + bitCount(m) == turnedOn 才是合法解。\n- 其中 bitCount(x) 表示数字 x 的二进制中 1 的数量。\n- 格式化输出\n- 小时 h 直接转成字符串(不能有前导零)。\n- 分钟 m 必须是两位数,若小于 10 需在前面补 0。\n\n## 代码\n```javascript\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n const res = [];\n // 遍历所有可能的时间\n for (let h = 0; h < 12; h++) {\n for (let m = 0; m < 60; m++) {\n // 检查是否满足亮灯数量\n if (bitCount(h) + bitCount(m) === turnedOn) {\n // 格式化分钟(必须两位数)\n const time = `${h}:${m.toString().padStart(2, '0')}`;\n res.push(time);\n }\n }\n }\n return res;\n};\n\n// 计算二进制数中 1 的个数\nfunction bitCount(num) {\n let count = 0;\n while (num > 0) {\n count += num & 1;\n num >>= 1;\n }\n return count;\n}\n```\n\n## 复杂度分析\n- 外层遍历所有 12 × 60 = 720 种时间组合 → O(720) ≈ O(1) (常数级,最多 720 次)。\n- 每次计算 bitCount(h) 和 bitCount(m),\n- h < 12(最多 4 bit),m < 60(最多 6 bit),所以计算一次 bitCount 的复杂度 ≤ 10。\n- 总复杂度依然是常数级。\n- 时间复杂度:O(1) (严格来说是 O(720×10),但近似常数)\n- 空间复杂度:O(1) (除返回结果外仅使用常量存储)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3247575227","body":"## 算法思路(回溯法)\n- 逐行放置:从第 0 行开始,尝试在每一列放置皇后。\n- 约束检查:放置前,检查当前列和对角线是否已有皇后。\n- 列冲突:用一个集合 cols 记录已占用的列。\n- 主对角线冲突:行号 - 列号 相同的点在同一主对角线上,用 diag1 集合。\n- 副对角线冲突:行号 + 列号 相同的点在同一副对角线上,用 diag2 集合。\n- 递归搜索:如果当前行放置成功,递归尝试下一行。\n- 回溯:如果无法继续,撤销放置,尝试下一个位置。\n- 统计解法数:当所有行都成功放置皇后时,计数 +1。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n const cols = new Set(); // 记录已占用的列\n const diag1 = new Set(); // 记录主对角线 (row - col)\n const diag2 = new Set(); // 记录副对角线 (row + col)\n\n function backtrack(row) {\n if (row === n) { \n count++;\n return;\n }\n for (let col = 0; col < n; col++) {\n if (cols.has(col) || diag1.has(row - col) || diag2.has(row + col)) {\n continue; // 冲突,不能放\n }\n // 选择\n cols.add(col);\n diag1.add(row - col);\n diag2.add(row + col);\n\n backtrack(row + 1);\n\n // 回溯\n cols.delete(col);\n diag1.delete(row - col);\n diag2.delete(row + col);\n }\n }\n\n backtrack(0);\n return count;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 每行必须放置一个皇后,因此每一行尝试 n 种列的可能性。\n- 在冲突检测 O(1) 的情况下,最坏情况回溯树的大小接近 O(n!)。\n- 实际上,由于剪枝(冲突检测),复杂度会远小于 n!,但仍然是 指数级。\n- 时间复杂度:O(n!) (上界)。\n- 空间复杂度:\n- cols、diag1、diag2 最多各存储 n 个元素。\n- 递归栈深度最大为 n。\n- 空间复杂度:O(n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3247583590","body":"## 算法思路\n- 遍历整个网格,当遇到值为 1 的格子时,说明找到了新的岛屿。\n- 使用 DFS(深度优先搜索)或 BFS(广度优先搜索)来扩展整个岛屿,计算其面积,并更新最大值。\n- 为避免重复计算,我们要将访问过的格子标记为 0(淹没)或使用 visited 数组。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n let m = grid.length, n = grid[0].length;\n let maxArea = 0;\n\n function dfs(i, j) {\n // 边界条件\n if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] === 0) {\n return 0;\n }\n // 标记访问过\n grid[i][j] = 0;\n let area = 1;\n // 四个方向\n area += dfs(i + 1, j);\n area += dfs(i - 1, j);\n area += dfs(i, j + 1);\n area += dfs(i, j - 1);\n return area;\n }\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n maxArea = Math.max(maxArea, dfs(i, j));\n }\n }\n }\n\n return maxArea;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 遍历整个矩阵,每个元素最多被访问一次(因为访问后会被置为 0)。\n- 每个格子在 DFS 中的递归调用也是 O(1)(最多 4 次相邻扩展)。\n- 总时间复杂度: O(m * n)\n- 空间复杂度:\n- 递归栈的深度,最坏情况是整个矩阵都是 1,即 O(m * n)。\n- 如果用 BFS + 队列,也需要 O(m * n) 的空间。\n- 空间复杂度: O(m * n)(递归栈 / 队列空间)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247593268","body":"## 算法思路\n- 使用多源 BFS(广度优先搜索)来解决。\n- 找到所有陆地格子,放入队列(多源 BFS 起点)。\n- 从陆地开始向外扩展,遇到海洋格子时更新它的距离。\n- 记录 BFS 扩展到的最大层数,即最大距离。\n- 最后如果没有海洋或没有陆地,返回 -1。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxDistance = function(grid) {\n const n = grid.length;\n const directions = [[1,0],[-1,0],[0,1],[0,-1]];\n const queue = [];\n\n // 1. 把所有陆地加入队列\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n queue.push([i, j]);\n }\n }\n }\n\n // 如果全是海洋或者全是陆地\n if (queue.length === 0 || queue.length === n * n) return -1;\n\n let distance = -1;\n\n // 2. 多源 BFS\n while (queue.length > 0) {\n let size = queue.length;\n distance++; // 每一层扩展一次\n for (let s = 0; s < size; s++) {\n const [x, y] = queue.shift();\n for (let [dx, dy] of directions) {\n const nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] === 0) {\n grid[nx][ny] = 1; // 标记为已访问(变为陆地)\n queue.push([nx, ny]);\n }\n }\n }\n }\n\n return distance;\n};\n```\n\n## 复杂度分析\n- BFS 遍历整个网格,每个格子最多入队一次。\n- 时间复杂度:O(n^2)\n- 空间复杂度(队列 + 访问标记):O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3270177258","body":"## 思路\n- 一开始手上有一些 初始盒子,目标是最大化能获得的糖果数。关键点是:\n- 盒子可能是 开着的(status[i] = 1)或者 关着的(status[i] = 0)。\n- 你只有在盒子开着时,才能取走里面的糖果。\n- 打开盒子后,你可能获得 钥匙,可以解锁更多盒子。\n- 打开盒子后,你可能获得 更多盒子,这些盒子可能要等钥匙解锁才能用。\n- 所以整个过程就是一个 BFS / 队列模拟,类似 “不断解锁和探索”的过程。\n\n## 代码\n```javascript\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n let n = status.length;\n let res = 0;\n\n let haveKey = new Set();\n let haveBox = new Set(initialBoxes);\n let visited = new Array(n).fill(false);\n\n let queue = [...initialBoxes];\n\n while (queue.length > 0) {\n let box = queue.shift();\n if (visited[box]) continue;\n\n // 如果箱子是锁着的且没钥匙 -> 跳过\n if (status[box] === 0 && !haveKey.has(box)) continue;\n\n // 打开箱子\n visited[box] = true;\n res += candies[box];\n\n // 获得钥匙\n for (let k of keys[box]) {\n if (!haveKey.has(k)) {\n haveKey.add(k);\n // 如果之前已经有这个盒子但是打不开,现在可以打开了\n if (haveBox.has(k) && !visited[k]) {\n queue.push(k);\n }\n }\n }\n\n // 获得新的盒子\n for (let b of containedBoxes[box]) {\n if (!haveBox.has(b)) haveBox.add(b);\n if ((status[b] === 1 || haveKey.has(b)) && !visited[b]) {\n queue.push(b);\n }\n }\n }\n\n return res;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 每个盒子最多被处理一次,O(n)。\n- 钥匙和 containedBoxes 总长度之和最多 O(n)。\n- 所以总 时间复杂度 = O(n)。\n- 空间复杂度分析\n- visited / haveKey / haveBox 都是 O(n)。\n- 队列最多 O(n)。\n- 所以 空间复杂度 = O(n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3270189042","body":"/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n if (!root) return [];\n \n // 存储节点信息:[row, col, val]\n const nodes = [];\n \n // DFS遍历,记录每个节点的坐标和值\n function dfs(node, row, col) {\n if (!node) return;\n \n nodes.push([row, col, node.val]);\n \n // 左子节点:row+1, col-1\n dfs(node.left, row + 1, col - 1);\n // 右子节点:row+1, col+1\n dfs(node.right, row + 1, col + 1);\n }\n \n // 从根节点开始遍历,根节点坐标为(0, 0)\n dfs(root, 0, 0);\n \n // 按列索引分组\n const columnMap = new Map();\n for (const [row, col, val] of nodes) {\n if (!columnMap.has(col)) {\n columnMap.set(col, []);\n }\n columnMap.get(col).push([row, val]);\n }\n \n // 获取所有列索引并排序\n const columns = Array.from(columnMap.keys()).sort((a, b) => a - b);\n \n const result = [];\n for (const col of columns) {\n const columnNodes = columnMap.get(col);\n // 对每列内的节点排序:先按行排序,同行按值排序\n columnNodes.sort((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按行排序\n }\n return a[1] - b[1]; // 同行按值排序\n });\n \n // 提取值\n result.push(columnNodes.map(node => node[1]));\n }\n \n return result;\n};","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ariana850409":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074225557","body":"思維:\n以十進位的相加方式,將 k 拆解成字串,從個位數開始與 num 相加,最後再處理一次 num 的進位\n\n代碼:\n```\nclass Solution(object):\n def addToArrayForm(self, num, k):\n k = str(k)\n for i in range(-1, -(len(k)+1), -1):\n number = int(k[i])\n if abs(i) > len(num):\n num.insert(0, number)\n else:\n num[i] = num[i] + number\n\n for i in range(-1, -(len(num)+1), -1):\n temp = num[i]\n if temp >= 10:\n num[i] = temp - 10\n if abs(i-1) > len(num):\n num.insert(0, 1)\n else:\n num[i-1] += 1\n\n return num\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078087647","body":"思維:\n先找出所有符合字符 c 的 index,再判斷字符串 s 中每個字符跟要拿來比較的 index 的最短距離\n\n代碼:\n```\nclass Solution:\n def shortestToChar(self, s: str, c: str) -> List[int]:\n target = []\n for i, char in enumerate(s):\n if char == c:\n target.append(i)\n\n res = []\n t = 0\n for i in range(len(s)):\n tar = target[t]\n if i < tar:\n res.append(tar-i)\n elif i == tar:\n res.append(0)\n elif t+1 >= len(target):\n res.append(i-tar)\n else:\n next_tar = target[t+1]\n res.append(min(i-tar, next_tar-i))\n if i == next_tar:\n t += 1\n return res\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3083166293","body":"思維一:單純依照題義用最直接的想法來實作各函式,increment 用遍歷去直接改變列表中的值\n\n代碼:\n```python\nclass CustomStack:\n def __init__(self, maxSize: int):\n self.maxSize = maxSize\n self.stack = []\n \n def push(self, x: int) -> None:\n if if len(self.stack) < self.maxSize:\n self.stack.append(x)\n\n def pop(self) -> int:\n if not self.stack:\n return -1\n return self.stack.pop()\n \n def increment(self, k: int, val: int) -> None:\n k = min(k, len(self.stack))\n for i in range(k):\n self.stack[i] += val\n```\n時間複雜度:push, pop: O(1) / increment: O(N)\n\n空間複雜度:O(N)\n\n-----\n思維二:優化 increment 的時間複雜度,將 increment value 另存在一個列表,等 pop 時才判斷需加多少值\n\n代碼:\n```python\nclass CustomStack:\n def __init__(self, maxSize: int):\n self.maxSize = maxSize\n self.stack = []\n self.inc = [0] * maxSize\n \n def push(self, x: int) -> None:\n if not len(self.stack) >= self.maxSize:\n self.stack.append(x)\n\n def pop(self) -> int:\n if not self.stack:\n return -1\n inc_idx = len(self.stack)-1\n inc_val = self.inc[inc_idx]\n if inc_idx > 0:\n self.inc[inc_idx-1] += inc_val\n self.inc[inc_idx] = 0\n return self.stack.pop() + inc_val\n \n def increment(self, k: int, val: int) -> None:\n k = min(k, len(self.stack))\n if k > 0:\n self.inc[k-1] += val\n```\n時間複雜度:push, pop, increment: O(1)\n\n空間複雜度:O(N)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087613442","body":"思維:使用兩個 stack 模擬進入與退出重複區塊的過程,每遇到 [ 就壓入當下狀態,遇到 ] 就彈出並拼接,逐步建立出完整的解碼字串\n\n代碼:\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n cnt_stack = []\n str_stack = []\n cnt = ''\n temp = ''\n for c in s:\n if c.isdigit():\n cnt += c\n elif c == '[':\n cnt_stack.append(int(cnt))\n str_stack.append(temp)\n cnt = ''\n temp = ''\n elif c == ']':\n times = cnt_stack.pop()\n prev_str = str_stack.pop()\n temp = prev_str + temp * times\n else:\n temp += c\n\n return temp\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091473302","body":"思維一:以暴力解的方式在 peek 或 pop 的操作時,用另一個陣列依序存目前 stack pop 出來的所有元素,操作結果後再依序新增回去,時間及空間複雜度皆為 O(N)(無實作)
\n思維二:使用兩個 stack 來操作存取,當有 peek 或 pop 的操作時,從 out_stack 拿取,判斷 out_stack 為空時再一次性的把當前 in_stack 的所有元素倒進 out_stack\n\n代碼:\n```python\nclass MyQueue(object):\n\n def __init__(self):\n self.in_stack = []\n self.out_stack = []\n \n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n self.in_stack.append(x)\n \n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack.pop()\n \n def peek(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack[-1]\n \n def empty(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n return not (self.in_stack + self.out_stack)\n```\n時間複雜度:O(1) (Amortized)\n\n空間複雜度:O(N)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3096165781","body":"思維:\n1. 空串列直接回傳\n2. 先計算鏈結長度 length\n3. 把 k 對 length 取餘,因為旋轉 length 次等於沒動\n4. 用兩個指針 slow 和 fast 找到新的頭 new_head 的位置\n5. 將鏈結斷開重新連接,完成旋轉\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode(object):\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution(object):\n def rotateRight(self, head, k):\n \"\"\"\n :type head: Optional[ListNode]\n :type k: int\n :rtype: Optional[ListNode]\n \"\"\"\n if not head: \n return head\n\n length = 1\n temp = head\n while temp.next:\n length += 1\n temp = temp.next\n\n slow, fast = head, head\n for _ in range(k % length):\n if fast.next:\n fast = fast.next\n else:\n fast = head\n\n if slow == fast: \n return head\n\n while fast.next:\n slow = slow.next\n fast = fast.next\n\n new_head = slow.next\n slow.next = None\n fast.next = head\n return new_head\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100848058","body":"思維:先處理無需交換的情況,透過一個 dummy 節點統一處理頭節點與後續節點的交換邏輯,每次迴圈交換一對相鄰節點,並用 pre 將已處理區與未處理區銜接起來,最後回傳 dummy 的下一個節點作為新鏈表的頭\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if not head or not head.next:\n return head\n\n left = head\n right = head.next\n dummy = ListNode(None, head)\n pre = dummy\n while right:\n left.next = right.next\n right.next = left\n pre.next = right\n pre = left\n left = left.next\n right = left.next if left else None\n\n return dummy.next\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109165432","body":"思維:有想到要計算遞迴的中心點,但一開始解不出來,參考官方題解的思路加上畫圖後思路有比較清晰\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode(object):\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution(object):\n def sortedListToBST(self, head):\n \"\"\"\n :type head: Optional[ListNode]\n :rtype: Optional[TreeNode]\n \"\"\"\n if not head:\n return head\n\n pre, slow, fast = None, head, head\n while fast and fast.next:\n fast = fast.next.next\n pre = slow\n slow = slow.next\n if pre:\n pre.next = None\n\n node = TreeNode(slow.val)\n if slow == fast:\n return node\n \n node.left = self.sortedListToBST(head)\n node.right = self.sortedListToBST(slow.next)\n return node\n```\n時間複雜度:O(NlogN)\n\n空間複雜度:O(logN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112948103","body":"思維:\n1. 使用兩個指標 a 和 b,分別從 headA 和 headB 開始走。\n2. 每當指標走到自己 linked list 的結尾時,跳到另一條 linked list 的頭部繼續走。\n3. 最終:
\n a. 若兩條 list 有交點,a 和 b 會在同一個節點交會(因為走過的總長度相同)。
\n b. 若沒有交點,a 和 b 都會變成 None,同時結束迴圈。\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, x):\n# self.val = x\n# self.next = None\n\nclass Solution:\n def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:\n a, b = headA, headB\n a_switch, b_switch = False, False\n \n while a and b:\n if a == b:\n return a\n\n a = a.next if a.next else None\n if not a and not a_switch:\n a = headB\n a_switch = True\n \n b = b.next if b.next else None\n if not b and not b_switch:\n b = headA\n b_switch = True\n\n return None\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3114228960","body":"思維:使用快慢指針來偵測是否有環存在,若有找到相遇點的話,把 fast 指針重新指向 head 後找環的起點,兩個指針 slow 和 fast 都改成一次走一步,再次相遇時就是環的起始節點\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, x):\n# self.val = x\n# self.next = None\n\nclass Solution:\n def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if not head or not head.next:\n return None\n\n slow, fast = head, head\n while fast:\n slow = slow.next\n fast = fast.next.next if fast.next else None\n if slow and slow == fast:\n fast = head \n while fast != slow:\n fast = fast.next\n slow = slow.next\n return fast\n\n return None\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3122031171","body":"思維:使用雙向鏈表搭配 Hash Map 實作 LRU Cache,讓每次的 get 和 put 操作都能在 O(1) 時間內完成。最近使用的節點會被移到鏈表頭部,當容量超過時,就從尾部刪除最久未使用的節點。\n\n代碼:\n```python\nclass ListNode:\n def __init__(self, key, value):\n self.key = key\n self.val = value\n self.next = None\n self.pre = None\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.capacity = capacity\n self.length = 0\n self.head = ListNode(None, None)\n self.tail = ListNode(None, None)\n self.head.next = self.tail\n self.tail.pre = self.head\n self.map = {}\n\n def _add_to_head(self, key: int, value: int):\n node = ListNode(key, value)\n node.next = self.head.next\n self.head.next = node\n node.next.pre = node\n node.pre = self.head\n self.map[key] = node\n self.length += 1\n\n def _remove_from_tail(self, key: int):\n remove_key = self.tail.pre.key\n self.tail.pre = self.tail.pre.pre\n self.tail.pre.next = self.tail\n self.map.pop(remove_key)\n self.length -= 1\n\n def _move_node_to_head(self, node: ListNode):\n node.pre.next = node.next\n node.next.pre = node.pre\n self.head.next.pre = node\n node.pre = self.head\n node.next = self.head.next\n self.head.next = node\n \n def get(self, key: int) -> int:\n if key in self.map:\n node = self.map[key]\n self._move_node_to_head(node)\n return self.map[key].val\n return -1\n \n def put(self, key: int, value: int) -> None:\n node = self.map.get(key)\n if node:\n self._move_node_to_head(node)\n node.val = value\n else:\n if self.length >= self.capacity:\n self._remove_from_tail(key) \n self._add_to_head(key, value)\n```\n時間複雜度:O(1)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124493359","body":"思維:DFS,透過遞迴分別計算左右子樹的最大深度,然後回傳較大的一邊再加 1(代表當前節點這一層),最終得到整棵樹的最大深度。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def maxDepth(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n return max(self.maxDepth(root.left), self.maxDepth(root.right))+1\n```\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127762191","body":"思維:DFS,透過遞歸比對兩棵樹的每個對應節點是否完全一樣,一層層往下檢查,直到整棵樹都比對完或中途不符合就結束。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if not p and not q:\n return True\n \n if p and q and p.val == q.val:\n res_left = self.isSameTree(p.left, q.left)\n res_right = self.isSameTree(p.right, q.right)\n return res_left and res_right\n\n return False\n```\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3133090654","body":"思維:DFS,透過遞歸保存當前數字的狀態,每走到下一層就把目前的 current_num 乘上 10 再加上當前節點的值,當走到葉子節點時就可以回傳目前這條路徑的數字,最後把左右子樹的 dfs 結果加總起來。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n def dfs(node, current_num):\n if not node:\n return 0\n current_num = current_num * 10 + node.val\n if not node.left and not node.right:\n return current_num\n return dfs(node.left, current_num) + dfs(node.right, current_num)\n return dfs(root, 0)\n```\n時間複雜度:O(N)\n\n空間複雜度:O(d) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135855226","body":"思維一:BFS,使用廣度優先搜尋一層層遍歷二元樹節點,並記錄每一層最先遇到的節點。每當進入新的一層,就更新目前儲存的節點為該層最左側的節點。最終回傳的是最底層最左邊那個節點的值。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n q = deque()\n res = (root,0)\n q.append((root,0))\n while q:\n node, level = q.popleft()\n cur_level = res[1]\n if level > cur_level:\n res = (node, level)\n\n if node.left:\n q.append((node.left, level+1))\n if node.right:\n q.append((node.right, level+1))\n\n return res[0].val\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(w) (max width of tree)\n\n---------\n思維二:DFS,使用深度優先搜尋遍歷整顆樹,每當遇到更深層的節點,就更新目前記錄的最左邊節點值,最終返回的是整棵樹最深層最左邊的節點值。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n def dfs(node, cur_depth, leftmost, depthest):\n if cur_depth > depthest:\n leftmost = node.val\n depthest = cur_depth\n\n if node.left:\n leftmost, depthest = dfs(node.left, cur_depth+1, leftmost, depthest)\n if node.right:\n leftmost, depthest = dfs(node.right, cur_depth+1, leftmost, depthest)\n return leftmost, depthest\n\n leftmost, depthest = dfs(root, 1, root.val, 1)\n return leftmost\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max height of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3140470104","body":"思維一:DFS
\nserialize: 使用 前序遍歷(DFS) 將樹的結構與節點值轉成 list,再轉為 JSON 字串,None 用來記錄空節點保證可逆。
\ndeserialize: 根據前序順序,遇到 None 表示空節點,遞迴還原出整棵樹的結構。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n def dfs(node):\n if not node:\n res.append(None)\n return\n\n res.append(node.val)\n dfs(node.left)\n dfs(node.right)\n\n dfs(root)\n return json.dumps(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n data = deque(json.loads(data))\n def dfs(data):\n val = data.popleft()\n if val is None:\n return\n\n node = TreeNode(val)\n node.left = dfs(data)\n node.right = dfs(data)\n return node\n \n return dfs(data)\n\n# Your Codec object will be instantiated and called as such:\n# ser = Codec()\n# deser = Codec()\n# ans = deser.deserialize(ser.serialize(root))\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)\n\n-----------------\n\n思維二:BFS
\nserialize:利用 BFS(層序遍歷)將每層節點值與空位(None)一起寫入 list,最後轉成 JSON 字串。
\ndeserialize:讀回字串後同樣使用 BFS,按順序建立節點並接上左右子節點,重建出原始二叉樹。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n queue = deque([root])\n while queue:\n node = queue.popleft()\n if node:\n res.append(node.val)\n queue.append(node.left)\n queue.append(node.right)\n else:\n res.append(None)\n\n return json.dumps(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n data = deque(json.loads(data))\n root_val = data.popleft()\n if root_val is None:\n return None\n \n root = TreeNode(root_val)\n queue = deque([root])\n while queue:\n node = queue.popleft()\n if data:\n left_val = data.popleft()\n right_val = data.popleft()\n if left_val is not None:\n left_node = TreeNode(left_val)\n node.left = left_node\n queue.append(left_node)\n if right_val is not None:\n right_node = TreeNode(right_val)\n node.right = right_node\n queue.append(right_node)\n\n return root\n\n# Your Codec object will be instantiated and called as such:\n# ser = Codec()\n# deser = Codec()\n# ans = deser.deserialize(ser.serialize(root))\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148593193","body":"思維:\n1. 對每個點 i 當作中心,計算它與所有其他點的距離\n2. 用 distance_map 統計,有多少個點與 i 的距離相同(也就是距離為 d 的點出現了幾次)\n3. 如果某個距離出現了 count 次(基本上就是超過一次的次數才會被納入計算),就能組出 count * (count - 1) 種 (j, k) boomerang(因為 (j, k), (k, j) 視為兩種組合,(count - 1) 為要扣掉已經放在前一個位置的元素)\n4. 最後把所有距離的組合數加總起來即可\n\n代碼:\n```python\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n res = 0\n for i, x in enumerate(points):\n distance_map = defaultdict(int)\n for j, y in enumerate(points):\n if i != j:\n distance_map[(y[0] - x[0])**2 + (y[1] - x[1])**2] += 1\n\n for count in distance_map.values():\n res += count * (count-1)\n\n return res\n```\n時間複雜度:O(N^2)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153175756","body":"思維:\n1. 使用雙指針 left 和 right 維護一個「不含重複字元的滑動視窗」\n2. 不斷將 right 指向的字元加入 seen\n3. 一旦發現重複字元,就從 left 開始依序從 seen 移除字元,直到這個重複字元被清掉\n4. 每次 right 移動後,更新視窗大小 right - left,維護一個最大值 max_str\n\n代碼:\n```python\nclass Solution:\n def lengthOfLongestSubstring(self, s: str) -> int:\n max_str = 0\n left = 0\n right = 0\n seen = set()\n while right < len(s):\n while s[right] in seen:\n seen.remove(s[left])\n left += 1\n seen.add(s[right])\n right += 1\n max_str = max(max_str, right-left)\n return max_str\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k) (k for number of character types)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160705635","body":"思維:\n1. 多組偏移掃描:使用 i in range(word_len) 對字串做「分組」掃描,防止錯過合法起始點\n2. 滑動視窗掃描:每次從 j 開始擷取一個單字(長度 word_len),如果這個字在 words 裡,放進 window_counter,若某個單字超出次數,移動 left(左指針)來縮小視窗,如果視窗內剛好有 word_count 個單字,加入結果\n3. 如果不是合法單字,清空 window_counter,重設 count 和 left(下一次從這個位置繼續)\n\n代碼:\n```python\nclass Solution:\n def findSubstring(self, s: str, words: List[str]) -> List[int]:\n word_len = len(words[0])\n word_count = len(words)\n total_len = word_len * word_count\n target_counter = Counter(words)\n res = []\n\n for i in range(word_len):\n left = i\n window_counter = Counter()\n count = 0\n\n for j in range(i, len(s) - word_len + 1, word_len):\n word = s[j:j+word_len]\n if word in target_counter:\n window_counter[word] += 1\n count += 1\n\n while window_counter[word] > target_counter[word]:\n left_word = s[left:left+word_len]\n window_counter[left_word] -= 1\n count -= 1\n left += word_len\n\n if count == word_count:\n res.append(left)\n\n else:\n window_counter.clear()\n count = 0\n left = j + word_len\n\n return res\n```\n時間複雜度:O(N × W) (N is length of s, W is length of words)\n\n空間複雜度:O(W)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166506559","body":"思維:使用快慢指標 (two pointers) 技巧,設兩個指標 slow 和 fast 同時指向鏈表頭,每次 slow 走一步、fast 走兩步,當 fast 到達鏈表尾時,slow 正好在中間節點。\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n\n return slow \n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172494360","body":"思維:使用雙指針來實行二分搜尋法,設定左右邊界取中間位置\n1. 如果 nums[mid] == target,直接回傳 mid(找到目標)。\n2. 如果 nums[mid] > target,代表目標在左半邊,更新 right = mid - 1。\n3. 如果 nums[mid] < target,代表目標在右半邊,更新 left = mid + 1。\n4. 迴圈結束後(left > right),left 就是目標應插入的位置。\n\n代碼:\n```python\nclass Solution:\n def searchInsert(self, nums: List[int], target: int) -> int:\n left = 0\n right = len(nums)-1\n while left <= right:\n mid = (left+right)//2\n if nums[mid] == target:\n return mid\n elif nums[mid] > target:\n right = mid-1\n else:\n left = mid+1\n return left\n```\n時間複雜度:O(logN)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173687770","body":"思維:使用單調遞減隊列來維護視窗內最大值的 index\n1. 前 k 個元素先初始化隊列:維持隊列的遞減性,每次新來的元素會移除尾部比它小的元素,q[0] 永遠是最大值的 index\n2. 接下來從 k 到結尾,維持單調性並移除過期元素:新元素進來時維持單調隊列,移除滑出視窗的 index,每次把 nums[q[0]](視窗最大值)加入結果\n\n代碼:\n```python\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n res = []\n q = deque()\n for i in range(k):\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n res.append(nums[q[0]])\n\n for i in range(k, len(nums)):\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n while q[0] <= i-k:\n q.popleft()\n res.append(nums[q[0]])\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178842909","body":"思維:\n1. 使用兩個表分別紀錄信任他人及被信任的計數\n2. 之後尋找一個人 x,滿足:trusted_tables[x] == n - 1(被其他人信任)以及 trust_tables[x] == 0:(自己沒信任任何人)\n3. 若找到這樣的人,回傳他的編號;否則回傳 -1\n\n代碼:\n```python\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n if n == 1:\n return 1\n\n trust_tables = defaultdict(int)\n trusted_tables = defaultdict(int)\n for [trust_a, trust_b] in trust:\n trust_tables[trust_a] += 1\n trusted_tables[trust_b] += 1\n\n for trusted_person, trusted_ticket in trusted_tables.items():\n if trusted_ticket == n-1 and trust_tables[trusted_person] == 0:\n return trusted_person\n return -1\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3188960333","body":"思維:\n1. 把沒群組的 item 分配新的唯一群組:這樣後面只需處理群組 id,不用特別分支處理 -1。\n2. 建立 item graph:由 prev -> curr(prev 必須在 curr 前面)。\n3. 建立 group graph:當 prev 與 curr 屬不同群組時,建立 g_prev -> g_curr 的依賴邊;用 set 避免重複邊。\n4. 對 group graph 做拓撲排序:得出 group 的一個合法順序;若有 cycle,無解回 []。\n5. 對 item graph 做拓撲排序:得出 items 在全域上的合法相對順序(若有 cycle,無解回 [])。\n6. 把 items 按 item_order 分桶到對應 group,再按 group_order 串接:同 group items 會連在一起且保持 item 之間的依賴。\n\n代碼:\n```python\nclass Solution:\n def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:\n new_group_id = m\n for i in range(n):\n if group[i] == -1:\n group[i] = new_group_id\n new_group_id += 1\n total_groups = new_group_id\n\n item_adj = [[] for _ in range(n)]\n item_indeg = [0] * n\n\n group_adj = [[] for _ in range(total_groups)]\n group_indeg = [0] * total_groups\n\n added_group_edges = set()\n\n for curr in range(n):\n for prev in beforeItems[curr]:\n item_adj[prev].append(curr)\n item_indeg[curr] += 1\n\n g_prev = group[prev]\n g_curr = group[curr]\n if g_prev != g_curr:\n if (g_prev, g_curr) not in added_group_edges:\n added_group_edges.add((g_prev, g_curr))\n group_adj[g_prev].append(g_curr)\n group_indeg[g_curr] += 1\n\n def topo_sort(num_nodes, adj, indeg):\n q = deque([i for i in range(num_nodes) if indeg[i] == 0])\n order = []\n while q:\n u = q.popleft()\n order.append(u)\n for v in adj[u]:\n indeg[v] -= 1\n if indeg[v] == 0:\n q.append(v)\n if len(order) == num_nodes:\n return order\n else:\n return []\n\n group_order = topo_sort(total_groups, group_adj, group_indeg[:])\n if not group_order:\n return []\n\n item_order = topo_sort(n, item_adj, item_indeg[:])\n if not item_order:\n return []\n\n items_by_group = defaultdict(list)\n for item in item_order:\n items_by_group[group[item]].append(item)\n\n result = []\n for g in group_order:\n result.extend(items_by_group[g])\n\n return result\n```\n時間複雜度:O(n + E)\n\n空間複雜度:O(n + m + E)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3191064414","body":"思維:依照題意模擬路徑\n\n代碼:\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n spot = [0, 0]\n for move in moves:\n if move == 'R':\n spot[0] += 1\n elif move == 'L':\n spot[0] -= 1\n elif move == 'U':\n spot[1] += 1\n else:\n spot[1] -= 1\n \n return spot == [0, 0]\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194164140","body":"思維:\n1. 解析登入、登出時間(時、分),如果登出時間早於登入時間,代表跨過午夜就加 24 小時。\n2. 重新計算登入時間:向上取整到最近的 15 分鐘倍數(因為要等到下一個完整的 15 分鐘才算開始一局)。\n3. 重新計算登出時間:向下取整到最近的 15 分鐘倍數(因為超過的部分不算完整一局)。\n4. 計算完整局數,如果結果為負數則返回 0。\n\n這裡用 (logout_hour-login_hour)*4 - login_minute/15 + logout_minute/15 直接換算成以「15 分鐘為單位」的差距。\n\n代碼:\n```python\nclass Solution:\n def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:\n login_hour, login_minute = map(int, loginTime.split(':'))\n logout_hour, logout_minute = map(int, logoutTime.split(':'))\n if logout_hour < login_hour or logout_hour == login_hour and logout_minute < login_minute:\n logout_hour += 24\n\n login_hour, login_minute = self.narrow_down_time(login_hour, login_minute, True)\n logout_hour, logout_minute = self.narrow_down_time(logout_hour, logout_minute, False)\n\n return max(0, int((logout_hour-login_hour)*4 - login_minute/15 + logout_minute/15))\n\n def narrow_down_time(self, login_hour: int, login_minute: int, is_login: bool):\n if is_login:\n login_minute = ceil(login_minute/15) * 15\n if login_minute == 60:\n login_hour += 1\n login_minute = 0\n else:\n login_minute = floor(login_minute/15) * 15\n\n return login_hour, login_minute\n```\n時間複雜度:O(1)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3196258303","body":"思維:\n1. 函式 compare_less(a_counter, b_counter):模擬條件 1、2,對所有可能分界點 ch(從 'b' 到 'z')進行遍歷
\n讓 a 的所有字母 < ch,讓 b 的所有字母 ≥ ch,使用 prefix sum 避免重複運算,計算出最少需要修改的字元數\n2. 函式 compare_distinct(a_counter, b_counter):模擬條件 3,讓兩字串變成同一種字母
\n對所有字母出現次數總和 Counter 做合併,找出現次數最多的字母後,將其餘字母通通改成這個字母,修改次數 = 總數量 - 該字母出現次數\n3. 分別計算三個條件需要的修改次數,回傳三者中的最小值\n\n代碼:\n```python\nclass Solution:\n def minCharacters(self, a: str, b: str) -> int:\n a_counter = Counter(ord(ch) for ch in a)\n b_counter = Counter(ord(ch) for ch in b)\n\n goal_a = self.compare_less(a_counter, b_counter)\n goal_b = self.compare_less(b_counter, a_counter)\n goal_c = self.compare_distinct(a_counter, b_counter)\n return min(goal_a, goal_b, goal_c)\n\n def compare_less(self, a_counter, b_counter):\n a_freq = [0] * 26\n b_freq = [0] * 26\n for k, v in a_counter.items():\n a_freq[k - ord('a')] = v\n for k, v in b_counter.items():\n b_freq[k - ord('a')] = v\n\n a_prefix = list(itertools.accumulate(a_freq))\n b_prefix = list(itertools.accumulate(b_freq))\n move = float('inf')\n for ch in range(1, 26):\n move_a = a_prefix[25] - a_prefix[ch-1]\n move_b = b_prefix[ch-1]\n move = min(move, move_a + move_b)\n return move\n\n def compare_distinct(self, a_counter, b_counter):\n all_counter = a_counter + b_counter\n most_key = max(all_counter, key=all_counter.get)\n total = sum(all_counter.values())\n return total - all_counter[most_key]\n```\n時間複雜度:O(n+m)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3201266614","body":"思維:先把所有數字用 heappush 丟進最小堆,維護「父節點 ≤ 子節點」,接著每次 heappop 拿走堆頂(最小值),直到堆空,收集出來的數列 res 就是升序排序。\n\n代碼:\n```python\nclass Solution:\n def sortArray(self, nums: List[int]) -> List[int]:\n min_heap = []\n res = []\n for num in nums:\n self.heappush(min_heap, num)\n\n while min_heap:\n res.append(self.heappop(min_heap))\n\n return res\n \n def heappush(self, h, x):\n h.append(x)\n i = len(h)-1\n\n while i > 0:\n p = (i - 1) // 2\n if h[i] < h[p]:\n h[i], h[p] = h[p], h[i]\n i = p\n else:\n break\n\n def heappop(self, h):\n last = h.pop()\n if not h:\n return last\n root = h[0]\n h[0] = last\n i = 0\n n = len(h)\n while True:\n left = 2*i + 1\n right = 2*i + 2\n if left >= n:\n break\n\n child = left\n if right < n and h[right] < h[left]:\n child = right\n if h[child] < h[i]:\n h[i], h[child] = h[child], h[i]\n i = child\n else:\n break\n return root\n```\n時間複雜度:O(n log n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204542831","body":"思維:使用二分搜尋法,對於 x ≥ 2 的情況,設定搜尋範圍為 [1, x // 2],如果 mid^2 太大,就向左縮小範圍,如果太小,就向右移動範圍,當搜尋結束(left > right)時,right 就是最接近但不超過 √x 的整數\n\n代碼:\n```python\nclass Solution:\n def mySqrt(self, x: int) -> int:\n if x < 2:\n return x\n \n left, right = 1, x // 2\n while left <= right:\n mid = (left + right) // 2\n if mid * mid == x:\n return mid\n elif mid * mid > x:\n right = mid - 1\n else:\n left = mid + 1\n\n return right\n```\n時間複雜度:O(log x)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3211104911","body":"思維:使用二分搜尋法,如果 mid 是壞的:可能是答案,但還要往左找,right = mid - 1,如果 mid 是好的:答案一定在右邊,left = mid + 1,最後 left 會停在第一個壞版本的位置。\n\n代碼:\n```python\nclass Solution:\n def firstBadVersion(self, n: int) -> int:\n left, right = 1, n\n while left <= right:\n mid = (left + right) // 2\n if isBadVersion(mid):\n right = mid - 1\n else:\n left = mid + 1\n return left\n```\n時間複雜度:O(log n)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216087383","body":"思維:\n1. 先對加熱器位置排序,才能用二分搜尋快速找到每個房子最近的加熱器\n2. 遍歷每個房子,使用二分搜尋找到第一個 heaters[mid] 大於等於當前 house 的位置(也就是最接近右邊的加熱器)\n3. 再往回看一個位置 heaters[r],也就是最接近左邊的加熱器\n4. 比較左右加熱器距離,選擇較小者\n5. 更新最大加熱半徑(最小距離中的最大值)\n\n代碼:\n```python\nclass Solution:\n def findRadius(self, houses: List[int], heaters: List[int]) -> int:\n res = 0\n heaters.sort()\n \n for house in houses:\n l, r = 0, len(heaters) - 1\n while l <= r:\n mid = (l + r) // 2\n if house <= heaters[mid]:\n r = mid - 1\n else:\n l = mid + 1\n\n l_res, r_res = inf, inf\n if 0 <= l <= len(heaters)-1:\n l_res = abs(heaters[l] - house)\n if 0 <= r <= len(heaters)-1:\n r_res = abs(heaters[r] - house)\n\n res = max(res, min(l_res, r_res))\n\n return res\n```\n時間複雜度:O(M log M + N log M) (M for length of heaters, N for length of houses)\n\n空間複雜度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3223499698","body":"思維:先初始化前 k 個字元中有多少母音,用滑動視窗維持長度為 k 的區間往右滑動,每次移動一格,視窗左邊出去一個字元、右邊進來一個字元,如果左邊移出的是母音即減 1,如果右邊移入的是母音即加 1,並且更新最大值,直到滑到最後一格為止\n\n代碼:\n```python\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n vowels = set('aeiou')\n count = sum(1 for c in s[:k] if c in vowels)\n max_count = count\n\n for i in range(k, len(s)):\n if s[i-k] in vowels:\n count -= 1\n if s[i] in vowels:\n count += 1\n max_count = max(max_count, count)\n\n return max_count\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3227824002","body":"思維:\n1. 邊界判斷:若 k == 0,不會抽牌,分數永遠是 0,且一定 ≤ n,直接回傳 1.0。若 n ≥ k + maxPts - 1,最多只能拿到 k - 1 + maxPts 分,而這些都 ≤ n,直接回傳 1.0\n2. 初始化:建立一個長度 n + 1 的 dp 陣列,dp[i] 表示拿到 i 分的機率,設定 dp[0] = 1.0(初始在 0 分),window_sum = 1.0 表示 dp[0] 的值,res = 0.0,用來累加最終結果(分數 ≥ k 的機率)\n3. 進入迴圈,從 i = 1 到 n:使用滑動視窗平均法計算 dp[i] = window_sum / maxPts,如果 i < k 代表還會繼續抽牌 → 將 dp[i] 加入 window_sum,影響後續機率,如果 i ≥ k,代表不能再抽牌了 → 將 dp[i] 加入 res,因為這是可能的最終分數\n4. 維護滑動視窗:若 i - maxPts ≥ 0,將前方的 dp[i - maxPts] 從 window_sum 中扣除,保持視窗大小為 maxPts\n5. 迴圈結束後,回傳累積的結果:回傳 res,即所有停在 k 到 n 分的總機率\n\n代碼:\n```python\nclass Solution:\n def new21Game(self, n: int, k: int, maxPts: int) -> float:\n if k == 0 or n >= k + maxPts - 1:\n return 1\n \n dp = [0.0] * (n + 1)\n dp[0] = 1.0\n window_sum = 1.0\n res = 0.0\n\n for i in range(1, n + 1):\n dp[i] = window_sum / maxPts\n if i < k:\n window_sum += dp[i]\n else:\n res += dp[i]\n\n if i - maxPts >= 0:\n window_sum -= dp[i-maxPts]\n\n return res\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3232431244","body":"思維:透過固定長度為 len(p) 的滑動視窗掃過整個字串 s,用 Counter 統計當前視窗的字元分佈\n1. 初始化兩個 Counter:target 記錄 p 的字元分佈,cur 動態維護視窗內的字元分佈\n2. 向右移動右指標 r 更新 cur,每次移動後如果 cur == target,代表此視窗是一個 anagram,res 加入 l\n3. 視窗長度若達到 len(p),就縮左邊,如果左邊的字元也在 p 中,從 cur 中減一,移動左指標 l,確保視窗長度維持為 len(p)\n\n代碼:\n```python\nclass Solution:\n def findAnagrams(self, s: str, p: str) -> List[int]:\n res = []\n target = Counter(p)\n cur = Counter()\n l, r = 0, 0\n\n while r < len(s):\n if s[r] in p:\n cur[s[r]] += 1\n \n if cur == target:\n res.append(l)\n\n r += 1\n if r - l >= len(p):\n if s[l] in p:\n cur[s[l]] -= 1\n l += 1\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235535873","body":"思維:\n1. 使用 target 記錄 t 中每個字元需要出現幾次,required 為需要達成的字元種類數,formed 表示目前有多少種字元達到目標需求\n2. 用滑動視窗 [l, r] 掃過 s\n3. 視窗內使用 cur 統計目前出現的字元次數\n4. 每當 formed == required(即目前視窗內已滿足所有字元需求),就嘗試更新最短子字串\n5. 然後移動左指標 l,直到不再滿足條件,再往右擴張 r\n\n代碼:\n```python\nclass Solution:\n def minWindow(self, s: str, t: str) -> str:\n if not s or not t or len(t) > len(s):\n return ''\n\n res = ''\n target = Counter(t)\n cur = Counter()\n required = len(target)\n formed = 0\n l = 0\n\n for r in range(len(s)):\n char = s[r]\n if char in target:\n cur[char] += 1\n if cur[char] == target[char]:\n formed += 1\n\n while formed == required:\n window = s[l:r+1]\n if not res or len(window) < len(res):\n res = window\n\n if s[l] in target:\n cur[s[l]] -= 1\n if cur[s[l]] < target[s[l]]:\n formed -= 1\n l += 1\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3241211135","body":"思維:\n1. 每一層遞迴代表一個 row(橫列),每一層嘗試在該 row 的每一個 col(直行)上放一個 Q\n2. 使用三個集合記錄不能放的位置(剪枝):used_cols:欄位不能重複、used_diag1:↘ 對角線(row - col)不能重複、used_diag2:↙ 對角線(row + col)不能重複\n3. 如果當前格子合法:將當前 col 與對角線加入對應集合,進入下一 row 繼續放皇后\n4. 如果成功放到第 n 行,代表一種合法放法,count += 1\n5. 每個回合結束後回溯:移除當前狀態,嘗試下一個 col\n\n代碼:\n```python\nclass Solution:\n def totalNQueens(self, n: int) -> int:\n count = 0\n\n def backtracking(row, used_cols, used_diag1, used_diag2):\n if row == n:\n nonlocal count \n count += 1\n return\n\n for col in range(n):\n if col in used_cols or row - col in used_diag1 or row + col in used_diag2:\n continue\n \n used_cols.add(col)\n used_diag1.add(row - col)\n used_diag2.add(row + col)\n\n backtracking(row + 1, used_cols, used_diag1, used_diag2)\n\n used_cols.remove(col)\n used_diag1.remove(row - col)\n used_diag2.remove(row + col)\n\n backtracking(0, set(), set(), set())\n\n return count\n```\n時間複雜度:O(n!)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3244207256","body":"思維:深度優先搜尋(DFS)\n1. 初始化變數: seen 避免重複拜訪相同格子、max_area記錄最大島嶼面積\n2. 走過整張地圖: 雙層 for loop,遍歷每一格 (i, j)\n3. 找到新的島嶼起點就 DFS: 如果是還沒拜訪過的陸地,就從這裡開始 DFS,算面積,回傳面積後更新 max_area\n4. DFS 拜訪所有相連陸地: 每次進來的 (row, col) 都會標記為已拜訪,area = 1 表示這一格自己先算進面積\n5. 遞迴搜尋上下左右的相連格子: 檢查鄰近 4 格是否可以繼續走,遞迴地累加 area\n6. DFS 結束後回傳這座島的面積\n\n代碼:\n```python\nclass Solution:\n direction = [(1, 0), (-1, 0), (0, 1), (0, -1)]\n\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n seen = set()\n max_area = 0\n for i in range(len(grid)):\n for j in range(len(grid[0])):\n if grid[i][j] == 1 and (i, j) not in seen:\n area = self.dfs(i, j, seen, grid)\n max_area = max(max_area, area)\n \n return max_area\n\n def dfs(self, row, col, seen, grid):\n seen.add((row, col))\n area = 1\n for dx, dy in self.direction:\n x, y = row + dx, col + dy\n if 0 <= x < len(grid) and 0 <= y < len(grid[0]) and grid[x][y] == 1 and (x, y) not in seen:\n area += self.dfs(x, y, seen, grid)\n \n return area\n```\n時間複雜度:O(m × n)\n\n空間複雜度:O(m × n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249687017","body":"思維:多源 BFS\n1. 把所有的陸地格(值為 1)當作起點,加入 queue 中\n2. 先判斷若陸地為空(全是水)或全是陸地,回傳 -1\n3. BFS 擴展每一層水格:每次從 queue 拿一個格子出來,對四個方向進行探索,如果是水(值為 0),就更新它為「距離 = 前一格 + 1」,並將它加入 queue,等下繼續擴展\n4. 最後回傳最大距離 -1:因為初始的陸地值是 1,所以水格的距離是從 2 開始計算,因此真正的距離 = 格子值 - 1\n\n代碼:\n```python\nclass Solution:\n def maxDistance(self, grid: List[List[int]]) -> int:\n q = deque()\n for i in range(len(grid)):\n for j in range(len(grid[0])):\n if grid[i][j] == 1:\n q.append((i, j))\n \n if not q or len(q) == len(grid) * len(grid):\n return -1\n\n directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]\n max_dist = 0\n while q:\n x, y = q.popleft()\n for dx, dy in directions:\n nx = x + dx\n ny = y + dy\n if 0 <= nx < len(grid) and 0 <= ny < len(grid[0]) and grid[nx][ny] == 0:\n grid[nx][ny] = grid[x][y] + 1\n q.append((nx, ny))\n max_dist = max(max_dist, grid[nx][ny])\n\n return max_dist - 1\n```\n時間複雜度:O(n^2)\n\n空間複雜度:O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251575584","body":"思維:\n1. 把初始擁有箱子(initialBoxes)能打開的箱子(status = 1)加入 queue\n2. 使用 queue 處理可以打開的箱子,如果已經處理過的話則跳過\n3. 開箱拿糖果後,處理新拿到的箱子鑰匙,把鑰匙對應到已擁有且未開啟過的 box 加入 queue\n4. 處理新拿到的箱子,如果箱子可以直接打開或擁有鑰匙就加進 queue,否則放進 own_boxes 等待日後有拿到 key 再打開\n5. 整個流程直到 queue 為空,表示目前已經沒能力再開更多箱子了,回傳總糖果數量\n\n代碼:\n```python\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n own_boxes = set(initialBoxes)\n own_keys = set()\n visited = set()\n q = deque()\n total_candies = 0\n\n for box in initialBoxes:\n if status[box] == 1:\n q.append(box)\n \n while q:\n box = q.popleft()\n if box in visited:\n continue\n\n total_candies += candies[box]\n visited.add(box)\n \n for key in keys[box]:\n own_keys.add(key)\n if key in own_boxes and key not in visited:\n q.append(key)\n\n for new_box in containedBoxes[box]:\n own_boxes.add(new_box)\n if (status[new_box] == 1 or new_box in own_keys) and new_box not in visited:\n q.append(new_box) \n\n return total_candies\n```\n時間複雜度:O(n+k)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3256863525","body":"思維:\n1. 廣度優先搜尋 (BFS) 遍歷樹,使用 deque 從 root 開始,記錄每個節點的座標\n2. 收集節點資訊,每個節點存成 (x, y, val),加入 nodes 列表\n3. 排序節點,按照題目規則排序:y(由左到右),x(由上到下),val(同位置時數字小的先)\n4. 按列分組,掃描排序後的 nodes,根據 y 值變化劃分列表\n5. 回傳結果,res 即 vertical order traversal 的輸出。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:\n nodes = []\n q = deque([(root, 0, 0)])\n while q:\n node, x, y = q.popleft()\n nodes.append((x, y, node.val))\n if node.left:\n q.append((node.left, x+1, y-1))\n if node.right:\n q.append((node.right, x+1, y+1))\n\n nodes.sort(key=lambda x: (x[1], x[0], x[2]))\n res = []\n cur_y = None\n for _, y, val in nodes:\n if y != cur_y:\n res.append([val])\n cur_y = y\n else:\n res[-1].append(val)\n\n return res\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260998230","body":"思維:\n1. 定義狀態 dp[i] 表示「到達第 i 階的最小花費」\n2. 每次要到達第 i 階,有兩種方式:從第 i-1 階踩一階上來 → 花費 = dp[i-1] + cost[i-1] or 從第 i-2 階踩兩階上來 → 花費 = dp[i-2] + cost[i-2]\n3. 所以取較小值 dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n4. 我們要到達頂樓 = len(cost),因此答案是 dp[-1](即 dp[len(cost)])\n\n代碼:\n```python3\nclass Solution:\n def minCostClimbingStairs(self, cost: List[int]) -> int:\n dp = [0] * (len(cost) + 1)\n for i in range(2, len(cost) + 1):\n dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n\n return dp[-1]\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263817074","body":"思維:\n1. 如果只有一間房子,直接回傳 nums[0]\n2. 初始化 dp 陣列,建立一個長度與 nums 相同的陣列 dp,dp[i] 表示考慮到第 i 間房子時,選擇偷這間房子,能得到的最大金額\n3. 填入前兩個房子:如果 i < 2,直接偷這間房子\n4. 狀態轉移(從 i=2 開始),偷第 i 間房的前提是不能偷相鄰的,所以考慮搭配 i-2 或搭配 i-3 的最佳解\n5. 最後答案一定是偷到倒數第 1 間(dp[-1])或倒數第 2 間(dp[-2]),取最大值\n\n代碼:\n```python\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n if len(nums) == 1:\n return nums[0]\n\n dp = [0] * len(nums)\n for i, num in enumerate(nums):\n if i < 2:\n dp[i] = num\n else:\n dp[i] = max(dp[i-2] + num, dp[i-3] + num)\n\n return max(dp[-1], dp[-2])\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3264481892","body":"思維:\n1. dp[i]: 表示以 nums[i] 結尾的 LIS 最長長度、count[i]: 表示有多少組 LIS 長度等於 dp[i] 是以 nums[i] 結尾的\n2. 對每個 i,檢查它前面的每個 j,如果 nums[j] < nums[i],則可以將 nums[i] 接在 nums[j] 後面\n3. 如果接在 j 後面可以讓序列更長(dp[j] + 1 > dp[i]),則更新 dp[i] = dp[j] + 1,並且把組數設為 count[i] = count[j]\n4. 如果接在 j 後面剛好等長(dp[j] + 1 == dp[i]),則表示找到另一條一樣長的走法,所以把組數加進來 count[i] += count[j]\n5. 最後找出所有 dp[i] == max_len 的位置,把它們對應的 count[i] 加總起來\n\n代碼:\n```python\nclass Solution:\n def findNumberOfLIS(self, nums: List[int]) -> int:\n n = len(nums)\n dp = [1] * n\n count = [1] * n\n\n for i in range(n):\n for j in range(i):\n if nums[j] < nums[i]:\n if dp[j] + 1 > dp[i]:\n dp[i] = dp[j] + 1\n count[i] = count[j]\n elif dp[j] + 1 == dp[i]:\n count[i] += count[j]\n\n max_len = max(dp)\n return sum(c for i, c in enumerate(count) if dp[i] == max_len)\n```\n時間複雜度:O(n^2)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269134596","body":"思維:\n1. 設 dp[i][j] = text1[:i] 與 text2[:j] 的最長共同子序列長度\n2. 如果其中一個字串長度為 0 → LCS = 0,所以 dp[0][*] 和 dp[*][0] 全部設為 0\n3. 如果 text1[i-1] == text2[j-1],這個字元可以加入 LCS → dp[i][j] = dp[i-1][j-1] + 1\n4. 否則這個字元不能同時出現在 LCS,只能丟掉其中一個字元,取兩種情況最大值 → dp[i][j] = max(dp[i-1][j], dp[i][j-1])\n5. 回傳 dp[-1][-1](表格右下角)就是最終答案\n\n代碼:\n```python\nclass Solution:\n def longestCommonSubsequence(self, text1: str, text2: str) -> int:\n m = len(text1)\n n = len(text2)\n dp = [[0]*(n+1) for _ in range(m+1)]\n \n for i in range(1, m+1):\n for j in range(1, n+1):\n if text1[i-1] == text2[j-1]:\n dp[i][j] = dp[i-1][j-1] + 1\n else:\n dp[i][j] = max(dp[i-1][j], dp[i][j-1])\n\n return dp[-1][-1]\n```\n時間複雜度:O(m * n)\n\n空間複雜度:O(m * n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273520377","body":"思維:\n1. 機器人從左上角走到右下角,只能往下或往右,所以每個格子的路徑數 = 從上方來的路徑數 + 從左方來的路徑數\n2. 狀態定義:dp[i][j] = 從起點 (0,0) 到 (i,j) 的路徑數\n3. 初始化所有路徑都是 1,主要是第一行、第一列只能直走一條路徑因此都是 1\n4. dp[i][j] 的路徑數就等於 dp[i−1][j] (從上方來的路徑數) + dp[i][j−1] (從左方來的路徑數)\n5. 最後答案取右下角 dp[m-1][n-1]\n\n代碼:\n```python\nclass Solution:\n def uniquePaths(self, m: int, n: int) -> int:\n dp = [[1] * n for _ in range(m)]\n for i in range(1, m):\n for j in range(1, n):\n dp[i][j] = dp[i-1][j] + dp[i][j-1]\n \n return dp[m-1][n-1]\n```\n時間複雜度:O(m * n)\n\n空間複雜度:O(m * n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3278614246","body":"思維:\n1. 狀態定義:dp[r][c] = 騎士在走了 t 步之後,位於 (r,c) 的機率\n2. 初始化:t=0 時,起點 (row, column) 的機率 = 1.0,其他位置 = 0.0\n3. 狀態轉移:從 (r,c) 出發,分散到 8 個可能位置。每一個合法位置的機率 += dp[r][c] / 8\n4. 重複 k 次:每一步產生新的棋盤機率分佈,並用新的棋盤機率更新 dp 陣列\n5. 回傳答案:把整個棋盤上機率加總,就是騎士還在棋盤上的總機率\n\n代碼:\n```python\nclass Solution:\n def knightProbability(self, n: int, k: int, row: int, column: int) -> float:\n dp = [[0.0] * n for _ in range(n)]\n dp[row][column] = 1.0\n positions = [(-1, 2), (-1, -2), (-2, 1), (-2, -1), (1, 2), (1, -2), (2, 1), (2, -1)]\n\n for i in range(k):\n next_dp = [[0.0] * n for _ in range(n)]\n for r in range(n):\n for c in range(n):\n if dp[r][c] > 0:\n for dr, dc in positions:\n nr, nc = r + dr, c + dc\n if 0 <= nr < n and 0 <= nc < n:\n next_dp[nr][nc] += dp[r][c] / 8.0\n dp = next_dp \n\n return sum(sum(row) for row in dp)\n```\n時間複雜度:O(k * n^2)\n\n空間複雜度:O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3285759121","body":"思維:\n1. 如果 1+2+…+max < desiredTotal → 永遠湊不到目標 → return False\n2. 如果 desiredTotal ≤ maxChoosableInteger → 先手一次就贏 → return True\n3. 用 bitmask mask 記錄哪些數字已被選過,用 remain 記錄距離目標還差多少\n4. 遞迴判斷 (dfs) 嘗試每一個未被選過的數字 num\n5. 如果 num ≥ remain → 我馬上贏 → return True,否則進入新狀態 (new_mask, remain-num),讓對手繼續\n6. 如果對手在新狀態輸(dfs 回 False)→ 我必勝 → return True\n7. 如果沒有任何選擇能讓我贏 → return False\n\n代碼:\n```python\nclass Solution:\n def canIWin(self, maxChoosableInteger: int, desiredTotal: int) -> bool: \n total_sum = (1 + maxChoosableInteger) * maxChoosableInteger / 2\n if total_sum < desiredTotal:\n return False\n if desiredTotal <= maxChoosableInteger:\n return True\n \n @lru_cache(None)\n def dfs(mask, remain):\n for num in range(1, maxChoosableInteger + 1):\n if not mask & (1 << (num-1)):\n if num >= remain:\n return True\n new_mask = mask | (1 << (num-1))\n if not dfs(new_mask, remain - num):\n return True\n return False\n\n return dfs(0, desiredTotal)\n```\n時間複雜度:O(m * 2^m)\n\n空間複雜度:O(2^m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3287665138","body":"思維:\n1. 如果 nums 的總和是奇數,不可能分成兩組相等 → return False\n2. 否則,目標和 = 總和 / 2\n3. 狀態定義:dp[i][j] = 是否可以用前 i 個數字湊出和 j\n4. 初始化:dp[0][0] = True(不用任何數字就能湊出 0),dp[0][j>0] = False(不用數字不可能湊出正數)\n5. 若 j < nums[i-1] → 這個數太大,不能用因此只能 → dp[i][j] = dp[i-1][j]\n6. 若 j ≥ nums[i-1] → 可以選用或不用這個數 → dp[i][j] = dp[i-1][j] or dp[i-1][j - nums[i-1]]\n7. 最後看 dp[n][target],如果 True → 代表能找到一個子集和 = target → 表示 nums 可分成兩組\n\n代碼:\n```python\nclass Solution:\n def canPartition(self, : List[int]) -> bool:\n if sum(nums) % 2 > 0:\n return False\n target = sum(nums) // 2\n\n dp = [[False] * (target + 1) for _ in range(len(nums) + 1)]\n dp[0][0] = True\n for i in range(1, len(nums) + 1):\n for j in range(target + 1):\n if j < nums[i-1]:\n dp[i][j] = dp[i-1][j]\n else:\n dp[i][j] = dp[i-1][j] or dp[i-1][j-nums[i-1]]\n\n return dp[len(nums)][target]\n```\n時間複雜度:O(n * m) (n for length of nums, m for target)\n\n空間複雜度:O(n * m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289413390","body":"思維:\n1. 要找能不能在 nums 前加上 + 或 -,最後湊成 target,等價於找一個子集,使總和 = (sum(nums)+target)/2 = p\n2. 如果 abs(target) > sum → 超過總和,必然無解,如果 sum + target 是奇數 → p 不是整數,也必然無解\n3. 狀態定義:dp[j] = 方法數,表示能湊出和為 j 的子集數量\n4. 初始化:dp[0] = 1 → 空集合能湊出 0 的方法只有 1 種\n5. 狀態轉移:遍歷每個數字 num,倒序更新,如果能湊出 j-num,再加上 num 就能湊出 j\n6. 答案回傳 dp[p],也就是湊出和為 p 的方法數\n\n代碼:\n```python\nclass Solution:\n def findTargetSumWays(self, nums: List[int], target: int) -> int:\n if abs(target) > sum(nums) or (sum(nums) + target) % 2 > 0:\n return 0\n\n p = (sum(nums) + target) // 2\n dp = [0] * (p + 1)\n dp[0] = 1\n for i in range(len(nums)):\n for j in range(p, nums[i]-1, -1):\n dp[j] += dp[j-nums[i]]\n\n return dp[p]\n``` \n時間複雜度:O(n * p) \n\n空間複雜度:O(p)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290383887","body":"思維:\n1. 初始化建立 dp 陣列,長度為 amount+1,全部設成無窮大 inf,代表一開始不可達\n2. 設 dp[0] = 0,表示湊 0 元不需要硬幣\n3. 外層金額 i 從 1 跑到 amount,內層對每個硬幣 coin 嘗試\n4. 如果 i - coin >= 0,表示可用這枚硬幣,更新 dp[i] = min(dp[i], dp[i - coin] + 1) (選湊出 i 元的最少硬幣數,看最後一枚硬幣選哪個面額)\n5. 回傳答案如果 dp[amount] 還是 inf,代表不可達回傳 -1,否則回傳 dp[amount]\n\n代碼:\n```python\nclass Solution:\n def coinChange(self, coins: List[int], amount: int) -> int:\n dp = [inf] * (amount + 1)\n dp[0] = 0\n for i in range(1, amount+1):\n for coin in coins:\n if i - coin >= 0:\n dp[i] = min(dp[i], dp[i - coin]+1)\n \n return dp[amount] if dp[amount] != inf else -1\n```\n時間複雜度:O(m × n) (m for amount, n for length of coins)\n\n空間複雜度:O(m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3299125872","body":"思維:\n1. 昨天的題目需考慮排列數(考慮順序),今天的題目僅需考慮組合數(不考慮順序)\n2. 定義 dp[i] = 湊出金額 i 的 組合數\n3. dp[0] = 1:湊出 0 元只有一種方式,什麼都不拿,其餘 dp[i] = 0,表示一開始還沒有任何組合\n4. 外層迴圈:逐一考慮硬幣 coin,內層迴圈:從金額 coin 開始到 amount 逐步更新\n5. dp[i] += dp[i - coin]:若要湊出金額 i,可以先用一個 coin,剩下的 i - coin 由之前的組合補上\n6. 避免重複排列,因為外層是硬幣,每一種硬幣只能在自己之後加入,確保順序不會被重複計算\n7. 回傳答案 dp[amount] 即為湊出總金額的組合數\n\n代碼:\n```python\nclass Solution:\n def change(self, amount: int, coins: List[int]) -> int:\n dp = [0] * (amount + 1)\n dp[0] = 1\n for coin in coins:\n for i in range(coin, amount+1):\n dp[i] += dp[i - coin]\n\n return dp[amount]\n```\n時間複雜度:O(m × n) (m for amount, n for length of coins)\n\n空間複雜度:O(m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3301195823","body":"思維:\n1. 排序貪心:把 g(貪心值)與 s(餅乾大小)都排序\n2. 從大的開始配對:i 指向最大餅乾,j 指向最難滿足的小孩\n3. 若 s[i] >= g[j],就把這片大餅乾給這個小孩,否則,去嘗試滿足下一個(較不貪心)孩子\n5. 結束條件:任一方用完即停止,輸出成功配對數 res\n\n代碼:\n```python\nclass Solution:\n def findContentChildren(self, g: List[int], s: List[int]) -> int:\n g.sort()\n s.sort()\n i = len(s)-1\n j = len(g)-1\n res = 0\n \n while i >= 0 and j >= 0:\n if s[i] >= g[j]:\n res += 1\n i -= 1\n j -= 1\n\n return res\n```\n時間複雜度:O(nlogn+mlogm) (sorting)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3305048523","body":"思維:\n1. 先依 start 排序,若 start 相同則依 end 排序\n2. 用 prev_end 記錄上一次保留的區間結束\n3. 遍歷:如果當前區間 cur_start < prev_end → 代表重疊\n4. 若 cur_end < prev_end → 保留更早結束的區間(更新 prev_end)\n5. 不管怎樣,重疊就要刪掉一個,res += 1\n6. 否則(不重疊) → 更新 prev_end = cur_end\n7. 回傳刪除數量\n\n代碼:\n```python\nclass Solution:\n def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:\n intervals = sorted(intervals)\n prev_end = intervals[0][1]\n res = 0\n\n for i in range(1, len(intervals)):\n cur_start, cur_end = intervals[i]\n if cur_start < prev_end:\n if cur_end < prev_end:\n prev_end = cur_end\n res += 1\n else:\n prev_end = cur_end\n \n return res\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3310296356","body":"思維:\n1. 初始化設定 farthest = 0,代表目前能到達的最遠位置(初始只能到 index 0)\n2. 遍歷陣列依序檢查每個位置檢查是否可達:i = 當前所在索引,step = 在這個位置能往前跳的最大步數\n3. 如果 i > farthest,表示這個位置已經超過了之前能到的最遠範圍 → 代表根本走不到這裡 → 直接回傳 False\n4. 否則更新最遠範圍 farthest = max(farthest, i + step)\n5. 結束迴圈能完整跑完,代表沒有遇到無法到達的位置,直接回傳 True(一定能到達最後一格)\n\n代碼:\n```python\nclass Solution:\n def canJump(self, nums: List[int]) -> bool:\n farthest = 0\n for i, step in enumerate(nums):\n if i > farthest:\n return False\n farthest = max(farthest, i + step)\n return True\n```\n時間複雜度:O(n)\n\n空間複雜度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/73#issuecomment-3317351262","body":"思維:\n1. Base Case: n=1 → [1]、n=2 → [1,2]\n2. 把問題拆成奇數子問題 (長度 = (n+1)//2) 和偶數子問題 (長度 = n//2),避免等差數列的產生\n3. 奇數組跟偶數組內分別都是從一個更小的 beautiful array 轉換來的,本身不會產生違規的等差數列\n4. 如果一邊是奇數、一邊是偶數,它們的平均數會是小數(不是整數),但我們的陣列只包含整數,不可能命中,所以跨組之間絕對安全\n5. 奇數子問題的結果全部轉換成奇數(2*x-1)\n6. 偶數子問題的結果全部轉換成偶數(2*x)\n7. 把奇數陣列與偶數陣列串接在一起,得到長度 n 的 beautiful array\n\n代碼:\n```python\nclass Solution:\n def beautifulArray(self, n: int) -> List[int]:\n if n == 1:\n return [1]\n if n == 2:\n return [1, 2]\n\n odd_arr = [x*2 -1 for x in self.beautifulArray((n+1) // 2)]\n even_arr = [x*2 for x in self.beautifulArray(n // 2)]\n \n return odd_arr + even_arr\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322731377","body":"思維:\n1. 所有數字 XOR 一遍,因為成對的數字會抵消掉 (a ^ a = 0),最後剩下的是 xor_all = x ^ y\n2. 這裡的 x, y 就是我們要找的兩個只出現一次的數字\n3. 找到一個區分 x, y 的 bit,因為 x != y,xor_all 至少有一個 bit = 1,代表 x 和 y 在那一位不同\n4. 用 diff_bit = xor_all & (-xor_all) 取出最低 set bit (最右邊的 1)\n5. 根據這個 diff_bit 把數字分組,如果 (num & diff_bit) != 0 → 放在組 A,否則 → 放在組 B\n6. 各組再 XOR 一遍,成對數字會互相抵消,只剩下唯一的 x 或 y\n7. 最後兩組結果就是 [x, y]\n\n代碼:\n```python\nclass Solution:\n def singleNumber(self, nums: List[int]) -> List[int]:\n xor_all = 0\n for num in nums:\n xor_all ^= num\n\n diff_bit = xor_all & (-xor_all)\n\n x, y = 0, 0\n for num in nums:\n if num & diff_bit:\n x ^= num\n else:\n y ^= num\n\n return [x, y]\n```\n時間複雜度:O(n)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3326355904","body":"思維:\n1. 把長度為 n 的陣列 nums 想成有 n 個開關(bit),一個整數 mask 的二進位表示,就代表一個子集合,mask 從 0 走到 (1<> i) & 1 == 1,代表第 i 位被選中 → subset.append(nums[i]),最後把 subset 加進 res\n4. 回傳結果 res\n\n代碼:\n```python\nclass Solution:\n def subsets(self, nums: List[int]) -> List[List[int]]:\n n = len(nums)\n res = []\n for mask in range(1 << n):\n subset = []\n for i in range(n):\n if (mask >> i) & 1:\n subset.append(nums[i])\n res.append(subset)\n\n return res\n```\n時間複雜度:O(n · 2^n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3332654533","body":"思維:\n1. TrieNode 結構:children 字典,用來存放「下一個字元 → 子節點」,hasword 標記當前節點是否對應一個完整單詞\n2. Trie 主類別:insert(word) 從 root 出發逐字檢查,若不存在就新建節點,最後節點標記 hasword = True\n3. search(word) 從 root 出發逐字檢查,若遇到缺失字元,直接回傳 False,結束後檢查最後節點的 hasword,若 True 表示單詞存在\n4. startsWith(prefix) 與 search 類似,但不需檢查 hasword,只要能走到 prefix 的最後一個節點就回傳 True\n\n代碼:\n```python\nclass TrieNode:\n def __init__(self):\n self.children = {}\n self.hasword = False\n\n\nclass Trie:\n def __init__(self):\n self.head = TrieNode()\n \n def insert(self, word: str) -> None:\n cur = self.head\n for c in word:\n if c not in cur.children:\n cur.children[c] = TrieNode()\n cur = cur.children[c]\n cur.hasword = True\n\n def search(self, word: str) -> bool:\n cur = self.head\n for c in word:\n if c not in cur.children:\n return False\n cur = cur.children[c]\n\n return cur.hasword\n\n def startsWith(self, prefix: str) -> bool:\n cur = self.head\n for c in prefix:\n if c not in cur.children:\n return False\n cur = cur.children[c]\n return True\n \n\n# Your Trie object will be instantiated and called as such:\n# obj = Trie()\n# obj.insert(word)\n# param_2 = obj.search(word)\n# param_3 = obj.startsWith(prefix)\n```\n時間複雜度:O(n) (Insert, search, startsWith)\n\n空間複雜度:O(n) (Insert) / O(1) (search, startsWith)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3337545631","body":"思維:\n1. TrieNode 結構:children 存子節點,precount 紀錄該節點以下所有 key 對應值的總和(前綴總和),count 紀錄如果這裡是完整單字,記錄它的 value\n2. insert(key, val):逐字往下走,若不存在就新建節點,每走過一個節點 → precount += val(加上新值)\n3. 如果這個 key 之前沒出現過 → 直接存 count = val,如果 key 已經存在 → 先取出舊值 deduct = cur.count,再更新 count = val\n4. 最後重新走一遍 key,把前綴總和扣掉原本的舊值 precount -= deduct\n5. sum(prefix):從 root 開始逐字走 prefix,如果 prefix 路徑不存在 → 回傳 0,如果存在 → 回傳最後節點的 precount\n\n代碼:\n```python\nclass TrieNode:\n def __init__(self):\n self.children = {}\n self.precount = 0\n self.count = 0\n\nclass MapSum:\n\n def __init__(self):\n self.head = TrieNode()\n\n def insert(self, key: str, val: int) -> None:\n cur = self.head\n for c in key:\n if c not in cur.children:\n cur.children[c] = TrieNode()\n cur = cur.children[c]\n cur.precount += val\n\n if not cur.count:\n cur.count = val\n else:\n deduct = cur.count\n cur.count = val\n cur = self.head\n for c in key:\n cur = cur.children[c]\n cur.precount -= deduct\n \n\n def sum(self, prefix: str) -> int:\n cur = self.head\n for c in prefix:\n if c not in cur.children:\n return 0\n cur = cur.children[c]\n return cur.precount\n\n\n# Your MapSum object will be instantiated and called as such:\n# obj = MapSum()\n# obj.insert(key,val)\n# param_2 = obj.sum(prefix)\n```\n時間複雜度:O(n) (Insert, sum)\n\n空間複雜度:O(n) (Insert) / O(1) (sum)","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zechengze":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074243047","body":"### Time complexity\nO(max(n, log₁₀(k)))\n\n### Space complexity\nO(max(n, log₁₀(k)))\n\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n ans = []\n n = len(num)\n carry = 0\n i = n - 1\n while k > 0 or i >= 0 or carry > 0:\n sum = carry\n if k > 0:\n rem = k % 10\n sum += rem\n k //= 10\n if i >= 0:\n sum += num[i]\n i -= 1\n carry = sum // 10\n ans.insert(0, sum % 10)\n return ans","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092419843","body":"使用兩個 stack:\n- in_stack: 用來接收 push\n- out_stack: 用來處理 pop 和 peek\n- 當 out_stack 為空時,將 in_stack 的所有元素彈出並倒序放入 out_stack,用來模擬 queue 的 FIFO\n\n - push:O(1)\n - pop:O(1)\n - peek:O(1)\n - empty :O(1)\n\n---\n\n### Python code\n\n```python\nclass MyQueue:\n\n def __init__(self):\n self.in_stack = []\n self.out_stack = []\n\n def push(self, x: int) -> None:\n self.in_stack.append(x)\n\n def pop(self) -> int:\n self.peek() # 確保 out_stack 有東西\n return self.out_stack.pop()\n\n def peek(self) -> int:\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack[-1]\n\n def empty(self) -> bool:\n return not self.in_stack and not self.out_stack","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109185662","body":"### 解題思路\n- 先統計整個 linked list 長度。\n- 使用遞迴,每次選擇區間的中間當作 root。\n- 左子樹遞迴後才處理當前節點。\n\n時間 O(n) 每個節點遍歷一次\n\n```python\nclass Solution:\n def sortedListToBST(self, head: ListNode) -> TreeNode:\n def getLength(node: ListNode) -> int:\n length = 0\n while node:\n length += 1\n node = node.next\n return length\n\n def buildBST(start: int, end: int) -> TreeNode:\n nonlocal head\n if start > end:\n return None\n\n mid = (start + end) // 2\n # 先建左子樹\n left = buildBST(start, mid - 1)\n\n # 再建 root(中序)\n root = TreeNode(head.val)\n head = head.next\n\n # 最後建右子樹\n root.left = left\n root.right = buildBST(mid + 1, end)\n return root\n\n length = getLength(head)\n return buildBST(0, length - 1)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124485354","body":"### 思路\n- 遞迴 DFS\n- 如果節點為空,深度為 0。\n- 遞迴左右子樹的最大深度,取最大值後 +1。\n\n---\n\n### 遞迴 DFS(Top-down)\n\n```python\nclass Solution:\n def maxDepth(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136873834","body":"### BFS(反向遍歷)\n\n- 一般 BFS 是左先入,改為右先入左後入\n- 最後訪問的節點就是最底層最左側的節點\n- 每次 `popleft()` 拿出的節點覆蓋 `leftmost`\n- 時間複雜度 : O(n)\n---\n\n```python\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n if not root:\n return None\n \n queue = deque([root])\n leftmost = None\n\n while queue:\n leftmost = queue.popleft()\n if leftmost.right:\n queue.append(leftmost.right)\n if leftmost.left:\n queue.append(leftmost.left)\n\n return leftmost.val\n","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146260024","body":"### 解題思路:哈希表(一次遍歷)\n\n1. 初始化一個空dict h\n2. 遍歷陣列 nums,對每個元素 nums[i]:\n - 計算 plus = target - nums[i]\n - 如果 plus 的值在字典中,回傳 [h[plus], i]\n - else 將 nums[i] 存入 dict 中\n\n- 時間、空間複雜度:O(n)\n\n---\n```python\nclass Solution:\n def twoSum(self, nums: List[int], target: int) -> List[int]:\n h = {}\n for i in range(len(nums)):\n plus = target - nums[i]\n if plus in h:\n return [h[plus], i]\n else:\n h[nums[i]] = i","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148509431","body":"### 解題思路:哈希表 + 排序\n\n1. 先用 dict 統計每個元素出現的次數\n2. 使用 sorted 對 dict 依據頻率降序排序\n3. 取出前 k 個 keys 回傳\n\n- 時間複雜度:O(n log n)\n\n---\n\n```python\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n h_map = {}\n for i in nums:\n if i in h_map:\n h_map[i] += 1\n else:\n h_map[i] = 1\n\n h_map = dict(sorted(h_map.items(), key=lambda x: x[1], reverse=True))\n ans = list(h_map.keys())[:k]\n return ans\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170662667","body":"## 解題思路\n陣列已排序,相同的元素一定會相鄰,因此可以使用雙指針: \n1. 設定指標 `init` 指向下個唯一值要放置的位置,初始為 1。 \n2. 從第二個元素開始遍歷,若與前一個元素不同,則將該元素放到 `init` 位置並將 `init` 加 1。 \n3. 最後 `init` 即為去重後的長度。\n\n---\n\n## 時間複雜度\n- **O(n)**:只需遍歷一次陣列。\n\n## 空間複雜度\n- **O(1)**:在原陣列上進行操作,未使用額外空間。\n\n---\n\n## 程式碼\n```python\nfrom typing import List\n\nclass Solution:\n def removeDuplicates(self, nums: List[int]) -> int:\n init = 1\n for i in range(1, len(nums)):\n if nums[i] != nums[i - 1]:\n nums[init] = nums[i]\n init += 1\n return init\n```\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182007045","body":"### 解題思路\n1. 將 `dislikes` 轉換為 **圖的鄰接表** `dislike_table`。\n2. 使用顏色標記(`BLUE = 1`, `GREEN = -1`)來表示兩組人。\n3. 對每個尚未染色的人進行 DFS:\n - 將當前人染色為某一顏色。\n - 對於他不喜歡的人,必須染成相反顏色。\n - 如果發現相鄰節點顏色與自己相同,則表示無法二分。\n4. 如果所有人都能正確染色,則回傳 `True`。\n\n---\n\n```python\nfrom collections import defaultdict\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, N: int, dislikes: List[List[int]]) -> bool:\n BLUE, GREEN = 1, -1\n \n def draw(person_id, color):\n color_of[person_id] = color\n for the_other in dislike_table[person_id]:\n if color_of[the_other] == color:\n return False\n if not color_of[the_other] and not draw(the_other, -color):\n return False\n return True\n \n if N == 1 or not dislikes:\n return True\n \n dislike_table = defaultdict(list)\n color_of = defaultdict(int)\n \n for p1, p2 in dislikes:\n dislike_table[p1].append(p2)\n dislike_table[p2].append(p1)\n \n for person_id in range(1, N + 1):\n if not color_of[person_id] and not draw(person_id, BLUE):\n return False\n \n return True","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mr-kient":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074503694","body":"### 【Day 1】989. 数组形式的整数加法\n\n#### Main Idea\n\n1. Since the length of `num` can reach 10000, a brute-force approach of adding each digit of `num` multiplied by 10^[n-i] to form a number and then adding it to K is not feasible, as it would cause an overflow.\n\n2. We can simulate manual vertical calculation by reversing the array and starting the addition from the last digit of both `num` and `k`.\n\n3. Set a global variable `ex` to determine if a carry is needed when adding each digit.\n\n > [!NOTE]\n > Remember to check if there is a carry after adding the first digit.\n\n4. If an array index exceeds the limit, treat it as 0; if `k` is shorter than `num`, treat the remaining digits of `k` as 0.\n\n\n#### Code\n\n```cpp\nclass Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n int n = num.size();\n vector res;\n int ex = 0;\n int i = n - 1;\n\n while (i >= 0 || k > 0) {\n int x = (i >= 0) ? num[i] : 0; //k可能比num长\n int y = k % 10;\n int sum = x + y + ex;\n res.push_back(sum % 10);\n ex = sum / 10;\n k /= 10;\n i--;\n }\n\n if (ex)\n res.push_back(ex);\n\n reverse(res.begin(), res.end());\n\n return res;\n }\n};\n```\n\n#### Complexity\n\n$O(Max(num.size(), log(k)))$","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3076134448","body":"### **【Day 2】821. 字符的最短距离**\n\n#### Main idea\n\n1. Two linear traversals: The first one records the distance from each `s[i]` to the previous `c` from left to right; The second time, from right to left, update the minimum distance compared to the previous distance\n2. ⚠️ Note: During the two initializations, the first initialization should be very small because there will be no appearance of `c` after traversing to the right for a long time. If the setting is not small enough, it will result in an insufficiently large distance value, which will affect the update of the correct value from right to left in the second traversal\n\n```cpp\nclass Solution {\npublic:\n vector shortestToChar(string s, char c) {\n int n = s.size();\n vector res(n, n);\n int c_id = -n;\n\n for (int i = 0; i < n; i++) {\n\n if (s[i] == c) {\n c_id = i;\n }\n res[i] = i - c_id;\n }\n\n c_id = 2 * n;\n\n for (int j = n - 1; j >= 0; j--) {\n if (s[j] == c) {\n c_id = j;\n }\n\n res[j] = min(res[j], c_id - j);\n }\n\n return res;\n }\n};\n```\n\n#### Complexity\n\nLoop twice: $O(2*s.szie())$","onTime":true},null,null,null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124415547","body":"### 【Day 13】[104. 二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/)\n\n#### Main Idea \n\n1. 首先考虑到递归即遍历二叉树的左右子树,计算每个节点的左右子树的最大深度\n\n - **递归终止条件**:如果当前节点为空,则返回0(表示当前路径长度为0)。\n - **递归逻辑**:对于当前节点,递归计算左子树的最大深度和右子树的最大深度,取较大值并加1(当前节点本身)\n - **时间复杂度**:O(n),其中n是二叉树的节点总数。每个节点被访问一次。\n\n2. DFS\n\n ```c++\n /**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\n \n class Solution {\n public:\n int maxDepth(TreeNode* root) {\n if (!root) return 0;\n \n std::stack> s;\n s.push({root, 1});\n int max_depth = 0;\n \n while (!s.empty()) {\n auto [node, depth] = s.top();\n s.pop();\n max_depth = std::max(max_depth, depth);\n \n if (node->left) {\n s.push({node->left, depth + 1});\n }\n if (node->right) {\n s.push({node->right, depth + 1});\n }\n }\n \n return max_depth;\n }\n };\n ```\n\n \n\n#### 时间复杂度\n\n要计算二叉树的最大深度,必须访问每一个节点一次,因为最长路径可能出现在任意位置。**没有比O(n)更优的时间复杂度**,因为无论如何都需要遍历所有节点以确认最长路径。","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146453148","body":"### 【Day 19】两数之和\n\n#### Main Idea\n\n1. **暴力枚举**\n - 遍历数组中的每一个元素 `nums[i]`,再对其后续所有元素 `nums[j]`(`j > i`)进行遍历,判断 `nums[i] + nums[j] == target` 时返回 `[i, j]`。\n - **时间复杂度**:O(n²),最坏情况下需要检查所有的元素对。\n2. **哈希表(一遍扫描)**\n - 利用一个哈希表 `mp` 存储 <数值 → 下标 >的映射。\n - 遍历数组,令 `complement = target - nums[i]`:\n - 如果哈希表中已存在 `complement`,说明之前遇到过这么一个数,二者之和等于 `target`,直接返回对应的下标。\n - 否则将当前元素 `nums[i]` 及其下标 `i` 存入哈希表,继续扫描。\n - **优点**:一次遍历搞定,时间和空间都最优。\n\n```c++\n#include \n#include \nusing namespace std;\n\nclass Solution {\npublic:\n vector twoSum(vector& nums, int target) {\n unordered_map mp; // 存储 已访问的数值 → 下标\n for (int i = 0; i < nums.size(); ++i) {\n int complement = target - nums[i];\n // 如果哈希表中已有 complement,则直接返回答案\n if (mp.find(complement) != mp.end()) {\n return { mp[complement], i };\n }\n // 否则将当前数及下标存入\n mp[nums[i]] = i;\n }\n return {}; // 根据题意不会走到这里\n }\n};\n```\n\n#### 时间复杂度\n\n- **哈希表解法**:O(n),只需一次遍历即可完成查找与存储操作。\n- **空间复杂度**:O(n),最坏情况下哈希表需存储 n 个元素。","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168242525","body":"Main Idea\n\n1. 快慢指针法\n\n设置两个指针 slow 和 fast,初始都指向链表头结点。\n\nfast 每次向前移动 两步,slow 每次向前移动 一步。\n\n当 fast 到达链表末尾时,slow 恰好位于链表的中间位置。\n\n由于题目要求 当有两个中间结点时返回第二个,快慢指针法天然满足这一条件:当链表长度为偶数时,fast 会先到 NULL,此时 slow 指向的就是第二个中间结点。\n\n\n\n2. 时间复杂度\n\nO(n):每个结点最多被访问一次(快指针访问 n/2 次,慢指针访问 n 次)。\n\n\n\n3. 空间复杂度\n\nO(1):只使用了两个额外指针,不需要额外的数据结构。\n\n\n\n\n\n---\n\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode() : val(0), next(nullptr) {}\n * ListNode(int x) : val(x), next(nullptr) {}\n * ListNode(int x, ListNode *next) : val(x), next(next) {}\n * };\n */\nclass Solution {\npublic:\n ListNode* middleNode(ListNode* head) {\n ListNode* slow = head;\n ListNode* fast = head;\n while (fast != nullptr && fast->next != nullptr) {\n slow = slow->next; // 慢指针走一步\n fast = fast->next->next; // 快指针走两步\n }\n return slow; // slow 即为中间结点\n }\n};\n\n\n---\n\n时间复杂度分析\n\n访问链表的所有节点至少需要一次遍历,因此 没有比 O(n) 更优的时间复杂度。\n\n快慢指针法通过一次遍历同时得到中间节点,避免了额外的存储或两次遍历,比先统计长度再走一半更高效。\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3188424726","body":"#### Main Idea\n\n1. **把未分组项目“补组”**:对 `group[i] == -1` 的项目,给它们分配新的组号(从 `m` 开始递增),这样每个项目都有归属组,最终组的总数记为 `G`。\n2. **两层拓扑排序(Group 拓扑 + Item 拓扑)**:\n\n * **项目层图**:对每条依赖 `u ∈ beforeItems[v]`,连边 `u → v`,统计项目入度。\n * **组层图**:若 `group[u] != group[v]`,再在组图里连边 `group[u] → group[v]`,统计组入度。\n * **先对项目图做一次拓扑排序(得到全局项目顺序)**,再对组图做一次拓扑排序(得到组顺序)。\n3. **按组拼接**:将“项目拓扑序”按照其组别分桶(保持项目拓扑中的相对顺序),再按“组拓扑序”依次把每个桶拼接起来即为答案。\n4. **不可行判定**:任一拓扑排序失败(存在环)则返回空数组。\n\n* **关键点**:跨组依赖只影响组与组的先后关系(由组图保证),组内项目的详细先后由项目图保证。用“两层图”可同时满足“组块相邻”和“依赖有序”。\n\n---\n\n2. **实现**\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n vector sortItems(int n, int m, vector& group, vector>& beforeItems) {\n // 1) 给未分组的项目分配新组号\n int gid = m;\n for (int i = 0; i < n; ++i) {\n if (group[i] == -1) group[i] = gid++;\n }\n int G = gid; // 组总数\n\n // 2) 建立项目图 & 组图\n vector> itemAdj(n), groupAdj(G);\n vector itemIn(n, 0), groupIn(G, 0);\n\n for (int v = 0; v < n; ++v) {\n for (int u : beforeItems[v]) {\n itemAdj[u].push_back(v);\n itemIn[v]++;\n if (group[u] != group[v]) {\n groupAdj[group[u]].push_back(group[v]);\n groupIn[group[v]]++;\n }\n }\n }\n\n // 通用 Kahn 拓扑\n auto topo = [](const vector>& adj, vector indeg) -> vector {\n int N = (int)adj.size();\n queue q;\n for (int i = 0; i < N; ++i) if (indeg[i] == 0) q.push(i);\n vector order;\n order.reserve(N);\n while (!q.empty()) {\n int x = q.front(); q.pop();\n order.push_back(x);\n for (int y : adj[x]) {\n if (--indeg[y] == 0) q.push(y);\n }\n }\n if ((int)order.size() != N) return {}; // 有环\n return order;\n };\n\n // 3) 分别对 项目图、组图 做拓扑排序\n vector itemOrder = topo(itemAdj, itemIn);\n if (itemOrder.empty()) return {};\n vector groupOrder = topo(groupAdj, groupIn);\n if (groupOrder.empty()) return {};\n\n // 4) 按项目拓扑序分桶到各组里,保持项目相对次序\n vector> bucket(G);\n for (int x : itemOrder) bucket[group[x]].push_back(x);\n\n // 5) 按组拓扑序拼接\n vector ans;\n ans.reserve(n);\n for (int g : groupOrder) {\n for (int x : bucket[g]) ans.push_back(x);\n }\n return ans;\n }\n};\n```\n\n#### 时间复杂度\n\n* 建图与两次拓扑排序总计 **O(n + E)**,其中 `E = Σ |beforeItems[i]|`。\n* 额外空间用于邻接表、入度数组与分桶,均为 **O(n + E + G)**。\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3205439203","body":"#### Main Idea\n\n1. **线性扫描 (超时)**\n - 从 0 开始向上遍历整数 `i`。\n - 检查 `i * i` 的值。当第一次出现 `i * i > x` 时,那么 `i-1` 就是我们要求的平方根的整数部分。\n - **注意**:`i * i` 的计算可能会导致整数溢出。为避免此问题,应将判断条件改为 `i > x / i`。\n - **缺点**:当 `x` 非常大时,循环次数过多,会导致执行超时,无法通过所有测试用例。\n\n2. **二分查找**\n - `x` 的平方根一定在 `[0, x]` 这个区间内。\n - 我们可以将问题转化为:**在一个有序的范围内(`0` 到 `x`),寻找最大的整数 `k`,使得 `k² <= x`**。\n - 这正是二分查找的经典应用场景。设置搜索区间的左右边界 `left` 和 `right`,计算中间值 `mid`:\n - 如果 `mid² <= x`,说明 `mid` 是一个可能的解,但我们还想尝试更大的值,因此记录当前解,并在右半部分继续搜索:`ans = mid`, `left = mid + 1`。\n - 如果 `mid² > x`,说明 `mid` 太大了,解一定在左半部分,因此缩小搜索范围:`right = mid - 1`。\n - **优点**:每次都将搜索范围减半,时间复杂度低,效率极高。\n\n```c++\nclass Solution {\npublic:\n int mySqrt(int x) {\n if (x == 0) {\n return 0;\n }\n\n int left = 1, right = x;\n int ans = 0;\n\n while (left <= right) {\n int mid = left + (right - left) / 2;\n\n // 为防止 mid * mid 溢出,使用除法来判断\n // mid <= x / mid 等价于 mid * mid <= x\n if (mid <= x / mid) {\n ans = mid; // mid 是一个可能的解\n left = mid + 1; // 尝试在右侧寻找更大的解\n } else {\n right = mid - 1; // mid 太大,到左侧去寻找\n }\n }\n return ans;\n }\n};\n```\n\n#### 时间复杂度\n\n- **二分查找解法**:O(log n),其中 n 为输入值 `x`。二分查找每次都将搜索空间减半,因此时间复杂度是对数级别的。\n- **空间复杂度**:O(1),解法只使用了常数个额外变量,与输入 `x` 的大小无关。","onTime":true},null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3237241808","body":"#### Main Idea\n\n1. 滑动窗口 + 计数\n\n - 用两个计数器统计字符需求:`need[c]` 表示目标串 `t` 中每个字符需要的数量,`have[c]` 表示当前窗口中已有的数量。\n - 扩张右端:右指针 `r` 逐步右移,把字符加入窗口,并在 `have[c]` 达到 `need[c]` 时,更新已满足的种类数 `formed`。\n - 收缩左端:当窗口已满足 `t` 的全部字符需求(`formed == required`,其中 `required` 为 `t` 中不同字符的个数)时,尽量左移 `l` 缩小窗口并更新最优答案。\n - 唯一性:题目保证若存在答案则唯一,我们只需在收缩时维护最短长度即可。\n\n ```cpp\n #include \n using namespace std;\n \n class Solution {\n public:\n string minWindow(string s, string t) {\n if (t.empty() || s.size() < t.size()) return \"\";\n \n // 统计目标需求\n vector need(128, 0), have(128, 0);\n int required = 0; // 需要满足的不同字符的种类数\n for (char c : t) {\n if (need[c] == 0) required++;\n need[c]++;\n }\n \n int formed = 0; // 当前窗口中已满足 need 的种类数\n int bestLen = INT_MAX, bestL = 0;\n int l = 0;\n \n for (int r = 0; r < (int)s.size(); ++r) {\n char cr = s[r];\n have[cr]++;\n \n // 当某字符数量刚好达到需求,更新 formed\n if (need[cr] > 0 && have[cr] == need[cr]) {\n formed++;\n }\n \n // 若已满足所有字符需求,尽量收缩左端\n while (formed == required) {\n if (r - l + 1 < bestLen) {\n bestLen = r - l + 1;\n bestL = l;\n }\n char cl = s[l];\n have[cl]--;\n // 收缩导致某字符不足,formed 减一\n if (need[cl] > 0 && have[cl] < need[cl]) {\n formed--;\n }\n l++;\n }\n }\n \n return bestLen == INT_MAX ? \"\" : s.substr(bestL, bestLen);\n }\n };\n ```\n\n#### 时间复杂度\n\n双指针各自只右移且不回退,整体 **O(m + n)**;计数数组为常数空间。","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240735616","body":"#### Main Idea\n\n1. **逐行放置**\n - 每一行选择一个不与已放皇后冲突的列。冲突规则:同列、主对角线(r−c)、次对角线(r+c)。\n - **递归终止**:当行号 `row == n`,说明已成功放置 n 个皇后,计数 +1。\n - **选择与撤销**:在当前行尝试所有合法列,递归下一行,回退继续尝试。\n2. **位运算优化**\n - 用 n 位二进制位掩码表示列与对角线占用:\n - `cols`:哪些列被占。\n - `diag1`:主对角线占用(相当于下一行左移一位)。\n - `diag2`:次对角线占用(相当于下一行右移一位)。\n - 可放置位置:`bits = ~(cols | diag1 | diag2) & mask`,其中 `mask = (1<> 1`。\n\n#### 回溯 + 位运算\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int totalNQueens(int n) {\n int mask = (1 << n) - 1;\n return dfs(0, 0, 0, 0, mask, n);\n }\n\nprivate:\n // row: 当前行号;cols/diag1/diag2:占用掩码;mask:仅保留 n 位\n int dfs(int row, int cols, int diag1, int diag2, int mask, int n) {\n if (row == n) return 1;\n\n int count = 0;\n int bits = (~(cols | diag1 | diag2)) & mask; // 当前行可放置的位置集合\n\n while (bits) {\n int p = bits & -bits; // 取最低位可行位置\n bits -= p; // 移除该位置\n\n count += dfs(row + 1,\n cols | p,\n ((diag1 | p) << 1) & mask, // 主对角线左移并截断\n (diag2 | p) >> 1, // 次对角线右移\n mask, n);\n }\n return count;\n }\n};\n```\n\n#### 时间复杂度\n\n- **时间**:回溯搜索的上界接近 **O(n!)**,但位运算将冲突判断降为 O(1) 常数,n ≤ 9 时非常快。\n- **空间**:**O(n)**(递归深度 n,掩码为常数额外空间)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247569627","body":"#### Main Idea\n\n1. BFS(从所有陆地同时出发)\n\n * 把所有值为 `1` 的格子(陆地)一起入队,距离视作 0;像海浪一样一圈圈向外扩散。\n * 第一次被扩散到的海洋格子的距离,就是它到最近陆地的最短曼哈顿距离。\n * 最后被访问到的海洋格子的距离即为答案。\n * **边界**:若全为陆地或全为海洋,返回 `-1`。\n\n2. 实现\n\n ```cpp\n #include \n using namespace std;\n\n class Solution {\n public:\n int maxDistance(vector>& grid) {\n int n = grid.size();\n queue> q;\n vector> dist(n, vector(n, -1));\n\n // 把所有陆地入队,距离置 0\n for (int i = 0; i < n; ++i) {\n for (int j = 0; j < n; ++j) {\n if (grid[i][j] == 1) {\n q.push({i, j});\n dist[i][j] = 0;\n }\n }\n }\n\n // 若全海或全陆,直接返回 -1\n if (q.empty() || (int)q.size() == n * n) return -1;\n\n int ans = -1;\n int dirs[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};\n\n // 多源 BFS\n while (!q.empty()) {\n auto [x, y] = q.front(); q.pop();\n for (auto& d : dirs) {\n int nx = x + d[0], ny = y + d[1];\n if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue;\n if (dist[nx][ny] != -1) continue; // 访问过\n dist[nx][ny] = dist[x][y] + 1; // 最近陆地距离\n ans = max(ans, dist[nx][ny]);\n q.push({nx, ny});\n }\n }\n return ans;\n }\n };\n ```\n\n#### 时间复杂度\n\n* 时间:每个格子最多入队一次,四邻检查常数次,整体 **O(N²)**。\n\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263627488","body":"#### Main Idea\n\n1. **线性决策(相邻不能同抢)**\n\n * 到第 `i` 间房时只有两种选择:\n\n * **不抢它**:收益等于前一间的最佳收益 `dp[i-1]`\n * **抢它**:收益等于“到 i-2 的最佳收益 + 本屋金额” → `dp[i-2] + nums[i]`\n * 所以转移式:`dp[i] = max(dp[i-1], dp[i-2] + nums[i])`\n2. **初值与边界**\n\n * 空数组 → 答案 `0`\n * `dp[0] = nums[0]`\n * `dp[1] = max(nums[0], nums[1])`(如果存在)\n3. **滚动变量优化空间**\n\n * 只依赖 `i-1` 和 `i-2`,用两个变量就够了:\n\n * `prev2` 表示 `dp[i-2]`,`prev1` 表示 `dp[i-1]`\n * 新值 `cur = max(prev1, prev2 + nums[i])`,随后前移指针\n\n#### 动态规划(滚动变量,O(1) 空间)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int rob(vector& nums) {\n if (nums.empty()) return 0;\n int n = nums.size();\n if (n == 1) return nums[0];\n\n int prev2 = 0; // dp[i-2]\n int prev1 = 0; // dp[i-1]\n for (int x : nums) {\n int cur = max(prev1, prev2 + x);\n prev2 = prev1;\n prev1 = cur;\n }\n return prev1;\n }\n};\n```\n\n#### 时间复杂度\n\n* **时间**:`O(n)`(单次线性扫描)\n* **空间**:`O(1)`(滚动变量),如需恢复路径则 `O(n)` 用于记录选择","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3284142988","body":"#### Main idea\n\n**把局面想成“还差多少 + 已用过哪些数”**\n\n- 每次你从公共池里挑一个数,目标值就相应减少;被挑过的数以后都不能再用。\n- 于是每一步其实就是在“还差的分数”和“哪些数已被拿走”的组合之间转换。\n\n**当前能赢的充要条件**\n\n- 如果你现在能直接拿到一个数,使得**累计和立刻达到/超过目标**,你马上赢。\n- 否则,你希望找到一个数字,让对手接下来面对的局面是**必输局**。\n 换句话说:**存在**一个选择能把对手“送进死局”,那你这一步就是必赢;\n 如果**所有**选择都会把对手“送进稳赢局”,那你这一步就是必输。\n\n**两条简单但很有用的剪枝**\n\n- **总和不够就别想了**:如果 1 到 `maxChoosableInteger` 的总和都达不到目标,先手必输。\n- **目标非正直接赢**:如果目标本来就 ≤ 0(或被前人操作减到 ≤ 0),先手已满足条件,直接判赢。\n\n**记住算过的局面,别重复思考(记忆化)**\n\n- 同一组“已用过的数字 + 还差多少”的局面,赢或输的结论是固定的。\n- 把每个局面的输赢结果记下来,后面再遇到就直接用,避免在相同分支上反复推演。\n\n**直觉理解(以示例 1 为例)**\n\n- `max=10, 目标=11`:无论先手先拿哪个数 `x`,后手都能立刻拿到 `11-x`(且该数仍在 1..10 且未被用),直接结束游戏。\n- 所以先手无解——这就是“把对手送进稳赢局”在反方向上的体现。\n\n#### Implementation(cpp)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n bool canIWin(int maxChoosableInteger, int desiredTotal) {\n if (desiredTotal <= 0) return true;\n\n int n = maxChoosableInteger;\n int sum = n * (n + 1) / 2;\n if (sum < desiredTotal) return false; // 全拿都不够,必输\n\n // 2^n 状态;-1=未知,0=必败,1=必胜\n vector memo(1 << n, -1);\n return dfs(0, desiredTotal, n, memo);\n }\n\nprivate:\n // mask: 已用集合(第 i 位表示数字 i+1 是否已用)\n // remain: 距离目标还差多少\n bool dfs(int mask, int remain, int n, vector& memo) {\n char &res = memo[mask];\n if (res != -1) return res;\n\n // 枚举当前可选的每个数 i\n for (int i = 1; i <= n; ++i) {\n int bit = 1 << (i - 1);\n if (mask & bit) continue; // 已用,跳过\n if (i >= remain) return res = 1; // 直接到达/超过目标,当前玩家赢\n // 若选 i 之后对手必败,则当前必胜\n if (!dfs(mask | bit, remain - i, n, memo)) return res = 1;\n }\n return res = 0; // 所有选择都会让对手必胜 => 当前必败\n }\n};\n\n```\n\n#### 复杂度\n\nO(n · 2^n)","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3306753472","body":"#### Main Idea\n\n1. **把“最少删除”转化为“最多保留”**\n\n * 经典区间调度:**按右端点升序**排序,**尽可能先选结束早的区间**,就能在不重叠前提下**保留最多**的区间。\n * 需要移除的最小数量 = `总数 n - 能保留的最大不重叠数量 keep`。\n\n2. **为什么按右端点排是最优的**\n\n * 选更早结束的区间,给后面的区间留下**更多起始空间**,不比选结束晚的更差。\n * 可用“**交换论证**”:若最优解里某一步没有选最早结束者,换成结束更早的,不减少可选余地,解仍最优。\n\n3. **边界与定义(开闭性)**\n\n * 本题规定:端点相同只**接触不重叠**(`[1,2]` 与 `[2,3]` 可共存),因此判断不重叠条件是 `start >= lastEnd`。\n * 允许负数坐标;`1 <= n <= 1e5`,需 `O(n log n)` 排序 + `O(n)` 一次扫描。\n\n---\n\n#### 贪心(按右端点排序)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int eraseOverlapIntervals(vector>& intervals) {\n if (intervals.empty()) return 0;\n\n // 1) 按 end 升序排\n sort(intervals.begin(), intervals.end(),\n [](const vector& a, const vector& b){\n if (a[1] != b[1]) return a[1] < b[1];\n return a[0] < b[0];\n });\n\n // 2) 贪心选择:尽量保留更多不重叠区间\n int keep = 0;\n int lastEnd = INT_MIN; // 当前已选集合的最后一个区间的 end\n for (auto &it : intervals) {\n int s = it[0], e = it[1];\n if (s >= lastEnd) { // 与上一个选择不重叠(端点相接也可)\n ++keep;\n lastEnd = e;\n }\n }\n return (int)intervals.size() - keep; // 最少删除 = 总数 - 最多保留\n }\n};\n```\n\n---\n\n#### 等价实现(按左端点排序的“原地计数删谁”)\n\n* 也可以**按起点升序**,一遍扫描:\n\n * 若当前 `s < prevEnd` 发生**重叠** ⇒ 必须删一个;\n * **删谁?** 删右端点更大的那个(保留 `end` 更小者),将 `prevEnd = min(prevEnd, e)`。\n * 计数 `remove++`。\n* 与前法等价,常用于不想单独计“keep”的写法。\n\n```cpp\nint eraseOverlapIntervals(vector>& intervals) {\n if (intervals.empty()) return 0;\n sort(intervals.begin(), intervals.end()); // 默认按 start,再按 end\n\n int remove = 0;\n int prevEnd = intervals[0][1];\n for (int i = 1; i < (int)intervals.size(); ++i) {\n int s = intervals[i][0], e = intervals[i][1];\n if (s < prevEnd) { // 重叠了,需要删一个\n ++remove;\n prevEnd = min(prevEnd, e); // 删 end 较大的那个,保留更早结束\n } else {\n prevEnd = e; // 不重叠,正常推进\n }\n }\n return remove;\n}\n```\n\n#### 复杂度\n\n* 排序 `O(n log n)`,单扫 `O(n)`;总 `O(n log n)`。\n* 额外空间 `O(1)`(除了排序)。\n\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3332731592","body":"#### Main Idea\n\n1. **字母映射到孩子指针(26 叉树)**\n\n * 每个结点保存 `children[26]` 与 `isEnd`。\n * `insert(word)`:从根逐字符走,若孩子不存在就新建;末结点标记 `isEnd = true`。\n * `search(word)`:逐字符走,若中途缺结点则 `false`;走完返回末结点 `isEnd`。\n * `startsWith(prefix)`:逐字符走,若中途缺结点则 `false`;都能走到则 `true`(无需 `isEnd`)。\n\n2. **正确性与边界**\n\n * 仅小写字母 → 直接用 `idx = c - 'a'`。\n * `search` 必须要求完整单词结束处 `isEnd == true`,否则只是前缀命中。\n * 空间按需分配:只有路径上用到的结点才创建。\n\n\n---\n\n#### 实现(C++,指针版)\n\n```cpp\n#include \nusing namespace std;\n\nstruct TrieNode {\n bool isEnd = false;\n TrieNode* ch[26];\n TrieNode() : isEnd(false) {\n memset(ch, 0, sizeof(ch));\n }\n};\n\nclass Trie {\npublic:\n Trie() { root = new TrieNode(); }\n\n // 插入单词\n void insert(const string& word) {\n TrieNode* p = root;\n for (char c : word) {\n int idx = c - 'a';\n if (!p->ch[idx]) p->ch[idx] = new TrieNode();\n p = p->ch[idx];\n }\n p->isEnd = true;\n }\n\n // 完整匹配\n bool search(const string& word) {\n TrieNode* p = walk(word);\n return p && p->isEnd;\n }\n\n // 前缀匹配\n bool startsWith(const string& prefix) {\n return walk(prefix) != nullptr;\n }\n\nprivate:\n TrieNode* root;\n\n // 沿字符串行走,走不到返回空\n TrieNode* walk(const string& s) {\n TrieNode* p = root;\n for (char c : s) {\n int idx = c - 'a';\n if (!p->ch[idx]) return nullptr;\n p = p->ch[idx];\n }\n return p;\n }\n};\n```\n#### 复杂度\n\n * 设字符串长度为 `L`:\n\n * `insert / search / startsWith` 都是 **O(L)**。\n * 空间:创建的结点数 ≤ 所有插入字符串长度之和。\n\n","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"leohongyi":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3076771871","body":"【Day 1】989. 数组形式的整数加法\nmain idea 从最低位开始加,如果还有进位,将其添加到结果前面 使用逆序遍历 range(len(num) - 1, -1, -1) 从数组的最后一个元素(最低位)开始\ndivmod(num[i] + k, 10) 计算当前位置的数字与 k 相加后的结果,返回商和余数 如果处理完数组中所有位后仍有进位(k > 0)\n从 k 中提取最低位数字,并插入到数组最前面\n继续处理 k 的下一位,直到 k 变为 0\n余数 num[i] 保存在当前位置\n商 k 作为进位传递给下一个更高位\n整体时间复杂度为 O(max(n, log k))。\ncode\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n for i in range(len(num) - 1, -1, -1):\n k, num[i] = divmod(num[i] + k, 10)\n \n while k > 0:\n k, digit = divmod(k, 10)\n num.insert(0, digit)\n return num\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077014132","body":"main idea:\n创建 ret 数组,长度为len(s)\n再次遍历s的过程中,我们需要判断当满足以下两点条件时,指针 p 右移一位\np小于arr最大下标\n前下标i 到 p + 1的绝对距离比到 p 的绝对距离小\n每次将 p - i 的绝对距离添加至 ret[i] 中\n\n def shortestToChar(self, s: str, c: str) -> List[int]:\n ret, p, arr = [], 0, [i for i in range(len(s)) if s[i] == c]\n for i, j in enumerate(s):\n if p < len(arr) - 1 and abs(arr[p] - i) > abs(arr[p + 1] - i):\n p += 1\n ret.append(abs(arr[p] - i))\n return ret\nTime Complexity: O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082831029","body":"使用数组的栈结构,self.top作为栈顶指针\n进出栈分别通过简单的数组赋值与读取进行操作\nincrement函数通过一个循环进行赋值操作\nclass CustomStack:\n\n def __init__(self, maxSize: int):\n self.stack = [0]*maxSize\n self.top = -1\n\n def push(self, x: int) -> None:\n if self.top < len(self.stack) - 1:\n self.top += 1\n self.stack[self.top] = x\n\n def pop(self) -> int:\n if self.top is -1:\n return self.top\n else:\n self.top -= 1\n return self.stack[self.top+1]\n \n\n def increment(self, k: int, val: int) -> None:\n for i in range(min(k, self.top + 1)):\n self.stack[i] += val\n\n\n\nTime complexity: O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3092615113","body":"算法步骤:\n利用current string, current number 记录所有不同的括号层级内的string和num;\n使用stk来记录之前的数字和前置str;推荐先push num, 后push str 至 stack;\nO(n)\n代码:\nclass Solution:\n def decodeString(self, s: str) -> str:\n cur_str, cur_num = \"\", \"\"\n stk = []\n for c in s:\n if c.isdigit():\n cur_num += c\n elif c == '[':\n stk.append(cur_str)\n stk.append(cur_num)\n cur_str, cur_num = \"\", \"\"\n elif c == ']':\n cur_str *= int(stk.pop())\n cur_str = stk.pop() + cur_str\n else:\n cur_str += c\n return cur_str\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092624509","body":"算法设计\n加入队尾 push() : 将数字 val 加入栈 A 即可。\n获取队首元素 peek() :\n当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。\n否则,当 A 为空: 即两个栈都为空,无元素,因此返回 -1 。\n否则: 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。\n弹出队首元素 pop() :\n执行 peek() ,获取队首元素。\n弹出 B 的栈顶元素。\n队列判空 empty() : 当栈 A 和 B 都为空时,队列为空。\n\nclass MyQueue:\n\n def __init__(self):\n self.A, self.B = [], []\n\n def push(self, x: int) -> None:\n self.A.append(x)\n\n def pop(self) -> int:\n peek = self.peek()\n self.B.pop()\n return peek\n\n def peek(self) -> int:\n if self.B: return self.B[-1]\n if not self.A: return -1\n # 将栈 A 的元素依次移动至栈 B\n while self.A:\n self.B.append(self.A.pop())\n return self.B[-1]\n def empty(self) -> bool:\n return not self.A and not self.B\n\n\n# Your MyQueue object will be instantiated and called as such:\n# obj = MyQueue()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.peek()\n# param_4 = obj.empty()\n时间复杂度: push(), empty() 函数的时间复杂度为 O(1) ;peek() , pop() 函数在 N 次队首元素删除操作中总共需完成 N 个元素的倒序,均摊时间复杂度为 O(1) 。\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3105379844","body":"main: 如果当前元素大于或者等于maxx,入栈, 更新最大值maxx\n如果当前元素小于栈顶元素,循环弹出栈顶元素,直到当前元素大于或等于栈顶元素,注意不用将当前元素入栈!!不过要再将maxx压入栈,因为刚刚pop时肯定把maxx弹出栈了\n\n。class Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n maxx, stk = arr[0], [arr[0]]\n for i in range(1, len(arr)):\n if arr[i] >= maxx:\n maxx = arr[i]\n stk.append(arr[i])\n else:\n while stk and stk[-1] > arr[i]:\n stk.pop()\n stk.append(maxx)\n return len(stk)\n 时间复杂度O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3111913253","body":"找到尾结点 形成环形链表\n尾结点移动length - k 步 有移动k步 == 左移length - k 步\n找到头结点 断开头尾链接\n\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:\n if not head or not head.next:\n return head\n tail = head\n length = 1\n while tail.next:\n length += 1\n tail = tail.next\n tail.next = head\n\n k = k % length\n for _ in range(length - k):\n tail = tail.next\n \n head = tail.next\n tail.next = None\n return head\n ","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3111983736","body":"先交换以node3为头结点的链表 \nnode1指向地柜返回的链表头\n把node2指向node1\n返回node2 作为交换完成的链表头结点\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if head is None or head.next is None:\n return head\n node1 = head\n node2 = head.next\n node3 = node2.next\n\n node1.next = self.swapPairs(node3)\n node2.next = node1\n\n return node2\n ","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dmax1314":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3082278662","body":"1. 第一个想法是数组转换数字然后相加再转换回去\n时间和空间复杂度都应该是O(n)\n```python\nfrom typing import List\n\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n # 1. 数组 -> 字符串 -> 数字\n # 首先将列表中的每个数字转换为字符串,然后拼接成一个完整的字符串\n # [1, 2, 0, 0] -> [\"1\", \"2\", \"0\", \"0\"] -> \"1200\"\n s = \"\".join(map(str, num))\n \n num_val = int(s)\n \n # 2. 数字相加\n result_val = num_val + k\n \n # 3. 数字 -> 字符串 -> 数组\n # 将结果数字转换回字符串\n # 1234 -> \"1234\"\n result_s = str(result_val)\n \n # 将结果字符串中的每个字符转换回整数,并放入列表中\n # \"1234\" -> [\"1\", \"2\", \"3\", \"4\"] -> [1, 2, 3, 4]\n result_array = [int(digit) for digit in result_s]\n \n return result_array\n```\n但是似乎换其他的语言会溢出\n2. 第二个想法就是模拟加法操作,从个位数加起,关键问题在于处理进位\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n result = []\n carry = 0\n i = len(num) - 1 # 指向 num 的最后一位\n \n while i >= 0 or k > 0 or carry > 0:\n digit = carry # 初始化为进位\n \n if i >= 0: # 如果 num 中还有数字\n digit += num[i]\n i -= 1\n \n if k > 0: # 如果 k 中还有数字\n digit += k % 10\n k //= 10 # 整个 k 除以 10\n \n # 处理进位\n result.append(digit % 10)\n carry = digit // 10\n \n result.reverse() # 因为是从个位到十位添加的,最后需要反转\n return result # 返回结果\n```\n这里是要反转的 我一开始忘了这个事情,因为数组把个位的和放在了第一位和实际数字反过来了\n时间复杂度: O(max(N, M)),其中 N 是 num 的长度,M 是 k 的数字长度。我们需要遍历这两个数的每一位。\n空间复杂度: O(max(N, M)),用于存储结果数组。\n\n---\n在看lc题解的时候发现一个很有趣的模板可能以后会用到\n ```\nwhile ( A 没完 || B 没完)\n A 的当前位\n B 的当前位\n\n 和 = A 的当前位 + B 的当前位 + 进位carry\n\n 当前位 = 和 % 10;\n 进位 = 和 / 10;\n\n判断还有进位吗\n```\n>作者:lilyunoke\n>链接:https://leetcode.cn/problems/add-to-array-form-of-integer/solutions/570659/989-ji-zhu-zhe-ge-jia-fa-mo-ban-miao-sha-8y9r/\n>来源:力扣(LeetCode)\n>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n\n稍微改了一下得到一个python加法模板,\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n n = len(num)\n res = []\n i = n - 1\n s = 0\n carry = 0\n while i >= 0 or k != 0:\n x = num[i] if i >= 0 else 0\n y = k % 10 if k != 0 else 0\n\n s = x + y + carry\n carry = s // 10\n k //= 10\n\n i -= 1\n res.insert(0, s % 10)\n\n if carry != 0:\n res.insert(0, carry)\n return res\n```\n据说这个模板还可以用到[2](https://leetcode.com/problems/add-two-numbers/description/),[165](https://leetcode.com/problems/compare-version-numbers/)和[809](https://leetcode.com/problems/expressive-words/)这周末抽空可以做一下","onTime":false},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3086540520","body":"# 第四天\n构造栈结构,利用先入后出的特性来实现括号匹配\n大概做法就是\n1. 使用栈来存放数字、字符以及中间结果。\n2. 遇到数字时,解析出完整的k值(可能是多位数)。\n3. 遇到开括号 `[` 时,将当前构建的字符串入栈,重置字符串。\n4. 遇到闭括号 `]` 时,出栈,形成一个新的字符串并重复生成。\n5. 最终合并所有字符串返回结果。\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n stack = [] # 初始化栈\n current_num = 0 # 当前数字\n current_str = '' # 当前构建的字符串\n\n for char in s:\n if char.isdigit(): # 如果是数字\n current_num = current_num * 10 + int(char) # 处理多位数\n elif char == '[': # 遇到左括号\n stack.append(current_str) # 存储当前字符串\n stack.append(current_num) # 存储当前数字\n current_str = '' # 重置字符串\n current_num = 0 # 重置数字\n elif char == ']': # 遇到右括号\n num = stack.pop() # 弹出数字\n prev_str = stack.pop() # 弹出前一个字符串\n current_str = prev_str + current_str * num # 生成新的字符串\n else:\n current_str += char # 累加字符\n\n return current_str # 返回解码后的字符串\n```\n时间复杂度是 O(n),其中 n 是字符串 s 的长度。每个字符都被处理一次。\n空间复杂度是 O(n),在最坏情况下,栈可能会存储所有字符和数字。\n\n---\n读了题解发现还存在递归法,也就是用[]来决定递归的开头和结束\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n def dfs(s,i):\n res,multi='',0\n while i str:\n def dfs(s, i):\n res, multi = \"\", 0\n while i < len(s):\n if '0' <= s[i] <= '9':\n multi = multi * 10 + int(s[i])\n elif s[i] == '[':\n i, tmp = dfs(s, i + 1)\n res += multi * tmp\n multi = 0\n elif s[i] == ']':\n return i, res\n else:\n res += s[i]\n i += 1\n return res\n return dfs(s,0)\n```\n时间复杂度是 O(n),其中 n 是字符串 s 的长度。每个字符都被处理一次。\n空间复杂度是 O(n),在最坏情况下,递归调用栈可能会存储所有字符和数字。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091499578","body":"用两个模拟栈的队列来实现栈的基本操作。一个用于添加尾部元素,另一个用于弹出头部元素。即一个近栈stack in和一个出栈stack out。\n```python\nclass MyQueue:\n\n def __init__(self):\n \"\"\"\n in主要负责push,out主要负责pop\n \"\"\"\n self.stack_in = []\n self.stack_out = []\n\n\n def push(self, x: int) -> None:\n \"\"\"\n 有新元素进来,就往in里面push\n \"\"\"\n self.stack_in.append(x)\n\n\n def pop(self) -> int:\n \"\"\"\n Removes the element from in front of queue and returns that element.\n \"\"\"\n if self.empty():\n return None\n \n if self.stack_out:\n return self.stack_out.pop()\n else:\n for i in range(len(self.stack_in)):\n self.stack_out.append(self.stack_in.pop())\n return self.stack_out.pop()\n\n\n def peek(self) -> int:\n \"\"\"\n Get the front element.\n \"\"\"\n ans = self.pop()\n self.stack_out.append(ans)\n return ans\n\n\n def empty(self) -> bool:\n \"\"\"\n 只要in或者out有元素,说明队列不为空\n \"\"\"\n return not (self.stack_in or self.stack_out)\n```\n时间复杂度:\n- `push` 操作的时间复杂度是 O(1),因为我们只是将元素添加到 `stack_in` 的末尾。\n- `pop` 和 `peek` 操作的平均时间复杂度是 O(1),但在最坏情况下(当 `stack_out` 为空时),需要将 `stack_in` 中的所有元素转移到 `stack_out`,这需要 O(n) 的时间,其中 n 是 `stack_in` 中的元素数量。然而,这种情况不会频繁发生,因此平均时间复杂度仍然是 O(1)。\n- `empty` 操作的时间复杂度是 O(1),因为我们只是检查两个栈是否为空。\n\n空间复杂度是 O(n),其中 n 是队列中的元素数量,因为我们需要存储所有元素在两个栈中。\n\n但是我有个问题,不知道为什么用lc自己的time complexity分析出来是O(n)的时间和空间复杂度,可能是因为lc的分析是基于最坏情况的分析?","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094285074","body":"题目的核心是找到最多的分块数量,使得将每个块独立排序后,拼接起来的结果与整个数组排序后的结果相同。\n\n第一个想法是利用排序后的性质。一个块可以被成功分割的条件是:块内所有元素的原数组最大值,小于等于它右边所有元素的最小值。如果满足这个条件,那么这个块排序后,所有元素就都会在它们最终应该在的位置的左边。\n\n为了实现这个想法,我们可以预处理两个数组:\n\n- max_of_left[i]:表示原数组 arr[0...i] 中的最大值。\n- min_of_right[i]:表示原数组 arr[i...n-1] 中的最小值。\n\n然后遍历数组,如果在 i 位置,满足 max_of_left[i] <= min_of_right[i+1],就说明我们可以在 i 和 i+1 之间切一刀。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n n = len(arr)\n if n <= 1:\n return 1\n\n # 1. 计算从左到右每个位置的最大值\n max_of_left = [0] * n\n max_of_left[0] = arr[0]\n for i in range(1, n):\n max_of_left[i] = max(max_of_left[i-1], arr[i])\n\n # 2. 计算从右到左每个位置的最小值\n min_of_right = [0] * n\n min_of_right[n-1] = arr[n-1]\n for i in range(n-2, -1, -1):\n min_of_right[i] = min(min_of_right[i+1], arr[i])\n\n # 3. 遍历查找可以分割的点\n # 如果 max_of_left[i] <= min_of_right[i+1],说明 arr[0...i] 的所有元素\n # 都小于等于 arr[i+1...n-1] 的所有元素,可以切分\n chunks = 0\n for i in range(n - 1):\n if max_of_left[i] <= min_of_right[i+1]:\n chunks += 1\n\n # 总块数 = 分割点数量 + 1\n return chunks + 1\n```\n时间复杂度:O(N),其中 N 是数组的长度。我们需要三次独立的 O(N) 遍历。\n空间复杂度:O(N),用于存储 max_of_left 和 min_of_right 两个辅助数组。\n\n---\n在看题解的时候,发现了一个更巧妙的解法,虽然时间复杂度稍高,但是代码非常简洁。它的思路是比较原数组和排序后数组的元素和。\n\n如果 arr[0...i] 的元素和等于 sorted_arr[0...i] 的元素和,这意味着 arr[0...i] 中的元素集合和 sorted_arr[0...i] 中的元素集合是完全相同的(只是顺序不同)。因为 sorted_arr[0...i] 包含了整个数组中最小的 i+1 个元素,所以 arr[0...i] 也必然包含了这 i+1 个最小元素。这就保证了 arr[0...i] 中的任意元素都小于等于 arr[i+1...n-1] 中的任意元素,因此可以在 i 处进行分割。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n sorted_arr = sorted(arr)\n \n sum_arr = 0\n sum_sorted = 0\n chunks = 0\n \n for i in range(len(arr)):\n sum_arr += arr[i]\n sum_sorted += sorted_arr[i]\n \n if sum_arr == sum_sorted:\n chunks += 1\n \n return chunks\n```\n时间复杂度:O(N log N),瓶颈在于对数组的排序。\n\n空间复杂度:O(N),用于存储排序后的数组副本。\n\n还有一个基于单调栈的解法,时间复杂度可以做到 O(N)。\n\n思路是遍历数组,用一个栈来维护每个块的最大值。\n\n1. 如果当前元素 num 大于或等于栈顶元素,说明 num 可以自己形成一个新的块(或者加入前一个块且不影响排序性),直接将 num 入栈。\n2. 如果当前元素 num 小于栈顶元素,说明 num 必须和前面的块合并,直到栈顶元素小于或等于 num。在合并过程中,需要记录被弹出的那些块中的最大值 head,因为这个 head 将成为合并后新块的最大值,然后将 head 入栈。\n\n最终栈的大小就是块的数量。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n stack = []\n for num in arr:\n if not stack or num >= stack[-1]:\n stack.append(num)\n else:\n # 当前元素num比栈顶小,需要合并\n head = stack.pop()\n # 持续弹出所有大于num的元素\n while stack and stack[-1] > num:\n stack.pop()\n # 将原先这些块的最大值head作为新块的代表入栈\n stack.append(head)\n return len(stack)\n```\n\n时间复杂度:O(N),因为每个元素最多入栈和出栈一次。\n\n空间复杂度:O(N),在最坏的情况下(例如数组本身有序),栈的大小会等于数组长度。\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112533354","body":"双指针\n1. 创建两个指针 pA 和 pB,分别指向两个链表的头节点 headA 和 headB。\n2. 同时向前移动这两个指针,pA 每次走一步,pB 每次也走一步。\n3. 核心操作:如果 pA 指针走到了链表 A 的末尾(即 pA 变为 None),则将它重定向到链表 B 的头节点 headB。同样,如果 pB 指针走到了链表 B 的末尾,则将它重定向到链表 A 的头节点 headA。\n4. 两个指针最终会在相交点相遇。如果两个链表不相交,它们会同时在路径的最后变为 None,此时循环结束。\n\n```python\nclass Solution:\n def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:\n if not headA or not headB:\n return None\n\n pA = headA\n pB = headB\n\n # 当 pA 和 pB 相等时循环终止(可能是在交点,也可能同为 None)\n while pA is not pB:\n # 如果pA走到头,就让他从headB开始走;否则,pA正常往下走\n pA = headB if pA is None else pA.next\n # 如果pB走到头,就让他从headA开始走;否则,pB正常往下走\n pB = headA if pB is None else pB.next\n \n # 返回相遇点\n return pA\n```\n时间复杂度:O(m+n)。在最坏的情况下(例如,两个链表不相交),每个指针都需要遍历两个链表的总长度。\n空间复杂度:O(1)。只使用了两个额外的指针,没有使用其他数据结构。","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121201700","body":"为了实现一个支持 O(1) 时间复杂度的查找插入和删除,可以用hash map去记录key和value之间的映射关系。但是hash map是无序的,没有办法记录各项的使用顺序,可以一个双向链表来记录使用顺序。这样就可以在插入和删除的时候,快速地调整链表的顺序。\n\n```python\nclass DLinkedNode:\n def __init__(self, key=0, value=0):\n self.key = key\n self.value = value\n self.prev = None\n self.next = None\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.cache = dict()\n self.capacity = capacity\n # 使用伪头部和伪尾部节点,简化边界条件处理\n self.head = DLinkedNode()\n self.tail = DLinkedNode()\n self.head.next = self.tail\n self.tail.prev = self.head\n\n def _add_to_head(self, node: DLinkedNode):\n # 将节点添加到头部\n node.prev = self.head\n node.next = self.head.next\n self.head.next.prev = node\n self.head.next = node\n\n def _remove_node(self, node: DLinkedNode):\n # 从链表中删除一个节点\n node.prev.next = node.next\n node.next.prev = node.prev\n\n def _move_to_head(self, node: DLinkedNode):\n # 将一个存在的节点移动到头部\n self._remove_node(node)\n self._add_to_head(node)\n\n def get(self, key: int) -> int:\n if key not in self.cache:\n return -1\n \n node = self.cache[key]\n # 访问过后,变为最近使用,移动到头部\n self._move_to_head(node)\n return node.value\n\n def put(self, key: int, value: int) -> None:\n if key in self.cache:\n # 如果 key 存在,更新值并移动到头部\n node = self.cache[key]\n node.value = value\n self._move_to_head(node)\n else:\n # 如果 key 不存在\n if len(self.cache) == self.capacity:\n # 缓存已满,淘汰最久未使用的节点(尾部节点)\n removed_node = self.tail.prev\n self._remove_node(removed_node)\n # 不要忘了从哈希表中也删除\n del self.cache[removed_node.key]\n\n # 创建新节点并添加到头部\n new_node = DLinkedNode(key, value)\n self._add_to_head(new_node)\n self.cache[key] = new_node\n```\n时间复杂度:get 和 put 操作都是 O(1)。所有操作都是哈希表查找和链表头尾操作的组合。\n空间复杂度:O(capacity),因为哈希表和双向链表最多存储 capacity 个元素。","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3132881592","body":"DFS - 递归\n这道题的结构天然适合使用递归来解决。我们可以定义一个函数,该函数接收一个节点和从根到该节点父节点所构成的数字。\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n \n def dfs(node: Optional[TreeNode], current_path_sum: int) -> int:\n if not node:\n return 0\n \n # 计算到达当前节点的路径代表的数字\n new_sum = current_path_sum * 10 + node.val\n \n # 如果是叶子节点,返回当前路径的数字\n if not node.left and not node.right:\n return new_sum\n \n # 如果不是叶子节点,返回左右子树的路径数字之和\n else:\n return dfs(node.left, new_sum) + dfs(node.right, new_sum)\n\n return dfs(root, 0)\n```\n时间复杂度:O(N),其中 N 是树中节点的数量。我们需要访问每个节点一次。\n空间复杂度:O(H),其中 H 是树的高度。这部分空间用于递归调用栈。在最坏的情况下(树退化成链表),空间复杂度为 O(N);在最好的情况下(完全二叉树),空间复杂度为 O(log N)。\n\n---\n\nDFS - 迭代\n> 递归可能导致的栈溢出问题(在树极深的情况下),我们可以将递归转换为迭代\n\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n \n total_sum = 0\n stack = [(root, root.val)] # 栈中存储 (节点, 到达该节点的路径数值)\n\n while stack:\n node, current_number = stack.pop()\n\n # 如果是叶子节点,将路径数值加入总和\n if not node.left and not node.right:\n total_sum += current_number\n\n # 将右子节点压栈\n if node.right:\n stack.append((node.right, current_number * 10 + node.right.val))\n \n # 将左子节点压栈\n if node.left:\n stack.append((node.left, current_number * 10 + node.left.val))\n \n return total_sum\n```\n时间复杂度:O(N),每个节点入栈和出栈一次。\n空间复杂度:O(H),栈在最坏情况下存储 H 个节点,H 是树的高度。与递归版本类似,最好情况 O(log N),最坏情况 O(N)。\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134942374","body":"因为题目中提到了**行**,我们可以用bfs一行一行地处理树的节点\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\nimport collections\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n \n queue = collections.deque([root])\n bottom_left_val = 0\n \n while queue:\n # 当前层的节点数量\n level_size = len(queue)\n \n # 每一层的第一个节点就是该层的最左侧节点\n # 我们只需要记录它,然后继续遍历\n bottom_left_val = queue[0].val\n \n # 遍历当前层的所有节点\n for _ in range(level_size):\n node = queue.popleft()\n \n # 将下一层的节点加入队列\n if node.left:\n queue.append(node.left)\n if node.right:\n queue.append(node.right)\n \n return bottom_left_val\n```\n时间复杂度:O(N),其中 N 是树中节点的总数。因为每个节点都会入队和出队一次。\n空间复杂度:O(W),其中 W 是树的最大宽度。在最坏的情况下(一个完整的二叉树),队列的大小可以达到 N/2。\n\n---\n当然dfs也是可以做的,要记录目前为止发现的最深层级max_depth和最深层级最左边节点的值result_val,先左后右地进行递归\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n self.max_depth = -1 # 记录最大深度,初始化为-1\n self.result_val = 0 # 记录结果值\n \n def dfs(node: Optional[TreeNode], current_depth: int):\n if not node:\n return\n \n # 如果当前深度大于已记录的最大深度\n # 说明我们第一次到达这个新深度,且由于先序遍历的顺序,这一定是该层最左的节点\n if current_depth > self.max_depth:\n self.max_depth = current_depth\n self.result_val = node.val\n \n # 必须先遍历左子树,再遍历右子树\n dfs(node.left, current_depth + 1)\n dfs(node.right, current_depth + 1)\n \n dfs(root, 0)\n return self.result_val\n```\n时间复杂度:O(N),因为我们仍然需要访问树中的每一个节点。\n空间复杂度:O(H),其中 H 是树的高度。这部分空间是递归调用栈所占用的。最坏情况下,树呈链状,空间复杂度为 O(N)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3146236433","body":"```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n def dfs(node):\n if not node:\n res.append(\"null\")\n return\n res.append(str(node.val))\n dfs(node.left)\n dfs(node.right)\n \n dfs(root)\n return \",\".join(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n if not data:\n return None\n \n # 使用列表模拟一个队列,方便 pop(0)\n node_list = data.split(',')\n \n def build_tree():\n val = node_list.pop(0)\n if val == \"null\":\n return None\n \n node = TreeNode(int(val))\n node.left = build_tree()\n node.right = build_tree()\n return node\n \n return build_tree()\n```\n复杂度 空间和时间都是 O(N)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3141867802","body":"坐标记录 + 排序\n为每一个节点确定其坐标 (row, col),并记录下 (row, col, val) 这个三元组。最后BFS即可(DFS应该也行)\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import List, Optional\nimport collections\n\nclass Solution:\n def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:\n if not root:\n return []\n \n # 1. 遍历与记录\n # 使用 BFS 遍历树,记录每个节点的 (col, row, val)\n nodes_info = []\n queue = collections.deque([(root, 0, 0)]) # (node, row, col)\n \n while queue:\n node, row, col = queue.popleft()\n nodes_info.append((col, row, node.val))\n \n if node.left:\n queue.append((node.left, row + 1, col - 1))\n if node.right:\n queue.append((node.right, row + 1, col + 1))\n \n # 2. 排序\n # 对记录下来的节点信息进行排序\n # Python 的元组排序默认按元素顺序比较,完美符合题目要求\n nodes_info.sort()\n \n # 3. 分组\n # 将排序后的结果按列分组\n result_map = collections.OrderedDict()\n for col, row, val in nodes_info:\n if col not in result_map:\n result_map[col] = []\n result_map[col].append(val)\n \n return list(result_map.values())\n```\n时间复杂度:O(N log N)。\nBFS 遍历需要 O(N) 的时间,其中 N 是节点数。nodes_info.sort() 是整个算法的瓶颈,对 N 个元素排序需要 O(N log N) 的时间。最后的分组步骤需要 O(N) 的时间。\n因此,总时间复杂度为 O(N log N)。\n\n空间复杂度:O(N)。\nBFS 的队列在最坏情况下需要存储 O(W) 个节点,W 是树的最大宽度。nodes_info 列表需要存储所有 N 个节点的信息,因此需要 O(N) 的空间。result_map 也需要 O(N) 的空间来存储所有节点的值。\n因此,总空间复杂度为 O(N)。\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146235205","body":"```python\nfrom typing import List, Set\n\nclass Solution:\n def generateParenthesis(self, n: int) -> List[str]:\n # 使用列表来模拟dp数组,每个元素是一个哈希集合\n dp: List[Set[str]] = [set() for _ in range(n + 1)]\n \n # 基础情况:0对括号只有一种组合,即空字符串\n dp[0].add(\"\")\n \n # 从1对括号开始,迭代到n对\n for i in range(1, n + 1):\n # 遍历所有可能的分割点 j\n for j in range(i):\n # A 部分有 j 对括号,B 部分有 i-1-j 对\n list_p = dp[j]\n list_q = dp[i - 1 - j]\n \n # 组合 p 和 q\n for p in list_p:\n for q in list_q:\n # 使用哈希集合 dp[i] 自动去重\n dp[i].add(f\"({p}){q}\")\n \n return list(dp[n])\n```\n复杂度好像有点难算 看看大家有没有什么想法 我再算一算","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3147359265","body":"首先想到的是26字母那道题一样开一个数组然后建一个数组索引转换hash map去做 但是我不清楚是不是升序 所以要用min和max 那这样的效果肯定很差 内存会超 结果没想到居然能过\n```python\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n if not nums:\n return []\n \n # -----------------------------------------------------------------\n # 步骤 1: 使用“数组哈希”(直接寻址法)统计频率\n # -----------------------------------------------------------------\n \n # a. 找到数值范围以确定数组大小\n min_val = min(nums)\n max_val = max(nums)\n \n # b. 定义偏移量,将所有数值映射到数组的非负索引\n offset = -min_val\n \n # c. 创建计数数组\n count_array_size = max_val - min_val + 1\n count_array = [0] * count_array_size\n \n # d. 遍历原数组,完成计数\n for num in nums:\n # 将 num 通过偏移量映射到数组索引\n index = num + offset\n count_array[index] += 1\n\n # -----------------------------------------------------------------\n # 步骤 2: 使用桶排序来找到前 K 个高频元素\n # -----------------------------------------------------------------\n\n # a. 创建桶,桶的索引代表频率\n # 桶的数量是 len(nums) + 1,因为一个元素的频率不可能超过总数\n buckets = [[] for _ in range(len(nums) + 1)]\n\n # b. 遍历计数数组,将元素放入对应频率的桶中\n for i in range(count_array_size):\n freq = count_array[i]\n if freq > 0:\n # 将索引 i 转换回原始数字\n num = i - offset\n buckets[freq].append(num)\n\n # -----------------------------------------------------------------\n # 步骤 3: 从后往前收集结果\n # -----------------------------------------------------------------\n \n result = []\n # 从最高频率的桶开始遍历\n for i in range(len(buckets) - 1, 0, -1):\n # 如果当前频率的桶中有元素\n if buckets[i]:\n # 将这个桶里的所有元素加入结果集\n result.extend(buckets[i])\n \n # 如果结果集大小已经足够,可以提前退出\n if len(result) >= k:\n break\n \n # 返回前 k 个元素,如果最后一个桶加入了多余元素,用切片保证只返回k个\n return result[:k]\n```\n---\n然后我想到遍历数组 建一个hash map(元素,频率) 然后按频率降序排序提出来前k个\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n # 1. 使用 collections.Counter 快速统计频率,O(N)\n freq_map = collections.Counter(nums)\n \n # 2. 对哈希表按值(频率)进行排序\n # sorted 函数的时间复杂度是 O(M log M),其中 M 是不同元素的数量\n # M <= N,所以最坏是 O(N log N)\n sorted_items = sorted(freq_map.items(), key=lambda item: item[1], reverse=True)\n \n # 3. 提取前 k 个元素\n result = [item[0] for item in sorted_items[:k]]\n \n return result\n```\n空间复杂度:O(N)\n时间复杂度:O(NlogN)。其中 N 是数组 nums 的长度。瓶颈在于排序那一步,即使只有 M 个独立元素,在最坏情况下 M 可能等于 N。这个复杂度不满足题目进阶要求。\n\n---\n可以看到关键问题在于排序,想办法避免排序 我就可以用最小堆来做\n维护一个最小的heapq 按频率存入 如果堆的大小超过k了就把频率最低的pop out就行\n```python\nimport collections\nimport heapq\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n # 1. 统计频率,O(N)\n freq_map = collections.Counter(nums)\n \n # 2. 维护一个大小为 k 的最小堆,O(M log k),M是不同元素的数量\n min_heap = []\n for num, freq in freq_map.items():\n # Python的heapq是最小堆,所以我们存入(频率, 数字)\n # 这样堆会根据频率排序\n heapq.heappush(min_heap, (freq, num))\n if len(min_heap) > k:\n heapq.heappop(min_heap) # pop out频率最小的元素\n \n # 3. 提取结果\n # 此时堆中的k个元素就是频率最高的k个\n result = [item[1] for item in min_heap]\n return result\n```\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3156822202","body":"双指针滑动窗口\n```python\nclass Solution:\n def lengthOfLongestSubstring(self, s: str) -> int:\n # 哈希表存储 {字符: 最后出现的位置索引}\n char_map = {}\n max_len = 0\n left = 0 # 窗口的左边界\n \n # right 是窗口的右边界,不断向右移动\n for right in range(len(s)):\n char = s[right]\n \n # 如果当前字符已经存在于哈希表中,并且其位置在当前窗口内\n if char in char_map and char_map[char] >= left:\n # 遇到重复字符,收缩窗口\n # 将左边界移动到重复字符上一次出现位置的下一个位置\n left = char_map[char] + 1\n \n # 更新字符的最新位置\n char_map[char] = right\n \n # 更新最大长度\n current_len = right - left + 1\n max_len = max(max_len, current_len)\n \n return max_len\n```\n时间复杂度:O(N)。left 和 right 两个指针都只会从头到尾遍历字符串一次,每个字符最多被访问两次。\n\n空间复杂度:O(k),其中 k 是字符串中不同字符的数量。在最坏的情况下(所有字符都不同),空间复杂度为 O(N)。如果字符集有限(例如 ASCII 码共 128 个),则空间复杂度为常数 O(128)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3156831483","body":"这道题和上一题的区别一个是子字符串(3)一个是子序列(30)\n解法还是双指针滑动窗口 只不过需要改造一下,现在要独立扫描word_len 次\n即\n>第一次扫描:从索引 0 开始,窗口每次移动 word_len,检查的子串是 s[0...], s[word_len...], s[2*word_len...] ...\n第二次扫描:从索引 1 开始,窗口每次移动 word_len,检查的子串是 s[1...], s[1+word_len...], s[1+2*word_len...] ...\n\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def findSubstring(self, s: str, words: List[str]) -> List[int]:\n if not s or not words:\n return []\n\n word_len = len(words[0])\n num_words = len(words)\n total_len = word_len * num_words\n words_freq = collections.Counter(words)\n result = []\n\n # 我们需要进行 word_len 次扫描\n for i in range(word_len):\n left = i # 当前扫描的窗口左边界\n seen = collections.Counter() # 当前窗口内单词的频率\n count = 0 # 当前窗口内有效单词的数量\n\n # 窗口右边界以 word_len 为步长滑动\n for j in range(i, len(s) - word_len + 1, word_len):\n word = s[j : j + word_len]\n \n if word in words_freq:\n seen[word] += 1\n count += 1\n \n # 如果一个单词的数量超了,就从左边收缩窗口\n while seen[word] > words_freq[word]:\n left_word = s[left : left + word_len]\n seen[left_word] -= 1\n count -= 1\n left += word_len\n \n # 如果窗口内单词数量正好,说明找到了一个解\n if count == num_words:\n result.append(left)\n # 为了继续搜索,将窗口最左边的单词移出\n left_word = s[left : left + word_len]\n seen[left_word] -= 1\n count -= 1\n left += word_len\n\n else:\n # 如果遇到的单词不在 words 列表中,则当前窗口作废\n # 直接将左边界移动到这个坏单词的后面\n seen.clear()\n count = 0\n left = j + word_len\n \n return result\n```\n时间复杂度O(N),N是字符串s的长度\n空间复杂度O(ML),M是words列表里的单词数量 L是每个单词长度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3161453831","body":"```python\nfrom typing import List\n\nclass Solution:\n def minSubarray(self, nums: List[int], p: int) -> int:\n n = len(nums)\n # 1. 同余定理:计算目标余数\n target_rem = sum(nums) % p\n \n # 如果总和已经能被 p 整除,无需移除\n if target_rem == 0:\n return 0\n \n # 2. 哈希表:存储 {余数: 最后一次出现的索引}\n # 初始化 {0: -1} 来处理从开头开始的子数组\n rem_map = {0: -1}\n min_len = n # 初始化为一个最大值\n \n # 3. 前缀和:用一个变量 current_sum 动态计算\n current_sum = 0\n \n for i, num in enumerate(nums):\n current_sum += num\n current_rem = current_sum % p\n \n # 计算需要寻找的配对余数\n needed_rem = (current_rem - target_rem + p) % p\n \n # 如果找到了配对\n if needed_rem in rem_map:\n prev_index = rem_map[needed_rem]\n # 更新最短长度\n min_len = min(min_len, i - prev_index)\n \n # 更新当前余数的最新索引\n rem_map[current_rem] = i\n \n # 如果 min_len 没有被更新过,或者更新后的值等于n(意味着要移除整个数组)\n # 则说明找不到合适的“真”子数组\n return min_len if min_len < n else -1\n```\n时间复杂度:O(N),因为我们只遍历了数组一次。\n空间复杂度:O(min(N,p)),因为哈希表中最多存储 p 个不同的余数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3169922808","body":"双指针\n```python\nfrom typing import Optional\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\n\nclass Solution:\n def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n # 初始化快慢指针\n slow = head\n fast = head\n \n # 当快指针没有走到链表末尾时\n while fast and fast.next:\n # 慢指针走一步\n slow = slow.next\n # 快指针走两步\n fast = fast.next.next\n \n # 当循环结束时,慢指针正好在中间位置\n return slow\n```\n时间复杂度:O(N)。虽然有两个指针,但我们只对链表进行了一次单向遍历。\n空间复杂度:O(1)。只使用了两个额外的指针变量,没有使用额外的存储空间。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169886502","body":"双指针/快慢指针\n快的去遍历 慢的维护只出现一次的元素\n```python\nfrom typing import List\n\nclass Solution:\n def removeDuplicates(self, nums: List[int]) -> int:\n # 如果数组为空,直接返回 0\n if not nums:\n return 0\n \n # slow 指针指向下一个将要被赋值的、新的不重复元素的位置。\n # nums[0] 默认是第一个不重复的元素,所以 slow 从 1 开始。\n slow = 1\n \n # fast 指针从第二个元素开始,遍历整个数组\n for fast in range(1, len(nums)):\n if nums[fast] != nums[fast - 1]:\n nums[slow] = nums[fast]\n slow += 1\n \n return slow","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173197055","body":"我们可以用单调队列(双端队列 (deque))来维护窗口内的“候选最大值”,使得获取当前最大值的操作是 O(1) 的\n>双端队列 (deque)\n队列中存储的是数组元素的索引,而不是元素本身。\n队列中的索引所对应的 nums 数组中的值,是从头到尾单调递减的。\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n n = len(nums)\n if n * k == 0:\n return []\n \n # 单调队列,存储的是元素的索引\n # 队列中的索引对应的 nums 值是单调递减的\n deque = collections.deque()\n result = []\n\n for i in range(n):\n # 1. 维护单调性:移除队尾所有小于当前值的元素\n while deque and nums[deque[-1]] <= nums[i]:\n deque.pop()\n \n # 2. 当前元素索引入队\n deque.append(i)\n \n # 3. 维护窗口大小:移除已经滑出窗口的队头元素\n if deque[0] <= i - k:\n deque.popleft()\n \n # 4. 记录结果:当窗口完全形成后开始记录\n if i >= k - 1:\n # 队头元素永远是当前窗口的最大值\n result.append(nums[deque[0]])\n \n return result\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3187054447","body":"```python\nfrom typing import List\n\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n # 使用一个数组记录每个人的信任差额\n trust_scores = [0] * (n + 1)\n \n for a, b in trust:\n trust_scores[a] -= 1 # 信任别人,分数-1\n trust_scores[b] += 1 # 被人信任,分数+1\n \n # 寻找分数为 n-1 的法官\n for i in range(1, n + 1):\n if trust_scores[i] == n - 1:\n return i\n \n return -1\n```\n时间复杂度: O(n + m), m为trust列表长度\n空间复杂度: O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3187045338","body":"这道题的本质是判断一个图是否为二分图 (Bipartite Graph)。\n n 个人看作是图的 n 个节点 (Vertex),每一对 dislike关系 [a, b] 看作是连接节点 a 和 b 的一条无向边 (Edge)。\n判断由人和他们之间的“不喜欢”关系构成的图,是否是一个二分图。\nDFS着色\n```python\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:\n # 1. 构建图的邻接表\n graph = [[] for _ in range(n + 1)]\n for u, v in dislikes:\n graph[u].append(v)\n graph[v].append(u)\n \n # 2. 创建 colors 数组,0:未着色, 1:颜色A, -1:颜色B\n colors = [0] * (n + 1)\n \n # 3. 遍历所有节点\n for i in range(1, n + 1):\n # 如果节点未被着色,从它开始进行DFS\n if colors[i] == 0:\n if not self.dfs(i, 1, colors, graph):\n return False\n \n return True\n\n def dfs(self, node: int, color: int, colors: List[int], graph: List[List[int]]) -> bool:\n # 给当前节点染色\n colors[node] = color\n \n # 遍历所有邻居\n for neighbor in graph[node]:\n # 如果邻居颜色与当前节点相同,产生冲突\n if colors[neighbor] == color:\n return False\n # 如果邻居未被染色,对其进行DFS\n if colors[neighbor] == 0:\n # 给邻居染上相反的颜色\n if not self.dfs(neighbor, -color, colors, graph):\n return False\n \n return True\n```\nBFS着色\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:\n # 1. 构建图的邻接表\n graph = [[] for _ in range(n + 1)]\n for u, v in dislikes:\n graph[u].append(v)\n graph[v].append(u)\n \n # 2. 创建 colors 数组\n colors = [0] * (n + 1)\n \n # 3. 遍历所有节点\n for i in range(1, n + 1):\n if colors[i] == 0: # 未被染色,开始BFS\n queue = collections.deque([i])\n colors[i] = 1 # 染上颜色A\n \n while queue:\n node = queue.popleft()\n # 遍历邻居\n for neighbor in graph[node]:\n # 如果邻居颜色与当前节点相同,冲突\n if colors[neighbor] == colors[node]:\n return False\n # 如果邻居未染色,染上相反颜色并入队\n if colors[neighbor] == 0:\n colors[neighbor] = -colors[node]\n queue.append(neighbor)\n \n return True\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3187051602","body":"双层拓扑排序 关键在于排序的规则\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:\n \n # 1. 数据预处理:为没有团队的项目分配新团队ID\n new_group_id = m\n for i in range(n):\n if group[i] == -1:\n group[i] = new_group_id\n new_group_id += 1\n \n num_groups = new_group_id\n\n # 2. 构建项目图和团队图及其入度数组\n item_graph = [[] for _ in range(n)]\n item_indegree = [0] * n\n group_graph = [[] for _ in range(num_groups)]\n group_indegree = [0] * num_groups\n\n for i in range(n):\n for prev_item in beforeItems[i]:\n # 项目图依赖\n item_graph[prev_item].append(i)\n item_indegree[i] += 1\n \n # 如果属于不同团队,则产生团队图依赖\n if group[prev_item] != group[i]:\n group_graph[group[prev_item]].append(group[i])\n group_indegree[group[i]] += 1\n\n # 3. 通用的拓扑排序函数\n def topological_sort(graph, indegree):\n num_nodes = len(graph)\n queue = collections.deque([i for i in range(num_nodes) if indegree[i] == 0])\n sorted_order = []\n while queue:\n u = queue.popleft()\n sorted_order.append(u)\n for v in graph[u]:\n indegree[v] -= 1\n if indegree[v] == 0:\n queue.append(v)\n \n return sorted_order if len(sorted_order) == num_nodes else []\n\n # 4. 执行两次拓扑排序\n item_order = topological_sort(item_graph, item_indegree)\n group_order = topological_sort(group_graph, group_indegree)\n\n if not item_order or not group_order:\n return []\n\n # 5. 合并结果\n # a. 将排好序的项目按团队分组\n items_by_group = collections.defaultdict(list)\n for item in item_order:\n items_by_group[group[item]].append(item)\n \n # b. 根据团队顺序,拼接项目\n final_result = []\n for group_id in group_order:\n final_result.extend(items_by_group[group_id])\n \n return final_result\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3193081347","body":"模拟\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n # 初始化坐标\n x, y = 0, 0\n \n # 遍历每一步\n for move in moves:\n if move == 'U':\n y += 1\n elif move == 'D':\n y -= 1\n elif move == 'L':\n x -= 1\n elif move == 'R':\n x += 1\n \n # 检查最终位置是否为原点\n return x == 0 and y == 0\n```\n或者直接看字符串里面是否满足U==D, L==R\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n # Python 的 count() 方法让这个思路的实现非常简洁\n # 检查向上和向下的步数是否相等\n vertical_balance = (moves.count('U') == moves.count('D'))\n \n # 检查向左和向右的步数是否相等\n horizontal_balance = (moves.count('L') == moves.count('R'))\n \n return vertical_balance and horizontal_balance\n```\n两个复杂度是一样的\n时间复杂度:O(N)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193084373","body":"排序 + 最小堆\nmin_heap存放已到达但未执行的任务(processingTime, original_index) 按照时间、索引排序\n```python\nimport heapq\nfrom typing import List\n\nclass Solution:\n def getOrder(self, tasks: List[List[int]]) -> List[int]:\n # 1. 数据预处理:附加原始索引并按入队时间排序\n # tasks_with_indices 的格式: [[enqueueTime, processingTime, original_index], ...]\n tasks_with_indices = sorted(\n [(tasks[i][0], tasks[i][1], i) for i in range(len(tasks))]\n )\n \n result_order = []\n min_heap = [] # 优先队列,存储 (processingTime, original_index)\n \n task_pointer = 0 # 指向下一个要检查的任务\n current_time = 0 # 当前时间\n \n # 当还有任务未处理或未入队时,循环继续\n while task_pointer < len(tasks) or min_heap:\n \n # 如果CPU空闲且没有任务在等待,快进到下一个任务的到达时间\n if not min_heap and current_time < tasks_with_indices[task_pointer][0]:\n current_time = tasks_with_indices[task_pointer][0]\n\n # 2. 将所有已到达的任务加入最小堆\n while task_pointer < len(tasks) and tasks_with_indices[task_pointer][0] <= current_time:\n enqueue_time, process_time, original_index = tasks_with_indices[task_pointer]\n heapq.heappush(min_heap, (process_time, original_index))\n task_pointer += 1\n \n # 3. 从堆中取出最优任务执行\n if min_heap:\n process_time, original_index = heapq.heappop(min_heap)\n current_time += process_time\n result_order.append(original_index)\n \n return result_order\n```\n复杂度:假设N个任务,那么时间复杂度是O(NlogN)有排序造成的,空间是O(N) tasks列表和min_heap都需要O(N)的空间","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3204406944","body":"a->c,需要len(a) - a中c的个数\nb->c需要len(b) - b中c的个数\n我们需要考虑len(a) + len(b) - (a中c的个数 + b中c的个数)\n此外还可以优化一下\n如果a= c 的字符。\nb 中需要改变的,是那些 < c 的字符。\na>=b同理\n```python\nimport collections\n\nclass Solution:\n def minCharacters(self, a: str, b: str) -> int:\n n, m = len(a), len(b)\n freq_a = collections.Counter(a)\n freq_b = collections.Counter(b)\n\n # --- 计算条件 3 的最小代价 ---\n # 代价 = 总长度 - 两个字符串中某个字符的最大总频次\n max_combined_freq = 0\n for i in range(26):\n char = chr(ord('a') + i)\n max_combined_freq = max(max_combined_freq, freq_a[char] + freq_b[char])\n \n cost3 = n + m - max_combined_freq\n\n # --- 计算条件 1 (a < b) 和 条件 2 (b < a) 的最小代价 ---\n cost1 = float('inf') # a < b\n cost2 = float('inf') # b < a\n \n # 使用前缀/后缀和的思想来优化计数\n a_lt_count = 0 # a 中 < 当前分界线的字符数\n b_lt_count = 0\n \n # 遍历所有 25 个可能的分界线 ('b' 到 'z')\n for i in range(25):\n char = chr(ord('a') + i)\n a_lt_count += freq_a[char]\n b_lt_count += freq_b[char]\n \n # 分界线是 char_next = chr(ord('a') + i + 1)\n # 条件 1 (a < char_next, b >= char_next):\n # - a 中要改的是 >= char_next 的, 即 (n - a_lt_count)\n # - b 中要改的是 < char_next 的, 即 b_lt_count\n current_cost1 = (n - a_lt_count) + b_lt_count\n cost1 = min(cost1, current_cost1)\n \n # 条件 2 (b < char_next, a >= char_next):\n # - b 中要改的是 >= char_next 的, 即 (m - b_lt_count)\n # - a 中要改的是 < char_next 的, 即 a_lt_count\n current_cost2 = (m - b_lt_count) + a_lt_count\n cost2 = min(cost2, current_cost2)\n\n return min(cost1, cost2, cost3)\n```\n时间复杂度:O(N+M),其中 N 和 M 分别是两个字符串的长度。\n空间复杂度:O(1),大小为 26 的频率表\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3208576782","body":"堆排序\n```python\nclass Solution:\n def sortArray(self, nums: List[int]) -> List[int]:\n def heapify(nums, n, i):\n largest = i\n left = 2 * i + 1\n right = 2 * i + 2\n\n if left < n and nums[left] > nums[largest]:\n largest = left\n if right < n and nums[right] > nums[largest]:\n largest = right\n if largest != i:\n nums[i], nums[largest] = nums[largest], nums[i]\n heapify(nums, n, largest)\n\n n = len(nums)\n for i in range(n // 2 - 1, -1, -1):\n heapify(nums, n, i)\n\n for i in range(n - 1, 0, -1):\n nums[i], nums[0] = nums[0], nums[i]\n heapify(nums, i, 0)\n```\n时间复杂度:O(NlogN)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3208555582","body":"二分\n```python\nclass Solution:\n def mySqrt(self, x: int) -> int:\n\n if x == 0:\n return 0\n \n # 定义二分查找的左右边界\n left, right = 0, x\n ans = 0\n \n while left <= right:\n # 计算中间值\n mid = left + (right - left) // 2\n \n # 避免 mid 为 0 的情况,或者直接判断 mid * mid\n if mid == 0:\n left = mid + 1\n continue\n \n # 比较 mid 的平方与 x\n # 为了防止 mid * mid 溢出(在某些语言中),可以写成 mid <= x / mid\n if mid * mid > x:\n # mid 太大,搜索左半部分\n right = mid - 1\n else:\n # mid 是一个可能的答案,尝试寻找更大的\n ans = mid\n left = mid + 1\n \n return ans\n```\n时间复杂度:O(logN)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208553626","body":"二分查找\n```python\nclass Solution:\n def firstBadVersion(self, n: int) -> int:\n left, right = 1, n\n \n while left < right:\n mid = left + (right - left) // 2\n \n if isBadVersion(mid):\n # 如果 mid 是坏的,那第一个坏版本在 [left, mid] 区间内\n # 我们不能排除 mid,所以 right = mid\n right = mid\n else:\n # 如果 mid 是好的,那第一个坏版本在 [mid + 1, right] 区间内\n left = mid + 1\n \n return left\n```\n时间复杂度:O(logN)\n空间复杂度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3222475353","body":"排除法\n排除掉卡片的正面和背面是同一个数字 X的卡片\n```python\nfrom typing import List\n\nclass Solution:\n def flipgame(self, fronts: List[int], backs: List[int]) -> int:\n # 1. 找出所有“不可能的”数字\n impossible_nums = set()\n for i in range(len(fronts)):\n if fronts[i] == backs[i]:\n impossible_nums.add(fronts[i])\n \n # 2. 寻找最小的“好”数字\n min_good_num = float('inf')\n found_good_num = False\n \n # 遍历所有出现过的数字\n all_nums = fronts + backs\n \n for num in all_nums:\n # 如果这个数字不是“不可能的”\n if num not in impossible_nums:\n found_good_num = True\n min_good_num = min(min_good_num, num)\n \n # 3. 返回结果\n return min_good_num if found_good_num else 0\n```\n时间复杂度:O(N),其中 N 是卡片的数量。\n空间复杂度:O(N)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3222461055","body":"二分 + DFS/BFS\n```python\nfrom typing import List\n\nclass Solution:\n def swimInWater(self, grid: List[List[int]]) -> int:\n n = len(grid)\n left, right = grid[0][0], n * n - 1\n ans = right\n\n def is_possible(t):\n # 检查在时间 t 是否能从 (0,0) 到达 (n-1, n-1)\n if grid[0][0] > t:\n return False\n \n stack = [(0, 0)]\n visited = {(0, 0)}\n \n while stack:\n r, c = stack.pop()\n if r == n - 1 and c == n - 1:\n return True\n \n for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:\n nr, nc = r + dr, c + dc\n if 0 <= nr < n and 0 <= nc < n and (nr, nc) not in visited and grid[nr][nc] <= t:\n visited.add((nr, nc))\n stack.append((nr, nc))\n return False\n\n while left <= right:\n mid = left + (right - left) // 2\n if is_possible(mid):\n ans = mid\n right = mid - 1\n else:\n left = mid + 1\n \n return ans\n```\n时间复杂度:O($n^2logn$)\n空间复杂度:O($n^2$)\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222456504","body":"Sliding Window\n维护一个固定大小为 k 的窗口,在字符串上滑动。当窗口向右移动一格时,只需要考虑移出窗口的字符和移入窗口的字符对元音数量的影响即可。\n```python\nfrom typing import List\n\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n vowels = {'a', 'e', 'i', 'o', 'u'}\n \n # 1. 初始化:计算第一个窗口的元音数\n current_vowels = 0\n for i in range(k):\n if s[i] in vowels:\n current_vowels += 1\n \n max_vowels = current_vowels\n \n # 2. 滑动窗口\n # 从第 k 个字符开始,模拟窗口向右滑动\n for i in range(k, len(s)):\n # a. 处理新移入的字符 s[i]\n if s[i] in vowels:\n current_vowels += 1\n \n # b. 处理被移出的字符 s[i-k]\n if s[i-k] in vowels:\n current_vowels -= 1\n \n # c. 更新最大值\n max_vowels = max(max_vowels, current_vowels)\n \n return max_vowels\n```\n时间复杂度:O(N)\n空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3232274052","body":"动态规划 + 滑动窗口\n定义 dp[i] 为:爱丽丝最终得分恰好为 i 的概率,最后要计算$\\sum_i=k^n dp[i]$,dp[0] = 1\n```python\nclass Solution:\n def new21Game(self, n: int, k: int, maxPts: int) -> float:\n # 如果 k=0,开始就是 >=k,游戏直接结束,得分为0,概率为1\n if k == 0:\n return 1.0\n \n # dp[i] 表示得到分数 i 的概率\n dp = [0.0] * (n + 1)\n dp[0] = 1.0\n \n # window_sum 维护一个大小为 maxPts 的滑动窗口内 dp 值的和\n window_sum = 1.0\n result = 0.0\n \n for i in range(1, n + 1):\n # 计算 dp[i]\n dp[i] = window_sum / maxPts\n \n # 如果 i < k,dp[i] 会对后续的 dp 值产生贡献,加入窗口\n if i < k:\n window_sum += dp[i]\n \n # 如果 i >= k,这是一个最终得分,累加到结果中\n # 注意:题目求的是 <= n 的概率,而 dp 数组只到 n,所以循环内累加即可\n if i >= k:\n result += dp[i]\n \n # 如果 i >= maxPts,需要将滑出窗口的 dp 值减去\n if i >= maxPts:\n window_sum -= dp[i - maxPts]\n \n return result\n```\n时间复杂度:O(n)。我们只对 dp 数组进行了一次遍历。\n空间复杂度:O(n)。用于存储 dp 数组。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3232278119","body":"滑动窗口 + 字符频率统计\n```python\nfrom typing import List\n\nclass Solution:\n def findAnagrams(self, s: str, p: str) -> List[int]:\n s_len, p_len = len(s), len(p)\n \n # 边缘情况:如果 s 比 p 短,不可能找到异位词\n if s_len < p_len:\n return []\n \n result = []\n # 使用大小为 26 的数组作为频率统计表\n p_counts = [0] * 26\n s_window_counts = [0] * 26\n \n # 1. & 2. 初始化 p 的频率表和 s 的第一个窗口的频率表\n for i in range(p_len):\n p_counts[ord(p[i]) - ord('a')] += 1\n s_window_counts[ord(s[i]) - ord('a')] += 1\n \n # 3. 第一次比较\n if p_counts == s_window_counts:\n result.append(0)\n \n # 4. 滑动窗口\n for i in range(p_len, s_len):\n # a. 移入新字符\n s_window_counts[ord(s[i]) - ord('a')] += 1\n # b. 移出旧字符\n s_window_counts[ord(s[i - p_len]) - ord('a')] -= 1\n \n # c. 再次比较\n if p_counts == s_window_counts:\n # 当前窗口的起始索引是 i - p_len + 1\n result.append(i - p_len + 1)\n \n return result\n```\n时间复杂度:O(textlen(s)+textlen(p))\n空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235951126","body":"用一个 right 指针不断地扩展窗口,直到窗口内的子串满足了“包含 t 中所有字符”的条件。一旦窗口满足条件,就记录下这个“可行解”,然后开始移动 left 指针,收缩窗口\n```python\nimport collections\n\nclass Solution:\n def minWindow(self, s: str, t: str) -> str:\n # need 存储 t 中字符的需求数量\n need = collections.Counter(t)\n # window 存储当前窗口中字符的数量\n window = collections.Counter()\n\n left, right = 0, 0\n valid = 0 # 记录 window 中有多少字符已经满足了 need 的要求\n \n # 记录最小覆盖子串的起始索引和长度\n start = 0\n min_len = float('inf')\n\n while right < len(s):\n # c 是将移入窗口的字符\n c = s[right]\n right += 1\n \n # 扩展窗口\n if c in need:\n window[c] += 1\n if window[c] == need[c]:\n valid += 1\n \n # 判断左侧窗口是否要收缩\n while valid == len(need):\n # 在这里更新最小覆盖子串\n if right - left < min_len:\n start = left\n min_len = right - left\n\n # d 是将移出窗口的字符\n d = s[left]\n left += 1\n \n # 收缩窗口\n if d in need:\n if window[d] == need[d]:\n valid -= 1\n window[d] -= 1\n\n # 返回最小覆盖子串,如果 min_len 还是初始值,说明没有找到\n return \"\" if min_len == float('inf') else s[start : start + min_len]\n```\n时间复杂度: O(len(s)+len(t))\n空间复杂度: O(N), N是字符集的大小","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3244023262","body":"dfs\n```python\nfrom typing import List\n\nclass Solution:\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n if not grid:\n return 0\n \n rows, cols = len(grid), len(grid[0])\n max_area = 0\n \n def dfs(r, c):\n # 边界条件检查 & 终止条件 (遇到水或已访问过的陆地)\n if not (0 <= r < rows and 0 <= c < cols and grid[r][c] == 1):\n return 0\n \n # 将当前单元格标记为已访问 (沉岛)\n grid[r][c] = 0\n \n # 当前单元格面积为 1,并递归探索四个方向\n return (1 + dfs(r + 1, c) +\n dfs(r - 1, c) +\n dfs(r, c + 1) +\n dfs(r, c - 1))\n\n # 遍历整个网格\n for r in range(rows):\n for c in range(cols):\n if grid[r][c] == 1:\n current_area = dfs(r, c)\n max_area = max(max_area, current_area)\n \n return max_area\n```\n时间复杂度O(MN)\n空间复杂度最坏O(MN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3251910064","body":"Multi-Source BFS\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxDistance(self, grid: List[List[int]]) -> int:\n n = len(grid)\n queue = collections.deque()\n \n # 1. 初始化:将所有陆地加入队列\n for r in range(n):\n for c in range(n):\n if grid[r][c] == 1:\n queue.append((r, c))\n \n # 边缘情况:如果全是陆地或全是海洋\n if len(queue) == 0 or len(queue) == n * n:\n return -1\n \n distance = -1\n # 2. 多源 BFS\n while queue:\n distance += 1\n # 遍历当前层的所有节点\n for _ in range(len(queue)):\n r, c = queue.popleft()\n \n # 探索四个方向的邻居\n for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:\n nr, nc = r + dr, c + dc\n \n if 0 <= nr < n and 0 <= nc < n and grid[nr][nc] == 0:\n grid[nr][nc] = 1 # 标记为已访问\n queue.append((nr, nc))\n \n return distance\n```\n时间复杂度:O(N^2)\n空间复杂度:O(N^2)\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251914219","body":"模拟+bfs\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n \n total_candies = 0\n \n # 我们拥有的、但未打开的盒子\n my_closed_boxes = set()\n # 可以打开并处理的盒子队列\n queue = collections.deque()\n\n # 初始化\n for box_idx in initialBoxes:\n if status[box_idx] == 1:\n queue.append(box_idx)\n else:\n my_closed_boxes.add(box_idx)\n\n while queue:\n box_idx = queue.popleft()\n \n # 1. 拿糖果\n total_candies += candies[box_idx]\n \n # 2. 拿钥匙,并用新钥匙尝试打开已有的盒子\n for key in keys[box_idx]:\n status[key] = 1 \n if key in my_closed_boxes:\n queue.append(key)\n my_closed_boxes.remove(key)\n \n # 3. 拿新盒子\n for contained_box in containedBoxes[box_idx]:\n if status[contained_box] == 1:\n queue.append(contained_box)\n else:\n my_closed_boxes.add(contained_box)\n \n return total_candies\n```\n时间复杂度: O(盒子数+钥匙数+内涵盒子数)\n\n空间复杂度: O(盒子数)。最坏情况下要存储所有盒子的信息。\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260205356","body":"dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n```python\nclass Solution:\n def minCostClimbingStairs(self, cost: List[int]) -> int:\n n = len(cost)\n dp = [0] * (n + 1)\n \n # dp[0] 和 dp[1] 默认为 0,因为可以从这两级开始\n \n # 从第 2 级台阶开始,应用转移方程\n for i in range(2, n + 1):\n dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n \n return dp[n]\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3276673110","body":"dp[i] = max(nums[i-1] + dp[i-2], dp[i-1])\n\n```python\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n n = len(nums)\n if n == 0: return 0\n if n == 1: return nums[0]\n \n dp = [0] * (n + 1)\n dp[0] = 0\n dp[1] = nums[0]\n \n for i in range(2, n + 1):\n dp[i] = max(nums[i-1] + dp[i-2], dp[i-1])\n \n return dp[n]\n```\n可以优化到只依赖前两个状态来节省内存空间\n```python\nfrom typing import List\n\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n # rob_prev 代表 dp[i-2],rob_curr 代表 dp[i-1]\n rob_prev, rob_curr = 0, 0\n \n for num in nums:\n # 计算 dp[i] = max(num + dp[i-2], dp[i-1])\n temp = max(num + rob_prev, rob_curr)\n # 更新状态,为下一次循环做准备\n rob_prev = rob_curr\n rob_curr = temp\n \n return rob_curr\n```\n时间复杂度: O(N)\n空间复杂度: O(1)\n\n\n\n\n\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3276687323","body":"dp[i] = 1 + max(dp[j]),其中 0 <= j < i 且 nums[j] < nums[i]。\n```python\nfrom typing import List\n\nclass Solution:\n def findNumberOfLIS(self, nums: List[int]) -> int:\n n = len(nums)\n if n <= 1:\n return n\n \n # lengths[i]: 以 nums[i] 结尾的 LIS 长度\n # counts[i]: 以 nums[i] 结尾的 LIS 个数\n lengths = [1] * n\n counts = [1] * n\n\n # 填充 DP 数组\n for i in range(n):\n for j in range(i):\n if nums[j] < nums[i]:\n # 情况一:发现更长的子序列\n if lengths[j] + 1 > lengths[i]:\n lengths[i] = lengths[j] + 1\n counts[i] = counts[j] # 路径数继承\n # 情况二:发现另一条同样长的子序列\n elif lengths[j] + 1 == lengths[i]:\n counts[i] += counts[j] # 路径数累加\n\n max_len = max(lengths)\n result = 0\n for i in range(n):\n if lengths[i] == max_len:\n result += counts[i]\n \n return result\n```\n时间复杂度: O(N^2)\n\n空间复杂度: O(N)\n\n","onTime":false},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3276694316","body":"dp[r][c] =骑士当前位于棋盘上 (r, c) 位置的概率\n从 (r, c) 出发,能为下一个状态 dp_curr 中的 (nr, nc) 贡献 dp_prev[r][c] / 8 的概率\ndp_curr[nr][nc]=\\sum dp(nr, nc)\n```python\nfrom typing import List\n\nclass Solution:\n def knightProbability(self, n: int, k: int, row: int, column: int) -> float:\n # dp[r][c] 表示骑士在 (r, c) 位置的概率\n dp = [[0.0] * n for _ in range(n)]\n dp[row][column] = 1.0\n \n # 骑士的8个移动方向\n moves = [(-2, -1), (-2, 1), (-1, -2), (-1, 2),\n (1, -2), (1, 2), (2, -1), (2, 1)]\n \n # 迭代 k 步\n for _ in range(k):\n # dp_next 用于存储下一步的概率分布\n dp_next = [[0.0] * n for _ in range(n)]\n \n # 遍历棋盘上所有位置\n for r in range(n):\n for c in range(n):\n # 如果当前位置有概率 > 0\n if dp[r][c] > 0:\n # 尝试8种移动\n for dr, dc in moves:\n nr, nc = r + dr, c + dc\n \n # 如果移动后的位置在棋盘内\n if 0 <= nr < n and 0 <= nc < n:\n # 将概率贡献给下一个状态\n dp_next[nr][nc] += dp[r][c] / 8.0\n \n # 用新状态覆盖旧状态\n dp = dp_next\n \n # 计算最终仍在棋盘上的总概率\n total_probability = sum(sum(row) for row in dp)\n return total_probability\n```\n时间复杂度 O(kn^2)\n空间复杂度: O(n^2)","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gjwang224":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3086564307","body":"## Code\n```cpp\nclass Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n int len = num.size()-1;\n vector returnNum;\n int tmp=0;\n \n while(k && len>=0){\n returnNum.push_back((num[len] + k%10 + tmp)%10);\n tmp = (num[len] + k%10 + tmp)/10;\n len--;\n k = k/10;\n }\n\n while(k){\n returnNum.push_back((k%10 + tmp)%10);\n tmp = (k%10 + tmp)/10;\n k = k/10;\n }\n \n while(len>=0){\n returnNum.push_back((num[len] + tmp)%10);\n tmp = (num[len] + tmp)/10;\n len--;\n }\n \n if(tmp) returnNum.push_back(tmp);\n reverse(returnNum.begin(), returnNum.end());\n return returnNum;\n }\n};","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3093190969","body":"#### C++\n``` C++\nclass Solution {\npublic:\n vector shortestToChar(string s, char c) {\n vector dis, rearr;\n for(int i = 0; i < s.size(); i++) if(s.at(i) == c) dis.push_back(i);\n for(int i = 0; i < s.size(); i++){\n int minn = 1e5+5;\n for(int j = 0; j < dis.size(); j++){\n minn = min(minn, abs(i-dis.at(j)));\n }\n rearr.push_back(minn);\n }\n return rearr;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3087031064","body":"### C++ 代码\n``` C++\nclass CustomStack {\npublic:\n int stack[1005];\n int size = -1, mS;\n CustomStack(int maxSize) {\n mS = maxSize;\n }\n \n void push(int x) {\n if(size < mS-1){\n stack[++size] = x;\n }\n }\n \n int pop() {\n if(size < 0) return -1;\n else return stack[size--];\n }\n \n void increment(int k, int val) {\n for(int i = 0; i < k; i++){\n stack[i] += val;\n }\n }\n};\n\n/**\n * Your CustomStack object will be instantiated and called as such:\n * CustomStack* obj = new CustomStack(maxSize);\n * obj->push(x);\n * int param_2 = obj->pop();\n * obj->increment(k,val);\n */\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3086899860","body":"### 思路 \n遍历整个字符串,总共有四种可能,分别是 数字 字母 左括号 右括号\n1. 数字:定义`digit`存储读取到的数字\n2. 字母:可以直接读取累加至`res`\n3. 左括号:需要将前面的`res`和`digit`分别入栈,并将其赋为0和”“\n4. 右括号:读取栈顶元素,循环拼接后,累加至`res`\n### C++ 代码\n``` C++\nclass Solution {\npublic:\n string decodeString(string s) {\n stack numStack;\n stack strStack;\n int digit=0;\n string res=\"\";\n\n for(int i = 0; i < s.size(); i++){\n if(s.at(i) >= '0' && s.at(i) <= '9'){// 数字\n digit = digit*10+s.at(i)-'0';\n } else if(s.at(i) >= 'a' && s.at(i) <= 'z'){// 字符\n res += s.at(i);\n } else if(s.at(i) == '['){// 左括号\n numStack.push(digit);\n strStack.push(res);\n res = \"\";\n digit=0;\n } else {// 右括号\n int count = numStack.top();\n numStack.pop();\n string outString = strStack.top();\n strStack.pop();\n for(int i = 0; i < count; i++) outString += res;\n res = outString;\n }\n }\n return res;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092046146","body":"#### 思路\n\n1. `push`和`empty`可以直接进行操作。\n2. `pop`和 `peek`需要得到入栈的第一个元素,可以使用一个辅助栈,对第一个栈进行出栈同时第二个栈进行入栈操作,这样第二个栈`top`得到的元素就是第一个栈入栈的第一个元素。\n\n``` C++\nclass MyQueue {\npublic:\n stack tmp;\n stack stack;\n MyQueue() {\n }\n \n void push(int x) {\n tmp.push(x);\n }\n \n int pop() {\n while(!tmp.empty()){\n stack.push(tmp.top());\n tmp.pop();\n }\n int a = stack.top();\n stack.pop();\n while(!stack.empty()){\n tmp.push(stack.top());\n stack.pop();\n }\n return a;\n }\n \n int peek() {\n while(!tmp.empty()){\n stack.push(tmp.top());\n tmp.pop();\n }\n int a = stack.top();\n while(!stack.empty()){\n tmp.push(stack.top());\n stack.pop();\n }\n return a;\n }\n \n bool empty() {\n return tmp.empty();\n }\n};\n\n/**\n * Your MyQueue object will be instantiated and called as such:\n * MyQueue* obj = new MyQueue();\n * obj->push(x);\n * int param_2 = obj->pop();\n * int param_3 = obj->peek();\n * bool param_4 = obj->empty();\n */\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094511890","body":"#### 哈希\n\n```c++\nclass Solution {\npublic:\n int maxChunksToSorted(vector& arr) {\n unordered_map ans;\n vector tmp = arr;\n sort(tmp.begin(), tmp.end());\n int cnt=0;\n for(int i = 0; i < arr.size(); i++){\n ans[arr[i]]++;\n ans[tmp[i]]--;\n if(ans[arr[i]]==0) ans.erase(arr[i]);\n if(ans[tmp[i]]==0) ans.erase(tmp[i]);\n if(ans.empty()) cnt++;\n }\n return cnt;\n }\n};\n```\n时间复杂度 nlog(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095832085","body":"#### 思路\n\n先将链表变为首尾相连循环链表,然后通过`k`找到断开位置的前一个元素,断开,返回头节点即可。\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * struct ListNode *next;\n * };\n */\nstruct ListNode* rotateRight(struct ListNode* head, int k) {\n if(head==NULL || k==0) return head;\n int len=1;\n struct ListNode * p=head;\n if(p) len=1;\n while(p->next){\n len++;\n p = p->next;\n }\n //printf(\"%d\\n\", len);\n p->next = head;\n k = k%len;\n for(int i = 0; i < len-k-1; i++){\n head = head->next;\n }\n p = head->next;\n head->next = NULL;\n return p;\n}\n```\n\n时间复杂度O(n)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3102195778","body":"#### C代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * struct ListNode *next;\n * };\n */\nstruct ListNode* swapPairs(struct ListNode* head) {\n //struct ListNode Node;\n //Node.next = head;\n //struct ListNode* tmp = &Node;\n struct ListNode* Node=(struct ListNode*)malloc(sizeof(struct ListNode));\n Node->next = head;\n struct ListNode* tmp = Node;\n while(tmp->next && tmp->next->next){\n struct ListNode* first = tmp->next;\n struct ListNode* second = tmp->next->next;\n tmp->next = second;\n first->next = second->next;\n second->next = first;\n tmp = first;\n }\n return Node->next;\n}\n```\n\n时间复杂度O(n)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3106692662","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode() : val(0), next(nullptr) {}\n * ListNode(int x) : val(x), next(nullptr) {}\n * ListNode(int x, ListNode *next) : val(x), next(next) {}\n * };\n */\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n TreeNode* sortedListToBST(ListNode* head) {\n if(head==NULL) return NULL;\n int n = 0;\n for(auto p=head; p; p=p->next){\n n++;\n }\n if(n==1) return new TreeNode(head->val);\n auto cur = head;\n for(int i = 0; i < n/2-1; i++) cur = cur->next;\n auto root = new TreeNode(cur->next->val);\n root->right = sortedListToBST(cur->next->next);\n cur->next = NULL;\n root->left = sortedListToBST(head);\n return root;\n }\n};\n```\n\n时间复杂度O(nlog(n))","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112024319","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode(int x) : val(x), next(NULL) {}\n * };\n */\nclass Solution {\npublic:\n ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {\n if(headA==NULL || headB==NULL) return NULL;\n ListNode *a = headA, *b = headB;\n while(a!=b){\n if(a == NULL) a = headB;\n a = a->next;\n if(b == NULL) b = headA;\n b = b->next;\n }\n return a;\n }\n};\n```\n\n时间复杂度O(n+m)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116982615","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode(int x) : val(x), next(NULL) {}\n * };\n */\nclass Solution {\npublic:\n ListNode *detectCycle(ListNode *head) {\n unordered_map visit;\n while(head){\n visit[head]++;\n if(visit[head]==2) return head;\n head=head->next;\n } \n return NULL;\n }\n};\n```\n\n时间复杂度O(n)\n\n空间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121297965","body":"#### C++代码\n\n- hash表: `unordered_map hash;`\n- 双向链表用来 将`Node` 根据 使用时间 进行排序。靠近左端表示最近使用,靠近右端表示较长时间没有使用。\n\n``` c\nclass LRUCache {\npublic:\n struct Node {\n int key, val;\n Node *prev, *next;\n Node(int _key, int _val): key(_key), val(_val), prev(NULL), next(NULL){}\n }*L, *R; //L头节点 R尾节点\n\n unordered_map hash;\n int n;\n\n void delete_node(Node *p){\n p->next->prev = p->prev;\n p->prev->next = p->next;\n }\n\n void insert_node(Node *p){ //链表头插入\n p->next = L->next;\n L->next->prev = p;\n p->prev = L;\n L->next = p;\n }\n\n LRUCache(int capacity) {\n n = capacity;\n L = new Node(-1, -1);\n R = new Node(-1, -1);\n L->next = R;\n R->prev = L;\n }\n \n int get(int key) {\n if(!hash.count(key)) return -1;\n else{\n auto p = hash[key];\n delete_node(p);\n insert_node(p);\n return p->val;\n }\n }\n \n void put(int key, int value) {\n if(!hash.count(key)){\n if(hash.size()==n){\n auto p = R->prev;\n delete_node(p);\n hash.erase(p->key);\n }\n auto p = new Node(key, value);\n hash[key] = p;\n insert_node(p);\n }else {\n auto p = hash[key];\n p->val = value;\n delete_node(p);\n insert_node(p);\n }\n }\n};\n\n/**\n * Your LRUCache object will be instantiated and called as such:\n * LRUCache* obj = new LRUCache(capacity);\n * int param_1 = obj->get(key);\n * obj->put(key,value);\n */\n```\n\n时间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124142122","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n int maxDepth(TreeNode* root) {\n if(root == NULL) return 0;\n return max(maxDepth(root->left), maxDepth(root->right)) + 1;\n }\n};\n```\n\n时间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125702334","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n bool isSameTree(TreeNode* p, TreeNode* q) {\n if(p==NULL && q==NULL) return true;\n else if(p==NULL && q!=NULL) return false;\n else if(p!=NULL && q==NULL) return false;\n else if(q->val != p->val) return false;\n else return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);\n }\n};\n```\n\n时间复杂度O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130752830","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n int dfs(TreeNode *root, int sum) {\n if(root == nullptr) return 0;\n int tmp = sum*10+root->val;\n if(root->left==nullptr && root->right==nullptr) return tmp;\n return dfs(root->left, tmp) + dfs(root->right, tmp);\n }\n int sumNumbers(TreeNode* root) {\n return dfs(root, 0);\n }\n};\n```\n\n时间复杂度O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135775890","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n void dfs(TreeNode* root, int height, int &curVal, int &curHeight){\n if(root==nullptr) return ;\n height++;\n dfs(root->left, height, curVal, curHeight);\n dfs(root->right, height, curVal, curHeight);\n if (height > curHeight) {\n curHeight = height;\n curVal = root->val;\n }\n }\n int findBottomLeftValue(TreeNode* root) {\n int curVal=0, curHeight=0;\n dfs(root, 0, curVal, curHeight);\n return curVal;\n }\n};\n```\n\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3139476046","body":"#### C++代码\n\n``` c\nclass Codec {\npublic:\n\n // Encodes a tree to a single string.\n void rserialize(TreeNode* root, string& str) {\n // 前序遍历(中左右,遇到空节点输入None),用逗号隔开\n if (root == NULL) str += \"None,\";\n else {\n str += to_string(root->val) + \",\";\n rserialize(root->left, str);\n rserialize(root->right, str);\n } \n }\n string serialize(TreeNode* root) {\n string ret;\n rserialize(root, ret);\n return ret;\n }\n\n // Decodes your encoded data to tree.\n\n TreeNode* rdeserialize(list& dataArray) {\n if(dataArray.front() == \"None\") {\n dataArray.erase(dataArray.begin());\n return NULL;\n }\n // 前序遍历(中左右)恢复树结构\n TreeNode* root = new TreeNode(stoi(dataArray.front()));\n dataArray.erase(dataArray.begin());\n root->left = rdeserialize(dataArray);\n root->right = rdeserialize(dataArray);\n return root;\n }\n\n TreeNode* deserialize(string data) {\n list dataArray;\n string str;\n // 添加各节点val\n // 按引用传递,按值传递会增加耗时\n for (auto& c : data) {\n if (c == ',') {\n // 以逗号作为节点分割\n dataArray.push_back(str);\n str.clear();\n } else {\n str.push_back(c);\n }\n }\n // 添加尾部节点val\n if (!str.empty()) {\n dataArray.push_back(str);\n str.clear();\n }\n return rdeserialize(dataArray);\n }\n};\n\n\n//参考链接:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/solutions/1536508/by-peaceful-thompsonfsu-8143/\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144061296","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n // 深度优先搜索函数 参数:当前节点、当前行号、当前列号、存储节点信息的map\n void dfs(TreeNode* node, int row, int col, map>>& colNodes) {\n // 若节点为空,直接返回\n if (node == nullptr) {\n return;\n }\n \n // 记录当前节点的信息:(行号, 值) 存入对应列的列表中\n colNodes[col].push_back({row, node->val});\n \n // 递归处理左子树:行号+1,列号-1\n dfs(node->left, row + 1, col - 1, colNodes);\n \n // 递归处理右子树:行号+1,列号+1\n dfs(node->right, row + 1, col + 1, colNodes);\n }\n\n // 自定义比较函数:用于对同一列的节点进行排序\n static bool compareNodes(const pair& a, const pair& b) {\n // 若行号相同,按节点值从小到大排序\n if (a.first == b.first) {\n return a.second < b.second;\n }\n // 否则按行号从小到大排序\n return a.first < b.first;\n }\n\n vector> verticalTraversal(TreeNode* root) {\n // 存储列号到节点信息的映射:key=列号,value=该列所有节点的(行号, 值)\n map>> colNodes;\n \n // 深度优先遍历树,记录每个节点的位置和值\n dfs(root, 0, 0, colNodes);\n \n // 最终结果容器\n vector> result;\n \n // 遍历每一列\n for (auto& entry : colNodes) {\n // 对当前列的节点按规则排序(使用自定义比较函数)\n sort(entry.second.begin(), entry.second.end(), compareNodes);\n \n // 提取排序后的节点值,组成当前列的结果\n vector colValues;\n for (auto& node : entry.second) {\n colValues.push_back(node.second); // node.second是节点值\n }\n result.push_back(colValues);\n }\n \n return result;\n }\n};\n\n//参考链接:https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/solutions/3739810/dui-wo-lai-shuo-huan-shi-fu-za-liao-xie-iar46/\n\n```\n\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146382948","body":"#### C++代码\n\n``` c\nclass Solution {\npublic:\n vector twoSum(vector& nums, int target) {\n unordered_map hash;\n for(int i = 0; i < nums.size(); i++){\n auto iter = hash.find(target-nums[i]);\n if(iter != hash.end()) return {iter->second, i};\n hash[nums[i]] = i;\n }\n return {};\n }\n};\n```\n\n时间复杂度:O(n)\n\n空间复杂度:O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148379333","body":"#### C++\n\n``` c\nclass Solution {\npublic:\n vector topKFrequent(vector& nums, int k) {\n vector ans;\n unordered_map f;\n for(int i = 0;i < nums.size();i++) {\n f[nums[i]]++;\n }\n priority_queue, vector >, greater > > q;\n for(auto& [num, count] : f) {\n if(q.size() < k)\n q.push({count, num});\n else {\n if(q.top().first < count) {\n q.pop();\n q.push({count, num});\n }\n }\n }\n while(!q.empty()) {\n //cout<>& points) {\n int result=0;\n for(vector P : points){\n unordered_map map;\n for(vector Q : points){\n int dis = (P[0]-Q[0])*(P[0]-Q[0])+(P[1]-Q[1])*(P[1]-Q[1]);\n map[dis]++;\n }\n for(auto [a,b] : map){\n result+=b*(b-1);\n }\n }\n return result;\n }\n};\n```\n\n时间复杂度:O(n2)\n空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3154861022","body":"``` c\nclass Solution {\npublic:\n int lengthOfLongestSubstring(string s) {\n unordered_map dic;\n int i = -1, res = 0, len = s.size();\n for(int j = 0; j < len; j++) {\n if (dic.find(s[j]) != dic.end())\n i = max(i, dic.find(s[j])->second);\n dic[s[j]] = j;\n res = max(res, j - i);\n }\n return res;\n }\n};\n```\n\n时间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3158408178","body":"\n\n``` c\nclass Solution {\npublic:\n vector findSubstring(string s, vector& words) {\n unordered_map hash;\n vector res;\n int n = s.length(), m = words.size();\n if (n == 0 || m == 0)\n return res;\n int len = words[0].length(), end = n - m * len;\n if (n < m * len)\n return res;\n for (auto word : words)\n hash[word]++;\n int size = hash.size();\n for (int k = 0; k < len; k++) {\n unordered_map cur_hash;\n int satisfy = 0;\n for (int i = k, j = k; j <= n - len;) {\n string cur = s.substr(j, len);\n if (hash.find(cur) == hash.end()) {\n j = j + len;\n i = j;\n cur_hash.clear();\n satisfy = 0;\n } else {\n cur_hash[cur]++;\n if (cur_hash[cur] == hash[cur])\n satisfy++;\n else if (cur_hash[cur] > hash[cur]) {\n while (i < j && cur_hash[cur] > hash[cur]) {\n string temp = s.substr(i, len);\n i += len;\n cur_hash[temp]--;\n if (cur_hash[temp] == hash[temp] - 1)\n satisfy--;\n }\n }\n if (satisfy == size) {\n string temp = s.substr(i, len);\n cur_hash[temp]--;\n satisfy--;\n res.push_back(i);\n i = i + len;\n }\n j = j + len;\n }\n }\n }\n return res;\n }\n};\n```\n\n时间复杂度O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3163210992","body":"\n\n``` c\nclass Solution {\npublic:\n int minSubarray(vector &nums, int p) {\n int n = nums.size(), s[n + 1];\n s[0] = 0;\n for (int i = 0; i < n; i++) s[i + 1] = (s[i] + nums[i]) % p;\n int x = s[n];\n\n int ans = n;\n unordered_map last;\n for (int i = 0; i <= n; ++i) {\n last[s[i]] = i;\n auto it = last.find((s[i] - x + p) % p);\n if (it != last.end()) {\n ans = min(ans, i - it->second);\n }\n }\n return ans < n ? ans : -1;\n }\n};\n```\n\n时间复杂度O(n)\n空间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3167368429","body":"\n\n``` c\nclass Solution {\npublic:\n ListNode* middleNode(ListNode* head) {\n int len = 0;\n ListNode* p = head;\n while (p != nullptr) {\n len++;\n p = p->next;\n }\n int k = 0;\n p = head;\n while (k < len / 2) {\n k++;\n p = p->next;\n }\n return p;\n }\n};\n```\n\n时间复杂度O(n)\n空间复杂度O(1)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169793378","body":"```c\nclass Solution {\npublic:\n int removeDuplicates(vector& nums) {\n if (nums.empty()) {\n return 0;\n }\n int slow = 0;\n for (int fast = 1; fast < nums.size(); fast++) {\n if (nums[fast] != nums[slow]) {\n slow++;\n nums[slow] = nums[fast];\n }\n }\n return slow + 1;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172513759","body":"```c\n\nclass Solution {\npublic:\n int searchInsert(vector& nums, int target) {\n int n = nums.size();\n int left = 0, right = n - 1, ans = n;\n while (left <= right) {\n int mid = ((right - left) / 2) + left;\n if (target <= nums[mid]) {\n ans = mid;\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n return ans;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173606055","body":"```c\nclass Solution {\npublic:\n vector maxSlidingWindow(vector& nums, int k) {\n if(nums.size() == 0 || k == 0) return {};\n deque deque;\n vector res(nums.size() - k + 1);\n for(int j = 0, i = 1 - k; j < nums.size(); i++, j++) {\n if(i > 0 && deque.front() == nums[i - 1])\n deque.pop_front();\n while(!deque.empty() && deque.back() < nums[j])\n deque.pop_back();\n deque.push_back(nums[j]);\n if(i >= 0)\n res[i] = deque.front();\n }\n return res;\n }\n }\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178242802","body":"```c\nclass Solution {\npublic:\n int findJudge(int n, vector>& trust) {\n vector inDegrees(n + 1);\n vector outDegrees(n + 1);\n for (auto& edge : trust) {\n int x = edge[0], y = edge[1];\n ++inDegrees[y];\n ++outDegrees[x];\n }\n for (int i = 1; i <= n; ++i) {\n if (inDegrees[i] == n - 1 && outDegrees[i] == 0) {\n return i;\n }\n }\n return -1;\n }\n};\n\n```","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3213208919","body":"```C++\nclass Solution {\npublic:\n bool judgeCircle(string moves) {\n int R=0,L=0,U=0,D=0;\n for(int i = 0; i < moves.size(); i++){\n if(moves[i]=='R') R++;\n if(moves[i]=='L') L++;\n if(moves[i]=='U') U++;\n if(moves[i]=='D') D++;\n }\n if(R==L&&U==D) return true;\n else return false;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193632408","body":"```c\n\nclass Solution {\npublic:\n vector getOrder(vector>& tasks) {\n long now = 0; \n priority_queue, vector>, greater> >entry, ready;\n int size = tasks.size();\n\n for (int i = 0; i < size; ++i){\n entry.push(make_pair(tasks[i][0], i));\n }\n\n vector res;\n while(!entry.empty() or !ready.empty()){\n if (ready.empty()){\n now = entry.top().first;\n while (!entry.empty() && now == entry.top().first){ \n ready.push(make_pair(tasks[entry.top().second][1], entry.top().second));\n entry.pop();\n }\n }\n res.emplace_back(ready.top().second);\n now += ready.top().first;\n ready.pop();\n\n while(!entry.empty() && entry.top().first <= now){ \n ready.push(make_pair(tasks[entry.top().second][1], entry.top().second));\n entry.pop();\n }\n }\n\n return res;\n }\n};\n\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3213243204","body":"```C++\nclass Solution {\npublic:\n int numberOfRounds(string startTime, string finishTime) {\n // 转化为分钟\n int t0 = 60 * stoi(startTime.substr(0, 2)) + stoi(startTime.substr(3, 2));\n int t1 = 60 * stoi(finishTime.substr(0, 2)) + stoi(finishTime.substr(3, 2));\n if (t1 < t0){\n t1 += 1440;\n }\n // 第一个小于等于 finishTime 的完整对局的结束时间\n t1 = t1 / 15 * 15;\n return max(0, (t1 - t0)) / 15;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3213232703","body":"```C++\nclass Solution {\npublic:\n int minCharacters(string a, string b) {\n int n = a.size(), m = b.size();\n vector cntA(26, 0), cntB(26, 0);\n for (char c : a)\n ++cntA[c - 'a'];\n for (char c : b)\n ++cntB[c - 'a'];\n\n // 计算前缀和\n vector preA(27, 0), preB(27, 0);\n for (int i = 0; i < 26; ++i) {\n preA[i + 1] = preA[i] + cntA[i];\n preB[i + 1] = preB[i] + cntB[i];\n }\n\n int ans = INT_MAX;\n\n // 条件 1\n for (int k = 1; k < 26; ++k) {\n int costA = n - preA[k];\n int costB = preB[k];\n ans = min(ans, costA + costB);\n }\n\n // 条件 2\n for (int k = 0; k < 25; ++k) {\n int costA = preA[k + 1];\n int costB = m - preB[k + 1];\n ans = min(ans, costA + costB);\n }\n\n // 条件 3\n for (int ch = 0; ch < 26; ++ch) {\n int costA = n - cntA[ch];\n int costB = m - cntB[ch];\n ans = min(ans, costA + costB);\n }\n\n return ans;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3213189716","body":"```c++\nclass Solution {\npublic:\n vector sortArray(vector& nums) {\n if (nums.empty()) return nums;\n quickSort(nums, 0, static_cast(nums.size()) - 1);\n return nums;\n }\n\nprivate:\n void quickSort(vector& nums, int l, int r) {\n if (l >= r) return;\n int p = partition(nums, l, r);\n quickSort(nums, l, p - 1);\n quickSort(nums, p + 1, r);\n }\n\n int partition(vector& nums, int l, int r) {\n int idx = l + rand() % (r - l + 1);\n swap(nums[idx], nums[r]);\n int pivot = nums[r];\n\n int i = l - 1;\n for (int j = l; j < r; ++j) {\n if (nums[j] < pivot) {\n ++i;\n swap(nums[i], nums[j]);\n }\n }\n swap(nums[i + 1], nums[r]);\n return i + 1;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3213176894","body":"```c++\nclass Solution {\npublic:\n int mySqrt(int x) {\n int l = 0, r = x, ans=0;\n while(l<=r){\n int mid = l + (r-l)/2;\n if((long long)mid*mid<=x){\n ans = mid;\n l = mid+1;\n } else{\n //ans = mid;\n r = mid-1;\n }\n \n }\n return ans;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3213126368","body":"```c++\nclass Solution {\npublic:\n int firstBadVersion(int n) {\n int l = 1, r = n;\n while(l w;\n\n int reversePairs(vector& nums) {\n return merge_sort(nums, 0, nums.size()-1);\n }\n\n int merge_sort(vector &nums, int l, int r) {\n if(l>=r) return 0;\n int mid = l+r>>1;\n int res = merge_sort(nums, l, mid) + merge_sort(nums, mid+1, r);\n for(int i = l, j = mid+1; i <= mid; i++){\n while(j<=r && nums[j]*2ll& houses, vector& heaters) {\n for (int i = 0, j = 0; i < houses.size(); i ++ ) {\n while (j < heaters.size() && abs(heaters[j] - houses[i]) > mid)\n j ++ ;\n if (j >= heaters.size()) return false;\n }\n return true;\n }\n\n int findRadius(vector& houses, vector& heaters) {\n sort(houses.begin(), houses.end());\n sort(heaters.begin(), heaters.end());\n int l = 0, r = INT_MAX;\n while (l < r) {\n int mid = (long long)l + r >> 1;\n if (check(mid, houses, heaters)) r = mid;\n else l = mid + 1;\n }\n return r;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217486441","body":"```C++\nclass Solution {\npublic:\n bool check(vector& nums,int n,int k,int mid)\n {\n int cnt = 0;\n for(int i = 0,j = 1; i < n - 1 ; i ++)\n {\n while(j < n && nums[j] - nums[i] <= mid)\n j ++;\n cnt += j - i - 1;\n j = max(j,i + 1);\n }\n return cnt >= k;\n }\n int smallestDistancePair(vector& nums, int k)\n {\n int n = nums.size();\n sort(nums.begin(),nums.end());\n int left = 0,right = nums[n - 1] - nums[0];\n while(left < right)\n {\n int mid = (left + right) >> 1;\n if(check(nums,n,k,mid)) right = mid;\n else left = mid + 1;\n }\n return left;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3219872784","body":"```C++\nclass Solution {\npublic:\n int swimInWater(vector>& grid) {\n int m = grid.size(), n = grid[0].size();\n vector> dis(m, vector(n, INT_MAX));\n dis[0][0] = grid[0][0];\n vector> dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};\n priority_queue, vector>, greater<>> pq;\n pq.emplace(grid[0][0], 0, 0);\n while (!pq.empty()) {\n auto [d, x, y] = pq.top();\n pq.pop();\n if (x == m - 1 && y == n - 1) {\n return d;\n }\n if (d > dis[x][y]) {\n continue;\n }\n for (auto& dir : dirs) {\n int nx = x + dir[0], ny = y + dir[1];\n if (nx >= 0 && nx < m && ny >= 0 && ny < n) {\n int nd = max(d, grid[nx][ny]);\n if (nd < dis[nx][ny] ) {\n dis[nx][ny] = nd;\n pq.emplace(nd, nx, ny);\n }\n }\n }\n }\n return -1;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3223228330","body":"```C++\nclass Solution {\npublic:\n bool pd(char a){\n if(a == 'a'||a == 'e'||a == 'i'||a == 'o'||a == 'u') return true;\n return false;\n }\n int maxVowels(string s, int k) {\n int count = 0, cnt=0;\n int l = 0, r = k-1;\n for(int i = 0; i <= r; i++) if(pd(s.at(i))) count++;\n cnt = count;\n if(s.size() == k) return count;\n while(++r != s.size()){\n if(pd(s.at(l))) count--;\n if(pd(s.at(r))) count++;\n l++;\n cnt = max(cnt, count);\n }\n return cnt;\n }\n};\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243929010","body":"```C++\nclass Solution {\npublic:\n int getArea(vector>& grid, int i, int j) {\n if (i == grid.size() || i < 0)\n return 0;\n else if (j == grid[0].size() || j < 0)\n return 0;\n if (grid[i][j] == 1) {\n grid[i][j] = 0;\n return 1 + getArea(grid, i + 1, j) + getArea(grid, i - 1, j) +\n getArea(grid, i, j + 1) + getArea(grid, i, j - 1);\n }\n return 0;\n }\n int maxAreaOfIsland(vector>& grid) {\n int maxArea = 0;\n int area = 0;\n for (int i = 0; i < grid.size(); i++) {\n for (int j = 0; j < grid[0].size(); j++) {\n if (grid[i][j] == 1) {\n area = getArea(grid, i, j);\n maxArea = maxArea > area ? maxArea : area;\n }\n }\n }\n return maxArea;\n }\n};\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3268602696","body":"```C++\nclass Solution {\npublic:\n int longestCommonSubsequence(string text1, string text2) {\n int n = (int)text1.size(), m = (int)text2.size();\n vector dp(m + 1, 0);\n for (int i = 1; i <= n; ++i) {\n int prev = 0; // 相当于 dp[i-1][j-1]\n for (int j = 1; j <= m; ++j) {\n int tmp = dp[j];\n if (text1[i - 1] == text2[j - 1]) dp[j] = prev + 1;\n else dp[j] = max(dp[j], dp[j - 1]);\n prev = tmp;\n }\n }\n return dp[m];\n }\n};\n\n```\n时间复杂度O(n*m)\n空间复杂度O(min(n,m))","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290572491","body":"```C++\nclass Solution {\npublic:\n int coinChange(vector& coins, int amount) {\n vector dp(amount+1,INT_MAX);\n dp[0]=0;\n for(int i=0;i addToArrayForm(int[] num, int k) {\n int n = num.length, carry = 0, i = n - 1;\n List res = new ArrayList<>();\n \n while (i >= 0 || k > 0 || carry > 0) {\n int kDigit = k % 10;\n k /= 10;\n int sum = i >= 0 ? carry + kDigit + num[i] : carry + kDigit;\n res.add(sum % 10);\n carry = sum >= 10 ? 1 : 0;\n --i;\n }\n \n Collections.reverse(res);\n return res;\n }\n}\n```\n\n## Complexity Analysis\nTime: `O(2*max(N, log(K)))`\n* Given a number `K`, its length will be `O(log_{2}(K))`, the time complexity depends on the length of `N` and `K`, whichever is longer.\n* Notice we want to insert digits at the end of the array and then reverse it after we finish the addition (reverse takes `O(res.size())`). If we insert at the head of array, then it will take `O(n^2)` of time.\n\nSpace: `O(1)`, as we didn't use additional spaces except the return array.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077454608","body":"#### Main Idea\nThe problem asks for the shortest distance from each character in a string s to a given character c. Since c may appear multiple times, we must compute the shortest distance to any occurrence of c for each index.\n\nThe key idea is to perform two passes over the string:\n\nLeft-to-right pass: Calculate distance from the nearest c to the left.\n\nRight-to-left pass: Refine the distance by checking for any closer c on the right.\n\nBy using two passes, we can efficiently compute the minimal distance to the nearest c for each character.\n\n#### Code\n\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n int n = s.length();\n int[] dist = new int[n];\n Arrays.fill(dist, Integer.MAX_VALUE);\n for (int i = 0; i < n; ++i) {\n if (s.charAt(i) == c) {\n dist[i] = 0;\n } else if (i > 0 && dist[i - 1] < Integer.MAX_VALUE) {\n dist[i] = dist[i - 1] + 1;\n }\n }\n\n for (int i = n - 1; i >= 0; --i) {\n if (i < n - 1 && dist[i + 1] != Integer.MAX_VALUE) {\n dist[i] = Math.min(dist[i], dist[i + 1] + 1);\n }\n }\n\n return dist;\n }\n}\n```\n\n#### Complexity\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082949045","body":"## Main Idea\nA stack can be implemented with an array, but usually we only have access to stack top due to encapsulation, while we can actually access/modify any elements in the array internally.\n\nWe can implement the stack API with `array`:\n* `push()`: append at the end of array (`O(1)`)\n* `pop()`: remove the end of array (`O(1)`)\n* `increment()`: use a for loop to increment `array[0:k]` (`O(k)`).\n\n### Optimization. Range Update && Lazy Evaluation\nNotice the time complexity of `increment()` is too high due to range update, and we can use a difference array to optimize it.\n\nAlso we don't really care about the values of elements until we `pop` them, so we can evaluate them when we pop them out of the stack.\n\n## Code\n```java\nclass CustomStack {\n private Deque stack;\n private int[] arr;\n public CustomStack(int maxSize) {\n stack = new ArrayDeque<>();\n arr = new int[maxSize];\n }\n \n public void push(int x) {\n if (stack.size() < arr.length) {\n stack.push(x);\n } \n }\n \n public int pop() {\n if (stack.isEmpty()) {\n return -1;\n }\n int index = stack.size() - 1, ret = stack.pop() + arr[index];\n if (index > 0) {\n arr[index - 1] += arr[index];\n }\n arr[index] = 0;\n return ret;\n }\n \n public void increment(int k, int val) {\n k = Math.min(k - 1, stack.size() - 1);\n if (k >= 0) {\n arr[k] += val;\n }\n }\n}\n```\n## Complexity Analysis\nTime: `O(1)` for all operations\nSpace: `O(n)` as we used 2 arrays.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087312725","body":"### Main Idea\n\nStoring everything in one stack will lead to so many pushes/pops, so we can use two stacks, one stack for string, one stack for number.\n\nIterate the input string:\n\n* If `str[i]` is a number, parse the number, push that number to number stack, and push current string to string stack, then empty the string to start over.\n* If `str[i]` is a closed bracket, then we pop the number stack to get `count`, pop the string stack to get `str`, then append the current string with `count` times to the `str`.\n* Else, append the character to current string.\n\n### Code\n\n* Java\n\n```java\nclass Solution {\n public String decodeString(String s) {\n int n = s.length();\n Deque strStack = new ArrayDeque<>();\n Deque numStack = new ArrayDeque<>();\n StringBuilder sb = new StringBuilder();\n \n for (int i = 0; i < n; i++) {\n if (Character.isDigit(s.charAt(i))) {\n int j = i + 1;\n while (Character.isDigit(s.charAt(j))) {\n j++;\n }\n int count = Integer.parseInt(s.substring(i, j));\n numStack.push(count);\n strStack.push(sb);\n sb = new StringBuilder();\n i = j - 1;\n } else if (s.charAt(i) == ']') {\n int count = numStack.pop();\n StringBuilder top = strStack.isEmpty() ? new StringBuilder() : strStack.pop();\n while (count-- > 0) {\n top.append(sb);\n }\n sb = top;\n } else {\n if (s.charAt(i) != '[') {\n sb.append(s.charAt(i));\n }\n }\n }\n \n return sb.toString();\n }\n}\n```\n\n### Complexity Analysis\n\nTime: `O(max(k) * n)`, each digit will be pushed/popped at most `max(k)` times","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092141722","body":"## Main Idea\nWe can use `stack1` as the input stack, and `stack2` as the output stack. \n\n* `push()`: Push to `stack1`, so this new element will be on the stack top of `stack1` (which is the end of our queue).\n* `pop()` and `peek()`: Since we use `stack2` as our output stack, when we call `pop()` or `peek()`:\n* If `stack2` is empty, we want to move all elements from `stack1` to `stack2`, and their order will be reversed, so the bottom of `stack1` will be the top of `stack2`, which is the head of our queue.\n* If not, then we have access to the top of `stack2` already.\n\n## Code\n\n```java\nclass MyQueue {\n Deque stack1;\n Deque stack2;\n \n public MyQueue() {\n stack1 = new ArrayDeque<>();\n stack2 = new ArrayDeque<>();\n }\n \n public void push(int x) {\n stack1.push(x);\n }\n \n public int pop() {\n if (stack2.isEmpty()) {\n move();\n }\n return stack2.pop();\n }\n \n public int peek() {\n if (stack2.isEmpty()) {\n move();\n }\n \n return stack2.peek();\n }\n \n public boolean empty() {\n return stack1.isEmpty() && stack2.isEmpty();\n }\n \n private void move() {\n while (!stack1.isEmpty()) {\n stack2.push(stack1.pop());\n }\n }\n}\n```\n## Complexity Analysis\nTime:\n* `push()`: `O(1)`\n* `pop()` and `peek()`: \n\t* The **worst case** of `pop()` and `peek()` will be `O(n)`, where we have to move all elements from `stack1` to `stack2`.\n\t* **Amortized Analysis**: Say we have `n` elements in `stack1`, and `0` elements in `stack2`, and we want to call `pop()` or `peek()` `n` times. The first call will take `n` operations to move all elements from `stack2` to `stack1`. But after the first call we will have at least `n - 1` elemetns in `stack2`, which makes the next `n - 1` calls `O(1)`. So the amrotized time will be `O(n + 1 + 1 +...+1 / n) = O((2n-1)/n) = O(1)`.\n\nSpace: `O(1)`, the two stacks are given and we didn't use any extra spaces.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3093992695","body":"### Main Idea\nFor chunks `[c1, c2, c3, ..., cn]`, we have to maintain the property: `max(ci) <= min(cj)` if `i < j`. So we can create a monotonously increasing stack `stack` to **keep track of the max value for each previous chunk**. \n\nIf `arr[i] >= stack.peek()`, we can greedily create a new chunk and `stack.push(arr[i])`. Else, we need to find the previous chunk with max value smaller or equal to `arr[i]`, say `ck`, and we need to merge all the chunks `[c_k+1, ... c_cur]` with `arr[i]`.\n\nTo merge chunks, we can just pop all the max values representing those chunks off the stack, and push back the max among them (in our case, it will be stack top cuz this stack is increasing) as the max of the new chunk. \n\nFinally the size of the stack will be the number of chunks.\n### Code\n```java\nclass Solution {\n public int maxChunksToSorted(int[] arr) {\n int n = arr.length;\n Deque stack = new ArrayDeque<>();\n for (int num : arr) {\n int max = num;\n while (!stack.isEmpty() && stack.peek() > num) {\n max = Math.max(max, stack.pop());\n }\n stack.push(max);\n }\n return stack.size();\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095444824","body":"\n### Main Idea\n1. Find the length of the linked list. If `length == 0`, return `head`.\n2. If `k >= n`, then we can do `k = k % n` which doesn't affect the final result but reduce the number of rotations.\n3. Use two pointers to traverse the linked list to find the last kth element and its previous node.\n4. Modify the linked list.\n\n\n### Code\n```java\nclass Solution {\n public ListNode rotateRight(ListNode head, int k) {\n int n = getLength(head);\n if (n == 0) return head;\n k %= n;\n \n // Find the last kth element as new head\n ListNode fast = head, slow = head;\n for (int i = 0; i < k; ++i) {\n fast = fast.next;\n }\n \n while (fast.next != null) {\n fast = fast.next;\n slow = slow.next;\n }\n \n fast.next = head;\n ListNode newHead = slow.next;\n slow.next = null;\n return newHead;\n \n }\n \n private int getLength(ListNode head) {\n int len = 0;\n while (head != null) {\n ++len;\n head = head.next;\n }\n return len;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(1)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100701991","body":"### Main Idea\n1. If the current list has length smaller than 2, don't need to swap.\n2. Else, recursivly swap the list `head.next.next`, and the swap function should return the `next` node.\n3. Swap the current 2 nodes, `newHead = head.next`, `newHead.next = head` and `head.next = next`.\n\n### Code\n```java\nclass Solution {\n public ListNode swapPairs(ListNode head) {\n if (head == null || head.next == null) return head;\n ListNode next = swapPairs(head.next.next);\n ListNode newHead = head.next;\n newHead.next = head;\n head.next = next;\n return newHead;\n }\n}\n```\n\n### Complexity Analysis\n* Time: `O(n)`\n* Space: `O(n)` for the recursive call.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109183645","body":"### Main Idea\n1. Define `inOrder(int i, int j)` to be the problem of the converting `list[i:j]` to BST.\n2. Base case: if `i > j`, return `null`.\n3. Calculate `mid = i + (j - i) / 2`, left subtree will be `inOrder(i, mid - 1)`, and then we create our root with the current node `cur`, then the next node to create will be `cur.next`, and we build the right sutree with `inOrder(mid + 1, j)`.\n\n### Code\n```java\nclass Solution {\n private ListNode cur;\n public TreeNode sortedListToBST(ListNode head) {\n if (head == null) return null;\n cur = head;\n int n = getLength(head);\n return inOrder(0, n - 1);\n }\n\n private TreeNode inOrder(int l, int r) {\n if (l > r) return null;\n int m = l + (r - l) / 2;\n TreeNode left = inOrder(l, m - 1);\n TreeNode root = new TreeNode(cur.val);\n cur = cur.next;\n TreeNode right = inOrder(m + 1, r);\n root.left = left;\n root.right = right;\n return root;\n }\n\n private int getLength(ListNode head) {\n int cnt = 0;\n while (head != null) {\n head = head.next;\n ++cnt;\n }\n return cnt;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(logn)` for recursive calls.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112278406","body":"Say the length of `a_1` to `a_i` is `a`, `b_1` to `b_i` is `b`, and `c_1` to `c_n` is `c`. If there is no interseciton, then `c = 0`. And `a + b = b + a`. If there is an intersection, then `a + c + b = b + c + a`, and the two pointers will meet at the intersection point.\n```\npublic ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n ListNode h1 = headA, h2 = headB;\n while (h1 != h2) {\n\n h1 = h1 == null ? headB : h1.next;\n h2 = h2 == null ? headA : h2.next;\n }\n return h1; \n }\n```\n\nSo we can just go over both linked list once, and switch the pointers.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3118087746","body":"### Main Idea\nDefine two pointers `fast` and `slow`, each iteration, `fast` moves 2 steps forward while `slow` moves 1 step. If there is a cycle, then `fast` will equals `slow` eventually, and if not, we will exit the loop.\n\nIf a cycle is detected, we need to find the starting point. \n\n```\nfast = 2 * slow\n\nfast = l + n1 * c + t\nslow = l + n2 * c + t\n\n\nl + n1 * c + t = 2 * l + 2 * n2 * c + 2 * t\nl = n1 * c - 2 * n2 * c = c * (n1 - 2 * n2) = n' * c - t\n```\n\n```\n L\n-------- ----I-----\n | | D\n ----------\n```\n### Code\n```java\npublic class Solution {\n public ListNode detectCycle(ListNode head) {\n if (head == null) return null;\n ListNode fast = head, slow = head;\n while (fast != null && fast.next != null) {\n fast = fast.next.next;\n slow = slow.next;\n if (fast == slow) {\n while (slow != head) {\n slow = slow.next;\n head = head.next;\n }\n return head;\n }\n }\n return null;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(1)`","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3126063970","body":"### Main Idea\n* Base case 1, both `p` and `q` are `null`, return `true`.\n* Base case 2, else if either of them is `null` or their values are not equal, return `false`.\n* Recursive case: both left and right subtrees are equal.\n\n### Code\n```java\nclass Solution {\n public boolean isSameTree(TreeNode p, TreeNode q) {\n if (p == null && q == null) {\n return true;\n } else if (p == null || q == null || p.val != q.val) {\n return false;\n }\n return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n }\n}\n```\n\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(h) = O(n)`","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136827599","body":"### Main Idea\nThis problem is asking for the leftmost node of the last layer, and when it comes to traversal by layer, BFS comes in handy.\n\nIn a standard BFS algorithm, we use a queue to keep track of the nodes on each layer, we just need to modify the algorithm to record the first node of the current layer, and if we exit the loop from the current layer, that means this is the last layer, and the node we recorded will be the one we want to find.\n\n### Code\n```java\nclass Solution {\n public int findBottomLeftValue(TreeNode root) {\n Queue q = new ArrayDeque<>();\n q.offer(root);\n int res = 0;\n while (!q.isEmpty()) {\n res = q.peek().val;\n int size = q.size();\n for (int i = 0; i < size; ++i) {\n TreeNode n = q.poll();\n if (n.left != null) q.offer(n.left);\n if (n.right != null) q.offer(n.right);\n }\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144871038","body":"### main Idea\n1. We store `Pair` in our pq, where `TreeNode` is the node and `int[]` is its coordinate.\n2. Since we want to maintain the row order, we compare pairs by their row order, smaller row has higher priority.\n3. If row numbers are the same, we compare values, since we don't really care about the order we process columns each row.\n4. Use a map that maps `col` to `list` to store the node values.\n\n\n### Code\n* Java\n\n```java\nclass Solution {\n public List> verticalTraversal(TreeNode root) {\n // column -> list\n Map> map = new HashMap<>();\n PriorityQueue> queue = new PriorityQueue<>((p1, p2) -> {\n int loc1[] = p1.getValue();\n int loc2[] = p2.getValue();\n if (loc1[0] == loc2[0]) {\n return p1.getKey().val - p2.getKey().val;\n } else {\n return loc1[0] - loc2[0];\n }\n });\n queue.offer(new Pair(root, new int[] {0, 0}));\n while (!queue.isEmpty()) {\n int size = queue.size();\n for (int i = 0; i < size; ++i) {\n Pair p = queue.poll();\n TreeNode node = p.getKey();\n int loc[] = p.getValue();\n List list = map.getOrDefault(loc[1], new ArrayList<>());\n list.add(node.val);\n map.put(loc[1], list);\n if (node.left != null) {\n queue.offer(new Pair(node.left, new int[] {loc[0] + 1, loc[1] - 1}));\n }\n\n if (node.right != null) {\n queue.offer(new Pair(node.right, new int[] {loc[0] + 1, loc[1] + 1}));\n }\n }\n }\n\n List> res = new ArrayList<>();\n for (int i = -1000; i <= 1000; ++i) {\n if (map.containsKey(i)) {\n res.add(map.get(i));\n }\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(nlogn)`\nSpace: `O(n)`","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162435845","body":"```java\nclass Solution {\n public int minSubarray(int[] nums, int p) {\n int n = nums.length;\n long arraySum = Arrays.stream(nums).asLongStream().sum(); \n int targetRemainder = (int) (arraySum % p);\n if (targetRemainder == 0) {\n return 0;\n } else if (arraySum < p) {\n return -1;\n }\n \n Map remainderToIndex = new HashMap<>();\n remainderToIndex.put(0, -1);\n \n long preSum = 0;\n int minLen = Integer.MAX_VALUE;\n for (int i = 0; i < n; ++i) {\n preSum += nums[i];\n int remainder = (int) (preSum % p);\n int remainderToCheck = (int) (remainder - targetRemainder);\n if (remainderToCheck < 0) {\n remainderToCheck += p;\n }\n \n if (remainderToIndex.containsKey(remainderToCheck)) {\n int index = remainderToIndex.get(remainderToCheck);\n minLen = Math.min(minLen, i - index);\n }\n \n remainderToIndex.put(remainder, i);\n }\n \n return minLen >= n ? -1 : minLen;\n }\n}\n\n/*\n [3, 1, 4, 2], p = 6\n \n arraySum = 10, targetRemainder = 4\n \n preSum = 3,\n\n [3, 1, 4, 2] = 10\n \n [0, 3, 4, 8, 10]\n \n [7, ]\n \n Sum: 9 p=6\n \n a mod b = (a + b) mod b\n \n (S_j - S_i) mod p == sum mod p\n \n \n x mod p = a\n y mod p = b\n \n (x - y) mod p = a - b (if a >= b)\n a - b + p (if a < b)\n*/\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182362544","body":"## Method 1. BFS\n### Main Idea\nBasically, this problem is asking if we can mark the graph with 2 colors, where adjacent vertices can't have the same color.\n\nSo we can apply BFS to traverse the graph, say we mark a vertex `v` with color 1, then we have to mark all its neighbors with color 2. If any of them was marked color 1, then we know it's impossible to mark the graph with 2 colors, so we can return `false`.\n\nIf no such contradictions found, that means the graph can be 2-colored, so return `true`.\n### Code\n* Java\n\n```java\nclass Solution {\n public boolean possibleBipartition(int n, int[][] dislikes) {\n List[] graph = new ArrayList[n + 1];\n for (int i = 0; i <= n; ++i) graph[i] = new ArrayList<>();\n \n for (int[] edge : dislikes) {\n graph[edge[0]].add(edge[1]);\n graph[edge[1]].add(edge[0]);\n }\n \n int[] colors = new int[n + 1];\n for (int i = 1; i <= n; ++i) {\n if (colors[i] != 0) continue;\n Queue q = new ArrayDeque<>();\n q.offer(i);\n colors[i] = 1;\n while (!q.isEmpty()) {\n int size = q.size();\n while (size-- > 0) {\n int v = q.poll(), c = colors[v];\n for (int nei : graph[v]) {\n if (colors[nei] == c) return false;\n if (colors[nei] != 0) continue;\n colors[nei] = -1 * c;\n q.offer(nei);\n }\n }\n }\n }\n return true;\n }\n}\n```\n### Complexity Analysis\nTime: `O(E + V)`\n\nSpace: `O(E + V)`","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204204644","body":"```java\nclass Solution {\n public int mySqrt(int x) {\n int left = 0, right = x;\n\n while (left < right - 1) {\n int mid = left + (right - left) / 2;\n long midSquare = 1l * mid * mid;\n if (midSquare == x) {\n return mid;\n } else if (midSquare < x) {\n left = mid;\n } else {\n right = mid - 1;\n }\n }\n long rightSqaure = 1l * right * right;\n return rightSqaure > x ? left : right;\n }\n}\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222726555","body":"```java\nclass Solution {\n public int maxVowels(String s, int k) {\n String vowels = \"aeiou\";\n int n = s.length(), l = 0, r = 0, res = 0, cnt = 0;\n while (r < n) {\n while (r < n && r - l < k) {\n if (vowels.indexOf(s.charAt(r)) != -1) {\n ++cnt;\n }\n ++r;\n }\n\n res = Math.max(res, cnt);\n if (vowels.indexOf(s.charAt(l)) != -1) {\n --cnt;\n }\n ++l;\n }\n\n return res;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243695565","body":"```java\nclass Solution {\n public int maxAreaOfIsland(int[][] grid) {\n int m = grid.length, n = grid[0].length;\n int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};\n \n int ret = 0;\n for (int i = 0; i < m; i++) {\n for (int j = 0; j < n; j++) {\n if (grid[i][j] == 0) {\n continue;\n }\n \n Queue queue = new ArrayDeque<>();\n queue.offer(new int[] {i, j});\n grid[i][j] = 0;\n int area = 1;\n while (!queue.isEmpty()) {\n int[] loc = queue.poll();\n for (int[] dir : dirs) {\n int x = loc[0] + dir[0], y = loc[1] + dir[1];\n if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == 0) {\n continue;\n }\n queue.offer(new int[] {x, y});\n grid[x][y] = 0;\n area++;\n }\n }\n \n ret = Math.max(ret, area);\n }\n }\n \n return ret;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269054068","body":"## Method 1. DP + Count\n### Main Idea\nSimilar to the DP solution of the LIS problem, but we also need to count how many shorter subsequences contribute to each subsequence ending at index `i`.\n\nSo we define `dp[i][0]` to be the max len of subsequence ending at `i`, and `dp[i][1]` to be the number of shorter subsequences contributing to \n### Code\n* Java\n\n```java\nclass Solution {\n public int findNumberOfLIS(int[] nums) {\n int n = nums.length, res = 0, max = 0;\n // \n int[][] dp = new int[n][2];\n \n for (int i = 0; i < n; ++i) {\n dp[i][0] = 1;\n int cnt = 1;\n for (int j = 0; j < i; ++j) {\n if (nums[i] > nums[j]) {\n if (dp[j][0] + 1 > dp[i][0]) {\n dp[i][0] = dp[j][0] + 1;\n cnt = dp[j][1];\n } else if (dp[j][0] + 1 == dp[i][0]) {\n cnt += dp[j][1];\n }\n }\n }\n \n if (dp[i][0] > max) {\n max = dp[i][0];\n res = cnt;\n } else if (dp[i][0] == max) {\n res += cnt;\n }\n dp[i][1] = cnt;\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n^2)`\n\nSpace: `O(n)`","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3295757426","body":"```java\nclass Solution {\n public int change(int amount, int[] coins) {\n int n = coins.length;\n int[] dp1 = new int[amount + 1], dp2 = new int[amount +1];\n for (int i = 0; i < n; i++) {\n for (int j = 0; j <= amount; j++) {\n if (i == 0 || j == 0) {\n if (j % coins[i] == 0) {\n dp2[j] = 1;\n }\n continue;\n }\n \n if (j - coins[i] >= 0) {\n dp2[j] = dp1[j] + dp2[j - coins[i]];\n } else {\n dp2[j] = dp1[j];\n }\n }\n \n int[] tmp = dp1;\n dp1 = dp2;\n dp2 = tmp;\n }\n return dp1[amount];\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322650611","body":"```java\nclass Solution {\n public int[] singleNumber(int[] nums) {\n int xor = 0;\n for (int num : nums) {\n xor ^= num;\n }\n \n\n int rightmostBit = xor & (-xor);\n \n int num1 = 0, num2 = 0;\n for (int num : nums) {\n if ((num & rightmostBit) != 0) {\n num1 ^= num;\n } else {\n num2 ^= num;\n }\n }\n \n return new int[]{num1, num2};\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"suukii":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mirrors-cl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xqy97":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jakkiabc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyoneday":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chouqin99":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhaogeg111":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawnhu23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ye2222":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uyplayer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guixian001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"serena9":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"junzmer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hx-code":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"admu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xxiaomm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pgquestions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eldinzhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiangwenzhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawnwu6688":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tomtao626":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aiweng1981":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richard-lime":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"acoada":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"duanyaqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ccslience":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaiykk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cachezhou0617":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangtuo1999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cytrue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyryan-web":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"naomiwufzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuajingliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miss1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"johnxizhao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"incipe-win":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"revisegoal":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckysq999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dereklisdr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"perfqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mryao1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"likeyousmile":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhg1992":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liquanluo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aq666888":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"samlu-ecnu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhongxiangxiang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hatorimain":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"neado":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaojunjun1110":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wxleah":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunl1ght":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kerrhl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"orangejuz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flyzenr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"c1f2h3":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dlm001128":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuxy94":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aconcert":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"linjunhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hyqqq22":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yibenxiao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elon-lau":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nowkizzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gsgtgyb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"irenia111":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"suiyi8760":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"saltychess":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rabbit2010520":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ellie-wu05":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yopming":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckytwj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzz607":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zoulufeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xxoojs":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"okkband":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wyz999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hacker90":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ricjli":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luhaoling":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flaming-cl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gelxgx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gaominghao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jessie725":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lsunxh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lanceli424":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qycoder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qilin88":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hengheng-yun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"smz1995":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"size-of":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"moyuanhua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"9vivian88":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guxuehua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kirosola":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"biscuit279":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maoting":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"youzhaing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jawn-ha":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hanwangxxx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dujt-x":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"degndaixingqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gzgzgzgzgzgz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gentleman-goodman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xinyi-arch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zenwangzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"andyyxw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fourierhai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yangz001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mannnn6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"haoyangxie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chjillout":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wenjialu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mhcn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"coconutice":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jackgaoyuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xingzhan0312":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yufeng727":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fontendart":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yingchehu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cobayaz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tomato-tomato":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xfliudx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"djd28176":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xilutian":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xy147":[null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091443042","body":"### js代码\n```JavaScript\n\nvar MyQueue = function() {\n this.inStack = [];\n this.outStack = [];\n};\nMyQueue.prototype.push = function(x) {\n this.inStack.push(x);\n};\n\nMyQueue.prototype.pop = function() {\n if (!this.outStack.length) {\n this.in2out();\n }\n return this.outStack.pop();\n};\n\nMyQueue.prototype.peek = function() {\n if (!this.outStack.length) {\n this.in2out();\n }\n return this.outStack[this.outStack.length - 1];\n};\n\nMyQueue.prototype.empty = function() {\n return this.outStack.length === 0 && this.inStack.length === 0;\n};\n\nMyQueue.prototype.in2out = function() {\n while (this.inStack.length) {\n this.outStack.push(this.inStack.pop());\n }\n};\n\n```\n\n### 复杂度分析\n时间复杂度:O(1)\n空间复杂度:O(n)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3120847716","body":"```\nclass ListNode {\n constructor(key, value) {\n this.key = key\n this.value = value\n this.next = null\n this.prev = null\n }\n}\n\nclass LRUCache {\n constructor(capacity) {\n this.capacity = capacity\n this.hash = {}\n this.count = 0\n this.dummyHead = new ListNode()\n this.dummyTail = new ListNode()\n this.dummyHead.next = this.dummyTail\n this.dummyTail.prev = this.dummyHead\n }\n\n get(key) {\n let node = this.hash[key]\n if (node == null) return -1\n this.moveToHead(node)\n return node.value\n }\n\n put(key, value) {\n let node = this.hash[key]\n if (node == null) {\n if (this.count == this.capacity) {\n this.removeLRUItem()\n }\n let newNode = new ListNode(key, value)\n this.hash[key] = newNode\n this.addToHead(newNode)\n this.count++\n } else {\n node.value = value\n this.moveToHead(node)\n }\n }\n\n moveToHead(node) {\n this.removeFromList(node)\n this.addToHead(node)\n }\n \n removeFromList(node) {\n let temp1 = node.prev\n let temp2 = node.next\n temp1.next = temp2\n temp2.prev = temp1\n }\n\n addToHead(node) {\n node.prev = this.dummyHead\n node.next = this.dummyHead.next\n this.dummyHead.next.prev = node\n this.dummyHead.next = node\n }\n\n removeLRUItem() {\n let tail = this.popTail()\n delete this.hash[tail.key]\n this.count--\n }\n\n popTail() {\n let tail = this.dummyTail.prev\n this.removeFromList(tail)\n return tail\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146107002","body":"```const twoSum = (nums, target) => {\n const prevNums = {};\n\n for (let i = 0; i < nums.length; i++) {\n const curNum = nums[i];\n const targetNum = target - curNum;\n const targetNumIndex = prevNums[targetNum];\n if (targetNumIndex !== undefined) {\n return [targetNumIndex, i];\n } else {\n prevNums[curNum] = i;\n }\n }\n}```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3167532564","body":"### js代码\n```JavaScript\nvar middleNode = function(head) {\n let slow = fast = head\n while(fast && fast.next){\n slow = slow.next\n fast = fast.next.next\n }\n return slow\n};\n\n```\n\n### 复杂度分析\n时间复杂度:O(N)\n空间复杂度:O(1)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190926614","body":"### js代码\n```JavaScript\nvar judgeCircle = function(moves) {\n return moves.split('L').length === moves.split('R').length && moves.split('U').length === moves.split('D').length\n};\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"itsjacob":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shunanch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yppah-eb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"raychenlei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"woshichuanqilz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"willuuu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"christina-soda":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jia98shanliang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"user-vannnn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tobepellucid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"johnvsd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yueza":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawyuan97":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"victorhuang99":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cusanity":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jay-xzj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shiradaone":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xinyue-ma":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"taojin1992":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joyce94":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"steven72574":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tian-pengfei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"asuka1h":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaowangcoding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"james0608":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaneyang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"azl397985856":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whgsh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chengfengfengwang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bulingbulingbuling":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"c2tr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eden-ye":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"codingtrains":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"starorbiting":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mo-xiaoxiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"passengersa":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073445770","body":"思维:\n1、将数组num和k转换为字符,\n2、使用BigInt方法相加\n3、最后使用将相加得到转换为数字数组\n时间复杂度:O(n)\n代码:\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function (num, k) {\n let numStr = num.join('')\n let sum = BigInt(numStr) + BigInt(k)\n return sum.toString().split('').map(Number)\n};","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084084442","body":"时间复杂度:O(n)\n代码:\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.maxSize = maxSize;\n this.stack = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.stack.length < this.maxSize) {\n this.stack.push(x);\n }\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.stack.length === 0) {\n return -1;\n }\n return this.stack.pop();\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n const len = this.stack.length;\n const count = Math.min(k, len);\n for (let i = 0; i < count; i++) {\n this.stack[i] += val;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097108121","body":"思路:\n首先,计算链表的长度 n。\n接着,将 k 对 n 取模,因为旋转 n 次后链表会回到原来的状态,所以取模可以避免不必要的旋转操作。\n然后,找到新的链表头节点和尾节点。新的链表头节点是原链表中第 n - k 个节点,新的链表尾节点是原链表的最后一个节点。\n最后,将原链表的尾节点连接到原链表的头节点,形成一个环形链表,再从新的链表头节点处断开,得到旋转后的链表。\n时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表两次,第一次计算链表的长度,第二次找到新的链表头节点的前一个节点。\n代码:\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n // 定义链表节点类\nclass ListNode {\n constructor(val = 0, next = null) {\n this.val = val;\n this.next = next;\n }\n}\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n if (!head || !head.next) return head;\n\n // 计算链表的长度\n let n = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n n++;\n }\n\n // 对 k 取模\n k %= n;\n\n // 如果 k 为 0,说明不需要旋转,直接返回原链表\n if (k === 0) return head;\n\n // 找到新的链表头节点的前一个节点\n let newTail = head;\n for (let i = 0; i < n - k - 1; i++) {\n newTail = newTail.next;\n }\n\n // 新的链表头节点\n let newHead = newTail.next;\n\n // 断开原链表,形成新的链表\n newTail.next = null;\n tail.next = head;\n\n return newHead; \n};\n\n// 辅助函数:将数组转换为链表\nfunction arrayToList(arr) {\n if (arr.length === 0) return null;\n let head = new ListNode(arr[0]);\n let current = head;\n for (let i = 1; i < arr.length; i++) {\n current.next = new ListNode(arr[i]);\n current = current.next;\n }\n return head;\n}\n\n// 辅助函数:将链表转换为数组\nfunction listToArray(head) {\n let result = [];\n let current = head;\n while (current) {\n result.push(current.val);\n current = current.next;\n }\n return result;\n}","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shellylcooper":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"testplm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tom-zhouch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"skylarxu214":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"taihui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huaxueguakele":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yang-chenyu104":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mlking15":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"-3":[],"cyonline":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rzhao010":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zywang0":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jetery":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"klspta":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bookyue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jancerwu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"buer1121":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ceramickitten":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gg925407590":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alyenor":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chenming-cao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ggohem":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dark-volute":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ronething":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jmastella":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"paopaohua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dd2001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mayloveless":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuexi001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nineis7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"abby-xu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gsw9818":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaomingshixiaotang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"snmyj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flipn9":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wabw1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xqmmy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"a-pricity":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sclihuiming":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"amazeding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"astrking":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tzuikuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ringo1597":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brucezhang-utf-8":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luanxing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"moin-jer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lihua1997":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cuizezhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xuanaxuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tiandao043":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"restlessbreeze":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ruikiwi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huiminren":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"saitochen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wtdcai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"albert556":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wuxiaoshawn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zrtch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhuzhu096":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whoam-challenge":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weisday":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"syh-coder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaaller":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kyrie96521":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cavecrypto":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cxgbro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erjian96":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"a-polarbear":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alexno1no2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yetfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhiyuanpeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bwspsu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"arinzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mdge":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allenfeng666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yin02":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elsa-zhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"asur4s":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"littlesugarman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhihaowan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"apockira":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guowei0223":[null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077086971","body":"```\n首先需要找到所有c出现的index,存在c_index list里为后续的pointer搜索做好准备\npointer = 0 定义好pointer的起点\n遍历s,在c_index的范围内,对比pointer和pointer + 1 和s中各个位置的绝对距离,如果发现pointer和s的距离大于pointer +1,那么说明s的index已经走到了离pointer+1更近的距离,那么这时候我们更新pointer,+ 1, 指到下一个c_index中c的位置。\nres.append()c_index中pointer和s中index的距离\n\nclass Solution:\n def shortestToChar(self, s: str, c: str) -> List[int]:\n c_index = []\n for i in range(len(s)):\n if s[i] == c:\n c_index.append(i)\n pointer = 0\n res = []\n for i in range(len(s)):\n if pointer < len(c_index) -1:\n if abs(i-c_index[pointer])> abs(i-c_index[pointer+1]):\n pointer += 1\n res.append(abs(i-c_index[pointer]))\n return res\n\n因为用了指针,所以时间复杂度 O(n)。 空间复杂度 O(n)。 \n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087516204","body":"```\n使用栈的经典题型。遇见数字就num*10 + item处理。 遇见【 左括号说明要开始处理括号内部,用stack先存好之前已经处理的结果,遇见】后括号说明括号完成,则需要stack。pop()出保存的结果加上括号里的内容。是字母的话,则res+ item更新括号内信息。\n空间复杂度 O(n)\n时间复杂度 O(n)\n\nclass Solution:\n def decodeString(self, s: str) -> str:\n res = \"\"\n stack = []\n num = 0\n for item in s:\n if item.isdigit():\n num = num * 10 + int(item)\n elif item == \"[\":\n stack.append([num, res])\n num = 0\n res = \"\"\n elif item == \"]\":\n pre_num, pre_res = stack.pop()\n res = pre_res + pre_num * res\n else:\n res += item\n return res\n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3101341120","body":"还是链表的老套路,设置一个dummy head。 判断cur.next and cur.next.next: 是否存在,存在了再进行下一步。\n用tmp,tmp1 来保存cur。next和cur.next.next.next。 然后我们开始进行交换步骤。\n\n```\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n dummy_head = ListNode(next =head)\n cur = dummy_head\n while cur.next and cur.next.next:\n temp = cur.next\n temp1 = cur.next.next.next\n cur.next = cur.next.next\n cur.next.next = temp\n temp.next = temp1\n cur = cur.next.next\n return dummy_head.next\n\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125611734","body":"可以利用bfs的方法解决。 把每个点放入queue中,然后popleft()两个node进行比较。\n\n```\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if not p and not q:\n return True\n if not p or not q:\n return False\n \n que = deque([p,q])\n \n while que:\n cur1 = que.popleft()\n cur2 = que.popleft()\n if not cur1 and not cur2:\n continue\n\n if not cur1 or not cur2 or cur1.val != cur2.val:\n return False\n \n que.append(cur1.left)\n que.append(cur2.left)\n que.append(cur1.right)\n que.append(cur2.right)\n return True\n\n```\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148705374","body":"```\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n ans = 0\n for x1, y1 in points:\n cnt = defaultdict(int)\n for x2, y2 in points:\n d2 = (x1 - x2) ** 2 + (y1 - y2) ** 2\n ans += cnt[d2] * 2\n cnt[d2] += 1\n return ans\n\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuqianyang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sj941127":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zjsuper":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yongxi-zhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"darwintk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"h-steven":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mischaqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wurongronga":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miduoliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyshenzhengkang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"y4h2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yoco323":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"forschers":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shanshuiqiankun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"annabellhyx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hwfrankfung":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"frederickfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huibinny":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ggmybro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"myleetcodejourney":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"want2333":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"staringwhere":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allenfeng8":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ryanbaiyansong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dou-yu-xuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hyxupup":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cs12300":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chiehw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aesir-idun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaldsk12":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hxj2001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"for123s":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzhilin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yfu6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mengsixing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"import-ant":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joriscai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangqianqian202301":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"airwalkers":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhumengcheng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kofzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"leonalhq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hjy-u":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"csthaha":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zepherust":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"feefeefee":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hughlin07":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huizsh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chanceyliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hshen11":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"horace7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangzh0114":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dragonfcl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huifeng248":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sarah11qing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"el1as7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zcytm3000":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pangjiadai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xb798298436":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ywang525":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"limbo42":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dorapocket":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zoeyzyzyzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jasonqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lp1506947671":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"texamc2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joemonkeylee":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"northseacoder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dominique9898":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wl678":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"meisgithub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sye9286":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fuku-l":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kangliqi1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richardtaok":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chocolate-emperor":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lydia61":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangjiahuan17":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"seanutf":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangyong-hub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erquaner":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiujingxukong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"x1aox1a":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"drinkmorekaik":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dinjufen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuzmt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"munmust":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yan-jie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hktangshuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zpbc007":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"linlizzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"krabbejing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"firehaosky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chao-cc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jinjin680":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cruiseyugh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"quieter2018":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jadeliu13":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaoq777":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiangyanlineu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuxiner":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yufanzh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"franciszq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kangqinsen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"manwzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jerry9926":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"soso1105":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pkuphy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhenya-zhu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wty9sky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"skyoct":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bingzxy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaodingc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jyjsunny":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aoxiangw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"enrilwang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aswrise":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aneureka":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ljqchlsw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jingyuzhou123":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dianlandu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jameswangxin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhenxied":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nuozhouzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shin-guid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bochengwan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kyo-tom":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uratora":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guitarys":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sosdogecoin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zol013":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lrwhc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wwewwt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cyk1337":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangyu1131":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"diana21170648":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"61hhh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"quaaaaaack":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"acy925":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bi9potato":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guangsizhongbin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhaoygcq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"catkathy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yqycs":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhuxinyu-znb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"freesan44":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mo660":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sencc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"randong22":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"beginner-jamji":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yzhyzhyzh123":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunstrongchina":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dongzegithub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"metsystem":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miller-em":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dorian-byte":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yizhewill":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qiaojunch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhouliuhuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"beanza":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kingxiaozhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ygnauh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wzbwzt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"iambigchen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weiboshi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"master-guang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jennyjgao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangjay408":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chang-you":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rocjemaintiendrai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ainfinitedz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"christ36":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hengistchan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huiyingc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"andyli4":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"momogir":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jamjid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"freeroo2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ycan253":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"laurallalala":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"danielyan86":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rennzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"larscheng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qingkediguo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"adfvcdxv":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"javajianghu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chloe-c11":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"verkru":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eggeggliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dr-kkk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jinhma":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"emergence23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"0christ1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"junru281":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joe-the-plumber":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jsaki":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"witerth":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ludwig-ll":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luster-lyl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"smallppgirl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"realduxy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"awilekong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wwz223":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangjinzhepro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"atom-set":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"coderxiaowq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hillsonziqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alexzhang-mini":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xil324":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bordergong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hawkins-hjq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cathyshang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"greyqt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yanglimbo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rao-qianlin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dtjk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"martina001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lxy1108":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"franklinsworld666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brainlds":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huamulanyyds":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eclairs46":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maike-hps":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sanjiu81":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qinmengx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yashuning":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luzhaofeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lizhao-liu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yukibei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hermione666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yyyyytc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zin-next":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pandapls":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jackinai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"godkun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dadahui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"akxuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fightforcoding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jialigogogo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"celestexiong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zjy-debug":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"peggyhao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sleepydog25":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"edwineo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"panfx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liudi9047":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allanli-lhh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xchen172":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qiaoeve":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tangyi23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shangjiaw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tongxw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"haodongwang1995":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuichicx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qunshanhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hebingliang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"baiqz":[null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092397229","body":"\n### 思路:\n通过元素在栈之间的转移来模拟队列的先进先出。\n\n\n```python\nclass MyQueue:\n \"\"\"使用两个栈实现的队列类\"\"\"\n\n def __init__(self):\n # 初始化两个栈:stack_in 用于入队操作,stack_out 用于出队操作\n self.stack_in = []\n self.stack_out = []\n\n def push(self, x: int) -> None:\n \"\"\"将元素 x 添加到队列的尾部\n 直接将元素压入 stack_in\n \"\"\"\n self.stack_in.append(x)\n\n def pop(self) -> int:\n \"\"\"移除并返回队列头部的元素\n 1. 如果 stack_out 为空,将 stack_in 中的所有元素弹出并压入 stack_out\n 2. 这样能确保元素以先进先出的顺序出栈\n 3. 弹出 stack_out 的栈顶元素\n \"\"\"\n if not self.stack_out:\n while self.stack_in:\n self.stack_out.append(self.stack_in.pop())\n return self.stack_out.pop()\n\n def peek(self) -> int:\n \"\"\"返回队列头部的元素,但不删除它\n 复用 pop 方法获取队首元素,然后将其压回 stack_out 以保持队列状态不变\n \"\"\"\n res = self.pop()\n self.stack_out.append(res)\n return res\n\n def empty(self) -> bool:\n \"\"\"检查队列是否为空\n 当且仅当两个栈都为空时,队列为空\n \"\"\"\n return not (self.stack_in or self.stack_out)\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaogaoddd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tuuna":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lxy12l":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chxbilly":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sentiy-hub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fea1220":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wtbkevin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"awenbocc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hallcia":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huzhipeng-hu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tongtz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lindo146":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"heye0507":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lmw6412036":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/1#issuecomment-3072932165","body":"@azl397985856 需要建day1啦","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3076893308","body":"## 思路1\n\n枚举每个普通字符,分别找到其左侧,右侧**最近**特殊字符的位置,求出距离,并取最小值。\n\n1. 预处理每个特殊字符的位置,保存至数组data;\n2. 枚举每个普通字符,在data中查找其左侧,右侧**最近**特殊字符的位置,求出距离,并取最小值。查找过程用可以**二分**实现,也可以用\n **单个指针记录最后一次位置**实现;\n3. 返回结果。\n\n## 思路1代码\n\n```javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function (s, c) {\n let n = s.length, data = [];\n for (let i = 0; i < n; i++) {\n if (s[i] === c) data.push(i);\n }\n\n // 双指针\n // left 左侧最近的c索引\n // right 右侧最近的c索引 right = left + 1\n let left = -1, right = -1, m = data.length;\n let ans = new Array(n).fill(0);\n for (let i = 0; i < n; i++) {\n let char = s[i];\n if (char === c) continue;\n\n let ldis = Infinity, rdis = Infinity;\n // 在data中寻找左侧最近的c索引\n // left 指针移动的条件:data[left + 1] < i,确保data[left] 是在i的左侧,距离i更近\n while (left + 1 < m && data[left + 1] < i) left++;\n if (left >= 0) ldis = i - data[left];\n \n right = left + 1;\n if (right < m) rdis = data[right] - i;\n ans[i] = Math.min(ldis, rdis);\n }\n return ans;\n };\n```\n\n## 思路1复杂度分析\n\n- 时间复杂度:O(n + m),n为字符串s的长度,m为data的长度,遍历字符串s2次,left也只是从左往右移动一次,为O(m),所以总的时间复杂度为O(n + m)。\n- 空间复杂度:O(m),m为data的长度,不考虑返回值的话,需要一个额外的长度为m的数组来保存c的位置,所以空间复杂度为O(m);考虑返回值,需要一个额外的长度为n的数组来保存结果,间复杂度为O(n)。\n\n---\n\n## 思路2\n\n也可以枚举每个特殊字符c的位置,处理c往左、往右能覆盖的普通字符,记录每个普通字符的最小值即可。\n\n1. 预处理每个特殊字符的位置,保存至数组data;\n2. 从左往右遍历data,处理每个特殊字符c左侧的普通字符的距离,保存至数组答案ans;可以使用思路1单指针记录最后一个位置的方式,降低时间复杂度;具体可以看代码;\n3. 从右往左遍历data,处理每个特殊字符c右侧的普通字符的距离,与答案ans对应位置比较,取最小值;\n4. 返回答案ans。\n\n## 思路2代码\n```javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function (s, c) {\n let n = s.length, data = [], ans = new Array(n).fill(Infinity);\n for (let i = 0; i < n; i++) {\n if (s[i] === c) {\n ans[i] = 0;\n data.push(i);\n }\n }\n\n const m = data.length;\n\n // 从左往右遍历\n let left = 0;//从左往右开始,第一个普通字符的索引\n for (let j of data) {\n while (left < n && s[left] === c) left++;\n while (left < n && s[left] !== c && left < j) {\n // console.log('处理left',left,j);\n ans[left] = Math.min(ans[left], j - left);\n left++;\n }\n }\n\n // 从右往左遍历\n let right = n - 1;// 从右往左开始,第一个普通字符的索引\n for (let i = m - 1; i >= 0; i--) {\n let j = data[i];\n while (right >= 0 && s[right] === c) right--;\n while (right >= 0 && s[right] !== c && right > j) {\n ans[right] = Math.min(ans[right], right - j);\n right--;\n }\n }\n return ans;\n };\n```\n## 思路2复杂度分析\n\n- 时间复杂度:O(n + m),n为字符串s的长度,遍历字符串s1次,遍历data两次,left、right也只是各移动一次,所以总的时间复杂度为O(n + m)。\n- 空间复杂度:O(m),m为data的长度,不考虑返回值的话,需要一个额外的长度为m的数组来保存c的位置,所以空间复杂度为O(m);考虑返回值,需要一个额外的长度为n的数组来保存结果,间复杂度为O(n)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082655797","body":"## 思路1\n这是一个典型的栈设计题,数据规模不大的情况下,按照常规操作即可。可以使用数组或链表来存储。\n## 代码1\n```javascript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.data = []\n this.maxSize = maxSize;\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if(this.data.length < this.maxSize) this.data.push(x);\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if(this.data.length === 0) return -1;\n return this.data.pop(); \n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n let n = this.data.length;\n for(let i = 0;i < k;i++){\n if(i < n) this.data[i] += val;\n else break;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n## 复杂度分析1\n* 时间复杂度:O(n*k)。n表示操作次数。插入和删除的时间复杂度都是O(1),每次increment都要遍历数组,时间复杂度是O(k);所以总的复杂度为O(n*k)。\n* 空间复杂度:O(n)。n为maxSize。\n---\n## 思路2\n如果k较大,increment是个非常耗时的操作,所以我们需要优化increment的操作。\n优化思路:increment是批量更新的,可以用差分数组来实现。但是又要支持高效的查询与删除操作,所以可以用树状数组来维护这个差分数组。\n## 代码2\n```javascript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function (maxSize) {\n this.cnt = 0;\n this.data = new Array(maxSize + 1).fill(0);\n this.maxSize = maxSize;\n};\n\n/**\n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function (x) {\n if (this.cnt === this.maxSize) return;\n this.cnt++;\n this.update(this.cnt - 1, x);\n if(this.cnt <= this.maxSize - 1) this.update(this.cnt, -x);\n //console.log('push ',x,this.data);\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function () {\n if(this.cnt === 0) return -1;\n let ans = this.query(this.cnt - 1);\n this.update(this.cnt - 1, -ans);\n if(this.cnt <= this.maxSize - 1) this.update(this.cnt,ans);\n this.cnt--;\n //console.log('pop ',ans,this.data);\n return ans;\n};\n\n/**\n * @param {number} k\n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function (k, val) {\n if(this.cnt === 0) return;\n this.update(0, val);\n let r = Math.min(k,this.maxSize,this.cnt);\n if(r <= this.maxSize - 1) this.update(r,-val);\n};\n\n\nCustomStack.prototype.query = function (i) {\n i = i + 1;\n let ans = 0;\n while (i) {\n ans += this.data[i];\n i -= this.lowbit(i);\n }\n return ans;\n}\n\nCustomStack.prototype.update = function (i, val) {\n i = i + 1;\n while (i <= this.maxSize) {\n this.data[i] += val;\n i += this.lowbit(i);\n }\n}\n\n\nCustomStack.prototype.lowbit = function (i) {\n return i & (-i);\n}\n\n/**\n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n\n```\n\n## 复杂度分析2\n* 时间复杂度:O(n*log(maxSize))。n表示操作次数。插入、删除、批量更新的时间复杂度都是O(log(maxSize));所以总的复杂度为O(n*log(maxSize))。\n* 空间复杂度:O(n)。n为maxSize。\n---\n## 思路3\n有没有保持插入,删除O(1),批量更新O(1)的算法呢?官方题解给出了一个懒删除的技巧。小伙伴们可以尝试一下。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087040795","body":"## 思路一:栈\n这是一个典型的括号匹配问题,可以用栈来解决。 \n步骤:\n1. 创建一个栈sStack,栈顶元素标示当前答案,初始元素为空字符串;\n2. 创建一个栈nStack,存储需要重复的数字k;\n3. 声明一个全局变量num,用来记录数字。遍历字符串:\n 1. 如果当前字符为数字,追加到num中;\n 2. 如果当前字符为左括号,将num压入栈nStack,将一个新的空字符串压入栈sStack,并清空num。**遇到左括号表示要开启新一轮的字符串重复过程,因此数字栈压入需要重复的数字k,字符串栈压入一个空字符串来存储本轮重复过程产生的答案**;\n 3. 如果当前字符为字母,追加到栈sStack的栈顶元素中;\n 4. 如果当前字符为右括号,取出栈sStack的栈顶元素s,取出栈nStack的栈顶元素k,s重复k次;并追加到栈sStack的栈顶元素中。**遇到右括号表示本轮重复过程结束,因此将栈sStack的栈顶元素重复k次,并追加到栈sStack的栈顶元素中,继续前一轮的重复**。\n 5. 最后栈sStack的栈顶元素即为结果。\n## 代码一\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n let sStack = [''],nStack = [],n = s.length;\n let num = 0;\n for(let i = 0;i < n;i++){\n let c = s[i];\n if(/\\d/.test(c)) num = num * 10 + Number(c);\n else if(c === '[') {\n nStack.push(num);\n num = 0;\n sStack.push('');\n }else if(/[a-z]/.test(c)){\n // console.log(sStack)\n sStack[sStack.length - 1] += c;\n }else{\n let s = sStack.pop(),k = nStack.pop();\n // console.log(s,k);\n if(s) s = s.repeat(k);\n sStack[sStack.length - 1] += s;\n // console.log(sStack)\n }\n }\n return sStack[0];\n };\n```\n## 复杂度分析一\n* 时间复杂度:O(n),其中n为字符串s的长度。\n* 空间复杂度:O(n),需要两个最长长度为n的栈保存答案及数字,其中n为字符串s的长度。\n--- \n## 思路二:递归\n括号匹配问题,一般可以用递归来解决。 \n步骤:\n1. 预处理字符串s,记录与每个“\\[”匹配的“\\]”的位置,保存至数组left中。\n> 预处理匹配括号位置是这类递归问题常见的技巧。\n2. 从左往右遍历字符串s: \n 1. 如果当前字符为字母,则将当前字符添加到结果res中;\n 2. 如果当前字符为数字,则将数字保存在变量num中;\n 3. 如果当前字符为左括号,递归调用f,处理\\[i + 1, left\\[i] - 1]的子串,得到的结果重复num次,并追加到结果res中;num清空;\n4. 返回res。\n\n## 代码二\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n let stack = [],n = s.length,left = new Array(n).fill(-1);\n for(let i = 0;i < n;i++){\n let c = s[i];\n if(c === '[') stack.push(i);\n else if(c === ']') left[stack.pop()] = i;\n }\n return f(0,n - 1);\n // -----------------------------------\n function f(l,r){\n let ans = '',num = 0;\n for(let i = l;i <= r;i++){\n let c = s[i];\n if(/\\d/.test(c)) num = num * 10 + Number(c);\n else if(c === '['){\n ans += f(i + 1,left[i] - 1).repeat(num);\n num = 0;\n i = left[i];\n }else if(/[a-z]/.test(c)) ans += c;\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析二\n* 时间复杂度:O(n),其中n为字符串s的长度。\n* 空间复杂度:O(n),即递归栈深度,最大为n,其中n为字符串s的长度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091479392","body":"## 思路\n1. 设计双栈,一个用于存放入队数据,一个用于存放出队数据。\n2. 各个操作的实现思路:\n 1. push:将数据压入pushData栈中。\n 2. pop:如果popData栈为空,则将pushData栈中的数据全部弹出并压入popData栈中。然后弹出popData栈的栈顶元素。\n 3. peek:同pop操作,最后一步返回popData栈的栈顶元素。 \n 4. empty:判断两个栈是否为空。 \n\n> js中可以用数组模拟栈。\n## 代码\n```javascript\nvar MyQueue = function() {\n this.pushData = []\n this.popData = [] \n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.pushData.push(x) \n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n if(this.popData.length === 0 && this.pushData.length) while(this.pushData.length) this.popData.push(this.pushData.pop());\n return this.popData.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if(this.popData.length === 0 && this.pushData.length) while(this.pushData.length) this.popData.push(this.pushData.pop());\n return this.popData[this.popData.length - 1];\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return this.pushData.length === 0 && this.popData.length === 0\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```\n## 复杂度分析\n- 时间复杂度:O(1):插入、删除、查找操作的均摊时间复杂度都是O(1)\n- 空间复杂度:O(n):栈的存储空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094576990","body":"## 思路\n比较容易的思路是,排序后,每个块和排序前元素的种类和数量完全相同,可以用哈希表或前缀和来求解。此思路的时间复杂度是O(n),空间复杂度是O(nlog(n))。 \n后来看了看题解,发现可以用单调栈或维护前后缀的思路来求解。\n\n### 排序块性质\n**我们要想划分最多的块,并且保证排序后的结果和原数组的排序结果相同,则块中的元素必须保证,块中的最大值都比右边的元素小或者相同,块中的最小值都比左边的元素大或者相同。**\n则我们维护一个前缀最大值和后缀最小值两个数组,只要前缀的最大值,小于等于后缀的最小值,则可划分(相当于给数组划一条线)。\n## 代码\n```javascript\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n let n = arr.length, prefixMax = new Array(n).fill(-Infinity),suffixMin = new Array(n).fill(Infinity);\n for(let i = 0;i < n;i++){\n prefixMax[i] = Math.max(i ? prefixMax[i - 1] : -Infinity,arr[i]);\n let j = n - 1 - i;\n suffixMin[j] = Math.min(j + 1 < n ? suffixMin[j + 1] : Infinity,arr[j]);\n }\n\n let ans = 1;\n for(let i = 0;i < n - 1;i++){\n if(prefixMax[i] <= suffixMin[i + 1]) ans++;\n }\n return ans\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(n)\n\n## 参考题解\n[https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solutions/1/zui-duo-neng-wan-cheng-pai-xu-de-kuai-by-z0wz/](https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solutions/1/zui-duo-neng-wan-cheng-pai-xu-de-kuai-by-z0wz/)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095130877","body":"## 思路\n旋转链表的本质上是将链表尾部k个节点移动到链表头部。按照这个思路步骤如下:\n1. 计算链表长度l;\n2. 如果 k % l === 0 或者 l === 0,即k为l的整数倍,或者链表为空,则不需要旋转,直接返回head;否则 k = k % l;\n3. 声明两个指针fast、slow,fast先移动k步;\n4. fast、slow同时移动,直到fast到达链表末尾;\n5. 此时:\n 1. slow的下一个节点即为新的头结点\n 2. slow.next 指向 null\n 3. fast.next 指向 head\n 4. 返回新的头结点\n\n## JavaScript代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n if(!head || k === 0) return head;\n let l = 0,curr = head;\n while(curr){\n l++;\n curr = curr.next;\n }\n k = k % l;\n if(k === 0) return head;\n let fast = head,slow = head;\n while(k){\n fast = fast.next;\n k--;\n }\n\n while(fast.next){\n fast = fast.next;\n slow = slow.next;\n }\n\n let newHead = slow.next;\n slow.next = null;\n fast.next = head;\n return newHead;\n\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中n为链表的长度。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100439586","body":"## 思路\n因为是两两交换,所以可以声明四个指针记录涉及到交换的节点,修改相关指针的next指向即可。具体步骤如下:\n1. 特判:链表为空或链表只有一个节点,直接返回原链表。\n2. 为了简化代码,声明一个哨兵节点dummy,dummy.next = head,方便统一处理。\n3. 声明指针prev,指向前一次交换后的结束节点;声明指针curr,指向本次交换的开始节点。初始值prev = dummy,curr = head,开始循环:\n 1. 循环终止条件:curr为空或者curr的下一个节点为空(即curr没有可以交换的节点了)。\n 2. 声明next指针,next = curr.next;声明nextCurr指针,nextCurr = curr.next.next;\n 3. 两两交换:curr.next = nextCurr,next.next = curr;\n 4. 重新设置头尾指向,确保下一轮循环正确执行:prev.next = next;\n 5. 重新设置prev,curr:prev = curr; curr = nextCurr;继续循环,直到循环终止条件。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n if(!head || !head.next) return head;\n const dummy = new ListNode();\n dummy.next = head;\n \n let prev = dummy,curr = dummy.next;\n while(curr && curr.next){\n let next = curr.next,nextCurr = next.next;\n curr.next = nextCurr;\n next.next = curr;\n \n prev.next = next;\n\n prev = curr;\n curr = curr.next;\n }\n\n return dummy.next;\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是链表的长度。\n- 空间复杂度:O(1),仅使用有限个指针。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105520636","body":"## 思路\n* 本题目标是将一个有序单链表(升序排列)转换为一棵高度平衡的二叉搜索树(Height Balanced Binary Search Tree)。\n* 核心思想是使用递归方式构建树,每次选择链表的中间节点作为当前子树的根节点,以保证左右子树的高度差不超过 1。\n* 利用快慢指针(slow 和 fast)找到链表的中间节点,并将链表分割为左子链表和右子链表,分别递归构建左右子树。\n* 实现步骤如下:\n 1. 递归终止条件:\n * 如果链表为空(!head),返回 null。\n * 如果只有一个节点(!head.next),直接构建一个 TreeNode 返回。\n 2. 寻找中间节点:\n * 使用快慢指针法,fast 每次走两步,slow 每次走一步,当 fast 到达末尾时,slow 正好指向中间节点。使用一个临时变量 prev 记录 slow 的前一个节点,方便后续断开连接。\n 3. 分割链表:\n * 将 slow 前面的节点作为左子链表,断开连接。\n * slow.next 作为右子链表继续递归处理。\n 4. 构建树节点:\n * 当前 slow.val 作为根节点,递归构建左右子树。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if(!head) return head;\n // display(head)\n if(!head.next) return new TreeNode(head.val);\n\n // 寻找中间节点\n let slow = head,fast = head,prev = null;\n while(fast.next && fast.next.next){\n fast = fast.next.next;\n prev = slow;\n slow = slow.next;\n }\n // 此时,slow是中间节点,slow.next是右子树的根\n let next = slow.next;\n if(prev) prev.next = null;\n slow.next = null;\n\n const root = new TreeNode(slow.val);\n root.left = sortedListToBST(prev ? head : null);\n root.right = sortedListToBST(next);\n return root;\n};\n\nfunction display(head){\n let ans = [],p = head;\n while(p){\n ans.push(p.val);\n p = p.next;\n }\n console.log('处理的树:',ans)\n}\n```\n## 复杂度分析\n* 时间复杂度:O(n log n)\n * 每一层递归都需要遍历链表的一半来找中间节点(O(n)),递归深度为 log n,因此总时间复杂度为 O(n log n)。\n* 空间复杂度:O(log n)\n * 主要是递归调用栈的空间,取决于树的高度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111762311","body":"## 思路\n- 定义两个指针 `pA` 和 `pB`,分别从 `headA` 和 `headB` 开始遍历。\n- 当 `pA` 和 `pB` 不相遇时,它们会继续向前移动:\n - 如果 `pA` 到达末尾 (`null`),则跳转到 `headB`。\n - 如果 `pB` 到达末尾 (`null`),则跳转到 `headA`。\n- 这样,两个指针最终会在相交点相遇,或者同时到达末尾 (`null`),从而退出循环。\n- 返回 `pA`,即相交节点或 `null`。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function (headA, headB) {\n let pA = headA, pB = headB;\n while (pA !== pB) {\n pA = pA ? pA.next : headB;\n pB = pB ? pB.next : headA;\n }\n return pA;\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n + m),其中 n 和 m 分别为链表 headA 和 headB 的长度。\n- 空间复杂度:O(1),只使用了两个指针变量,没有额外的空间。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116200386","body":"## 思路\n- 首先处理边界情况:如果head为空,直接返回\n- 快慢指针同时遍历链表,快指针每次走两步,慢指针每次走一步\n- 当两指针相遇时停止第一阶段\n- 如果fast为null,说明无环,返回null\n- 将slow重置为head,两个指针以相同速度继续移动直到相遇\n- 相遇点即为环的起始节点\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n if(!head) return head;\n let slow = head,fast = head;\n while(fast){\n fast = fast.next;\n if(fast) fast = fast.next;\n\n slow = slow.next;\n\n if(slow === fast) break;\n }\n\n if(!fast) return fast;\n\n slow = head;\n\n while(slow !== fast){\n slow = slow.next;\n fast = fast.next;\n }\n\n return slow\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3125594702","body":"## LRU Cache 算法思路分析\n\nLRU (Least Recently Used) 缓存是一种常用的缓存淘汰策略,当缓存满时,会优先淘汰最近最少使用的元素。\n\n### 核心数据结构\n\n1. **双向链表**:维护元素的访问顺序,头部是最近最少使用的元素,尾部是最近使用的元素\n2. **哈希表(Map)**:提供O(1)时间复杂度的元素查找\n\n### 主要操作实现\n\n#### 1. 初始化\n- 设置缓存容量\n- 初始化当前元素计数器\n- 创建哈希表存储键值对\n- 创建虚拟头节点和尾节点,方便操作\n\n#### 2. 获取元素get\n- 如果元素不存在,返回-1\n- 如果元素存在:\n - 将该节点从当前位置删除\n - 将该节点插入到链表尾部(标记为最近使用)\n - 返回节点值\n\n#### 3. 插入/更新元素put\n- **新元素插入**:\n - 如果缓存已满,删除链表头部节点(最近最少使用的元素)\n - 创建新节点并添加到哈希表\n - 将新节点插入链表尾部\n- **更新元素**:\n - 更新节点值\n - 将节点从当前位置删除并移到链表尾部\n\n#### 4. 辅助方法\n- insertToTail:将节点插入链表尾部\n- deleteFromHead:删除链表头部节点\n- deleteNode:删除指定节点\n\n## 代码\n```javascript\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.cnt = 0;\n this.map = new Map();\n this.head = new DoubleNode();\n this.tail = new DoubleNode();\n this.head.next = this.tail;\n this.tail.prev = this.head; \n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n // console.log('get',key)\n \n if(this.map.has(key) === false) return -1;\n let node = this.map.get(key);\n\n this.deleteNode(node);\n \n this.insertToTail(node);\n // this.map.set(key,node);\n \n // this.display();\n\n return node.val;\n};\n\n/** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\nLRUCache.prototype.put = function(key, value) {\n if(this.map.has(key) === false){// 插入操作\n let node = new DoubleNode(key,value);\n if(this.cnt === this.capacity) this.deleteFromHead(); \n else this.cnt++\n this.map.set(key,node);\n this.insertToTail(node);\n }else{\n let node = this.map.get(key);\n node.val = value;\n\n this.deleteNode(node);\n\n this.insertToTail(node);\n // this.map.set(key,node);\n }\n\n // console.log('put',key,value);\n // this.display();\n};\n\nLRUCache.prototype.insertToTail = function(node){\n let prev = this.tail.prev;\n \n prev.next = node;\n node.next = this.tail;\n \n this.tail.prev = node;\n node.prev = prev;\n}\n\nLRUCache.prototype.deleteFromHead = function(){\n let node = this.head.next;\n let next = node.next;\n \n this.head.next = next;\n next.prev = this.head;\n\n this.map.delete(node.key);\n}\n\nLRUCache.prototype.deleteNode = function(node){\n let prev = node.prev,next = node.next;\n prev.next = next;\n next.prev = prev;\n\n node.prev = null;\n node.next = null;\n\n // this.map.delete(node.key);\n}\n\nLRUCache.prototype.display = function(){\n let k = this.cnt,p = this.head.next;\n let ans = []\n while(k){\n ans.push(p.key + '=>' + p.val);\n k--;\n p = p.next;\n }\n console.log(ans);\n}\n\nfunction DoubleNode(key,val){\n this.key = key;\n this.val = val;\n this.next = null;\n this.prev = null;\n}\n\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```\n## 复杂度分析\n### 时间复杂度\n- get操作:O(1)\n- put操作:O(1)\n\n### 空间复杂度\n- O(capacity),需要存储最多capacity个元素\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123739061","body":"## 思路\n\n使用了递归的思想来解决问题:\n\n1. **基础情况(Base Case)**:如果当前节点为空(`!root`),则返回深度0,因为空节点没有深度。\n\n2. **递归关系(Recursive Relation)**:\n - 分别计算左子树和右子树的最大深度:`maxDepth(root.left)` 和 `maxDepth(root.right)`\n - 取两者中的较大值:`Math.max(maxDepth(root.left), maxDepth(root.right))`\n - 加上当前节点的1层高度:`+1`\n\n### 算法执行过程\n\n1. 对于任意节点,先递归计算其左子树的最大深度\n2. 再递归计算其右子树的最大深度\n3. 比较左右子树的深度,取较大值\n4. 将较大值加1(代表当前节点所在的层),作为以当前节点为根的子树的最大深度\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if(!root) return 0;\n return Math.max(maxDepth(root.left),maxDepth(root.right))+1;\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n),其中n是二叉树的节点数。因为需要遍历每个节点一次。\n- **空间复杂度**:O(h),其中h是二叉树的高度。这是由于递归调用栈的深度,最坏情况下(完全不平衡的树)可能达到O(n),最好情况下(完全平衡的树)为O(log n)。\n\n这是一个典型的分治算法应用,将问题分解为更小的子问题(左右子树的深度),然后合并结果得到最终答案。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125568669","body":"## 代码思路分析\n\n这是一个经典的二叉树递归问题,采用深度优先搜索(DFS)的方式解决:\n\n1. **基本情况处理**:\n - 如果两个节点都为null,则认为相同,返回true\n - 如果其中一个节点为null,另一个不是,则不同,返回false\n\n2. **递归比较**:\n - 比较当前节点的值是否相等\n - 递归比较左子树是否相同\n - 递归比较右子树是否相同\n - 只有当值相等且左右子树都相同时,才返回true\n\n## 代码实现\n\n```javascript\nvar isSameTree = function(p, q) {\n // 如果两个节点都为空,则相同\n if(p===null && q===null) return true;\n // 如果只有一个节点为空,则不同\n if(p===null) return false;\n if(q===null) return false;\n // 比较当前节点值,并递归比较左右子树\n return p.val===q.val && isSameTree(p.left,q.left) && isSameTree(p.right,q.right);\n};\n```\n\n\n## 复杂度分析\n\n- **时间复杂度**:O(min(m,n)),其中m和n分别是两个二叉树的节点数。在最坏情况下,需要遍历两个树中所有节点。\n- **空间复杂度**:O(min(m,n)),递归调用的层数最多为较小树的高度,最坏情况下为O(min(m,n))。\n\n这个算法通过递归方式同时遍历两棵树的相同位置节点,并比较它们的值是否相等,从而判断两棵树是否完全相同。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130348089","body":"## 思路\n\n### 核心思路\n- 使用深度优先搜索(DFS)遍历二叉树\n- 在遍历过程中维护从根节点到当前节点形成的数字\n- 当到达叶节点时,将形成的数字加到结果中\n\n### 具体实现\n\n1. **函数定义与参数**:\n - `sumNumbers(root, prev = 0)` 接收当前节点 `root` 和之前形成的数字 `prev`\n - `prev` 参数有默认值 0,用于累积从根到当前节点的数字\n\n2. **边界条件处理**:\n ```javascript\n if(!root) return 0;\n ```\n\n - 如果当前节点为空,返回 0\n\n3. **数字累积**:\n ```javascript\n prev = prev * 10 + root.val;\n ```\n\n - 将当前节点值添加到路径数字中\n - 通过 `prev * 10 + root.val` 实现数字的逐位构建\n\n4. **叶节点判断**:\n ```javascript\n if(!root.left && !root.right) return prev;\n ```\n\n - 如果当前节点是叶节点(无左右子节点),返回累积的数字\n\n5. **递归处理**:\n ```javascript\n return sumNumbers(root.left,prev) + sumNumbers(root.right,prev);\n ```\n\n - 分别递归处理左右子树\n - 将左右子树的结果相加返回\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root,prev = 0) {\n if(!root) return 0;\n prev = prev * 10 + root.val;\n if(!root.left && !root.right) return prev;\n return sumNumbers(root.left,prev) + sumNumbers(root.right,prev);\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n),其中 n 是二叉树的节点数,需要遍历每个节点一次\n- **空间复杂度**:O(h),其中 h 是二叉树的高度,主要是递归调用栈的空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134622736","body":"## 思路\n\n### 1. 核心思想\n使用深度优先搜索(DFS)遍历二叉树,记录每一层最左边的节点值。\n\n### 2. 关键实现点\n\n- **层级记录**:通过 `level` 参数跟踪当前节点所在的层级\n- **每层只记录一次**:利用 `level === left.length` 条件确保每层只记录第一个访问的节点值\n- **先左后右遍历**:先遍历左子树再遍历右子树,保证每层第一个访问的是最左边的节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let left = [];\n dfs(root,0)\n return left[left.length - 1];\n // ----------------------\n function dfs(root,level){\n if(!root) return;\n if(level === left.length) left.push(root.val);\n dfs(root.left,level + 1);\n dfs(root.right,level + 1);\n }\n};\n```\n## 优化后的代码\n优化思路:没必要用数组保存整个左侧值,只需要记录左侧值第一次出现即可\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let left = 0,ans;\n dfs(root,0)\n return ans;\n // ----------------------\n function dfs(root,level){\n if(!root) return;\n if(level === left) {\n left++;\n ans = root.val;\n }\n dfs(root.left,level + 1);\n dfs(root.right,level + 1);\n }\n};\n```\n\n\n## 复杂度分析\n- **时间复杂度**:O(n),其中 n 是二叉树的节点数,需要遍历每个节点一次\n- **空间复杂度**:O(h),其中 h 是二叉树的高度,主要是递归调用栈的空间开销","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138308014","body":"## 思路\n\n### 1. 序列化 (`serialize`)\n- 使用前序遍历(根-左-右)遍历二叉树\n- 对于每个节点:\n - 如果节点为空,将 `null` 添加到结果数组\n - 如果节点不为空,将节点值添加到结果数组,然后递归处理左右子树\n- 最后将数组转换为 JSON 字符串返回\n\n### 2. 反序列化 (`deserialize`)\n- 将 JSON 字符串解析为数组\n- 使用递归方式重建二叉树:\n - 按顺序读取数组元素\n - 如果当前元素是 `null`,返回 `null`\n - 如果当前元素不是 `null`,创建新节点,并递归构建左右子树\n - 利用前序遍历的特点,按顺序处理就能重建原来的树结构\n\n## 关键特点\n\n1. **前序遍历**:保证了根节点在子节点之前被处理,便于重建时确定父子关系\n2. **空节点标记**:用 `null` 标记空节点,确保能完全还原树的结构\n3. **递归实现**:两个函数都使用递归方式实现,代码简洁清晰\n\n## 示例说明\n\n假设有一棵二叉树:\n```\n 1\n / \\\n 2 3\n / \\\n 4 5\n```\n\n\n- 序列化结果:`[1,2,null,null,3,4,null,null,5,null,null]`\n- 反序列化时按此顺序重建树结构\n\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n let ans = [];\n dfs(root);\n return JSON.stringify(ans);\n // -----------------\n function dfs(root){\n if(!root){\n ans.push(null);\n return;\n }\n ans.push(root.val);\n dfs(root.left);\n dfs(root.right);\n }\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n let arr = JSON.parse(data),i = 0;\n //console.log(arr);\n return dfs();\n // if(arr.length === 0) return null;\n // ---------------------\n function dfs(){\n let node;\n // console.log(i,arr[i]);\n if(arr[i] === null) node = null;\n else node = new TreeNode(arr[i]);\n i++;\n if(node) {\n node.left = dfs();\n node.right = dfs();\n }\n return node;\n }\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```\n\n## 复杂度分析\n- 时间复杂度:序列化和反序列化的时间复杂度都是 O(n),其中 n 是二叉树的节点数。\n- 空间复杂度:考虑到返回值的话,序列化和反序列化的空间复杂度都是 O(n),其中 n 是二叉树的节点数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3141895435","body":"## 思路\n\n### 具体实现步骤\n\n1. **数据结构选择**\n - 使用一个大小为2001的数组 cols 每个元素是一个优先队列 `PriorityQueue`\n - 优先队列用于处理同一列中节点的排序问题\n\n2. **排序规则**\n - 主要按行号 row 排序(上到下)\n - 行号相同时按节点值 `node.val` 排序\n\n3. **DFS遍历**\n - 通过 dfs 函数遍历整个二叉树\n - 将每个节点按其列号存入对应的优先队列中\n - 列号通过 `col + 1000` 映射到数组索引,处理负数列号\n\n4. **结果构建**\n - 遍历 cols 数组,跳过空队列\n - 从每个非空队列中依次取出元素,构建每列的结果\n - 按列顺序组合成最终结果\n\n## 关键点\n\n- **坐标系统**:以根节点为原点(0,0),向左列号减1,向右列号加1,向下行号加1\n- **偏移处理**:通过 `col + 1000` 将可能的负数列号映射到正数索引\n- **排序逻辑**:同一位置优先按行排序,其次按值排序\n\n这种方法确保了垂直遍历的正确顺序。\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n let cols = new Array(2000 + 1).fill(0).map(()=>new PriorityQueue((a,b)=>{\n if(a[0] !== b[0]) return a[0] - b[0];\n return a[2] - b[2];\n }));\n\n dfs(root,0,0);\n let ans = [];\n for(let i = 0;i <= 2000;i++){\n let data = cols[i];\n if(data.size() === 0) continue;\n let temp = []\n while(data.size()) temp.push(data.dequeue()[2]);\n ans.push(temp);\n }\n return ans;\n\n // --------------------------------\n function dfs(node,row,col){\n if(!node) return;\n cols[col + 1000].enqueue([row,col,node.val]);\n dfs(node.left,row + 1,col - 1);\n dfs(node.right,row + 1,col + 1);\n }\n \n};\n```\n\n## 复杂度分析\n\n### 时间复杂度\n\n1. **初始化阶段**\n - 创建大小为2001的数组并初始化优先队列:O(2001) = O(1)\n\n2. **DFS遍历阶段**\n - 对每个节点执行一次 dfs 调用\n - 假设树有 N 个节点,则 DFS 总共执行 N 次\n - 每次 enqueue 操作在优先队列中的时间复杂度为 O(log M),其中 M 是队列中元素个数\n - 最坏情况下,所有节点都在同一列,M 最大为 N\n - 因此 DFS 阶段时间复杂度为 O(N log N)\n\n3. **结果构建阶段**\n - 遍历2001个位置的数组:O(2001) = O(1)\n - 从优先队列中 dequeue 所有元素:每个元素 dequeue 一次,总共 N 个元素\n - 每次 dequeue 操作为 O(log M)\n - 总时间复杂度为 O(N log N)\n\n**总时间复杂度:O(N log N)**,其中 N 是二叉树中节点的数量\n\n### 空间复杂度\n\n1. **存储结构**\n - cols 数组:大小固定为 2001,每个元素是一个优先队列\n - 所有优先队列总共存储 N 个节点信息:O(N)\n - 每个节点信息是一个包含3个元素的数组:O(1) 每节点\n\n2. **递归调用栈**\n - dfs 函数的递归深度最多为树的高度 H\n - 在最坏情况下(树退化为链表),H = N\n - 平均情况下,对于平衡二叉树,H = log N\n\n3. **结果数组**\n - ans 数组存储最终结果:O(N)\n\n**总空间复杂度:O(N)**,其中 N 是二叉树中节点的数量\n\n### 总结\n\n- **时间复杂度:O(N log N)**\n- **空间复杂度:O(N)**\n\n其中 N 为二叉树的节点总数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146457266","body":"## 思路:\n\n1. **使用哈希表存储已遍历元素**:\n - 创建一个空对象 [map](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\454\\2.js#L5-L5) 作为哈希表\n - 用于存储已经遍历过的元素值和其对应的索引\n\n2. **一次遍历查找**:\n - 遍历数组中的每个元素 `nums[i]`,记为 [a](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\1.js#L14-L14)\n - 计算目标差值 `b = target - a`\n - 检查 `b` 是否已经在哈希表中存在\n - 如果存在,说明找到了两个数,它们的和等于目标值,直接返回这两个数的索引 `[map[b], i]`\n - 如果不存在,将当前元素 [a](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\1.js#L14-L14) 和它的索引 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 存入哈希表,继续遍历\n\n### 算法优势:\n1. **时间复杂度优化**:从暴力解法的 O(n²) 降低到 O(n)\n2. **空间换时间**:使用额外的哈希表存储,换取查找时间的优化\n3. **一次遍历**:只需要遍历一次数组就能得到结果\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n let map = {}\n for(let i = 0;i < nums.length;i++){\n let a = nums[i],b = target - a;\n if(map[b] !== undefined) return [map[b],i];\n map[a] = i;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是数组的长度。\n- 空间复杂度:O(n),哈希表 map 的大小为 n。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3146924002","body":"## 思路\n### 主要步骤:\n\n1. **统计频次**:使用 [map](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题04.01.节点间通路/main.js#L13-L13) 对象统计每个数字在数组中出现的频次\n ```javascript\n let map = {};\n for(let i of nums) map[i] = (map[i] || 0) + 1;\n ```\n\n\n2. **维护大小为 K 的最小堆**:使用最小堆来保存频率最高的 K 个元素\n ```javascript\n let q = new MinPriorityQueue(v=>v[1]); // 基于元素出现频次的优先队列\n ```\n\n\n遍历统计结果,将元素和其频次作为数组加入堆中,当堆的大小超过 K 时,移除堆顶(即当前堆中频次最低的元素):\n ```javascript\n for(let key in map){\n q.enqueue([+key,map[key]]);\n if(q.size() > k) q.dequeue();\n }\n ```\n\n\n3. **构建结果数组**:依次从堆中取出元素,因为是最小堆,所以频次低的先出堆,最终得到的就是频次最高的 K 个元素\n ```javascript\n let ans = [];\n while(q.size()){\n ans.push(q.dequeue()[0]);\n }\n ```\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function(nums, k) {\n let q = new MinPriorityQueue(v=>v[1]);\n let map = {};\n for(let i of nums) map[i] = (map[i] || 0) + 1;\n for(let key in map){\n q.enqueue([+key,map[key]]);\n if(q.size() > k) q.dequeue();\n } \n let ans = [];\n while(q.size()){\n ans.push(q.dequeue()[0]);\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(N log K),其中 N 是数组的长度\n- 空间复杂度:O(N),用于存储频次映射表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148902680","body":"## 思路\n\n### 1. 数据结构选择\n- 使用 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 数组存储每个点到其他点的距离统计\n- `map[i]` 是一个 Map,记录第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 个点到其他各点的距离及出现次数\n\n### 2. 核心逻辑\n- **距离计算**:遍历所有点对,计算两点间距离的平方(避免开根号运算)\n- **距离统计**:将每对点的距离信息分别记录到两个点的统计中\n- **结果计算**:对于每个点,如果到其他点有相同距离的点超过1个,则可以组成回旋镖\n\n### 3. 关键步骤详解\n\n```javascript\n// 计算两点间距离的平方\nfunction calc(i,j){\n let a = Math.abs(points[i][0] - points[j][0]),b = Math.abs(points[i][1] - points[j][1]);\n return a * a + b * b;\n}\n```\n这段代码计算两个点之间的欧几里得距离的平方,使用平方避免浮点运算。\n\n```javascript\n// 统计每个点到其他点的距离\nfunction addMap(i,dis){\n let m = map[i];\n m.set(dis,(m.get(dis) || 0) + 1);\n}\n```\n将距离信息记录到对应点的统计Map中。\n\n### 4. 结果计算原理\n\n对于每个点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6),如果存在 `v` 个点与它距离相同(`v>1`),则可以从这 `v` 个点中选择 2 个点与点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 组成回旋镖,选择方式有 `v*(v-1)` 种。\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} points\n * @return {number}\n */\nvar numberOfBoomerangs = function(points) {\n let n = points.length;\n if(n < 3) return 0;\n let map = new Array(n).fill(0).map(()=>new Map());\n for(let i = 0;i < n;i++){\n for(let j = i + 1;j < n;j++){\n let dis = calc(i,j);\n addMap(i,dis);\n addMap(j,dis);\n }\n }\n let ans = 0;\n for(let i = 0;i < n;i++){\n for(let [k,v] of map[i]){\n if(v <= 1) continue;\n ans += v * (v - 1);\n }\n }\n\n return ans;\n\n \n\n\n // ------------------------------\n function calc(i,j){\n let a = Math.abs(points[i][0] - points[j][0]),b = Math.abs(points[i][1] - points[j][1]);\n return a * a + b * b;\n }\n\n function addMap(i,dis){\n let m = map[i];\n m.set(dis,(m.get(dis) || 0) + 1);\n\n }\n};\n```\n\n## 算法复杂度\n- 时间复杂度:O(n²)\n- 空间复杂度:O(n²)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3152979976","body":"## 思路\n\n### 核心思想\n使用**滑动窗口**(Sliding Window)技术配合**哈希表**来解决这个问题。\n\n### 关键变量说明\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31): 滑动窗口的左边界\n- [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6): 滑动窗口的右边界(循环变量)\n- [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5): 用于记录窗口内每个字符出现的次数\n- `ans`: 记录最长无重复子串的长度\n\n### 算法步骤\n\n1. **初始化**:设置左边界 `l = 0`,创建字符计数的 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5),初始化结果 `ans = 0`\n\n2. **扩展窗口**:使用 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 从左到右遍历字符串,逐步扩展窗口右边界\n\n3. **处理重复字符**:\n - 当遇到重复字符时(`map.has(c)` 为 true),不断右移左边界 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31)\n - 移动过程中减少对应字符的计数,如果计数为0则从 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 中删除\n - 直到窗口中不再包含当前字符为止\n\n4. **更新结果**:\n - 计算当前窗口长度 `i - l + 1`\n - 与历史最大值比较,更新 `ans`\n\n5. **维护窗口状态**:将当前字符加入 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 并增加其计数\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n let l = 0, map = new Map(),n = s.length,ans = 0;\n for(let i = 0;i < n;i++){\n let c = s[i]\n while(map.has(c)){\n map.set(s[l],map.get(s[l]) - 1);\n if(map.get(s[l]) === 0) map.delete(s[l]);\n l++;\n }\n // console.log(l,i,s.slice(l,i + 1));\n ans = Math.max(i - l + 1,ans);\n map.set(c,(map.get(c) || 0 ) + 1)\n }\n return ans;\n};\n```\n\n\n## 复杂度分析\n- **时间复杂度**: O(n),其中 n 是字符串长度,每个字符最多被访问两次\n- **空间复杂度**: O(min(m,n)),其中 m 是字符集大小","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3157255368","body":"## 思路\n\n### 1. 建立单词频次映射\n```javascript\nlet map = new Map();\nwords.forEach((word,i)=>{\n map.set(word,(map.get(word) || 0) + 1);\n});\n```\n\n- 使用 `Map` 统计 `words` 数组中每个单词的出现次数\n- 处理 `words` 中可能存在重复单词的情况\n\n### 2. 初始化参数\n```javascript\nlet n = s.length,m = words.length,k = words[0].length,l = k * m;\n```\n\n- [n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6): 字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- `m`: 单词数组的长度\n- `k`: 每个单词的长度(题目保证所有单词等长)\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31): 所有单词连接后的总长度\n\n### 3. 遍历可能的起始位置\n```javascript\nfor(let i = 0;i <= n - l;i++){}\n```\n\n- 只需检查到 `n - l` 位置,因为更后面不可能容纳完整的连接串\n\n### 4. 检查每个窗口\n```javascript\nlet j = i,result = new Map(),total = 0;\nwhile(j < i + l){\n let c = s.slice(j,j + k);\n if(map.has(c) === false) break;\n let found = false;\n result.set(c,(result.get(c) || 0) + 1);\n if(result.get(c) <= map.get(c)) found = true;\n if(found === false) break;\n j += k;\n total++;\n}\n```\n\n- 从位置 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 开始,每次取长度为 `k` 的子串进行匹配\n- 使用 `result` 记录当前窗口中各单词的出现次数\n- 如果遇到不在 `words` 中的单词或某个单词出现次数超过要求,则提前终止\n- `total` 记录成功匹配的单词数\n\n### 5. 判断结果\n```javascript\nif(total === m) ans.push(i);\n```\n\n- 当成功匹配的单词数等于 `words` 长度时,说明找到了一个有效子串\n\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n let map = new Map();\n words.forEach((word,i)=>{\n map.set(word,(map.get(word) || 0) + 1);\n });\n let n = s.length,m = words.length,k = words[0].length,l = k * m;\n if(n < l) return [];\n let ans = [];\n for(let i = 0;i <= n - l;i++){\n let j = i,result = new Map(),total = 0;\n while(j < i + l){\n // console.log('check',s.slice(i,i + m * k));\n let c = s.slice(j,j + k);\n if(map.has(c) === false) break;\n let found = false;\n result.set(c,(result.get(c) || 0) + 1);\n if(result.get(c) <= map.get(c)) found = true;\n if(found === false) break;\n j += k;\n total++;\n }\n if(total === m) ans.push(i); \n }\n return ans;\n};\n```\n## 复杂度分析\n### 时间复杂度\n- 外层循环: O(n - l)\n- 内层循环: O(m)\n- 总体复杂度: O((n - l) × m)\n### 空间复杂度\nO(n):存储单词频次映射和结果数组\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162347437","body":"## 思路\n\n使用前缀和 + 哈希表的方法,基于以下数学原理:\n\n1. 如果总和 `totalSum % p = delta`,我们需要找到一个子数组,其和模 `p` 也等于 `delta`\n2. 这样删除该子数组后,剩余元素和就能被 `p` 整除\n\n## 代码步骤分析\n\n### 1. 前缀和计算\n```javascript\nlet n = nums.length, sum = new Array(n + 1).fill(0);\nfor(let i = 0; i < n; i++) sum[i + 1] = sum[i] + nums[i];\n```\n\n- 构建前缀和数组 `sum`,其中 `sum[i]` 表示前 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 个元素的和\n- `sum[0] = 0`,`sum[i] = nums[0] + nums[1] + ... + nums[i-1]`\n\n### 2. 计算目标余数\n```javascript\nlet delta = sum[n] % p;\nif(delta === 0) return 0;\n```\n\n- `sum[n]` 是所有元素的总和\n- `delta` 是总和对 `p` 的余数\n- 如果 `delta` 为 0,说明总和已能被 `p` 整除,返回 0\n\n### 3. 寻找最短子数组\n```javascript\nlet ans = Infinity;\nlet map = new Map();\nfor(let i = 0; i <= n; i++){\n let b = sum[i], a = (b % p - delta % p + p) % p;\n map.set(b % p, i);\n if(map.has(a)) ans = Math.min(ans, i - map.get(a));\n}\n```\n\n\n关键数学关系:\n- 对于子数组 `nums[j...i-1]`,其和为 `sum[i] - sum[j]`\n- 我们希望 `(sum[i] - sum[j]) % p = delta`\n- 即 `sum[i] % p = (sum[j] + delta) % p`\n- 变形得:`sum[j] % p = (sum[i] % p - delta) % p`\n\n具体实现:\n- `b = sum[i]`:当前前缀和\n- `a = (b % p - delta % p + p) % p`:需要找到的前缀和余数\n- 用 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 记录每个余数值最后一次出现的位置\n- 如果找到对应的余数 [a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27),则更新最短长度\n\n### 4. 返回结果\n```javascript\nreturn ans === n ? -1 : ans;\n```\n\n- 如果最短长度等于数组长度,说明需要删除整个数组,返回 -1\n- 否则返回找到的最短子数组长度\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar minSubarray = function(nums, p) {\n let n = nums.length,sum = new Array(n + 1).fill(0);\n for(let i = 0;i < n;i++) sum[i + 1] = sum[i] + (nums[i]);\n // p = BigInt(p);\n let delta = sum[n] % p;\n if(delta === 0) return 0;\n let ans = Infinity;\n let map = new Map();\n for(let i = 0;i <= n;i++){\n let b = sum[i],a = (b % p - delta % p + p) % p;\n map.set(b % p,i);\n if(map.has(a)) ans = Math.min(ans,i - map.get(a));\n }\n return ans === n ? -1 : ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),只需遍历一次数组\n- 空间复杂度:O(n),用于存储前缀和数组和哈希表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166424389","body":"\n## 思路\n使用了经典的**快慢指针**(龟兔赛跑)算法。\n\n1. **双指针技巧**:\n - `slow` 指针每次移动一步\n - `fast` 指针每次移动两步\n - 当 `fast` 到达链表末尾时,`slow` 正好在中间位置\n\n## 代码执行流程\n\n- **初始化**:两个指针 `slow` 和 `fast` 都指向链表头节点 [head](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题02.04.分割链表\\main.js#L50-L50)\n- **循环条件**:`while (fast && fast.next)` 确保 `fast` 可以安全地移动两步\n- **指针移动**:\n - `fast` 连续移动两步:`fast = fast.next; fast = fast.next;`\n - `slow` 移动一步:`slow = slow.next;`\n- **返回结果**:当循环结束时,`slow` 指向中间节点\n\n## 处理奇偶数节点的情况\n\n- **奇数个节点**:返回正中间的节点\n- **偶数个节点**:返回第二个中间节点(如链表有4个节点,则返回第3个节点)\n\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n let slow = head,fast = head;\n while(fast && fast.next){\n fast = fast.next;\n fast = fast.next;\n slow = slow.next;\n }\n return slow;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是链表的节点数。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169628215","body":"## 思路\n\n1. 使用双指针技术:\n - [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 指针(慢指针):指向不重复序列的最后一个元素位置\n - [i](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题08.07.无重复字符串的排列组合/main.js#L9-L22) 指针(快指针):用于遍历整个数组\n\n2. 初始化:\n - [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 从 0 开始,表示第一个元素肯定是要保留的\n - [i](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题08.07.无重复字符串的排列组合/main.js#L9-L22) 从 1 开始遍历\n\n3. 核心逻辑:\n - 当 `nums[i] > nums[r]` 时,说明找到了一个新的不重复元素\n - 此时将 [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 向前移动一位,并将 `nums[i]` 与 `nums[r]` 交换\n - 由于数组是排序的,所以只需要比较大小就能判断是否是新元素\n\n4. 返回值:\n - 返回 [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) + 1,即不重复元素的个数\n\n### 示例演示:\n\n假设数组为 [0, 0, 1, 1, 2, 2]:\n\n1. 初始:r = 0, i = 1,nums[1] = 0, nums[0] = 0,不满足 `nums[i] > nums[r]`\n2. i = 2,nums[2] = 1, nums[0] = 0,满足 `nums[2] > nums[0]`,r 变为 1,交换 nums[2] 和 nums[1]\n - 数组变为 [0, 1, 0, 1, 2, 2],r = 1\n3. i = 3,nums[3] = 1, nums[1] = 1,不满足 `nums[i] > nums[r]`\n4. i = 4,nums[4] = 2, nums[1] = 1,满足 `nums[4] > nums[1]`,r 变为 2,交换 nums[4] 和 nums[2]\n - 数组变为 [0, 1, 2, 1, 0, 2],r = 2\n5. i = 5,nums[5] = 2, nums[2] = 2,不满足 `nums[i] > nums[r]`\n6. 结束,返回 r + 1 = 3\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n let n = nums.length,r = 0;\n for(let i = 1;i < n;i++){\n if(nums[i] > nums[r]) {\n r++;\n swap(i,r);\n }\n //console.log(nums);\n }\n return r + 1;\n // ------------------------\n function swap(i,j){\n [nums[i],nums[j]] = [nums[j],nums[i]]\n }\n};\n```\n\n### 复杂度分析:\n\n- 时间复杂度:O(n),只需要遍历一次数组\n- 空间复杂度:O(1),只使用了常数级别的额外空间\n- 利用了数组已经排序的特性,通过比较大小判断是否重复\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172297646","body":"## 思路\n经典的二分查找算法,用于在有序数组中找到目标值的插入位置\n1. **初始化变量**:\n - `n`:数组长度\n - `l`:左边界,初始为0\n - `r`:右边界,初始为n-1\n - `ans`:结果位置,初始为n(表示插入到数组末尾)\n\n2. **二分查找逻辑**:\n - 使用标准二分查找模板,当`l <= r`时继续查找\n - `mid = (l + r) >> 1`:计算中间位置(相当于除以2取整)\n - 关键判断:`if(nums[mid] >= target)`\n - 如果中间元素大于等于目标值,说明目标值应该在左半部分(包括mid位置)\n - 更新`ans = mid`,并将右边界移动到`mid - 1`\n - 否则,目标值在右半部分,将左边界移动到`mid + 1`\n\n3. **返回结果**:\n - 返回找到的插入位置`ans`\n\n### 特殊情况处理\n\n- 如果target小于所有元素,ans保持为0(正确位置)\n- 如果target大于所有元素,ans保持为n(数组长度,正确位置)\n- 如果target等于某个元素,ans为该元素的索引\n- 如果target介于两个元素之间,ans为较大元素的位置\n\n这个实现非常优雅,通过一个变量ans记录可能的答案,避免了在循环外再进行额外判断,使得代码简洁且易于理解。\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let n = nums.length;\n let l = 0, r = n - 1,ans = n;\n while(l <= r){\n let mid = (l + r) >> 1;\n if(nums[mid] >= target){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n};\n```\n\n### 复杂度分析\n\n1. **时间复杂度**:O(log n),典型的二分查找时间复杂度\n2. **空间复杂度**:O(1),只使用了常数级别的额外空间\n3. **核心思想**:寻找第一个大于等于target的元素位置","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173065451","body":"## 思路\n\n这段代码使用**单调队列**(双端队列)来解决滑动窗口最大值问题,时间复杂度为 O(n)。\n\n### 实现步骤\n\n1. **数据结构选择**\n - 使用 `q` 数组作为双端队列,存储数组元素的**索引**\n - 队列中保持索引对应的值**单调递减**的特性\n\n2. **维护单调性**\n ```javascript\n while(q.length && back() < nums[i]) q.pop();\n q.push(i);\n ```\n\n - 在每次添加新元素前,移除队尾所有小于当前元素的索引\n - 这样保证队首始终是当前窗口的最大值索引\n\n3. **窗口处理**\n ```javascript\n if(i >= k - 1){\n ans.push(nums[q[0]]); // 队首即为窗口最大值\n if(i - q[0] + 1 === k) q.shift(); // 移除窗口外的元素\n }\n ```\n\n - 当达到窗口大小时开始记录结果\n - 及时移除超出窗口范围的索引\n\n### 关键技巧\n\n- 存储索引而非值,便于判断元素是否在窗口范围内\n- 利用单调性快速获取窗口最大值(队首元素)\n- 通过索引差值判断元素是否需要移出窗口\n\n### 缺陷\n在javascript中,使用数组模拟双端队列,队首出队、入队的时间复杂度均为O(n),性能较差,可以考虑手动实现一个双端队列,例如使用双向链表,优化性能。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar maxSlidingWindow = function(nums, k) {\n let q = [],n = nums.length;\n let ans = [];\n for(let i = 0;i < n;i++){\n while(q.length && back() < nums[i]) q.pop();\n q.push(i);\n if(i >= k - 1){\n ans.push(nums[q[0]]);\n if(i - q[0] + 1 === k) q.shift();\n }\n }\n return ans;\n // ------------------------\n function back(){\n return nums[q[q.length - 1]];\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是数组的长度。单调队列的维护时间复杂度为 O(n),窗口处理时间复杂度为 O(n),因此总时间复杂度为 O(n)。\n- 空间复杂度:O(n),单调队列最多存储 n 个元素,因此空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3177500710","body":"## 思路\n\n### 1. 数据结构设计\n- 使用两个数组 `ind` 和 `outd` 分别记录每个人的入度和出度\n- 数组长度为 `n+1` 是为了方便使用1到n的索引对应人编号\n\n### 2. 统计过程\n```javascript\nfor(let [a,b] of trust){\n outd[a]++; // a相信别人,出度+1\n ind[b]++; // b被别人相信,入度+1\n}\n```\n\n- 遍历信任关系数组,统计每个人的入度和出度\n\n### 3. 法官判断\n```javascript\nfor(let i = 1;i <= n;i++){\n if(outd[i] === 0 && ind[i] === n - 1) return i;\n}\n```\n\n- 遍历所有人,寻找满足条件的人:\n - `outd[i] === 0`:不相信任何人\n - `ind[i] === n - 1`:被其他所有人相信\n\n这是典型的图论中利用入度出度解决问题的方法。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n let ind = new Array(n + 1).fill(0),// 入度\n outd = new Array(n + 1).fill(0);// 出度\n for(let [a,b] of trust){\n outd[a]++;\n ind[b]++;\n }\n for(let i = 1;i <= n;i++){\n if(outd[i] === 0 && ind[i] === n - 1) return i;\n }\n return -1;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(T + N),其中T是信任关系数,N是人数\n- 空间复杂度:O(N),用于存储入度和出度数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182022991","body":"## 思路\n\n### 1. 图的构建\n- 使用邻接表`g`存储不喜欢关系\n- 对于每一对`[a,b]`,在[a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27)的邻接表中添加`b`,在`b`的邻接表中添加[a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27)\n- 这样构建出一个无向图,表示不喜欢关系\n\n### 2. 二分图判断\n- 使用染色法判断是否为二分图\n- `color`数组记录每个节点的颜色状态:\n - `0`表示未染色\n - `1`表示第一组\n - `2`表示第二组\n\n### 3. DFS遍历\n- 遍历所有节点,对未染色节点开始DFS\n- [f(i, val)](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)函数:\n - 将节点[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)染成颜色[val](file://E:\\其他项目\\algorithm_exercises\\libs\\LinkedList.js#L34-L34)\n - 遍历[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)的所有邻居节点`j`\n - 如果邻居`j`已有颜色且与[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)相同,返回`false`\n - 如果邻居`j`未染色,递归将其染成相反颜色\n - 所有情况满足则返回`true`\n\n### 4. 核心逻辑\n- 主函数中遍历所有节点,对未染色节点调用[f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)函数\n- 如果任何一次调用返回`false`,说明无法二分,返回`false`\n- 全部成功则返回`true`\n\n这是典型的二分图判定问题,通过图的遍历和染色来解决。\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nvar possibleBipartition = function(n, dislikes) {\n let g = new Array(n + 1).fill(0).map(()=>[]);\n for(let [a,b] of dislikes){\n g[a].push(b);\n g[b].push(a);\n }\n let color = new Array(n + 1).fill(0);\n for(let i = 1;i <= n;i++){\n if(color[i] === 0 && !f(i,1)) return false;\n }\n return true;\n\n // ------------------------\n function f(i,val){\n color[i] = val;\n for(let j of g[i]){\n if(color[j] && color[j] === val) return false;\n if(!color[j] && !f(j,val === 1 ? 2 : 1)) return false; \n }\n return true;\n }\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n + dislikes.length) - 线性时间复杂度\n- 空间复杂度:O(n + dislikes.length) - 主要用于存储图结构和递归栈","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186678361","body":"## 主要思路\n\n### 1. 预处理阶段\n- **处理未分配项目**:将 `group[i] === -1` 的项目分配给新的虚拟组\n- **构建组内项目映射**:建立 `groupItems` 数组,记录每个组包含的项目\n\n### 2. 构建依赖图\n- **项目依赖图** (`itemG`):记录项目间的依赖关系\n- **小组依赖图** (`groupG`):记录小组间的依赖关系\n- **计算入度**:\n - `inID`:每个项目的入度\n - `inGD`:每个小组的入度\n\n### 3. 双层拓扑排序\n- **组间拓扑排序**:先对小组进行拓扑排序\n- **组内拓扑排序**:对每个小组内的项目进行拓扑排序\n\n## 关键函数分析\n\n### 主函数流程\n```javascript\n// 初始化和构建图结构\n// ...\n\n// 组间拓扑排序\nfor(let i = 0;i <= m;i++){\n if(inGD[i] === 0) qG.enqueue(i);\n}\nwhile(qG.size()){\n let i = qG.dequeue();\n getItemsFromGroup(i); // 处理组内项目\n // 更新小组依赖\n}\n```\n\n\n### 组内拓扑排序函数 `getItemsFromGroup`\n```javascript\nfunction getItemsFromGroup(g){\n // 对特定组内的项目进行拓扑排序\n // 只处理组内依赖关系\n}\n```\n\n## 核心思想\n采用**分层拓扑排序**策略:\n1. 先确保小组间的依赖关系满足\n2. 再确保每个小组内部的项目依赖关系满足\n3. 通过双层 BFS 实现完整的排序逻辑\n\n这种解法有效地将复杂的依赖关系分解为两个相对简单的拓扑排序问题。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n for(let i = 0;i < n;i++){\n if(group[i] === -1) group[i] = m++;\n }\n\n let groupItems = new Array(m).fill(0).map(()=>[]);\n for(let i = 0;i < n;i++){\n groupItems[group[i]].push(i);\n }\n\n\n\n let itemG = new Array(n).fill(0).map(()=>[]);// 项目依赖关系建图\n let groupG = new Array(m).fill(0).map(()=>new Set());// 小组依赖关系建图\n let inID = new Array(n).fill(0);//每个项目的入度\n let inGD = new Array(m).fill(0);//每个小组的入度\n beforeItems.forEach((prevs,curr)=>{\n inID[curr] += prevs.length;\n for(let prev of prevs) {\n itemG[prev].push(curr);\n let u = group[prev],v = group[curr];\n if(u === v) continue;\n if(groupG[u].has(v)) continue;\n groupG[u].add(v);\n inGD[v]++;\n }\n });\n\n //console.log('小组依赖',groupG,groupItems);\n\n let ans = [],qG = new Queue();\n\n\n for(let i = 0;i <= m;i++){\n if(inGD[i] === 0) qG.enqueue(i);\n }\n while(qG.size()){\n let i = qG.dequeue();\n getItemsFromGroup(i);\n for(let j of groupG[i]){\n inGD[j]--;\n if(inGD[j] === 0) qG.enqueue(j);\n }\n }\n return ans.length === n ? ans : [];\n\n // ---------------------------------\n function getItemsFromGroup(g){\n let items = groupItems[g];\n let qI = new Queue();\n for(let i of items){\n if(inID[i] === 0) qI.enqueue(i);\n }\n while(qI.size()){\n let i = qI.dequeue();\n ans.push(i);\n for(let j of itemG[i]){\n inID[j]--;\n if(inID[j] === 0 && group[j] === g) qI.enqueue(j);\n }\n }\n }\n\n };\n```\n## 复杂度分析\n- **时间复杂度**:O(n + m + |beforeItems|) - 每个项目和依赖关系只被处理一次\n- **空间复杂度**:O(n + m) - 存储图结构和队列","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190382685","body":"## 思路\n没啥好说的,模拟就完了\n## 代码\n```javascript\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let x = 0,y = 0;\n for(let move of moves){\n if(move === 'U') x--;\n else if(move === 'D') x++;\n else if(move === 'L') y--;\n else y++;\n } \n return x === 0 && y === 0\n};\n```\n## 复杂度分析\n- 时间复杂度O(n)\n- 空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193453621","body":"## 思路\n\n### 主要步骤:\n\n1. **数据预处理**:\n - 将原始任务数组 [enqueueTime, processingTime] 扩展为 [enqueueTime, processingTime, index],保留原始索引信息\n - 按照入队时间(enqueueTime)对任务进行排序\n\n2. **使用优先队列**:\n - 创建一个优先队列,排序规则是:\n - 首先按处理时间(processingTime)升序排列\n - 如果处理时间相同,则按下标(index)升序排列\n\n3. **任务处理逻辑**:\n - 初始化结果数组和当前时间点(end)\n - 当还有未处理任务或优先队列不为空时:\n - 如果优先队列为空,将当前时间点更新为下一个任务的入队时间\n - 将所有在当前时间点之前或刚好到达的未处理任务加入优先队列\n - 从优先队列中取出优先级最高的任务执行\n - 更新当前时间点(加上该任务的处理时间)\n - 将该任务的原始索引加入结果数组\n\n### 关键点解释:\n\n- **优先队列的作用**:确保在可执行的任务中,总是选择处理时间最短的任务执行(最短作业优先调度算法)\n- **时间管理**:通过 [end] 变量追踪当前时间点,确保任务按时间顺序被考虑\n- **边界处理**:当优先队列为空时,直接跳转到下一个任务的入队时间,避免不必要的循环\n\n## 代码\n```javascript\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n let data = [],n = tasks.length;\n // 按任务入队时间排序,同时不丢失下标信息。\n tasks.forEach((v,i)=>data.push([...v,i])); \n data.sort((a,b)=>a[0] - b[0]);\n // 优先队列,优先级为:先按任务时长,再按下标\n let i = 0,q = new PriorityQueue((a,b)=>{\n if(a[1] !== b[1]) return a[1] - b[1];\n return a[2] - b[2];\n });\n\n let ans = [],end = 0;\n while(i < n || q.size()){\n if(q.size() === 0) end = Math.max(end,data[i][0]);\n while(i < n && data[i][0] <= end) q.enqueue(data[i++]);\n let [_,p,index] = q.dequeue();\n ans.push(index);\n end += p;\n }\n return ans;\n};\n```\n\n## 复杂度分析\n### 时间复杂度:\n- 排序:O(n log n)\n- 优先队列操作:每个任务最多入队和出队一次,每次操作 O(log n)\n- 总体复杂度:O(n log n)\n### 空间复杂度:\n- 需要一个优先队列及一个数组保存数据,空间复杂度为 O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194152066","body":"## 思路\n\n### 主要函数功能\n\n1. [numberOfRounds](file:///E:/力扣刷题/algorithm_exercises/.md#L4-L13) - 主函数,计算从登录到登出之间的完整游戏回合数\n2. [parseTime](file:///E:/力扣刷题/algorithm_exercises/.md#L16-L18) - 辅助函数,将时间字符串解析为小时和分钟\n3. [calc](file:///E:/力扣刷题/algorithm_exercises/.md#L20-L37) - 核心计算函数,计算两个时间之间的回合数\n\n### 解题思路\n\n1. **时间解析**:首先将登录时间和登出时间解析为小时和分钟的数组\n2. **跨天处理**:如果登出时间早于登录时间,说明跨越了午夜,需要在登出时间上加24小时\n3. **回合计算**:\n - 将登录时间向上取整到最近的15分钟倍数(下一回合开始时间)\n - 计算登出时间和登录时间之间的15分钟间隔数\n - 如果结果为负数,则返回0\n\n### 代码细节\n\n```javascript\n// 时间取整逻辑\nif(m1 <= 0) m1 = 0;\nelse if(m1 <= 15) m1 = 15;\nelse if(m1 <= 30) m1 = 30;\nelse if(m1 <= 45) m1 = 45;\nelse {\n m1 = 0;\n h1++;\n}\n```\n\n这个逻辑将登录时间向上取整到下一个回合开始时间(每15分钟为一个回合)。\n\n```javascript\nlet ans = Math.floor((h2 * 60 + m2 - (h1 * 60 + m1)) / 15);\n```\n这行代码计算两个时间点之间有多少个完整的15分钟时间段。\n\n## 代码\n```javascript\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n let [h1,m1] = parseTime(loginTime),[h2,m2] = parseTime(logoutTime);\n if(h1 < h2 || h1 === h2 && m1 < m2) return calc(h1,m1,h2,m2);\n return calc(h1,m1,h2 + 24,m2);\n // -------------------------\n function parseTime(time){\n return time.split(':').map(v=>Number(v));\n }\n\n function calc(h1,m1,h2,m2){\n if(m1 <= 0) m1 = 0;\n else if(m1 <= 15) m1 = 15;\n else if(m1 <= 30) m1 = 30;\n else if(m1 <= 45) m1 = 45;\n else {\n m1 = 0;\n h1++;\n }\n // console.log(h1,m1,h2,m2)\n let ans = Math.floor((h2 * 60 + m2 - (h1 * 60 + m1)) / 15);\n if(ans < 0) return 0;\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(1),因为解析时间和计算都是常数时间操作。\n- 空间复杂度:O(1),因为只使用了常数个变量。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3195140726","body":"## 思路\n\n### 主函数 `minCharacters`\n- 通过比较三种情况的最小值来得到最终答案:\n - `altb(a,b)`: 使 a 中所有字符 < b 中所有字符需要的操作数\n - `altb(b,a)`: 使 b 中所有字符 < a 中所有字符需要的操作数\n - `aeqb(a,b)`: 使两个字符串都由同一字符组成需要的操作数\n\n### 辅助函数分析\n\n1. **`altb(a,b)` 函数**\n - 遍历分割点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) (1-25,对应字符 'b'-'z')\n - 计算需要修改的字符数:\n - [a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27) 中所有 ≥ i 的字符都需要修改\n - `b` 中所有 < i 的字符都需要修改\n - 返回最小操作数\n\n2. **`aeqb(a,b)` 函数**\n - 统计两个字符串中各字符出现次数\n - 找到出现频率最高的字符\n - 将其他所有字符都修改为该字符即为最少操作数\n\n3. **`getCharValue` 函数**\n - 将字符转换为对应的数值 (a=0, b=1, ..., z=25)\n\n## 代码\n```javascript\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n return Math.min(altb(a,b),altb(b,a),aeqb(a,b));\n // --------------------------------------\n function altb(a,b){\n let ans = Infinity;\n for(let i = 1;i < 26;i++){\n let temp = 0;\n for(let c of a) if(getCharValue(c) >= i) temp++;\n for(let c of b) if(getCharValue(c) < i) temp++;\n ans = Math.min(ans,temp);\n }\n return ans;\n }\n\n function aeqb(a,b){\n let data = new Array(26).fill(0);\n for(let c of a) data[getCharValue(c)]++;\n for(let c of b) data[getCharValue(c)]++;\n let max = data.reduce((a,b)=>Math.max(a,b),0);\n return a.length + b.length - max;\n }\n\nfunction getCharValue(char){\n return char.charCodeAt(0) - 'a'.charCodeAt(0);\n }\n};\n```\n\n\n## 复杂度分析\n- 时间复杂度:O((m+n)×26) = O(m+n),其中 m 和 n 分别是字符串 a 和 b 的长度\n- 空间复杂度:O(1),只使用了固定大小的额外空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199063845","body":"## 思路\n使用**三路快排(Three-way QuickSort)**的实现,主要通过以下步骤完成排序:\n1. **选择基准值(pivot)**:使用 `viot` 函数选择一个合适的基准值\n2. **分区操作(partition)**:将数组分为三部分:小于基准值、等于基准值、大于基准值\n3. **递归排序**:对小于和大于基准值的两个子数组递归进行快排\n\n## 关键函数分析\n\n### 1. 主排序函数 `quickSort`\n```javascript\nfunction quickSort(l,r){\n if(l >= r) return;\n let i = viot(l,r); // 选择基准值位置\n if(r - l === 1) return;\n if(i !== l) swap(i,l); // 将基准值移到最左边\n let [low,up] = partition(l,r); // 三路分区\n quickSort(l,low - 1); // 递归排序小于基准值的部分\n quickSort(up + 1,r); // 递归排序大于基准值的部分\n}\n```\n\n\n### 2. 基准值选择 `viot`\n```javascript\nfunction viot(l,r){\n // 选择左、中、右三个元素作为候选\n let a = nums[l], c = nums[r];\n let mid = (l + r) >> 1, b = nums[mid];\n \n // 通过比较这三个值选择一个较优的基准值位置\n // 实现了三数取中法的思想\n}\n```\n\n\n### 3. 三路分区 [partition](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题02.04.分割链表\\main.js#L15-L48)\n```javascript\nfunction partition(i,j){\n let viot = nums[i], l = i - 1, r = j + 1;\n for(let k = i; k < r; k++){\n let c = nums[k];\n if(c > viot){\n r--;\n swap(k,r);\n k--; // 交换后需要重新检查当前位置\n }else if(c < viot){\n l++;\n swap(k,l);\n }\n // c === viot 时,元素保持在中间区域\n }\n return [l + 1, r - 1]; // 返回等于基准值的区间边界\n}\n```\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function(nums) {\n quickSort(0,nums.length - 1);\n return nums;\n // -------------------------\n function quickSort(l,r){\n if(l >= r) return;\n // console.log(l,r,nums);\n // 找基准值位置\n let i = viot(l,r);\n if(r - l === 1) return;\n if(i !== l) swap(i,l);\n // console.log('viot',nums[l]);\n let [low,up] = partition(l,r);\n // console.log(mid,nums);\n quickSort(l,low - 1);\n quickSort(up + 1,r);\n }\n\n function partition(i,j){\n let viot = nums[i],l = i - 1,r = j + 1;\n for(let k = i;k < r;k++){\n let c = nums[k];\n if(c > viot){\n r--;\n swap(k,r);\n k--;\n }else if(c < viot){\n l++;\n swap(k,l);\n }\n }\n return [l + 1,r - 1];\n }\n\n function viot(l,r){\n let a = nums[l],c = nums[r];\n if(a > c){\n swap(l,r);\n a = nums[l];\n c = nums[r];\n }\n if(r - l === 1) return;\n let mid = (l + r) >> 1,b = nums[mid];\n // if(a === c && a === b) return l;\n if(a === c) return a < b ? l : mid;\n if(b === a || b === c) return l;\n else if(b < a) return l;\n else if(b > a && b < c) return mid;\n return r;\n }\n\n function swap(l,r){\n [nums[l],nums[r]] = [nums[r],nums[l]];\n }\n };\n```\n\n## 复杂度分析\n- **三路快排**:能够很好地处理有重复元素的数组,将相等元素聚集在一起\n- **优化的基准值选择**:使用三数取中法减少最坏情况的发生\n- **原地排序**:不需要额外的存储空间\n- **时间复杂度**:平均 O(n log n),最坏 O(n²)\n- **空间复杂度**:O(log n)(递归调用栈)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204104013","body":"## 思路\n\n### 2. 初始化变量\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31):二分查找的左边界,初始值为 `0`。\n- `r`:二分查找的右边界,初始值为 `x`。\n- `ans`:用于记录当前找到的满足条件的最大整数平方根,初始值为 `0`。\n\n### 3. 二分查找过程\n- 循环条件为 `l <= r`,表示在左边界小于等于右边界时继续查找。\n- 计算中间值 `mid`:\n ```javascript\n let mid = l + ((r - l) >> 1);\n ```\n\n 这里使用了位运算 `>> 1` 来代替除以 `2` 的操作,目的是提高计算效率。\n- 判断逻辑:\n - 如果 `mid * mid <= x`,说明 `mid` 可能是答案,但还可能有更大的值满足条件,因此更新 `ans = mid` 并将左边界右移:`l = mid + 1`。\n - 否则,说明 `mid` 太大,需要将右边界左移:`r = mid - 1`。\n\n### 4. 返回结果\n- 最终返回 `ans`,即找到的满足条件的最大整数平方根。\n\n\n## 代码\n```javascript\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n let l = 0,r = x,ans = 0;\n while(l <= r){\n let mid = l + ((r - l) >> 1);\n if(mid * mid <= x){\n ans = mid\n l = mid + 1;\n }else{\n r = mid - 1;\n }\n }\n return ans;\n};\n```\n### 复杂度分析\n- 时间复杂度为 `O(log x)`,因为采用了二分查找策略。\n- 空间复杂度为 `O(1)`,只使用了常数级别的额外空间。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208885502","body":"## 思路\n\n### 1. 二分查找策略\n- 使用 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31) 和 `r` 维护搜索区间 `[1, n]`\n- 通过 `mid = l + ((r - l) >> 1)` 计算中点,避免整数溢出\n- 根据 `isBadVersion(mid)` 的结果调整搜索区间\n\n### 2. 搜索逻辑\n- 如果 `isBadVersion(mid)` 返回 `true`(当前版本是错误的):\n - 记录当前版本为候选答案 `ans = mid`\n - 在左半区间继续搜索 `r = mid - 1`\n- 如果返回 `false`(当前版本是正确的):\n - 在右半区间继续搜索 `l = mid + 1`\n\n\n\n## 代码\n```javascript\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let l = 1,r = n,ans = 1;\n while(l <= r){\n let mid = l + ((r - l) >> 1);\n if(isBadVersion(mid)){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n };\n};\n```\n## 复杂度分析\n- 时间复杂度:O(log n)\n- 空间复杂度:O(1)\n- 通过不断缩小区间范围,最终找到第一个错误版本","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3213065724","body":"## 思路\n\n1. **归并排序框架**:使用分治思想,将数组不断二分,递归处理左右两部分\n2. **关键逻辑**:在合并两个有序数组时,统计满足 `nums[i] > 2 * nums[j]` 条件的翻转对数量\n\n## 代码结构分析\n\n### 主函数 `reversePairs`\n- 初始化变量和临时数组\n- 调用 `sort` 函数进行归并排序\n- 返回统计结果 `ans`\n\n### 排序函数 `sort`\n- 标准的归并排序递归结构\n- 将数组 `[l, r]` 分为 `[l, mid]` 和 `[mid+1, r]` 两部分\n- 递归排序后调用 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 合并\n\n### 合并函数 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37)\n包含两个主要步骤:\n\n1. **统计翻转对**:\n ```javascript\n if(nums[i] / 2 > nums[j]){\n ans += mid - i + 1;\n j++;\n }else i++;\n ```\n\n - 利用左右两部分已排序的特性\n - 当 `nums[i] > 2 * nums[j]` 时,说明从 `i` 到 `mid` 的所有元素都与 `nums[j]` 构成翻转对\n\n2. **标准归并**:\n - 将两个有序数组合并为一个有序数组\n - 使用 `temp` 数组作为临时存储\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n let n = nums.length,ans = 0;\n let temp = new Array(n);\n sort(0,n - 1);\n return ans;\n // -----------------------\n function sort(l,r){\n if(l >= r) return;\n let mid = (l + r) >> 1;\n sort(l,mid);\n sort(mid + 1,r);\n merge(l,r,mid);\n }\n\n function merge(left,right,mid){\n let i = left,j = mid + 1,p = left;\n while(i <= mid && j <= right){\n if(nums[i] / 2 > nums[j]){\n ans += mid - i + 1;\n j++;\n }else i++;\n }\n\n i = left;\n j = mid + 1;\n while(i <= mid || j <= right){\n if(j > right || i <= mid && nums[i] < nums[j]) temp[p++] = nums[i++];\n else temp[p++] = nums[j++];\n }\n\n for(let i = left;i <= right;i++) nums[i] = temp[i];\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n)\n- 空间复杂度:O(n)\n- 利用归并排序过程中数组局部有序的特性,高效统计翻转对\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216251902","body":"\n## 思路\n\n1. **排序处理**:\n - 首先对供暖器数组进行排序,这样便于后续的二分查找操作。\n\n2. **边界处理**:\n - 在供暖器数组的两端分别添加`-Infinity`和`Infinity`,这样可以简化边界条件的处理,避免在查找过程中需要特殊判断边界情况。\n\n3. **核心算法**:\n - 对每个房屋,通过[egt](file:///E:/力扣刷题/algorithm_exercises/91天学算法/day40/.md#L22-L33)函数找到第一个大于等于该房屋位置的供暖器位置\n - 然后比较该房屋与前一个供暖器和后一个供暖器的距离,取较小值作为该房屋所需的最小加热半径\n - 在所有房屋所需的最小加热半径中取最大值,就是能覆盖所有房屋的最小加热半径\n\n4. **二分查找优化**:\n - [egt](file:///E:/力扣刷题/algorithm_exercises/91天学算法/day40/.md#L22-L33)函数使用二分查找来快速定位第一个大于等于目标值的供暖器位置,时间复杂度从O(n)降低到O(log n)\n\n## 具体实现细节\n\n- `heaters[j] - house`表示房屋到右边最近供暖器的距离\n- `house - heaters[i]`表示房屋到左边最近供暖器的距离\n- `Math.min(heaters[j] - house, house - heaters[i])`得到该房屋需要的最小加热半径\n- `Math.max(ans, r)`维护所有房屋中需要的最大加热半径\n\n## 代码\n```javascript\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n const compare = (a,b) => a - b;\n heaters.sort(compare);\n heaters.push(Infinity);\n heaters.unshift(-Infinity);\n let ans = -Infinity;\n for(let house of houses){\n let j = egt(house),i = j - 1;\n r = Math.min(heaters[j] - house,house - heaters[i]);\n ans = Math.max(ans,r);\n }\n return ans;\n // -------------------------\n function egt(target){\n let l = 0,r = heaters.length - 1,ans = r + 1;\n while(l <= r){\n let mid = (l + r) >> 1\n if(heaters[mid] >= target){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(mlogn + nlogn),其中m是房屋数量。排序的时间复杂度为O(nlogn),二分查找的时间复杂度为O(logn),因此总时间复杂度为O(nlogn + mlogn)。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217776735","body":"## 思路\n\n使用了**二分搜索 + 双指针**的方法来解决问题:\n\n### 1. 排序\n```javascript\nnums.sort((a,b) => a - b);\n```\n\n首先对数组进行排序,这样可以方便后续计算距离和使用双指针技巧。\n\n### 2. 二分搜索框架\n```javascript\nlet n = nums.length;\nlet r = nums[n - 1] - nums[0], l = 0, ans = 0;\nwhile(l <= r){\n let mid = (l + r) >> 1;\n let cnt = calc(mid);\n if(cnt >= k){\n ans = mid;\n r = mid - 1;\n } else {\n l = mid + 1;\n }\n}\n```\n\n这里使用二分搜索来查找第k小的距离:\n- 搜索范围是 `[0, max_distance]`,其中 `max_distance = nums[n-1] - nums[0]`\n- 对于每个中间值 `mid`,计算有多少个数对的距离小于等于 `mid`\n- 如果数量大于等于 `k`,说明第k小的距离可能就是 `mid` 或者比 `mid` 更小\n- 如果数量小于 `k`,说明第k小的距离一定比 `mid` 更大\n\n### 3. 计算函数 calc\n```javascript\nfunction calc(mid){\n let l = 0, r = -1, ans = 0;\n while(l < n){\n while(r + 1 < n && nums[r + 1] - nums[l] <= mid) r++;\n if(r >= l) ans += r - l;\n l++;\n }\n return ans\n}\n```\n\n这个函数使用双指针技巧计算有多少个数对的距离小于等于给定值 [mid](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\462\\2.js#L20-L20):\n- 外层循环固定左指针 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\461\\3.js#L34-L34)\n- 内层循环移动右指针 `r`,直到 `nums[r] - nums[l] > mid`\n- 此时对于固定的 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\461\\3.js#L34-L34),有 `r - l` 个数对的距离小于等于 [mid](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\462\\2.js#L20-L20)\n- 累加所有可能的数对数量\n\n\n\n## 举例说明\n\n以 `nums = [1,3,1]`, `k = 1` 为例:\n1. 排序后:`[1,1,3]`\n2. 距离范围:`[0, 2]`\n3. 二分搜索过程:\n - `mid = 1`,计算距离 <= 1 的数对有 1 个(`(1,1)`)\n - 因为 1 >= k(1),所以 `ans = 1`,继续搜索左半部分\n - `mid = 0`,计算距离 <= 0 的数对有 1 个(`(1,1)`)\n - 因为 1 >= k(1),所以 `ans = 0`\n4. 返回结果 0\n\n这个解法非常巧妙地结合了二分搜索和双指针技巧,避免了直接计算所有数对距离的 O(n²) 复杂度。\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a,b) => a - b);\n let n = nums.length;\n let r = nums[n - 1] - nums[0],l = 0,ans = 0;\n while(l <= r){\n let mid = (l + r) >> 1;\n let cnt = calc(mid);\n if(cnt >= k){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n // ----------------------\n function calc(mid){\n let l = 0,r = -1,ans = 0;\n while(l < n){\n while(r + 1 < n && nums[r + 1] - nums[l] <= mid) r++;\n if(r >= l) ans += r - l;\n l++;\n }\n return ans\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n + n log D),其中 n 是数组长度,D 是最大距离\n - 排序需要 O(n log n)\n - 二分搜索需要 log D 次,每次调用 calc 函数需要 O(n)\n- 空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218701829","body":"## 思路\n\n1. **使用优先队列的BFS**:\n - 采用 `MinPriorityQueue` 实现 Dijkstra 算法变体\n - 每个元素存储 `[行, 列, 高度]`,按高度排序\n\n2. **状态表示**:\n - `vis` 数组标记已访问的格子,防止重复访问\n - `ans` 记录到达当前位置所需的最大高度(即所需最低水位)\n\n3. **搜索过程**:\n - 从起点 `(0,0)` 开始,每次选择高度最低的相邻格子\n - 更新所需最低水位为路径上遇到的最大高度\n - 直到到达终点 `(n-1,n-1)`\n\n## 关键步骤\n\n- **初始化**:标记起点已访问,将起点加入优先队列\n- **主循环**:不断取出队列中高度最低的位置\n- **更新答案**:记录路径上的最大高度值\n- **探索邻居**:向四个方向扩展未访问的邻居节点\n- **终止条件**:到达右下角时结束搜索\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n let n = grid.length,vis = new Array(n).fill(0).map(()=>new Array(n).fill(0));\n vis[0][0] = 1;\n const q = new MinPriorityQueue(v=>v[2]);\n q.enqueue([0,0,grid[0][0]]);\n let ans = 0;\n const direction = [[0,1],[1,0],[0,-1],[-1,0]];\n while(q.size()){\n let [i,j,t] = q.dequeue();\n ans = Math.max(ans,t);\n if(i === n - 1 && j === n - 1) break;\n for(let d of direction){\n let x = d[0] + i,y = d[1] + j;\n if(x >= 0 && x < n && y >= 0 && y < n){\n if(vis[x][y]) continue;\n vis[x][y] = 1;\n q.enqueue([x,y,grid[x][y]]);\n }\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n²logn),其中 n 是矩阵的边长。\n- 空间复杂度:O(n²),用于存储 vis 数组和优先队列。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222257413","body":"## 思路\n\n使用**滑动窗口**(Sliding Window)技术来解决这个问题,通过维护一个固定大小为 `k` 的窗口来遍历整个字符串。\n\n## 关键变量说明\n\n- `r`: 右指针,初始化为 -1\n- [n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6): 字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- `ans`: 记录找到的最大元音字母数\n- `total`: 当前窗口内元音字母的总数\n- [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6): 左指针,表示窗口的起始位置\n\n## 算法流程\n\n1. **外层循环**:[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 从 0 到 `n-k`,表示窗口的左边界\n ```javascript\n for(let i = 0; i <= n - k; i++)\n ```\n\n\n2. **扩展窗口**:使用 `while` 循环将右指针 `r` 向右扩展,直到窗口大小达到 `k`\n ```javascript\n while(r + 1 < n && r - i + 1 < k){\n r++;\n if(isYuanYin(s[r])) total++;\n }\n ```\n\n - 条件 `r + 1 < n` 确保不越界\n - 条件 `r - i + 1 < k` 确保窗口大小不超过 `k`\n - 每次扩展时检查新加入的字符是否为元音,并更新 `total`\n\n3. **更新最大值**:比较当前窗口的元音数量与历史最大值\n ```javascript\n ans = Math.max(ans, total);\n ```\n\n\n4. **收缩窗口**:移动左指针前,如果当前左边界字符是元音,则从总数中减去\n ```javascript\n if(isYuanYin(s[i])) total--;\n ```\n\n\n## 辅助函数\n\n```javascript\nfunction isYuanYin(c){\n return ['a','e','i','o','u'].includes(c);\n}\n```\n\n用于判断字符是否为元音字母。\n\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n let r = -1, n = s.length,ans = 0,total = 0;\n for(let i = 0;i <= n - k;i++){\n while(r + 1 < n && r - i + 1 < k){\n r++;\n if(isYuanYin(s[r])) total++;\n }\n ans = Math.max(ans,total);\n if(isYuanYin(s[i])) total--;\n }\n return ans;\n // -------------------------\n function isYuanYin(c){\n return ['a','e','i','o','u'].includes(c);\n }\n };\n```\n## 复杂度分析\n\n- 时间复杂度:O(n),其中 n 是字符串长度,每个字符最多被访问两次\n- 空间复杂度:O(1),只使用了常数额外空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3227100052","body":"## 思路\n\n### 核心技巧\n- 维护一个大小为maxPts的滑动窗口\n- 使用`sum`变量维护当前窗口内所有可能结果的概率和\n- 通过`sum -= r`和`sum += dp[i]`维护窗口滑动\n\n### 1. 边界条件处理\n```javascript\nif(0 >= k) return 0 <= n ? 1 : 0;\n```\n\n- 当目标分数`k`为0或负数时,游戏一开始就结束\n- 如果[n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6)非负,则概率为1,否则为0\n\n### 2. 初始化阶段\n```javascript\nlet sum = 0;\nfor(let i = k;i < k + maxPts;i++){\n if(i <= n) sum += 1;\n}\n```\n\n- 计算从刚好达到`k`分开始,可能到达的最高分数范围`[k, k+maxPts-1]`中满足≤n的数目\n- 这些状态的概率都是1(因为游戏结束)\n\n### 3. 动态规划倒推\n```javascript\nlet j = k + maxPts - 1, r = j <= n ? 1 : 0;\nlet dp = new Array(k).fill(0);\nfor(let i = k - 1;i >= 0;i--){\n dp[i] = sum / maxPts;\n sum -= r;\n sum += dp[i];\n j--;\n if(j >= k) r = j <= n ? 1 : 0;\n else r = dp[j];\n}\n```\n\n\n- 从`k-1`分开始倒推到0分\n- `dp[i]`表示从[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)分开始游戏获胜的概率\n- 状态转移方程:`dp[i] = (dp[i+1] + dp[i+2] + ... + dp[i+maxPts]) / maxPts`\n- 使用滑动窗口优化:维护`sum`为窗口内所有概率之和\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n if(0 >= k) return 0 <= n ? 1 : 0;\n \n let sum = 0;\n for(let i = k;i < k + maxPts;i++){\n if(i <= n) sum += 1;\n }\n let j = k + maxPts - 1, r = j <= n ? 1 : 0;\n let dp = new Array(k).fill(0);\n for(let i = k - 1;i >= 0;i--){\n dp[i] = sum / maxPts;\n sum -= r;\n sum += dp[i];\n j--;\n if(j >= k) r = j <= n ? 1 : 0;\n else r = dp[j];\n }\n return dp[0];\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(k + maxPts),其中k为`k`的取值范围\n- 空间复杂度:O(k)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3231026577","body":"## 思路\n\n1. **滑动窗口 + 字符频次统计**\n - 使用两个长度为26的数组(`pMap` 和 `sMap`)分别统计模式串 `p` 和当前窗口内子串的字符频次\n - 通过滑动窗口在 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 中寻找与 `p` 字符频次完全相同的子串\n\n2. **算法流程**\n - 首先调用 `getPmap()` 统计 `p` 中各字符出现次数\n - 初始化滑动窗口左右边界 `l=0, r=-1`\n - 在每次循环中:\n - 扩展右边界直到窗口大小等于 `p` 的长度\n - 比较当前窗口字符频次与 `p` 的字符频次是否相同\n - 如果相同,则将左边界位置加入结果数组\n - 移动左边界,更新窗口字符频次\n\n## 关键函数说明\n\n- `getPmap()`: 统计模式串 `p` 中每个字符的出现次数\n- `equal(arr1, arr2)`: 比较两个字符频次数组是否完全相同\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nvar findAnagrams = function(s, p) {\n const pMap = new Array(26).fill(0),k = p.length;\n getPmap();\n let ans = []\n let n = s.length,l = 0,r = -1,sMap = new Array(26).fill(0);\n while(l <= n - k){\n while(r + 1 < n && r - l + 1 < k){\n r++;\n let c = s[r]\n sMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;\n }\n if(equal(pMap,sMap)) ans.push(l);\n let c = s[l++];\n sMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]--;\n }\n return ans;\n // --------------------------------------------------------\n function getPmap(){\n for(let c of p){\n pMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;\n }\n }\n function equal(arr1,arr2){\n for(let i = 0;i < 26;i++){\n if(arr1[i] !== arr2[i]) return false;\n }\n return true;\n }\n };\n```\n## 复杂度分析\n\n- 时间复杂度:O(n),其中 n 是字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- 空间复杂度:O(1),只使用了固定大小的数组存储字符频次","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235816649","body":"## 思路\n\n### 核心思想\n- 使用**滑动窗口**技术\n- 维护一个动态窗口 `[l, r]`,通过双指针扩展和收缩窗口\n- 统计窗口内字符频次,确保包含 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中所有字符及其所需数量\n\n### 主要步骤\n\n1. **初始化阶段**\n - `tMap`:统计字符串 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中各字符出现次数\n - `LIMIT`:记录 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中不同字符的数量\n - `sMap`:统计当前窗口中各字符出现次数\n - `total`:记录窗口中已满足数量要求的字符种类数\n\n2. **滑动窗口主循环**\n - 外层循环移动左指针 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31)\n - 内层循环扩展右指针 `r`,直到窗口包含 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的所有字符\n - 当窗口满足条件时,尝试更新最优解\n\n3. **结果更新**\n - 使用 `check` 函数比较当前窗口与历史最优解\n - 选择更短的子串,长度相同时选择字典序更小的\n\n### check函数作用\n用于比较两个子串,选择更优的结果:\n- 优先选择长度更短的子串\n- 长度相同时选择字典序更小的\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nvar minWindow = function(s, t) {\n let tMap = {},ans = '';\n for(let c of t) tMap[c] = (tMap[c] || 0) + 1;\n const LIMIT = Object.keys(tMap).length;\n let n = s.length,l = 0,r = -1,total = 0,sMap = {};\n while(l < n){\n while(r + 1 < n && total < LIMIT){\n r++;\n let c = s[r];\n sMap[c] = (sMap[c] || 0) + 1;\n if(sMap[c] === tMap[c]) total++;\n }\n if(total === LIMIT){\n let tmp = s.slice(l,r + 1);\n if(check(tmp)) ans = tmp;\n }\n let c = s[l];\n if(sMap[c] === tMap[c]) total--;\n sMap[c]--;\n l++;\n }\n return ans;\n // ------------------------\n function check(tmp){\n if(ans === '') return true;\n if(tmp.length < ans.length) return true;\n if(tmp.length > ans.length) return false;\n for(let i = 0;i < tmp.length;i++){\n let a = tmp.charCodeAt(i),b = ans.charCodeAt(i);\n if(a < b) return true;\n if(a === b) continue;\n if(a > b) return false;\n }\n return false;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是字符串 [s](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的长度。\n- 空间复杂度:O(t),其中 t 是字符串 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的字符串种类。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/50#issuecomment-3238889944","body":"## 思路\n\n1. **前缀和与后缀和预处理**:\n - [preSum](file:///E:/力扣刷题/algorithm_exercises/周赛/458/2.js#L10-L10)数组存储从左端开始的前缀和\n - [sufSum](file:///E:/力扣刷题/algorithm_exercises/周赛/458/2.js#L15-L15)数组存储从右端开始的后缀和\n\n2. **核心思想**:\n - 我们需要从两端取k张卡牌,可以是左边取i张,右边取k-i张(i从0到k)\n - 通过预处理的前缀和与后缀和数组,可以快速计算任意数量卡牌的点数和\n\n3. **遍历所有可能的组合**:\n - 遍历i从0到k,表示从左边取i张卡牌\n - 对应从右边取k-i张卡牌\n - 计算总和并更新最大值\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} cardPoints\n * @param {number} k\n * @return {number}\n */\nvar maxScore = function(cardPoints, k) {\n let n = cardPoints.length;\n const preSum = new Array(n + 1).fill(0),sufSum = new Array(n + 1).fill(0);\n for(let i = 0;i < n;i++){\n preSum[i + 1] = preSum[i] + cardPoints[i];\n sufSum[i + 1] = sufSum[i] + cardPoints[n - i - 1];\n }\n let ans = -Infinity;\n for(let i = 0;i <= k;i++){\n ans = Math.max(ans,preSum[i] + sufSum[k - i]);\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(n+k),\n- 空间复杂度是O(n),其中n是数组长度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3239927488","body":"## 代路\n\n采用预计算和枚举的方法来解决问题:\n\n1. **预计算 *<60* 以内每个数字的二进制1的个数**:\n ```javascript\n const CNT = new Array(60).fill(0);\n for(let i = 0;i <= 59;i++){\n let n = i,t = 0;\n while(n){\n if(n & 1) t++;\n n >>= 1;\n }\n CNT[i] = t;\n }\n ```\n\n\n2. **枚举小时和分钟的分配**:\n ```javascript\n for(let i = 0;i <= 4;i++){\n let j = turnedOn - i;\n if(j > 6) continue;\n // ...\n }\n ```\n\n 这里将turnedOn个LED灯分为两部分:i个给小时部分,j个给分钟部分。由于小时最多由4个LED表示,分钟最多由6个LED表示,所以i最多为4,j最多为6。\n\n3. **获取符合条件的小时和分钟**:\n 通过`getHour(cnt)`和`getM(cnt)`函数获取二进制中恰好有cnt个1的小时数和分钟数。\n\n4. **组合时间**:\n 将符合条件的小时和分钟组合成时间字符串,格式为`H:MM`。\n\n## 代码优点\n\n1. **预计算优化**:提前计算所有0-59数字的二进制1的个数,避免重复计算\n2. **分离关注点**:将获取小时和分钟的逻辑分别封装在独立函数中\n3. **合理的边界处理**:考虑到小时(0-11)和分钟(0-59)的范围限制\n4. **正确的格式化**:分钟数始终显示为两位数\n\n\n## 代码\n```javascript\nconst CNT = new Array(60).fill(0);\nfor(let i = 0;i <= 59;i++){\n let n = i,t = 0;\n while(n){\n if(n & 1) t++;\n n >>= 1;\n }\n CNT[i] = t;\n}\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n let ans = []\n for(let i = 0;i <= 4;i++){\n let j = turnedOn - i;\n if(j > 6) continue;\n for(let h of getHour(i)){\n for(let m of getM(j)){\n ans.push(`${h}:${m}`)\n }\n }\n }\n return ans;\n\n // ------------------------------\n function getHour(cnt){\n let ans = [];\n for(let i = 0;i <= 11;i++){\n if(CNT[i] === cnt) ans.push(i);\n }\n return ans\n }\n\n function getM(cnt){\n let ans = [];\n for(let i = 0;i <= 59;i++){\n if(CNT[i] === cnt) ans.push(i < 10 ? '0' + i : i);\n }\n return ans\n }\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(1),因为小时和分钟的范围是固定的(12*60种组合)\n- **空间复杂度**:O(1),只使用了固定大小的额外空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240725656","body":"\n## 思路\n\n### 1. 位运算优化\n- 使用位运算来表示和检查约束条件:\n - `colSet`:记录已被占用的列\n - `pieSet`:记录已被占用的主对角线(撇)\n - `naSet`:记录已被占用的副对角线(捺)\n\n### 2. 对角线编号\n- 主对角线(撇):用 `i + j` 编号\n- 副对角线(捺):用 `i - j + N` 编号(确保非负)\n\n### 3. DFS 回溯过程\n- 逐行放置皇后(第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 行)\n- 对每行的每一列 `j` 检查是否可放置:\n - 通过位运算检查列、主对角线、副对角线是否冲突\n- 若无冲突则放置皇后并更新状态,递归处理下一行\n- 回溯时撤销状态更改\n\n### 4. 位操作技巧\n- `(x >> k) & 1`:检查第 k 位是否为 1\n- `x ^= (1 << k)`:翻转第 k 位(设置或取消占用)\n\n当成功放置完所有 n 行皇后时,返回 1(找到一种方案),最终统计所有可行方案数。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let colSet = 0,N = 2 * n - 1,pieSet = 0,naSet = 0;\n return dfs(0);\n // -------------------\n function dfs(i){\n if(i === n) return 1;\n let ans = 0;\n for(let j = 0;j < n;j++){\n let col = j,pie = i + j,na = (i - j + N) % N;\n if(((colSet >> col) & 1) || ((pieSet >> pie) & 1) ||((naSet >> na) & 1)) continue;\n colSet ^= (1 << col);\n pieSet ^= (1 << pie);\n naSet ^= (1 << na);\n ans += dfs(i + 1);\n colSet ^= (1 << col);\n pieSet ^= (1 << pie);\n naSet ^= (1 << na);\n }\n return ans;\n }\n};\n```\n## 复杂度分析\n- 时间复杂度:O(N!),其中 N 为输入的行数。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243912780","body":"## 思路\n\n1. **初始化**:\n - 获取网格的行数(m)和列数(n)\n - 创建访问标记数组vis,避免重复访问\n - 初始化最大面积ans为0\n\n2. **遍历网格**:\n - 遍历每个格子,如果当前格子是0(海洋)或已被访问,则跳过\n - 否则,从当前位置开始进行BFS搜索整个岛屿\n\n3. **BFS搜索**:\n - 使用队列实现广度优先搜索\n - 从起始点开始,向四个方向扩展\n - 对于每个有效的相邻陆地格子(值为1且未访问),标记为已访问并加入队列\n - 统计当前岛屿的面积\n\n4. **更新结果**:\n - 每次BFS完成后,比较当前岛屿面积和已知最大面积,保留较大值\n\n## 具体实现细节\n\n- 使用Queue数据结构实现BFS\n- 四个方向数组dirs用于简化方向处理\n- vis数组防止重复访问同一格子\n- 边界检查确保不越界\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n let m = grid.length,n = grid[0].length;\n let ans = 0;\n let vis = new Array(m).fill(0).map(()=>new Array(n).fill(0));\n for(let i = 0;i < m;i++){\n for(let j = 0;j = 0 && r < m && c >= 0 && c < n){\n if(grid[r][c] === 0) continue;\n if(vis[r][c]) continue;\n vis[r][c] = 1;\n q.enqueue([r,c]);\n }\n }\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(m×n)\n- 空间复杂度是O(m×n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247579876","body":"## 思路\n\n这是一个典型的多源BFS(广度优先搜索)问题。代码采用逆向思维,不是从海洋格子找最近的陆地,而是从所有陆地格子出发,向外扩展到海洋格子,计算每个海洋格子到最近陆地的距离。\n\n## 算法步骤\n\n1. 初始化一个与原网格同样大小的距离矩阵`dis`,所有值初始化为无穷大\n2. 遍历原网格,将所有陆地格子(值为1)的坐标和距离0加入队列,作为BFS的起点\n3. 使用BFS遍历:\n - 从队列中取出一个位置\n - 如果当前位置的距离小于记录的距离,则更新距离\n - 如果当前位置是海洋,则更新最大距离\n - 向四个方向扩展,将合法的海洋格子加入队列\n4. 返回找到的最大距离,如果不存在海洋或陆地则返回-1\n\n## 代码\n\n```javascript\nvar maxDistance = function(grid) {\n let n = grid.length;\n // 创建一个距离矩阵,初始化为无穷大\n let dis = new Array(n).fill(0).map(()=>new Array(n).fill(Infinity));\n let q = new Queue();\n \n // 将所有陆地格子(值为1)作为BFS的起始点\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(grid[i][j] === 0) continue;\n q.enqueue([i,j,0]); // [行, 列, 距离]\n }\n }\n\n // 四个方向的移动:右、下、左、上\n const dirs = [[0,1],[1,0],[0,-1],[-1,0]];\n let ans = -Infinity;\n \n // BFS遍历\n while(q.size()){\n let [i,j,d] = q.dequeue();\n \n // 如果当前距离大于等于已记录的距离,则跳过\n if(d >= dis[i][j]) continue;\n \n // 更新当前位置的距离\n dis[i][j] = d;\n \n // 如果当前位置是海洋(值为0),更新最大距离\n if(grid[i][j] === 0) ans = Math.max(ans,dis[i][j]);\n \n // 向四个方向扩展\n for(let [x,y] of dirs.map(v=>[v[0] + i,v[1] + j])){\n // 检查边界\n if(x < 0 || x >= n || y < 0 || y >= n) continue;\n // 如果是陆地则跳过\n if(grid[x][y] === 1) continue;\n // 如果新距离大于等于已记录距离则跳过\n if(d + 1 >= dis[x][y]) continue;\n // 将新位置加入队列\n q.enqueue([x,y,d + 1]);\n }\n }\n \n // 返回结果,如果没找到海洋格子则返回-1\n return ans === -Infinity ? -1 : ans === Infinity ? -1 : ans; \n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n²),每个格子最多被访问一次\n- 空间复杂度:O(n²),需要存储距离矩阵和队列\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251721463","body":"## 问题理解\n\n这个问题是一个图遍历问题,涉及以下概念:\n- 有n个盒子,每个盒子可能包含糖果、钥匙和内部盒子\n- 某些盒子是打开的(status[i] = 1),某些是关闭的(status[i] = 0)\n- 只有拿到钥匙才能打开关闭的盒子\n- 初始时有一些盒子(initialBoxes)\n- 目标是获得尽可能多的糖果\n\n## 思路\n\n### 1. 初始化阶段\n```javascript\nlet n = status.length, ans = 0,\nhas_key = new Array(n).fill(0),\nhas_box = new Array(n).fill(0);\n```\n\n- `n`: 盒子总数\n- `ans`: 最终获得的糖果总数\n- `has_key`: 标记是否拥有某个盒子的钥匙\n- `has_box`: 标记是否拥有某个盒子\n\n### 2. 设置初始状态\n```javascript\nfor(let i = 0; i < n; i++) if(status[i]) has_key[i] = 1;\nfor(let i of initialBoxes) has_box[i] = 1;\n```\n\n- 将所有本来就是打开状态的盒子(status[i] = 1)标记为拥有钥匙\n- 将初始拥有的盒子标记为已拥有\n\n### 3. DFS遍历获取糖果\n```javascript\nlet vis = new Array(n).fill(0);\nfor(let i of initialBoxes){\n if(has_box[i] && has_key[i] && !vis[i]) dfs(i);\n}\n```\n\n- `vis`: 标记盒子是否已经访问过\n- 对于每个初始盒子,如果既拥有盒子又有钥匙且未访问过,则进行DFS\n\n### 4. DFS函数实现\n```javascript\nfunction dfs(i){\n ans += candies[i]; // 收集当前盒子的糖果\n vis[i] = 1; // 标记为已访问\n for(let j of keys[i]){ // 遍历当前盒子中的钥匙\n has_key[j] = 1; // 获得钥匙\n if(has_box[j] && !vis[j]) dfs(j); // 如果拥有对应盒子且未访问,则继续DFS\n }\n for(let j of containedBoxes[i]){ // 遍历当前盒子中的内部盒子\n has_box[j] = 1; // 获得盒子\n if(has_key[j]&& !vis[j]) dfs(j); // 如果拥有对应钥匙且未访问,则继续DFS\n }\n}\n```\n\n\n## 算法流程总结\n\n1. **初始化状态**:记录每个盒子的初始状态(是否打开)和初始拥有的盒子\n2. **深度优先搜索**:从初始盒子开始,只有当同时拥有盒子和钥匙时才能打开盒子\n3. **收集资源**:打开盒子后获得糖果、钥匙和内部盒子\n4. **继续探索**:利用新获得的钥匙或盒子继续打开新的盒子\n5. **避免重复**:使用vis数组确保每个盒子只被访问一次\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n let n = status.length,ans = 0,\n has_key = new Array(n).fill(0),\n has_box = new Array(n).fill(0);\n for(let i = 0;i < n;i++) if(status[i]) has_key[i] = 1;\n for(let i of initialBoxes) has_box[i] = 1;\n let vis = new Array(n).fill(0);\n for(let i of initialBoxes){\n if(has_box[i] && has_key[i] && !vis[i]) dfs(i);\n }\n return ans;\n // ----------------------------------------\n function dfs(i){\n ans += candies[i];\n vis[i] = 1;\n for(let j of keys[i]){\n has_key[j] = 1;\n if(has_box[j] && !vis[j]) dfs(j);\n }\n for(let j of containedBoxes[i]){\n has_box[j] = 1;\n if(has_key[j]&& !vis[j]) dfs(j);\n }\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度为O(N + E),其中N是盒子数量,E是钥匙和内部盒子的总数。\n- 空间复杂度为O(N)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3257477257","body":"\n## 思路\n\n1. **坐标系统设定**:\n - 为每个节点分配坐标,根节点为原点(0, 0)\n - 向左子树移动时,列坐标减1;向右子树移动时,列坐标加1\n - 行坐标随着深度增加而增加(向下为正方向)\n\n2. **DFS遍历收集信息**:\n - 使用深度优先搜索遍历所有节点\n - 记录每个节点的值、行坐标、列坐标\n\n3. **自定义排序**:\n - 按列坐标升序排列(从左到右)\n - 列相同时按行坐标升序(从上到下)\n - 行列都相同时按节点值升序\n\n4. **分组输出**:\n - 将相同列坐标的节点值归为一组\n - 每组构成结果数组中的一个子数组\n\n## 代码:\n\n```javascript\nvar verticalTraversal = function(root) {\n let ans = [] // 存储[节点值, 行, 列]信息\n \n // DFS遍历,收集每个节点的值和坐标\n dfs(root,0,0);\n \n // 自定义排序:先按列,再按行,最后按值\n ans.sort((a,b)=>a[2] - b[2] || a[1] - b[1] || a[0] - b[0]);\n \n let col = Infinity, res = [];\n // 按列分组,将相同列的节点值组成子数组\n for(let [v,r,c] of ans){\n if(col === c) res[res.length - 1].push(v);\n else{\n res.push([v]);\n col = c;\n }\n }\n return res;\n \n // 辅助函数:深度优先遍历并记录坐标\n function dfs(root,row,col){\n if(!root) return;\n ans.push([root.val,row,col]);\n dfs(root.left,row + 1,col - 1) // 左子树:行+1,列-1\n dfs(root.right,row + 1,col + 1) // 右子树:行+1,列+1\n }\n};\n```\n## 复杂度分析\n### 时间复杂度:\n- DFS遍历:O(N),N为节点数\n- 排序:O(N log N)\n- 分组:O(N)\n- 总体:O(N log N)\n\n### 空间复杂度:\n- 存储信息:O(N)\n- 递归栈:O(H),H为树高度\n- 总体:O(N)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260240769","body":"\n\n## 思路\n\n使用了动态规划的思想,并进行了空间优化:\n\n## 具体分析\n\n1. **状态定义**:\n - `prevprev` 表示到达第 i-2 个位置的最小花费\n - `prev` 表示到达第 i-1 个位置的最小花费\n - `curr` 表示到达当前位置的最小花费\n\n2. **状态转移方程**:\n - `curr = v + Math.min(prevprev, prev)`\n - 其中 v 是当前位置的花费(顶部为0)\n\n3. **优化点**:\n - 使用滚动数组优化空间复杂度,从O(n)降到O(1)\n - 只保存前两个状态值,而不是整个dp数组\n\n4. **边界处理**:\n - 当 i < n 时,v = cost[i](正常台阶费用)\n - 当 i = n 时,v = 0(到达楼顶,没有费用)\n - 最后的返回值根据数组长度做了特殊处理\n\n\n这是一个经典的空间优化动态规划解法,通过只保留必要的状态值来减少空间使用。\n## 代码\n```javascript\nvar minCostClimbingStairs = function(cost) {\n let n = cost.length,\n prevprev = cost[0], // 表示到达第0个台阶的最小花费\n prev = cost[1], // 表示到达第1个台阶的最小花费\n curr;\n \n // 从第2个台阶开始遍历到楼梯顶部\n for(let i = 2;i <= n;i++){\n let v = 0;\n // 当i[1,1]);\n```\n\n\n1. 创建一个二维DP数组`dp`,其中`dp[i][0]`表示以`nums[i]`结尾的最长递增子序列的长度,`dp[i][1]`表示以`nums[i]`结尾的最长递增子序列的个数。\n2. 初始时,每个元素自身构成一个长度为1的递增子序列,所以都初始化为`[1,1]`。\n\n```javascript\n for(let i = 1; i < n; i++){\n for(j = i - 1; j >= 0; j--){\n if(nums[i] > nums[j]){\n if(dp[j][0] + 1 > dp[i][0]){\n dp[i][0] = dp[j][0] + 1;\n dp[i][1] = dp[j][1];\n }else if(dp[j][0] + 1 === dp[i][0]){\n dp[i][1] += dp[j][1];\n }\n }\n }\n }\n```\n\n\n3. 对于每个位置[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6),遍历它之前的所有位置`j`:\n - 如果`nums[i] > nums[j]`,说明可以将`nums[i]`接在以`nums[j]`结尾的递增子序列后面\n - 如果通过`j`得到的子序列长度(`dp[j][0] + 1`)比当前记录的长度(`dp[i][0]`)更长,则更新长度和数量\n - 如果长度相等,则将通过`j`得到的子序列数量加到当前的数量上\n\n```javascript\n let ans = 0, max = -Infinity;\n for(let [len,cnt] of dp){\n if(len > max){\n max = len;\n ans = cnt;\n }else if(max === len){\n ans += cnt;\n }\n }\n return ans;\n```\n\n\n4. 最后遍历整个DP数组,找出最长的递增子序列长度,并累加所有具有该长度的子序列的数量。\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findNumberOfLIS = function(nums) {\n let n = nums.length,dp = new Array(n).fill(0).map(()=>[1,1]);\n for(let i = 1;i < n;i++){\n for(j = i - 1;j >= 0;j--){\n if(nums[i] > nums[j]){\n if(dp[j][0] + 1 > dp[i][0]){\n dp[i][0] = dp[j][0] + 1;\n dp[i][1] = dp[j][1];\n }else if(dp[j][0] + 1 === dp[i][0]){\n dp[i][1] += dp[j][1];\n }\n }\n }\n }\n let ans = 0,max = -Infinity;\n for(let [len,cnt] of dp){\n if(len > max){\n max = len;\n ans = cnt;\n }else if(max === len){\n ans += cnt;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(n²),\n- 空间复杂度是O(n)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269148142","body":"\n## 思路\n\n### 1. 问题定义\n最长公共子序列是找出两个字符串中最长的共同子序列(不要求连续,但要保持相对顺序)。\n\n### 2. 动态规划状态定义\n```javascript\nlet m = text1.length, n = text2.length, dp = new Array(m).fill(0).map(() => new Array(n).fill(0));\n```\n\n创建一个二维数组 `dp[i][j]`,表示 `text1[0...i]` 和 `text2[0...j]` 的最长公共子序列长度。\n\n### 3. 初始化边界条件\n```javascript\nif(text1[0] === text2[0]) dp[0][0] = 1;\n\nfor(let i = 1;i < m;i++) {\n dp[i][0] = text1[i] === text2[0] ? 1 : dp[i - 1][0];\n}\nfor(let i = 1;i < n;i++) {\n dp[0][i] = text1[0] === text2[i] ? 1 : dp[0][i - 1];\n}\n```\n\n- 首先处理两个字符串的第一个字符,如果相同则 `dp[0][0] = 1`\n- 分别初始化第一列和第一行:\n - 如果当前字符匹配,则值为1\n - 否则继承前一个位置的值\n\n### 4. 状态转移方程\n```javascript\nfor(let i = 1;i < m;i++){\n for(let j = 1;j < n;j++){\n if(text1[i] === text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;\n else dp[i][j] = Math.max(\n dp[i - 1][j],\n dp[i][j - 1],\n dp[i - 1][j - 1]\n );\n }\n}\n```\n\n对于每个位置 `(i,j)`:\n- 如果 `text1[i] === text2[j]`,说明当前字符匹配,则 `dp[i][j] = dp[i-1][j-1] + 1`\n- 否则取三种情况的最大值:\n - `dp[i-1][j]`:text1[0...i-1] 与 text2[0...j] 的LCS长度\n - `dp[i][j-1]`:text1[0...i] 与 text2[0...j-1] 的LCS长度\n - `dp[i-1][j-1]`:text1[0...i-1] 与 text2[0...j-1] 的LCS长度\n\n### 5. 返回结果\n```javascript\nreturn dp[m - 1][n - 1];\n```\n\n返回 `dp[m-1][n-1]` 即为两个完整字符串的最长公共子序列长度。\n\n\n## 代码\n```javascript\n/**\n * @param {string} text1\n * @param {string} text2\n * @return {number}\n */\nvar longestCommonSubsequence = function(text1, text2) {\n let m = text1.length,n = text2.length,dp = new Array(m).fill(0).map(() => new Array(n).fill(0));\n if(text1[0] === text2[0]) dp[0][0] = 1;\n\n for(let i = 1;i < m;i++) {\n dp[i][0] = text1[i] === text2[0] ? 1 : dp[i - 1][0];\n }\n for(let i = 1;i < n;i++) {\n dp[0][i] = text1[0] === text2[i] ? 1 : dp[0][i - 1];\n }\n for(let i = 1;i < m;i++){\n for(let j = 1;j < n;j++){\n if(text1[i] === text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;\n else dp[i][j] = Math.max(\n dp[i - 1][j],\n dp[i][j - 1],\n dp[i - 1][j - 1]\n );\n }\n }\n return dp[m - 1][n - 1];\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(m×n),其中 m 和 n 分别是两个字符串的长度\n- 空间复杂度:O(m×n),用于存储 dp 数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273217746","body":"## 思路\n使用了组合数学的方法来解决不同路径问题:\n\n1. **问题转换**:\n - 机器人需要从左上角走到右下角,总共需要向右走 (n-1) 步,向下走 (m-1) 步\n - 总共需要走 (m-1)+(n-1) = m+n-2 步\n - 问题转化为:在这 m+n-2 步中,如何选择 m-1 步向下走(或 n-1 步向右走)\n\n2. **数学公式**:\n - 这是一个组合问题,答案是 C(m+n-2, m-1) 或 C(m+n-2, n-1)\n - 组合数公式:C(n,k) = n! / (k! * (n-k)!)\n - 为了避免计算阶乘导致的溢出,代码采用了逐步相乘的方式\n\n3. **实现细节**:\n - `k = m + n - 2` 表示总步数\n - `t = m - 1` 表示需要选择的步数(向下走的步数)\n - 通过循环计算组合数,每次将 `k/t` 的值乘到结果中,并递减 k 和 t\n - 最后使用 `Math.round()` 是为了处理浮点数计算可能产生的精度误差\n\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} m\n * @param {number} n\n * @return {number}\n */\nvar uniquePaths = function(m, n) {\n let k = m + n - 2;\n if(k === 0) return 1;\n let t = Math.min(m - 1,n - 1), ans = 1;\n while (t){\n ans *= k / t;\n k--;\n t--;\n }\n return Math.round(ans);\n};\n```\n\n## 复杂度分析\n- 时间复杂度为 O(min(m,n)),\n- 空间复杂度为 O(1)。\n相比动态规划方法,这种方法更加高效。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3277237117","body":"## 思路\n\n### 问题理解\n1. 骑士按照象棋规则移动(日字形,8个方向)\n2. 骑士从 (row, column) 位置开始\n3. 骑士进行 K 次随机移动\n4. 求骑士最终仍在棋盘上的概率\n\n### 解决方案\n使用记忆化递归(动态规划):\n\n1. **状态定义**:f(i, j, k) 表示骑士在位置 (i, j) 并且还能移动 k 步时,在棋盘上的概率\n\n2. **边界条件**:\n - 当 k = 0 时,如果位置在棋盘内则返回 1,否则返回 0\n - 当位置超出棋盘边界时,返回 0\n\n3. **状态转移**:\n - 对于骑士的 8 个可能移动方向,递归计算每个方向移动后的情况\n - 结果为所有可能移动结果的平均值(除以 8)\n\n4. **记忆化优化**:\n - 使用 memo 三维数组存储已经计算过的结果,避免重复计算\n\n## 代码\n\n```javascript\nvar knightProbability = function(n, k, row, column) {\n // 骑士的8个移动方向\n const dirs = [[1,2],[2,1],[1,-2],[2,-1],[-1,2],[-2,1],[-1,-2],[-2,-1]];\n \n // 记忆化数组,存储 (i,j,k) 状态下的结果\n const memo = new Array(n + 1).fill(0).map(()=>{\n return new Array(n + 1).fill(0).map(()=>{\n return new Array(k + 1).fill(-1);\n })\n })\n \n // 调用递归函数\n return f(row, column, k);\n \n function f(i, j, k) {\n // 基础情况:没有移动次数了\n if (k === 0) return i >= 0 && i < n && j >= 0 && j < n ? 1 : 0;\n \n // 超出边界\n if (i < 0 || i >= n || j < 0 || j >= n) return 0;\n \n // 已经计算过该状态\n if (memo[i][j][k] !== -1) return memo[i][j][k];\n \n let ans = 0;\n // 遍历8个方向\n for (let d of dirs) {\n let x = d[0] + i, y = d[1] + j;\n ans += f(x, y, k - 1);\n }\n \n // 每个方向的概率是 1/8,所以取平均值\n memo[i][j][k] = ans / 8;\n return ans / 8;\n } \n};\n```\n\n\n### 复杂度分析\n- 时间复杂度:O(N²×K),因为有 N×N 个位置和 K 步\n- 空间复杂度:O(N²×K),用于存储记忆化数组\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3283550644","body":"## 思路\n\n### 1. 初始判断\n```javascript\nif((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;\n```\n\n首先计算所有可选数字的总和,如果总和小于目标值,则无论如何都无法达到目标,返回false。\n\n### 2. 核心递归函数f\n```javascript\nfunction f(type,total,state){}\n```\n\n- `type`: 当前玩家类型(0表示我方,1表示对方)\n- `total`: 剩余需要达到的目标值\n- `state`: 用位掩码表示的已选择数字状态\n\n### 3. 记忆化搜索\n使用`memo`来存储已经计算过的状态结果,避免重复计算。通过`query`和[add](file://E:\\其他项目\\algorithm_exercises\\9.js#L13-L21)函数来操作这个多层Map结构。\n\n### 4. 状态转移\n对于每个未选择的数字:\n- 如果选择该数字可以直接获胜(`i + 1 >= total`),则当前玩家获胜\n- 否则,递归调用[f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)计算对手在新状态下的结果\n- 如果存在一种选择使得对手必败,则当前玩家必胜\n\n### 5. 博弈论思想\n这是一个典型的极小化极大算法应用:\n- 当前玩家希望找到至少一种选择使得对手必败(返回false)\n- 如果所有选择都导致对手必胜(都返回false),则当前玩家必败\n\n## 代码\n```javascript\n/**\n * @param {number} maxChoosableInteger\n * @param {number} desiredTotal\n * @return {boolean}\n */\nvar canIWin = function(maxChoosableInteger, desiredTotal) {\n let memo = new Map();\n if((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;\n return f(0,desiredTotal,0);\n // -------------------------------\n function f(type,total,state){\n let params = [state];\n if(query(params) !== -1) return query(params);\n let ans = false;\n for(let i = 0;i < maxChoosableInteger;i++){\n if(state & (1 << i)) continue;\n if(i + 1 >= total) {\n ans = true;\n break;\n }\n let a = f(type === 0 ? 1 : 0,total - i - 1, state | (1 << i));\n if(a === false) {\n ans = true;\n break;\n }\n }\n add(params,ans)\n return ans;\n }\n\n function query(params){\n let ans = memo;\n for(let param of params){\n if(ans.has(param) === false) return -1;\n ans = ans.get(param);\n }\n return ans;\n }\n\n function add(params,val){\n let m = memo,n = params.length, rest = params.slice(0,n - 1),last = params[n - 1];\n for(let param of rest){\n if(m.has(param) === false) m.set(param,new Map());\n m = m.get(param);\n }\n m.set(last,val);\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:$O(n*2^{n})$\n- 空间复杂度:$O(n)$","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3287375518","body":"## 思路\n\n\n1. **预处理**:\n - 计算数组总和,如果为奇数则直接返回false\n - 确定目标值target为总和的一半\n\n2. **初始化DP数组**:\n - dp[j]表示是否可以用数组中的元素组成和为j的子集\n - 初始时只考虑第一个元素nums[0],只有当j等于nums[0]时才为true\n\n3. **状态转移**:\n - 对于每个元素nums[i],更新dp数组\n - 从target到0逆序遍历,避免重复使用同一元素\n - 状态转移方程:`dp[j] = dp[j] || dp[j - nums[i]]`\n - 要么不使用当前元素,保持原来的状态dp[j]\n - 要么使用当前元素,前提是dp[j - nums[i]]为true\n\n4. **返回结果**:\n - 如果dp[target]为true,表示可以组成和为target的子集,返回true\n - 否则返回false\n\n\n## 代码\n```javascript\nvar canPartition = function(nums) {\n // 获取数组长度和总和\n let n = nums.length,sum = nums.reduce((a,b)=>a + b,0);\n \n // 如果总和是奇数,则无法分成两个相等的子集\n if(sum & 1) return false;\n \n // 目标是找到和为总和一半的子集\n const target = sum / 2;\n \n // 创建dp数组,dp[j]表示是否可以用前面的数字组成和为j的子集\n const dp = new Array(target + 1).fill(false);\n \n // 初始化:第一个数字能否组成和为j的子集\n for(let j = 0;j <= target;j++) dp[j] = nums[0] === j;\n \n // 从第二个数字开始遍历\n for(let i = 1;i < n;i++){\n // 从target到0逆序遍历(避免重复使用同一元素)\n for(let j = target;j >= 0;j--){\n // 状态转移方程:\n // dp[j] = dp[j] || dp[j - nums[i]]\n // 要么之前就能组成j,要么使用当前数字nums[i]组成j\n dp[j] = dp[j] || (j - nums[i] >= 0 ? dp[j - nums[i]] : false);\n }\n }\n \n // 返回是否能组成和为target的子集\n return dp[target];\n};\n```\n\n## 时间和空间复杂度\n\n- 时间复杂度:O(n × target),其中n是数组长度,target是数组元素和的一半\n- 空间复杂度:O(target),只使用了一维dp数组\n\n这是一个经典的0-1背包问题的应用,通过动态规划解决了分割等和子集问题。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289197873","body":"\n## 思路\n\n\n1. **递归函数 [f(i, total)](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\2.js#L16-L29)**:\n - [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 表示当前处理到数组中的第 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素\n - [total](file://E:\\力扣刷题\\algorithm_exercises\\双周赛\\165\\3.js#L5-L5) 表示前 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素通过添加 '+' 或 '-' 符号后得到的总和\n - 函数返回从第 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素开始到最后一个元素,能够得到目标值的方案数\n\n2. **边界条件**:\n - 当 `i === n` 时,表示已经处理完所有元素,如果 `total === target` 则找到一种有效方案,返回 1,否则返回 0\n\n3. **状态转移**:\n - 对于当前元素 `nums[i]`,可以选择加上它或减去它\n - 所以递归调用 `f(i+1, total-nums[i]) + f(i+1, total+nums[i])`\n\n4. **记忆化优化**:\n - 使用 [memo](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\430\\2.js#L7-L7) 数组存储已经计算过的状态,避免重复计算\n - `memo[i][total + abs_sum]` 中使用 `total + abs_sum` 是为了避免负数索引\n\n## 代码亮点\n\n1. 计算 `abs_sum` 来确定可能的和的范围,这样可以正确地映射负数到数组索引\n2. 使用记忆化递归避免重复计算,提高效率\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar findTargetSumWays = function(nums, target) {\n let n = nums.length;\n let abs_sum = nums.reduce((prev,curr)=>{\n if(curr >= 0) return curr + prev;\n return prev - curr;\n },0)\n // console.log(abs_sum);\n let memo = new Array(n + 1).fill(0).map(()=>new Array(2 * abs_sum + 1).fill(-1));\n return f(0,0);\n // ---------------------------\n function f(i,total){\n if(i === n) return target === total ? 1 : 0;\n let t = memo[i][total + abs_sum];\n // console.log(i,target,target + abs_sum,t);\n if(t !== -1) return t;\n let ans = f(i + 1,total - nums[i]) + f(i + 1,total + nums[i]);\n memo[i][total + abs_sum] = ans; \n return ans;\n }\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n × S),其中 n 是数组长度,S 是数组元素绝对值之和\n- **空间复杂度**:O(n × S),主要由 memo 数组占用","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290259438","body":"## 思路\n\n这是一个典型的完全背包问题:\n1. **状态定义**:`dp[i][j]` 表示使用前 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 种硬币凑成金额 `j` 所需的最少硬币数\n2. **状态转移**:对于第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 种硬币,我们有两种选择:\n - 不使用该硬币:`dp[i-1][j]`\n - 使用该硬币:`1 + dp[i][j-coins[i-1]]`(因为硬币可以重复使用,所以是`dp[i]`而不是`dp[i-1]`)\n3. **边界条件**:`dp[0][0] = 0`,表示不使用任何硬币凑成金额0需要0个硬币\n## 代码\n\n```javascript\nvar coinChange = function(coins, amount) {\n let n = coins.length;\n // 创建二维DP数组,dp[i][j]表示使用前i种硬币凑成金额j的最少硬币数\n let dp = new Array(n + 1).fill(0).map(()=>new Array(amount + 1).fill(Infinity));\n // 初始状态:使用0种硬币凑成金额0需要0个硬币\n dp[0][0] = 0;\n \n // 遍历每种硬币\n for(let i = 1; i <= n; i++){\n // 遍历所有可能的金额\n for(let j = 0; j <= amount; j++){\n // 状态转移方程:\n // 1. 不使用第i种硬币:dp[i - 1][j]\n // 2. 使用第i种硬币:1 + dp[i][j - coins[i - 1]] (前提是j - coins[i - 1] >= 0)\n dp[i][j] = Math.min(\n dp[i - 1][j],\n j - coins[i - 1] >= 0 ? 1 + dp[i][j - coins[i - 1]] : Infinity\n );\n }\n }\n \n // 返回结果,如果为无穷大说明无法凑成,返回-1\n return dp[n][amount] === Infinity ? -1 : dp[n][amount]\n};\n```\n\n## 时间和空间复杂度\n- 时间复杂度:O(n × amount),其中 n 是硬币种类数\n- 空间复杂度:O(n × amount)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3295404263","body":"## 思路\n\n### 状态定义\n\n- `dp[i][j]` 表示使用前 i 种硬币凑成金额 j 的组合数\n\n### 初始化\n\n- `dp[0][0] = 1`:使用 0 种硬币凑成金额 0 的方法数为 1(即什么都不选)\n\n### 状态转移方程\n\n对于第 i 种硬币(面值为 c):\n\n- `dp[i][j] = dp[i-1][j] + (j-c >= 0 ? dp[i][j-c] : 0)`\n- 其中:\n - `dp[i-1][j]`:不使用第 i 种硬币,仅使用前 i-1 种硬币凑成金额 j 的组合数\n - `dp[i][j-c]`:使用第 i 种硬币,即在凑成金额 j-c 的基础上再加一个第 i 种硬币\n\n### 关键点\n\n1. 这是一个\"完全背包\"问题:每种硬币可以使用无限次\n2. 使用的是二维DP,其中行代表硬币种类,列代表金额\n3. 转移方程中 `dp[i][j-c]`(而非 `dp[i-1][j-c]`)体现了每种硬币可重复使用的特性\n\n## 代码\n\n```javascript\n/**\n * @param {number} amount\n * @param {number[]} coins\n * @return {number}\n */\nvar change = function (amount, coins) {\n let n = coins.length, dp = new Array(n + 1).fill(0).map(() => new Array(amount + 1).fill(0));\n dp[0][0] = 1;\n for (let i = 1; i <= n; i++) {\n let c = coins[i - 1]\n for (let j = 0; j <= amount; j++) dp[i][j] = dp[i - 1][j] + (j - c >= 0 ? dp[i][j - c] : 0);\n }\n return dp[n][amount];\n };\n```\n### 时间和空间复杂度\n\n- 时间复杂度:O(n × amount),其中 n 是硬币种类数\n- 空间复杂度:O(n × amount)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3300884457","body":"## 思路\n\n1. **排序策略**:将孩子贪心值数组`g`和饼干尺寸数组[s](file://E:\\其他项目\\algorithm_exercises\\1.js)都按降序排列\n2. **贪心策略**:用最大的饼干去满足贪心值最大的孩子(即最难以满足的孩子)\n3. **双指针遍历**:使用两个指针分别遍历孩子和饼干数组\n4. **匹配逻辑**:如果当前饼干能满足当前孩子,则两个指针都前进;否则只移动孩子指针(尝试用同一块饼干满足贪心值更低的孩子)\n\n这种从最大到最小的分配方式体现了贪心思想:优先满足需求大的孩子,这样能保证整体效果最优。\n\n## 代码\n```javascript\n/**\n * @param {number[]} g\n * @param {number[]} s\n * @return {number}\n */\nvar findContentChildren = function(g, s) {\n const compare = (a,b)=>b - a;\n g.sort(compare);\n s.sort(compare);\n let i = 0,j = 0,m = g.length,n = s.length;\n let ans = 0;\n while(i < m && j < n){\n if(s[j] >= g[i]){\n ans++;\n j++;\n i++;\n }else i++;\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度为O(m log m + n log n),主要消耗在排序上,\n- 空间复杂度为O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3305173933","body":"\n## 思路\n\n贪心策略是:**尽可能选择结束时间早的区间,这样能为后续区间留出更多空间**。\n\n\n1. **按结束时间排序**:\n ```javascript\n intervals.sort((a,b)=>a[1] - b[1]);\n ```\n\n 将所有区间按照结束时间升序排列,优先考虑结束早的区间。\n\n2. **贪心选择**:\n ```javascript\n let lastEnd = -Infinity;\n for(let [s,e] of intervals){\n if(s >= lastEnd) {\n ans++;\n lastEnd = e;\n }\n }\n ```\n\n 遍历排序后的区间,如果当前区间的开始时间不早于上一个选中区间的结束时间,就选择这个区间。这确保了选中的区间互不重叠。\n\n3. **计算结果**:\n ```javascript\n return n - ans;\n ```\n\n 返回总区间数减去可以保留的区间数,即需要移除的区间数。\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} intervals\n * @return {number}\n */\nvar eraseOverlapIntervals = function(intervals) {\n intervals.sort((a,b)=>a[1] - b[1]);\n let ans = 0,n = intervals.length;\n let lastEnd = -Infinity;\n for(let [s,e] of intervals){\n if(s >= lastEnd) {\n ans++;\n lastEnd = e;\n }\n }\n return n - ans;\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n),主要消耗在排序上\n- 空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3312499521","body":"## 思路-:动态规划\n\n1. **问题目标**:判断是否能从数组的第一个位置跳到最后一个位置\n2. **解法**:使用动态规划从后往前推导\n3. **状态定义**:`dp[i]` 表示从位置 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 是否能到达最后一个位置\n4. **状态转移**:\n - 从倒数第二个位置开始往前推导\n - 对于每个位置 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22),检查能否通过跳跃到达后续的某个可达位置\n - 如果能跳到某个 `dp[j]` 为 `true` 的位置,则 `dp[i]` 也为 `true`\n\n```javascript\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canJump = function(nums) {\n let n = nums.length, dp = new Array(n).fill(false);\n dp[n - 1] = true;\n \n // 从倒数第二个位置开始向前遍历\n for(let i = n - 2; i >= 0; i--){\n let steps = nums[i];\n \n // 检查从当前位置 i 能否跳到某个可达的位置\n for(let delta = 1; delta <= steps && i + delta < n; delta++){\n let j = i + delta;\n if(dp[j]) {\n dp[i] = true;\n break;\n }\n }\n }\n \n return dp[0];\n};\n```\n\n\n## 思路总结\n\n1. **初始化**:创建一个布尔数组 [dp](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\467\\3.js#L22-L22),长度与输入数组相同,所有元素初始化为 `false`\n2. **边界条件**:最后一个位置默认为 `true`(已经在最后一个位置了)\n3. **状态转移**:从倒数第二个位置开始,对每个位置检查:\n - 根据当前位置的值,确定可以跳跃的步数范围\n - 在这个范围内,检查是否存在某个可达的位置(`dp[j]` 为 `true`)\n - 如果存在,则当前位置也是可达的\n4. **结果**:返回 `dp[0]`,即从起始位置是否可达\n\n## 复杂度分析\n这是一种典型的动态规划解法,\n- 时间复杂度为 O(n²),\n- 空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/71#issuecomment-3314420253","body":"## 思路:\n\n1. **状态定义**:`dp[i]` 表示由 i 个不同节点能构成的不同二叉搜索树的数量\n\n2. **状态转移方程**:\n - 对于 i 个节点,我们可以让其中任意一个节点 j (1 ≤ j ≤ i) 作为根节点\n - 当节点 j 作为根时:\n - 左子树包含比 j 小的 j-1 个节点,能构成 `dp[j-1]` 种不同的二叉搜索树\n - 右子树包含比 j 大的 i-j 个节点,能构成 `dp[i-j]` 种不同的二叉搜索树\n - 根据乘法原理,以 j 为根的二叉搜索树总数为 `dp[j-1] * dp[i-j]`\n - 遍历所有可能的根节点,将结果累加得到 `dp[i]`\n\n3. **边界条件**:\n - `dp[0] = 1`:空树也算一种情况\n - `dp[1] = 1`:只有一个节点时,只能构成一种二叉搜索树\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar numTrees = function(n) {\n // 创建dp数组,dp[i]表示由i个不同节点能构成的不同二叉搜索树的数量\n let dp = new Array(n + 1).fill(0);\n \n // 边界条件:0个节点可以构成1棵空树,1个节点只能构成1种二叉搜索树\n dp[0] = 1;\n dp[1] = 1;\n \n // 计算2到n个节点能构成的不同二叉搜索树数量\n for(let i = 2; i <= n; i++){\n // 对于i个节点,尝试让每个节点作为根节点\n for(let j = 1; j <= i; j++){\n // 当第j个节点作为根时:\n // 左子树有j-1个节点,可以构成dp[j-1]种不同的二叉搜索树\n // 右子树有i-j个节点,可以构成dp[i-j]种不同的二叉搜索树\n // 根据乘法原理,以j为根的二叉搜索树数量为dp[j-1] * dp[i-j]\n dp[i] += dp[j - 1] * dp[i - j]\n }\n }\n \n // 返回n个节点能构成的不同二叉搜索树数量\n return dp[n]\n};\n```\n\n\n\n\n\n## 复杂度分析\n- 时间复杂度为 O(n²),\n- 空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3315877464","body":"\n## 思路\n\n使用了**最小优先队列**来解决合并K个有序链表的问题,这是一种非常高效的解决方案。\n\n### 核心思想\n\n1. **使用最小优先队列维护所有链表的头部节点**:\n - 将K个链表的头节点都放入最小优先队列中\n - 优先队列会根据节点值进行排序,确保队首始终是最小值节点\n\n2. **逐步构建结果链表**:\n - 每次从优先队列中取出值最小的节点\n - 将该节点连接到结果链表末尾\n - 如果该节点还有后续节点,则将后续节点加入优先队列\n\n3. **重复过程直到优先队列为空**:\n - 当优先队列为空时,说明所有节点都已处理完毕\n\n### 代码详解\n\n```javascript\nvar mergeKLists = function(lists) {\n // 创建虚拟头节点,便于操作\n let dummy = new ListNode(), dh = dummy;\n \n // 创建最小优先队列,比较函数是基于节点值\n let q = new MinPriorityQueue(v => v.val);\n \n // 将所有非空链表的头节点加入优先队列\n for(let i = 0; i < lists.length; i++) \n if(lists[i]) q.enqueue(lists[i]);\n \n // 当优先队列不为空时继续处理\n while(q.size()){\n // 取出值最小的节点\n let n = q.dequeue();\n \n // 将该节点连接到结果链表\n dh.next = n;\n dh = dh.next;\n \n // 如果该节点有后续节点,将其加入优先队列\n if(n.next) q.enqueue(n.next);\n }\n \n // 返回合并后的链表\n return dummy.next;\n};\n```\n\n\n## 复杂度分析\n\n1. **时间复杂度优化**:\n - 时间复杂度为 O(N log K),其中 N 是所有节点总数,K 是链表数量\n\n2. **空间复杂度**:\n - 空间复杂度为 O(K),只需要存储K个链表的头部节点\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/73#issuecomment-3322038797","body":"## 思路:\n\n1. **分治思想**:\n - 将问题分解为两个子问题:分别处理奇数和偶数\n - `oushu = n >> 1` 计算偶数的个数(相当于 n/2 的整数部分)\n - `jishu = n - oushu` 计算奇数的个数\n\n2. **递归处理**:\n - `l1 = beautifulArray(jishu)` 递归生成奇数个数对应的漂亮数组\n - `l2 = beautifulArray(oushu)` 递归生成偶数个数对应的漂亮数组\n\n3. **映射构造**:\n - 对于奇数部分:`for(let i of l1) ans.push(2 * i - 1)` 将每个元素映射为奇数\n - 对于偶数部分:`for(let i of l2) ans.push(2 * i)` 将每个元素映射为偶数\n\n4. **核心思想**:\n - 通过将数组分为奇数和偶数两部分,确保不会在奇数和偶数之间形成等差数列\n - 因为如果一个数是奇数,另一个是偶数,那么它们的平均数不可能是整数,也就不可能在数组中找到第三个数构成等差数列\n\n## 关键点:\n\n- 基础情况:当 n=1 时,直接返回 [1]\n- 使用位运算 `>>` 实现整数除法,提高效率\n- 通过分别处理奇数和偶数部分,巧妙地避免了等差数列的形成\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number[]}\n */\nvar beautifulArray = function(n) {\n if(n === 1) return [1];\n let oushu = n >> 1,jishu = n - oushu;\n let l1 = beautifulArray(jishu),l2 = beautifulArray(oushu);\n let ans = [];\n for(let i of l1) ans.push(2 * i - 1);\n for(let i of l2) ans.push(2 * i);\n return ans\n};\n```\n\n## 复杂度分析\n- 时间复杂度为 O(n log n)。\n- 空间复杂度为 O(n log n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322078023","body":"## 思路:\n\n1. **异或运算的性质**:\n - 相同数字异或结果为0:`a ^ a = 0`\n - 任何数字与0异或等于自身:`a ^ 0 = a`\n - 异或运算满足交换律和结合律\n\n2. **第一步:计算所有数字的异或结果**:\n ```javascript\n let xor = 0;\n nums.forEach(n=>xor = xor ^ n);\n ```\n\n 这一步得到的是两个只出现一次的数字的异或结果,因为出现两次的数字都会相互抵消。\n\n3. **第二步:找到区分两个目标数字的位**:\n ```javascript\n let type = xor & (-xor);\n ```\n\n 这一步很关键,通过 `xor & (-xor)` 找到 `xor` 中最右边的1位。这个位必定在两个目标数字中一个为1,一个为0,因为只有这样它们的异或结果才会是1。\n\n4. **第三步:根据该位将数组分为两组**:\n ```javascript\n let a = 0, b = 0;\n for(let num of nums){\n if(type & num) a = a ^ num; // 该位为1的数字分为一组\n else b ^= num; // 该位为0的数字分为一组\n }\n ```\n\n 通过这种方式,将两个目标数字分到不同的组中,而相同的数字由于该位相同会被分到同一组,在组内异或后会被抵消,最终每组只剩下各自的目标数字。\n\n## 复杂度分析\n\n- 时间复杂度是 O(n),\n- 空间复杂度是 O(1),非常高效。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar singleNumber = function(nums) {\n let xor = 0;\n nums.forEach(n=>xor = xor ^ n);\n let type = xor & (-xor);\n let a = 0,b = 0;\n for(let num of nums){\n if(type & num) a = a ^ num;\n else b ^= num;\n }\n return [a,b];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3326222352","body":"## 思路\n\n1. `let n = 1 << (nums.length)`:通过左移运算计算出子集的总数。对于长度为n的数组,其子集总数为2^n。这里使用位运算`1 << nums.length`等价于2的nums.length次方。\n\n2. 外层循环`for(let i = 0;i < n;i++)`:遍历从0到2^n-1的每个数字,每个数字代表一个子集。\n\n3. 对于每个数字i(用变量j来操作):\n - 使用`j & 1`检查j的最低位是否为1\n - 如果是1,则将nums[k]加入当前子集temp中\n - 然后将j右移一位(`j >>= 1`),检查下一位\n - 同时k递增,指向nums中的下一个元素\n\n4. 内层while循环结束后,将生成的子集temp添加到结果数组ans中。\n\n## 复杂度分析\n使用位运算生成所有子集的方法,\n- 时间复杂度为O(n*2^n),\n- 空间复杂度为O(n*2^n)。\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[][]}\n */\nvar subsets = function(nums) {\n let n = 1 << (nums.length),ans = [];\n for(let i = 0;i < n;i++){\n let temp = [],j = i,k = 0;\n while(j){\n if(j & 1) temp.push(nums[k]);\n j >>= 1;\n k++;\n }\n ans.push(temp);\n }\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3331626491","body":"## 思路\n\n1. **TrieNode(Trie节点)**\n - `isEnd`:标记该节点是否为某个单词的结尾\n - `children`:大小为26的数组,存储指向子节点的指针(对应26个小写字母)\n\n2. **辅助函数**\n - `getCharIndex(c)`:将字符转换为其在字母表中的索引(0-25)\n\n### 1. 初始化(`Trie`构造函数)\n- 创建一个根节点 `root`,作为整个Trie树的起点\n\n### 2. 插入单词(`insert`方法)\n- 从根节点开始,逐字符遍历要插入的单词\n- 对于每个字符:\n - 计算其在字母表中的索引\n - 如果对应子节点不存在,则创建新节点\n - 移动到该子节点\n- 遍历完所有字符后,将最后一个节点标记为单词结尾(`isEnd = true`)\n\n### 3. 搜索单词(`search`方法)\n- 从根节点开始,逐字符遍历要搜索的单词\n- 对于每个字符:\n - 计算索引并检查对应子节点是否存在\n - 如果不存在,返回 `false`\n - 如果存在,移动到该子节点\n- 遍历完所有字符后,检查最后一个节点是否为单词结尾(`isEnd`为`true`)\n\n### 4. 前缀匹配(`startsWith`方法)\n- 与`search`类似,但不检查最后一个节点是否为单词结尾\n- 只要能完整遍历前缀中的所有字符,就返回`true`\n\n## 时间复杂度\n- 插入和搜索操作的时间复杂度均为O(m),其中m为单词或前缀的长度\n\n## 空间复杂度\n- O(ALPHABET_SIZE × N × M),其中N为插入的单词数,M为平均单词长度\n\n## 代码\n```javascript\nfunction TrieNode(){\n this.isEnd = false;\n this.children = new Array(26);\n}\n\nfunction getCharIndex(c){\n return c.charCodeAt(0) - 'a'.charCodeAt(0);\n}\n\nvar Trie = function() {\n this.root = new TrieNode();\n};\n\n/** \n * @param {string} word\n * @return {void}\n */\nTrie.prototype.insert = function(word) {\n let root = this.root;\n for(let c of word){\n let i = getCharIndex(c);\n if(!root.children[i]) root.children[i] = new TrieNode();\n root = root.children[i];\n }\n root.isEnd = true;\n};\n\n/** \n * @param {string} word\n * @return {boolean}\n */\nTrie.prototype.search = function(word) {\n let root = this.root;\n for(let c of word){\n let i = getCharIndex(c);\n if(!root.children[i]) return false;\n root = root.children[i];\n }\n return root.isEnd;\n};\n\n/** \n * @param {string} prefix\n * @return {boolean}\n */\nTrie.prototype.startsWith = function(prefix) {\n let root = this.root;\n for(let c of prefix){\n let i = getCharIndex(c);\n if(!root.children[i]) return false;\n root = root.children[i];\n }\n return !!root\n};\n\n/** \n * Your Trie object will be instantiated and called as such:\n * var obj = new Trie()\n * obj.insert(word)\n * var param_2 = obj.search(word)\n * var param_3 = obj.startsWith(prefix)\n */\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3336492052","body":"## 思路\n\n### 1. TrieNode 结构\n- `TrieNode` 是一个前缀树节点结构。\n- 每个节点包含:\n - `value`: 当前节点对应的值总和。\n - [end](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14): 标记该节点是否为某个单词的结尾。\n - `children`: 长度为26的数组,存储子节点(对应字母a-z)。\n\n### 2. MapSum 类\n- 使用前缀树(Trie)和哈希表(Map)实现键值映射与前缀求和功能。\n- `root`: Trie树的根节点。\n- [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5): 存储已插入的键值对。\n\n## 核心方法\n\n### insert(key, val)\n- 插入或更新键值对:\n - 如果键已存在,更新所有相关节点的值(先减去旧值,再加上新值)。\n - 如果是新键,则在Trie中创建路径,并在路径上的每个节点累加值。\n - 最后更新哈希表中的键值对。\n\n### sum(prefix)\n- 查询指定前缀的所有键值总和:\n - 遍历前缀,在Trie中查找对应的节点。\n - 若找不到完整前缀则返回0。\n - 返回前缀末尾节点的 `value` 值(即以该前缀开头的所有键的值总和)。\n\n## 工具函数\n\n### getCharIndex(char)\n- 将字符转换为其在字母表中的索引(0-25)。\n\n\n\n\n## 代码\n```javascript\nfunction TrieNode(){\n this.value = 0;\n this.end = false;\n this.children = new Array(26);\n}\n\nfunction getCharIndex(a){return a.charCodeAt(0) - 'a'.charCodeAt(0)}\nvar MapSum = function() {\n this.root = new TrieNode();\n this.map = new Map();\n};\n\n/** \n * @param {string} key \n * @param {number} val\n * @return {void}\n */\nMapSum.prototype.insert = function(key, val) {\n if(this.map.has(key)){\n let root = this.root;\n for(let c of key){\n let i = getCharIndex(c);\n root.children[i].value -= this.map.get(key);\n root.children[i].value += val;\n root = root.children[i];\n }\n }else{\n let root = this.root;\n for(let c of key){\n let i = getCharIndex(c);\n if(!root.children[i]) root.children[i] = new TrieNode();\n root = root.children[i];\n root.value += val;\n }\n root.end = true;\n }\n this.map.set(key,val);\n};\n\n/** \n * @param {string} prefix\n * @return {number}\n */\nMapSum.prototype.sum = function(prefix) {\n let root = this.root;\n let ans = 0\n for(let c of prefix){\n let i = getCharIndex(c);\n if(!root.children[i]) return 0;\n root = root.children[i];\n }\n return root.value;\n};\n\n/** \n * Your MapSum object will be instantiated and called as such:\n * var obj = new MapSum()\n * obj.insert(key,val)\n * var param_2 = obj.sum(prefix)\n */\n```\n\n\n## 复杂度分析\n- 时间复杂度:O(n),n位单词的长度。\n- 空间复杂度:O(m * n),m为单词个数,n为单词长度。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/78#issuecomment-3340984021","body":"## 算法思路\n\n1. **构建 Trie 树**:\n - 将 `smalls` 数组中的所有字符串插入到 Trie 树中\n - 每个节点记录是否为单词结尾([end](file://E:\\力扣刷题\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14) 标志)以及对应的索引位置([i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22))\n\n2. **搜索过程**:\n - 遍历 `big` 字符串的每个位置作为起始点\n - 对每个起始点,使用 [dfs](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\465\\2.js#L9-L25) 函数在 Trie 树中进行匹配\n - 当匹配到完整单词时,将起始位置记录到对应的结果数组中\n\n3. **Trie 树结构**:\n - `TrieNode`:包含 [end](file://E:\\力扣刷题\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14) 标志、子节点数组和索引 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22)\n - `Trie`:提供插入方法,将单词和其索引存储到树中\n\n## 关键函数分析\n\n- **`multiSearch` 主函数**:\n - 初始化 Trie 树并插入所有 smalls 单词\n - 遍历 big 字符串每个位置进行搜索\n\n- **[dfs](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\465\\2.js#L9-L25) 辅助函数**:\n - 从当前 Trie 节点继续匹配字符\n - 找到匹配单词时记录位置信息\n\n## 时间复杂度\n\n- **构建 Trie**:O(∑|smalls[i]|),即所有 smalls 字符串长度之和\n- **搜索过程**:O(|big| × max_match_length)\n - 外层循环遍历 `big` 字符串:O(|big|)\n - 每次 dfs 最坏情况遍历到最长匹配:O(max_match_length)\n- **总体复杂度**:O(∑|smalls[i]| + |big| × max_match_length)\n\n## 空间复杂度\n\n- **Trie 树存储**:O(∑|smalls[i]| × 26) = O(∑|smalls[i]|)\n- **结果数组**:O(∑结果数量)\n- **总体空间复杂度**:O(∑|smalls[i]| + 结果数量)\n\n## 代码\n```javascript\n/**\n * @param {string} big\n * @param {string[]} smalls\n * @return {number[][]}\n */\nvar multiSearch = function(big, smalls) {\n let trie = new Trie(),n = smalls.length;\n for(let i = 0;i < n;i++) trie.insert(smalls[i],i);\n let ans = new Array(n).fill(0).map(()=>[]);\n for(let i = 0;i < big.length;i++){\n let root = trie.root;\n let c = big[i],j = getCharIndex(c);\n if(!root.children[j]) continue;\n dfs(root,i,i);\n }\n\n return ans;\n\n // --------------------------\n function dfs(root,index,j){\n if(index === big.length) return;\n let c = big[index],i = getCharIndex(c);\n if(!root.children[i]) return;\n root = root.children[i];\n if(root.end) ans[root.i].push(j);\n dfs(root,index + 1,j);\n }\n};\n\n\n\n\nfunction Trie(){\n this.root = new TrieNode();\n}\n\nTrie.prototype.insert = function(word,i){\n let root = this.root;\n for(let c of word){\n let j = getCharIndex(c);\n if(!root.children[j]) root.children[j] = new TrieNode();\n root = root.children[j]\n }\n root.i = i;\n root.end = true;\n}\n\n\nfunction TrieNode(){\n this.end = false;\n this.children = new Array(26);\n this.i = -1;\n}\n\nfunction getCharIndex(c){\n return c.charCodeAt(0) - 'a'.charCodeAt(0);\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/79#issuecomment-3342189359","body":"## 思路\n\n1. **并查集初始化**:\n - 创建一个长度为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6) 的数组 [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17),其中 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6) 是城市数量\n - 初始化时,每个城市都指向自己,即 `f[i] = i`,表示每个城市初始时都是独立的集合\n\n2. **连接城市**:\n - 遍历 `isConnected` 矩阵,对于每一对相连的城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 和 `j`\n - 调用 [merge(i, j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28) 函数将它们合并到同一个集合中\n\n3. **并查集操作**:\n - [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24) 函数:查找城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 所属集合的根节点,并进行路径压缩优化\n - [merge(i, j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28) 函数:将城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 和 `j` 所在的集合合并\n\n## 关键点分析\n\n- **路径压缩**:在 [find](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\2.js#L26-L29) 函数中使用了 `f[i] = find(f[i])` 来压缩路径,提高查找效率\n- **集合合并**:每次成功合并两个不同的集合时,省份数量 [ans](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6) 减一\n- **初始值**:[ans](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6) 初始化为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6),表示最坏情况下每个城市都是一个独立省份\n\n## 代码\n```javascript\n/**\n * @param {number[][]} isConnected\n * @return {number}\n */\nvar findCircleNum = function(isConnected) {\n let n = isConnected.length,f = new Array(n).fill(0).map((_,i)=>i);\n let ans = n;\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(isConnected[i][j]) merge(i,j);\n }\n }\n return ans;\n // ------------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n let fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n ans--;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n^2),其中 n 是城市数量\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/80#issuecomment-3344661787","body":"## 思路\n\n1. **并查集初始化**\n - 使用并查集(Union-Find)数据结构来管理节点连接关系\n - [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17) 数组存储每个节点的父节点,初始时每个节点的父节点是自身\n - [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 数组存储每个连通分量的大小,初始时每个分量大小为1\n\n2. **构建连通分量**\n - 遍历 `graph` 矩阵,对于每条边 `graph[i][j]`,将节点 i 和 j 合并到同一连通分量中\n - 通过 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 函数实现节点合并,并更新连通分量大小\n\n3. **统计初始感染节点**\n - 使用 `initialMap` 统计每个连通分量中有多少个初始感染节点\n - 通过 [find](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\2.js#L26-L29) 函数找到每个初始感染节点所属的连通分量\n\n4. **选择最优移除节点**\n - 遍历所有初始感染节点,寻找满足以下条件的节点:\n - 所在连通分量只有1个初始感染节点(否则移除该节点无法减少传播)\n - 能够拯救最多节点的连通分量\n - 如果拯救数量相同,选择索引最小的节点\n\n5. **边界情况处理**\n - 如果所有初始感染节点所在的连通分量都包含多个感染节点,则返回 `initial` 中的最小索引\n\n## 关键函数\n\n- [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24): 查找节点 i 的根节点(带路径压缩优化)\n- [merge(i,j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28): 合并节点 i 和 j 所在的连通分量\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} graph\n * @param {number[]} initial\n * @return {number}\n */\nvar minMalwareSpread = function(graph, initial) {\n let n = graph.length;\n let f = new Array(n).fill(0).map((_,i)=>i);\n let s = new Array(n).fill(1);\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(graph[i][j]) merge(i,j);\n }\n }\n\n\n let initialMap = new Map();\n for(let i of initial){\n let fi = find(i);\n initialMap.set(fi,initialMap.has(fi) ? initialMap.get(fi) + 1 : 1);\n }\n let ans = n,max = 0;\n for(let i of initial){\n let fi = find(i);\n if(initialMap.get(fi) > 1) continue;\n if(s[fi] > max || s[fi] === max && i < ans) {\n max = s[fi];\n ans = i\n }\n }\n\n return ans === n ? initial.reduce((prev,curr)=>Math.min(prev,curr),n) : ans;\n\n\n\n // -----------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n let fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n s[fj] += s[fi];\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n^2),\n- 空间复杂度:O(n),其中 n 是节点数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/81#issuecomment-3349592362","body":"\n\n## 思路\n\n1. **并查集数据结构**:\n - 使用数组 [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17) 实现并查集,初始化时每台计算机的父节点是自身\n - [size](file://E:\\其他项目\\algorithm_exercises\\libs\\Stack.js#L19-L21) 记录当前连通分量的数量,初始为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6)\n\n2. **可行性判断**:\n - 如果连接数 `cnt` 小于 `n-1`,则无法连接所有计算机,返回 `-1`\n\n3. **连通分量合并**:\n - 遍历所有连接关系,通过 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 函数合并对应的计算机\n - 每次成功合并都会减少连通分量数量\n\n4. **结果计算**:\n - 最终需要的操作次数等于连通分量数减一(`size - 1`)\n\n## 关键函数\n\n- [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24):查找计算机 [i](file://E:\\其他项目\\algorithm_exercises\\周赛\\469\\2.js#L23-L23) 所在集合的根节点(带路径压缩优化)\n- [merge(i,j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28):合并计算机 [i](file://E:\\其他项目\\algorithm_exercises\\周赛\\469\\2.js#L23-L23) 和 `j` 所在的集合\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} connections\n * @return {number}\n */\nvar makeConnected = function(n, connections) {\n const cnt = connections.length;\n if(cnt < n - 1) return -1;\n const f = new Array(n).fill(0).map((_,i)=>i);\n let size = n;\n for(let [i,j] of connections) merge(i,j);\n return size - 1;\n\n // ----------------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n const fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n size--;\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(m×α(n)),其中 m 是连接数,α 是阿克曼函数的反函数\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3354314699","body":"## 思路\n\n使用**后序遍历**的方式递归处理二叉树,删除所有值为0的叶子节点及其所属的全0子树。\n\n## 具体实现分析\n\n1. **基础情况处理**\n - `if(!root) return root;` - 空节点直接返回\n - `if(root && !root.left && !root.right) return root.val === 0 ? null : root;` - 叶子节点判断:如果是值为0的叶子节点则删除\n\n2. **递归处理**\n - `let l = pruneTree(root.left), r = pruneTree(root.right);` - 递归处理左右子树\n - 处理后的左右子树结果保存在 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\468\\2.js#L7-L7) 和 [r](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\447\\1.js#L31-L31) 中\n\n3. **当前节点判断**\n - `if(!l && !r && root.val === 0) return null;` - 如果左右子树都被删除且当前节点值为0,则删除当前节点\n - 否则更新当前节点的左右子树引用并返回当前节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {TreeNode}\n */\nvar pruneTree = function(root) {\n if(!root) return root;\n if(root && !root.left && !root.right) return root.val === 0 ? null : root;\n\n let l = pruneTree(root.left),r = pruneTree(root.right);\n if(!l && !r && root.val === 0) return null;\n root.left = l;\n root.right = r;\n return root;\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**: O(n),需要访问每个节点一次\n- **空间复杂度**: O(h),h为树的高度,递归调用栈的深度\n- **关键点**: 后序遍历确保了从叶子节点开始处理,逐步向上删除符合条件的节点","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null],"haoyuliaocurb":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073435345","body":"```\n// Time Complexity: O(max(num.length, k))\n// Space Complexity: O(max(num.length, k))\n\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(num, k) {\n const num1 = num;\n const num2 = String(k).split('').map(v => Number(v));\n const sum = [];\n\n for (let i = 0; i < Math.max(num1.length, num2.length); i += 1) {\n const s = (num1[num1.length - 1 - i] ?? 0) + (num2[num2.length - 1 - i] ?? 0) + (sum[i] ?? 0);\n\n sum[i] = s % 10;\n sum[i + 1] = (s - (s % 10)) / 10;\n }\n\n if (sum[sum.length - 1] === 0) sum.pop();\n sum.reverse();\n\n return sum;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078842293","body":"【解題方向】\n\n第一想法:對於每一個 s[i] 都遍歷一次找最近的 c,Time Complexity 為 O(n^2) \n\n第二想法:先遍歷一遍 s 找到所有的 c,然後從所有的 c 開始向兩邊走\n\t=> 不過想到如何記錄狀態就覺得太複雜,而且可能最糟情況還是 Time Complexity 為 O(n^2) \n\n第三想法:看了提示,想到正向遍歷、反向遍歷一次,記錄 s[i] 與左右兩邊的 c 的最小距離\n\t=> 由於題目保證至少有一個 s 中至少有一個 c,對於每個 s[i],其左或右必然會有一個 c\n\n【程式碼】\n```\n// Time Complexity: O(n), n = s.length;\n// Space Complexity: O(n), n = s.length;\n\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const chars = s.split('');\n const res = new Array(chars.length).fill(Infinity);\n\n let leftTargetCharIndex = -1;\n for (let i = 0; i < chars.length; i += 1) {\n if (chars[i] === c) leftTargetCharIndex = i;\n if (leftTargetCharIndex > -1) {\n res[i] = Math.min(res[i], Math.abs(leftTargetCharIndex - i));\n }\n }\n\n let rightTargetCharIndex = -1;\n for (let i = chars.length - 1; i > -1; i -= 1) {\n if (chars[i] === c) rightTargetCharIndex = i;\n if (rightTargetCharIndex > -1) {\n res[i] = Math.min(res[i], Math.abs(rightTargetCharIndex - i));\n }\n }\n\n return res;\n};\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089452516","body":"1. 第一個直覺是用 recursion 來解題,不過過程中會遇到很多 edge case 沒有考慮到而 error thrown\n2. 後來改用 stack 來實踐,也很清楚,不過需要搞懂什麼應該被放進 stack,以及 pop and push 的時機\n\n```\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * Recursive version of decodeString\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const helper = (str, index) => {\n let result = '';\n let num = 0;\n \n while (index < str.length) {\n const char = str[index];\n \n if (char >= '0' && char <= '9') {\n num = num * 10 + parseInt(char);\n index++;\n } else if (char === '[') {\n // Recursively decode the content inside brackets\n const [decodedStr, newIndex] = helper(str, index + 1);\n result += decodedStr.repeat(num);\n num = 0; // Reset number after using it\n index = newIndex;\n } else if (char === ']') {\n // End of current bracket section - return result and current index\n return [result, index + 1];\n } else {\n // Regular character\n result += char;\n index++;\n }\n }\n \n return [result, index];\n };\n \n return helper(s, 0)[0];\n};\n\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let currentStr = '';\n let currentNum = 0;\n \n for (let i = 0; i < s.length; i++) {\n const char = s[i];\n \n if (char >= '0' && char <= '9') {\n currentNum = currentNum * 10 + parseInt(char);\n } else if (char === '[') {\n // Push current state to stack\n stack.push([currentStr, currentNum]);\n currentStr = '';\n currentNum = 0;\n } else if (char === ']') {\n // Pop from stack and decode\n const [prevStr, num] = stack.pop();\n currentStr = prevStr + currentStr.repeat(num);\n } else {\n // Regular character\n currentStr += char;\n }\n }\n \n return currentStr;\n};\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091467280","body":"透過第二個 stack 倒轉第一個 in-stack 的順序,以達到 FIFO 的效果\n```\n// Time Complexity: O(1) for push, pop, peek, empty;\n// Space Complexity: O(n)\n\nclass MyQueue {\n constructor() {\n this.inStack = [];\n this.outStack = [];\n }\n\n /** \n * @param {number} x\n * @return {void}\n */\n push(x) {\n this.inStack.push(x);\n }\n\n /**\n * @return {number}\n */\n pop() {\n if (!this.outStack.length) {\n this.pushToOutStack();\n }\n\n return this.outStack.pop();\n }\n\n /**\n * @return {number}\n */\n peek() {\n if (!this.outStack.length) {\n this.pushToOutStack();\n }\n\n return this.outStack[this.outStack.length - 1];\n }\n\n /**\n * @return {boolean}\n */\n empty() {\n return this.peek() === undefined;\n }\n\n pushToOutStack() {\n while (this.inStack.length) {\n this.outStack.push(this.inStack.pop());\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094426027","body":"// Time Complexity: O(n);\n// Space Complexity: O(n);\n\n```\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const sortedArr = [...arr].sort((a, b) => a - b);\n let counts = {};\n let chunkAmount = 0;\n\n for (let i = 0; i < arr.length; i += 1) {\n counts[arr[i]] = (counts[arr[i]] ?? 0) + 1;\n counts[sortedArr[i]] = (counts[sortedArr[i]] ?? 0) - 1;\n\n if (Object.values(counts).every((value) => value === 0)) {\n chunkAmount += 1;\n }\n }\n\n return chunkAmount;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095908728","body":"```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\nvar rotateRight = function (head, k) {\n if (!head || !head.next) return head;\n\n let length = 0;\n let cur = head;\n\n while (cur) {\n cur = cur.next;\n length += 1;\n }\n\n k = k % length;\n let left = head;\n let right = head;\n\n while (right.next) {\n if (k <= 0) left = left.next;\n right = right.next;\n k -= 1;\n }\n\n right.next = head; // Handle the case when left and right point to the same node.\n let res = left.next;\n left.next = null;\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3102283858","body":"建立一個 dummy 連結在 head 之前,便可以將 head 當作中間節點處理。每次互換節點會牽涉四個節點,pre, cur, next, next.next,其中 pre 的初始值為 dummy,因此在每個迴圈保證有值,而真正要互換的 cur, next,其兩有值為 while 迴圈繼續的必要條件,next.next 為 null 則沒關係。\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n const dummy = { val: 0, next: head };\n\n let pre = dummy;\n let cur = pre.next;\n let next = cur?.next;\n\n while (cur && next) {\n pre.next = next;\n cur.next = next.next;\n next.next = cur;\n\n [pre, cur, next] = [cur, cur.next, cur.next?.next];\n }\n\n return dummy.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105649705","body":"# 想法\n轉換成 Height Balanced Binary Search Tree 會需要進行 Binary Search,考慮到單向鏈錶不方便直接存取 node,因此直接將鏈錶轉成數組,並直接以數組配合 Binary Search 遞迴建立樹。\n\n```\n\n// Time Complexity: O(n);\n// Space Complexity: O(n);\n\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if (head === null) return null;\n\n const dummy = new ListNode(0, head);\n const arr = [];\n\n let tail = dummy;\n\n while (tail) {\n const next = tail.next;\n next && arr.push(next.val);\n tail = next;\n }\n\n const inner = (l, r) => {\n if (l > r) return null;\n if (l === r) return new TreeNode(arr[r]);\n\n const m = Math.ceil((l + r) / 2);\n\n return new TreeNode(arr[m], inner(l, m - 1), inner(m + 1, r));\n };\n\n return inner(0, arr.length - 1);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112936097","body":"## 思考方向\n### 雙指針\n用兩個指針分別從 headA, headB 開始走,走到盡頭換到另一個 head。過程中若指向同一個點則為兩鏈錶的交點,若皆遍歷一遍後無交點,則兩鏈錶無相交。\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function(headA, headB) {\n let pointerA = headA;\n let pointerB = headB;\n let switchCounts = 0;\n\n while (switchCounts < 3) {\n if (pointerA === pointerB) return pointerA;\n\n if (pointerA?.next) {\n pointerA = pointerA.next;\n } else {\n switchCounts += 1;\n pointerA = headB;\n }\n\n if (pointerB?.next) {\n pointerB = pointerB.next;\n } else {\n switchCounts += 1;\n pointerB = headA;\n }\n }\n\n return null;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116343077","body":"## 解題方向\n- 快慢指針法\n\n## Edge Cases\n- 當快指針走到 null 代表沒有環\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n let fast = head;\n let slow = head;\n\n do {\n if (fast === null) return null;\n\n fast = fast?.next?.next ?? null;\n slow = slow?.next ?? null;\n } while (fast !== slow);\n\n fast = head;\n\n while (fast !== slow) {\n fast = fast?.next ?? null;\n slow = slow?.next ?? null;\n }\n\n return fast;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121584769","body":"## 解題方向\n- 看到 FISO 的第一個想法是用 Queue,搭配 hash 也可以達到 get O(1) 的要求,不過 put 更新既有的值,就沒辦法 O(1)。\n若是 put 更新既有的值要 O(1),還是需要使用鏈表。\n- 中間有一度 debug 卡關,主要是原本在 put 時無論如何都先把既有的 node 刪掉再新增,但這可能造成一些 state 更新上的錯誤,後來簡化為直接移動 node 才 AC。\n\n```\n// Time Complexity: O(1) for LRUCache.prototype.get, put\n// Space Complexity: O(n)\n\nfunction ListNode(key, val) {\n this.key = key;\n this.val = val;\n this.next = null;\n this.pre = null;\n }\n\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.length = 0;\n this.head = new ListNode();\n this.tail = new ListNode();\n this.head.next = this.tail;\n this.tail.pre = this.head;\n this.map = {};\n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n const node = this.map[key];\n\n if (node !== undefined) {\n this.appendToTail(this.remove(node));\n return node.val\n };\n\n return -1;\n};\n\n/** \n * @param {number} key \n * @param {number} val\n * @return {void}\n */\nLRUCache.prototype.put = function(key, val) {\n const node = this.map[key];\n\n if (node !== undefined) {\n node.val = val;\n this.appendToTail(this.remove(node));\n } else {\n if (this.length === this.capacity) {\n const old = this.head.next;\n delete this.map[old.key];\n this.length -= 1;\n this.remove(old);\n }\n\n const node = new ListNode(key, val);\n this.map[key] = node;\n this.length += 1;\n this.appendToTail(node);\n }\n};\n\nLRUCache.prototype.appendToTail = function(node) {\n if (node.pre) node.pre.next = node.next;\n if (node.next) node.next.pre = node.pre;\n this.tail.pre.next = node;\n node.pre = this.tail.pre;\n node.next = this.tail;\n this.tail.pre = node;\n}\n\nLRUCache.prototype.remove = function(node) {\n node.pre.next = node.next;\n node.next.pre = node.pre;\n node.pre = null;\n node.next = null;\n\n return node;\n}\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123752698","body":"## 解題方向\n### DFS\n- 需注意當 helper 的 params root 為 null 時,應回傳 0\n\n```\n// Time Complexity: O(n), n for numbers of nodes.\n// Space Complexity: O(h), h for the max depth of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n const helper = (root) => {\n if (!root) return 0;\n if (!root.left && !root.right) return 1;\n return Math.max(helper(root.left), helper(root.right)) + 1;\n };\n\n return helper(root);\n};\n```\n\n### Layer Iteration\n- 由於 stack 的起始值就有一個 root node,因此要先處理 root 為 null 的狀況\n\n```\n// Time Complexity: O(n), n for numbers of nodes.\n// Space Complexity: O(w), w for the max numbers of nodes in the same layer of tree.\n\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if (!root) return 0;\n\n const stack = [{ node: root, depth: 1 }];\n let maxDepth = 0;\n\n while (stack.length) {\n const { node, depth } = stack.shift();\n if (node.left) stack.push({ node: node.left, depth: depth + 1 });\n if (node.right) stack.push({ node: node.right, depth: depth + 1 });\n maxDepth = Math.max(maxDepth, depth);\n }\n\n return maxDepth;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125050709","body":"## 解題方向\n- 須理解兩棵樹一樣的意思是,其遍歷的結果會一樣,又題目有提到左右節點位置不同也不行,因此可以用多個遍歷結果來確認,或者可以將中間的空節點印出。可優化空間是不需要若於遍歷過程比較兩棵樹的節點,就不需要儲存遍歷結果。\n\n```javascript\n// Time Complexity: O(m + n), m, n are numbers of two tree nodes respectively.\n// Space Complexity: O(m + n)\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} p\n * @param {TreeNode} q\n * @return {boolean}\n */\nvar isSameTree = function(p, q) {\n const iterate = (root) => {\n const arr = [];\n const stack = [root];\n\n while (stack.length) {\n const node = stack.shift();\n\n arr.push(node?.val);\n\n if (node?.left || node?.right) {\n stack.push(node?.left);\n stack.push(node?.right);\n }\n }\n\n return arr;\n };\n\n return JSON.stringify(iterate(p)) === JSON.stringify(iterate(q));\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3131156971","body":"## 解題方向\n- 需要計算所有從 root 走到 leaf 的路線,這可以用 Recursion 來完成(回溯)\n- 用一個數字來紀錄 state:增加位數為「runningNumber * 10 + node.val」,減去位數為「Math.floor(runningNumber / 10)」\n\n```javascript\n// Time Complexity: O(n), n is the number of the tree nodes\n// Space Complexity: O(d), d is the depth of the tree\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root) {\n let sum = 0;\n let runningNumber = 0;\n\n const inner = (root) => {\n if (root) {\n runningNumber = runningNumber * 10 + root.val;\n\n if (!root.left && !root.right) {\n sum += runningNumber;\n } else {\n inner(root.left);\n inner(root.right);\n }\n\n runningNumber = Math.floor(runningNumber / 10);\n }\n };\n\n inner(root);\n\n return sum;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134845036","body":"## 解題方向\n- 可以使用 DFS 或 BFS 來解題\n- DFS 記錄最深深度的第一個節點數值,深度可作為參數於每次遞迴時傳遞\n- BFS 紀錄每層第一個節點數值\n- 題目保證 root 一定不為 null\n\n### DFS\n```javascript\n// Time Complexity: O(n), n is the number of tree nodes.\n// Space Complexity: O(d), d is the max depth of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let maxDepth = 0;\n let res = null;\n\n const dfs = (root, depth) => {\n if (depth > maxDepth) {\n maxDepth = depth;\n res = root.val;\n }\n\n root.left && dfs(root.left, depth + 1);\n root.right && dfs(root.right, depth + 1);\n };\n\n dfs(root, 1);\n\n return res;\n};\n```\n\n### BFS\n```javascript\n// Time Complexity: O(n), n is the number of tree nodes.\n// Space Complexity: O(w), w is the max width of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n const stack = [[root]];\n let res = null;\n\n while (stack.length) {\n const nodes = stack.pop();\n\n res = nodes[0].val;\n\n const nextNodes = [];\n\n for (const node of nodes) {\n node.left && nextNodes.push(node.left);\n node.right && nextNodes.push(node.right);\n }\n\n nextNodes.length && stack.push(nextNodes);\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138426787","body":"## 解題方向\n* 使用 DNS 前序遍歷,在 deserialize 時透過遞迴建立樹會較 BFS 容易。\n* 使用原生的 JSON.stringify and JSON.parse 來轉換 array 及 string\n* 優化方向:優化 Space Complexity 至 O(h),h 為樹的高度\n * 能直接產生 serialized string 而非在最後轉化\n * 一邊 deserialize 需要的 string 部分,而不需要在一開始開一個 array 儲存\n\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n// Time Complexity: O(n), n is number of tree nodes.\n// Space Complexity: O(n), n is number of tree nodes.\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n const preOrder = [];\n const dns = (root) => {\n preOrder.push(root?.val);\n if (root) {\n dns(root.left);\n dns(root.right);\n }\n };\n dns(root);\n\n return JSON.stringify(preOrder);\n};\n\n// Time Complexity: O(n), n is number of tree nodes.\n// Space Complexity: O(n), n is number of tree nodes.\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n const preOrder = JSON.parse(data);\n\n if (preOrder[0] === null || preOrder[0] === undefined) return preOrder[0];\n\n const createNode = () => {\n const val = preOrder.shift();\n\n if (val === null) return null;\n\n const node = new TreeNode(val);\n node.left = createNode();\n node.right = createNode();\n return node;\n };\n\n return createNode();\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144639245","body":"## 解題方向\n- 不一樣的遍歷方式會有差嗎? => 由於打算取值後再排序,因此沒差\n- 如何儲存最後的輸出最省力 => 用 hashmap\n\n```javascript\n// Time Complexity: O(nlogn), n is the number of tree.\n// Space Complexity: O(n), n is the number of tree.\n\n// /**\n// * Definition for a binary tree node.\n// * function TreeNode(val, left, right) {\n// * this.val = (val===undefined ? 0 : val)\n// * this.left = (left===undefined ? null : left)\n// * this.right = (right===undefined ? null : right)\n// * }\n// */\n// /**\n// * @param {TreeNode} root\n// * @return {number[][]}\n// */\nvar verticalTraversal = function(root) {\n const map = {};\n\n const traverse = (root, row, col) => {\n if (!root) return;\n\n if (!map[col]) {\n map[col] = [];\n }\n\n map[col].push([row, root.val]);\n traverse(root.left, row + 1, col - 1);\n traverse(root.right, row + 1, col + 1);\n };\n\n traverse(root, 0, 0);\n\n const keys = Object.keys(map).sort((a, b) => a - b);\n\n const res = keys.map((k) => {\n const arr = map[k];\n\n return arr.sort(([rowA, valA], [rowB, valB]) => {\n if (rowA === rowB) return valA - valB;\n return rowA - rowB;\n }).map(([,val]) => val);\n });\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146092009","body":"## 解題方向\n- 遍歷 nums 時使用 hashmap 來記錄曾出現過的數字及其 index,並看 hashmap 是否記錄 target - nums[i] 是否曾出現過\n- 可以特別注意題目要求同個元素不能被使用兩次,所以應將配對到的元素移出 hashmap(不過因為題目也說只有一組數字為答案,所以不做也沒關係)\n\n```javascript\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(1) \n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n const map = {};\n const res = [];\n\n for (let i = 0; i < nums.length; i += 1) {\n const num = nums[i];\n\n if (map[target - num] !== undefined) {\n res.push(i, map[target - num]);\n delete map[target - num];\n } else {\n map[num] = i;\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3146907342","body":"## 解法\n- 第一個想法是遍歷後得到 num 與其 frequency 的 hashmap,將其轉成 array 後排序並取前 k 者\n- 看了題解後可優化部分是,由於題目允許回傳值不需要依據 frequency 排序,因此可將原解法 sort 的部分改成 quick selection,將平均時間複查度從 O(nlogn) 將至 O(n)\n```javascript\n// Time Complexity: O(nlogn), n is nums.length.\n// Space Complexity: O(n), n is nums.length.\n\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function (nums, k) {\n const map = {};\n\n for (const num of nums) {\n map[num] = (map[num] ?? 0) + 1;\n }\n\n return Object.entries(map)\n .sort(([numA, freqA], [numB, freqB]) => {\n return freqB - freqA;\n })\n .filter((_, i) => i < k)\n .map(([num]) => Number(num));\n};\n```\n\n## 解法\n- 找 max frequent num\n- 回傳 left, right index range\n- 需要考慮當兩個 num frequency 相等時,應保留 range 較小者!\n```javascript\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(n), n is nums.length.\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findShortestSubArray = function (nums) {\n let maxFreqNum = nums[0];\n const map = {};\n\n for (let i = 0; i < nums.length; i += 1) {\n const num = nums[i];\n const { freq, left, right } = map[num] ?? { freq: 0, left: i, right: i };\n map[num] = {\n freq: freq + 1,\n left: i < left ? i : left,\n right: i > right ? i : right,\n };\n\n if (map[num].freq > map[maxFreqNum].freq) {\n maxFreqNum = num;\n } else if (map[num].freq === map[maxFreqNum].freq) {\n if (\n map[num].right - map[num].left <\n map[maxFreqNum].right - map[maxFreqNum].left\n ) {\n maxFreqNum = num;\n }\n }\n }\n\n const { left, right } = map[maxFreqNum];\n\n return right - left + 1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149617346","body":"```javascript\n// Time Complexity: O(n^2), n is points.length.\n// Space Complexity: O(n), n is points.length.\n\n/**\n * @param {number[][]} points\n * @return {number}\n */\nfunction numberOfBoomerangs(points) {\n const n = points.length;\n let ans = 0;\n \n for (let i = 0; i < n; i++) {\n const distanceMap = {};\n \n for (let j = 0; j < n; j++) {\n const dist = Math.pow(points[i][0] - points[j][0], 2) + Math.pow(points[i][1] - points[j][1], 2);\n distanceMap[dist] = (distanceMap[dist] ?? 0) + 1;\n }\n \n for (const count of Object.values(distanceMap)) {\n ans += count * (count - 1);\n }\n }\n \n return ans;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153048738","body":"## 解法\n- 經典的滑動視窗題目,與用 hashmap 紀錄字元的出現次數,並於迴圈中判斷下個字元是否已出現過,無則加入,有則刪除。\n- 需要特別注意\n- (1) 迴圈的邊界條件應為 right < s.length - 1,不然會讓 right 跑到 s.length\n- (2) 應先刪掉 map[s[left]] 再 left++\n\n```javascript\n// Time Complexity: O(n), n is s.length.\n// Space Complexity: O(m), m is types of characters in s.\n\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n if (!s.length) return 0;\n \n const chars = new Map();\n chars.set(s[0], 1);\n\n let max = 1;\n let left = 0;\n let right = 0;\n\n while (right < s.length - 1) {\n const cond = !chars.has(s[right + 1]);\n if (!chars.has(s[right + 1])) {\n right++;\n chars.set(s[right], 1);\n } else {\n chars.delete(s[left]);\n left++;\n }\n\n const number = right - left + 1;\n if (number > max) max = number;\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160434225","body":"## 解法\n- 一開始分析方向錯了,以為每個 substring 間不可重疊\n- 之後想到的是用 hashmap 存可能 substring 的結果,再遍歷一次,但是時間複雜度為階乘\n- 最後則是直接遍歷,再驗證 substring 是否正確,然而需考慮 words 的 element 是否會重複\n\n```javascript\n// Time Complexity: O(n * m * k), n is s.length, m is words[0].length, k is words.lenght.\n// Space Complexity: O(m).\n\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n const defaultMap = (() => {\n const m = {};\n for (const word of words) {\n m[word] = (m[word] ?? 0) + 1;\n }\n return m;\n })();\n let map = JSON.parse(JSON.stringify(defaultMap));\n const wordLength = words[0].length;\n const substringLength = wordLength * words.length;\n\n const validate = (substring) => {\n let cur = 0;\n map = JSON.parse(JSON.stringify(defaultMap));\n\n while (cur < substring.length) {\n const target = substring.substring(cur, cur + wordLength);\n if (map[target]) {\n map[target] -= 1;\n cur += wordLength;\n } else return false;\n }\n\n return true;\n };\n\n const res = []\n\n for (let i = 0; i < s.length - substringLength + 1; i++) {\n const substring = s.substring(i, i + substringLength);\n if (validate(substring)) res.push(i);\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3164019442","body":"## 解法\n- 一開始漏看了連續短數組的條件,之後想到暴力法,也有個感覺優化必定涉及數學技巧,因此直接看題解\n- 需要理解兩個技巧:負數取模 floorMod 和 map.set(0, -1) 以處理欲從 sum[i] - sum[j] 計算 i 至 j 範圍時,當 j 為 0 遇到的計算問題\n\n```javasciprt\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(min(n, k))\n\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar floorMod = function (a, b) {\n return ((a % b) + b) % b;\n};\n\nfunction minSubarray(nums, k) {\n var map = new Map();\n map.set(0, -1);\n var res = nums.length;\n var target = 0;\n var currSum = 0;\n for (let i = 0; i < nums.length; i++) {\n target += nums[i];\n }\n target = target % k;\n if (target === 0) return 0;\n for (let i = 0; i < nums.length; i++) {\n currSum = (nums[i] + currSum) % k;\n\n var prevSum = floorMod(currSum - target, k);\n if (map.has(prevSum)) {\n res = Math.min(res, i - map.get(prevSum));\n }\n map.set(currSum, i);\n }\n return res === nums.length ? -1 : res;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168248088","body":"## 解法\n- 窮舉前面的例子就可以得到規律:先處理只有一個 node 的 edge case,當 fast.next?.next 不為 null,即存在下下個 node 的情況下移動快慢指針,不然慢指針的下個 node 即是中間節點。\n```javascript\n// 1 => 1\n\n// 1, 2 => 2 => slow 1, fast 2\n// 1, 2, 3 => 2 => slow 1, fast 2\n\n// 1, 2, 3, 4 => 3 => slow 2, fast 4\n// 1, 2, 3, 4, 5 => 3 => slow 2, fast 4\n\n// 1, 2, 3, 4, 5, 6 => 4\n// 1, 2, 3, 4, 5, 6, 7 => 4\n\n// 1, 2, 3, 4, 5, 6, 7, 8 => 5\n// 1, 2, 3, 4, 5, 6, 7, 8, 9 => 5\n```\n\n```javascript\n// Time Complexity: O(n), n is linked list length,\n// Space Complexity: O(1)\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n if (!head.next) return head;\n\n let slow = head;\n let fast = head.next;\n\n while (fast.next?.next) {\n slow = slow.next;\n fast = fast.next.next;\n };\n\n return slow.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170547569","body":"## 解法\n- 一開始沒注意到 Space Complexity O(1) 的要求,因此用 map 來記錄曾遍歷過的數字,並使用 nums.splice 來原地刪除重複元素\n- 若限制 Space Complexity 為 O(1),則需要如題解用快慢指針來做\n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n let slow = 0;\n let fast = 0;\n\n while (fast < nums.length) {\n if (nums[fast] !== nums[slow]) {\n slow++;\n nums[slow] = nums[fast];\n }\n \n fast++;\n }\n\n return slow + 1;\n};\n\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n const map = {};\n let res = 0;\n let i = nums.length - 1;\n\n while (i >= 0) {\n const num = nums[i];\n\n if (map[num]) {\n nums.splice(i, 1);\n } else {\n map[num] = 1;\n res += 1;\n };\n\n i--;\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172259657","body":"## 解法\n- 經典的二分查找,需注意沒有找到 target 的 edge case\n\n```javascript\n// Time Complexity: O(logn), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let l = 0;\n let r = nums.length - 1;\n let m = -1;\n\n while (l <= r) {\n m = l + Math.floor((r - l) / 2);\n\n if (nums[m] === target) return m;\n else if (nums[m] > target) r = m - 1;\n else l = m + 1;\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173778506","body":"## 解法\n- 第一泡茶的確是暴力解,之後會想到 max heap,但每次 push 仍需要耗費 O(logn)\n- 有想過使用 monotonic stack 來做,但卡沒仔細想就覺得可能無法正確排除 sliding window 外的元素而作罷,而這其實可以靠題解中的 shift 來完成,又因為不是嚴格遞增棧,所以遇到相等數值時,前者仍會被保留,而確保 shift 的操作都是正確的\n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(k)\n\nvar maxSlidingWindow = function (nums, k) {\n const res = [];\n const dequeue = new Dequeue([]);\n\n for (let i = 0; i < k - 1; i++) {\n dequeue.push(nums[i]);\n }\n\n for (let i = k - 1; i < nums.length; i++) {\n dequeue.push(nums[i]);\n res.push(dequeue.max());\n dequeue.shift(nums[i - k + 1]);\n }\n\n return res;\n};\n\nclass Dequeue {\n constructor(nums) {\n this.list = nums; // Should be implemented as a linked list to make time complexity of dequeue.shift() as O(1).\n }\n\n push(val) {\n const nums = this.list;\n\n while (nums[nums.length - 1] < val) {\n nums.pop();\n }\n\n nums.push(val);\n }\n\n shift(val) {\n let nums = this.list;\n\n if (nums[0] === val) {\n nums.shift();\n }\n }\n\n max() {\n return this.list[0];\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178234382","body":"## 解法\n- 第一泡茶,可以透過紀錄一個人信任及被信任的人數來解題。其中可以不斷紀錄目前被信任人數最高者方便最後判斷是否為法官\n- 看了題解後發現可以用圖來解,之後補上\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n const trustFroms = new Array(n).fill(0);\n const trustTos = new Array(n).fill(0);\n let maybeJudge = { index: 0, trustTo: 0 };\n\n for (const t of trust) {\n const [from, to] = [t[0] - 1, t[1] - 1];\n trustFroms[from]++;\n trustTos[to]++;\n if (trustTos[to] > maybeJudge.trustTo) maybeJudge = { index: to, trustTo: trustTos[to] };\n }\n\n if (maybeJudge.trustTo === n - 1) {\n if (trustFroms[maybeJudge.index] === 0) return maybeJudge.index + 1;\n }\n\n return -1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3184149014","body":"```javascript\n// Time Complexity: O(v + e)\n// Space Complexity: O(v + e)\n\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nconst possibleBipartition = (n, dislikes) => {\n const graph = new Array(n + 1).fill().map(() => new Array())\n const colors = new Array(n + 1).fill(-1);\n\n for (const [a, b] of dislikes) {\n graph[a].push(b);\n graph[b].push(a);\n }\n\n const dfs = (cur, color = 0) => {\n colors[cur] = color;\n\n for (const nxt of graph[cur]) {\n if (colors[nxt] !== -1 && colors[nxt] === color) return false;\n if (colors[nxt] === -1 && !dfs(nxt, color ^ 1)) return false;\n }\n\n return true;\n };\n\n for (let i = 0; i < n + 1; i++) {\n if (colors[i] === -1 && !dfs(i, 0)) return false;\n }\n\n return true;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186799518","body":"```javascript\n// Time Complexity: O(n + e), e is sum of beforeItems.flat().length\n// Space Complexity: O(n + e)\n\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n const topologicalSort = (items, indegree, neighbors) => {\n const queue = [];\n const result = [];\n \n for (const item of items) {\n if (indegree[item] === 0) {\n queue.push(item);\n }\n }\n \n while (queue.length > 0) {\n const current = queue.shift();\n result.push(current);\n \n const currentNeighbors = neighbors[current] || [];\n for (const neighbor of currentNeighbors) {\n indegree[neighbor]--;\n if (indegree[neighbor] === 0) {\n queue.push(neighbor);\n }\n }\n }\n \n return result;\n };\n \n let maxGroupId = m;\n for (let item = 0; item < n; item++) {\n if (group[item] === -1) {\n group[item] = maxGroupId;\n maxGroupId++;\n }\n }\n \n const itemIndegree = Array.from({length: n}, () => 0);\n const groupIndegree = Array.from({length: maxGroupId}, () => 0);\n const itemNeighbors = Array.from({length: n}, () => []);\n const groupNeighbors = Array.from({length: maxGroupId}, () => []);\n const groupItems = Array.from({length: maxGroupId}, () => []);\n \n for (let item = 0; item < n; item++) {\n groupItems[group[item]].push(item);\n }\n \n for (let item = 0; item < n; item++) {\n const dependencies = beforeItems[item] || [];\n \n for (const dependency of dependencies) {\n if (group[dependency] !== group[item]) {\n groupIndegree[group[item]]++;\n groupNeighbors[group[dependency]].push(group[item]);\n } else {\n itemIndegree[item]++;\n itemNeighbors[dependency].push(item);\n }\n }\n }\n \n const groups = Array.from({length: maxGroupId}, (_, i) => i);\n const sortedGroups = topologicalSort(groups, groupIndegree, groupNeighbors);\n \n if (sortedGroups.length !== maxGroupId) {\n return [];\n }\n \n const result = [];\n \n for (const groupId of sortedGroups) {\n const items = groupItems[groupId];\n const sorteditems = topologicalSort(items, itemIndegree, itemNeighbors);\n \n if (sorteditems.length !== items.length) {\n return [];\n }\n \n result.push(...sorteditems);\n }\n \n return result;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190479297","body":"```javascript\n// Time Complexity: O(n), n is moves.length\n// Space Complexity: O(1)\n\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let [x, y] = [0, 0];\n\n for (let i = 0; i < moves.length; i++) {\n const action = moves.substring(i, i + 1);\n if (action === 'R') x++;\n if (action === 'L') x--;\n if (action === 'U') y++;\n if (action === 'D') y--;\n }\n\n return x === 0 && y === 0;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193447956","body":"## 題解\n- 一開始使用 Array + Sort 的方法實作,不過由於 Time Complexity 為 O(n^2logn),在資料量 1 <= n <= 10^5 的條件下,會沒辦法 AC\n- 需要將資料結構改成 Min Heap 來降低時間複雜度\n\n```javascript\n// Min Heap\n// Time Complexity: O(nlogn)\n// Space Complexity: O(logn)\n\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function (tasks) {\n const indices = Array.from({ length: tasks.length }, (_, i) => i);\n\n indices.sort((a, b) => { return tasks[a][0] - tasks[b][0] });\n\n const minHeap = new PriorityQueue((a, b) => {\n if (tasks[a][1] !== tasks[b][1]) {\n return tasks[a][1] - tasks[b][1];\n }\n return a - b;\n });\n\n const res = [];\n let time = 0;\n let i = 0;\n\n while (!minHeap.isEmpty() || i < tasks.length) {\n while (i < tasks.length && tasks[indices[i]][0] <= time) {\n minHeap.enqueue(indices[i]);\n i++;\n }\n\n if (minHeap.size() === 0) {\n time = tasks[indices[i]][0];\n } else {\n const nextIndex = minHeap.dequeue();\n time += tasks[nextIndex][1];\n res.push(nextIndex);\n }\n }\n\n return res;\n};\n\n// Array + Sort\n// Time Complexity: O(n^2logn)\n// Space Complexity: O(n)\n\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n tasks = tasks.map((t, i) => [...t, i]);\n tasks.sort((a, b) => a[0] === b[0] ? a[2] - b[2] : a[0] - b[0]);\n\n let i = 0;\n let curTime = 0;\n const queue = [];\n const res = [];\n\n while (i < tasks.length || queue.length) {\n while (i < tasks.length && tasks[i][0] <= curTime) {\n queue.push(tasks[i]);\n queue.sort((a, b) => a[1] === b[1] ? a[2] - b[2] : a[1] - b [1]);\n i++;\n }\n\n if (!queue.length) {\n curTime = tasks[i][0];\n } else {\n const curTask = queue.shift();\n res.push(curTask[2]);\n curTime += curTask[1];\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194091917","body":"```javascript\n// Time Complexity: O(1)\n// Space Complexity: O(1)\n\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n const getMinSum = (time, carry) => {\n let [hour, min] = time.split(':').map(s => Number(s));\n const remainer = min % 15;\n const q = (min - remainer) / 15;\n\n if (!carry) {\n return (hour * 60) + min;\n } else if (remainer && carry === 'ceil') {\n return (hour * 4 + q + 1) * 15;\n } else {\n return (hour * 4 + q) * 15;\n }\n };\n\n let [loginMinSum, logoutMinSum] = [getMinSum(loginTime, 'ceil'), getMinSum(logoutTime, 'floor')];\n\n if (getMinSum(loginTime) > getMinSum(logoutTime)) {\n logoutMinSum += 24 * 60;\n }\n\n return Math.max((logoutMinSum - loginMinSum) / 15, 0)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3196057927","body":"## 題解\n- 原本想針對三種狀況,直接找 a 和 b 中最符合的 char 來做計算,但會發現很多 edge case 要考量,要一直修正\n- 看題解之後,在有限的解空間中(頂多常數 26),枚舉的確是一個簡單、可讀性更好的做法\n\n```javascript\n// Time Complexity: O(n + m), n is a.length, m is b.length\n// Space Complexity: O(26)\n\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n const createCounter = (str) => {\n const counter = {};\n\n for (let i = 0; i < 26; i++) {\n counter[String.fromCharCode(97 + i)] = 0;\n }\n\n for (const char of str) {\n counter[char]++;\n }\n return counter;\n };\n \n const ca = createCounter(a);\n const cb = createCounter(b);\n\n const greaterCost = (ca, cb) => {\n let ans = Infinity;\n\n for (let i = 1; i < 26; i++) {\n let count = 0;\n \n for (let j = 0; j < i; j++) {\n count += ca[String.fromCharCode(97 + j)];\n }\n \n for (let j = i; j < 26; j++) {\n count += cb[String.fromCharCode(97 + j)];\n }\n ans = Math.min(ans, count);\n }\n return ans;\n };\n \n const equalCost = (ca, cb) => {\n let ans = Infinity;\n for (let i = 0; i < 26; i++) {\n const char = String.fromCharCode(97 + i);\n ans = Math.min(ans, a.length + b.length - ca[char] - cb[char]);\n }\n return ans;\n };\n \n return Math.min(\n greaterCost(ca, cb),\n greaterCost(cb, ca),\n equalCost(ca, cb)\n );\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199125049","body":"## 題解\n- 直覺就是用快速排序來做,不過實踐上,這次發現 partition 有兩種方法可以做:hoarePartition、lomutoPartition。其中 lomutoPartition 普遍認為較簡單,但因為交換數值的次數較多,會遇到 TLE,因此此題需用 hoarePartition 來做。\n\n```javascript\nconst lomutoPartition = (nums, left, right) => {\n const pivot = nums[right];\n let i = left - 1;\n\n for (let j = left; j < right; j++) {\n if (nums[j] <= pivot) {\n i++;\n [nums[i], nums[j]] = [nums[j], nums[i]];\n }\n }\n\n i++;\n [nums[i], nums[right]] = [nums[right], nums[i]];\n\n return i;\n};\n\nconst hoarePartition = (nums, left, right) => {\n const p = left + ((right - left) >>> 1);\n const pivot = nums[p];\n let [i, j] = [left, right];\n\n while (i <= j) {\n while (nums[i] < pivot) i++;\n while (nums[j] > pivot) j--;\n if (i <= j) {\n [nums[i], nums[j]] = [nums[j], nums[i]];\n i++;\n j--;\n }\n }\n\n return [i, j];\n};\n\nconst quickSort = (nums, left, right) => {\n // if (left < right) {\n // const p = lomutoPartition(nums, left, right);\n // quickSort(nums, left, p - 1);\n // quickSort(nums, p + 1, right);\n // }\n\n if (left < right) {\n const [i, j] = hoarePartition(nums, left, right);\n quickSort(nums, left, j);\n quickSort(nums, i, right);\n }\n};\n\n// Time Complexity: O(nlogn), n is nums.length\n// Space Complexity: O(logn)\n\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function (nums) {\n quickSort(nums, 0, nums.length - 1);\n return nums;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204182883","body":"```javascript\n// Time Complexity: O(logn)\n// Space Complexity: O(1)\n\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n let res = 0;\n let l = 0;\n let r = x;\n\n while (l <= r) {\n const m = l + ((r - l) >>> 2);\n\n if (m * m > x) {\n r = m - 1;\n } else {\n res = m;\n l = m + 1;\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3209343494","body":"## 題解\n- 可以將這題轉化成「尋找最左邊符合條件者」,即可套入模板\n\n```javascript\n// Time Complexity: O(logn)\n// Space Complexity: O(1)\n\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let [l, r] = [1, n];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 2);\n\n if (isBadVersion(m)) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n };\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3212999531","body":"## 題解\n- 二分:對於每一個元素前者排序,並找到大於 a * 2 者(重複 a * 2 的右界)。需注意是,應在每次加入新元素時,直接尋找其應該插入的位置,而非將整個陣列排序,不然會 TLE。\n\n```javascript\nclass SortedList {\n constructor() {\n this.arr = [];\n }\n\n bisectRight(target) {\n let [l, r] = [0, this.arr.length - 1];\n\n while (l <= r) {\n const mid = l + ((r - l) >>> 1);\n\n if (this.arr[mid] <= target) {\n l = mid + 1;\n } else {\n r = mid - 1;\n }\n }\n\n return l;\n }\n \n push(value) {\n const pos = this.bisectRight(value);\n this.arr.splice(pos, 0, value);\n }\n \n get length() {\n return this.arr.length;\n }\n}\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n const sortedRunningNums = new SortedList();\n sortedRunningNums.push(nums[0]);\n let ans = 0;\n\n for (let i = 1; i < nums.length; i++) {\n ans += (i - sortedRunningNums.bisectRight(nums[i] * 2));\n sortedRunningNums.push(nums[i]);\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216534944","body":"## 題解\n- 依序遍歷 houses,尋找每個 house 與 heater 最近距離,最大者為答案。其中尋找最近距離的實踐,可以使用 bisectRight 來做\n\n```javascript\n// Time Complexity: O(nlog m + mlog m), n is houses.length, m is heaters.length\n// Space Complexity: O(1)\n\nconst getHouseHeaterMinDistance = (house, heaters) => {\n if (heaters.length === 0) return Infinity;\n if (heaters.length === 1) return Math.abs(house - heaters[0]);\n\n let [l, r] = [0, heaters.length - 1];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (house === heaters[m]) {\n return 0;\n } else if (house > heaters[m]) {\n l = m + 1;\n } else {\n r = m - 1;\n };\n }\n\n const leftDistance = l === 0 ? Infinity : house - heaters[l - 1];\n const rightDistance = r === heaters.length - 1 ? Infinity : heaters[l] - house;\n\n return Math.min(leftDistance, rightDistance);\n};\n\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n heaters.sort((a, b) => a - b);\n\n let maxRadius = 0;\n\n for (const house of houses) {\n const minDistance = getHouseHeaterMinDistance(house, heaters);\n maxRadius = Math.max(maxRadius, minDistance);\n }\n\n return maxRadius;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217908480","body":"## 題解\n- 計數二分經典的題目,排序後解空間為 0 至 nums[lnums.ength - 1] - nums[0]\n\n```javascript\n// Time Complexity: O(nlogn)\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a, b) => a - b);\n\n const countDistanceNotGreaterThan = (maxDistance) => {\n let count = 0;\n let l = 0;\n\n for (let r = 1; r < nums.length; r++) {\n while (nums[r] - nums[l] > maxDistance) {\n l++;\n }\n\n count += r - l;\n }\n\n return count;\n };\n\n let [l, r] = [0, nums[nums.length - 1] - nums[0]];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (countDistanceNotGreaterThan(m) >= k) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218836123","body":"## 題解\n- 用二分在解空間 [0, maxElevation] 中尋找答案,對於每個可能的 m,再 dns 尋找可能路徑\n- 需注意因為 dns 時多了 grid[ni][nj] <= elevation 的條件,不需重置 visited[i][j],因為就算從其他點進來該點,依舊會沒辦法繼續走下去,與尋找所有路徑的 dns 略有不同\n\n```javascript\n// Time Complexity: O(n^2logn)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n const n = grid.length;\n\n const maxElevation = (() => {\n let e = 0;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n e = Math.max(e, grid[i][j]);\n }\n }\n return e;\n })();\n\n const canReachBottomRight = (elevation) => {\n const visited = Array.from({ length: n}).map(() => Array.from({ length: n }).map(() => false));\n\n const dns = (i, j) => {\n if (i === n - 1 && j === n - 1) return true;\n\n visited[i][j] = true;\n\n const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];\n\n for (const [di, dj] of directions) {\n const ni = i + di;\n const nj = j + dj;\n\n if (ni >= 0 && ni < n && nj >= 0 && nj < n) {\n if (!visited[ni][nj] && grid[ni][nj] <= elevation) {\n if (dns(ni, nj)) return true;\n }\n }\n }\n\n // visited[i][j] = false;\n\n return false;\n };\n\n if (grid[0][0] <= elevation) return dns(0, 0);\n else return false;\n };\n\n let l = 0;\n let r = maxElevation;\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (canReachBottomRight(m)) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222489820","body":"## 題解\n- 典型的 sliding window 題型\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(1)\n\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n const vowel = 'aeiou';\n let l = 0;\n let r = 0;\n let cur = 0;\n let max = cur;\n\n while (r < s.length) {\n if (vowel.includes(s.charAt(r))) cur++;\n r++;\n\n if (r - l > k) {\n if (vowel.includes(s.charAt(l))) cur--;\n l++;\n }\n\n max = Math.max(max, cur);\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3226683449","body":"```javascript\n// Time Complexity: O(k + maxPts)\n// Space Complexity: O(k + maxPts)\n\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n const dp = Array.from({ length: k + maxPts }).map(() => 0);\n let sum = 0;\n\n for (let i = k; i < k + maxPts; i++) {\n if (i <= n) dp[i] = 1;\n sum += dp[i];\n }\n\n for (let j = k - 1; j >= 0; j--) {\n dp[j] = sum / maxPts;\n sum -= dp[j + maxPts];\n sum += dp[j];\n }\n\n return dp[0];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3234016259","body":"```javascript\n// Time Complexity: O(n), n is s.length\n// Space COmplexity: O(1)\n\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nfunction findAnagrams(s, p) {\n function arraysEqual(arr1, arr2) {\n for (let i = 0; i < 26; i++) {\n if (arr1[i] !== arr2[i]) return false;\n }\n return true;\n }\n\n const result = [];\n const sLen = s.length;\n const pLen = p.length;\n \n if (sLen < pLen) return result;\n \n const pCount = new Array(26).fill(0);\n const windowCount = new Array(26).fill(0);\n \n for (let i = 0; i < pLen; i++) {\n pCount[p.charCodeAt(i) - 97]++;\n }\n \n let left = 0;\n \n for (let right = 0; right < sLen; right++) {\n const rightIndex = s.charCodeAt(right) - 97;\n windowCount[rightIndex]++;\n \n if (right - left + 1 > pLen) {\n const leftIndex = s.charCodeAt(left) - 97;\n windowCount[leftIndex]--;\n left++;\n }\n \n if (right - left + 1 === pLen) {\n if (arraysEqual(windowCount, pCount)) {\n result.push(left);\n }\n }\n }\n \n return result;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3237104151","body":"```javascript\n// Time Complexity: O(n + m), n is s.length, m is t.length\n// Space Complexity: O(k), k is different char count in t\n\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nfunction minWindow(s, t) {\n let l = 0;\n const counter = {};\n const N = s.length;\n const ct = {};\n \n for (let char of t) {\n ct[char] = (ct[char] || 0) + 1;\n }\n \n let k = 0;\n let ret = Infinity;\n let ans = \"\";\n \n for (let r = 0; r < N; r++) {\n counter[s[r]] = (counter[s[r]] || 0) + 1;\n \n if (s[r] in ct && counter[s[r]] === ct[s[r]]) {\n k++;\n }\n \n while (k === Object.keys(ct).length) {\n if (r - l + 1 < ret) {\n ans = s.substring(l, r + 1);\n ret = r - l + 1;\n }\n \n counter[s[l]]--;\n if (s[l] in ct && counter[s[l]] === ct[s[l]] - 1) {\n k--;\n }\n l++;\n }\n }\n \n return ans;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3239924106","body":"```javascript\n// Time Complexity: O(1)\n// Space Complexity: O(1)\n\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n const countBits = (num) => {\n let count = 0;\n while (num) {\n count += num & 1;\n num >>= 1;\n }\n return count;\n };\n\n const res = [];\n\n for (let hour = 0; hour < 12; hour++) {\n for (let minute = 0; minute < 60; minute++) {\n if ((countBits(hour) + countBits(minute)) === turnedOn) {\n const formattedMinute = minute < 10 ? `0${minute}` : `${minute}`\n res.push(`${hour}:${formattedMinute}`);\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240825737","body":"```javascript\n// Time Complexity: O(n!)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n\n const backtrack = (row, cols, dias1, dias2) => {\n if (row === n) {\n count++;\n return;\n }\n\n let availablePostions = ((1 << n) - 1) & (~(cols | dias1 | dias2));\n\n while (availablePostions) {\n const position = availablePostions & (-availablePostions);\n availablePostions &= availablePostions - 1;\n\n backtrack(\n row + 1,\n cols | position,\n (dias1 | position) << 1,\n (dias2 | position) >> 1,\n );\n }\n };\n\n backtrack(0, 0, 0, 0);\n\n return count;\n};\n\n// Time Complexity: O(n!)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n const cols = new Array(n).fill(false);\n const dias1 = new Array(2 * n - 1).fill(false); // row - col\n const dias2 = new Array(2 * n - 1).fill(false); // row + col\n\n const backtrack = (row) => {\n if (row === n) {\n count++;\n return;\n }\n\n for (let col = 0; col < n; col++) {\n const d1 = row - col + n - 1;\n const d2 = row + col;\n\n if (cols[col] || dias1[d1] || dias2[d2]) continue;\n\n cols[col] = dias1[d1] = dias2[d2] = true;\n backtrack(row + 1);\n cols[col] = dias1[d1] = dias2[d2] = false;\n }\n };\n\n backtrack(0);\n\n return count;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245083899","body":"## 題解\n- 遍歷每個 (i, j) 進行 dfs,遇到邊界或 grid[i][j] === 0 者即返回 0,反之則返回 1 加四個方向 dns 的結果\n- 優化:訪問過者可將原 grid[i][j] 改成 0,如此便不需要重新宣告一個空間來存取\n\n```javascript\n// Time Complexity: O(m * n)\n// Space Complexity: O(m * n)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n const [m, n] = [grid.length, grid[0].length];\n const direction = [[1, 0], [-1, 0], [0, 1], [0, -1]];\n let max = 0;\n\n const dfs = (x, y) => {\n if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y]) {\n grid[x][y] = 0;\n\n let area = 1;\n\n for (const [dx, dy] of direction) {\n area += dfs(x + dx, y + dy);\n }\n\n return area;\n }\n\n return 0;\n };\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n max = Math.max(max, dfs(i, j));\n }\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249843138","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nfunction maxDistance(grid) {\n const n = grid.length;\n const queue = [];\n \n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n queue.push([i, j, 0]);\n }\n }\n }\n \n if (queue.length === 0 || queue.length === n * n) {\n return -1;\n }\n \n const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];\n let maxDist = 0;\n \n while (queue.length > 0) {\n const [x, y, dist] = queue.shift();\n maxDist = Math.max(maxDist, dist);\n \n for (const [dx, dy] of directions) {\n const nx = x + dx;\n const ny = y + dy;\n \n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] === 0) {\n grid[nx][ny] = 1;\n queue.push([nx, ny, dist + 1]);\n }\n }\n }\n \n return maxDist;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251291240","body":"```javascript\n// Time Complexity: O(n + k), n is candies.length, k is number of keys\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n const boxes = new Set(initialBoxes);\n const q = [];\n \n for (const i of boxes) {\n if (status[i]) {\n q.push(i);\n }\n }\n \n for (let idx = 0; idx < q.length; idx++) {\n const i = q[idx];\n \n for (const j of containedBoxes[i]) {\n boxes.add(j);\n if (status[j]) {\n q.push(j);\n }\n }\n \n for (const j of keys[i]) {\n if (status[j] === 0 && boxes.has(j)) {\n q.push(j);\n }\n status[j] = 1;\n }\n }\n \n return q.reduce((sum, i) => sum + candies[i], 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3258808498","body":"```javascript\n// Time Complexity: O(nlogn), n is the number of tree.\n// Space Complexity: O(n), n is the number of tree.\n\n// /**\n// * Definition for a binary tree node.\n// * function TreeNode(val, left, right) {\n// * this.val = (val===undefined ? 0 : val)\n// * this.left = (left===undefined ? null : left)\n// * this.right = (right===undefined ? null : right)\n// * }\n// */\n// /**\n// * @param {TreeNode} root\n// * @return {number[][]}\n// */\nvar verticalTraversal = function(root) {\n const map = {};\n\n const traverse = (root, row, col) => {\n if (!root) return;\n\n if (!map[col]) {\n map[col] = [];\n }\n\n map[col].push([row, root.val]);\n traverse(root.left, row + 1, col - 1);\n traverse(root.right, row + 1, col + 1);\n };\n\n traverse(root, 0, 0);\n\n const keys = Object.keys(map).sort((a, b) => a - b);\n\n const res = keys.map((k) => {\n const arr = map[k];\n\n return arr.sort(([rowA, valA], [rowB, valB]) => {\n if (rowA === rowB) return valA - valB;\n return rowA - rowB;\n }).map(([,val]) => val);\n });\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3262161616","body":"## 題解\n- 重點是找到 dp 的關鍵核心 d[i] = Math.min(d[i - 1] + cost[i], d[i - 2] + cost[i]);\n- 需注意 cost[i] 為空值的情況\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} cost\n * @return {number}\n */\nvar minCostClimbingStairs = function(cost) {\n const n = cost.length;\n const d = [];\n\n d[0] = cost[0];\n d[1] = Math.min(d[0] + cost[1], cost[1]);\n\n for (let i = 2; i <= n; i++) {\n const c = cost[i] ?? 0;\n d[i] = Math.min(d[i - 1] + c, d[i - 2] + c);\n }\n\n return d[n];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263843103","body":"## 解題\n- 一樣需要去辨認 dp 的關係式,d[i] = Math.max(d[i - 1], d[i - 2] + nums[i])\n- 需要特別注意 n 為 1, 2 的 edge case \n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar rob = function(nums) {\n const n = nums.length;\n\n if (n === 1) return nums[0];\n if (n === 2) return Math.max(nums[0], nums[1]);\n\n const d = [];\n\n d[0] = nums[0];\n d[1] = Math.max(nums[0], nums[1]);\n\n for (i = 2; i < n; i++) {\n d[i] = Math.max(d[i - 1], d[i - 2] + nums[i])\n }\n\n return d[n - 1];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3266927805","body":"```javascript\n// Time Complexity: O(n^2), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findNumberOfLIS = function(nums) {\n const n = nums.length;\n const dp = Array(n).fill(null).map(() => [1, 1]);\n let longest = 1;\n \n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n if (nums[j] > nums[i]) {\n if (dp[i][0] + 1 > dp[j][0]) {\n dp[j][0] = dp[i][0] + 1;\n dp[j][1] = dp[i][1];\n longest = Math.max(longest, dp[j][0]);\n } else if (dp[i][0] + 1 === dp[j][0]) {\n dp[j][1] += dp[i][1];\n }\n }\n }\n }\n \n return dp.reduce((sum, [length, count]) => {\n return length === longest ? sum + count : sum;\n }, 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3270111521","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n)\n\n/**\n * @param {string} text1\n * @param {string} text2\n * @return {number}\n */\nvar longestCommonSubsequence = function(text1, text2) {\n const [n, m] = [text1.length, text2.length];\n const dp = Array.from({ length: n + 1 }).map(() => new Array(m + 1).fill(0));\n let res = 0;\n\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n if (text1.charAt(i - 1) === text2.charAt(j - 1)) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n res = Math.max(res, dp[i][j]);\n } else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273250794","body":"## 題解\n- dp 的遞增式為 `d[i][j] = d[i - 1][j] + d[i][j - 1];`,意思是,dp[i][j] 表示能到達該格子的路線數量,其為 d[i - 1][j] 和 d[i][j - 1] 的總和(從其左或其上格子來)\n- 其中需注意當 i 或 j 為 0,即最上或最左列的格子,其 d[i][j] 值為 1,因為只可能從其上或其左格子而來\n\n```javascript\n// Time Complexity: O(m * n)\n// Space Complexity: O(m * n)\n\n/**\n * @param {number} m\n * @param {number} n\n * @return {number}\n */\nvar uniquePaths = function(m, n) {\n const d = Array.from({ length: m }).map(() => new Array(n).fill(1));\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (i !== 0 && j !== 0) {\n d[i][j] = d[i - 1][j] + d[i][j - 1];\n }\n }\n }\n\n return d[m - 1][n - 1];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3279921315","body":"```javascript\n// Time Complexity: O(n^2 * k)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} row\n * @param {number} column\n * @return {number}\n */\nvar knightProbability = function(n, k, row, column) {\n let dp = Array.from({ length: n }, () => new Array(n).fill(0));\n const directions = [[2, 1], [1, 2], [-1, 2], [-2, 1], [-2, -1], [-1, -2], [1, -2], [2, -1]];\n\n dp[row][column] = 1;\n\n for (let step = 0; step < k; step++) {\n let dpTemp = Array.from({ length: n }, () => new Array(n).fill(0));\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n for (const [dx, dy] of directions) {\n const [px, py] = [i - dx, j - dy];\n\n if (px >= 0 && px < n && py >= 0 && py < n) {\n dpTemp[i][j] += dp[px][py] * 0.125;\n }\n }\n }\n }\n\n dp = dpTemp;\n }\n\n let sumProp = 0;\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n sumProp += dp[i][j];\n }\n }\n\n return sumProp;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3285364984","body":"```javascript\n/**\n * @param {number} maxChoosableInteger\n * @param {number} desiredTotal\n * @return {boolean}\n */\nvar canIWin = function(maxChoosableInteger, desiredTotal) {\n if (maxChoosableInteger >= desiredTotal) {\n return true;\n }\n \n const totalSum = (maxChoosableInteger * (maxChoosableInteger + 1)) / 2;\n if (totalSum < desiredTotal) {\n return false;\n }\n \n const memo = new Map();\n \n const dfs = (used, currentSum) => {\n if (memo.has(used)) {\n return memo.get(used);\n }\n \n for (let i = 1; i <= maxChoosableInteger; i++) {\n const bit = 1 << (i - 1);\n \n if ((used & bit) === 0) {\n if (currentSum + i >= desiredTotal) {\n memo.set(used, true);\n return true;\n }\n \n if (!dfs(used | bit, currentSum + i)) {\n memo.set(used, true);\n return true;\n }\n }\n }\n \n memo.set(used, false);\n return false;\n };\n \n return dfs(0, 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3288487076","body":"```javascript\n// Time Complexity: O(n * k), n is nums.length, k is sum of nums / 2\n// Space Complexity: O(n * k)\n\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canPartition = function (nums) {\n let sum = nums.reduce((acc, num) => acc + num, 0);\n\n if (sum % 2) return false;\n else sum = sum / 2;\n\n const dp = Array.from(nums).map(() => Array.from({ length: sum + 1 }).fill(false));\n\n for (let i = 0; i < nums.length; i++) {\n dp[i][0] = true;\n }\n\n for (let i = 0; i < dp.length - 1; i++) {\n for (let j = 0; j < dp[0].length; j++) {\n dp[i + 1][j] = j - nums[i] >= 0 ? dp[i][j] || dp[i][j - nums[i]] : dp[i][j];\n }\n }\n\n return dp[nums.length - 1][sum];\n};\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289632643","body":"```javascript\n// Time Complexity: O(n * k), n is nums.length, k is sum of nums\n// Space Complexity: O(k)\n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar findTargetSumWays = function(nums, target) {\n const total = nums.reduce((sum, num) => sum + num, 0);\n \n if (Math.abs(target) > total || (total + target) % 2 !== 0) {\n return 0;\n }\n \n const sum = (total + target) / 2;\n const dp = new Array(sum + 1).fill(0);\n dp[0] = 1;\n \n for (const num of nums) {\n for (let j = sum; j >= num; j--) {\n dp[j] += dp[j - num];\n }\n }\n \n return dp[sum];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3292845699","body":"```javascript\n/**\n * @param {number[]} coins\n * @param {number} amount\n * @return {number}\n */\nvar coinChange = function(coins, amount) {\n const dp = new Array(amount + 1).fill(Infinity);\n\n dp[0] = 0;\n\n for (i = 1; i <= amount; i += 1) {\n for (const coin of coins) {\n if (i - coin >= 0 && dp[i - coin] !== Infinity) {\n dp[i] = Math.min(dp[i - coin] + 1, dp[i]);\n }\n }\n }\n\n return dp[amount] === Infinity ? -1 : dp[amount];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3297467048","body":"```javascript\n// Time Complexity: O(n * m), n is amount, m is coins.length\n// Space Complexity: O(n)\n\n/**\n * @param {number} amount\n * @param {number[]} coins\n * @return {number}\n */\nvar change = function(amount, coins) {\n const dp = new Array(amount + 1).fill(0);\n dp[0] = 1;\n\n for (const coin of coins) {\n for (let i = coin; i <= amount; i++) {\n dp[i] += dp[i - coin];\n }\n }\n \n return dp[amount];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3303059077","body":"## 題解\n- 先排序,以 g[j] 為主,遍歷符合的 s[i]\n```javascript\n// Time Complexity: O(nlogn + mlogm), n is g.length, m is s.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} g\n * @param {number[]} s\n * @return {number}\n */\nvar findContentChildren = function(g, s) {\n g.sort((a, b) => a - b);\n s.sort((a, b) => a - b);\n\n let [i, j] = [0, 0];\n let ans = 0;\n\n while (i < s.length && j < g.length) {\n if (s[i] >= g[j]) {\n ans++;\n j++;\n }\n\n i++;\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3307711246","body":"```javascript\n// Time Complexity: O(nlogn)\n// Space Complexity: O(1)\n\n/**\n * @param {number[][]} intervals\n * @return {number}\n */\nfunction eraseOverlapIntervals(intervals) {\n if (intervals.length <= 1) return 0;\n \n intervals.sort((a, b) => a[1] - b[1]);\n \n let count = 0;\n let end = intervals[0][1];\n \n for (let i = 1; i < intervals.length; i++) {\n if (intervals[i][0] < end) {\n count++;\n } else {\n end = intervals[i][1];\n }\n }\n \n return count;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3311687568","body":"```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canJump = function (nums) {\n let max = 0;\n\n for (let i = 0; i < nums.length; i++) {\n if (max < i) return false;\n\n max = Math.max(nums[i] + i, max);\n }\n\n return max >= nums.length - 1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/71#issuecomment-3314986282","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nconst memories = {};\nvar numTrees = function(n) {\n if (memories[n] !== undefined) return memories[n];\n if (n <= 1) return 1;\n\n let ans = 0;\n\n for (let i = 1; i <= n; i++) {\n ans += numTrees(i - 1) * numTrees(n - i);\n }\n\n memories[n] = ans;\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316043984","body":"```javascript\n// Time Complexity: O(nlogk), n is total number of nodes across all lists, k is number of lists\n// Space Complexity: O(1)\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode[]} lists\n * @return {ListNode}\n */\nvar mergeKLists = function(lists) {\n if (!lists || lists.length === 0) return null;\n \n while (lists.length > 1) {\n let mergedLists = [];\n \n for (let i = 0; i < lists.length; i += 2) {\n let l1 = lists[i];\n let l2 = i + 1 < lists.length ? lists[i + 1] : null;\n mergedLists.push(mergeTwoLists(l1, l2));\n }\n \n lists = mergedLists;\n }\n \n return lists[0];\n};\n\nfunction mergeTwoLists(l1, l2) {\n let dummy = new ListNode(0);\n let current = dummy;\n \n while (l1 && l2) {\n if (l1.val <= l2.val) {\n current.next = l1;\n l1 = l1.next;\n } else {\n current.next = l2;\n l2 = l2.next;\n }\n current = current.next;\n }\n \n current.next = l1 || l2;\n return dummy.next;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3324003764","body":"```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar singleNumber = function(nums) {\n let bitmask = 0;\n\n for (let n of nums) {\n bitmask ^= n;\n }\n\n bitmask &= -bitmask;\n\n const ans = [0, 0];\n\n for (let n of nums) {\n if ((n & bitmask) === 0) ans[0] ^= n;\n else ans[1] ^= n;\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3327535650","body":"```javascript\n// Time Complexity: O(n * 2^n)\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number[][]}\n */\nfunction subsets(nums) {\n const result = [];\n \n function backtrack(start, current) {\n result.push([...current]);\n \n for (let i = start; i < nums.length; i++) {\n current.push(nums[i]);\n backtrack(i + 1, current);\n current.pop();\n }\n }\n \n backtrack(0, []);\n return result;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3338173897","body":"```javascript\n// Time Complexity\n// - insert: O(k), k is key.length\n// - searchValue: O(k), k is key.length\n// - sum: O(p), p is prefix.length\n\n// Space Complexity: O(n * m), n is the number of unique keys inserted, m is the average length of the keys\n\nclass MapSum {\n constructor() {\n this.root = new TrieNode();\n }\n \n insert(key, val) {\n let temp = this.root;\n \n let oldVal = this.searchValue(key);\n \n for (let i = 0; i < key.length; i++) {\n if (temp.children[key.charCodeAt(i) - 97] == null)\n temp.children[key.charCodeAt(i) - 97] = new TrieNode();\n \n temp = temp.children[key.charCodeAt(i) - 97];\n \n temp.count = temp.count - oldVal + val;\n }\n \n temp.val = val;\n temp.isWord = true;\n }\n\n searchValue(key) {\n let temp = this.root;\n for (let i = 0; i < key.length; i++) {\n if (temp.children[key.charCodeAt(i) - 97] == null)\n return 0;\n \n temp = temp.children[key.charCodeAt(i) - 97];\n }\n \n return temp.isWord ? temp.val : 0;\n }\n\n sum(prefix) {\n let temp = this.root;\n \n for (let i = 0; i < prefix.length; i++) {\n if (temp.children[prefix.charCodeAt(i) - 97] == null)\n return 0;\n \n temp = temp.children[prefix.charCodeAt(i) - 97];\n }\n \n return temp.count;\n }\n}\n\nclass TrieNode {\n constructor() {\n this.count = 0;\n this.children = new Array(26);\n this.isWord = false;\n this.val = 0;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/78#issuecomment-3341802963","body":"```javascript\n// Time Complexity: O(n*m + b*b + n)\n// - Building Trie: O(n*m) where n = number of smalls, m = average length of smalls\n// - Searching: O(b*b) where b = length of big string (worst case: check every position against every possible substring)\n// - Converting result: O(n)\n\n// Space Complexity: O(n*m + n*k)\n// - Trie storage: O(n*m) for storing all small strings\n// - Result storage: O(n*k) where k = average number of matches per small string\n\n\nclass Node {\n constructor() {\n this.children = new Array(26).fill(null);\n this.isWord = false;\n this.id = 0;\n }\n}\n\nclass Solution {\n constructor() {\n this.root = new Node();\n }\n\n multiSearch(big, smalls) {\n const n = smalls.length;\n const res = Array(n).fill().map(() => []);\n \n for (let i = 0; i < smalls.length; i++) {\n this.insert(smalls[i], i);\n }\n\n for (let i = 0; i < big.length; i++) {\n let tmp = this.root;\n\n for (let j = i; j < big.length; j++) {\n if (tmp.children[big.charCodeAt(j) - 97] === null) {\n break;\n }\n\n tmp = tmp.children[big.charCodeAt(j) - 97];\n\n if (tmp.isWord) {\n res[tmp.id].push(i);\n }\n }\n }\n\n const ret = new Array(n);\n\n for (let i = 0; i < n; i++) {\n ret[i] = new Array(res[i].length);\n for (let j = 0; j < ret[i].length; j++) {\n ret[i][j] = res[i][j];\n }\n }\n\n return ret;\n }\n\n insert(word, id) {\n let tmp = this.root;\n\n for (let i = 0; i < word.length; i++) {\n if (tmp.children[word.charCodeAt(i) - 97] === null) {\n tmp.children[word.charCodeAt(i) - 97] = new Node();\n }\n\n tmp = tmp.children[word.charCodeAt(i) - 97];\n }\n\n tmp.isWord = true;\n tmp.id = id;\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wutxuan":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073568207","body":"第一次思路:将num数组转换为int数字A,计算A+K,将A+K结果转换为List类型,但没有观察数据范围,导致int类型溢出,没有通过全部样例\n第二次思路:从后往前,逐位相加K%10,直到遍历完全部数组,再判断K是否还有,通过全部样例\n第三次思路:看完题解后,学习到了可以将k和某一位看作一个整体,不用每次计算k%10,而是k+num[i]","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078154786","body":"第一次思路:遍历每个字符,在每个字符上向左向右移动,直到找到字符c,继续遍历下一个字符,但想到时间复杂度一定很高,因此继续想其他方法\n\n第二次思路:先遍历字符串,用List先记录每个字符c的索引。然后遍历字符串每个字符,计算这个字符的位置距离List中位置的最小距离,通过全部用例,时间复杂度O(N*K) N为字符串长度,K为c在字符串中出现的次数\n\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n List indexList = new ArrayList<>();\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == c){\n indexList.add(i);\n }\n }\n\n int[] res = new int[s.length()];\n Arrays.fill(res,10001);\n for(int i = 0;i < res.length;i++){\n for(int index : indexList){\n res[i] = Math.min(res[i],Math.abs(i - index));\n }\n \n }\n return res;\n }\n}\n\n```\n第三次思路:看完题解后,学习到了两次遍历求解,从左到右记录每个字符左侧最近的字符c的距离,记为left数组,从右到左记录每个字符右侧最近的字符c的距离,记为right数组。再遍历一遍整个字符串,在left数组和right数组中取最小值为最终结果。在代码实现时,省去了记录right数组再比较,而是直接比较。时间复杂度O(N)\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n int index = -s.length();\n int[] left = new int[s.length()];\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == c){\n index = i;\n }\n left[i] = i - index;\n }\n\n index = 2 * s.length();\n for(int i = s.length() - 1;i >= 0;i--){\n if(s.charAt(i) == c){\n index = i;\n }\n left[i] = Math.min(left[i],index - i);\n }\n return left;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3083567541","body":"因为要设计的栈有最大长度,因此使用数组来模拟栈。否则使用栈或List来模拟。\n使用数组模拟:使用一个指针变量,指向当前栈顶。入栈时,val存入栈顶处,指针++,出栈时,指针- -,返回栈顶元素。实现inc函数时,只需要对数组中0-k位置的数每个+val即可。通过全部样例\n```java\nclass CustomStack {\n int size = 0; // 指向第一个空位置\n int[] arr;\n\n public CustomStack(int maxSize) {\n arr = new int[maxSize];\n }\n \n public void push(int x) {\n if(size < arr.length){\n arr[size] = x;\n size++;\n }\n }\n \n public int pop() {\n if(size > 0){\n size--;\n return arr[size];\n }else{\n return -1;\n }\n }\n \n public void increment(int k, int val) {\n int cut = Math.min(k,size);\n\n for(int i = 0;i < cut;i++){\n arr[i] += val;\n }\n }\n}\n```\n\n看完题解后学会了前缀和方法:- 因为每次的increment函数都会对栈底[0,k]的数据val操作,而是否val操作了只有在pop时才会体现。所以我们可以通过一个数组incremental记录每个val,即第i位置下面的元素都要加incremental[i]。在pop第i个数的时候加上它需要加的所有val,即incremental[i]。 所以increment函数只需要维护incremental数组。但要记得记得pop后,incremental函数用过的地方要清零,并且得累加到前面一位\n\n```java\nclass CustomStack {\n\n Stack stack;\n int[] incremental;\n\n public CustomStack(int maxSize) {\n stack = new Stack();\n incremental = new int[maxSize];\n }\n \n public void push(int x) {\n if(stack.size() < incremental.length){\n stack.push(x);\n }\n }\n \n public int pop() {\n int cut = stack.size() - 1;\n if(cut < 0) return -1;\n\n int res = stack.pop() + incremental[cut];\n\n if(cut > 0){\n incremental[cut-1] += incremental[cut]; \n }\n incremental[cut] = 0;\n return res;\n\n }\n \n public void increment(int k, int val) {\n int cut = Math.min(k,stack.size())-1;\n if(cut >= 0){\n incremental[cut] += val;\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089071815","body":"看到有括号,需要对括号匹配,则优先想到栈。遍历字符串,当遇到非】字符时,全部入栈。当遇到】字符时,开始向回看,取出字符c,构成字符串s。再向回看,取出数字x,重复x次字符串s得到字符串ss,再将ss入栈,继续遍历,直到遍历结束。\n \n最后得到的栈,就是存储了最终解码后的字符串。取出栈后记得反转字符串\n```java\nclass Solution {\n public String decodeString(String s) {\n Stack stack = new Stack<>();\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == ']'){\n StringBuilder sb = new StringBuilder();\n StringBuilder count = new StringBuilder();\n\n while(!stack.isEmpty() && stack.peek() != '['){\n sb.append(stack.pop());\n } \n sb.reverse();\n stack.pop();\n while(!stack.isEmpty() && stack.peek() >= '0' && stack.peek() <= '9'){\n count.append(stack.pop());\n }\n count.reverse();\n int t = Integer.valueOf(count.toString());\n StringBuilder res = new StringBuilder();\n res.repeat(sb,t);\n\n for(char c : res.toString().toCharArray()){\n stack.push(c);\n }\n \n }else{\n stack.push(s.charAt(i));\n }\n }\n StringBuilder re = new StringBuilder();\n while(!stack.isEmpty()){\n re.append(stack.pop());\n }\n re.reverse();\n return re.toString();\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3095194789","body":"- push操作:输入栈入栈\n- pop操作:如果输出栈不为空,则直接输出输出栈的元素。如果输出栈为空,则把输入栈的数据全部导入到输出栈中\n- peek操作:如果输出栈不为空,则直接peek输出栈的元素。如果输出栈为空,则把输入栈的数据全部导出到输入栈中\n```java\nclass MyQueue {\n Stack stackIn;\n Stack stackOut;\n\n public MyQueue() {\n stackIn = new Stack<>();\n stackOut = new Stack<>();\n }\n \n public void push(int x) {\n stackIn.push(x);\n }\n \n public int pop() {\n refresh();\n return stackOut.pop();\n }\n \n public int peek() {\n refresh();\n return stackOut.peek();\n }\n \n public boolean empty() {\n return stackIn.isEmpty() && stackOut.isEmpty();\n }\n\n public void refresh(){\n if(!stackOut.isEmpty()){\n return;\n }\n while(!stackIn.isEmpty()){\n stackOut.push(stackIn.pop());\n }\n }\n}\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094513644","body":"想象成将原始数组和排序后的数组并列排在一起,切一刀。如果这刀的左侧两个数组的数字出现的频次相同,那么右侧的频次也一定相同。这里就是一个分割点。\n继续向右,有同样情况就切一刀。直到走到最后,一定会切最后一刀。记录的每一个分割点,就是分的组数。\n```java\nclass Solution {\n public int maxChunksToSorted(int[] arr) {\n Map map = new HashMap<>();\n int[] sortedArr = new int[arr.length];\n for(int i = 0;i < arr.length;i++){\n sortedArr[i] = arr[i];\n }\n Arrays.sort(sortedArr);\n\n int res = 0;\n for(int i = 0;i < arr.length;i++){\n map.put(arr[i],map.getOrDefault(arr[i],0) + 1);\n if(map.get(arr[i]) == 0){\n map.remove(arr[i]);\n }\n map.put(sortedArr[i],map.getOrDefault(sortedArr[i],0) - 1);\n if(map.get(sortedArr[i]) == 0){\n map.remove(sortedArr[i]);\n }\n if(map.isEmpty()){\n res++;\n }\n }\n return res;\n }\n}\n```\n因为存在sort排序,时间复杂度O(NlogN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095217604","body":"先将链表连成一个环,再找到需要断开的位置断开即可\n```java\nclass Solution {\n public ListNode rotateRight(ListNode head, int k) {\n if(head == null) return null;\n ListNode dummy = head;\n int count = 1;\n while(dummy.next != null){\n count++;\n dummy = dummy.next;\n }\n dummy.next = head;\n\n k = k % count;\n dummy = head;\n count = count - k;\n for(int i = 1;i < count;i++){\n dummy = dummy.next;\n }\n ListNode res = dummy.next;\n dummy.next = null;\n return res;\n }\n}\n```\n\n因为遍历了链表,时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100949135","body":"因为要交换两个节点,所以需要记录两个节点+两个节点前的节点+两个节点后的节点,一共四个节点。分别用cur,one,two,three记录\n交换完后,cur指向下一组需要交换节点的前一个节点\n```java\nclass Solution {\n public ListNode swapPairs(ListNode head) {\n ListNode dummy = new ListNode(0);\n dummy.next = head;\n ListNode cur = dummy;\n ListNode one = null;\n ListNode two = null;\n ListNode three = null;\n while(cur.next != null && cur.next.next != null)\n {\n one = cur.next;\n two = cur.next.next;\n three = cur.next.next.next;\n cur.next = two;\n cur.next.next = one;\n cur.next.next.next = three;\n cur = cur.next.next;\n }\n return dummy.next;\n }\n}\n```\n遍历了链表,时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105789931","body":"考验的是二分查找和分治构建二叉树,中间大小的数构成root根节点,左侧的数组部分分治构成左节点,右侧的数组部分分治构成右节点。这里用的是链表,只需要额外增加一些链表的操作(getMid函数)。也可以将链表转化为数组,再构造,查找起来就很快。以空间换时间\n```java\nclass Solution {\n public TreeNode sortedListToBST(ListNode head) {\n ListNode dummy = head;\n int end = 0;\n while(head != null){\n end++;\n head = head.next;\n }\n\n return dfs(dummy,0,end);\n }\n\n public TreeNode dfs(ListNode head,int start,int end){\n if(start >= end) return null;\n int mid = start + (end - start) / 2;\n ListNode midNode = getMid(head,mid);\n TreeNode node = new TreeNode(midNode.val);\n node.left = dfs(head,start,mid);\n node.right = dfs(head,mid+1,end);\n\n return node;\n }\n \n public ListNode getMid(ListNode head,int mid){\n while(mid > 0){\n mid--;\n head = head.next;\n }\n return head;\n }\n}\n```\n时间复杂度O(NlogN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111943009","body":"两个指针从head出发同时往前移动,当某一个指针指向null的时候,使其指向另一个head。直至两个指针相遇,该节点为相遇节点。直到相遇,第一个指针走了A+C+B的路程,另一个指针走了B+C+A的路程\n```java\npublic class Solution {\n public ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n ListNode A = headA;\n ListNode B = headB;\n while(A != B)\n {\n if(A == null) A = headB;\n else A = A.next;\n if(B == null) B = headA;\n else B = B.next;\n }\n return A;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116973002","body":"- 判断是否有环:两个快慢指针分别从头节点出发,慢指针一次走一格,快指针一次走两个,如果有环,则二者一定会在环内相遇,如果没环,则快指针会先到达null处。可以类比于跑步,跑得快的会套跑的慢的一圈\n- 判断环入口:快指针和慢指针相遇的时候,慢指针走了x+y步,快指针走了x+y+n*(y+z)步骤,n为圈数,大于等于1,如图所示,图片节选自代码随想录。因为快指针是慢指针的两倍速,所以2x+2y=x+y+n*(y+z)。化简后发现当n=1时,x=z,当n大于1时,x=z+(n-1)(y+z)。也就是说,头节点到环入口的距离等于z或z+多圈。因此,用两个指针,一个从头节点出发,一个从相遇节点出发,最终一定会相遇在环入口,无论第二个指针在环里绕了多少圈\n```java\npublic class Solution {\n public ListNode detectCycle(ListNode head) {\n ListNode fast = head;\n ListNode slow = head;\n while(fast != null && fast.next != null)\n {\n slow = slow.next;\n fast = fast.next.next;\n if(slow == fast){\n ListNode index1 = head;\n ListNode index2 = slow;\n while(index1 != index2)\n {\n index1 = index1.next;\n index2 = index2.next;\n }\n return index1;\n }\n }\n return null;\n }\n}\n```\n时间复杂度O(N) 空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121046113","body":"Java可以使用LinkedHashMap实现LRU,内置的函数就可以实现按插入顺序排列的hashmap,手动实现LinkedHashMap代码如下:\n```java\npublic class LRUCache {\n class DLinkedNode {\n int key;\n int value;\n DLinkedNode prev;\n DLinkedNode next;\n public DLinkedNode() {}\n public DLinkedNode(int _key, int _value) {key = _key; value = _value;}\n }\n\n private Map cache = new HashMap();\n private int size;\n private int capacity;\n private DLinkedNode head, tail;\n\n public LRUCache(int capacity) {\n this.size = 0;\n this.capacity = capacity;\n head = new DLinkedNode();\n tail = new DLinkedNode();\n head.next = tail;\n tail.prev = head;\n }\n\n public int get(int key) {\n DLinkedNode node = cache.get(key);\n if (node == null) {\n return -1;\n }\n moveToHead(node);\n return node.value;\n }\n\n public void put(int key, int value) {\n DLinkedNode node = cache.get(key);\n if (node == null) {\n DLinkedNode newNode = new DLinkedNode(key, value);\n cache.put(key, newNode);\n addToHead(newNode);\n ++size;\n if (size > capacity) {\n DLinkedNode tail = removeTail();\n cache.remove(tail.key);\n --size;\n }\n }\n else {\n node.value = value;\n moveToHead(node);\n }\n }\n\n private void addToHead(DLinkedNode node) {\n node.prev = head;\n node.next = head.next;\n head.next.prev = node;\n head.next = node;\n }\n\n private void removeNode(DLinkedNode node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n }\n\n private void moveToHead(DLinkedNode node) {\n removeNode(node);\n addToHead(node);\n }\n\n private DLinkedNode removeTail() {\n DLinkedNode res = tail.prev;\n removeNode(res);\n return res;\n }\n}\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123845190","body":"递归,每一层返回max(左子树深度,右子树深度)+1\n```java\nclass Solution {\n public int maxDepth(TreeNode root) {\n if (root == null) {\n return 0;\n }\n int leftDepth = maxDepth(root.left);\n int rightDepth = maxDepth(root.right);\n return Math.max(leftDepth, rightDepth) + 1;\n }\n}\n```\n层序遍历,使用队列。每遍历一层,深度+1,直到遍历到最下面一层\n\n```java\nclass Solution {\n public int maxDepth(TreeNode root) {\n if(root == null) return 0;\n Queue queue = new LinkedList<>();\n queue.add(root);\n int depth = 0;\n while(!queue.isEmpty())\n {\n int size = queue.size();\n for(int i = 0;i < size;i++){\n TreeNode node = queue.poll();\n if(node.left != null) queue.add(node.left);\n if(node.right != null) queue.add(node.right);\n }\n depth++;\n }\n\n return depth;\n }\n}\n```\n时间复杂度O(N) N为二叉树节点个数","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125223416","body":"先判断当前两个节点是否相同,如果不同,直接返回false。如果相同无法得出最终结论,需要递归进入下一层继续判断子树\n```java\nclass Solution {\n public boolean isSameTree(TreeNode p, TreeNode q) {\n if(p == null && q != null) return false;\n if(p != null && q == null) return false;\n if(p == null && q == null) return true;\n if(p.val != q.val) return false;\n\n boolean l = isSameTree(p.left,q.left);\n boolean r = isSameTree(p.right,q.right);\n\n return l && r;\n }\n}\n```\n时间复杂度O(N) N为树的节点数量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130457949","body":"回溯维护一个List,当递归到叶子节点时,List中保存的数字就是一路从root到当前根节点的所有数字。使用StringBbuilder拼接所有数字,即是当前路径表示的数字\n\n```java\nclass Solution {\n List path = new ArrayList<>();\n int res = 0;\n public int sumNumbers(TreeNode root) {\n path.add(root.val);\n recursion(root);\n return res;\n }\n\n public void recursion(TreeNode root){\n if(root.left == null && root.right == null){\n StringBuilder sb = new StringBuilder();\n for(int num : path){\n sb.append(num);\n }\n res += Integer.parseInt(sb.toString());\n return;\n }\n\n if(root.left != null){\n path.add(root.left.val);\n recursion(root.left);\n path.remove(path.size() - 1);\n }\n\n if(root.right != null){\n path.add(root.right.val);\n recursion(root.right);\n path.remove(path.size() - 1);\n }\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134853681","body":"层序遍历,记录每一层的最左侧的值,不断覆盖变量,最终记录的是最深一层的最左侧的值\n```java\nclass Solution {\n public int findBottomLeftValue(TreeNode root) {\n Queue queue = new LinkedList<>();\n queue.add(root);\n int res = 0;\n while(!queue.isEmpty())\n {\n int size = queue.size();\n for(int i = 0;i < size;i++){\n TreeNode node = queue.poll();\n if(i == 0){\n res = node.val;\n }\n if(node.left != null) queue.add(node.left);\n if(node.right != null) queue.add(node.right);\n }\n }\n\n return res;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138992061","body":"序列化时:前序遍历记录每个节点用逗号分开,空节点记为#\n反序列化:将序列化结果以逗号分开,存储进队列,用队列递归构造树\n```java\npublic class Codec {\n StringBuilder sb = new StringBuilder();\n int count = 1;\n\n public String serialize(TreeNode root) {\n if(root == null){\n sb.append(\"#\").append(\",\");\n return sb.toString();\n }\n\n sb.append(root.val).append(\",\");\n serialize(root.left);\n serialize(root.right);\n return sb.toString();\n }\n\n public TreeNode deserialize(String data) {\n Queue queue = new LinkedList<>();\n String[] pre = data.split(\",\");\n for(String s : pre){\n queue.offer(s);\n }\n return build(queue);\n }\n\n public TreeNode build(Queue queue){\n if(queue.isEmpty()) return null;\n String rootStringVal = queue.poll();\n if(rootStringVal.equals(\"#\")) return null;\n int rootVal = Integer.parseInt(rootStringVal);\n \n TreeNode root = new TreeNode(rootVal);\n root.left = build(queue);\n root.right = build(queue);\n\n return root;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3142198278","body":"遍历二叉树,记录一个三元组,分别表示列、行和节点的值。再按照要求进行排序,列升序,行升序,值升序。最后按规则放入List\n```java\nclass Solution {\n public List> verticalTraversal(TreeNode root) {\n List nodes = new ArrayList();\n dfs(root, 0, 0, nodes);\n Collections.sort(nodes, new Comparator() {\n public int compare(int[] tuple1, int[] tuple2) {\n if (tuple1[0] != tuple2[0]) {\n return tuple1[0] - tuple2[0];\n } else if (tuple1[1] != tuple2[1]) {\n return tuple1[1] - tuple2[1];\n } else {\n return tuple1[2] - tuple2[2];\n }\n }\n });\n List> ans = new ArrayList>();\n int size = 0;\n int lastcol = Integer.MIN_VALUE;\n for (int[] tuple : nodes) {\n int col = tuple[0], row = tuple[1], value = tuple[2];\n if (col != lastcol) {\n lastcol = col;\n ans.add(new ArrayList());\n size++;\n }\n ans.get(size - 1).add(value);\n }\n return ans;\n }\n\n public void dfs(TreeNode node, int row, int col, List nodes) {\n if (node == null) {\n return;\n }\n nodes.add(new int[]{col, row, node.val});\n dfs(node.left, row + 1, col - 1, nodes);\n dfs(node.right, row + 1, col + 1, nodes);\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146508830","body":"先将数组中所有值和其对应索引存入hashmap,再遍历一遍数组,如果遍历到的num对应的target-num在map中,即是找到的两个索引。注意要避免一个数算两次\n```java\nclass Solution {\n public int[] twoSum(int[] nums, int target) {\n Map map = new HashMap<>();\n for(int i = 0;i < nums.length;i++){\n map.put(nums[i],i);\n }\n\n for(int i = 0;i < nums.length;i++){\n if(map.containsKey(target - nums[i]) && map.get(target - nums[i]) != i){\n int[] res = new int[2];\n res[0] = i;\n res[1] = map.get(target - nums[i]);\n return res;\n }\n }\n return null;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148286271","body":"遍历数组,先用hashmap记录每个数字出现的次数。用优先队列定义好排序规则,将map中的内容放入优先队列中,再按照要求从队列中取\n```java\nclass Solution {\n public int[] topKFrequent(int[] nums, int k) {\n Map map = new HashMap<>();\n for(int num : nums){\n map.put(num,map.getOrDefault(num,0)+1);\n }\n PriorityQueue p = new PriorityQueue<>((a,b) -> (b[1]-a[1]));\n for(Map.Entry m : map.entrySet()){\n p.add(new int[]{m.getKey(),m.getValue()});\n }\n int[] result = new int[k];\n for(int i = 0;i < k;i++){\n result[i] = p.poll()[0];\n }\n return result;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149131512","body":"二层遍历,第一层遍历i,第二层遍历,使用map记录每个元组与第一层的i的距离dis出现的次数time。最终由i组成的回旋镖数量为time*(time-1)\n```java\nclass Solution {\n public int numberOfBoomerangs(int[][] points) {\n int res = 0;\n for(int[] a : points){\n Map map = new HashMap<>();\n for(int[] b : points){\n int dis = (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]);\n map.put(dis,map.getOrDefault(dis,0) + 1);\n }\n for(int key : map.keySet()){\n int val = map.get(key);\n res += val * (val - 1);\n }\n }\n return res;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153104469","body":"滑动窗口,定义left指针和right指针,两个指针窗口内即是符合题目要求的子串。不断向右移right指针,如果窗口内的子串不符合题目要求了,就右移left指针缩小窗口直到符合题目要求。\n在遍历过程中,记录窗口长度最大值\n使用hashSet判断窗口内是否符合题目要求\n```java\nclass Solution {\n public int lengthOfLongestSubstring(String s) {\n Set set = new HashSet<>();\n int left = 0;\n int res = 0;\n for(int right = 0;right < s.length();right++){\n char c = s.charAt(right);\n while(set.contains(c)){\n set.remove(s.charAt(left));\n left++;\n }\n\n set.add(c);\n res = Math.max(res,right - left + 1); \n }\n return res;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3157250607","body":"滑动窗口\n```java\nclass Solution {\n public List findSubstring(String s, String[] words) {\n int wordLen = words[0].length(); \n int windowLen = wordLen * words.length; \n\n Map targetCnt = new HashMap<>();\n for (String w : words) {\n targetCnt.put(w,targetCnt.getOrDefault(w,0) + 1);\n }\n\n List ans = new ArrayList<>();\n for (int start = 0; start < wordLen; start++) {\n Map cnt = new HashMap<>();\n int overload = 0;\n for (int right = start + wordLen; right <= s.length(); right += wordLen) {\n String inWord = s.substring(right - wordLen, right);\n if (cnt.getOrDefault(inWord, 0).equals(targetCnt.getOrDefault(inWord, 0))) {\n overload++;\n }\n cnt.merge(inWord, 1, Integer::sum); \n\n int left = right - windowLen;\n if (left < 0) { \n continue;\n }\n if (overload == 0) {\n ans.add(left);\n }\n\n String outWord = s.substring(left, left + wordLen);\n cnt.merge(outWord, -1, Integer::sum); \n if (cnt.get(outWord).equals(targetCnt.getOrDefault(outWord, 0))) {\n overload--;\n }\n }\n }\n\n return ans;\n }\n}\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162563860","body":"前缀和\n```java\nclass Solution {\n public int minSubarray(int[] nums, int p) {\n int n = nums.length;\n int[] s = new int[n + 1];\n for (int i = 0; i < n; i++) {\n s[i + 1] = (s[i] + nums[i]) % p;\n }\n int x = s[n];\n if (x == 0) {\n return 0; \n }\n\n int ans = n;\n Map last = new HashMap<>();\n for (int i = 0; i <= n; i++) {\n last.put(s[i], i);\n int j = last.getOrDefault((s[i] - x + p) % p, -n);\n ans = Math.min(ans, i - j);\n }\n return ans < n ? ans : -1;\n }\n}\n\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170443755","body":"双指针,慢指针用于存数字,快指针用于检验数字是否重复\n```java\nclass Solution {\n public int removeDuplicates(int[] nums) {\n if(nums.length == 1) return 1;\n int slow = 0;\n for(int fast = 1;fasttarget){\n right = middle;\n }else if(nums[middle] queue;\n public MyQueue(){\n queue = new LinkedList<>();\n } \n\n public void add(int val){\n while(!queue.isEmpty() && val > queue.getLast()){\n queue.removeLast();\n }\n queue.add(val);\n }\n\n public void poll(int val){\n if(queue.peek() == val){\n queue.poll();\n }\n }\n\n public int max(){\n return queue.peek();\n }\n}\n```\n时间复杂度O(nlogn)\n优先队列插入的复杂度是logn","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3177951924","body":"两个数组计算每个人的入度和出度\n```java\nclass Solution {\n public int findJudge(int n, int[][] trust) {\n int[] inDegrees = new int[n + 1];\n int[] outDegrees = new int[n + 1];\n for (int[] edge : trust) {\n int x = edge[0], y = edge[1];\n ++inDegrees[y];\n ++outDegrees[x];\n }\n for (int i = 1; i <= n; ++i) {\n if (inDegrees[i] == n - 1 && outDegrees[i] == 0) {\n return i;\n }\n }\n return -1;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182597716","body":"染色法,如果染色过程冲突,则无法实现、返回false\n```java\nclass Solution {\n boolean[] visited;\n boolean[] color;\n boolean flag = false;\n public boolean possibleBipartition(int n, int[][] dislikes) {\n List[] graph = build(dislikes,n);\n visited = new boolean[graph.length];\n color = new boolean[graph.length];\n for(int i = 1;i < graph.length;i++){\n if(visited[i] == false){\n traverse(graph,i);\n }\n }\n return !flag;\n }\n\n public List[] build(int[][] dislikes,int n){\n List[] graph = new List[n + 1];\n for(int i = 0;i < n + 1;i++){\n graph[i] = new LinkedList<>();\n }\n\n for(int[] edge : dislikes){\n int x = edge[0];\n int y = edge[1];\n graph[x].add(y);\n graph[y].add(x);\n }\n return graph;\n }\n\n public void traverse(List[] graph,int s){\n if(flag) return;\n visited[s] = true;\n for(int x : graph[s]){\n if(visited[x] == false){\n color[x] = !color[s];\n traverse(graph,x);\n }else{\n if(color[x] == color[s]) flag = true;\n }\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186848399","body":"拓扑排序\n```java\nclass Solution {\n public int[] sortItems(int n, int m, int[] group, List> beforeItems) {\n List> groupItem = new ArrayList>();\n for (int i = 0; i < n + m; ++i) {\n groupItem.add(new ArrayList());\n }\n\n // 组间和组内依赖图\n List> groupGraph = new ArrayList>();\n for (int i = 0; i < n + m; ++i) {\n groupGraph.add(new ArrayList());\n }\n List> itemGraph = new ArrayList>();\n for (int i = 0; i < n; ++i) {\n itemGraph.add(new ArrayList());\n }\n\n // 组间和组内入度数组\n int[] groupDegree = new int[n + m];\n int[] itemDegree = new int[n];\n \n List id = new ArrayList();\n for (int i = 0; i < n + m; ++i) {\n id.add(i);\n }\n\n int leftId = m;\n // 给未分配的 item 分配一个 groupId\n for (int i = 0; i < n; ++i) {\n if (group[i] == -1) {\n group[i] = leftId;\n leftId += 1;\n }\n groupItem.get(group[i]).add(i);\n }\n // 依赖关系建图\n for (int i = 0; i < n; ++i) {\n int curGroupId = group[i];\n for (int item : beforeItems.get(i)) {\n int beforeGroupId = group[item];\n if (beforeGroupId == curGroupId) {\n itemDegree[i] += 1;\n itemGraph.get(item).add(i); \n } else {\n groupDegree[curGroupId] += 1;\n groupGraph.get(beforeGroupId).add(curGroupId);\n }\n }\n }\n\n // 组间拓扑关系排序\n List groupTopSort = topSort(groupDegree, groupGraph, id); \n if (groupTopSort.size() == 0) {\n return new int[0];\n }\n int[] ans = new int[n];\n int index = 0;\n // 组内拓扑关系排序\n for (int curGroupId : groupTopSort) {\n int size = groupItem.get(curGroupId).size();\n if (size == 0) {\n continue;\n }\n List res = topSort(itemDegree, itemGraph, groupItem.get(curGroupId));\n if (res.size() == 0) {\n return new int[0];\n }\n for (int item : res) {\n ans[index++] = item;\n }\n }\n return ans;\n }\n\n public List topSort(int[] deg, List> graph, List items) {\n Queue queue = new LinkedList();\n for (int item : items) {\n if (deg[item] == 0) {\n queue.offer(item);\n }\n }\n List res = new ArrayList();\n while (!queue.isEmpty()) {\n int u = queue.poll(); \n res.add(u);\n for (int v : graph.get(u)) {\n if (--deg[v] == 0) {\n queue.offer(v);\n }\n }\n }\n return res.size() == items.size() ? res : new ArrayList();\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190861492","body":"模拟机器人移动\n```java\nclass Solution {\n public boolean judgeCircle(String moves) {\n int x = 0, y = 0;\n int length = moves.length();\n for (int i = 0; i < length; i++) {\n char move = moves.charAt(i);\n if (move == 'U') {\n y--;\n } else if (move == 'D') {\n y++;\n } else if (move == 'L') {\n x--;\n } else if (move == 'R') {\n x++;\n }\n }\n return x == 0 && y == 0;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193745750","body":"模拟\n```java\nclass Solution {\n public int[] getOrder(int[][] ts) {\n int n = ts.length;\n // 将 ts 转存成 nts,保留任务编号\n int[][] nts = new int[n][3];\n for (int i = 0; i < n; i++) nts[i] = new int[]{ts[i][0], ts[i][1], i};\n // 根据任务入队时间进行排序\n Arrays.sort(nts, (a,b)->a[0]-b[0]);\n // 根据题意,先按照「持续时间」排序,再根据「任务编号」排序\n PriorityQueue q = new PriorityQueue<>((a,b)->{\n if (a[1] != b[1]) return a[1] - b[1];\n return a[2] - b[2];\n });\n int[] ans = new int[n];\n for (int time = 1, j = 0, idx = 0; idx < n; ) {\n \t// 如果当前任务可以添加到「队列」中(满足入队时间)则进行入队\n while (j < n && nts[j][0] <= time) q.add(nts[j++]);\n if (q.isEmpty()) {\n\t // 如果当前「队列」没有任务,直接跳到下个任务的入队时间\n time = nts[j][0];\n } else {\n \t// 如果有可执行任务的话,根据优先级将任务出队(记录下标),并跳到该任务完成时间点\n int[] cur = q.poll();\n ans[idx++] = cur[2];\n time += cur[1];\n }\n }\n return ans;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194379645","body":"转化为分钟\n```java\nclass Solution {\n public int numberOfRounds(String loginTime, String logoutTime) {\n int loginHour = Integer.parseInt(loginTime.substring(0, 2));\n int loginMinute = Integer.parseInt(loginTime.substring(3));\n int logoutHour = Integer.parseInt(logoutTime.substring(0, 2));\n int logoutMinute = Integer.parseInt(logoutTime.substring(3));\n int loginTotalMinute = loginHour * 60 + loginMinute;\n int logoutTotalMinute = logoutHour * 60 + logoutMinute;\n if (loginTotalMinute > logoutTotalMinute) {\n logoutTotalMinute += 1440;\n }\n if (loginTotalMinute % 15 != 0) {\n loginTotalMinute += 15 - loginTotalMinute % 15;\n }\n logoutTotalMinute -= logoutTotalMinute % 15;\n return Math.max((logoutTotalMinute - loginTotalMinute) / 15, 0);\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3195332635","body":"分别模拟三个情况\n```java\nclass Solution {\n public int minCharacters(String a, String b) {\n int n = a.length(), m = b.length(), ans = 0x3f3f3f3f;\n int[] c1 = new int[26], c2 = new int[26];\n for (char c : a.toCharArray()) c1[c - 'a']++;\n for (char c : b.toCharArray()) c2[c - 'a']++;\n for (int i = 0; i < 26 && ans != 0; i++) {\n // 3\n int ca = n - c1[i], cb = m - c2[i];\n ans = Math.min(ans, ca + cb);\n if (i == 0) continue;\n int r1 = 0, r2 = 0;\n // 1\n for (int j = i; j < 26; j++) r1 += c1[j];\n for (int j = 0; j < i; j++) r1 += c2[j];\n // 2\n for (int j = i; j < 26; j++) r2 += c2[j];\n for (int j = 0; j < i; j++) r2 += c1[j];\n ans = Math.min(ans, Math.min(r1, r2));\n }\n return ans;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199298563","body":"归并排序\n\n```java\nclass Solution {\n public int[] sortArray(int[] nums) {\n sort(nums,0,nums.length - 1);\n return nums;\n }\n\n public void sort(int[] nums,int start,int end){\n if(start >= end) return;\n int p = para(nums,start,end);\n\n sort(nums,start,p - 1);\n sort(nums,p + 1,end);\n }\n\n public int para(int[] nums,int l,int h){\n\n int x = nums[l];\n int i = l,j = h;\n while(i < j)\n {\n while(i < j && nums[j] >= x) j--;\n if(i < j) nums[i++] = nums[j];\n\n while(i < j && nums[i] < x) i++;\n if(i < j) nums[j--] = nums[i];\n }\n\n nums[i] = x;\n return i;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204106258","body":"二分查找\n```java\nclass Solution {\n public int mySqrt(int x) {\n if(x == 0) return 0;\n if(x == 1) return 1;\n int left = 0;\n int right = x;\n while(left < right)\n {\n int middle = left + (right - left) / 2;\n if(middle > x / middle){\n right = middle;\n }else if(middle < x / middle){\n left = middle + 1;\n }else{\n return middle;\n }\n }\n if(right == x / right){\n return right;\n }else{\n return right - 1;\n }\n\n \n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208985528","body":"二分查找\n```java\npublic class Solution extends VersionControl {\n public int firstBadVersion(int n) {\n int left = 1, right = n;\n while (left < right) { \n int mid = left + (right - left) / 2; \n if (isBadVersion(mid)) {\n right = mid; \n } else {\n left = mid + 1; \n }\n }\n return left;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3213255556","body":"```java\nclass Solution {\n public int reversePairs(int[] nums) {\n if (nums.length == 0) {\n return 0;\n }\n return reversePairsRecursive(nums, 0, nums.length - 1);\n }\n\n public int reversePairsRecursive(int[] nums, int left, int right) {\n if (left == right) {\n return 0;\n } else {\n int mid = (left + right) / 2;\n int n1 = reversePairsRecursive(nums, left, mid);\n int n2 = reversePairsRecursive(nums, mid + 1, right);\n int ret = n1 + n2;\n\n // 首先统计下标对的数量\n int i = left;\n int j = mid + 1;\n while (i <= mid) {\n while (j <= right && (long) nums[i] > 2 * (long) nums[j]) {\n j++;\n }\n ret += j - mid - 1;\n i++;\n }\n\n // 随后合并两个排序数组\n int[] sorted = new int[right - left + 1];\n int p1 = left, p2 = mid + 1;\n int p = 0;\n while (p1 <= mid || p2 <= right) {\n if (p1 > mid) {\n sorted[p++] = nums[p2++];\n } else if (p2 > right) {\n sorted[p++] = nums[p1++];\n } else {\n if (nums[p1] < nums[p2]) {\n sorted[p++] = nums[p1++];\n } else {\n sorted[p++] = nums[p2++];\n }\n }\n }\n for (int k = 0; k < sorted.length; k++) {\n nums[left + k] = sorted[k];\n }\n return ret;\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216192351","body":"```java\nclass Solution {\n public int findRadius(int[] houses, int[] heaters) {\n int ans = 0;\n Arrays.sort(heaters);\n for (int house : houses) {\n int i = binarySearch(heaters, house);\n int j = i + 1;\n int leftDistance = i < 0 ? Integer.MAX_VALUE : house - heaters[i];\n int rightDistance = j >= heaters.length ? Integer.MAX_VALUE : heaters[j] - house;\n int curDistance = Math.min(leftDistance, rightDistance);\n ans = Math.max(ans, curDistance);\n }\n return ans;\n }\n\n public int binarySearch(int[] nums, int target) {\n int left = 0, right = nums.length - 1;\n if (nums[left] > target) {\n return -1;\n }\n while (left < right) {\n int mid = (right - left + 1) / 2 + left;\n if (nums[mid] > target) {\n right = mid - 1;\n } else {\n left = mid;\n }\n }\n return left;\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"falsity":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073705405","body":"# 思路\n\n从低位往高位计算, 每次计算保留进位数据,本位留下余数\n\n```python\nclass Solution(object):\n def addToArrayForm(self, num, k):\n \"\"\"\n :type num: List[int]\n :type k: int\n :rtype: List[int]\n \"\"\"\n result = []\n i = len(num) - 1\n while i >=0 or k > 0:\n if i >= 0:\n k += num[i]\n i -= 1\n result.append(k % 10)\n k = k // 10\n return result[::-1]\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3079013152","body":"# 【Day 2】821. 字符的最短距离\n\n## 思路\n\n先遍历一遍获取c的位置列表, 再遍历每个位置计算最近的距离\n\n```python\nclass Solution(object):\n def shortestToChar(self, s, c):\n \"\"\"\n :type s: str\n :type c: str\n :rtype: List[int]\n \"\"\"\n locations = []\n result = []\n for i, char in enumerate(s):\n if char == c:\n locations.append(i)\n \n for i in range(len(s)):\n shortest = min(abs(i - location) for location in locations)\n result.append(shortest)\n return result\n```\n\n时间复杂度: O(n*m), m为字符c出现次数,最差为O(n^2)\n\n空间复杂度: O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084580543","body":"**【Day 3】1381. 设计一个支持增量操作的栈**\n\n*** 思路***\n\n用数组模拟栈\n\n```python\nclass CustomStack(object):\n\n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def __init__(self, maxSize):\n \"\"\"\n :type maxSize: int\n \"\"\"\n self.stack = [0] * maxSize\n self.top = -1\n \n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n if self.top < len(self.stack) - 1:\n self.top += 1\n self.stack[self.top] = x\n \n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if self.top == -1:\n return -1\n value = self.stack[self.top]\n self.top -= 1\n return value\n \n # 时间复杂度: O(k)\n # 空间复杂度: O(n)\n def increment(self, k, val):\n \"\"\"\n :type k: int\n :type val: int\n :rtype: None\n \"\"\"\n lim = min(k, self.top + 1)\n for i in range(lim):\n self.stack[i] += val\n \n\n\n# Your CustomStack object will be instantiated and called as such:\n# obj = CustomStack(maxSize)\n# obj.push(x)\n# param_2 = obj.pop()\n# obj.increment(k,val)\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089882117","body":"**【Day 4】394. 字符串解码**\n\n**思路**\n\n参照[Krahets的字符串解码题解](https://leetcode.cn/problems/decode-string/solutions/19447/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd/)中的辅助栈解法,利用栈来存储每一层[]中的字符串和需要重复的次数逐层拼接字符串,最后得到结果.\n\n**代码**\n\n```python\nclass Solution(object):\n def decodeString(self, s):\n \"\"\"\n :type s: str\n :rtype: str\n \"\"\"\n stack, res, multi = [], \"\", 0\n for c in s:\n if c == '[':\n stack.append([multi, res])\n res, multi = \"\", 0\n elif c == ']':\n cur_multi, last_res = stack.pop()\n res = last_res + cur_multi * res\n elif '0' <= c <= '9':\n multi = multi * 10 + int(c)\n else:\n res += c\n return res \n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(N)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092420487","body":"**【Day 5】232. 用栈实现队列**\n\n**思路**\n\n利用栈先进后出的性质,通过stack1完成元素的倒序放置,再将stack1的元素放入stack2中,前面的元素就放在了栈顶. 此时经过两次入栈出栈的操作stack2中的元素就满足了先进先出的要求.\n\n但是要注意以下问题:\n\n1. 只有在stack2中元素为空时才能将stack1中的元素放入stack2中,这样才能保证有序性\n2. 遍历list元素要使用while, 不能用for,否则会有元素被跳过\n\n**代码**\n\n```python\nclass MyQueue(object):\n\n def __init__(self):\n self.stack1, self.stack2 = [], []\n \n\n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n self.stack1.append(x)\n \n\n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n res = self.peek()\n return self.stack2.pop()\n \n\n def peek(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if self.stack2:\n return self.stack2[-1]\n elif self.stack1:\n while self.stack1:\n self.stack2.append(self.stack1.pop())\n return self.stack2[-1]\n else:\n return -1\n \n\n def empty(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n return not self.stack1 and not self.stack2\n \n\n\n# Your MyQueue object will be instantiated and called as such:\n# obj = MyQueue()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.peek()\n# param_4 = obj.empty()\n```\n\n**复杂度分析**\n\n时间复杂度: push, empty 是O(1), pop, peek是O(N)\n空间复杂度: O(N)\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097331008","body":"**【Day 7】61. 旋转链表**\n\n**思路**\n\nk可能会大于链表长度导致循环遍历链表. 所以真实的旋转偏移是k%n,n为链表长度. 使用双指针找到需要断开的节点位置,将链表进行断开和重新拼接即可得到结果\n\n```pyth\nclass Solution(object):\n def rotateRight(self, head, k):\n \"\"\"\n :type head: Optional[ListNode]\n :type k: int\n :rtype: Optional[ListNode]\n \"\"\"\n if k == 0 or not head or not head.next:\n return head\n\n node = head\n l = 0\n while node:\n l += 1\n node = node.next\n \n if k % l == 0:\n return head\n k = k % l\n slow = fast = head\n for i in range(k):\n fast = fast.next\n \n while fast.next:\n slow = slow.next\n fast = fast.next\n\n new_head = slow.next\n slow.next = None\n fast.next = head\n return new_head\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103411213","body":"**【Day 8】24. 两两交换链表中的节点**\n\n**思路**\n\n类似于反转链表, 用两个指针来对链表指向进行修改,唯一的区别是cur需要间隔一个进行遍历,而不是逐个遍历\n\n```python\nclass Solution(object):\n def swapPairs(self, head):\n \"\"\"\n :type head: Optional[ListNode]\n :rtype: Optional[ListNode]\n \"\"\"\n dummy = ListNode()\n dummy.next = head\n pre = dummy\n cur = head\n while cur and cur.next:\n nxt = cur.next\n cur.next = nxt.next\n nxt.next = cur\n pre.next = nxt\n pre = cur\n cur = cur.next\n \n return dummy.next\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109176294","body":"**【Day 9】109. 有序链表转换二叉搜索树**\n\n**思路**\n\n首先获取链表的长度,再根据二叉树的中序遍历方式递归构建BST, 根节点的值在遍历完左子树后刚好移动了m次到达中间节点,即根节点位置\n\n\n\n```python\nclass Solution:\n def sortedListToBST(self, head: Optional[ListNode]) -> Optional[TreeNode]:\n def getLength(head: ListNode) -> int:\n count = 0\n while head:\n count += 1\n head = head.next\n return count\n\n def buildBST(left: int, right: int) -> TreeNode:\n if left > right:\n return None\n m = (left + right) // 2\n root = TreeNode()\n left_node = buildBST(left, m - 1)\n nonlocal head\n root.val = head.val\n head = head.next\n \n right_node = buildBST(m+1, right)\n root.left = left_node\n root.right = right_node\n return root\n\n l = getLength(head)\n return buildBST(0, l - 1)\n```\n\n**复杂度分析**\n\n时间复杂度: O(n)\n空间复杂度: O(log n)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3122088595","body":"**【Day 12】146. LRU 缓存机制**\n\n**思路**\n\n`get` 和 `put` 必须以 `O(1)` 的平均时间复杂度运行, 说明需要使用到map. 需要记录关键字使用过的顺序需要使用到链表\n\nget方法需要查询map, 如果key存在则返回值,如果不存在则返回-1. 查询完成后,需要把该节点移动到队首(删除后再插入队首)\n\nput方法需要先查询map容量,如果容量已满,需要通过list找到队尾元素删除, 并将新元素插入队首\n\nnode需要知道前后节点,所以使用双向链表,map和node之间建立映射方便查询数据\n\n\n\n需要的内部函数: 删除元素, 将元素插入队首\n\n```python\nclass LRUCache:\n class Node:\n def __init__(self, key: int, val: int):\n self.key = key\n self.val = val\n self.pre = pre\n self.next = next\n\n def __init__(self, capacity: int):\n self.capacity = capacity\n self.dummy = self.Node(-1, -1)\n self.dummy.pre = self.dummy\n self.dummy.next = self.dummy\n self.map = {}\n\n def add_node_to_head(self, node: Node):\n node.pre = self.dummy\n node.next = self.dummy.next\n self.dummy.next.pre = node\n self.dummy.next = node\n\n def remove_node(self, node: Node):\n node.pre.next = node.next\n node.next.pre = node.pre\n\n def get(self, key: int) -> int:\n if key not in self.map:\n return -1\n\n node = self.map[key]\n self.remove_node(node)\n self.add_node_to_head(node)\n return node.val\n\n def put(self, key: int, value: int) -> None:\n if key in self.map:\n node = self.map[key]\n node.val = value\n self.remove_node(node)\n self.add_node_to_head(node)\n return\n\n new_node = self.Node(key, value)\n self.map[key] = new_node\n self.add_node_to_head(new_node)\n\n if len(self.map) > self.capacity:\n tail = self.dummy.pre\n del self.map[tail.key]\n self.remove_node(tail)\n\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124440801","body":"**【Day 13】104. 二叉树的最大深度**\n\n**思路**\n\n二叉树的最大深度为max(左子树深度, 右子树深度) + 1, 这就变成了一个递归问题\n\n```python\nclass Solution(object):\n def maxDepth(self, root):\n \"\"\"\n :type root: Optional[TreeNode]\n :rtype: int\n \"\"\"\n if root is None:\n return 0\n if root is not None and root.left is None and root.right is None:\n return 1\n return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1\n\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127200969","body":"**【Day 14】100. 相同的树**\n\n**思路**\n\n相同的树一定根节点相同,并且左子树和右子树都相同, 可以进行递归判断所有子树是否相同\n\n```python\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if p is None or q is None:\n return p is q\n \n if p.val == q.val:\n return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)\n else:\n return False\n```\n\n**复杂度分析**\n\n时间复杂度: O(min(m,n)) m为p节点个数,n为q节点个数\n空间复杂度: O(min(m,n)) m为p节点个数,n为q节点个数","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136787502","body":"**【Day 16】513. 找树左下角的值**\n\n**思路**\n\n从右往左层序遍历,最后一个节点就是左下角的点\n\n```python\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n q = deque([root])\n while q:\n node = q.popleft()\n if node.right: q.append(node.right)\n if node.left: q.append(node.left)\n return node.val\n```\n\n**复杂度分析**\n\n时间复杂度: O(n) \n空间复杂度: O(n)\n\n","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3151014729","body":"**【Day 21】447. 回旋镖的数量**\n\n**思路**\n\n首先计算距离相等的点的数量,在计算相同距离点之间的排列组合数量\n\n```python\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n res = 0\n n = len(points)\n if n < 3:\n return 0\n \n for i in range(n):\n x0, y0 = points[i]\n dist_count = {}\n \n for j in range(n):\n if i == j:\n continue\n \n x1, y1 = points[j]\n dx = x1 - x0\n dy = y1 - y0\n dist_sq = dx * dx + dy * dy\n \n dist_count[dist_sq] = dist_count.get(dist_sq, 0) + 1\n \n for cnt in dist_count.values():\n res += cnt * (cnt - 1)\n \n return res\n```\n\n时间复杂度: O(n ^ 2)\n\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3175046868","body":"**【Day 28】239. 滑动窗口最大值**\n\n```python\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n n = len(nums)\n if n == 0 or k == 0:\n return []\n \n res = []\n q = deque() \n for i in range(n):\n while q and q[0] < i - k + 1:\n q.popleft()\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n if i >= k - 1:\n res.append(nums[q[0]])\n return res\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3179722453","body":"\n\n```python\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n in_list = [0] * (n + 1)\n out_list = [0] * (n + 1)\n for i in trust:\n in_list[i[1]] += 1\n out_list[i[0]] += 1\n\n for i in range(1, n+1):\n if in_list[i] == n - 1 and out_list[i] == 0:\n return i\n\n return -1\n```\n\n时间复杂度: O(n + m), m为trust列表长度\n\n空间复杂度: O(n)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194443006","body":"```python\nclass Solution:\n def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:\n start = 60 * int(loginTime[:2]) + int(loginTime[3:])\n end = 60 * int(logoutTime[:2]) + int(logoutTime[3:])\n if start > end:\n end += 24 * 60\n start = math.ceil(start / 15) * 15\n end = end // 15 * 15\n return max(0, (end - start) // 15)\n```\n\n时间复杂度: O(1)\n\n空间复杂度: O(1)\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3200900420","body":"快排\n```java\n class Solution {\n public int[] sortArray(int[] nums) {\n quickSort(nums, 0, nums.length - 1);\n return nums;\n }\n\n private void quickSort(int[] nums, int low, int high){\n if(low < high){\n int mid = partition(nums, low, high);\n quickSort(nums, low, mid - 1);\n quickSort(nums, mid + 1, high);\n }\n }\n\n private int partition(int[] nums, int low, int high){\n int pivot = low + (int) (Math.random() * (high - low + 1));\n swap(nums, pivot, low);\n int i = low, j = low + 1;\n while (j <= high){\n if(nums[j] < nums[low]){\n swap(nums, j, ++i);\n }\n j++;\n }\n swap(nums, low, i);\n return i;\n }\n\n private void swap(int[] nums, int i, int j){\n int tmp = nums[i];\n nums[i] = nums[j];\n nums[j] = tmp;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3224529913","body":"思路: 采用定长滑动窗口的做法, 先初始化定长窗口,再移动更新结果\n\n```python\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n ans = count = 0\n vowels = set(['a', 'e', 'i', 'o', 'u'])\n chars = list(s)\n n = len(chars)\n left = right = 0\n while right < k:\n if chars[right] in vowels:\n count += 1\n right += 1\n ans = count\n while right < n:\n if chars[right] in vowels:\n count += 1\n if chars[left] in vowels:\n count -= 1\n ans = max(count, ans)\n left += 1\n right += 1\n return ans\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3228513919","body":"\n\n```java\nclass Solution {\n public double new21Game(int n, int k, int maxPts) {\n if( k > n){\n return 0;\n }\n if((k == 0 && n >= 0) && n > k + maxPts){\n return 1;\n }\n\n int len = k + maxPts;\n double[] dp = new double[len];\n double sum = 0;\n\n for(int i = k; i < len && i <= n; i++){\n dp[i] = 1;\n sum++;\n }\n\n for(int i = k - 1; i >= 0; i--){\n dp[i] = sum / maxPts;\n sum = sum - dp[i + maxPts] + dp[i];\n }\n return dp[0];\n }\n}\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(n)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3240213950","body":"**\n\n```python\nclass Solution:\n def readBinaryWatch(self, turnedOn: int) -> List[str]:\n ans = []\n for h in range(12):\n for m in range(60):\n if bin(h).count('1') + bin(m).count('1') == turnedOn:\n ans.append(f\"{h}:{m:02d}\")\n \n return ans\n```\n\n时间复杂度: O(1)\n\n空间复杂度: O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245665636","body":"\n\n```python\nclass Solution:\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n # 时间复杂度: O(mn)\n # 空间复杂度: O(mn)\n ans = 0\n m, n = len(grid), len(grid[0])\n\n def dfs(i: int, j: int) -> int:\n count = 1\n grid[i][j] = 0\n for x, y in (i-1, j), (i+1, j), (i, j-1), (i, j+1):\n if 0<= x < m and 0 <= y < n and grid[x][y]:\n count += dfs(x, y)\n return count\n\n for i, row in enumerate(grid):\n for j, x in enumerate(row):\n if x:\n ans = max(ans, dfs(i, j))\n\n return ans\n \n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3253854706","body":"\n```python\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n # 时间复杂度: O(n)\n # 空间复杂度: O(n)\n ans = 0\n q = initialBoxes\n while q:\n p = []\n for i in q:\n if status[i] == 0:\n p.append(i)\n continue\n ans += candies[i]\n for key in keys[i]:\n status[key] = 1\n for c in containedBoxes[i]:\n p.append(c)\n if p == q or not p:\n break\n q = p\n return ans\n```","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3271174778","body":"\n\n```java\nclass Solution {\n public int longestCommonSubsequence(String text1, String text2) {\n # 时间复杂度: O(mn)\n # 空间复杂度: O(mn)\n int m = text1.length(), n = text2.length();\n int[][] dp = new int[m+1][n+1];\n for (int i = 1; i <= m; i++) {\n char c1 = text1.charAt(i - 1);\n for (int j = 1; j <= n; j++) {\n char c2 = text2.charAt(j - 1);\n if (c1 == c2){\n dp[i][j] = dp[i - 1][j-1] + 1;\n }else{\n dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);\n }\n\n }\n }\n return dp[m][n];\n }\n}\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3275118967","body":"时间复杂度: O(m * n)\n\n空间复杂度: ~~O(n)~~ 题解指正行列可以交换, 所以为O(min(m, n))\n\n```python\nclass Solution:\n def uniquePaths(self, m: int, n: int) -> int:\n f = [1] * n\n\n for i in range(1, m):\n for j in range(1, n):\n f[j] += f[j - 1]\n return f[n - 1]\n \n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289638493","body":"```python\nclass Solution:\n def findTargetSumWays(self, nums: List[int], target: int) -> int:\n # 时间复杂度: O(n * target)\n # 空间复杂度: O(n * target)\n @cache\n def dfs(i: int, c: int) -> int:\n if i < 0:\n return 1 if c == 0 else 0\n \n return dfs(i - 1, c - nums[i]) + dfs(i - 1, c + nums[i])\n \n return dfs(len(nums) - 1, target)\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3298968000","body":"```python\nclass Solution:\n def change(self, amount: int, coins: List[int]) -> int:\n \t# 时间复杂度(n * amount)\n # 空间复杂度(amount)\n f = [1] + [0] * amount\n for x in coins:\n for c in range(x, amount + 1):\n f[c] += f[c - x]\n return f[-1]\n```","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316065059","body":"```python\nclass Solution:\n def mergeTwoLists(self, list1:Optional[ListNode], list2:Optional[ListNode]) -> Optional[ListNode]:\n cur = dummy = ListNode()\n while list1 and list2:\n if list1.val < list2.val:\n cur.next = list1\n list1 = list1.next\n else:\n cur.next = list2\n list2 = list2.next\n cur = cur.next\n cur.next = list1 if list1 else list2\n return dummy.next\n\n def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:\n # 时间复杂度: O(L * logm) m 为 lists 的长度,L 为所有链表的长度之和\n # 空间复杂度: O(1)\n m = len(lists)\n if m == 0:\n return None\n step = 1\n while step < m:\n for i in range(0, m - step, step * 2):\n lists[i] = self.mergeTwoLists(lists[i], lists[i + step])\n step *= 2\n return lists[0]\n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3334653673","body":"思路: 用Node来创建一个树, 每个node下面可以存下一个字母的node, 并且每个node有个end标志位,用来表示单词结尾\n\n```python\nclass Node:\n __slots__ = \"son\", \"end\"\n\n def __init__(self):\n self.son = {}\n self.end = False\n\n\nclass Trie:\n def __init__(self):\n self.root = Node()\n\n # 时间复杂度: O(n)\n def insert(self, word: str) -> None:\n cur = self.root\n for c in word:\n if c not in cur.son:\n cur.son[c] = Node()\n cur = cur.son[c]\n cur.end = True\n\n # 时间复杂度: O(n)\n def find(self, word: str) -> int:\n cur = self.root\n for c in word:\n if c not in cur.son:\n return 0\n cur = cur.son[c]\n return 2 if cur.end else 1\n \n # 时间复杂度: O(n)\n def search(self, word: str) -> bool:\n return self.find(word) == 2\n\n # 时间复杂度: O(n)\n def startsWith(self, prefix: str) -> bool:\n return self.find(prefix) != 0\n```\n\n空间复杂度: O(m * n) m为insert次数, n为单词长度","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuetong3yu":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073754281","body":"```js\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(nums, k) {\n let str1 = '', str2 = String(k)\n for(let i = 0; i < nums.length; i++) {\n str1 += nums[i];\n }\n // swap to make sure str1 is longer than str2\n if (str1.length < str2.length) {\n const t = str1;\n str1 = str2;\n str2 = t;\n }\n const res = new Array(str1.length).fill(0);\n let p1 = str1.length - 1, p2 = str2.length - 1;\n while(p1 >= 0) {\n res[p1] = Number(str1[p1]) + Number(str2[p2] ?? 0);\n p1 --, p2 --;\n }\n const len = res.length\n let need_shift = false\n for (let i = len - 1; i >= 0; i--) {\n if (res[i] >= 10) {\n if (i === 0) {\n need_shift = true\n } else {\n res[i - 1] = res[i - 1] + 1;\n }\n res[i] = res[i] % 10\n }\n }\n if (need_shift) res.unshift(1)\n return res;\n};\n```\n\n尝试了几个不同的方法。。。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078802551","body":"模拟题意AC,但感觉第二遍 for 循环没必要循环整个 indexes 数组,indexes 数组是天然有序的,应该可以用双指针优化\n\n```js\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const indexes = []\n for(let i = 0; i < s.length; i++) {\n if (s[i] === c) indexes.push(i);\n }\n const res = [];\n for(let i = 0; i < s.length; i++) {\n let min = Infinity\n for(let j = 0; j < indexes.length; j++) {\n min = Math.min(min, Math.abs(i - indexes[j]));\n }\n res.push(min)\n }\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082104676","body":"思路一直接模拟题意,increment 操作循环遍历一遍让元素自增:\n\n```js\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.stack = []\n this.size = 0\n this.maxSize = maxSize\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.size === this.maxSize) return;\n this.stack.push(x);\n this.size ++\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.size === 0) return -1\n const res = this.stack.pop();\n this.size --\n return res;\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n for(let i = 0; i < this.size;i ++) {\n if (i < k) {\n this.stack[i] += val;\n }\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n---\n\n\n思路二使用一个 hashmap 维护自增量,只有在 pop 操作的时候才去运算:\n\n```js\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.stack = []\n this.size = 0\n this.maxSize = maxSize\n this.map = {}\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.size === this.maxSize) return;\n this.stack.push(x);\n this.size ++\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.size === 0) return -1\n const inc = this.map[this.size - 1] || 0;\n const res = this.stack.pop();\n // update inc\n if (inc) {\n this.map[this.size - 1] = 0;\n this.map[this.size - 2] = this.map[this.size - 2] ? this.map[this.size - 2] + inc : inc;\n }\n this.size --\n\n return res + inc;\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n const key = Math.min(k - 1, this.size - 1);\n this.map[key] = this.map[key] ? this.map[key] + val : val;\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n🥲 结果跑出来只打败了 18% 的人,应该是题目给的数据量量太小了 <= 1000,操作 hashmap 的 cost 超过了循环 stack 的时间,不如方法一暴力循环。。。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089570929","body":"用栈秒了\n\n```js\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let i = 0;\n while(i < s.length) {\n const char = s[i];\n if (char !== ']') {\n stack.push(char)\n i ++\n } else {\n let repeatStr = ''\n while(stack[stack.length - 1] !== '[') {\n const new_char = stack.pop();\n repeatStr = new_char + repeatStr;\n }\n // pop '['\n stack.pop()\n // get number \n let repeat_times = ''\n while(/[0-9]/.test(stack[stack.length - 1])) {\n repeat_times = stack.pop() + repeat_times\n }\n repeat_times = Number(repeat_times)\n stack.push(repeatStr.repeat(repeat_times));\n i ++\n }\n }\n let res = ''\n while(stack.length) {\n res = stack.pop() + res;\n }\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091373955","body":"思路:用两个栈模拟操作,在 peek 的时候出第二个栈的顶部即可\n\n\n```js\nvar MyQueue = function() {\n this.a = [];\n this.b = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.a.push(x);\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n this.peek();\n return this.b.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if (this.b.length) {\n return this.b[this.b.length - 1]\n } else {\n while(this.a.length) {\n this.b.push(this.a.pop())\n }\n return this.peek()\n }\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return !this.a.length && !this.b.length\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094511265","body":"用了一个简单的前缀和 AC 了,时间复杂度也是 NlogN\n\n```js\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const sorted_arr = [...arr].sort((a, b) => a - b);\n let count_a = count_b = res = 0;\n\n for(let i = 0; i < arr.length;i ++) {\n count_a += sorted_arr[i];\n count_b += arr[i];\n\n if (count_a === count_b) res ++ \n }\n\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3096927980","body":"```js\nvar rotateRight = function(head, k) {\n if (!head || !head.next || k === 0) return head;\n\n // Count the length of the list\n let length = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n length++;\n }\n\n // Normalize k\n k %= length;\n if (k === 0) return head;\n\n // Find the new tail: (length - k - 1)th node\n let newTail = head;\n for (let i = 0; i < length - k - 1; i++) {\n newTail = newTail.next;\n }\n\n // Rotate\n let newHead = newTail.next;\n newTail.next = null;\n tail.next = head;\n\n return newHead;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100186608","body":"考察交换链表节点的基本操作,需要注意的是“什么时候使用 dummy 节点”的技巧。我的理解是在需要涉及到头节点操作的时候,就创建 dummy 节点。比如这一题 - 交换头两个节点的时候就会涉及到头节点的变更。\n\n\n```js\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n const dummy = new ListNode(null, head);\n let p = dummy;\n while(p.next && p.next.next) {\n const p1 = p.next, p2 = p.next.next;\n p.next = p2;\n p1.next = p2.next;\n p2.next = p1;\n p = p1\n }\n return dummy.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3108866758","body":"Same solution with Problem108. But this problem is giving List instead plain array. So will need to use the trick of two pointers to get the mid node of a Single List.\n\n```js\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if (!head) return null\n return helper(head, null)\n\n function helper(head, tail) {\n if (head === tail) return null;\n let fast = head;\n let slow = head;\n while(fast !== tail && fast.next !== tail) {\n fast = fast.next.next;\n slow = slow.next;\n }\n const root = new TreeNode(slow.val);\n root.left = helper(head, slow);\n root.right = helper(slow.next, tail);\n return root\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111667789","body":"A small trick here is `pa !== pb` and `return pa`. For negative scenarios, if given Lists were not intersected, then one of the Lists must be pointing to `null`, and then returning `null` is expected answer. \n\n```js\nvar getIntersectionNode = function(headA, headB) {\n let pa = headA, pb = headB;\n while(pa !== pb) {\n pa = pa ? pa.next : headB;\n pb = pb ? pb.next : headA;\n }\n return pa\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3115364562","body":"Find the intersection node first, and move the slow pointer to the head, and slowly move both of the pointers till they meet each other(can be proved)\n\n```js\nvar detectCycle = function(head) {\n if (!head) return head;\n let fast = head, slow = head;\n // step1: find the intersection node\n while(fast && fast.next) {\n fast = fast.next.next;\n slow = slow.next;\n // step2: find the entry of the cycle\n if (fast === slow) {\n slow = head;\n while(fast !== slow) {\n fast = fast.next\n slow = slow.next\n }\n return slow;\n }\n }\n return null;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3120830111","body":"In JS, we need to build a double linked list data structure by our own. The rest of the logic is quite straight forward - which use hashmap to save key-node, and use linked list to store access frequency. \n\n```js\nclass DoubleLinkedListNode {\n constructor(key, value) {\n this.key = key;\n this.value = value;\n this.prev = null;\n this.next = null;\n }\n}\n\nclass LRUCache {\n constructor(capacity) {\n this.capacity = capacity;\n this.usedSpace = 0;\n\n this.hashmap = {};\n this.dummyHead = new DoubleLinkedListNode(null, null);\n this.dummyTail = new DoubleLinkedListNode(null, null);\n this.dummyHead.next = this.dummyTail;\n this.dummyTail.prev = this.dummyHead;\n }\n\n _isFull() {\n return this.usedSpace === this.capacity;\n }\n _addToHead(node) {\n const currentHead = this.dummyHead.next;\n\n node.next = currentHead;\n node.prev = this.dummyHead;\n currentHead.prev = node;\n this.dummyHead.next = node;\n\n return node;\n }\n _removeNode(node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n node.next = null\n node.prev = null\n return node\n }\n\n get(key) {\n if (this.hashmap[key] !== undefined) {\n const node = this.hashmap[key];\n this._addToHead(this._removeNode(node));\n return node.value\n } else {\n return -1\n }\n }\n put(key, value) {\n if (this.hashmap[key] !== undefined) {\n const node = this.hashmap[key];\n node.value = value;\n this._addToHead(this._removeNode(node))\n } else {\n if (this._isFull()) {\n const nodeNeedToEvict = this.dummyTail.prev;\n delete this.hashmap[nodeNeedToEvict.key];\n this._removeNode(nodeNeedToEvict);\n this.usedSpace --\n }\n const node = new DoubleLinkedListNode(key, value);\n this.hashmap[key] = node;\n this._addToHead(node);\n this.usedSpace ++\n }\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123671763","body":"Easy\n\n```js\nvar maxDepth = function(root) {\n if (!root) return 0\n return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3124879038","body":"DFS\n\n```js\nvar isSameTree = function(p, q) {\n if (!p && !q) return true\n if (!p || !q) return false\n return p.val === q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130312988","body":"DFS will be much simpler. BFS will need to pass a lot of context(params) into helper function which I don't like and not maintainable as well.\n\n\n```js\nvar sumNumbers = function(root) {\n const res = [];\n dfs(root, '')\n return res.reduce((prev, cur) => prev + cur, 0);\n\n\n function dfs(node, str) {\n if (!node.left && !node.right) {\n res.push(+`${str}${node.val}`);\n return;\n }\n if (node.left) dfs(node.left, `${str}${node.val}`);\n if (node.right) dfs(node.right, `${str}${node.val}`);\n } \n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135220392","body":"Using BFS when accessing the first in the queue, that's the leftest node. And because BFS is looping thru by level, so the last time going thru the queue is the most bottom level. \n\n```js\nvar findBottomLeftValue = function(root) {\n const queue = [root];\n let min = null;\n while(queue.length) {\n const size = queue.length;\n for(let i = 0; i < size; i++) {\n const node = queue.shift();\n if (i === 0) min = node.val\n \n\n if (node.left) queue.push(node.left);\n if (node.right) queue.push(node.right);\n }\n }\n return min;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138261960","body":"Can use either `DFS` or `BFS` to solve the problem. DFS is more simple to me: \n\n```js\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n let res = [];\n function dfs(node) {\n if (!node) {\n res.push('null');\n return;\n }\n res.push(String(node.val));\n dfs(node.left)\n dfs(node.right)\n }\n dfs(root);\n console.log(res.join(','))\n return res.join(',')\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n const datas = data.split(',');\n let i = 0;\n return dfs()\n\n function dfs() {\n const char = datas[i];\n if (char === 'null') {\n i ++\n return null\n }\n const node = new TreeNode(+char);\n i ++\n node.left = dfs()\n node.right = dfs()\n return node;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144933267","body":"Use BFS to save the row and column as index, and then sort these indexes. I think the complexity of this problem is how to mange those keys, 2 dimensions keys are quite intricate. \n\nRuntime complexity: O(nlogn), looping over the nodes is O(n), and using `sort` functions are O(nlogn), the bottle neck is sorting functions\nMemory complexity: O(n), use a hashmap to store all nodes\n\n```js\nvar verticalTraversal = function(root) {\n const map = {}\n const queue = [{\n node: root,\n col: 0,\n }];\n let row = 0;;\n while(queue.length) {\n const size = queue.length;\n for(let i = 0; i < size; i++) {\n const cur = queue.shift();\n const node = cur.node;\n if (map[cur.col]?.[row] === undefined) {\n map[cur.col] = {\n ...map[cur.col],\n [row]: [node.val]\n }\n } else {\n map[cur.col][row].push(node.val);\n }\n if (node.left) queue.push({\n node: node.left, \n col: cur.col - 1,\n })\n if (node.right) queue.push({\n node: node.right,\n col: cur.col + 1\n })\n }\n row ++\n }\n const orderByColumn = Object.entries(map).sort(([key1, _], [key2, __]) => Number(key1) - Number(key2));\n const flatternByColumn = orderByColumn.map(i => {\n const column = i[1];\n const arr = [];\n Object.entries(column).sort(([row1], [row2]) => row1 - row2).forEach(([_row, nodes]) => {\n const orderedNodes = nodes.sort((a, b) => a - b);\n arr.push(...orderedNodes)\n })\n return arr\n })\n return flatternByColumn\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146516199","body":"```js\nvar twoSum = function(nums, target) {\n const map = {}\n for(let i = 0; i < nums.length; i ++) {\n const num = nums[i];\n const diff = target - num\n if (map[diff] !== undefined) {\n return [map[diff], i];\n } else {\n map[num] = i;\n }\n }\n return [-1, -1]\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148419003","body":"```js\nvar topKFrequent = function(nums, k) {\n const map = {};\n for(let i = 0; i < nums.length; i++) {\n map[nums[i]] = map[nums[i]] ? map[nums[i]] + 1 : 1;\n }\n const maxCnt = Math.max(...Object.values(map));\n\n const buckets = Array.from({length: maxCnt + 1}, () => []);\n for(let [num, count] of Object.entries(map)) {\n buckets[count].push(num);\n }\n\n const res = [];\n for(let i = maxCnt; i >= 0 && res.length < k; i--) {\n res.push(...buckets[i])\n }\n \n return res.map(i => +i)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149124973","body":"Using brute force at the beginning, and didn't think of can use map to reduce runtime: \n\n```js\nvar numberOfBoomerangs = function(points) {\n let res = 0;\n let map = {}\n for(let [x1, y1] of points) {\n map = {}\n for(let [x2, y2] of points) {\n const distance = (x1 - x2) ** 2 + (y1 - y2) ** 2;\n const count = map[distance] ?? 0;\n res += count * 2;\n map[distance] = count + 1 \n }\n }\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3155367267","body":"Two pointers classic problem (sliding window): \n\n```js\nvar lengthOfLongestSubstring = function(s) {\n let left = 0, right = 0, res = 0\n const window = {};\n while(right < s.length) {\n const right_char = s[right ++];\n window[right_char] = window[right_char] ? window[right_char] + 1 : 1;\n while (window[right_char] > 1) {\n let remove_char = s[left ++];\n window[remove_char] --;\n }\n res = Math.max(right - left, res);\n }\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160227870","body":"so hard: \n\n\n```js\nvar findSubstring = function(s, words) {\n\n const wordLen = words[0].length;\n const numWords = words.length;\n const totalLen = wordLen * numWords;\n const n = s.length;\n const res = [];\n\n if (n < totalLen) return [];\n\n const wordCount = new Map();\n for (let word of words) {\n wordCount.set(word, (wordCount.get(word) || 0) + 1);\n }\n\n // we loop over wordLen offsets\n for (let offset = 0; offset < wordLen; offset++) {\n let left = offset, count = 0;\n const seen = new Map();\n\n for (let right = offset; right + wordLen <= n; right += wordLen) {\n const word = s.slice(right, right + wordLen);\n\n if (wordCount.has(word)) {\n seen.set(word, (seen.get(word) || 0) + 1);\n count++;\n\n // we shrink window if word is overused\n while (seen.get(word) > wordCount.get(word)) {\n const leftWord = s.slice(left, left + wordLen);\n seen.set(leftWord, seen.get(leftWord) - 1);\n left += wordLen;\n count--;\n }\n\n // Valid window\n if (count === numWords) {\n res.push(left);\n const firstWord = s.slice(left, left + wordLen);\n seen.set(firstWord, seen.get(firstWord) - 1);\n left += wordLen;\n count--;\n }\n } else {\n seen.clear();\n count = 0;\n left = right + wordLen;\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3164450266","body":"```js\nvar minSubarray = function(nums, p) {\n let totalSum = nums.reduce((a, b) => a + b, 0);\n\n // Find the remainder when total sum is divided by p\n let rem = totalSum % p;\n if (rem === 0) return 0; // If the remainder is 0, no subarray needs to be removed\n\n let prefixMod = new Map();\n prefixMod.set(0, -1); // Initialize to handle full prefix\n let prefixSum = 0;\n let minLength = nums.length;\n\n for (let i = 0; i < nums.length; i++) {\n prefixSum += nums[i];\n let currentMod = prefixSum % p;\n let targetMod = (currentMod - rem + p) % p;\n\n if (prefixMod.has(targetMod)) {\n minLength = Math.min(minLength, i - prefixMod.get(targetMod));\n }\n\n prefixMod.set(currentMod, i);\n }\n\n return minLength === nums.length ? -1 : minLength;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168150001","body":"```js\nvar middleNode = function(head) {\n if (!head || !head.next) return head;\n let fast = head, slow = head;\n while(fast && fast.next) {\n fast = fast.next.next;\n slow = slow.next\n } \n return slow;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170748221","body":"```js\nvar removeDuplicates = function(nums) {\n let fast = 0, slow = 0;\n while(fast < nums.length) {\n if (nums[slow] !== nums[fast]) {\n nums[++slow] = nums[fast];\n }\n fast ++\n }\n return slow + 1\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172646559","body":"Binary Search\n\n```js\nvar searchInsert = function(nums, target) {\n let left = 0, right = nums.length;\n while(left < right) {\n const mid = left + Math.floor((right - left) / 2);\n if (nums[mid] >= target) {\n right = mid\n } else {\n left = mid + 1\n }\n }\n return left;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173319860","body":" Too long to put down DeQueue implementation in JS. Don't think this will be asked in an interview: \n\n```js\nvar maxSlidingWindow = function (nums, k) {\n const res = [];\n const dequeue = new Dequeue([]);\n // 前 k - 1 个数入队\n for (let i = 0; i < k - 1; i++) {\n dequeue.push(nums[i]);\n }\n\n // 滑动窗口\n for (let i = k - 1; i < nums.length; i++) {\n dequeue.push(nums[i]);\n res.push(dequeue.max());\n dequeue.shift(nums[i - k + 1]);\n }\n return res;\n};\n\nclass Dequeue {\n constructor(nums) {\n this.list = nums;\n }\n\n push(val) {\n const nums = this.list;\n // 保证数据从队头到队尾递减\n while (nums[nums.length - 1] < val) {\n nums.pop();\n }\n nums.push(val);\n }\n\n // 队头出队\n shift(val) {\n let nums = this.list;\n if (nums[0] === val) {\n // 这里的js实现shift()理论上复杂度应该是O(k), 就不去真实实现一个O(1)出队的队列了,意思到位即可\n nums.shift();\n }\n }\n\n max() {\n return this.list[0];\n }\n}\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3179501468","body":"```js\nvar findJudge = function (n, trust) {\n const count = new Array(n + 1).fill(0);\n for (const edge of trust) {\n const x = edge[0];\n const y = edge[1];\n count[y]++;\n count[x]--;\n }\n for (let i = 1; i <= n; ++i) {\n if (count[i] === n - 1) {\n return i;\n }\n }\n return -1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3184086046","body":"```js\nvar possibleBipartition = function(N, dislikes) {\n const graph = [...Array(N+1)].map(() => []);\n const visited = Array(N+1).fill(false);\n const color = Array(N+1).fill(0);\n\n for(let [u, v] of dislikes) {\n graph[u].push(v);\n graph[v].push(u);\n }\n\n for(let i = 1; i <= N; i++) {\n if(!colorNodes(i)) return false;\n }\n return true;\n\n function colorNodes(node) {\n if(visited[node]) return true;\n const currColor = new Set([1, 2]);\n\n\t\t// remove colors used by neighbors\n for(let child of graph[node]) {\n if(color[child] === 1) currColor.delete(1);\n if(color[child] === 2) currColor.delete(2);\n }\n\n\t\t// no color is available return false\n if(currColor.size === 0) return false;\n\t\t\n\t\t// assign the smallest available color\n color[node] = Math.min(...currColor);\n visited[node] = true; \n\n for(let child of graph[node]) {\n if(!colorNodes(child)) return false; \n }\n return true;\n }\n};\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"stonehl":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073791924","body":"C++代码:\n`class Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n vector res;\n int n = num.size();\n for (int i=n-1; i>=0; --i) {\n int sum = num[i] + k % 10;\n k /= 10;\n if (sum >= 10) {\n k++;\n sum -= 10;\n }\n res.push_back(sum);\n }\n for (; k > 0; k /= 10) {\n res.push_back(k % 10);\n }\n reverse(res.begin(), res.end());\n return res;\n }\n};`","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097159903","body":"### 思路:\n1. 异常情况判断;\n2. 统计链表长度, 同时将链表的收尾相连;\n3. 将k对链表长度取余,余数为0表示刚好旋转了链表长度的整数倍,链表节点位置不变;\n4. 新的链表头节点是原链表中第 n - k 个节点。\n### C++代码\n```\nclass Solution {\npublic:\n ListNode* rotateRight(ListNode* head, int k) {\n if (head == nullptr || head->next == nullptr || k == 0)\n return head;\n int count = 1; // 用来统计链表长度\n ListNode* tmp = head;\n while (tmp->next != nullptr) {\n count++;\n tmp = tmp->next; // 滑动到链表尾部\n }\n k %= count;\n //如果刚好是链表长度的倍数,则不进行旋转\n if (k == 0)\n return head;\n tmp->next = head;\n // \n for (int i=0; i < count - k; i++) {\n tmp = tmp->next;\n }\n ListNode* newHead = tmp->next;\n tmp->next = nullptr;\n return newHead;\n }\n};\n```\n### 时间复杂度\nO(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103550594","body":"### 思路:\n使用递归的方法解题\n1. 找递归终止条件,当链表为空或链表只有一个元素时,没法交换,终止递归,返回当前节点;\n2. 每一次递归需要返回的值是交换后的子链表的头节点;\n\n### 代码:\n```\nclass Solution {\npublic:\n ListNode* swapPairs(ListNode* head) {\n if (head == nullptr || head->next == nullptr) {\n return head;\n }\n ListNode* next = head->next;\n head->next = swapPairs(next->next);\n next->next = head;\n return next;\n }\n};\n\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127754666","body":"### 思路:\n使用深度优先搜索的方法,\n1. 先找返回条件, 如果两个节点都为空,则返回true;\n2. 如果两个节点都不为空,并且这两个节点的值相等则分别递归判断这两个节点的左子树和右子树的值是否相等,如果相等,则返回true, 否则返回false。\n\n### 代码:\n```\nclass Solution {\npublic:\n bool isSameTree(TreeNode* p, TreeNode* q) {\n if(p==nullptr && q==nullptr) {\n return true;\n }\n if (p && q && (p->val == q->val)) {\n return isSameTree(p->right, q->right) && isSameTree(p->left, q->left);\n }\n return false;\n\n }\n};\n```\n### 复杂度分析:\n时间复杂度O(N),N为两棵树节点的最小值","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3151160755","body":"### 思路:\n将每个距离的出现次数记录在哈希表中,然后遍历哈希表,计算并累加回旋镖的个数。\n\n### 代码:\n```\nclass Solution {\npublic:\n int numberOfBoomerangs(vector>& points) {\n int n = points.size();\n int res = 0;\n if (n < 3)\n return res;\n\n int ans = 0;\n for (auto &p : points) {\n unordered_map cnt;\n for (auto &q : points) {\n int dis = (p[0] - q[0]) * (p[0] - q[0]) + (p[1] - q[1]) * (p[1] - q[1]);\n ++cnt[dis];\n }\n for (auto &[_, m] : cnt) {\n ans += m * (m - 1);\n }\n }\n return ans;\n\n }\n};\n```\n时间复杂度:O(n2)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3174960911","body":"### 思路:\n使用双端队列来维护滑动窗口内的最大值\n### 代码:\n```\nclass Solution {\npublic:\n vector maxSlidingWindow(vector& nums, int k) {\n deque q;\n int n = nums.size();\n vector res;\n for(int i = 0; i < n; i++) {\n if(q.size() && i - q.front() >= k)\n q.pop_front();\n while(q.size() && nums[q.back()] <= nums[i]) q.pop_back();\n q.push_back(i);\n if(i >= k - 1) {\n res.push_back(nums[q.front()]);\n }\n }\n return res;\n }\n};\n```\n### 复杂度:\n时间复杂度:O(n)","onTime":true},null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3201130868","body":"### 思路:\n基数排序\n### 代码:\n```\nclass Solution {\npublic:\n vector sortArray(vector& nums) {\n const int NUM = 50000;\n int arr[NUM*10+10];\n bzero(arr,sizeof(arr));\n for(int&num:nums){\n num+=NUM;\n arr[num]+=1;\n }\n int cur = 0;\n for(int i = 0;i<(NUM*10+10);++i){\n int tmp = arr[i];\n while(tmp--){\n nums[cur++] = i-NUM;\n }\n }\n return nums;\n }\n};\n```\n### 时间复杂度: O(N)","onTime":true},null,null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3234026083","body":"### 思路:\n1. 先统计t中每个字符出现的次数;\n2. 初始化左右指针,以及记录答案的变量;\n3. 右指针移动,更新计数。如果当前字符是t中的字符(即计数大于0),则减小cntT;\n4. 当cntT为0时,说明当前窗口包含了t的所有字符,然后尝试移动左指针缩小窗口;\n5. 在缩小窗口时,如果移除了t中的字符,则增加cntT,并更新答案;\n6. 最后根据是否找到答案返回相应的子串。\n### 代码:\n```\nclass Solution {\npublic:\n string minWindow(string s, string t) {\n vector cnt(128, 0);\n for (char c : t) {\n cnt[c]++;\n }\n \n int l = 0, r = 0, ansL = 0, ansR = 0, ans = INT_MAX, cntT = t.length();\n \n while (r < s.length()) {\n if (cnt[s[r]]-- > 0) {\n cntT--;\n }\n r++;\n \n while (cntT == 0) {\n if (r - l < ans) {\n ans = r - l;\n ansL = l;\n ansR = r;\n }\n if (cnt[s[l]]++ == 0) {\n cntT++;\n }\n l++;\n }\n }\n \n return ans == INT_MAX ? \"\" : s.substr(ansL, ansR - ansL);\n }\n};\n```\n### 时间复杂度:O(n)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245701951","body":"### 思路:\n1. 初始化标记数组 visited,避免重复访问;\n2. 遍历每个格子,使用DFS搜索整个岛屿。\n\n### 代码:\n```\nclass Solution {\nprivate:\n int count;\n int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向\n void dfs(vector>& grid, vector>& visited, int x, int y) {\n for (int i = 0; i < 4; i++) {\n int nextx = x + dir[i][0];\n int nexty = y + dir[i][1];\n if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过\n if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的\n\n visited[nextx][nexty] = true;\n count++;\n dfs(grid, visited, nextx, nexty);\n }\n }\n }\n\npublic:\n int maxAreaOfIsland(vector>& grid) {\n int n = grid.size(), m = grid[0].size();\n vector> visited = vector>(n, vector(m, false));\n\n int result = 0;\n for (int i = 0; i < n; i++) {\n for (int j = 0; j < m; j++) {\n if (!visited[i][j] && grid[i][j] == 1) {\n count = 1;\n visited[i][j] = true;\n dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true\n result = max(result, count);\n }\n }\n }\n return result;\n }\n};\n```\n### 时间复杂度: O(MN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249613575","body":"### 思路:\n使用多源广度优先搜索,先找到所有陆地放入队列,然后从陆地开始向外搜索,最后被触及的海洋就是离所有陆地最远的海洋。\n### 代码:\n```\nclass Solution {\npublic:\n int maxDistance(vector>& grid) {\n int n = grid.size();\n vector> directions = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};\n queue> q;\n \n for (int i = 0; i < n; i++) {\n for (int j = 0; j < n; j++) {\n if (grid[i][j] == 1) {\n q.push({i, j});\n }\n }\n }\n \n // 如果全是海洋或者全是陆地\n if (q.empty() || q.size() == n * n) return -1;\n \n int distance = -1;\n \n // 2. 多源 BFS\n while (!q.empty()) {\n int size = q.size();\n distance++;\n \n for (int s = 0; s < size; s++) {\n auto [x, y] = q.front();\n q.pop();\n \n for (auto [dx, dy] : directions) {\n int nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] == 0) {\n grid[nx][ny] = 1; // 标记为已访问(变为陆地)\n q.push({nx, ny});\n }\n }\n }\n }\n \n return distance;\n }\n};\n```\n### 时间复杂度: O(N²)","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3271218211","body":"### 代码:\n```\nclass Solution {\npublic:\n int longestCommonSubsequence(string text1, string text2) {\n int m = text2.length();\n vector f(m + 1);\n for (char x : text1) {\n for (int j = 0, pre = 0; j < m; j++) {\n int tmp = f[j + 1];\n f[j + 1] = x == text2[j] ? pre + 1 : max(f[j + 1], f[j]);\n pre = tmp;\n }\n }\n return f[m];\n }\n};\n```\n### 时间复杂度:O(nm)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289595360","body":"\n### 代码:\n```\nclass Solution {\npublic:\n int findTargetSumWays(vector& nums, int target) {\n int s = reduce(nums.begin(), nums.end()) - abs(target);\n if (s < 0 || s % 2) {\n return 0;\n }\n\n int m = s / 2; // 背包容量\n int n = nums.size();\n vector memo(n, vector(m + 1, -1)); // -1 表示没有计算过\n\n // lambda 递归函数\n auto dfs = [&](this auto&& dfs, int i, int c) -> int {\n if (i < 0) {\n return c == 0;\n }\n int& res = memo[i][c]; // 注意这里是引用\n if (res != -1) { // 之前计算过\n return res;\n }\n if (c < nums[i]) {\n return res = dfs(i - 1, c); // 只能不选\n }\n return res = dfs(i - 1, c) + dfs(i - 1, c - nums[i]); // 不选 + 选\n };\n\n return dfs(n - 1, m);\n }\n};\n```\n时间复杂度:O(nm)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316013499","body":"### 代码:\n```\nclass Solution {\npublic:\n ListNode* mergeKLists(vector& lists) {\n auto cmp = [](const ListNode* a, const ListNode* b) {\n return a->val > b->val; // 最小堆\n };\n priority_queue, decltype(cmp)> pq;\n for (auto head : lists) {\n if (head) {\n pq.push(head); // 把所有非空链表的头节点入堆\n }\n }\n\n ListNode dummy{}; // 哨兵节点,作为合并后链表头节点的前一个节点\n auto cur = &dummy;\n while (!pq.empty()) { // 循环直到堆为空\n auto node = pq.top(); // 剩余节点中的最小节点\n pq.pop();\n if (node->next) { // 下一个节点不为空\n pq.push(node->next); // 下一个节点有可能是最小节点,入堆\n }\n cur->next = node; // 把 node 添加到新链表的末尾\n cur = cur->next; // 准备合并下一个节点\n }\n return dummy.next; // 哨兵节点的下一个节点就是新链表的头节点\n }\n};\n```\n### 时间复杂度:\nO(Llogm),其中 m 为 lists 的长度,L 为所有链表的长度之和。","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuyuanzhang118":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074090351","body":"## 算法思路分析\n\n这是一个将数组形式的整数与普通整数相加的算法,采用了模拟手工加法的思路:\n\n### 核心思路\n1. **从右到左逐位相加**:模拟手工加法,从最低位开始处理\n2. **处理进位**:当两位数字相加结果 ≥ 10 时,产生进位\n3. **处理不同长度**:通过 `num[len-1] || 0` 处理数组已遍历完的情况\n4. **逆序构建结果**:由于是从低位到高位计算,最后需要反转数组\n\n```JavaScript\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(num, k) {\n let res = []\n let len = num.length\n let carry = 0\n while(len > 0 || k > 0) {\n let a = num[len - 1] || 0\n let b = k % 10\n let sum = a + b + carry\n res.push(sum % 10)\n carry = sum >= 10 ? 1 : 0\n len--\n k = Math.floor(k / 10)\n }\n if (carry) {\n res.push(1)\n }\n return res.reverse()\n};\n```\n\n### 时间复杂度\n**O(max(N, log K))**\n- N 是数组 `num` 的长度\n- log K 是整数 k 的位数\n- 循环次数取决于较长的那个数\n\n### 空间复杂度\n**O(max(N, log K))**\n- 结果数组 `res` 的长度最多为 max(N, log K) + 1\n- 其他变量占用常数空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3079209775","body":"## 算法思路分析\n核心思想:双向遍历\n\n这个算法使用了一种巧妙的双向遍历方法来解决问题:\n\n1. 第一次遍历(从左到右) :\n \n - 记录每个位置到其左边最近字符c的距离\n - 使用变量 prev 记录上一个字符c的位置\n - 对于每个位置i,距离为 i - prev\n2. 第二次遍历(从右到左) :\n \n - 计算每个位置到其右边最近字符c的距离\n - 与第一次遍历的结果取最小值,得到最终答案\n - 对于每个位置i,距离为 prev - i\n\n## 代码\n```Javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const n = s.length;\n const answer = new Array(n).fill(Infinity);\n \n // 第一次遍历:从左到右,记录每个位置到左边最近字符c的距离\n let prev = -Infinity;\n for (let i = 0; i < n; i++) {\n if (s[i] === c) {\n prev = i;\n }\n answer[i] = i - prev;\n }\n \n // 第二次遍历:从右到左,更新每个位置到右边最近字符c的距离\n prev = Infinity;\n for (let i = n - 1; i >= 0; i--) {\n if (s[i] === c) {\n prev = i;\n }\n answer[i] = Math.min(answer[i], prev - i);\n }\n \n return answer;\n};\n```\n\n## 复杂度分析\n\n时间复杂度:O(n)\n- 需要遍历字符串两次,每次遍历都是O(n)\n- 总时间复杂度为O(n) + O(n) = O(n)\n- 这是最优的时间复杂度,因为至少需要访问每个字符一次\n\n空间复杂度:O(n)\n- 需要创建一个长度为n的结果数组 answer\n- 除了结果数组外,只使用了常数个额外变量( prev , i , n )\n- 如果不计算返回值所需的空间,额外空间复杂度为O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084609047","body":"### 算法设计思路\n\n**核心数据结构:**\n- 使用数组 `stack` 作为底层存储结构\n- 使用 `maxSize` 记录栈的最大容量\n- 数组索引 0 为栈底,数组末尾为栈顶\n\n### 代码\n\n```JavaScript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.maxSize = maxSize;\n this.stack = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.stack.length < this.maxSize) {\n this.stack.push(x);\n }\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.stack.length === 0) {\n return -1;\n }\n return this.stack.pop();\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n // 对栈底的k个元素进行增量操作\n // 如果栈中元素总数小于k,则对所有元素进行增量操作\n const elementsToIncrement = Math.min(k, this.stack.length);\n for (let i = 0; i < elementsToIncrement; i++) {\n this.stack[i] += val;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n### 时间复杂度分析\n\n| 方法 | 时间复杂度 | 分析 |\n|------|------------|------|\n| **构造函数** | O(1) | 仅初始化两个变量 |\n| **push(x)** | O(1) | 数组末尾添加元素,均摊时间复杂度为 O(1) |\n| **pop()** | O(1) | 数组末尾删除元素 |\n| **increment(k, val)** | O(min(k, n)) | 需要遍历栈底的 k 个元素,n 为当前栈大小 |\n\n### 空间复杂度分析\n\n| 方面 | 空间复杂度 | 分析 |\n|------|------------|------|\n| **整体空间** | O(maxSize) | 最坏情况下数组存储 maxSize 个元素 |\n| **辅助空间** | O(1) | 除了存储栈元素外,只使用常数额外空间 |\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3092430277","body":"### 算法思路分析\n\n**核心思想:使用栈处理嵌套结构**\n\n这是一个典型的括号匹配问题,需要处理嵌套的编码结构。算法的关键在于:\n1. **识别模式** - `k[encoded_string]` 表示重复 k 次\n2. **处理嵌套** - 可能存在多层嵌套,如 `3[a2[c]]`\n3. **状态管理** - 需要记录当前的数字、字符串和历史状态\n\n**算法步骤:**\n1. 遍历字符串的每个字符\n2. 遇到数字:累积构建重复次数(支持多位数)\n3. 遇到 `[`:将当前状态(字符串和数字)压入栈,重置当前状态\n4. 遇到 `]`:从栈中弹出之前的状态,重复当前字符串并拼接\n5. 遇到字母:直接添加到当前字符串\n\n### 代码实现\n\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let currentNum = 0;\n let currentStr = '';\n \n for (let i = 0; i < s.length; i++) {\n const char = s[i];\n \n if (char >= '0' && char <= '9') {\n // 构建数字(可能是多位数)\n currentNum = currentNum * 10 + parseInt(char);\n } else if (char === '[') {\n // 遇到左括号,将当前状态入栈\n stack.push([currentStr, currentNum]);\n currentStr = '';\n currentNum = 0;\n } else if (char === ']') {\n // 遇到右括号,出栈并重复字符串\n const [prevStr, num] = stack.pop();\n currentStr = prevStr + currentStr.repeat(num);\n } else {\n // 普通字符,直接添加到当前字符串\n currentStr += char;\n }\n }\n \n return currentStr;\n};\n```\n\n### 复杂度分析\n\n**时间复杂度:O(n + m)**\n- n:输入字符串长度\n- m:输出字符串长度\n- 每个字符最多被处理一次\n- 字符串重复操作的总时间与最终输出长度成正比\n\n**空间复杂度:O(n + m)**\n- **栈空间**:O(d) - d 为最大嵌套深度,最坏情况 O(n)\n- **字符串存储**:O(m) - 存储中间结果和最终结果\n- **总空间**:O(n + m)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092434643","body":"## 核心算法思路\n\n使用两个栈实现队列:\n- `inStack`: 用于接收新元素的输入\n- `outStack`: 用于输出元素\n\n当需要 pop 或 peek 时,如果 outStack 为空,就将 inStack 中的所有元素转移到 outStack 中,这样就实现了先入先出的特性。\n\n## 代码实现\n\n```javascript\n\nvar MyQueue = function() {\n this.inStack = []; // 用于输入的栈\n this.outStack = []; // 用于输出的栈\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.inStack.push(x);\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n if (this.outStack.length === 0) {\n // 将inStack中的所有元素转移到outStack\n while (this.inStack.length > 0) {\n this.outStack.push(this.inStack.pop());\n }\n }\n return this.outStack.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if (this.outStack.length === 0) {\n // 将inStack中的所有元素转移到outStack\n while (this.inStack.length > 0) {\n this.outStack.push(this.inStack.pop());\n }\n }\n return this.outStack[this.outStack.length - 1];\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return this.inStack.length === 0 && this.outStack.length === 0;\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```\n\n## 复杂度分析\n\n**时间复杂度**:\n- push: O(1)\n- pop: 均摊 O(1)\n- peek: 均摊 O(1) \n- empty: O(1)\n\n**空间复杂度**: O(n)\n\n**均摊 O(1) 的原理**:虽然单次 pop 或 peek 操作在最坏情况下可能需要 O(n) 时间,但每个元素最多只会被转移一次,所以 n 个操作的总时间复杂度为 O(n),均摊下来每个操作为 O(1)。\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094581867","body":"## 算法思路\n- 关键观察:如果前缀[0...i]的最大值 ≤ 后缀[i+1...n-1]的最小值,则可以在位置i处分块\n- 这保证了前面块的所有元素都不大于后面块的任何元素,分别排序后连接仍然有序\n\n## 代码\n```javascript\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const n = arr.length;\n if (n <= 1) return n;\n \n // 计算前缀最大值数组\n const prefixMax = new Array(n);\n prefixMax[0] = arr[0];\n for (let i = 1; i < n; i++) {\n prefixMax[i] = Math.max(prefixMax[i-1], arr[i]);\n }\n \n // 计算后缀最小值数组\n const suffixMin = new Array(n);\n suffixMin[n-1] = arr[n-1];\n for (let i = n-2; i >= 0; i--) {\n suffixMin[i] = Math.min(suffixMin[i+1], arr[i]);\n }\n \n let chunks = 1; // 至少有一个分块\n \n // 检查每个可能的分块点\n for (let i = 0; i < n-1; i++) {\n // 如果前缀最大值 <= 后缀最小值,可以在i处分块\n if (prefixMax[i] <= suffixMin[i+1]) {\n chunks++;\n }\n }\n \n return chunks;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 需要三次遍历数组\n- 空间复杂度:O(n) - 需要两个额外数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097244383","body":"## 核心思路 :\n- 计算链表长度并找到尾节点\n- 优化k值避免重复旋转\n- 找到新的尾节点(第length-k个节点)\n- 重新连接:断开新尾节点与新头节点,原尾节点连接原头节点\n\n## 代码:\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n // 边界情况处理\n if (!head || !head.next || k === 0) {\n return head;\n }\n \n // 1. 计算链表长度并找到尾节点\n let length = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n length++;\n }\n \n // 2. 优化k值,避免不必要的旋转\n k = k % length;\n if (k === 0) {\n return head;\n }\n \n // 3. 找到新的尾节点(从头开始第length-k个节点)\n let newTail = head;\n for (let i = 0; i < length - k - 1; i++) {\n newTail = newTail.next;\n }\n \n // 4. 新的头节点是新尾节点的下一个节点\n let newHead = newTail.next;\n \n // 5. 断开连接并重新连接\n newTail.next = null; // 断开新尾节点与新头节点的连接\n tail.next = head; // 原尾节点连接到原头节点\n \n return newHead;\n};\n```\n\n## 复杂度分析 :\n- 时间复杂度 :O(n) - 需要遍历链表计算长度和找到切分点\n- 空间复杂度 :O(1) - 只使用常数个额外变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103625610","body":"## 算法思路\n- 虚拟头节点技巧: 简化边界条件处理\n- 三指针法: prev, first, second 精确控制交换过程\n- 原地交换: 只修改指针,不创建新节点\n- 边界处理: 空链表和单节点的特殊情况\n\n## 代码实现\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n // 边界情况:空链表或只有一个节点\n if (!head || !head.next) {\n return head;\n }\n \n // 创建虚拟头节点,简化操作\n let dummy = new ListNode(0);\n dummy.next = head;\n let prev = dummy;\n \n // 当存在至少两个节点时进行交换\n while (prev.next && prev.next.next) {\n // 定义要交换的两个节点\n let first = prev.next;\n let second = prev.next.next;\n \n // 执行交换操作\n // 步骤:prev -> first -> second -> ... \n // 变为:prev -> second -> first -> ...\n prev.next = second;\n first.next = second.next;\n second.next = first;\n \n // 移动prev指针到已交换的第二个节点(现在是first)\n prev = first;\n }\n \n return dummy.next;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) \n- 空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109219828","body":"## 算法思路\n- 算法的核心思想是利用有序链表的特性:\n- 选择中间节点作为根节点,保证树的平衡性\n- 递归地将左半部分构建为左子树,右半部分构建为右子树\n- 最优解使用中序遍历的特性,避免重复遍历链表\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n // 计算链表长度\n function getLength(head) {\n let length = 0;\n while (head) {\n length++;\n head = head.next;\n }\n return length;\n }\n \n const length = getLength(head);\n let current = head;\n \n // 中序遍历构建BST\n function buildBST(start, end) {\n if (start > end) return null;\n \n const mid = Math.floor((start + end) / 2);\n \n // 先构建左子树\n const left = buildBST(start, mid - 1);\n \n // 创建根节点(当前链表节点)\n const root = new TreeNode(current.val);\n current = current.next;\n \n // 再构建右子树\n const right = buildBST(mid + 1, end);\n \n root.left = left;\n root.right = right;\n \n return root;\n }\n \n return buildBST(0, length - 1);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 每个节点只访问一次\n- 空间复杂度:O(log n) - 仅递归栈深度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3117083288","body":"## 算法思路\n双指针法 :让两个指针分别从两个链表头部开始遍历,当指针到达链表末尾时跳转到另一个链表的头部。这样可以消除两个链表的长度差异,如果有交点,两个指针会在交点相遇;如果没有交点,两个指针最终都会变成 null。\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function(headA, headB) {\n // 如果任一链表为空,直接返回null\n if (!headA || !headB) {\n return null;\n }\n \n // 双指针法:让两个指针分别遍历两个链表\n // 当指针到达链表末尾时,跳转到另一个链表的头部\n // 这样可以消除长度差,如果有交点,两指针会在交点相遇\n let pA = headA;\n let pB = headB;\n \n // 当两个指针不相等时继续遍历\n while (pA !== pB) {\n // 如果pA到达末尾,跳转到headB;否则继续下一个节点\n pA = pA === null ? headB : pA.next;\n // 如果pB到达末尾,跳转到headA;否则继续下一个节点\n pB = pB === null ? headA : pB.next;\n }\n \n // 返回交点(如果没有交点,两指针都会变成null)\n return pA;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(m + n),其中 m 和 n 分别是两个链表的长度。每个指针最多遍历两个链表一次。\n- 空间复杂度 :O(1),只使用了两个指针变量,没有使用额外的数据结构。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3117100989","body":"## 算法思路\n- 第一阶段 :使用快慢指针检测是否有环\n- 慢指针每次移动1步,快指针每次移动2步\n- 如果有环,快慢指针必定会相遇\n- 第二阶段 :找到环的起始节点\n- 基于数学原理:从头节点到环入口的距离等于从相遇点到环入口的距离\n- 将一个指针重置到头节点,两指针同速移动直到相遇\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n // 边界情况:空链表或只有一个节点且无环\n if (!head || !head.next) {\n return null;\n }\n \n // 第一阶段:使用快慢指针检测是否有环\n let slow = head;\n let fast = head;\n \n // 快指针每次走两步,慢指针每次走一步\n while (fast && fast.next) {\n slow = slow.next;\n fast = fast.next.next;\n \n // 如果快慢指针相遇,说明存在环\n if (slow === fast) {\n break;\n }\n }\n \n // 如果没有环,返回null\n if (!fast || !fast.next) {\n return null;\n }\n \n // 第二阶段:找到环的起始节点\n // 将一个指针重置到头节点,两个指针同时以相同速度移动\n // 它们相遇的地方就是环的起始节点\n slow = head;\n while (slow !== fast) {\n slow = slow.next;\n fast = fast.next;\n }\n \n return slow; // 返回环的起始节点\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 最多遍历链表两次\n- 空间复杂度 :O(1) - 只使用常数个额外变量,满足进阶要求","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3124469572","body":"## 算法思路\n这个LRU(Least Recently Used)缓存实现采用了 哈希表 + 双向链表 的经典设计模式:\n数据结构组合 :\n - Map :用于O(1)时间复杂度的键值查找\n - 双向链表:用于维护访问顺序,支持O(1)的插入和删除操作\n - 虚拟头尾节点:简化边界条件处理\n\n## 代码\n```javascript\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.cache = new Map(); // 使用Map存储键值对\n this.head = {}; // 虚拟头节点\n this.tail = {}; // 虚拟尾节点\n this.head.next = this.tail;\n this.tail.prev = this.head;\n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n if (!this.cache.has(key)) {\n return -1;\n }\n \n // 存在则将节点移到链表头部(表示最近使用)\n const node = this.cache.get(key);\n this.removeFromList(node);\n this.addToHead(node);\n \n return node.value;\n};\n\n/** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\nLRUCache.prototype.put = function(key, value) {\n // 如果已存在,先删除旧节点\n if (this.cache.has(key)) {\n const oldNode = this.cache.get(key);\n this.removeFromList(oldNode);\n this.cache.delete(key);\n }\n \n // 创建新节点并添加到头部\n const newNode = { key, value, prev: null, next: null };\n this.cache.set(key, newNode);\n this.addToHead(newNode);\n \n // 如果超出容量,删除尾部节点(最久未使用)\n if (this.cache.size > this.capacity) {\n const tailNode = this.tail.prev;\n this.removeFromList(tailNode);\n this.cache.delete(tailNode.key);\n }\n};\n\n// 辅助方法:将节点添加到链表头部\nLRUCache.prototype.addToHead = function(node) {\n node.next = this.head.next;\n node.prev = this.head;\n this.head.next.prev = node;\n this.head.next = node;\n};\n\n// 辅助方法:从链表中删除节点\nLRUCache.prototype.removeFromList = function(node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n};\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```\n\n## 复杂度分析\n- 时间复杂度:O(1)\n- 空间复杂度:O(capacity)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124496973","body":"## 算法思路\n使用广度优先搜索(BFS)的方法来计算二叉树的最大深度:\n- 初始化 :如果根节点为空,直接返回0\n- 队列存储 :使用队列存储节点和对应的深度信息,初始将根节点和深度1入队\n- 层序遍历 :通过队列进行层序遍历,每次取出队首元素\n- 深度更新 :更新最大深度值,并将当前节点的左右子节点(如果存在)连同深度+1一起入队\n- 返回结果 :遍历完成后返回记录的最大深度\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if (!root) return 0;\n let queue = [[root, 1]];\n let maxDepth = 0;\n\n while (queue.length > 0) {\n let [node, depth] = queue.shift();\n if (node) {\n maxDepth = Math.max(maxDepth, depth);\n if (node.left) queue.push([node.left, depth + 1]);\n if (node.right) queue.push([node.right, depth + 1]);\n }\n }\n\n return maxDepth;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 O(n) ,其中n是二叉树中节点的总数\n- 空间复杂度 O(w) ,其中w是二叉树的最大宽度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3126191127","body":"## 算法思路\n使用递归的深度优先搜索(DFS)方法:\n- 基本情况 :如果两个节点都为空,返回 true\n- 边界情况 :如果只有一个节点为空,返回 false\n- 值比较 :如果两个节点的值不相等,返回 false\n- 递归检查 :同时检查左子树和右子树是否相同\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} p\n * @param {TreeNode} q\n * @return {boolean}\n */\nvar isSameTree = function(p, q) {\n if (p === null && q === null) {\n return true;\n }\n if (p === null || q === null || p.val !== q.val) {\n return false;\n }\n return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(min(m, n)),其中 m 和 n 分别是两棵树的节点数。在最坏情况下需要遍历较小树的所有节点。\n- 空间复杂度 :O(min(m, n)),递归调用栈的深度取决于树的高度。在完全平衡的树中为 O(log(min(m, n))),在完全不平衡的树中为 O(min(m, n))。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3133136375","body":"## 算法思路\n这是一个典型的二叉树深度优先搜索(DFS)问题。核心思想是:\n- 从根节点开始,沿着每条路径向下遍历\n- 在遍历过程中,将当前路径形成的数字逐步构建(当前数字 = 之前数字 × 10 + 当前节点值)\n- 当到达叶节点时,将该路径形成的完整数字加入总和\n- 递归处理左右子树,最终返回所有路径数字的总和\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root) {\n // 深度优先搜索函数\n function dfs(node, currentSum) {\n // 如果节点为空,返回0\n if (!node) {\n return 0;\n }\n \n // 计算当前路径的数字:之前的数字*10 + 当前节点值\n currentSum = currentSum * 10 + node.val;\n \n // 如果是叶节点(没有左右子树),返回当前路径形成的数字\n if (!node.left && !node.right) {\n return currentSum;\n }\n \n // 递归计算左右子树的路径数字之和\n return dfs(node.left, currentSum) + dfs(node.right, currentSum);\n }\n \n return dfs(root, 0);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) ,其中 n 是二叉树中节点的数量,需要访问每个节点一次\n- 空间复杂度:O(h) ,其中 h 是二叉树的高度,递归调用栈的深度等于树的高度\n - 最坏情况(完全不平衡的树):O(n)\n - 最好情况(完全平衡的树):O(log n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136794752","body":"## 算法思路\n广度优先搜索(BFS)\n- 使用层序遍历,从右到左遍历每一层\n- 通过队列实现,先添加右子节点再添加左子节点\n- 最后访问到的节点就是最底层最左边的节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n // 使用层序遍历(BFS)从右到左遍历每一层\n // 最后访问到的节点就是最底层最左边的节点\n let queue = [root];\n let result = root.val;\n \n while (queue.length > 0) {\n let levelSize = queue.length;\n \n // 遍历当前层的所有节点\n for (let i = 0; i < levelSize; i++) {\n let node = queue.shift();\n result = node.val; // 更新结果为当前节点值\n \n // 先添加右子节点,再添加左子节点\n // 这样在同一层中,左边的节点会后被访问到\n if (node.right) {\n queue.push(node.right);\n }\n if (node.left) {\n queue.push(node.left);\n }\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),需要遍历所有节点\n- 空间复杂度:O(w),w为树的最大宽度(队列空间)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3140223821","body":"## 算法思路\n序列化过程 :\n- 采用前序遍历(根-左-右)的方式遍历二叉树\n- 空节点用 'null' 字符串表示\n- 所有节点值用逗号连接成字符串\n- 前序遍历的优势是根节点总在最前面,便于重构\n\n反序列化过程 :\n- 将字符串按逗号分割成数组\n- 使用递归按前序遍历顺序重构二叉树\n- 维护索引指针依次处理数组元素\n- 遇到 'null' 返回空节点,否则创建新节点并递归构建左右子树\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n const result = [];\n \n function preorder(node) {\n if (node === null) {\n result.push('null');\n return;\n }\n \n result.push(node.val.toString());\n preorder(node.left);\n preorder(node.right);\n }\n \n preorder(root);\n return result.join(',');\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n if (!data || data === 'null') {\n return null;\n }\n \n const values = data.split(',');\n let index = 0;\n \n function buildTree() {\n if (index >= values.length || values[index] === 'null') {\n index++;\n return null;\n }\n \n const node = new TreeNode(parseInt(values[index]));\n index++;\n \n node.left = buildTree();\n node.right = buildTree();\n \n return node;\n }\n \n return buildTree();\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```\n\n## 复杂度分析\n时间复杂度 :\n- 序列化:O(n) - 需要访问每个节点一次\n- 反序列化:O(n) - 需要处理每个序列化值一次\n\n空间复杂度 :\n- 序列化:O(n) - 递归栈深度最坏情况为O(n),结果数组大小为O(n)\n- 反序列化:O(n) - 递归栈深度最坏情况为O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3148418818","body":"## 算法思路\n- DFS遍历 :使用深度优先搜索遍历二叉树,记录每个节点的坐标(row, col)和值\n- 坐标规则 :根据题目要求,左子节点坐标为(row+1, col-1),右子节点坐标为(row+1, col+1)\n- 分组排序 :将节点按列索引分组,对每列内的节点先按行排序,同行按值排序\n- 结果输出 :按列索引从小到大的顺序返回垂序遍历结果\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n if (!root) return [];\n \n // 存储节点信息:[row, col, val]\n const nodes = [];\n \n // DFS遍历,记录每个节点的坐标和值\n function dfs(node, row, col) {\n if (!node) return;\n \n nodes.push([row, col, node.val]);\n \n // 左子节点:row+1, col-1\n dfs(node.left, row + 1, col - 1);\n // 右子节点:row+1, col+1\n dfs(node.right, row + 1, col + 1);\n }\n \n // 从根节点开始遍历,根节点坐标为(0, 0)\n dfs(root, 0, 0);\n \n // 按列索引分组\n const columnMap = new Map();\n for (const [row, col, val] of nodes) {\n if (!columnMap.has(col)) {\n columnMap.set(col, []);\n }\n columnMap.get(col).push([row, val]);\n }\n \n // 获取所有列索引并排序\n const columns = Array.from(columnMap.keys()).sort((a, b) => a - b);\n \n const result = [];\n for (const col of columns) {\n const columnNodes = columnMap.get(col);\n // 对每列内的节点排序:先按行排序,同行按值排序\n columnNodes.sort((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按行排序\n }\n return a[1] - b[1]; // 同行按值排序\n });\n \n // 提取值\n result.push(columnNodes.map(node => node[1]));\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n log n),其中n是节点数,主要消耗在排序操作\n- 空间复杂度 :O(n),用于存储节点信息和分组数据","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3148426517","body":"## 算法思路\n- 使用哈希表存储已遍历的数值和索引\n- 对每个数值计算其配对数值,在哈希表中O(1)时间查找\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n // 创建哈希表,key为数值,value为索引\n const map = new Map();\n \n for (let i = 0; i < nums.length; i++) {\n // 计算当前数值需要配对的数值\n const complement = target - nums[i];\n \n // 在哈希表中查找配对数值\n if (map.has(complement)) {\n // 找到配对,返回两个索引\n return [map.get(complement), i];\n }\n \n // 将当前数值和索引存入哈希表\n map.set(nums[i], i);\n }\n \n return []; // 题目保证有解,这里不会执行到\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148432520","body":"## 算法思路\n采用桶排序的思想来实现:\n- 频率统计 :使用哈希表统计每个元素的出现频率\n- 桶排序 :创建频率桶,桶的索引表示频率,桶中存储具有该频率的元素\n- 结果收集 :从最高频率的桶开始遍历,收集前k个元素\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function(nums, k) {\n // 步骤1: 统计频率\n const freqMap = new Map();\n for (const num of nums) {\n freqMap.set(num, (freqMap.get(num) || 0) + 1);\n }\n \n // 步骤2: 创建频率桶\n // 桶的索引表示频率,桶中存储具有该频率的元素\n const buckets = new Array(nums.length + 1).fill(null).map(() => []);\n \n for (const [num, freq] of freqMap) {\n buckets[freq].push(num);\n }\n \n // 步骤3: 从高频率到低频率收集前k个元素\n const result = [];\n for (let i = buckets.length - 1; i >= 0 && result.length < k; i--) {\n if (buckets[i].length > 0) {\n result.push(...buckets[i]);\n }\n }\n \n // 返回前k个元素\n return result.slice(0, k);\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 满足题目要求的优于O(n log n)\n- 统计频率:O(n)\n- 创建桶并填充:O(n)\n- 收集结果:O(n)\n\n- 空间复杂度 :O(n)\n- 哈希表:O(n)\n- 桶数组:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3153115326","body":"## 算法思路\n- 核心思想 :枚举每个点作为回旋镖的中心点i\n- 距离计算 :计算中心点到所有其他点的欧式距离(使用距离平方避免开方运算)\n- 哈希统计 :使用Map统计相同距离的点的数量\n- 组合计算 :如果有n个点到中心点距离相同,可形成n×(n-1)个回旋镖\n- 顺序考虑 :回旋镖(i,j,k)和(i,k,j)是不同的,需要考虑j和k的顺序\n\n## 代码\n```javascript\n/**\n * @param {number[][]} points\n * @return {number}\n */\nvar numberOfBoomerangs = function(points) {\n let count = 0;\n \n // 遍历每个点作为回旋镖的中心点i\n for (let i = 0; i < points.length; i++) {\n // 使用Map记录从点i到其他点的距离及对应的点的数量\n const distanceMap = new Map();\n \n // 计算点i到其他所有点的距离\n for (let j = 0; j < points.length; j++) {\n if (i !== j) {\n // 计算欧式距离的平方(避免开方运算,提高效率)\n const distance = getDistanceSquared(points[i], points[j]);\n \n // 记录该距离对应的点的数量\n distanceMap.set(distance, (distanceMap.get(distance) || 0) + 1);\n }\n }\n \n // 对于每个距离,如果有n个点,则可以形成n*(n-1)个回旋镖\n // 因为回旋镖(i,j,k)中j和k的顺序是有意义的\n for (const [distance, pointCount] of distanceMap) {\n if (pointCount >= 2) {\n count += pointCount * (pointCount - 1);\n }\n }\n }\n \n return count;\n};\n\n/**\n * 计算两点间欧式距离的平方\n * @param {number[]} point1 \n * @param {number[]} point2 \n * @return {number}\n */\nfunction getDistanceSquared(point1, point2) {\n const dx = point1[0] - point2[0];\n const dy = point1[1] - point2[1];\n return dx * dx + dy * dy;\n}\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n²) - 外层循环n次,内层循环n-1次\n- 空间复杂度 :O(n) - 最坏情况下Map存储n-1个不同距离","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153126755","body":"## 算法思路\n- 滑动窗口技术 :使用双指针 left 和 right 构成滑动窗口\n- 哈希表优化 :记录每个字符最后出现的位置\n- 动态调整 :遇到重复字符时,将左指针移动到重复字符的下一个位置\n- 实时更新 :持续更新最大长度\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n if (s.length === 0) return 0;\n \n let left = 0; // 滑动窗口左指针\n let maxLength = 0; // 记录最大长度\n let charMap = new Map(); // 哈希表:字符 -> 最后出现的索引\n \n for (let right = 0; right < s.length; right++) {\n const char = s[right];\n \n // 如果字符已存在且在当前窗口内,移动左指针\n if (charMap.has(char) && charMap.get(char) >= left) {\n left = charMap.get(char) + 1;\n }\n \n // 更新字符的最新位置\n charMap.set(char, right);\n \n // 更新最大长度\n maxLength = Math.max(maxLength, right - left + 1);\n }\n \n return maxLength;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 每个字符最多被访问两次\n- 空间复杂度 :O(min(m,n)) - m是字符集大小,n是字符串长度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3158322222","body":"## 算法思路\n- 滑动窗口 + 哈希表 :避免生成所有排列组合,直接在原字符串上滑动匹配\n- 分层遍历 :由于words中所有单词长度相同,按单词长度为步长进行遍历\n- 频次匹配 :使用哈希表记录words中单词频次,滑动窗口中维护当前单词频次\n- 智能重置 :遇到不在words中的单词时,直接重置窗口位置\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n if (!s || !words || words.length === 0) return [];\n \n const wordLen = words[0].length;\n const totalLen = wordLen * words.length;\n const result = [];\n \n // 创建words的频次映射\n const wordCount = new Map();\n for (const word of words) {\n wordCount.set(word, (wordCount.get(word) || 0) + 1);\n }\n \n // 对于每个可能的起始位置(0到wordLen-1),使用滑动窗口\n for (let i = 0; i < wordLen; i++) {\n let left = i;\n let right = i;\n let validWords = 0;\n const windowCount = new Map();\n \n while (right + wordLen <= s.length) {\n // 扩展右边界,添加新单词\n const rightWord = s.substring(right, right + wordLen);\n right += wordLen;\n \n if (wordCount.has(rightWord)) {\n windowCount.set(rightWord, (windowCount.get(rightWord) || 0) + 1);\n if (windowCount.get(rightWord) <= wordCount.get(rightWord)) {\n validWords++;\n }\n \n // 如果窗口大小超过目标长度,收缩左边界\n while (right - left > totalLen) {\n const leftWord = s.substring(left, left + wordLen);\n left += wordLen;\n \n if (wordCount.has(leftWord)) {\n if (windowCount.get(leftWord) <= wordCount.get(leftWord)) {\n validWords--;\n }\n windowCount.set(leftWord, windowCount.get(leftWord) - 1);\n }\n }\n \n // 检查是否找到有效的串联子串\n if (validWords === words.length && right - left === totalLen) {\n result.push(left);\n }\n } else {\n // 遇到不在words中的单词,重置窗口\n windowCount.clear();\n validWords = 0;\n left = right;\n }\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n × m),其中n是字符串s的长度,m是单词长度\n- 外层循环m次(每个可能的起始偏移)\n- 内层每个字符最多被访问2次(加入和移出窗口)\n\n- 空间复杂度 :O(k),其中k是words数组的长度\n- 主要用于存储单词频次的哈希表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162949952","body":"## 算法思路\n- 数学原理 :如果数组总和 sum % p = remainder ,需要找到一个子数组,其和也等于 remainder ,移除后剩余部分就能被p整除\n- 技术方案 :使用前缀和 + 哈希表来高效查找目标子数组\n- 关键公式 : prefixSum[i] % p = (prefixSum[j] % p - remainder + p) % p\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar minSubarray = function(nums, p) {\n // 计算数组总和\n const totalSum = nums.reduce((sum, num) => sum + num, 0);\n \n // 如果总和已经能被p整除,不需要移除任何元素\n const remainder = totalSum % p;\n if (remainder === 0) {\n return 0;\n }\n \n // 使用哈希表记录前缀和的余数及其对应的索引\n const prefixMap = new Map();\n prefixMap.set(0, -1); // 初始化,前缀和为0时索引为-1\n \n let prefixSum = 0;\n let minLength = nums.length; // 初始化为数组长度(最坏情况)\n \n for (let i = 0; i < nums.length; i++) {\n prefixSum += nums[i];\n const currentRemainder = prefixSum % p;\n \n // 我们需要找到一个前缀和,使得当前前缀和减去它等于remainder\n // 即:currentRemainder - targetRemainder = remainder (mod p)\n // 所以:targetRemainder = (currentRemainder - remainder + p) % p\n const targetRemainder = (currentRemainder - remainder + p) % p;\n \n if (prefixMap.has(targetRemainder)) {\n const prevIndex = prefixMap.get(targetRemainder);\n const subarrayLength = i - prevIndex;\n minLength = Math.min(minLength, subarrayLength);\n }\n \n // 更新当前前缀和余数的索引\n prefixMap.set(currentRemainder, i);\n }\n \n // 如果最小长度等于数组长度,说明无法找到合适的子数组\n return minLength === nums.length ? -1 : minLength;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 只需要遍历数组一次,哈希表操作为O(1)\n- 空间复杂度 :O(min(n, p)) - 哈希表最多存储min(n, p)个不同的余数","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166733694","body":"## 算法思路\n使用 快慢指针 (Floyd's Tortoise and Hare Algorithm)技术:\n- 设置两个指针:慢指针每次移动一步,快指针每次移动两步\n- 当快指针到达链表末尾时,慢指针恰好位于链表的中间位置\n- 对于偶数长度的链表,返回第二个中间节点\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n // 使用快慢指针法(Floyd's Tortoise and Hare Algorithm)\n // 慢指针每次移动一步,快指针每次移动两步\n // 当快指针到达链表末尾时,慢指针正好在中间位置\n \n let slow = head; // 慢指针\n let fast = head; // 快指针\n \n // 当快指针和快指针的下一个节点都不为空时继续循环\n while (fast !== null && fast.next !== null) {\n slow = slow.next; // 慢指针移动一步\n fast = fast.next.next; // 快指针移动两步\n }\n \n // 当循环结束时,slow指针指向中间节点\n // 如果链表长度为奇数,slow指向唯一的中间节点\n // 如果链表长度为偶数,slow指向第二个中间节点\n return slow;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 需要遍历链表一次,其中n是链表的长度\n- 空间复杂度:O(1) - 只使用了两个额外的指针变量,不随输入规模增长","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3172634872","body":"## 算法思路\n- 双指针技术 :使用 slow 指针指向当前不重复元素的位置, fast 指针遍历数组\n- 原地修改 :当发现不重复元素时,将其复制到 slow+1 位置\n- 利用排序特性 :由于数组已排序,相同元素必然相邻,只需比较相邻元素\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n // 边界情况:空数组或只有一个元素\n if (nums.length <= 1) {\n return nums.length;\n }\n \n // slow指针指向当前不重复元素的位置\n let slow = 0;\n \n // fast指针遍历数组,从第二个元素开始\n for (let fast = 1; fast < nums.length; fast++) {\n // 如果当前元素与前一个不重复元素不同\n if (nums[fast] !== nums[slow]) {\n // 将slow指针向前移动一位\n slow++;\n // 将当前不重复元素复制到slow位置\n nums[slow] = nums[fast];\n }\n // 如果相同,fast继续向前,slow保持不变\n }\n \n // 返回不重复元素的个数(slow指向最后一个不重复元素的索引)\n return slow + 1;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 只需遍历数组一次\n- 空间复杂度 :O(1) - 只使用常数额外空间,符合原地修改要求","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172638327","body":"## 算法思路\n- 二分查找核心思想 :通过比较中间元素与目标值,每次排除一半搜索空间\n- 查找逻辑 :如果找到目标值返回索引,否则返回应插入的位置\n- 关键实现 :循环结束时left指针就是插入位置\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let left = 0;\n let right = nums.length - 1;\n \n // 二分查找\n while (left <= right) {\n // 计算中间位置,避免整数溢出\n let mid = Math.floor(left + (right - left) / 2);\n \n if (nums[mid] === target) {\n // 找到目标值,返回索引\n return mid;\n } else if (nums[mid] < target) {\n // 目标值在右半部分\n left = mid + 1;\n } else {\n // 目标值在左半部分\n right = mid - 1;\n }\n }\n \n // 没找到目标值,left就是应该插入的位置\n return left;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(log n) - 满足题目要求,每次迭代将搜索范围缩小一半\n- 空间复杂度 :O(1) - 只使用常数级别的额外变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3174034461","body":"## 算法思路\n使用双端队列维护一个单调递减的队列,队列中存储数组元素的索引:\n\n- 队首始终是当前窗口的最大值索引\n- 移除超出窗口范围的元素\n- 维护单调性:移除队尾所有小于等于当前元素的索引\n- 当窗口形成时,队首就是最大值\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar maxSlidingWindow = function(nums, k) {\n if (!nums || nums.length === 0 || k <= 0) {\n return [];\n }\n \n const result = [];\n const deque = []; // 存储数组索引的双端队列\n \n for (let i = 0; i < nums.length; i++) {\n // 移除队列中超出窗口范围的元素\n while (deque.length > 0 && deque[0] <= i - k) {\n deque.shift();\n }\n \n // 维护单调递减队列:移除队尾所有小于当前元素的索引\n while (deque.length > 0 && nums[deque[deque.length - 1]] <= nums[i]) {\n deque.pop();\n }\n \n // 将当前元素索引加入队尾\n deque.push(i);\n \n // 当窗口大小达到k时,开始记录结果\n if (i >= k - 1) {\n result.push(nums[deque[0]]); // 队首是当前窗口最大值\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 每个元素最多进队列和出队列各一次\n- 空间复杂度 :O(k) - 队列最多存储k个元素","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178188012","body":"## 算法思路:\n- 使用度数统计法,将问题转化为图论中的入度和出度计算\n- 法官的特征:不信任任何人(出度=0)+ 被所有其他人信任(入度=n-1)\n- 通过计算每个人的\"信任度\"(入度-出度)来找到法官\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n // 特殊情况:只有一个人且没有信任关系,那么这个人就是法官\n if (n === 1 && trust.length === 0) {\n return 1;\n }\n \n // 初始化信任度数组,trustScore[i] = 入度 - 出度\n const trustScore = new Array(n + 1).fill(0);\n \n // 遍历所有信任关系\n for (const [a, b] of trust) {\n trustScore[a]--; // a信任别人,出度+1,所以信任度-1\n trustScore[b]++; // b被信任,入度+1,所以信任度+1\n }\n \n // 查找信任度为n-1的人(法官候选人)\n for (let i = 1; i <= n; i++) {\n if (trustScore[i] === n - 1) {\n return i;\n }\n }\n \n // 没有找到法官\n return -1;\n};\n```\n\n## 算法复杂度分析\n- 时间复杂度: O(E + n)\n- 遍历trust数组:O(E),其中E是信任关系数量\n- 查找法官:O(n)\n\n- 空间复杂度: O(n)\n- 需要额外的信任度数组存储每个人的统计信息","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182100538","body":"## 算法思路\n这是一个经典的二分图判断问题。核心思想是:\n\n- 将问题转化为图着色问题\n- 构建无向图,其中dislikes数组中的每一对表示图中的一条边\n- 使用DFS图着色算法判断是否能用两种颜色给所有节点着色\n- 如果相邻节点都能着不同颜色,则可以分成两组\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nvar possibleBipartition = function(n, dislikes) {\n // 构建邻接表表示图\n const graph = new Array(n + 1).fill(null).map(() => []);\n for (const [a, b] of dislikes) {\n graph[a].push(b);\n graph[b].push(a);\n }\n \n // 用于记录每个节点的颜色,0表示未着色,1和-1表示两种不同的颜色\n const colors = new Array(n + 1).fill(0);\n \n // DFS着色函数\n const dfs = (node, color) => {\n colors[node] = color;\n \n // 遍历所有邻接节点\n for (const neighbor of graph[node]) {\n if (colors[neighbor] === 0) {\n // 如果邻接节点未着色,给它着相反的颜色\n if (!dfs(neighbor, -color)) {\n return false;\n }\n } else if (colors[neighbor] === color) {\n // 如果邻接节点已经着色且颜色相同,说明不能构成二分图\n return false;\n }\n }\n return true;\n };\n \n // 遍历所有节点,处理可能存在的多个连通分量\n for (let i = 1; i <= n; i++) {\n if (colors[i] === 0) {\n if (!dfs(i, 1)) {\n return false;\n }\n }\n }\n \n return true;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(V + E),其中V是节点数量(n个人),E是边的数量(dislikes数组长度)\n- 空间复杂度 :O(V + E),主要用于邻接表存储、颜色数组和DFS递归栈","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186630947","body":"## 算法思路分析:\n这是一个双层拓扑排序问题\n- 首先需要对小组进行拓扑排序,确保依赖的小组在前面\n- 然后对每个小组内的项目进行拓扑排序\n- 最后按小组顺序合并结果\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n // 为没有小组的项目分配虚拟小组ID\n let groupId = m;\n for (let i = 0; i < n; i++) {\n if (group[i] === -1) {\n group[i] = groupId++;\n }\n }\n \n // 构建小组图和项目图\n const groupGraph = new Array(groupId).fill(0).map(() => []);\n const groupIndegree = new Array(groupId).fill(0);\n const itemGraph = new Array(n).fill(0).map(() => []);\n const itemIndegree = new Array(n).fill(0);\n \n // 构建依赖关系图\n const groupEdges = new Set(); // 用于去重小组间的边\n \n for (let i = 0; i < n; i++) {\n for (const beforeItem of beforeItems[i]) {\n const beforeGroup = group[beforeItem];\n const currentGroup = group[i];\n \n // 项目依赖关系\n itemGraph[beforeItem].push(i);\n itemIndegree[i]++;\n \n // 小组依赖关系(只有当项目属于不同小组时)\n if (beforeGroup !== currentGroup) {\n const edgeKey = `${beforeGroup}->${currentGroup}`;\n if (!groupEdges.has(edgeKey)) {\n groupEdges.add(edgeKey);\n groupGraph[beforeGroup].push(currentGroup);\n groupIndegree[currentGroup]++;\n }\n }\n }\n }\n \n // 拓扑排序函数\n function topologicalSort(graph, indegree) {\n const queue = [];\n const result = [];\n \n // 找到所有入度为0的节点\n for (let i = 0; i < indegree.length; i++) {\n if (indegree[i] === 0) {\n queue.push(i);\n }\n }\n \n while (queue.length > 0) {\n const node = queue.shift();\n result.push(node);\n \n // 更新相邻节点的入度\n for (const neighbor of graph[node]) {\n indegree[neighbor]--;\n if (indegree[neighbor] === 0) {\n queue.push(neighbor);\n }\n }\n }\n \n return result.length === graph.length ? result : [];\n }\n \n // 对小组进行拓扑排序\n const sortedGroups = topologicalSort(groupGraph, [...groupIndegree]);\n if (sortedGroups.length === 0) {\n return []; // 小组间存在循环依赖\n }\n \n // 对项目进行拓扑排序\n const sortedItems = topologicalSort(itemGraph, [...itemIndegree]);\n if (sortedItems.length === 0) {\n return []; // 项目间存在循环依赖\n }\n \n // 按小组分类项目\n const groupToItems = new Map();\n for (const item of sortedItems) {\n const itemGroup = group[item];\n if (!groupToItems.has(itemGroup)) {\n groupToItems.set(itemGroup, []);\n }\n groupToItems.get(itemGroup).push(item);\n }\n \n // 按小组顺序合并结果\n const result = [];\n for (const groupId of sortedGroups) {\n if (groupToItems.has(groupId)) {\n result.push(...groupToItems.get(groupId));\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n时间复杂度:O(n + E)\n- 构建图:O(E),E为所有依赖关系总数\n- 小组拓扑排序:O(V_g + E_g)\n- 项目拓扑排序:O(V_i + E_i)\n- 结果合并:O(n)\n\n空间复杂度:O(n + E + m)\n- 图存储:O(n + E)\n- 入度数组:O(n + m)\n- 辅助数据结构:O(n + m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3191484423","body":"## 算法思路\n机器人要回到原点(0,0),必须满足两个条件:\n- 向左移动的次数 = 向右移动的次数\n- 向上移动的次数 = 向下移动的次数\n\n## 代码\n```javascript\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let x = 0, y = 0; // 当前坐标\n \n for (let move of moves) {\n switch (move) {\n case 'L':\n x--;\n break;\n case 'R':\n x++;\n break;\n case 'U':\n y++;\n break;\n case 'D':\n y--;\n break;\n }\n }\n \n return x === 0 && y === 0;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n),其中n是moves字符串的长度,需要遍历一次字符串\n- 空间复杂度 :O(1),只使用了常数个额外变量,不随输入规模变化","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3194108225","body":"## 算法思路\n- 预处理 :为每个任务添加原始索引,按进入时间排序\n- 模拟执行 :使用最小堆维护可执行任务队列,按执行时间最短优先、索引最小优先的规则选择任务\n- 时间管理 :CPU空闲时直接跳转到下一个任务的进入时间,避免无效等待\n\n## 代码\n```javascript\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n const n = tasks.length;\n \n // 为每个任务添加原始索引,然后按进入时间排序\n const taskWithIndex = tasks.map((task, index) => [task[0], task[1], index]);\n taskWithIndex.sort((a, b) => a[0] - b[0]); // 按enqueueTime排序\n \n const result = [];\n // 优先队列:按执行时间升序,相同时按索引升序\n const availableTasks = new MinHeap((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按processingTime升序\n }\n return a[1] - b[1]; // 按originalIndex升序\n });\n \n let currentTime = 0;\n let taskIndex = 0; // 指向下一个要加入队列的任务\n \n while (result.length < n) {\n // 将所有在当前时间或之前进入队列的任务加入可执行队列\n while (taskIndex < n && taskWithIndex[taskIndex][0] <= currentTime) {\n const [enqueueTime, processingTime, originalIndex] = taskWithIndex[taskIndex];\n availableTasks.push([processingTime, originalIndex]);\n taskIndex++;\n }\n \n if (availableTasks.size() === 0) {\n // CPU空闲,直接跳到下一个任务的进入时间\n if (taskIndex < n) {\n currentTime = taskWithIndex[taskIndex][0];\n }\n } else {\n // 从可执行任务中选择执行时间最短的(相同时选择索引最小的)\n const [processingTime, originalIndex] = availableTasks.pop();\n result.push(originalIndex);\n currentTime += processingTime;\n }\n }\n \n return result;\n};\n\n// 最小堆实现\nclass MinHeap {\n constructor(compareFn) {\n this.heap = [];\n this.compare = compareFn || ((a, b) => a - b);\n }\n \n push(val) {\n this.heap.push(val);\n this.bubbleUp(this.heap.length - 1);\n }\n \n pop() {\n if (this.heap.length === 0) return undefined;\n if (this.heap.length === 1) return this.heap.pop();\n \n const top = this.heap[0];\n this.heap[0] = this.heap.pop();\n this.bubbleDown(0);\n return top;\n }\n \n size() {\n return this.heap.length;\n }\n \n bubbleUp(index) {\n while (index > 0) {\n const parentIndex = Math.floor((index - 1) / 2);\n if (this.compare(this.heap[index], this.heap[parentIndex]) >= 0) break;\n \n [this.heap[index], this.heap[parentIndex]] = [this.heap[parentIndex], this.heap[index]];\n index = parentIndex;\n }\n }\n \n bubbleDown(index) {\n while (true) {\n let minIndex = index;\n const leftChild = 2 * index + 1;\n const rightChild = 2 * index + 2;\n \n if (leftChild < this.heap.length && \n this.compare(this.heap[leftChild], this.heap[minIndex]) < 0) {\n minIndex = leftChild;\n }\n \n if (rightChild < this.heap.length && \n this.compare(this.heap[rightChild], this.heap[minIndex]) < 0) {\n minIndex = rightChild;\n }\n \n if (minIndex === index) break;\n \n [this.heap[index], this.heap[minIndex]] = [this.heap[minIndex], this.heap[index]];\n index = minIndex;\n }\n }\n}\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n log n)\n - 排序:O(n log n)\n - 堆操作:每个任务最多进出堆一次,总计O(n log n)\n- 空间复杂度 :O(n)\n - 存储任务信息、最小堆和结果数组","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194111949","body":"## 算法核心思路\n- 1.时间转换 :将 \"HH:MM\" 格式转换为分钟数便于计算\n- 2.对局编号计算 :\n - 开始时间: Math.ceil(minutes / 15) 确保只计算完整参与的对局\n - 结束时间: Math.floor(minutes / 15) 确保只计算完整参与的对局\n- 3.分情况处理 :\n - 同一天:结束时间对局编号 - 开始时间对局编号\n - 跨夜:(96 - 开始时间对局编号) + 结束时间对局编号\n\n## 代码\n```javascript\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n // 将时间字符串转换为分钟数\n function timeToMinutes(time) {\n const [hours, minutes] = time.split(':').map(Number);\n return hours * 60 + minutes;\n }\n \n const startMinutes = timeToMinutes(loginTime);\n const endMinutes = timeToMinutes(logoutTime);\n \n // 如果结束时间早于开始时间,说明跨越了午夜\n if (endMinutes < startMinutes) {\n // 跨夜情况:从开始时间到午夜 + 从午夜到结束时间\n // 计算从开始时间到午夜能完成的对局数\n const roundsBeforeMidnight = 96 - Math.ceil(startMinutes / 15);\n // 计算从午夜到结束时间能完成的对局数\n const roundsAfterMidnight = Math.floor(endMinutes / 15);\n return roundsBeforeMidnight + roundsAfterMidnight;\n } else {\n // 同一天情况\n // 能完成的对局数 = 结束时间所在的对局编号 - 开始时间所在的对局编号\n const result = Math.floor(endMinutes / 15) - Math.ceil(startMinutes / 15);\n return Math.max(0, result); // 确保不返回负数\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(1) - 所有操作都是常数时间的数学计算\n- 空间复杂度 :O(1) - 只使用固定数量的变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3197064559","body":"## 算法思路\n- 1.统计字符频率\n- 2.条件三:变成同一个字母\n- 3.条件一 & 条件二:字母严格大小比较\n- 4.综合最优解\n\n## 代码\n```javascript\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n let n = a.length, m = b.length;\n\n let freqA = new Array(26).fill(0);\n let freqB = new Array(26).fill(0);\n\n for (let ch of a) freqA[ch.charCodeAt(0) - 97]++;\n for (let ch of b) freqB[ch.charCodeAt(0) - 97]++;\n\n // 前缀和\n let prefixA = new Array(27).fill(0);\n let prefixB = new Array(27).fill(0);\n for (let i = 0; i < 26; i++) {\n prefixA[i+1] = prefixA[i] + freqA[i];\n prefixB[i+1] = prefixB[i] + freqB[i];\n }\n\n // 条件三:相同字母\n let ops3 = Infinity;\n for (let i = 0; i < 26; i++) {\n ops3 = Math.min(ops3, n + m - (freqA[i] + freqB[i]));\n }\n\n // 条件一 & 二\n let ops1 = Infinity, ops2 = Infinity;\n for (let c = 0; c < 25; c++) { // 0~24,分割点\n // a < b\n ops1 = Math.min(ops1, (n - prefixA[c+1]) + prefixB[c+1]);\n // b < a\n ops2 = Math.min(ops2, (m - prefixB[c+1]) + prefixA[c+1]);\n }\n\n return Math.min(ops1, ops2, ops3);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n + m)\n- 空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199072283","body":"## 算法思路\n- 1.将数组构建为一个 最大堆(heapify)\n 最大堆性质:父节点值 ≥ 子节点值。\n- 2.交换堆顶(最大值)和堆尾元素,把最大值放到最终位置。\n- 3.缩小堆的范围(长度减 1),重新 heapify。\n- 4.重复步骤 2–3,直到整个数组有序。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function(nums) {\n let n = nums.length;\n\n // 建堆(从最后一个非叶子节点开始向下调整)\n for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {\n heapify(nums, n, i);\n }\n\n // 不断取出堆顶(最大值)放到数组末尾\n for (let i = n - 1; i > 0; i--) {\n // 交换堆顶和堆尾\n [nums[0], nums[i]] = [nums[i], nums[0]];\n // 调整剩余部分\n heapify(nums, i, 0);\n }\n\n return nums;\n};\n\n// 调整为最大堆\nfunction heapify(arr, heapSize, root) {\n let largest = root;\n let left = 2 * root + 1;\n let right = 2 * root + 2;\n\n if (left < heapSize && arr[left] > arr[largest]) {\n largest = left;\n }\n\n if (right < heapSize && arr[right] > arr[largest]) {\n largest = right;\n }\n\n if (largest !== root) {\n [arr[root], arr[largest]] = [arr[largest], arr[root]];\n heapify(arr, heapSize, largest);\n }\n}\n```\n\n## 复杂度分析\n- 时间复杂度\n建堆:O(n)\n每次取出最大值并 heapify:O(log n),共 n 次\n总计:O(n log n)\n- 空间复杂度\n堆排序在原数组上操作,只需要 O(1) 额外空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204787436","body":"## 算法思路:\n- 平方根一定在 1 ~ x/2 之间(除了 0 和 1 特殊处理)。\n- 用二分查找,比较 mid * mid 与 x。\n- 如果等于就直接返回。\n- 如果小于,就把 mid 作为候选答案,继续往右找。\n- 如果大于,就往左缩。\n\n## 代码\n```javascript\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n if (x < 2) return x; // 0 -> 0, 1 -> 1\n\n let left = 1, right = Math.floor(x / 2), ans = 0;\n while (left <= right) {\n let mid = Math.floor((left + right) / 2);\n let square = mid * mid;\n\n if (square === x) {\n return mid;\n } else if (square < x) {\n ans = mid; // mid 可能是答案\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 O(log n)\n- 空间复杂度 O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3209498631","body":"## 算法思路\n- 设定搜索区间 [1, n]。\n- 取中点 mid = Math.floor((left + right) / 2)。\n- 调用 isBadVersion(mid):\n- 如果是坏的(true),说明答案在 左边或就是 mid,更新 right = mid。\n- 如果不是坏的(false),说明答案在 右边,更新 left = mid + 1。\n- 循环直到 left == right,此时 left 就是第一个坏版本。\n\n## 代码\n```javascript\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let left = 1, right = n;\n while (left < right) {\n let mid = Math.floor((left + right) / 2);\n if (isBadVersion(mid)) {\n // mid 可能是第一个坏版本,所以不能跳过它\n right = mid;\n } else {\n // mid 不是坏的,第一个坏版本在右边\n left = mid + 1;\n }\n }\n return left; // 或者 right,二者相等\n };\n};\n```\n\n## 复杂度分析\n- 时间复杂度:每次二分区间缩小一半,最多调用 isBadVersion O(log n) 次。\n- 空间复杂度:我们只用到了几个变量,额外空间复杂度是 O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3214357168","body":"## 算法思路\n- 1.分治思想(归并排序)\n- 把数组分为两半,分别统计左半部分和右半部分的翻转对数量。\n- 在合并的时候,再统计「跨左右两部分」的翻转对数量。\n- 2.跨区间统计方法\n- 假设左半部分是 left[],右半部分是 right[],它们都是有序的。\n- 对于每个 left[i],我们需要统计右边有多少个 right[j] 满足left[i]>2×right[j]\n- 因为 right[] 已经排序,可以用一个指针 双指针扫描,避免嵌套循环。\n- 3.合并排序\n- 统计完跨区间的翻转对数量后,把两个有序数组合并,递归回溯。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n if (!nums || nums.length === 0) return 0;\n\n const mergeSort = (arr, left, right) => {\n if (left >= right) return 0;\n\n let mid = Math.floor((left + right) / 2);\n let count = mergeSort(arr, left, mid) + mergeSort(arr, mid + 1, right);\n\n // 统计跨区间翻转对\n let j = mid + 1;\n for (let i = left; i <= mid; i++) {\n while (j <= right && arr[i] > 2 * arr[j]) {\n j++;\n }\n count += (j - (mid + 1));\n }\n\n // 合并两个有序数组\n let temp = [];\n let p1 = left, p2 = mid + 1;\n while (p1 <= mid && p2 <= right) {\n if (arr[p1] <= arr[p2]) {\n temp.push(arr[p1++]);\n } else {\n temp.push(arr[p2++]);\n }\n }\n while (p1 <= mid) temp.push(arr[p1++]);\n while (p2 <= right) temp.push(arr[p2++]);\n\n for (let i = 0; i < temp.length; i++) {\n arr[left + i] = temp[i];\n }\n\n return count;\n };\n\n return mergeSort(nums, 0, nums.length - 1);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(nlogn)\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3218651000","body":"## 算法思路\n\n- 排序\n- 对 houses 和 heaters 进行排序,方便二分查找。\n- 二分查找\n- 对于每个房屋 h,在 heaters 中二分查找,找到最接近 h 的供暖器位置。\n- 计算 |h - heater_left| 和 |h - heater_right| 的最小值。\n- 得到该房屋的最小供暖距离。\n- 取最大值\n- 遍历所有房屋,取最小距离的最大值。\n\n## 代码\n```javascript\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n houses.sort((a, b) => a - b);\n heaters.sort((a, b) => a - b);\n\n let radius = 0;\n\n for (let house of houses) {\n // 二分查找\n let left = 0, right = heaters.length - 1;\n while (left <= right) {\n let mid = Math.floor((left + right) / 2);\n if (heaters[mid] < house) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n // left 是第一个 >= house 的位置\n let dist1 = (left < heaters.length) ? Math.abs(heaters[left] - house) : Infinity;\n let dist2 = (right >= 0) ? Math.abs(heaters[right] - house) : Infinity;\n\n let nearest = Math.min(dist1, dist2);\n radius = Math.max(radius, nearest);\n }\n\n return radius;\n};\n```\n\n## 复杂度分析\n- 排序\n- houses 排序:O(n log n)\n- heaters 排序:O(m log m)\n- 二分查找\n- 每个房屋做一次二分:O(log m)\n- 共 n 个房屋:O(n log m)\n- 总时间复杂度:O(nlogn+mlogm+nlogm)\n- 空间复杂度:O(1)(除了排序外,常数额外空间)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3218659174","body":"## 排序数组\n- 先对 nums 排序。这样数对距离 = 两个数的差,可以利用单调性。\n- 二分查找答案\n- 距离范围:最小值 0,最大值 max(nums) - min(nums)。\n- 设二分中间值为 mid,问题转化为:\n- 数组中有多少对数对距离 ≤ mid。\n- 双指针统计 ≤ mid 的数对数量\n- 排序后数组 nums 单调递增。\n- 用两个指针 i、j:\n- 固定右端点 j,向左找满足 nums[j] - nums[i] <= mid 的最小 i。\n- 那么从 i 到 j-1 的所有元素都和 j 构成合法数对,总数是 j - i。\n- 整个过程是 O(n)。\n- 二分逻辑\n- 如果 ≤ mid 的数对数目 ≥ k,说明答案可能更小,右边界收缩。\n- 否则说明距离太小,左边界右移。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a, b) => a - b);\n\n // 统计差值 <= mid 的数对个数\n function countPairs(mid) {\n let count = 0;\n let i = 0;\n for (let j = 0; j < nums.length; j++) {\n while (nums[j] - nums[i] > mid) {\n i++;\n }\n count += j - i;\n }\n return count;\n }\n\n let left = 0, right = nums[nums.length - 1] - nums[0];\n while (left < right) {\n let mid = Math.floor((left + right) / 2);\n if (countPairs(mid) >= k) {\n right = mid; // 答案可能是 mid 或更小\n } else {\n left = mid + 1;\n }\n }\n return left;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 排序:O(n log n)\n- 二分查找:查找范围是 max(nums) - min(nums),最大 1e6,二分次数约 log(1e6) ≈ 20。\n- 每次 countPairs:O(n)(双指针扫描一遍)。\n- 总复杂度:O(n log n + n log W),其中 W = max(nums) - min(nums)。对 n = 1e4,完全可行。\n- 空间复杂度\n- 只用了常数级变量,O(1)(不算排序)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218668542","body":"## 算法思路\n- 二分 + BFS/DFS\n- 时间范围是 [max(grid[0][0], grid[n-1][n-1]), n^2-1]。\n- 二分水位 mid,检查是否能在 mid 水位下从 (0,0) 到 (n-1,n-1)。\n- 如果可以,则收缩右边界,否则收缩左边界。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n const n = grid.length;\n const directions = [[1,0],[-1,0],[0,1],[0,-1]];\n \n // 检查是否能在水位 t 下到达终点\n function canReach(t) {\n if (grid[0][0] > t) return false;\n const visited = Array.from({length: n}, () => Array(n).fill(false));\n const queue = [[0,0]];\n visited[0][0] = true;\n\n while (queue.length > 0) {\n const [x, y] = queue.shift();\n if (x === n-1 && y === n-1) return true;\n for (const [dx, dy] of directions) {\n const nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n &&\n !visited[nx][ny] && grid[nx][ny] <= t) {\n visited[nx][ny] = true;\n queue.push([nx, ny]);\n }\n }\n }\n return false;\n }\n\n // 二分查找最小可行水位\n let low = Math.max(grid[0][0], grid[n-1][n-1]);\n let high = n * n - 1;\n let ans = high;\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (canReach(mid)) {\n ans = mid;\n high = mid - 1; // 尝试更小的水位\n } else {\n low = mid + 1;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- BFS 最多访问 n^2 个格子,复杂度 O(n^2)。\n- 二分查找 范围大小约为 n^2,二分次数 O(log(n^2)) = O(log n)。\n- 总时间复杂度:O(n^2 log n)。\n- 空间复杂度:需要 visited 数组 O(n^2)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3226685252","body":"## 核心思路\n- 滑动窗口(Sliding Window)\n- 定义元音集合\n- vowels = new Set(['a','e','i','o','u'])\n- 初始化窗口\n- 先统计前 k 个字符里元音的数量 count。\n- 这就是第一个窗口的元音数。\n- 滑动窗口\n- 从 i = k 开始,窗口向右滑动:\n- 移除窗口最左边的字符(如果它是元音则 count--)。\n- 加入窗口最右边的字符(如果它是元音则 count++)。\n- 每次更新最大值 maxCount = Math.max(maxCount, count)。\n- 提前终止\n- 如果 maxCount === k,说明某个窗口里全是元音,直接返回结果(不可能更大了)。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n const vowels = new Set(['a', 'e', 'i', 'o', 'u']);\n let count = 0, maxCount = 0;\n\n // 初始化前 k 个字符\n for (let i = 0; i < k; i++) {\n if (vowels.has(s[i])) count++;\n }\n maxCount = count;\n\n // 滑动窗口\n for (let i = k; i < s.length; i++) {\n if (vowels.has(s[i - k])) count--; // 移除最左边\n if (vowels.has(s[i])) count++; // 加入最右边\n maxCount = Math.max(maxCount, count);\n if (maxCount === k) return k; // 提前终止\n }\n\n return maxCount;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 初始化前 k 个字符统计需要 O(k)。\n- 然后遍历整个字符串一次 O(n)。\n- 总体复杂度:O(n)。\n- 空间复杂度:\n- 仅使用一个集合 Set 存元音,空间 O(1)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3226702074","body":"## 思路分析\n- 边界情况\n- 如果 k == 0:Alice 一开始就停,不抽牌,分数是 0。如果 0 <= n,返回 1;否则返回 0。\n- 如果 n >= k - 1 + maxPts:Alice 不可能超过 n,因为最大分数就是 k-1 + maxPts。此时概率是 1。\n- 动态规划建模\n- 定义 dp[i] = 从分数 i 出发,Alice 最终分数不超过 n 的概率。\n- 最终答案是 dp[0]。\n- 如果 i >= k:表示 Alice 已经停了。\n- 如果 i <= n:返回 1(安全)。\n- 否则返回 0(爆掉)。\n- 如果 i < k:Alice 会继续抽。\n- 优化:滑动窗口\n- 用一个变量 windowSum 维护滑动和,就能做到 O(n)。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n // 速返:一开始就停;或最高可能分也不超过 n\n if (k === 0 || n >= k - 1 + maxPts) return 1.0;\n\n const dp = new Array(n + 1).fill(0.0);\n // 终止区间:达到/超过 k 后立即停;在 [k, n] 内都是成功状态\n for (let i = k; i <= n; i++) dp[i] = 1.0;\n\n // 初始窗口和:dp[k]..dp[k+maxPts-1],这些里面只有 <= n 的是 1\n let windowSum = Math.min(n - k + 1, maxPts);\n\n // 从后往前做滑动平均\n for (let i = k - 1; i >= 0; i--) {\n dp[i] = windowSum / maxPts;\n // 更新窗口:加上新放入的 dp[i],减去滑出窗口的 dp[i + maxPts](越界视为 0)\n windowSum += dp[i] - (i + maxPts <= n ? dp[i + maxPts] : 0);\n // 也可写成:windowSum += dp[i] - (dp[i + maxPts] ?? 0);\n }\n return dp[0];\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 只遍历了一次数组,每个状态 O(1) 计算。\n- 时间复杂度:O(n)\n- 空间复杂度\n- 需要一个 dp 数组大小为 O(n)。\n- 也可以优化成 O(maxPts)(因为只依赖一个窗口)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3231363055","body":"## 算法思路\n- 核心观察\n- 一个字符串的异位词就是 字符相同但顺序不同 的字符串。\n- 如果子串和 p 的 字符频率统计完全相同,那么它就是一个异位词。\n- 滑动窗口\n- 用两个数组(或哈希表)存放字符频率:\n- pCount 记录 p 中各字符出现次数。\n- sCount 记录当前窗口(长度等于 p.length)的各字符出现次数。\n- 每次窗口滑动:\n- 移入一个字符,更新 sCount。\n- 移出一个字符,更新 sCount。\n- 如果 sCount 和 pCount 相等,则记录当前窗口起始位置。\n- 优化比较\n- 不需要每次都完整比较两个数组(O(26))。\n- 但因为字符集仅 26 个,比较成本很小,可以直接比较数组,整体复杂度依旧可接受。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nvar findAnagrams = function(s, p) {\n let res = [];\n let m = p.length, n = s.length;\n if (n < m) return res;\n\n // 频次数组,26个小写字母\n let pCount = new Array(26).fill(0);\n let sCount = new Array(26).fill(0);\n\n // 统计 p 的频率\n for (let ch of p) {\n pCount[ch.charCodeAt(0) - 97]++;\n }\n\n // 初始化第一个窗口\n for (let i = 0; i < m; i++) {\n sCount[s.charCodeAt(i) - 97]++;\n }\n\n // 比较初始窗口\n if (sCount.join() === pCount.join()) res.push(0);\n\n // 滑动窗口\n for (let i = m; i < n; i++) {\n sCount[s.charCodeAt(i) - 97]++; // 加入右边字符\n sCount[s.charCodeAt(i - m) - 97]--; // 移出左边字符\n\n if (sCount.join() === pCount.join()) {\n res.push(i - m + 1);\n }\n }\n\n return res;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 初始化统计频率:O(m)\n- 滑动窗口遍历 s:O(n)\n- 每次比较频率数组:O(26) = O(1)\n- 总复杂度:O(n + m)\n- 空间复杂度\n- 两个长度为 26 的数组:O(26) ≈ O(1)\n- 结果数组存储下标,最坏情况 O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3236034367","body":"## 算法思路\n- 核心思想:滑动窗口\n- 我们在字符串 s 上维护一个动态窗口 [left, right)。\n- 用 need 记录字符串 t 中每个字符需要的次数。\n- 用 window 记录当前窗口中每个字符出现的次数。\n- 不断扩展 right 指针,直到窗口内满足 t 的要求。\n- 然后收缩 left,尽量缩小窗口,直到不满足要求为止。\n- 在满足要求的情况下,更新最小子串。\n- 满足条件的判断\n- 我们可以维护一个 valid 变量,表示窗口中满足 need 的字符种类数。\n- 当 valid === need.size 时,说明窗口包含了所有需要的字符。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nvar minWindow = function(s, t) {\n let need = new Map();\n let window = new Map();\n\n for (let c of t) {\n need.set(c, (need.get(c) || 0) + 1);\n }\n\n let left = 0, right = 0;\n let valid = 0;\n let start = 0, len = Infinity;\n\n while (right < s.length) {\n let c = s[right];\n right++;\n if (need.has(c)) {\n window.set(c, (window.get(c) || 0) + 1);\n if (window.get(c) === need.get(c)) {\n valid++;\n }\n }\n\n // 收缩左边界\n while (valid === need.size) {\n if (right - left < len) {\n start = left;\n len = right - left;\n }\n let d = s[left];\n left++;\n if (need.has(d)) {\n if (window.get(d) === need.get(d)) {\n valid--;\n }\n window.set(d, window.get(d) - 1);\n }\n }\n }\n\n return len === Infinity ? \"\" : s.substr(start, len);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 每个字符最多被左右指针访问一次,所以是 O(m + n),其中 m = s.length, n = t.length。\n- 空间复杂度:\n- 哈希表 need 和 window 至多包含全部字符,大小为 O(Σ),Σ 是字符集大小(对英文就是 O(26) 或 O(52) 或 O(128))。\n- 所以空间复杂度 O(Σ)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/50#issuecomment-3247555036","body":"## 算法思路\n- 一共要拿 k 张牌,可以从数组两端取。\n- 等价于:我们留下 n - k 张牌(连续子数组),这些是不能拿的。\n- 因此,最大得分 = 总和 - 最小的长度为 (n - k) 的子数组的和。\n- 先计算数组总和 total。\n- 如果 k == n,那就直接返回 total。\n- 否则,使用滑动窗口大小为 (n - k),找到 最小窗口和。\n- 答案就是 total - min_window_sum。\n\n## 代码\n```javascript\n/**\n * @param {number[]} cardPoints\n * @param {number} k\n * @return {number}\n */\nvar maxScore = function(cardPoints, k) {\n const n = cardPoints.length;\n const total = cardPoints.reduce((a, b) => a + b, 0);\n \n // 特殊情况:拿所有卡牌\n if (k === n) return total;\n \n const windowSize = n - k;\n // 初始化窗口和\n let windowSum = 0;\n for (let i = 0; i < windowSize; i++) {\n windowSum += cardPoints[i];\n }\n let minWindowSum = windowSum;\n \n // 滑动窗口\n for (let i = windowSize; i < n; i++) {\n windowSum += cardPoints[i] - cardPoints[i - windowSize];\n minWindowSum = Math.min(minWindowSum, windowSum);\n }\n \n return total - minWindowSum;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 计算总和 O(n)\n- 滑动窗口遍历一次数组 O(n)\n- 总复杂度 O(n)\n- 空间复杂度:\n- 只用常数级变量存储 O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3247564267","body":"## 算法思路\n- 枚举所有可能的小时和分钟\n- 小时范围:0–11\n- 分钟范围:0–59\n- 总共 12 × 60 = 720 种组合。\n- 统计二进制表示中 1 的个数\n- bitCount(h) + bitCount(m) == turnedOn 才是合法解。\n- 其中 bitCount(x) 表示数字 x 的二进制中 1 的数量。\n- 格式化输出\n- 小时 h 直接转成字符串(不能有前导零)。\n- 分钟 m 必须是两位数,若小于 10 需在前面补 0。\n\n## 代码\n```javascript\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n const res = [];\n // 遍历所有可能的时间\n for (let h = 0; h < 12; h++) {\n for (let m = 0; m < 60; m++) {\n // 检查是否满足亮灯数量\n if (bitCount(h) + bitCount(m) === turnedOn) {\n // 格式化分钟(必须两位数)\n const time = `${h}:${m.toString().padStart(2, '0')}`;\n res.push(time);\n }\n }\n }\n return res;\n};\n\n// 计算二进制数中 1 的个数\nfunction bitCount(num) {\n let count = 0;\n while (num > 0) {\n count += num & 1;\n num >>= 1;\n }\n return count;\n}\n```\n\n## 复杂度分析\n- 外层遍历所有 12 × 60 = 720 种时间组合 → O(720) ≈ O(1) (常数级,最多 720 次)。\n- 每次计算 bitCount(h) 和 bitCount(m),\n- h < 12(最多 4 bit),m < 60(最多 6 bit),所以计算一次 bitCount 的复杂度 ≤ 10。\n- 总复杂度依然是常数级。\n- 时间复杂度:O(1) (严格来说是 O(720×10),但近似常数)\n- 空间复杂度:O(1) (除返回结果外仅使用常量存储)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3247575227","body":"## 算法思路(回溯法)\n- 逐行放置:从第 0 行开始,尝试在每一列放置皇后。\n- 约束检查:放置前,检查当前列和对角线是否已有皇后。\n- 列冲突:用一个集合 cols 记录已占用的列。\n- 主对角线冲突:行号 - 列号 相同的点在同一主对角线上,用 diag1 集合。\n- 副对角线冲突:行号 + 列号 相同的点在同一副对角线上,用 diag2 集合。\n- 递归搜索:如果当前行放置成功,递归尝试下一行。\n- 回溯:如果无法继续,撤销放置,尝试下一个位置。\n- 统计解法数:当所有行都成功放置皇后时,计数 +1。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n const cols = new Set(); // 记录已占用的列\n const diag1 = new Set(); // 记录主对角线 (row - col)\n const diag2 = new Set(); // 记录副对角线 (row + col)\n\n function backtrack(row) {\n if (row === n) { \n count++;\n return;\n }\n for (let col = 0; col < n; col++) {\n if (cols.has(col) || diag1.has(row - col) || diag2.has(row + col)) {\n continue; // 冲突,不能放\n }\n // 选择\n cols.add(col);\n diag1.add(row - col);\n diag2.add(row + col);\n\n backtrack(row + 1);\n\n // 回溯\n cols.delete(col);\n diag1.delete(row - col);\n diag2.delete(row + col);\n }\n }\n\n backtrack(0);\n return count;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 每行必须放置一个皇后,因此每一行尝试 n 种列的可能性。\n- 在冲突检测 O(1) 的情况下,最坏情况回溯树的大小接近 O(n!)。\n- 实际上,由于剪枝(冲突检测),复杂度会远小于 n!,但仍然是 指数级。\n- 时间复杂度:O(n!) (上界)。\n- 空间复杂度:\n- cols、diag1、diag2 最多各存储 n 个元素。\n- 递归栈深度最大为 n。\n- 空间复杂度:O(n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3247583590","body":"## 算法思路\n- 遍历整个网格,当遇到值为 1 的格子时,说明找到了新的岛屿。\n- 使用 DFS(深度优先搜索)或 BFS(广度优先搜索)来扩展整个岛屿,计算其面积,并更新最大值。\n- 为避免重复计算,我们要将访问过的格子标记为 0(淹没)或使用 visited 数组。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n let m = grid.length, n = grid[0].length;\n let maxArea = 0;\n\n function dfs(i, j) {\n // 边界条件\n if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] === 0) {\n return 0;\n }\n // 标记访问过\n grid[i][j] = 0;\n let area = 1;\n // 四个方向\n area += dfs(i + 1, j);\n area += dfs(i - 1, j);\n area += dfs(i, j + 1);\n area += dfs(i, j - 1);\n return area;\n }\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n maxArea = Math.max(maxArea, dfs(i, j));\n }\n }\n }\n\n return maxArea;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 遍历整个矩阵,每个元素最多被访问一次(因为访问后会被置为 0)。\n- 每个格子在 DFS 中的递归调用也是 O(1)(最多 4 次相邻扩展)。\n- 总时间复杂度: O(m * n)\n- 空间复杂度:\n- 递归栈的深度,最坏情况是整个矩阵都是 1,即 O(m * n)。\n- 如果用 BFS + 队列,也需要 O(m * n) 的空间。\n- 空间复杂度: O(m * n)(递归栈 / 队列空间)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247593268","body":"## 算法思路\n- 使用多源 BFS(广度优先搜索)来解决。\n- 找到所有陆地格子,放入队列(多源 BFS 起点)。\n- 从陆地开始向外扩展,遇到海洋格子时更新它的距离。\n- 记录 BFS 扩展到的最大层数,即最大距离。\n- 最后如果没有海洋或没有陆地,返回 -1。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxDistance = function(grid) {\n const n = grid.length;\n const directions = [[1,0],[-1,0],[0,1],[0,-1]];\n const queue = [];\n\n // 1. 把所有陆地加入队列\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n queue.push([i, j]);\n }\n }\n }\n\n // 如果全是海洋或者全是陆地\n if (queue.length === 0 || queue.length === n * n) return -1;\n\n let distance = -1;\n\n // 2. 多源 BFS\n while (queue.length > 0) {\n let size = queue.length;\n distance++; // 每一层扩展一次\n for (let s = 0; s < size; s++) {\n const [x, y] = queue.shift();\n for (let [dx, dy] of directions) {\n const nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] === 0) {\n grid[nx][ny] = 1; // 标记为已访问(变为陆地)\n queue.push([nx, ny]);\n }\n }\n }\n }\n\n return distance;\n};\n```\n\n## 复杂度分析\n- BFS 遍历整个网格,每个格子最多入队一次。\n- 时间复杂度:O(n^2)\n- 空间复杂度(队列 + 访问标记):O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3270177258","body":"## 思路\n- 一开始手上有一些 初始盒子,目标是最大化能获得的糖果数。关键点是:\n- 盒子可能是 开着的(status[i] = 1)或者 关着的(status[i] = 0)。\n- 你只有在盒子开着时,才能取走里面的糖果。\n- 打开盒子后,你可能获得 钥匙,可以解锁更多盒子。\n- 打开盒子后,你可能获得 更多盒子,这些盒子可能要等钥匙解锁才能用。\n- 所以整个过程就是一个 BFS / 队列模拟,类似 “不断解锁和探索”的过程。\n\n## 代码\n```javascript\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n let n = status.length;\n let res = 0;\n\n let haveKey = new Set();\n let haveBox = new Set(initialBoxes);\n let visited = new Array(n).fill(false);\n\n let queue = [...initialBoxes];\n\n while (queue.length > 0) {\n let box = queue.shift();\n if (visited[box]) continue;\n\n // 如果箱子是锁着的且没钥匙 -> 跳过\n if (status[box] === 0 && !haveKey.has(box)) continue;\n\n // 打开箱子\n visited[box] = true;\n res += candies[box];\n\n // 获得钥匙\n for (let k of keys[box]) {\n if (!haveKey.has(k)) {\n haveKey.add(k);\n // 如果之前已经有这个盒子但是打不开,现在可以打开了\n if (haveBox.has(k) && !visited[k]) {\n queue.push(k);\n }\n }\n }\n\n // 获得新的盒子\n for (let b of containedBoxes[box]) {\n if (!haveBox.has(b)) haveBox.add(b);\n if ((status[b] === 1 || haveKey.has(b)) && !visited[b]) {\n queue.push(b);\n }\n }\n }\n\n return res;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 每个盒子最多被处理一次,O(n)。\n- 钥匙和 containedBoxes 总长度之和最多 O(n)。\n- 所以总 时间复杂度 = O(n)。\n- 空间复杂度分析\n- visited / haveKey / haveBox 都是 O(n)。\n- 队列最多 O(n)。\n- 所以 空间复杂度 = O(n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3270189042","body":"/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n if (!root) return [];\n \n // 存储节点信息:[row, col, val]\n const nodes = [];\n \n // DFS遍历,记录每个节点的坐标和值\n function dfs(node, row, col) {\n if (!node) return;\n \n nodes.push([row, col, node.val]);\n \n // 左子节点:row+1, col-1\n dfs(node.left, row + 1, col - 1);\n // 右子节点:row+1, col+1\n dfs(node.right, row + 1, col + 1);\n }\n \n // 从根节点开始遍历,根节点坐标为(0, 0)\n dfs(root, 0, 0);\n \n // 按列索引分组\n const columnMap = new Map();\n for (const [row, col, val] of nodes) {\n if (!columnMap.has(col)) {\n columnMap.set(col, []);\n }\n columnMap.get(col).push([row, val]);\n }\n \n // 获取所有列索引并排序\n const columns = Array.from(columnMap.keys()).sort((a, b) => a - b);\n \n const result = [];\n for (const col of columns) {\n const columnNodes = columnMap.get(col);\n // 对每列内的节点排序:先按行排序,同行按值排序\n columnNodes.sort((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按行排序\n }\n return a[1] - b[1]; // 同行按值排序\n });\n \n // 提取值\n result.push(columnNodes.map(node => node[1]));\n }\n \n return result;\n};","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ariana850409":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074225557","body":"思維:\n以十進位的相加方式,將 k 拆解成字串,從個位數開始與 num 相加,最後再處理一次 num 的進位\n\n代碼:\n```\nclass Solution(object):\n def addToArrayForm(self, num, k):\n k = str(k)\n for i in range(-1, -(len(k)+1), -1):\n number = int(k[i])\n if abs(i) > len(num):\n num.insert(0, number)\n else:\n num[i] = num[i] + number\n\n for i in range(-1, -(len(num)+1), -1):\n temp = num[i]\n if temp >= 10:\n num[i] = temp - 10\n if abs(i-1) > len(num):\n num.insert(0, 1)\n else:\n num[i-1] += 1\n\n return num\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078087647","body":"思維:\n先找出所有符合字符 c 的 index,再判斷字符串 s 中每個字符跟要拿來比較的 index 的最短距離\n\n代碼:\n```\nclass Solution:\n def shortestToChar(self, s: str, c: str) -> List[int]:\n target = []\n for i, char in enumerate(s):\n if char == c:\n target.append(i)\n\n res = []\n t = 0\n for i in range(len(s)):\n tar = target[t]\n if i < tar:\n res.append(tar-i)\n elif i == tar:\n res.append(0)\n elif t+1 >= len(target):\n res.append(i-tar)\n else:\n next_tar = target[t+1]\n res.append(min(i-tar, next_tar-i))\n if i == next_tar:\n t += 1\n return res\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3083166293","body":"思維一:單純依照題義用最直接的想法來實作各函式,increment 用遍歷去直接改變列表中的值\n\n代碼:\n```python\nclass CustomStack:\n def __init__(self, maxSize: int):\n self.maxSize = maxSize\n self.stack = []\n \n def push(self, x: int) -> None:\n if if len(self.stack) < self.maxSize:\n self.stack.append(x)\n\n def pop(self) -> int:\n if not self.stack:\n return -1\n return self.stack.pop()\n \n def increment(self, k: int, val: int) -> None:\n k = min(k, len(self.stack))\n for i in range(k):\n self.stack[i] += val\n```\n時間複雜度:push, pop: O(1) / increment: O(N)\n\n空間複雜度:O(N)\n\n-----\n思維二:優化 increment 的時間複雜度,將 increment value 另存在一個列表,等 pop 時才判斷需加多少值\n\n代碼:\n```python\nclass CustomStack:\n def __init__(self, maxSize: int):\n self.maxSize = maxSize\n self.stack = []\n self.inc = [0] * maxSize\n \n def push(self, x: int) -> None:\n if not len(self.stack) >= self.maxSize:\n self.stack.append(x)\n\n def pop(self) -> int:\n if not self.stack:\n return -1\n inc_idx = len(self.stack)-1\n inc_val = self.inc[inc_idx]\n if inc_idx > 0:\n self.inc[inc_idx-1] += inc_val\n self.inc[inc_idx] = 0\n return self.stack.pop() + inc_val\n \n def increment(self, k: int, val: int) -> None:\n k = min(k, len(self.stack))\n if k > 0:\n self.inc[k-1] += val\n```\n時間複雜度:push, pop, increment: O(1)\n\n空間複雜度:O(N)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087613442","body":"思維:使用兩個 stack 模擬進入與退出重複區塊的過程,每遇到 [ 就壓入當下狀態,遇到 ] 就彈出並拼接,逐步建立出完整的解碼字串\n\n代碼:\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n cnt_stack = []\n str_stack = []\n cnt = ''\n temp = ''\n for c in s:\n if c.isdigit():\n cnt += c\n elif c == '[':\n cnt_stack.append(int(cnt))\n str_stack.append(temp)\n cnt = ''\n temp = ''\n elif c == ']':\n times = cnt_stack.pop()\n prev_str = str_stack.pop()\n temp = prev_str + temp * times\n else:\n temp += c\n\n return temp\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091473302","body":"思維一:以暴力解的方式在 peek 或 pop 的操作時,用另一個陣列依序存目前 stack pop 出來的所有元素,操作結果後再依序新增回去,時間及空間複雜度皆為 O(N)(無實作)
\n思維二:使用兩個 stack 來操作存取,當有 peek 或 pop 的操作時,從 out_stack 拿取,判斷 out_stack 為空時再一次性的把當前 in_stack 的所有元素倒進 out_stack\n\n代碼:\n```python\nclass MyQueue(object):\n\n def __init__(self):\n self.in_stack = []\n self.out_stack = []\n \n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n self.in_stack.append(x)\n \n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack.pop()\n \n def peek(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack[-1]\n \n def empty(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n return not (self.in_stack + self.out_stack)\n```\n時間複雜度:O(1) (Amortized)\n\n空間複雜度:O(N)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3096165781","body":"思維:\n1. 空串列直接回傳\n2. 先計算鏈結長度 length\n3. 把 k 對 length 取餘,因為旋轉 length 次等於沒動\n4. 用兩個指針 slow 和 fast 找到新的頭 new_head 的位置\n5. 將鏈結斷開重新連接,完成旋轉\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode(object):\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution(object):\n def rotateRight(self, head, k):\n \"\"\"\n :type head: Optional[ListNode]\n :type k: int\n :rtype: Optional[ListNode]\n \"\"\"\n if not head: \n return head\n\n length = 1\n temp = head\n while temp.next:\n length += 1\n temp = temp.next\n\n slow, fast = head, head\n for _ in range(k % length):\n if fast.next:\n fast = fast.next\n else:\n fast = head\n\n if slow == fast: \n return head\n\n while fast.next:\n slow = slow.next\n fast = fast.next\n\n new_head = slow.next\n slow.next = None\n fast.next = head\n return new_head\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100848058","body":"思維:先處理無需交換的情況,透過一個 dummy 節點統一處理頭節點與後續節點的交換邏輯,每次迴圈交換一對相鄰節點,並用 pre 將已處理區與未處理區銜接起來,最後回傳 dummy 的下一個節點作為新鏈表的頭\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if not head or not head.next:\n return head\n\n left = head\n right = head.next\n dummy = ListNode(None, head)\n pre = dummy\n while right:\n left.next = right.next\n right.next = left\n pre.next = right\n pre = left\n left = left.next\n right = left.next if left else None\n\n return dummy.next\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109165432","body":"思維:有想到要計算遞迴的中心點,但一開始解不出來,參考官方題解的思路加上畫圖後思路有比較清晰\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode(object):\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution(object):\n def sortedListToBST(self, head):\n \"\"\"\n :type head: Optional[ListNode]\n :rtype: Optional[TreeNode]\n \"\"\"\n if not head:\n return head\n\n pre, slow, fast = None, head, head\n while fast and fast.next:\n fast = fast.next.next\n pre = slow\n slow = slow.next\n if pre:\n pre.next = None\n\n node = TreeNode(slow.val)\n if slow == fast:\n return node\n \n node.left = self.sortedListToBST(head)\n node.right = self.sortedListToBST(slow.next)\n return node\n```\n時間複雜度:O(NlogN)\n\n空間複雜度:O(logN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112948103","body":"思維:\n1. 使用兩個指標 a 和 b,分別從 headA 和 headB 開始走。\n2. 每當指標走到自己 linked list 的結尾時,跳到另一條 linked list 的頭部繼續走。\n3. 最終:
\n a. 若兩條 list 有交點,a 和 b 會在同一個節點交會(因為走過的總長度相同)。
\n b. 若沒有交點,a 和 b 都會變成 None,同時結束迴圈。\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, x):\n# self.val = x\n# self.next = None\n\nclass Solution:\n def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:\n a, b = headA, headB\n a_switch, b_switch = False, False\n \n while a and b:\n if a == b:\n return a\n\n a = a.next if a.next else None\n if not a and not a_switch:\n a = headB\n a_switch = True\n \n b = b.next if b.next else None\n if not b and not b_switch:\n b = headA\n b_switch = True\n\n return None\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3114228960","body":"思維:使用快慢指針來偵測是否有環存在,若有找到相遇點的話,把 fast 指針重新指向 head 後找環的起點,兩個指針 slow 和 fast 都改成一次走一步,再次相遇時就是環的起始節點\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, x):\n# self.val = x\n# self.next = None\n\nclass Solution:\n def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if not head or not head.next:\n return None\n\n slow, fast = head, head\n while fast:\n slow = slow.next\n fast = fast.next.next if fast.next else None\n if slow and slow == fast:\n fast = head \n while fast != slow:\n fast = fast.next\n slow = slow.next\n return fast\n\n return None\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3122031171","body":"思維:使用雙向鏈表搭配 Hash Map 實作 LRU Cache,讓每次的 get 和 put 操作都能在 O(1) 時間內完成。最近使用的節點會被移到鏈表頭部,當容量超過時,就從尾部刪除最久未使用的節點。\n\n代碼:\n```python\nclass ListNode:\n def __init__(self, key, value):\n self.key = key\n self.val = value\n self.next = None\n self.pre = None\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.capacity = capacity\n self.length = 0\n self.head = ListNode(None, None)\n self.tail = ListNode(None, None)\n self.head.next = self.tail\n self.tail.pre = self.head\n self.map = {}\n\n def _add_to_head(self, key: int, value: int):\n node = ListNode(key, value)\n node.next = self.head.next\n self.head.next = node\n node.next.pre = node\n node.pre = self.head\n self.map[key] = node\n self.length += 1\n\n def _remove_from_tail(self, key: int):\n remove_key = self.tail.pre.key\n self.tail.pre = self.tail.pre.pre\n self.tail.pre.next = self.tail\n self.map.pop(remove_key)\n self.length -= 1\n\n def _move_node_to_head(self, node: ListNode):\n node.pre.next = node.next\n node.next.pre = node.pre\n self.head.next.pre = node\n node.pre = self.head\n node.next = self.head.next\n self.head.next = node\n \n def get(self, key: int) -> int:\n if key in self.map:\n node = self.map[key]\n self._move_node_to_head(node)\n return self.map[key].val\n return -1\n \n def put(self, key: int, value: int) -> None:\n node = self.map.get(key)\n if node:\n self._move_node_to_head(node)\n node.val = value\n else:\n if self.length >= self.capacity:\n self._remove_from_tail(key) \n self._add_to_head(key, value)\n```\n時間複雜度:O(1)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124493359","body":"思維:DFS,透過遞迴分別計算左右子樹的最大深度,然後回傳較大的一邊再加 1(代表當前節點這一層),最終得到整棵樹的最大深度。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def maxDepth(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n return max(self.maxDepth(root.left), self.maxDepth(root.right))+1\n```\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127762191","body":"思維:DFS,透過遞歸比對兩棵樹的每個對應節點是否完全一樣,一層層往下檢查,直到整棵樹都比對完或中途不符合就結束。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if not p and not q:\n return True\n \n if p and q and p.val == q.val:\n res_left = self.isSameTree(p.left, q.left)\n res_right = self.isSameTree(p.right, q.right)\n return res_left and res_right\n\n return False\n```\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3133090654","body":"思維:DFS,透過遞歸保存當前數字的狀態,每走到下一層就把目前的 current_num 乘上 10 再加上當前節點的值,當走到葉子節點時就可以回傳目前這條路徑的數字,最後把左右子樹的 dfs 結果加總起來。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n def dfs(node, current_num):\n if not node:\n return 0\n current_num = current_num * 10 + node.val\n if not node.left and not node.right:\n return current_num\n return dfs(node.left, current_num) + dfs(node.right, current_num)\n return dfs(root, 0)\n```\n時間複雜度:O(N)\n\n空間複雜度:O(d) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135855226","body":"思維一:BFS,使用廣度優先搜尋一層層遍歷二元樹節點,並記錄每一層最先遇到的節點。每當進入新的一層,就更新目前儲存的節點為該層最左側的節點。最終回傳的是最底層最左邊那個節點的值。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n q = deque()\n res = (root,0)\n q.append((root,0))\n while q:\n node, level = q.popleft()\n cur_level = res[1]\n if level > cur_level:\n res = (node, level)\n\n if node.left:\n q.append((node.left, level+1))\n if node.right:\n q.append((node.right, level+1))\n\n return res[0].val\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(w) (max width of tree)\n\n---------\n思維二:DFS,使用深度優先搜尋遍歷整顆樹,每當遇到更深層的節點,就更新目前記錄的最左邊節點值,最終返回的是整棵樹最深層最左邊的節點值。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n def dfs(node, cur_depth, leftmost, depthest):\n if cur_depth > depthest:\n leftmost = node.val\n depthest = cur_depth\n\n if node.left:\n leftmost, depthest = dfs(node.left, cur_depth+1, leftmost, depthest)\n if node.right:\n leftmost, depthest = dfs(node.right, cur_depth+1, leftmost, depthest)\n return leftmost, depthest\n\n leftmost, depthest = dfs(root, 1, root.val, 1)\n return leftmost\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max height of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3140470104","body":"思維一:DFS
\nserialize: 使用 前序遍歷(DFS) 將樹的結構與節點值轉成 list,再轉為 JSON 字串,None 用來記錄空節點保證可逆。
\ndeserialize: 根據前序順序,遇到 None 表示空節點,遞迴還原出整棵樹的結構。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n def dfs(node):\n if not node:\n res.append(None)\n return\n\n res.append(node.val)\n dfs(node.left)\n dfs(node.right)\n\n dfs(root)\n return json.dumps(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n data = deque(json.loads(data))\n def dfs(data):\n val = data.popleft()\n if val is None:\n return\n\n node = TreeNode(val)\n node.left = dfs(data)\n node.right = dfs(data)\n return node\n \n return dfs(data)\n\n# Your Codec object will be instantiated and called as such:\n# ser = Codec()\n# deser = Codec()\n# ans = deser.deserialize(ser.serialize(root))\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)\n\n-----------------\n\n思維二:BFS
\nserialize:利用 BFS(層序遍歷)將每層節點值與空位(None)一起寫入 list,最後轉成 JSON 字串。
\ndeserialize:讀回字串後同樣使用 BFS,按順序建立節點並接上左右子節點,重建出原始二叉樹。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n queue = deque([root])\n while queue:\n node = queue.popleft()\n if node:\n res.append(node.val)\n queue.append(node.left)\n queue.append(node.right)\n else:\n res.append(None)\n\n return json.dumps(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n data = deque(json.loads(data))\n root_val = data.popleft()\n if root_val is None:\n return None\n \n root = TreeNode(root_val)\n queue = deque([root])\n while queue:\n node = queue.popleft()\n if data:\n left_val = data.popleft()\n right_val = data.popleft()\n if left_val is not None:\n left_node = TreeNode(left_val)\n node.left = left_node\n queue.append(left_node)\n if right_val is not None:\n right_node = TreeNode(right_val)\n node.right = right_node\n queue.append(right_node)\n\n return root\n\n# Your Codec object will be instantiated and called as such:\n# ser = Codec()\n# deser = Codec()\n# ans = deser.deserialize(ser.serialize(root))\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148593193","body":"思維:\n1. 對每個點 i 當作中心,計算它與所有其他點的距離\n2. 用 distance_map 統計,有多少個點與 i 的距離相同(也就是距離為 d 的點出現了幾次)\n3. 如果某個距離出現了 count 次(基本上就是超過一次的次數才會被納入計算),就能組出 count * (count - 1) 種 (j, k) boomerang(因為 (j, k), (k, j) 視為兩種組合,(count - 1) 為要扣掉已經放在前一個位置的元素)\n4. 最後把所有距離的組合數加總起來即可\n\n代碼:\n```python\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n res = 0\n for i, x in enumerate(points):\n distance_map = defaultdict(int)\n for j, y in enumerate(points):\n if i != j:\n distance_map[(y[0] - x[0])**2 + (y[1] - x[1])**2] += 1\n\n for count in distance_map.values():\n res += count * (count-1)\n\n return res\n```\n時間複雜度:O(N^2)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153175756","body":"思維:\n1. 使用雙指針 left 和 right 維護一個「不含重複字元的滑動視窗」\n2. 不斷將 right 指向的字元加入 seen\n3. 一旦發現重複字元,就從 left 開始依序從 seen 移除字元,直到這個重複字元被清掉\n4. 每次 right 移動後,更新視窗大小 right - left,維護一個最大值 max_str\n\n代碼:\n```python\nclass Solution:\n def lengthOfLongestSubstring(self, s: str) -> int:\n max_str = 0\n left = 0\n right = 0\n seen = set()\n while right < len(s):\n while s[right] in seen:\n seen.remove(s[left])\n left += 1\n seen.add(s[right])\n right += 1\n max_str = max(max_str, right-left)\n return max_str\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k) (k for number of character types)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160705635","body":"思維:\n1. 多組偏移掃描:使用 i in range(word_len) 對字串做「分組」掃描,防止錯過合法起始點\n2. 滑動視窗掃描:每次從 j 開始擷取一個單字(長度 word_len),如果這個字在 words 裡,放進 window_counter,若某個單字超出次數,移動 left(左指針)來縮小視窗,如果視窗內剛好有 word_count 個單字,加入結果\n3. 如果不是合法單字,清空 window_counter,重設 count 和 left(下一次從這個位置繼續)\n\n代碼:\n```python\nclass Solution:\n def findSubstring(self, s: str, words: List[str]) -> List[int]:\n word_len = len(words[0])\n word_count = len(words)\n total_len = word_len * word_count\n target_counter = Counter(words)\n res = []\n\n for i in range(word_len):\n left = i\n window_counter = Counter()\n count = 0\n\n for j in range(i, len(s) - word_len + 1, word_len):\n word = s[j:j+word_len]\n if word in target_counter:\n window_counter[word] += 1\n count += 1\n\n while window_counter[word] > target_counter[word]:\n left_word = s[left:left+word_len]\n window_counter[left_word] -= 1\n count -= 1\n left += word_len\n\n if count == word_count:\n res.append(left)\n\n else:\n window_counter.clear()\n count = 0\n left = j + word_len\n\n return res\n```\n時間複雜度:O(N × W) (N is length of s, W is length of words)\n\n空間複雜度:O(W)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166506559","body":"思維:使用快慢指標 (two pointers) 技巧,設兩個指標 slow 和 fast 同時指向鏈表頭,每次 slow 走一步、fast 走兩步,當 fast 到達鏈表尾時,slow 正好在中間節點。\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n\n return slow \n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172494360","body":"思維:使用雙指針來實行二分搜尋法,設定左右邊界取中間位置\n1. 如果 nums[mid] == target,直接回傳 mid(找到目標)。\n2. 如果 nums[mid] > target,代表目標在左半邊,更新 right = mid - 1。\n3. 如果 nums[mid] < target,代表目標在右半邊,更新 left = mid + 1。\n4. 迴圈結束後(left > right),left 就是目標應插入的位置。\n\n代碼:\n```python\nclass Solution:\n def searchInsert(self, nums: List[int], target: int) -> int:\n left = 0\n right = len(nums)-1\n while left <= right:\n mid = (left+right)//2\n if nums[mid] == target:\n return mid\n elif nums[mid] > target:\n right = mid-1\n else:\n left = mid+1\n return left\n```\n時間複雜度:O(logN)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173687770","body":"思維:使用單調遞減隊列來維護視窗內最大值的 index\n1. 前 k 個元素先初始化隊列:維持隊列的遞減性,每次新來的元素會移除尾部比它小的元素,q[0] 永遠是最大值的 index\n2. 接下來從 k 到結尾,維持單調性並移除過期元素:新元素進來時維持單調隊列,移除滑出視窗的 index,每次把 nums[q[0]](視窗最大值)加入結果\n\n代碼:\n```python\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n res = []\n q = deque()\n for i in range(k):\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n res.append(nums[q[0]])\n\n for i in range(k, len(nums)):\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n while q[0] <= i-k:\n q.popleft()\n res.append(nums[q[0]])\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178842909","body":"思維:\n1. 使用兩個表分別紀錄信任他人及被信任的計數\n2. 之後尋找一個人 x,滿足:trusted_tables[x] == n - 1(被其他人信任)以及 trust_tables[x] == 0:(自己沒信任任何人)\n3. 若找到這樣的人,回傳他的編號;否則回傳 -1\n\n代碼:\n```python\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n if n == 1:\n return 1\n\n trust_tables = defaultdict(int)\n trusted_tables = defaultdict(int)\n for [trust_a, trust_b] in trust:\n trust_tables[trust_a] += 1\n trusted_tables[trust_b] += 1\n\n for trusted_person, trusted_ticket in trusted_tables.items():\n if trusted_ticket == n-1 and trust_tables[trusted_person] == 0:\n return trusted_person\n return -1\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3188960333","body":"思維:\n1. 把沒群組的 item 分配新的唯一群組:這樣後面只需處理群組 id,不用特別分支處理 -1。\n2. 建立 item graph:由 prev -> curr(prev 必須在 curr 前面)。\n3. 建立 group graph:當 prev 與 curr 屬不同群組時,建立 g_prev -> g_curr 的依賴邊;用 set 避免重複邊。\n4. 對 group graph 做拓撲排序:得出 group 的一個合法順序;若有 cycle,無解回 []。\n5. 對 item graph 做拓撲排序:得出 items 在全域上的合法相對順序(若有 cycle,無解回 [])。\n6. 把 items 按 item_order 分桶到對應 group,再按 group_order 串接:同 group items 會連在一起且保持 item 之間的依賴。\n\n代碼:\n```python\nclass Solution:\n def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:\n new_group_id = m\n for i in range(n):\n if group[i] == -1:\n group[i] = new_group_id\n new_group_id += 1\n total_groups = new_group_id\n\n item_adj = [[] for _ in range(n)]\n item_indeg = [0] * n\n\n group_adj = [[] for _ in range(total_groups)]\n group_indeg = [0] * total_groups\n\n added_group_edges = set()\n\n for curr in range(n):\n for prev in beforeItems[curr]:\n item_adj[prev].append(curr)\n item_indeg[curr] += 1\n\n g_prev = group[prev]\n g_curr = group[curr]\n if g_prev != g_curr:\n if (g_prev, g_curr) not in added_group_edges:\n added_group_edges.add((g_prev, g_curr))\n group_adj[g_prev].append(g_curr)\n group_indeg[g_curr] += 1\n\n def topo_sort(num_nodes, adj, indeg):\n q = deque([i for i in range(num_nodes) if indeg[i] == 0])\n order = []\n while q:\n u = q.popleft()\n order.append(u)\n for v in adj[u]:\n indeg[v] -= 1\n if indeg[v] == 0:\n q.append(v)\n if len(order) == num_nodes:\n return order\n else:\n return []\n\n group_order = topo_sort(total_groups, group_adj, group_indeg[:])\n if not group_order:\n return []\n\n item_order = topo_sort(n, item_adj, item_indeg[:])\n if not item_order:\n return []\n\n items_by_group = defaultdict(list)\n for item in item_order:\n items_by_group[group[item]].append(item)\n\n result = []\n for g in group_order:\n result.extend(items_by_group[g])\n\n return result\n```\n時間複雜度:O(n + E)\n\n空間複雜度:O(n + m + E)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3191064414","body":"思維:依照題意模擬路徑\n\n代碼:\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n spot = [0, 0]\n for move in moves:\n if move == 'R':\n spot[0] += 1\n elif move == 'L':\n spot[0] -= 1\n elif move == 'U':\n spot[1] += 1\n else:\n spot[1] -= 1\n \n return spot == [0, 0]\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194164140","body":"思維:\n1. 解析登入、登出時間(時、分),如果登出時間早於登入時間,代表跨過午夜就加 24 小時。\n2. 重新計算登入時間:向上取整到最近的 15 分鐘倍數(因為要等到下一個完整的 15 分鐘才算開始一局)。\n3. 重新計算登出時間:向下取整到最近的 15 分鐘倍數(因為超過的部分不算完整一局)。\n4. 計算完整局數,如果結果為負數則返回 0。\n\n這裡用 (logout_hour-login_hour)*4 - login_minute/15 + logout_minute/15 直接換算成以「15 分鐘為單位」的差距。\n\n代碼:\n```python\nclass Solution:\n def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:\n login_hour, login_minute = map(int, loginTime.split(':'))\n logout_hour, logout_minute = map(int, logoutTime.split(':'))\n if logout_hour < login_hour or logout_hour == login_hour and logout_minute < login_minute:\n logout_hour += 24\n\n login_hour, login_minute = self.narrow_down_time(login_hour, login_minute, True)\n logout_hour, logout_minute = self.narrow_down_time(logout_hour, logout_minute, False)\n\n return max(0, int((logout_hour-login_hour)*4 - login_minute/15 + logout_minute/15))\n\n def narrow_down_time(self, login_hour: int, login_minute: int, is_login: bool):\n if is_login:\n login_minute = ceil(login_minute/15) * 15\n if login_minute == 60:\n login_hour += 1\n login_minute = 0\n else:\n login_minute = floor(login_minute/15) * 15\n\n return login_hour, login_minute\n```\n時間複雜度:O(1)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3196258303","body":"思維:\n1. 函式 compare_less(a_counter, b_counter):模擬條件 1、2,對所有可能分界點 ch(從 'b' 到 'z')進行遍歷
\n讓 a 的所有字母 < ch,讓 b 的所有字母 ≥ ch,使用 prefix sum 避免重複運算,計算出最少需要修改的字元數\n2. 函式 compare_distinct(a_counter, b_counter):模擬條件 3,讓兩字串變成同一種字母
\n對所有字母出現次數總和 Counter 做合併,找出現次數最多的字母後,將其餘字母通通改成這個字母,修改次數 = 總數量 - 該字母出現次數\n3. 分別計算三個條件需要的修改次數,回傳三者中的最小值\n\n代碼:\n```python\nclass Solution:\n def minCharacters(self, a: str, b: str) -> int:\n a_counter = Counter(ord(ch) for ch in a)\n b_counter = Counter(ord(ch) for ch in b)\n\n goal_a = self.compare_less(a_counter, b_counter)\n goal_b = self.compare_less(b_counter, a_counter)\n goal_c = self.compare_distinct(a_counter, b_counter)\n return min(goal_a, goal_b, goal_c)\n\n def compare_less(self, a_counter, b_counter):\n a_freq = [0] * 26\n b_freq = [0] * 26\n for k, v in a_counter.items():\n a_freq[k - ord('a')] = v\n for k, v in b_counter.items():\n b_freq[k - ord('a')] = v\n\n a_prefix = list(itertools.accumulate(a_freq))\n b_prefix = list(itertools.accumulate(b_freq))\n move = float('inf')\n for ch in range(1, 26):\n move_a = a_prefix[25] - a_prefix[ch-1]\n move_b = b_prefix[ch-1]\n move = min(move, move_a + move_b)\n return move\n\n def compare_distinct(self, a_counter, b_counter):\n all_counter = a_counter + b_counter\n most_key = max(all_counter, key=all_counter.get)\n total = sum(all_counter.values())\n return total - all_counter[most_key]\n```\n時間複雜度:O(n+m)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3201266614","body":"思維:先把所有數字用 heappush 丟進最小堆,維護「父節點 ≤ 子節點」,接著每次 heappop 拿走堆頂(最小值),直到堆空,收集出來的數列 res 就是升序排序。\n\n代碼:\n```python\nclass Solution:\n def sortArray(self, nums: List[int]) -> List[int]:\n min_heap = []\n res = []\n for num in nums:\n self.heappush(min_heap, num)\n\n while min_heap:\n res.append(self.heappop(min_heap))\n\n return res\n \n def heappush(self, h, x):\n h.append(x)\n i = len(h)-1\n\n while i > 0:\n p = (i - 1) // 2\n if h[i] < h[p]:\n h[i], h[p] = h[p], h[i]\n i = p\n else:\n break\n\n def heappop(self, h):\n last = h.pop()\n if not h:\n return last\n root = h[0]\n h[0] = last\n i = 0\n n = len(h)\n while True:\n left = 2*i + 1\n right = 2*i + 2\n if left >= n:\n break\n\n child = left\n if right < n and h[right] < h[left]:\n child = right\n if h[child] < h[i]:\n h[i], h[child] = h[child], h[i]\n i = child\n else:\n break\n return root\n```\n時間複雜度:O(n log n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204542831","body":"思維:使用二分搜尋法,對於 x ≥ 2 的情況,設定搜尋範圍為 [1, x // 2],如果 mid^2 太大,就向左縮小範圍,如果太小,就向右移動範圍,當搜尋結束(left > right)時,right 就是最接近但不超過 √x 的整數\n\n代碼:\n```python\nclass Solution:\n def mySqrt(self, x: int) -> int:\n if x < 2:\n return x\n \n left, right = 1, x // 2\n while left <= right:\n mid = (left + right) // 2\n if mid * mid == x:\n return mid\n elif mid * mid > x:\n right = mid - 1\n else:\n left = mid + 1\n\n return right\n```\n時間複雜度:O(log x)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3211104911","body":"思維:使用二分搜尋法,如果 mid 是壞的:可能是答案,但還要往左找,right = mid - 1,如果 mid 是好的:答案一定在右邊,left = mid + 1,最後 left 會停在第一個壞版本的位置。\n\n代碼:\n```python\nclass Solution:\n def firstBadVersion(self, n: int) -> int:\n left, right = 1, n\n while left <= right:\n mid = (left + right) // 2\n if isBadVersion(mid):\n right = mid - 1\n else:\n left = mid + 1\n return left\n```\n時間複雜度:O(log n)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216087383","body":"思維:\n1. 先對加熱器位置排序,才能用二分搜尋快速找到每個房子最近的加熱器\n2. 遍歷每個房子,使用二分搜尋找到第一個 heaters[mid] 大於等於當前 house 的位置(也就是最接近右邊的加熱器)\n3. 再往回看一個位置 heaters[r],也就是最接近左邊的加熱器\n4. 比較左右加熱器距離,選擇較小者\n5. 更新最大加熱半徑(最小距離中的最大值)\n\n代碼:\n```python\nclass Solution:\n def findRadius(self, houses: List[int], heaters: List[int]) -> int:\n res = 0\n heaters.sort()\n \n for house in houses:\n l, r = 0, len(heaters) - 1\n while l <= r:\n mid = (l + r) // 2\n if house <= heaters[mid]:\n r = mid - 1\n else:\n l = mid + 1\n\n l_res, r_res = inf, inf\n if 0 <= l <= len(heaters)-1:\n l_res = abs(heaters[l] - house)\n if 0 <= r <= len(heaters)-1:\n r_res = abs(heaters[r] - house)\n\n res = max(res, min(l_res, r_res))\n\n return res\n```\n時間複雜度:O(M log M + N log M) (M for length of heaters, N for length of houses)\n\n空間複雜度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3223499698","body":"思維:先初始化前 k 個字元中有多少母音,用滑動視窗維持長度為 k 的區間往右滑動,每次移動一格,視窗左邊出去一個字元、右邊進來一個字元,如果左邊移出的是母音即減 1,如果右邊移入的是母音即加 1,並且更新最大值,直到滑到最後一格為止\n\n代碼:\n```python\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n vowels = set('aeiou')\n count = sum(1 for c in s[:k] if c in vowels)\n max_count = count\n\n for i in range(k, len(s)):\n if s[i-k] in vowels:\n count -= 1\n if s[i] in vowels:\n count += 1\n max_count = max(max_count, count)\n\n return max_count\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3227824002","body":"思維:\n1. 邊界判斷:若 k == 0,不會抽牌,分數永遠是 0,且一定 ≤ n,直接回傳 1.0。若 n ≥ k + maxPts - 1,最多只能拿到 k - 1 + maxPts 分,而這些都 ≤ n,直接回傳 1.0\n2. 初始化:建立一個長度 n + 1 的 dp 陣列,dp[i] 表示拿到 i 分的機率,設定 dp[0] = 1.0(初始在 0 分),window_sum = 1.0 表示 dp[0] 的值,res = 0.0,用來累加最終結果(分數 ≥ k 的機率)\n3. 進入迴圈,從 i = 1 到 n:使用滑動視窗平均法計算 dp[i] = window_sum / maxPts,如果 i < k 代表還會繼續抽牌 → 將 dp[i] 加入 window_sum,影響後續機率,如果 i ≥ k,代表不能再抽牌了 → 將 dp[i] 加入 res,因為這是可能的最終分數\n4. 維護滑動視窗:若 i - maxPts ≥ 0,將前方的 dp[i - maxPts] 從 window_sum 中扣除,保持視窗大小為 maxPts\n5. 迴圈結束後,回傳累積的結果:回傳 res,即所有停在 k 到 n 分的總機率\n\n代碼:\n```python\nclass Solution:\n def new21Game(self, n: int, k: int, maxPts: int) -> float:\n if k == 0 or n >= k + maxPts - 1:\n return 1\n \n dp = [0.0] * (n + 1)\n dp[0] = 1.0\n window_sum = 1.0\n res = 0.0\n\n for i in range(1, n + 1):\n dp[i] = window_sum / maxPts\n if i < k:\n window_sum += dp[i]\n else:\n res += dp[i]\n\n if i - maxPts >= 0:\n window_sum -= dp[i-maxPts]\n\n return res\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3232431244","body":"思維:透過固定長度為 len(p) 的滑動視窗掃過整個字串 s,用 Counter 統計當前視窗的字元分佈\n1. 初始化兩個 Counter:target 記錄 p 的字元分佈,cur 動態維護視窗內的字元分佈\n2. 向右移動右指標 r 更新 cur,每次移動後如果 cur == target,代表此視窗是一個 anagram,res 加入 l\n3. 視窗長度若達到 len(p),就縮左邊,如果左邊的字元也在 p 中,從 cur 中減一,移動左指標 l,確保視窗長度維持為 len(p)\n\n代碼:\n```python\nclass Solution:\n def findAnagrams(self, s: str, p: str) -> List[int]:\n res = []\n target = Counter(p)\n cur = Counter()\n l, r = 0, 0\n\n while r < len(s):\n if s[r] in p:\n cur[s[r]] += 1\n \n if cur == target:\n res.append(l)\n\n r += 1\n if r - l >= len(p):\n if s[l] in p:\n cur[s[l]] -= 1\n l += 1\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235535873","body":"思維:\n1. 使用 target 記錄 t 中每個字元需要出現幾次,required 為需要達成的字元種類數,formed 表示目前有多少種字元達到目標需求\n2. 用滑動視窗 [l, r] 掃過 s\n3. 視窗內使用 cur 統計目前出現的字元次數\n4. 每當 formed == required(即目前視窗內已滿足所有字元需求),就嘗試更新最短子字串\n5. 然後移動左指標 l,直到不再滿足條件,再往右擴張 r\n\n代碼:\n```python\nclass Solution:\n def minWindow(self, s: str, t: str) -> str:\n if not s or not t or len(t) > len(s):\n return ''\n\n res = ''\n target = Counter(t)\n cur = Counter()\n required = len(target)\n formed = 0\n l = 0\n\n for r in range(len(s)):\n char = s[r]\n if char in target:\n cur[char] += 1\n if cur[char] == target[char]:\n formed += 1\n\n while formed == required:\n window = s[l:r+1]\n if not res or len(window) < len(res):\n res = window\n\n if s[l] in target:\n cur[s[l]] -= 1\n if cur[s[l]] < target[s[l]]:\n formed -= 1\n l += 1\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3241211135","body":"思維:\n1. 每一層遞迴代表一個 row(橫列),每一層嘗試在該 row 的每一個 col(直行)上放一個 Q\n2. 使用三個集合記錄不能放的位置(剪枝):used_cols:欄位不能重複、used_diag1:↘ 對角線(row - col)不能重複、used_diag2:↙ 對角線(row + col)不能重複\n3. 如果當前格子合法:將當前 col 與對角線加入對應集合,進入下一 row 繼續放皇后\n4. 如果成功放到第 n 行,代表一種合法放法,count += 1\n5. 每個回合結束後回溯:移除當前狀態,嘗試下一個 col\n\n代碼:\n```python\nclass Solution:\n def totalNQueens(self, n: int) -> int:\n count = 0\n\n def backtracking(row, used_cols, used_diag1, used_diag2):\n if row == n:\n nonlocal count \n count += 1\n return\n\n for col in range(n):\n if col in used_cols or row - col in used_diag1 or row + col in used_diag2:\n continue\n \n used_cols.add(col)\n used_diag1.add(row - col)\n used_diag2.add(row + col)\n\n backtracking(row + 1, used_cols, used_diag1, used_diag2)\n\n used_cols.remove(col)\n used_diag1.remove(row - col)\n used_diag2.remove(row + col)\n\n backtracking(0, set(), set(), set())\n\n return count\n```\n時間複雜度:O(n!)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3244207256","body":"思維:深度優先搜尋(DFS)\n1. 初始化變數: seen 避免重複拜訪相同格子、max_area記錄最大島嶼面積\n2. 走過整張地圖: 雙層 for loop,遍歷每一格 (i, j)\n3. 找到新的島嶼起點就 DFS: 如果是還沒拜訪過的陸地,就從這裡開始 DFS,算面積,回傳面積後更新 max_area\n4. DFS 拜訪所有相連陸地: 每次進來的 (row, col) 都會標記為已拜訪,area = 1 表示這一格自己先算進面積\n5. 遞迴搜尋上下左右的相連格子: 檢查鄰近 4 格是否可以繼續走,遞迴地累加 area\n6. DFS 結束後回傳這座島的面積\n\n代碼:\n```python\nclass Solution:\n direction = [(1, 0), (-1, 0), (0, 1), (0, -1)]\n\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n seen = set()\n max_area = 0\n for i in range(len(grid)):\n for j in range(len(grid[0])):\n if grid[i][j] == 1 and (i, j) not in seen:\n area = self.dfs(i, j, seen, grid)\n max_area = max(max_area, area)\n \n return max_area\n\n def dfs(self, row, col, seen, grid):\n seen.add((row, col))\n area = 1\n for dx, dy in self.direction:\n x, y = row + dx, col + dy\n if 0 <= x < len(grid) and 0 <= y < len(grid[0]) and grid[x][y] == 1 and (x, y) not in seen:\n area += self.dfs(x, y, seen, grid)\n \n return area\n```\n時間複雜度:O(m × n)\n\n空間複雜度:O(m × n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249687017","body":"思維:多源 BFS\n1. 把所有的陸地格(值為 1)當作起點,加入 queue 中\n2. 先判斷若陸地為空(全是水)或全是陸地,回傳 -1\n3. BFS 擴展每一層水格:每次從 queue 拿一個格子出來,對四個方向進行探索,如果是水(值為 0),就更新它為「距離 = 前一格 + 1」,並將它加入 queue,等下繼續擴展\n4. 最後回傳最大距離 -1:因為初始的陸地值是 1,所以水格的距離是從 2 開始計算,因此真正的距離 = 格子值 - 1\n\n代碼:\n```python\nclass Solution:\n def maxDistance(self, grid: List[List[int]]) -> int:\n q = deque()\n for i in range(len(grid)):\n for j in range(len(grid[0])):\n if grid[i][j] == 1:\n q.append((i, j))\n \n if not q or len(q) == len(grid) * len(grid):\n return -1\n\n directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]\n max_dist = 0\n while q:\n x, y = q.popleft()\n for dx, dy in directions:\n nx = x + dx\n ny = y + dy\n if 0 <= nx < len(grid) and 0 <= ny < len(grid[0]) and grid[nx][ny] == 0:\n grid[nx][ny] = grid[x][y] + 1\n q.append((nx, ny))\n max_dist = max(max_dist, grid[nx][ny])\n\n return max_dist - 1\n```\n時間複雜度:O(n^2)\n\n空間複雜度:O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251575584","body":"思維:\n1. 把初始擁有箱子(initialBoxes)能打開的箱子(status = 1)加入 queue\n2. 使用 queue 處理可以打開的箱子,如果已經處理過的話則跳過\n3. 開箱拿糖果後,處理新拿到的箱子鑰匙,把鑰匙對應到已擁有且未開啟過的 box 加入 queue\n4. 處理新拿到的箱子,如果箱子可以直接打開或擁有鑰匙就加進 queue,否則放進 own_boxes 等待日後有拿到 key 再打開\n5. 整個流程直到 queue 為空,表示目前已經沒能力再開更多箱子了,回傳總糖果數量\n\n代碼:\n```python\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n own_boxes = set(initialBoxes)\n own_keys = set()\n visited = set()\n q = deque()\n total_candies = 0\n\n for box in initialBoxes:\n if status[box] == 1:\n q.append(box)\n \n while q:\n box = q.popleft()\n if box in visited:\n continue\n\n total_candies += candies[box]\n visited.add(box)\n \n for key in keys[box]:\n own_keys.add(key)\n if key in own_boxes and key not in visited:\n q.append(key)\n\n for new_box in containedBoxes[box]:\n own_boxes.add(new_box)\n if (status[new_box] == 1 or new_box in own_keys) and new_box not in visited:\n q.append(new_box) \n\n return total_candies\n```\n時間複雜度:O(n+k)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3256863525","body":"思維:\n1. 廣度優先搜尋 (BFS) 遍歷樹,使用 deque 從 root 開始,記錄每個節點的座標\n2. 收集節點資訊,每個節點存成 (x, y, val),加入 nodes 列表\n3. 排序節點,按照題目規則排序:y(由左到右),x(由上到下),val(同位置時數字小的先)\n4. 按列分組,掃描排序後的 nodes,根據 y 值變化劃分列表\n5. 回傳結果,res 即 vertical order traversal 的輸出。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:\n nodes = []\n q = deque([(root, 0, 0)])\n while q:\n node, x, y = q.popleft()\n nodes.append((x, y, node.val))\n if node.left:\n q.append((node.left, x+1, y-1))\n if node.right:\n q.append((node.right, x+1, y+1))\n\n nodes.sort(key=lambda x: (x[1], x[0], x[2]))\n res = []\n cur_y = None\n for _, y, val in nodes:\n if y != cur_y:\n res.append([val])\n cur_y = y\n else:\n res[-1].append(val)\n\n return res\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260998230","body":"思維:\n1. 定義狀態 dp[i] 表示「到達第 i 階的最小花費」\n2. 每次要到達第 i 階,有兩種方式:從第 i-1 階踩一階上來 → 花費 = dp[i-1] + cost[i-1] or 從第 i-2 階踩兩階上來 → 花費 = dp[i-2] + cost[i-2]\n3. 所以取較小值 dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n4. 我們要到達頂樓 = len(cost),因此答案是 dp[-1](即 dp[len(cost)])\n\n代碼:\n```python3\nclass Solution:\n def minCostClimbingStairs(self, cost: List[int]) -> int:\n dp = [0] * (len(cost) + 1)\n for i in range(2, len(cost) + 1):\n dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n\n return dp[-1]\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263817074","body":"思維:\n1. 如果只有一間房子,直接回傳 nums[0]\n2. 初始化 dp 陣列,建立一個長度與 nums 相同的陣列 dp,dp[i] 表示考慮到第 i 間房子時,選擇偷這間房子,能得到的最大金額\n3. 填入前兩個房子:如果 i < 2,直接偷這間房子\n4. 狀態轉移(從 i=2 開始),偷第 i 間房的前提是不能偷相鄰的,所以考慮搭配 i-2 或搭配 i-3 的最佳解\n5. 最後答案一定是偷到倒數第 1 間(dp[-1])或倒數第 2 間(dp[-2]),取最大值\n\n代碼:\n```python\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n if len(nums) == 1:\n return nums[0]\n\n dp = [0] * len(nums)\n for i, num in enumerate(nums):\n if i < 2:\n dp[i] = num\n else:\n dp[i] = max(dp[i-2] + num, dp[i-3] + num)\n\n return max(dp[-1], dp[-2])\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3264481892","body":"思維:\n1. dp[i]: 表示以 nums[i] 結尾的 LIS 最長長度、count[i]: 表示有多少組 LIS 長度等於 dp[i] 是以 nums[i] 結尾的\n2. 對每個 i,檢查它前面的每個 j,如果 nums[j] < nums[i],則可以將 nums[i] 接在 nums[j] 後面\n3. 如果接在 j 後面可以讓序列更長(dp[j] + 1 > dp[i]),則更新 dp[i] = dp[j] + 1,並且把組數設為 count[i] = count[j]\n4. 如果接在 j 後面剛好等長(dp[j] + 1 == dp[i]),則表示找到另一條一樣長的走法,所以把組數加進來 count[i] += count[j]\n5. 最後找出所有 dp[i] == max_len 的位置,把它們對應的 count[i] 加總起來\n\n代碼:\n```python\nclass Solution:\n def findNumberOfLIS(self, nums: List[int]) -> int:\n n = len(nums)\n dp = [1] * n\n count = [1] * n\n\n for i in range(n):\n for j in range(i):\n if nums[j] < nums[i]:\n if dp[j] + 1 > dp[i]:\n dp[i] = dp[j] + 1\n count[i] = count[j]\n elif dp[j] + 1 == dp[i]:\n count[i] += count[j]\n\n max_len = max(dp)\n return sum(c for i, c in enumerate(count) if dp[i] == max_len)\n```\n時間複雜度:O(n^2)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269134596","body":"思維:\n1. 設 dp[i][j] = text1[:i] 與 text2[:j] 的最長共同子序列長度\n2. 如果其中一個字串長度為 0 → LCS = 0,所以 dp[0][*] 和 dp[*][0] 全部設為 0\n3. 如果 text1[i-1] == text2[j-1],這個字元可以加入 LCS → dp[i][j] = dp[i-1][j-1] + 1\n4. 否則這個字元不能同時出現在 LCS,只能丟掉其中一個字元,取兩種情況最大值 → dp[i][j] = max(dp[i-1][j], dp[i][j-1])\n5. 回傳 dp[-1][-1](表格右下角)就是最終答案\n\n代碼:\n```python\nclass Solution:\n def longestCommonSubsequence(self, text1: str, text2: str) -> int:\n m = len(text1)\n n = len(text2)\n dp = [[0]*(n+1) for _ in range(m+1)]\n \n for i in range(1, m+1):\n for j in range(1, n+1):\n if text1[i-1] == text2[j-1]:\n dp[i][j] = dp[i-1][j-1] + 1\n else:\n dp[i][j] = max(dp[i-1][j], dp[i][j-1])\n\n return dp[-1][-1]\n```\n時間複雜度:O(m * n)\n\n空間複雜度:O(m * n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273520377","body":"思維:\n1. 機器人從左上角走到右下角,只能往下或往右,所以每個格子的路徑數 = 從上方來的路徑數 + 從左方來的路徑數\n2. 狀態定義:dp[i][j] = 從起點 (0,0) 到 (i,j) 的路徑數\n3. 初始化所有路徑都是 1,主要是第一行、第一列只能直走一條路徑因此都是 1\n4. dp[i][j] 的路徑數就等於 dp[i−1][j] (從上方來的路徑數) + dp[i][j−1] (從左方來的路徑數)\n5. 最後答案取右下角 dp[m-1][n-1]\n\n代碼:\n```python\nclass Solution:\n def uniquePaths(self, m: int, n: int) -> int:\n dp = [[1] * n for _ in range(m)]\n for i in range(1, m):\n for j in range(1, n):\n dp[i][j] = dp[i-1][j] + dp[i][j-1]\n \n return dp[m-1][n-1]\n```\n時間複雜度:O(m * n)\n\n空間複雜度:O(m * n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3278614246","body":"思維:\n1. 狀態定義:dp[r][c] = 騎士在走了 t 步之後,位於 (r,c) 的機率\n2. 初始化:t=0 時,起點 (row, column) 的機率 = 1.0,其他位置 = 0.0\n3. 狀態轉移:從 (r,c) 出發,分散到 8 個可能位置。每一個合法位置的機率 += dp[r][c] / 8\n4. 重複 k 次:每一步產生新的棋盤機率分佈,並用新的棋盤機率更新 dp 陣列\n5. 回傳答案:把整個棋盤上機率加總,就是騎士還在棋盤上的總機率\n\n代碼:\n```python\nclass Solution:\n def knightProbability(self, n: int, k: int, row: int, column: int) -> float:\n dp = [[0.0] * n for _ in range(n)]\n dp[row][column] = 1.0\n positions = [(-1, 2), (-1, -2), (-2, 1), (-2, -1), (1, 2), (1, -2), (2, 1), (2, -1)]\n\n for i in range(k):\n next_dp = [[0.0] * n for _ in range(n)]\n for r in range(n):\n for c in range(n):\n if dp[r][c] > 0:\n for dr, dc in positions:\n nr, nc = r + dr, c + dc\n if 0 <= nr < n and 0 <= nc < n:\n next_dp[nr][nc] += dp[r][c] / 8.0\n dp = next_dp \n\n return sum(sum(row) for row in dp)\n```\n時間複雜度:O(k * n^2)\n\n空間複雜度:O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3285759121","body":"思維:\n1. 如果 1+2+…+max < desiredTotal → 永遠湊不到目標 → return False\n2. 如果 desiredTotal ≤ maxChoosableInteger → 先手一次就贏 → return True\n3. 用 bitmask mask 記錄哪些數字已被選過,用 remain 記錄距離目標還差多少\n4. 遞迴判斷 (dfs) 嘗試每一個未被選過的數字 num\n5. 如果 num ≥ remain → 我馬上贏 → return True,否則進入新狀態 (new_mask, remain-num),讓對手繼續\n6. 如果對手在新狀態輸(dfs 回 False)→ 我必勝 → return True\n7. 如果沒有任何選擇能讓我贏 → return False\n\n代碼:\n```python\nclass Solution:\n def canIWin(self, maxChoosableInteger: int, desiredTotal: int) -> bool: \n total_sum = (1 + maxChoosableInteger) * maxChoosableInteger / 2\n if total_sum < desiredTotal:\n return False\n if desiredTotal <= maxChoosableInteger:\n return True\n \n @lru_cache(None)\n def dfs(mask, remain):\n for num in range(1, maxChoosableInteger + 1):\n if not mask & (1 << (num-1)):\n if num >= remain:\n return True\n new_mask = mask | (1 << (num-1))\n if not dfs(new_mask, remain - num):\n return True\n return False\n\n return dfs(0, desiredTotal)\n```\n時間複雜度:O(m * 2^m)\n\n空間複雜度:O(2^m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3287665138","body":"思維:\n1. 如果 nums 的總和是奇數,不可能分成兩組相等 → return False\n2. 否則,目標和 = 總和 / 2\n3. 狀態定義:dp[i][j] = 是否可以用前 i 個數字湊出和 j\n4. 初始化:dp[0][0] = True(不用任何數字就能湊出 0),dp[0][j>0] = False(不用數字不可能湊出正數)\n5. 若 j < nums[i-1] → 這個數太大,不能用因此只能 → dp[i][j] = dp[i-1][j]\n6. 若 j ≥ nums[i-1] → 可以選用或不用這個數 → dp[i][j] = dp[i-1][j] or dp[i-1][j - nums[i-1]]\n7. 最後看 dp[n][target],如果 True → 代表能找到一個子集和 = target → 表示 nums 可分成兩組\n\n代碼:\n```python\nclass Solution:\n def canPartition(self, : List[int]) -> bool:\n if sum(nums) % 2 > 0:\n return False\n target = sum(nums) // 2\n\n dp = [[False] * (target + 1) for _ in range(len(nums) + 1)]\n dp[0][0] = True\n for i in range(1, len(nums) + 1):\n for j in range(target + 1):\n if j < nums[i-1]:\n dp[i][j] = dp[i-1][j]\n else:\n dp[i][j] = dp[i-1][j] or dp[i-1][j-nums[i-1]]\n\n return dp[len(nums)][target]\n```\n時間複雜度:O(n * m) (n for length of nums, m for target)\n\n空間複雜度:O(n * m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289413390","body":"思維:\n1. 要找能不能在 nums 前加上 + 或 -,最後湊成 target,等價於找一個子集,使總和 = (sum(nums)+target)/2 = p\n2. 如果 abs(target) > sum → 超過總和,必然無解,如果 sum + target 是奇數 → p 不是整數,也必然無解\n3. 狀態定義:dp[j] = 方法數,表示能湊出和為 j 的子集數量\n4. 初始化:dp[0] = 1 → 空集合能湊出 0 的方法只有 1 種\n5. 狀態轉移:遍歷每個數字 num,倒序更新,如果能湊出 j-num,再加上 num 就能湊出 j\n6. 答案回傳 dp[p],也就是湊出和為 p 的方法數\n\n代碼:\n```python\nclass Solution:\n def findTargetSumWays(self, nums: List[int], target: int) -> int:\n if abs(target) > sum(nums) or (sum(nums) + target) % 2 > 0:\n return 0\n\n p = (sum(nums) + target) // 2\n dp = [0] * (p + 1)\n dp[0] = 1\n for i in range(len(nums)):\n for j in range(p, nums[i]-1, -1):\n dp[j] += dp[j-nums[i]]\n\n return dp[p]\n``` \n時間複雜度:O(n * p) \n\n空間複雜度:O(p)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290383887","body":"思維:\n1. 初始化建立 dp 陣列,長度為 amount+1,全部設成無窮大 inf,代表一開始不可達\n2. 設 dp[0] = 0,表示湊 0 元不需要硬幣\n3. 外層金額 i 從 1 跑到 amount,內層對每個硬幣 coin 嘗試\n4. 如果 i - coin >= 0,表示可用這枚硬幣,更新 dp[i] = min(dp[i], dp[i - coin] + 1) (選湊出 i 元的最少硬幣數,看最後一枚硬幣選哪個面額)\n5. 回傳答案如果 dp[amount] 還是 inf,代表不可達回傳 -1,否則回傳 dp[amount]\n\n代碼:\n```python\nclass Solution:\n def coinChange(self, coins: List[int], amount: int) -> int:\n dp = [inf] * (amount + 1)\n dp[0] = 0\n for i in range(1, amount+1):\n for coin in coins:\n if i - coin >= 0:\n dp[i] = min(dp[i], dp[i - coin]+1)\n \n return dp[amount] if dp[amount] != inf else -1\n```\n時間複雜度:O(m × n) (m for amount, n for length of coins)\n\n空間複雜度:O(m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3299125872","body":"思維:\n1. 昨天的題目需考慮排列數(考慮順序),今天的題目僅需考慮組合數(不考慮順序)\n2. 定義 dp[i] = 湊出金額 i 的 組合數\n3. dp[0] = 1:湊出 0 元只有一種方式,什麼都不拿,其餘 dp[i] = 0,表示一開始還沒有任何組合\n4. 外層迴圈:逐一考慮硬幣 coin,內層迴圈:從金額 coin 開始到 amount 逐步更新\n5. dp[i] += dp[i - coin]:若要湊出金額 i,可以先用一個 coin,剩下的 i - coin 由之前的組合補上\n6. 避免重複排列,因為外層是硬幣,每一種硬幣只能在自己之後加入,確保順序不會被重複計算\n7. 回傳答案 dp[amount] 即為湊出總金額的組合數\n\n代碼:\n```python\nclass Solution:\n def change(self, amount: int, coins: List[int]) -> int:\n dp = [0] * (amount + 1)\n dp[0] = 1\n for coin in coins:\n for i in range(coin, amount+1):\n dp[i] += dp[i - coin]\n\n return dp[amount]\n```\n時間複雜度:O(m × n) (m for amount, n for length of coins)\n\n空間複雜度:O(m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3301195823","body":"思維:\n1. 排序貪心:把 g(貪心值)與 s(餅乾大小)都排序\n2. 從大的開始配對:i 指向最大餅乾,j 指向最難滿足的小孩\n3. 若 s[i] >= g[j],就把這片大餅乾給這個小孩,否則,去嘗試滿足下一個(較不貪心)孩子\n5. 結束條件:任一方用完即停止,輸出成功配對數 res\n\n代碼:\n```python\nclass Solution:\n def findContentChildren(self, g: List[int], s: List[int]) -> int:\n g.sort()\n s.sort()\n i = len(s)-1\n j = len(g)-1\n res = 0\n \n while i >= 0 and j >= 0:\n if s[i] >= g[j]:\n res += 1\n i -= 1\n j -= 1\n\n return res\n```\n時間複雜度:O(nlogn+mlogm) (sorting)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3305048523","body":"思維:\n1. 先依 start 排序,若 start 相同則依 end 排序\n2. 用 prev_end 記錄上一次保留的區間結束\n3. 遍歷:如果當前區間 cur_start < prev_end → 代表重疊\n4. 若 cur_end < prev_end → 保留更早結束的區間(更新 prev_end)\n5. 不管怎樣,重疊就要刪掉一個,res += 1\n6. 否則(不重疊) → 更新 prev_end = cur_end\n7. 回傳刪除數量\n\n代碼:\n```python\nclass Solution:\n def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:\n intervals = sorted(intervals)\n prev_end = intervals[0][1]\n res = 0\n\n for i in range(1, len(intervals)):\n cur_start, cur_end = intervals[i]\n if cur_start < prev_end:\n if cur_end < prev_end:\n prev_end = cur_end\n res += 1\n else:\n prev_end = cur_end\n \n return res\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3310296356","body":"思維:\n1. 初始化設定 farthest = 0,代表目前能到達的最遠位置(初始只能到 index 0)\n2. 遍歷陣列依序檢查每個位置檢查是否可達:i = 當前所在索引,step = 在這個位置能往前跳的最大步數\n3. 如果 i > farthest,表示這個位置已經超過了之前能到的最遠範圍 → 代表根本走不到這裡 → 直接回傳 False\n4. 否則更新最遠範圍 farthest = max(farthest, i + step)\n5. 結束迴圈能完整跑完,代表沒有遇到無法到達的位置,直接回傳 True(一定能到達最後一格)\n\n代碼:\n```python\nclass Solution:\n def canJump(self, nums: List[int]) -> bool:\n farthest = 0\n for i, step in enumerate(nums):\n if i > farthest:\n return False\n farthest = max(farthest, i + step)\n return True\n```\n時間複雜度:O(n)\n\n空間複雜度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/73#issuecomment-3317351262","body":"思維:\n1. Base Case: n=1 → [1]、n=2 → [1,2]\n2. 把問題拆成奇數子問題 (長度 = (n+1)//2) 和偶數子問題 (長度 = n//2),避免等差數列的產生\n3. 奇數組跟偶數組內分別都是從一個更小的 beautiful array 轉換來的,本身不會產生違規的等差數列\n4. 如果一邊是奇數、一邊是偶數,它們的平均數會是小數(不是整數),但我們的陣列只包含整數,不可能命中,所以跨組之間絕對安全\n5. 奇數子問題的結果全部轉換成奇數(2*x-1)\n6. 偶數子問題的結果全部轉換成偶數(2*x)\n7. 把奇數陣列與偶數陣列串接在一起,得到長度 n 的 beautiful array\n\n代碼:\n```python\nclass Solution:\n def beautifulArray(self, n: int) -> List[int]:\n if n == 1:\n return [1]\n if n == 2:\n return [1, 2]\n\n odd_arr = [x*2 -1 for x in self.beautifulArray((n+1) // 2)]\n even_arr = [x*2 for x in self.beautifulArray(n // 2)]\n \n return odd_arr + even_arr\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322731377","body":"思維:\n1. 所有數字 XOR 一遍,因為成對的數字會抵消掉 (a ^ a = 0),最後剩下的是 xor_all = x ^ y\n2. 這裡的 x, y 就是我們要找的兩個只出現一次的數字\n3. 找到一個區分 x, y 的 bit,因為 x != y,xor_all 至少有一個 bit = 1,代表 x 和 y 在那一位不同\n4. 用 diff_bit = xor_all & (-xor_all) 取出最低 set bit (最右邊的 1)\n5. 根據這個 diff_bit 把數字分組,如果 (num & diff_bit) != 0 → 放在組 A,否則 → 放在組 B\n6. 各組再 XOR 一遍,成對數字會互相抵消,只剩下唯一的 x 或 y\n7. 最後兩組結果就是 [x, y]\n\n代碼:\n```python\nclass Solution:\n def singleNumber(self, nums: List[int]) -> List[int]:\n xor_all = 0\n for num in nums:\n xor_all ^= num\n\n diff_bit = xor_all & (-xor_all)\n\n x, y = 0, 0\n for num in nums:\n if num & diff_bit:\n x ^= num\n else:\n y ^= num\n\n return [x, y]\n```\n時間複雜度:O(n)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3326355904","body":"思維:\n1. 把長度為 n 的陣列 nums 想成有 n 個開關(bit),一個整數 mask 的二進位表示,就代表一個子集合,mask 從 0 走到 (1<> i) & 1 == 1,代表第 i 位被選中 → subset.append(nums[i]),最後把 subset 加進 res\n4. 回傳結果 res\n\n代碼:\n```python\nclass Solution:\n def subsets(self, nums: List[int]) -> List[List[int]]:\n n = len(nums)\n res = []\n for mask in range(1 << n):\n subset = []\n for i in range(n):\n if (mask >> i) & 1:\n subset.append(nums[i])\n res.append(subset)\n\n return res\n```\n時間複雜度:O(n · 2^n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3332654533","body":"思維:\n1. TrieNode 結構:children 字典,用來存放「下一個字元 → 子節點」,hasword 標記當前節點是否對應一個完整單詞\n2. Trie 主類別:insert(word) 從 root 出發逐字檢查,若不存在就新建節點,最後節點標記 hasword = True\n3. search(word) 從 root 出發逐字檢查,若遇到缺失字元,直接回傳 False,結束後檢查最後節點的 hasword,若 True 表示單詞存在\n4. startsWith(prefix) 與 search 類似,但不需檢查 hasword,只要能走到 prefix 的最後一個節點就回傳 True\n\n代碼:\n```python\nclass TrieNode:\n def __init__(self):\n self.children = {}\n self.hasword = False\n\n\nclass Trie:\n def __init__(self):\n self.head = TrieNode()\n \n def insert(self, word: str) -> None:\n cur = self.head\n for c in word:\n if c not in cur.children:\n cur.children[c] = TrieNode()\n cur = cur.children[c]\n cur.hasword = True\n\n def search(self, word: str) -> bool:\n cur = self.head\n for c in word:\n if c not in cur.children:\n return False\n cur = cur.children[c]\n\n return cur.hasword\n\n def startsWith(self, prefix: str) -> bool:\n cur = self.head\n for c in prefix:\n if c not in cur.children:\n return False\n cur = cur.children[c]\n return True\n \n\n# Your Trie object will be instantiated and called as such:\n# obj = Trie()\n# obj.insert(word)\n# param_2 = obj.search(word)\n# param_3 = obj.startsWith(prefix)\n```\n時間複雜度:O(n) (Insert, search, startsWith)\n\n空間複雜度:O(n) (Insert) / O(1) (search, startsWith)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3337545631","body":"思維:\n1. TrieNode 結構:children 存子節點,precount 紀錄該節點以下所有 key 對應值的總和(前綴總和),count 紀錄如果這裡是完整單字,記錄它的 value\n2. insert(key, val):逐字往下走,若不存在就新建節點,每走過一個節點 → precount += val(加上新值)\n3. 如果這個 key 之前沒出現過 → 直接存 count = val,如果 key 已經存在 → 先取出舊值 deduct = cur.count,再更新 count = val\n4. 最後重新走一遍 key,把前綴總和扣掉原本的舊值 precount -= deduct\n5. sum(prefix):從 root 開始逐字走 prefix,如果 prefix 路徑不存在 → 回傳 0,如果存在 → 回傳最後節點的 precount\n\n代碼:\n```python\nclass TrieNode:\n def __init__(self):\n self.children = {}\n self.precount = 0\n self.count = 0\n\nclass MapSum:\n\n def __init__(self):\n self.head = TrieNode()\n\n def insert(self, key: str, val: int) -> None:\n cur = self.head\n for c in key:\n if c not in cur.children:\n cur.children[c] = TrieNode()\n cur = cur.children[c]\n cur.precount += val\n\n if not cur.count:\n cur.count = val\n else:\n deduct = cur.count\n cur.count = val\n cur = self.head\n for c in key:\n cur = cur.children[c]\n cur.precount -= deduct\n \n\n def sum(self, prefix: str) -> int:\n cur = self.head\n for c in prefix:\n if c not in cur.children:\n return 0\n cur = cur.children[c]\n return cur.precount\n\n\n# Your MapSum object will be instantiated and called as such:\n# obj = MapSum()\n# obj.insert(key,val)\n# param_2 = obj.sum(prefix)\n```\n時間複雜度:O(n) (Insert, sum)\n\n空間複雜度:O(n) (Insert) / O(1) (sum)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3355772609","body":"思維:\n1. 任何不包含 1 的子樹應該被刪掉,若節點值是 0,且左右子樹都不存在或都被刪光,那這個節點也該刪\n2. 從下往上考慮 → 遞迴後序遍歷 (post-order),先處理左右子樹,回傳「修剪後的子樹」,再決定當前節點要不要刪除\n3. 若節點是 None,直接回傳 None\n4. 遞迴:修剪左子樹 root.left = pruneTree(root.left)、修剪右子樹 root.right = pruneTree(root.right)\n5. 判斷若 root.val == 0 且 root.left == None 且 root.right == None → 回傳 None,否則保留節點\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def pruneTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:\n if not root:\n return None\n\n root.left = self.pruneTree(root.left)\n root.right = self.pruneTree(root.right)\n\n if root.val == 0 and not root.left and not root.right:\n return None\n\n return root\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null],"zechengze":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074243047","body":"### Time complexity\nO(max(n, log₁₀(k)))\n\n### Space complexity\nO(max(n, log₁₀(k)))\n\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n ans = []\n n = len(num)\n carry = 0\n i = n - 1\n while k > 0 or i >= 0 or carry > 0:\n sum = carry\n if k > 0:\n rem = k % 10\n sum += rem\n k //= 10\n if i >= 0:\n sum += num[i]\n i -= 1\n carry = sum // 10\n ans.insert(0, sum % 10)\n return ans","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092419843","body":"使用兩個 stack:\n- in_stack: 用來接收 push\n- out_stack: 用來處理 pop 和 peek\n- 當 out_stack 為空時,將 in_stack 的所有元素彈出並倒序放入 out_stack,用來模擬 queue 的 FIFO\n\n - push:O(1)\n - pop:O(1)\n - peek:O(1)\n - empty :O(1)\n\n---\n\n### Python code\n\n```python\nclass MyQueue:\n\n def __init__(self):\n self.in_stack = []\n self.out_stack = []\n\n def push(self, x: int) -> None:\n self.in_stack.append(x)\n\n def pop(self) -> int:\n self.peek() # 確保 out_stack 有東西\n return self.out_stack.pop()\n\n def peek(self) -> int:\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack[-1]\n\n def empty(self) -> bool:\n return not self.in_stack and not self.out_stack","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109185662","body":"### 解題思路\n- 先統計整個 linked list 長度。\n- 使用遞迴,每次選擇區間的中間當作 root。\n- 左子樹遞迴後才處理當前節點。\n\n時間 O(n) 每個節點遍歷一次\n\n```python\nclass Solution:\n def sortedListToBST(self, head: ListNode) -> TreeNode:\n def getLength(node: ListNode) -> int:\n length = 0\n while node:\n length += 1\n node = node.next\n return length\n\n def buildBST(start: int, end: int) -> TreeNode:\n nonlocal head\n if start > end:\n return None\n\n mid = (start + end) // 2\n # 先建左子樹\n left = buildBST(start, mid - 1)\n\n # 再建 root(中序)\n root = TreeNode(head.val)\n head = head.next\n\n # 最後建右子樹\n root.left = left\n root.right = buildBST(mid + 1, end)\n return root\n\n length = getLength(head)\n return buildBST(0, length - 1)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124485354","body":"### 思路\n- 遞迴 DFS\n- 如果節點為空,深度為 0。\n- 遞迴左右子樹的最大深度,取最大值後 +1。\n\n---\n\n### 遞迴 DFS(Top-down)\n\n```python\nclass Solution:\n def maxDepth(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136873834","body":"### BFS(反向遍歷)\n\n- 一般 BFS 是左先入,改為右先入左後入\n- 最後訪問的節點就是最底層最左側的節點\n- 每次 `popleft()` 拿出的節點覆蓋 `leftmost`\n- 時間複雜度 : O(n)\n---\n\n```python\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n if not root:\n return None\n \n queue = deque([root])\n leftmost = None\n\n while queue:\n leftmost = queue.popleft()\n if leftmost.right:\n queue.append(leftmost.right)\n if leftmost.left:\n queue.append(leftmost.left)\n\n return leftmost.val\n","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146260024","body":"### 解題思路:哈希表(一次遍歷)\n\n1. 初始化一個空dict h\n2. 遍歷陣列 nums,對每個元素 nums[i]:\n - 計算 plus = target - nums[i]\n - 如果 plus 的值在字典中,回傳 [h[plus], i]\n - else 將 nums[i] 存入 dict 中\n\n- 時間、空間複雜度:O(n)\n\n---\n```python\nclass Solution:\n def twoSum(self, nums: List[int], target: int) -> List[int]:\n h = {}\n for i in range(len(nums)):\n plus = target - nums[i]\n if plus in h:\n return [h[plus], i]\n else:\n h[nums[i]] = i","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148509431","body":"### 解題思路:哈希表 + 排序\n\n1. 先用 dict 統計每個元素出現的次數\n2. 使用 sorted 對 dict 依據頻率降序排序\n3. 取出前 k 個 keys 回傳\n\n- 時間複雜度:O(n log n)\n\n---\n\n```python\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n h_map = {}\n for i in nums:\n if i in h_map:\n h_map[i] += 1\n else:\n h_map[i] = 1\n\n h_map = dict(sorted(h_map.items(), key=lambda x: x[1], reverse=True))\n ans = list(h_map.keys())[:k]\n return ans\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170662667","body":"## 解題思路\n陣列已排序,相同的元素一定會相鄰,因此可以使用雙指針: \n1. 設定指標 `init` 指向下個唯一值要放置的位置,初始為 1。 \n2. 從第二個元素開始遍歷,若與前一個元素不同,則將該元素放到 `init` 位置並將 `init` 加 1。 \n3. 最後 `init` 即為去重後的長度。\n\n---\n\n## 時間複雜度\n- **O(n)**:只需遍歷一次陣列。\n\n## 空間複雜度\n- **O(1)**:在原陣列上進行操作,未使用額外空間。\n\n---\n\n## 程式碼\n```python\nfrom typing import List\n\nclass Solution:\n def removeDuplicates(self, nums: List[int]) -> int:\n init = 1\n for i in range(1, len(nums)):\n if nums[i] != nums[i - 1]:\n nums[init] = nums[i]\n init += 1\n return init\n```\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182007045","body":"### 解題思路\n1. 將 `dislikes` 轉換為 **圖的鄰接表** `dislike_table`。\n2. 使用顏色標記(`BLUE = 1`, `GREEN = -1`)來表示兩組人。\n3. 對每個尚未染色的人進行 DFS:\n - 將當前人染色為某一顏色。\n - 對於他不喜歡的人,必須染成相反顏色。\n - 如果發現相鄰節點顏色與自己相同,則表示無法二分。\n4. 如果所有人都能正確染色,則回傳 `True`。\n\n---\n\n```python\nfrom collections import defaultdict\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, N: int, dislikes: List[List[int]]) -> bool:\n BLUE, GREEN = 1, -1\n \n def draw(person_id, color):\n color_of[person_id] = color\n for the_other in dislike_table[person_id]:\n if color_of[the_other] == color:\n return False\n if not color_of[the_other] and not draw(the_other, -color):\n return False\n return True\n \n if N == 1 or not dislikes:\n return True\n \n dislike_table = defaultdict(list)\n color_of = defaultdict(int)\n \n for p1, p2 in dislikes:\n dislike_table[p1].append(p2)\n dislike_table[p2].append(p1)\n \n for person_id in range(1, N + 1):\n if not color_of[person_id] and not draw(person_id, BLUE):\n return False\n \n return True","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mr-kient":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074503694","body":"### 【Day 1】989. 数组形式的整数加法\n\n#### Main Idea\n\n1. Since the length of `num` can reach 10000, a brute-force approach of adding each digit of `num` multiplied by 10^[n-i] to form a number and then adding it to K is not feasible, as it would cause an overflow.\n\n2. We can simulate manual vertical calculation by reversing the array and starting the addition from the last digit of both `num` and `k`.\n\n3. Set a global variable `ex` to determine if a carry is needed when adding each digit.\n\n > [!NOTE]\n > Remember to check if there is a carry after adding the first digit.\n\n4. If an array index exceeds the limit, treat it as 0; if `k` is shorter than `num`, treat the remaining digits of `k` as 0.\n\n\n#### Code\n\n```cpp\nclass Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n int n = num.size();\n vector res;\n int ex = 0;\n int i = n - 1;\n\n while (i >= 0 || k > 0) {\n int x = (i >= 0) ? num[i] : 0; //k可能比num长\n int y = k % 10;\n int sum = x + y + ex;\n res.push_back(sum % 10);\n ex = sum / 10;\n k /= 10;\n i--;\n }\n\n if (ex)\n res.push_back(ex);\n\n reverse(res.begin(), res.end());\n\n return res;\n }\n};\n```\n\n#### Complexity\n\n$O(Max(num.size(), log(k)))$","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3076134448","body":"### **【Day 2】821. 字符的最短距离**\n\n#### Main idea\n\n1. Two linear traversals: The first one records the distance from each `s[i]` to the previous `c` from left to right; The second time, from right to left, update the minimum distance compared to the previous distance\n2. ⚠️ Note: During the two initializations, the first initialization should be very small because there will be no appearance of `c` after traversing to the right for a long time. If the setting is not small enough, it will result in an insufficiently large distance value, which will affect the update of the correct value from right to left in the second traversal\n\n```cpp\nclass Solution {\npublic:\n vector shortestToChar(string s, char c) {\n int n = s.size();\n vector res(n, n);\n int c_id = -n;\n\n for (int i = 0; i < n; i++) {\n\n if (s[i] == c) {\n c_id = i;\n }\n res[i] = i - c_id;\n }\n\n c_id = 2 * n;\n\n for (int j = n - 1; j >= 0; j--) {\n if (s[j] == c) {\n c_id = j;\n }\n\n res[j] = min(res[j], c_id - j);\n }\n\n return res;\n }\n};\n```\n\n#### Complexity\n\nLoop twice: $O(2*s.szie())$","onTime":true},null,null,null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124415547","body":"### 【Day 13】[104. 二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/)\n\n#### Main Idea \n\n1. 首先考虑到递归即遍历二叉树的左右子树,计算每个节点的左右子树的最大深度\n\n - **递归终止条件**:如果当前节点为空,则返回0(表示当前路径长度为0)。\n - **递归逻辑**:对于当前节点,递归计算左子树的最大深度和右子树的最大深度,取较大值并加1(当前节点本身)\n - **时间复杂度**:O(n),其中n是二叉树的节点总数。每个节点被访问一次。\n\n2. DFS\n\n ```c++\n /**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\n \n class Solution {\n public:\n int maxDepth(TreeNode* root) {\n if (!root) return 0;\n \n std::stack> s;\n s.push({root, 1});\n int max_depth = 0;\n \n while (!s.empty()) {\n auto [node, depth] = s.top();\n s.pop();\n max_depth = std::max(max_depth, depth);\n \n if (node->left) {\n s.push({node->left, depth + 1});\n }\n if (node->right) {\n s.push({node->right, depth + 1});\n }\n }\n \n return max_depth;\n }\n };\n ```\n\n \n\n#### 时间复杂度\n\n要计算二叉树的最大深度,必须访问每一个节点一次,因为最长路径可能出现在任意位置。**没有比O(n)更优的时间复杂度**,因为无论如何都需要遍历所有节点以确认最长路径。","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146453148","body":"### 【Day 19】两数之和\n\n#### Main Idea\n\n1. **暴力枚举**\n - 遍历数组中的每一个元素 `nums[i]`,再对其后续所有元素 `nums[j]`(`j > i`)进行遍历,判断 `nums[i] + nums[j] == target` 时返回 `[i, j]`。\n - **时间复杂度**:O(n²),最坏情况下需要检查所有的元素对。\n2. **哈希表(一遍扫描)**\n - 利用一个哈希表 `mp` 存储 <数值 → 下标 >的映射。\n - 遍历数组,令 `complement = target - nums[i]`:\n - 如果哈希表中已存在 `complement`,说明之前遇到过这么一个数,二者之和等于 `target`,直接返回对应的下标。\n - 否则将当前元素 `nums[i]` 及其下标 `i` 存入哈希表,继续扫描。\n - **优点**:一次遍历搞定,时间和空间都最优。\n\n```c++\n#include \n#include \nusing namespace std;\n\nclass Solution {\npublic:\n vector twoSum(vector& nums, int target) {\n unordered_map mp; // 存储 已访问的数值 → 下标\n for (int i = 0; i < nums.size(); ++i) {\n int complement = target - nums[i];\n // 如果哈希表中已有 complement,则直接返回答案\n if (mp.find(complement) != mp.end()) {\n return { mp[complement], i };\n }\n // 否则将当前数及下标存入\n mp[nums[i]] = i;\n }\n return {}; // 根据题意不会走到这里\n }\n};\n```\n\n#### 时间复杂度\n\n- **哈希表解法**:O(n),只需一次遍历即可完成查找与存储操作。\n- **空间复杂度**:O(n),最坏情况下哈希表需存储 n 个元素。","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168242525","body":"Main Idea\n\n1. 快慢指针法\n\n设置两个指针 slow 和 fast,初始都指向链表头结点。\n\nfast 每次向前移动 两步,slow 每次向前移动 一步。\n\n当 fast 到达链表末尾时,slow 恰好位于链表的中间位置。\n\n由于题目要求 当有两个中间结点时返回第二个,快慢指针法天然满足这一条件:当链表长度为偶数时,fast 会先到 NULL,此时 slow 指向的就是第二个中间结点。\n\n\n\n2. 时间复杂度\n\nO(n):每个结点最多被访问一次(快指针访问 n/2 次,慢指针访问 n 次)。\n\n\n\n3. 空间复杂度\n\nO(1):只使用了两个额外指针,不需要额外的数据结构。\n\n\n\n\n\n---\n\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode() : val(0), next(nullptr) {}\n * ListNode(int x) : val(x), next(nullptr) {}\n * ListNode(int x, ListNode *next) : val(x), next(next) {}\n * };\n */\nclass Solution {\npublic:\n ListNode* middleNode(ListNode* head) {\n ListNode* slow = head;\n ListNode* fast = head;\n while (fast != nullptr && fast->next != nullptr) {\n slow = slow->next; // 慢指针走一步\n fast = fast->next->next; // 快指针走两步\n }\n return slow; // slow 即为中间结点\n }\n};\n\n\n---\n\n时间复杂度分析\n\n访问链表的所有节点至少需要一次遍历,因此 没有比 O(n) 更优的时间复杂度。\n\n快慢指针法通过一次遍历同时得到中间节点,避免了额外的存储或两次遍历,比先统计长度再走一半更高效。\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3188424726","body":"#### Main Idea\n\n1. **把未分组项目“补组”**:对 `group[i] == -1` 的项目,给它们分配新的组号(从 `m` 开始递增),这样每个项目都有归属组,最终组的总数记为 `G`。\n2. **两层拓扑排序(Group 拓扑 + Item 拓扑)**:\n\n * **项目层图**:对每条依赖 `u ∈ beforeItems[v]`,连边 `u → v`,统计项目入度。\n * **组层图**:若 `group[u] != group[v]`,再在组图里连边 `group[u] → group[v]`,统计组入度。\n * **先对项目图做一次拓扑排序(得到全局项目顺序)**,再对组图做一次拓扑排序(得到组顺序)。\n3. **按组拼接**:将“项目拓扑序”按照其组别分桶(保持项目拓扑中的相对顺序),再按“组拓扑序”依次把每个桶拼接起来即为答案。\n4. **不可行判定**:任一拓扑排序失败(存在环)则返回空数组。\n\n* **关键点**:跨组依赖只影响组与组的先后关系(由组图保证),组内项目的详细先后由项目图保证。用“两层图”可同时满足“组块相邻”和“依赖有序”。\n\n---\n\n2. **实现**\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n vector sortItems(int n, int m, vector& group, vector>& beforeItems) {\n // 1) 给未分组的项目分配新组号\n int gid = m;\n for (int i = 0; i < n; ++i) {\n if (group[i] == -1) group[i] = gid++;\n }\n int G = gid; // 组总数\n\n // 2) 建立项目图 & 组图\n vector> itemAdj(n), groupAdj(G);\n vector itemIn(n, 0), groupIn(G, 0);\n\n for (int v = 0; v < n; ++v) {\n for (int u : beforeItems[v]) {\n itemAdj[u].push_back(v);\n itemIn[v]++;\n if (group[u] != group[v]) {\n groupAdj[group[u]].push_back(group[v]);\n groupIn[group[v]]++;\n }\n }\n }\n\n // 通用 Kahn 拓扑\n auto topo = [](const vector>& adj, vector indeg) -> vector {\n int N = (int)adj.size();\n queue q;\n for (int i = 0; i < N; ++i) if (indeg[i] == 0) q.push(i);\n vector order;\n order.reserve(N);\n while (!q.empty()) {\n int x = q.front(); q.pop();\n order.push_back(x);\n for (int y : adj[x]) {\n if (--indeg[y] == 0) q.push(y);\n }\n }\n if ((int)order.size() != N) return {}; // 有环\n return order;\n };\n\n // 3) 分别对 项目图、组图 做拓扑排序\n vector itemOrder = topo(itemAdj, itemIn);\n if (itemOrder.empty()) return {};\n vector groupOrder = topo(groupAdj, groupIn);\n if (groupOrder.empty()) return {};\n\n // 4) 按项目拓扑序分桶到各组里,保持项目相对次序\n vector> bucket(G);\n for (int x : itemOrder) bucket[group[x]].push_back(x);\n\n // 5) 按组拓扑序拼接\n vector ans;\n ans.reserve(n);\n for (int g : groupOrder) {\n for (int x : bucket[g]) ans.push_back(x);\n }\n return ans;\n }\n};\n```\n\n#### 时间复杂度\n\n* 建图与两次拓扑排序总计 **O(n + E)**,其中 `E = Σ |beforeItems[i]|`。\n* 额外空间用于邻接表、入度数组与分桶,均为 **O(n + E + G)**。\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3205439203","body":"#### Main Idea\n\n1. **线性扫描 (超时)**\n - 从 0 开始向上遍历整数 `i`。\n - 检查 `i * i` 的值。当第一次出现 `i * i > x` 时,那么 `i-1` 就是我们要求的平方根的整数部分。\n - **注意**:`i * i` 的计算可能会导致整数溢出。为避免此问题,应将判断条件改为 `i > x / i`。\n - **缺点**:当 `x` 非常大时,循环次数过多,会导致执行超时,无法通过所有测试用例。\n\n2. **二分查找**\n - `x` 的平方根一定在 `[0, x]` 这个区间内。\n - 我们可以将问题转化为:**在一个有序的范围内(`0` 到 `x`),寻找最大的整数 `k`,使得 `k² <= x`**。\n - 这正是二分查找的经典应用场景。设置搜索区间的左右边界 `left` 和 `right`,计算中间值 `mid`:\n - 如果 `mid² <= x`,说明 `mid` 是一个可能的解,但我们还想尝试更大的值,因此记录当前解,并在右半部分继续搜索:`ans = mid`, `left = mid + 1`。\n - 如果 `mid² > x`,说明 `mid` 太大了,解一定在左半部分,因此缩小搜索范围:`right = mid - 1`。\n - **优点**:每次都将搜索范围减半,时间复杂度低,效率极高。\n\n```c++\nclass Solution {\npublic:\n int mySqrt(int x) {\n if (x == 0) {\n return 0;\n }\n\n int left = 1, right = x;\n int ans = 0;\n\n while (left <= right) {\n int mid = left + (right - left) / 2;\n\n // 为防止 mid * mid 溢出,使用除法来判断\n // mid <= x / mid 等价于 mid * mid <= x\n if (mid <= x / mid) {\n ans = mid; // mid 是一个可能的解\n left = mid + 1; // 尝试在右侧寻找更大的解\n } else {\n right = mid - 1; // mid 太大,到左侧去寻找\n }\n }\n return ans;\n }\n};\n```\n\n#### 时间复杂度\n\n- **二分查找解法**:O(log n),其中 n 为输入值 `x`。二分查找每次都将搜索空间减半,因此时间复杂度是对数级别的。\n- **空间复杂度**:O(1),解法只使用了常数个额外变量,与输入 `x` 的大小无关。","onTime":true},null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3237241808","body":"#### Main Idea\n\n1. 滑动窗口 + 计数\n\n - 用两个计数器统计字符需求:`need[c]` 表示目标串 `t` 中每个字符需要的数量,`have[c]` 表示当前窗口中已有的数量。\n - 扩张右端:右指针 `r` 逐步右移,把字符加入窗口,并在 `have[c]` 达到 `need[c]` 时,更新已满足的种类数 `formed`。\n - 收缩左端:当窗口已满足 `t` 的全部字符需求(`formed == required`,其中 `required` 为 `t` 中不同字符的个数)时,尽量左移 `l` 缩小窗口并更新最优答案。\n - 唯一性:题目保证若存在答案则唯一,我们只需在收缩时维护最短长度即可。\n\n ```cpp\n #include \n using namespace std;\n \n class Solution {\n public:\n string minWindow(string s, string t) {\n if (t.empty() || s.size() < t.size()) return \"\";\n \n // 统计目标需求\n vector need(128, 0), have(128, 0);\n int required = 0; // 需要满足的不同字符的种类数\n for (char c : t) {\n if (need[c] == 0) required++;\n need[c]++;\n }\n \n int formed = 0; // 当前窗口中已满足 need 的种类数\n int bestLen = INT_MAX, bestL = 0;\n int l = 0;\n \n for (int r = 0; r < (int)s.size(); ++r) {\n char cr = s[r];\n have[cr]++;\n \n // 当某字符数量刚好达到需求,更新 formed\n if (need[cr] > 0 && have[cr] == need[cr]) {\n formed++;\n }\n \n // 若已满足所有字符需求,尽量收缩左端\n while (formed == required) {\n if (r - l + 1 < bestLen) {\n bestLen = r - l + 1;\n bestL = l;\n }\n char cl = s[l];\n have[cl]--;\n // 收缩导致某字符不足,formed 减一\n if (need[cl] > 0 && have[cl] < need[cl]) {\n formed--;\n }\n l++;\n }\n }\n \n return bestLen == INT_MAX ? \"\" : s.substr(bestL, bestLen);\n }\n };\n ```\n\n#### 时间复杂度\n\n双指针各自只右移且不回退,整体 **O(m + n)**;计数数组为常数空间。","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240735616","body":"#### Main Idea\n\n1. **逐行放置**\n - 每一行选择一个不与已放皇后冲突的列。冲突规则:同列、主对角线(r−c)、次对角线(r+c)。\n - **递归终止**:当行号 `row == n`,说明已成功放置 n 个皇后,计数 +1。\n - **选择与撤销**:在当前行尝试所有合法列,递归下一行,回退继续尝试。\n2. **位运算优化**\n - 用 n 位二进制位掩码表示列与对角线占用:\n - `cols`:哪些列被占。\n - `diag1`:主对角线占用(相当于下一行左移一位)。\n - `diag2`:次对角线占用(相当于下一行右移一位)。\n - 可放置位置:`bits = ~(cols | diag1 | diag2) & mask`,其中 `mask = (1<> 1`。\n\n#### 回溯 + 位运算\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int totalNQueens(int n) {\n int mask = (1 << n) - 1;\n return dfs(0, 0, 0, 0, mask, n);\n }\n\nprivate:\n // row: 当前行号;cols/diag1/diag2:占用掩码;mask:仅保留 n 位\n int dfs(int row, int cols, int diag1, int diag2, int mask, int n) {\n if (row == n) return 1;\n\n int count = 0;\n int bits = (~(cols | diag1 | diag2)) & mask; // 当前行可放置的位置集合\n\n while (bits) {\n int p = bits & -bits; // 取最低位可行位置\n bits -= p; // 移除该位置\n\n count += dfs(row + 1,\n cols | p,\n ((diag1 | p) << 1) & mask, // 主对角线左移并截断\n (diag2 | p) >> 1, // 次对角线右移\n mask, n);\n }\n return count;\n }\n};\n```\n\n#### 时间复杂度\n\n- **时间**:回溯搜索的上界接近 **O(n!)**,但位运算将冲突判断降为 O(1) 常数,n ≤ 9 时非常快。\n- **空间**:**O(n)**(递归深度 n,掩码为常数额外空间)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247569627","body":"#### Main Idea\n\n1. BFS(从所有陆地同时出发)\n\n * 把所有值为 `1` 的格子(陆地)一起入队,距离视作 0;像海浪一样一圈圈向外扩散。\n * 第一次被扩散到的海洋格子的距离,就是它到最近陆地的最短曼哈顿距离。\n * 最后被访问到的海洋格子的距离即为答案。\n * **边界**:若全为陆地或全为海洋,返回 `-1`。\n\n2. 实现\n\n ```cpp\n #include \n using namespace std;\n\n class Solution {\n public:\n int maxDistance(vector>& grid) {\n int n = grid.size();\n queue> q;\n vector> dist(n, vector(n, -1));\n\n // 把所有陆地入队,距离置 0\n for (int i = 0; i < n; ++i) {\n for (int j = 0; j < n; ++j) {\n if (grid[i][j] == 1) {\n q.push({i, j});\n dist[i][j] = 0;\n }\n }\n }\n\n // 若全海或全陆,直接返回 -1\n if (q.empty() || (int)q.size() == n * n) return -1;\n\n int ans = -1;\n int dirs[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};\n\n // 多源 BFS\n while (!q.empty()) {\n auto [x, y] = q.front(); q.pop();\n for (auto& d : dirs) {\n int nx = x + d[0], ny = y + d[1];\n if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue;\n if (dist[nx][ny] != -1) continue; // 访问过\n dist[nx][ny] = dist[x][y] + 1; // 最近陆地距离\n ans = max(ans, dist[nx][ny]);\n q.push({nx, ny});\n }\n }\n return ans;\n }\n };\n ```\n\n#### 时间复杂度\n\n* 时间:每个格子最多入队一次,四邻检查常数次,整体 **O(N²)**。\n\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263627488","body":"#### Main Idea\n\n1. **线性决策(相邻不能同抢)**\n\n * 到第 `i` 间房时只有两种选择:\n\n * **不抢它**:收益等于前一间的最佳收益 `dp[i-1]`\n * **抢它**:收益等于“到 i-2 的最佳收益 + 本屋金额” → `dp[i-2] + nums[i]`\n * 所以转移式:`dp[i] = max(dp[i-1], dp[i-2] + nums[i])`\n2. **初值与边界**\n\n * 空数组 → 答案 `0`\n * `dp[0] = nums[0]`\n * `dp[1] = max(nums[0], nums[1])`(如果存在)\n3. **滚动变量优化空间**\n\n * 只依赖 `i-1` 和 `i-2`,用两个变量就够了:\n\n * `prev2` 表示 `dp[i-2]`,`prev1` 表示 `dp[i-1]`\n * 新值 `cur = max(prev1, prev2 + nums[i])`,随后前移指针\n\n#### 动态规划(滚动变量,O(1) 空间)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int rob(vector& nums) {\n if (nums.empty()) return 0;\n int n = nums.size();\n if (n == 1) return nums[0];\n\n int prev2 = 0; // dp[i-2]\n int prev1 = 0; // dp[i-1]\n for (int x : nums) {\n int cur = max(prev1, prev2 + x);\n prev2 = prev1;\n prev1 = cur;\n }\n return prev1;\n }\n};\n```\n\n#### 时间复杂度\n\n* **时间**:`O(n)`(单次线性扫描)\n* **空间**:`O(1)`(滚动变量),如需恢复路径则 `O(n)` 用于记录选择","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3284142988","body":"#### Main idea\n\n**把局面想成“还差多少 + 已用过哪些数”**\n\n- 每次你从公共池里挑一个数,目标值就相应减少;被挑过的数以后都不能再用。\n- 于是每一步其实就是在“还差的分数”和“哪些数已被拿走”的组合之间转换。\n\n**当前能赢的充要条件**\n\n- 如果你现在能直接拿到一个数,使得**累计和立刻达到/超过目标**,你马上赢。\n- 否则,你希望找到一个数字,让对手接下来面对的局面是**必输局**。\n 换句话说:**存在**一个选择能把对手“送进死局”,那你这一步就是必赢;\n 如果**所有**选择都会把对手“送进稳赢局”,那你这一步就是必输。\n\n**两条简单但很有用的剪枝**\n\n- **总和不够就别想了**:如果 1 到 `maxChoosableInteger` 的总和都达不到目标,先手必输。\n- **目标非正直接赢**:如果目标本来就 ≤ 0(或被前人操作减到 ≤ 0),先手已满足条件,直接判赢。\n\n**记住算过的局面,别重复思考(记忆化)**\n\n- 同一组“已用过的数字 + 还差多少”的局面,赢或输的结论是固定的。\n- 把每个局面的输赢结果记下来,后面再遇到就直接用,避免在相同分支上反复推演。\n\n**直觉理解(以示例 1 为例)**\n\n- `max=10, 目标=11`:无论先手先拿哪个数 `x`,后手都能立刻拿到 `11-x`(且该数仍在 1..10 且未被用),直接结束游戏。\n- 所以先手无解——这就是“把对手送进稳赢局”在反方向上的体现。\n\n#### Implementation(cpp)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n bool canIWin(int maxChoosableInteger, int desiredTotal) {\n if (desiredTotal <= 0) return true;\n\n int n = maxChoosableInteger;\n int sum = n * (n + 1) / 2;\n if (sum < desiredTotal) return false; // 全拿都不够,必输\n\n // 2^n 状态;-1=未知,0=必败,1=必胜\n vector memo(1 << n, -1);\n return dfs(0, desiredTotal, n, memo);\n }\n\nprivate:\n // mask: 已用集合(第 i 位表示数字 i+1 是否已用)\n // remain: 距离目标还差多少\n bool dfs(int mask, int remain, int n, vector& memo) {\n char &res = memo[mask];\n if (res != -1) return res;\n\n // 枚举当前可选的每个数 i\n for (int i = 1; i <= n; ++i) {\n int bit = 1 << (i - 1);\n if (mask & bit) continue; // 已用,跳过\n if (i >= remain) return res = 1; // 直接到达/超过目标,当前玩家赢\n // 若选 i 之后对手必败,则当前必胜\n if (!dfs(mask | bit, remain - i, n, memo)) return res = 1;\n }\n return res = 0; // 所有选择都会让对手必胜 => 当前必败\n }\n};\n\n```\n\n#### 复杂度\n\nO(n · 2^n)","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3306753472","body":"#### Main Idea\n\n1. **把“最少删除”转化为“最多保留”**\n\n * 经典区间调度:**按右端点升序**排序,**尽可能先选结束早的区间**,就能在不重叠前提下**保留最多**的区间。\n * 需要移除的最小数量 = `总数 n - 能保留的最大不重叠数量 keep`。\n\n2. **为什么按右端点排是最优的**\n\n * 选更早结束的区间,给后面的区间留下**更多起始空间**,不比选结束晚的更差。\n * 可用“**交换论证**”:若最优解里某一步没有选最早结束者,换成结束更早的,不减少可选余地,解仍最优。\n\n3. **边界与定义(开闭性)**\n\n * 本题规定:端点相同只**接触不重叠**(`[1,2]` 与 `[2,3]` 可共存),因此判断不重叠条件是 `start >= lastEnd`。\n * 允许负数坐标;`1 <= n <= 1e5`,需 `O(n log n)` 排序 + `O(n)` 一次扫描。\n\n---\n\n#### 贪心(按右端点排序)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int eraseOverlapIntervals(vector>& intervals) {\n if (intervals.empty()) return 0;\n\n // 1) 按 end 升序排\n sort(intervals.begin(), intervals.end(),\n [](const vector& a, const vector& b){\n if (a[1] != b[1]) return a[1] < b[1];\n return a[0] < b[0];\n });\n\n // 2) 贪心选择:尽量保留更多不重叠区间\n int keep = 0;\n int lastEnd = INT_MIN; // 当前已选集合的最后一个区间的 end\n for (auto &it : intervals) {\n int s = it[0], e = it[1];\n if (s >= lastEnd) { // 与上一个选择不重叠(端点相接也可)\n ++keep;\n lastEnd = e;\n }\n }\n return (int)intervals.size() - keep; // 最少删除 = 总数 - 最多保留\n }\n};\n```\n\n---\n\n#### 等价实现(按左端点排序的“原地计数删谁”)\n\n* 也可以**按起点升序**,一遍扫描:\n\n * 若当前 `s < prevEnd` 发生**重叠** ⇒ 必须删一个;\n * **删谁?** 删右端点更大的那个(保留 `end` 更小者),将 `prevEnd = min(prevEnd, e)`。\n * 计数 `remove++`。\n* 与前法等价,常用于不想单独计“keep”的写法。\n\n```cpp\nint eraseOverlapIntervals(vector>& intervals) {\n if (intervals.empty()) return 0;\n sort(intervals.begin(), intervals.end()); // 默认按 start,再按 end\n\n int remove = 0;\n int prevEnd = intervals[0][1];\n for (int i = 1; i < (int)intervals.size(); ++i) {\n int s = intervals[i][0], e = intervals[i][1];\n if (s < prevEnd) { // 重叠了,需要删一个\n ++remove;\n prevEnd = min(prevEnd, e); // 删 end 较大的那个,保留更早结束\n } else {\n prevEnd = e; // 不重叠,正常推进\n }\n }\n return remove;\n}\n```\n\n#### 复杂度\n\n* 排序 `O(n log n)`,单扫 `O(n)`;总 `O(n log n)`。\n* 额外空间 `O(1)`(除了排序)。\n\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3332731592","body":"#### Main Idea\n\n1. **字母映射到孩子指针(26 叉树)**\n\n * 每个结点保存 `children[26]` 与 `isEnd`。\n * `insert(word)`:从根逐字符走,若孩子不存在就新建;末结点标记 `isEnd = true`。\n * `search(word)`:逐字符走,若中途缺结点则 `false`;走完返回末结点 `isEnd`。\n * `startsWith(prefix)`:逐字符走,若中途缺结点则 `false`;都能走到则 `true`(无需 `isEnd`)。\n\n2. **正确性与边界**\n\n * 仅小写字母 → 直接用 `idx = c - 'a'`。\n * `search` 必须要求完整单词结束处 `isEnd == true`,否则只是前缀命中。\n * 空间按需分配:只有路径上用到的结点才创建。\n\n\n---\n\n#### 实现(C++,指针版)\n\n```cpp\n#include \nusing namespace std;\n\nstruct TrieNode {\n bool isEnd = false;\n TrieNode* ch[26];\n TrieNode() : isEnd(false) {\n memset(ch, 0, sizeof(ch));\n }\n};\n\nclass Trie {\npublic:\n Trie() { root = new TrieNode(); }\n\n // 插入单词\n void insert(const string& word) {\n TrieNode* p = root;\n for (char c : word) {\n int idx = c - 'a';\n if (!p->ch[idx]) p->ch[idx] = new TrieNode();\n p = p->ch[idx];\n }\n p->isEnd = true;\n }\n\n // 完整匹配\n bool search(const string& word) {\n TrieNode* p = walk(word);\n return p && p->isEnd;\n }\n\n // 前缀匹配\n bool startsWith(const string& prefix) {\n return walk(prefix) != nullptr;\n }\n\nprivate:\n TrieNode* root;\n\n // 沿字符串行走,走不到返回空\n TrieNode* walk(const string& s) {\n TrieNode* p = root;\n for (char c : s) {\n int idx = c - 'a';\n if (!p->ch[idx]) return nullptr;\n p = p->ch[idx];\n }\n return p;\n }\n};\n```\n#### 复杂度\n\n * 设字符串长度为 `L`:\n\n * `insert / search / startsWith` 都是 **O(L)**。\n * 空间:创建的结点数 ≤ 所有插入字符串长度之和。\n\n","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"leohongyi":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3076771871","body":"【Day 1】989. 数组形式的整数加法\nmain idea 从最低位开始加,如果还有进位,将其添加到结果前面 使用逆序遍历 range(len(num) - 1, -1, -1) 从数组的最后一个元素(最低位)开始\ndivmod(num[i] + k, 10) 计算当前位置的数字与 k 相加后的结果,返回商和余数 如果处理完数组中所有位后仍有进位(k > 0)\n从 k 中提取最低位数字,并插入到数组最前面\n继续处理 k 的下一位,直到 k 变为 0\n余数 num[i] 保存在当前位置\n商 k 作为进位传递给下一个更高位\n整体时间复杂度为 O(max(n, log k))。\ncode\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n for i in range(len(num) - 1, -1, -1):\n k, num[i] = divmod(num[i] + k, 10)\n \n while k > 0:\n k, digit = divmod(k, 10)\n num.insert(0, digit)\n return num\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077014132","body":"main idea:\n创建 ret 数组,长度为len(s)\n再次遍历s的过程中,我们需要判断当满足以下两点条件时,指针 p 右移一位\np小于arr最大下标\n前下标i 到 p + 1的绝对距离比到 p 的绝对距离小\n每次将 p - i 的绝对距离添加至 ret[i] 中\n\n def shortestToChar(self, s: str, c: str) -> List[int]:\n ret, p, arr = [], 0, [i for i in range(len(s)) if s[i] == c]\n for i, j in enumerate(s):\n if p < len(arr) - 1 and abs(arr[p] - i) > abs(arr[p + 1] - i):\n p += 1\n ret.append(abs(arr[p] - i))\n return ret\nTime Complexity: O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082831029","body":"使用数组的栈结构,self.top作为栈顶指针\n进出栈分别通过简单的数组赋值与读取进行操作\nincrement函数通过一个循环进行赋值操作\nclass CustomStack:\n\n def __init__(self, maxSize: int):\n self.stack = [0]*maxSize\n self.top = -1\n\n def push(self, x: int) -> None:\n if self.top < len(self.stack) - 1:\n self.top += 1\n self.stack[self.top] = x\n\n def pop(self) -> int:\n if self.top is -1:\n return self.top\n else:\n self.top -= 1\n return self.stack[self.top+1]\n \n\n def increment(self, k: int, val: int) -> None:\n for i in range(min(k, self.top + 1)):\n self.stack[i] += val\n\n\n\nTime complexity: O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3092615113","body":"算法步骤:\n利用current string, current number 记录所有不同的括号层级内的string和num;\n使用stk来记录之前的数字和前置str;推荐先push num, 后push str 至 stack;\nO(n)\n代码:\nclass Solution:\n def decodeString(self, s: str) -> str:\n cur_str, cur_num = \"\", \"\"\n stk = []\n for c in s:\n if c.isdigit():\n cur_num += c\n elif c == '[':\n stk.append(cur_str)\n stk.append(cur_num)\n cur_str, cur_num = \"\", \"\"\n elif c == ']':\n cur_str *= int(stk.pop())\n cur_str = stk.pop() + cur_str\n else:\n cur_str += c\n return cur_str\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092624509","body":"算法设计\n加入队尾 push() : 将数字 val 加入栈 A 即可。\n获取队首元素 peek() :\n当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。\n否则,当 A 为空: 即两个栈都为空,无元素,因此返回 -1 。\n否则: 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。\n弹出队首元素 pop() :\n执行 peek() ,获取队首元素。\n弹出 B 的栈顶元素。\n队列判空 empty() : 当栈 A 和 B 都为空时,队列为空。\n\nclass MyQueue:\n\n def __init__(self):\n self.A, self.B = [], []\n\n def push(self, x: int) -> None:\n self.A.append(x)\n\n def pop(self) -> int:\n peek = self.peek()\n self.B.pop()\n return peek\n\n def peek(self) -> int:\n if self.B: return self.B[-1]\n if not self.A: return -1\n # 将栈 A 的元素依次移动至栈 B\n while self.A:\n self.B.append(self.A.pop())\n return self.B[-1]\n def empty(self) -> bool:\n return not self.A and not self.B\n\n\n# Your MyQueue object will be instantiated and called as such:\n# obj = MyQueue()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.peek()\n# param_4 = obj.empty()\n时间复杂度: push(), empty() 函数的时间复杂度为 O(1) ;peek() , pop() 函数在 N 次队首元素删除操作中总共需完成 N 个元素的倒序,均摊时间复杂度为 O(1) 。\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3105379844","body":"main: 如果当前元素大于或者等于maxx,入栈, 更新最大值maxx\n如果当前元素小于栈顶元素,循环弹出栈顶元素,直到当前元素大于或等于栈顶元素,注意不用将当前元素入栈!!不过要再将maxx压入栈,因为刚刚pop时肯定把maxx弹出栈了\n\n。class Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n maxx, stk = arr[0], [arr[0]]\n for i in range(1, len(arr)):\n if arr[i] >= maxx:\n maxx = arr[i]\n stk.append(arr[i])\n else:\n while stk and stk[-1] > arr[i]:\n stk.pop()\n stk.append(maxx)\n return len(stk)\n 时间复杂度O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3111913253","body":"找到尾结点 形成环形链表\n尾结点移动length - k 步 有移动k步 == 左移length - k 步\n找到头结点 断开头尾链接\n\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:\n if not head or not head.next:\n return head\n tail = head\n length = 1\n while tail.next:\n length += 1\n tail = tail.next\n tail.next = head\n\n k = k % length\n for _ in range(length - k):\n tail = tail.next\n \n head = tail.next\n tail.next = None\n return head\n ","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3111983736","body":"先交换以node3为头结点的链表 \nnode1指向地柜返回的链表头\n把node2指向node1\n返回node2 作为交换完成的链表头结点\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if head is None or head.next is None:\n return head\n node1 = head\n node2 = head.next\n node3 = node2.next\n\n node1.next = self.swapPairs(node3)\n node2.next = node1\n\n return node2\n ","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dmax1314":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3082278662","body":"1. 第一个想法是数组转换数字然后相加再转换回去\n时间和空间复杂度都应该是O(n)\n```python\nfrom typing import List\n\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n # 1. 数组 -> 字符串 -> 数字\n # 首先将列表中的每个数字转换为字符串,然后拼接成一个完整的字符串\n # [1, 2, 0, 0] -> [\"1\", \"2\", \"0\", \"0\"] -> \"1200\"\n s = \"\".join(map(str, num))\n \n num_val = int(s)\n \n # 2. 数字相加\n result_val = num_val + k\n \n # 3. 数字 -> 字符串 -> 数组\n # 将结果数字转换回字符串\n # 1234 -> \"1234\"\n result_s = str(result_val)\n \n # 将结果字符串中的每个字符转换回整数,并放入列表中\n # \"1234\" -> [\"1\", \"2\", \"3\", \"4\"] -> [1, 2, 3, 4]\n result_array = [int(digit) for digit in result_s]\n \n return result_array\n```\n但是似乎换其他的语言会溢出\n2. 第二个想法就是模拟加法操作,从个位数加起,关键问题在于处理进位\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n result = []\n carry = 0\n i = len(num) - 1 # 指向 num 的最后一位\n \n while i >= 0 or k > 0 or carry > 0:\n digit = carry # 初始化为进位\n \n if i >= 0: # 如果 num 中还有数字\n digit += num[i]\n i -= 1\n \n if k > 0: # 如果 k 中还有数字\n digit += k % 10\n k //= 10 # 整个 k 除以 10\n \n # 处理进位\n result.append(digit % 10)\n carry = digit // 10\n \n result.reverse() # 因为是从个位到十位添加的,最后需要反转\n return result # 返回结果\n```\n这里是要反转的 我一开始忘了这个事情,因为数组把个位的和放在了第一位和实际数字反过来了\n时间复杂度: O(max(N, M)),其中 N 是 num 的长度,M 是 k 的数字长度。我们需要遍历这两个数的每一位。\n空间复杂度: O(max(N, M)),用于存储结果数组。\n\n---\n在看lc题解的时候发现一个很有趣的模板可能以后会用到\n ```\nwhile ( A 没完 || B 没完)\n A 的当前位\n B 的当前位\n\n 和 = A 的当前位 + B 的当前位 + 进位carry\n\n 当前位 = 和 % 10;\n 进位 = 和 / 10;\n\n判断还有进位吗\n```\n>作者:lilyunoke\n>链接:https://leetcode.cn/problems/add-to-array-form-of-integer/solutions/570659/989-ji-zhu-zhe-ge-jia-fa-mo-ban-miao-sha-8y9r/\n>来源:力扣(LeetCode)\n>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n\n稍微改了一下得到一个python加法模板,\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n n = len(num)\n res = []\n i = n - 1\n s = 0\n carry = 0\n while i >= 0 or k != 0:\n x = num[i] if i >= 0 else 0\n y = k % 10 if k != 0 else 0\n\n s = x + y + carry\n carry = s // 10\n k //= 10\n\n i -= 1\n res.insert(0, s % 10)\n\n if carry != 0:\n res.insert(0, carry)\n return res\n```\n据说这个模板还可以用到[2](https://leetcode.com/problems/add-two-numbers/description/),[165](https://leetcode.com/problems/compare-version-numbers/)和[809](https://leetcode.com/problems/expressive-words/)这周末抽空可以做一下","onTime":false},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3086540520","body":"# 第四天\n构造栈结构,利用先入后出的特性来实现括号匹配\n大概做法就是\n1. 使用栈来存放数字、字符以及中间结果。\n2. 遇到数字时,解析出完整的k值(可能是多位数)。\n3. 遇到开括号 `[` 时,将当前构建的字符串入栈,重置字符串。\n4. 遇到闭括号 `]` 时,出栈,形成一个新的字符串并重复生成。\n5. 最终合并所有字符串返回结果。\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n stack = [] # 初始化栈\n current_num = 0 # 当前数字\n current_str = '' # 当前构建的字符串\n\n for char in s:\n if char.isdigit(): # 如果是数字\n current_num = current_num * 10 + int(char) # 处理多位数\n elif char == '[': # 遇到左括号\n stack.append(current_str) # 存储当前字符串\n stack.append(current_num) # 存储当前数字\n current_str = '' # 重置字符串\n current_num = 0 # 重置数字\n elif char == ']': # 遇到右括号\n num = stack.pop() # 弹出数字\n prev_str = stack.pop() # 弹出前一个字符串\n current_str = prev_str + current_str * num # 生成新的字符串\n else:\n current_str += char # 累加字符\n\n return current_str # 返回解码后的字符串\n```\n时间复杂度是 O(n),其中 n 是字符串 s 的长度。每个字符都被处理一次。\n空间复杂度是 O(n),在最坏情况下,栈可能会存储所有字符和数字。\n\n---\n读了题解发现还存在递归法,也就是用[]来决定递归的开头和结束\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n def dfs(s,i):\n res,multi='',0\n while i str:\n def dfs(s, i):\n res, multi = \"\", 0\n while i < len(s):\n if '0' <= s[i] <= '9':\n multi = multi * 10 + int(s[i])\n elif s[i] == '[':\n i, tmp = dfs(s, i + 1)\n res += multi * tmp\n multi = 0\n elif s[i] == ']':\n return i, res\n else:\n res += s[i]\n i += 1\n return res\n return dfs(s,0)\n```\n时间复杂度是 O(n),其中 n 是字符串 s 的长度。每个字符都被处理一次。\n空间复杂度是 O(n),在最坏情况下,递归调用栈可能会存储所有字符和数字。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091499578","body":"用两个模拟栈的队列来实现栈的基本操作。一个用于添加尾部元素,另一个用于弹出头部元素。即一个近栈stack in和一个出栈stack out。\n```python\nclass MyQueue:\n\n def __init__(self):\n \"\"\"\n in主要负责push,out主要负责pop\n \"\"\"\n self.stack_in = []\n self.stack_out = []\n\n\n def push(self, x: int) -> None:\n \"\"\"\n 有新元素进来,就往in里面push\n \"\"\"\n self.stack_in.append(x)\n\n\n def pop(self) -> int:\n \"\"\"\n Removes the element from in front of queue and returns that element.\n \"\"\"\n if self.empty():\n return None\n \n if self.stack_out:\n return self.stack_out.pop()\n else:\n for i in range(len(self.stack_in)):\n self.stack_out.append(self.stack_in.pop())\n return self.stack_out.pop()\n\n\n def peek(self) -> int:\n \"\"\"\n Get the front element.\n \"\"\"\n ans = self.pop()\n self.stack_out.append(ans)\n return ans\n\n\n def empty(self) -> bool:\n \"\"\"\n 只要in或者out有元素,说明队列不为空\n \"\"\"\n return not (self.stack_in or self.stack_out)\n```\n时间复杂度:\n- `push` 操作的时间复杂度是 O(1),因为我们只是将元素添加到 `stack_in` 的末尾。\n- `pop` 和 `peek` 操作的平均时间复杂度是 O(1),但在最坏情况下(当 `stack_out` 为空时),需要将 `stack_in` 中的所有元素转移到 `stack_out`,这需要 O(n) 的时间,其中 n 是 `stack_in` 中的元素数量。然而,这种情况不会频繁发生,因此平均时间复杂度仍然是 O(1)。\n- `empty` 操作的时间复杂度是 O(1),因为我们只是检查两个栈是否为空。\n\n空间复杂度是 O(n),其中 n 是队列中的元素数量,因为我们需要存储所有元素在两个栈中。\n\n但是我有个问题,不知道为什么用lc自己的time complexity分析出来是O(n)的时间和空间复杂度,可能是因为lc的分析是基于最坏情况的分析?","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094285074","body":"题目的核心是找到最多的分块数量,使得将每个块独立排序后,拼接起来的结果与整个数组排序后的结果相同。\n\n第一个想法是利用排序后的性质。一个块可以被成功分割的条件是:块内所有元素的原数组最大值,小于等于它右边所有元素的最小值。如果满足这个条件,那么这个块排序后,所有元素就都会在它们最终应该在的位置的左边。\n\n为了实现这个想法,我们可以预处理两个数组:\n\n- max_of_left[i]:表示原数组 arr[0...i] 中的最大值。\n- min_of_right[i]:表示原数组 arr[i...n-1] 中的最小值。\n\n然后遍历数组,如果在 i 位置,满足 max_of_left[i] <= min_of_right[i+1],就说明我们可以在 i 和 i+1 之间切一刀。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n n = len(arr)\n if n <= 1:\n return 1\n\n # 1. 计算从左到右每个位置的最大值\n max_of_left = [0] * n\n max_of_left[0] = arr[0]\n for i in range(1, n):\n max_of_left[i] = max(max_of_left[i-1], arr[i])\n\n # 2. 计算从右到左每个位置的最小值\n min_of_right = [0] * n\n min_of_right[n-1] = arr[n-1]\n for i in range(n-2, -1, -1):\n min_of_right[i] = min(min_of_right[i+1], arr[i])\n\n # 3. 遍历查找可以分割的点\n # 如果 max_of_left[i] <= min_of_right[i+1],说明 arr[0...i] 的所有元素\n # 都小于等于 arr[i+1...n-1] 的所有元素,可以切分\n chunks = 0\n for i in range(n - 1):\n if max_of_left[i] <= min_of_right[i+1]:\n chunks += 1\n\n # 总块数 = 分割点数量 + 1\n return chunks + 1\n```\n时间复杂度:O(N),其中 N 是数组的长度。我们需要三次独立的 O(N) 遍历。\n空间复杂度:O(N),用于存储 max_of_left 和 min_of_right 两个辅助数组。\n\n---\n在看题解的时候,发现了一个更巧妙的解法,虽然时间复杂度稍高,但是代码非常简洁。它的思路是比较原数组和排序后数组的元素和。\n\n如果 arr[0...i] 的元素和等于 sorted_arr[0...i] 的元素和,这意味着 arr[0...i] 中的元素集合和 sorted_arr[0...i] 中的元素集合是完全相同的(只是顺序不同)。因为 sorted_arr[0...i] 包含了整个数组中最小的 i+1 个元素,所以 arr[0...i] 也必然包含了这 i+1 个最小元素。这就保证了 arr[0...i] 中的任意元素都小于等于 arr[i+1...n-1] 中的任意元素,因此可以在 i 处进行分割。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n sorted_arr = sorted(arr)\n \n sum_arr = 0\n sum_sorted = 0\n chunks = 0\n \n for i in range(len(arr)):\n sum_arr += arr[i]\n sum_sorted += sorted_arr[i]\n \n if sum_arr == sum_sorted:\n chunks += 1\n \n return chunks\n```\n时间复杂度:O(N log N),瓶颈在于对数组的排序。\n\n空间复杂度:O(N),用于存储排序后的数组副本。\n\n还有一个基于单调栈的解法,时间复杂度可以做到 O(N)。\n\n思路是遍历数组,用一个栈来维护每个块的最大值。\n\n1. 如果当前元素 num 大于或等于栈顶元素,说明 num 可以自己形成一个新的块(或者加入前一个块且不影响排序性),直接将 num 入栈。\n2. 如果当前元素 num 小于栈顶元素,说明 num 必须和前面的块合并,直到栈顶元素小于或等于 num。在合并过程中,需要记录被弹出的那些块中的最大值 head,因为这个 head 将成为合并后新块的最大值,然后将 head 入栈。\n\n最终栈的大小就是块的数量。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n stack = []\n for num in arr:\n if not stack or num >= stack[-1]:\n stack.append(num)\n else:\n # 当前元素num比栈顶小,需要合并\n head = stack.pop()\n # 持续弹出所有大于num的元素\n while stack and stack[-1] > num:\n stack.pop()\n # 将原先这些块的最大值head作为新块的代表入栈\n stack.append(head)\n return len(stack)\n```\n\n时间复杂度:O(N),因为每个元素最多入栈和出栈一次。\n\n空间复杂度:O(N),在最坏的情况下(例如数组本身有序),栈的大小会等于数组长度。\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112533354","body":"双指针\n1. 创建两个指针 pA 和 pB,分别指向两个链表的头节点 headA 和 headB。\n2. 同时向前移动这两个指针,pA 每次走一步,pB 每次也走一步。\n3. 核心操作:如果 pA 指针走到了链表 A 的末尾(即 pA 变为 None),则将它重定向到链表 B 的头节点 headB。同样,如果 pB 指针走到了链表 B 的末尾,则将它重定向到链表 A 的头节点 headA。\n4. 两个指针最终会在相交点相遇。如果两个链表不相交,它们会同时在路径的最后变为 None,此时循环结束。\n\n```python\nclass Solution:\n def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:\n if not headA or not headB:\n return None\n\n pA = headA\n pB = headB\n\n # 当 pA 和 pB 相等时循环终止(可能是在交点,也可能同为 None)\n while pA is not pB:\n # 如果pA走到头,就让他从headB开始走;否则,pA正常往下走\n pA = headB if pA is None else pA.next\n # 如果pB走到头,就让他从headA开始走;否则,pB正常往下走\n pB = headA if pB is None else pB.next\n \n # 返回相遇点\n return pA\n```\n时间复杂度:O(m+n)。在最坏的情况下(例如,两个链表不相交),每个指针都需要遍历两个链表的总长度。\n空间复杂度:O(1)。只使用了两个额外的指针,没有使用其他数据结构。","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121201700","body":"为了实现一个支持 O(1) 时间复杂度的查找插入和删除,可以用hash map去记录key和value之间的映射关系。但是hash map是无序的,没有办法记录各项的使用顺序,可以一个双向链表来记录使用顺序。这样就可以在插入和删除的时候,快速地调整链表的顺序。\n\n```python\nclass DLinkedNode:\n def __init__(self, key=0, value=0):\n self.key = key\n self.value = value\n self.prev = None\n self.next = None\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.cache = dict()\n self.capacity = capacity\n # 使用伪头部和伪尾部节点,简化边界条件处理\n self.head = DLinkedNode()\n self.tail = DLinkedNode()\n self.head.next = self.tail\n self.tail.prev = self.head\n\n def _add_to_head(self, node: DLinkedNode):\n # 将节点添加到头部\n node.prev = self.head\n node.next = self.head.next\n self.head.next.prev = node\n self.head.next = node\n\n def _remove_node(self, node: DLinkedNode):\n # 从链表中删除一个节点\n node.prev.next = node.next\n node.next.prev = node.prev\n\n def _move_to_head(self, node: DLinkedNode):\n # 将一个存在的节点移动到头部\n self._remove_node(node)\n self._add_to_head(node)\n\n def get(self, key: int) -> int:\n if key not in self.cache:\n return -1\n \n node = self.cache[key]\n # 访问过后,变为最近使用,移动到头部\n self._move_to_head(node)\n return node.value\n\n def put(self, key: int, value: int) -> None:\n if key in self.cache:\n # 如果 key 存在,更新值并移动到头部\n node = self.cache[key]\n node.value = value\n self._move_to_head(node)\n else:\n # 如果 key 不存在\n if len(self.cache) == self.capacity:\n # 缓存已满,淘汰最久未使用的节点(尾部节点)\n removed_node = self.tail.prev\n self._remove_node(removed_node)\n # 不要忘了从哈希表中也删除\n del self.cache[removed_node.key]\n\n # 创建新节点并添加到头部\n new_node = DLinkedNode(key, value)\n self._add_to_head(new_node)\n self.cache[key] = new_node\n```\n时间复杂度:get 和 put 操作都是 O(1)。所有操作都是哈希表查找和链表头尾操作的组合。\n空间复杂度:O(capacity),因为哈希表和双向链表最多存储 capacity 个元素。","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3132881592","body":"DFS - 递归\n这道题的结构天然适合使用递归来解决。我们可以定义一个函数,该函数接收一个节点和从根到该节点父节点所构成的数字。\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n \n def dfs(node: Optional[TreeNode], current_path_sum: int) -> int:\n if not node:\n return 0\n \n # 计算到达当前节点的路径代表的数字\n new_sum = current_path_sum * 10 + node.val\n \n # 如果是叶子节点,返回当前路径的数字\n if not node.left and not node.right:\n return new_sum\n \n # 如果不是叶子节点,返回左右子树的路径数字之和\n else:\n return dfs(node.left, new_sum) + dfs(node.right, new_sum)\n\n return dfs(root, 0)\n```\n时间复杂度:O(N),其中 N 是树中节点的数量。我们需要访问每个节点一次。\n空间复杂度:O(H),其中 H 是树的高度。这部分空间用于递归调用栈。在最坏的情况下(树退化成链表),空间复杂度为 O(N);在最好的情况下(完全二叉树),空间复杂度为 O(log N)。\n\n---\n\nDFS - 迭代\n> 递归可能导致的栈溢出问题(在树极深的情况下),我们可以将递归转换为迭代\n\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n \n total_sum = 0\n stack = [(root, root.val)] # 栈中存储 (节点, 到达该节点的路径数值)\n\n while stack:\n node, current_number = stack.pop()\n\n # 如果是叶子节点,将路径数值加入总和\n if not node.left and not node.right:\n total_sum += current_number\n\n # 将右子节点压栈\n if node.right:\n stack.append((node.right, current_number * 10 + node.right.val))\n \n # 将左子节点压栈\n if node.left:\n stack.append((node.left, current_number * 10 + node.left.val))\n \n return total_sum\n```\n时间复杂度:O(N),每个节点入栈和出栈一次。\n空间复杂度:O(H),栈在最坏情况下存储 H 个节点,H 是树的高度。与递归版本类似,最好情况 O(log N),最坏情况 O(N)。\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134942374","body":"因为题目中提到了**行**,我们可以用bfs一行一行地处理树的节点\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\nimport collections\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n \n queue = collections.deque([root])\n bottom_left_val = 0\n \n while queue:\n # 当前层的节点数量\n level_size = len(queue)\n \n # 每一层的第一个节点就是该层的最左侧节点\n # 我们只需要记录它,然后继续遍历\n bottom_left_val = queue[0].val\n \n # 遍历当前层的所有节点\n for _ in range(level_size):\n node = queue.popleft()\n \n # 将下一层的节点加入队列\n if node.left:\n queue.append(node.left)\n if node.right:\n queue.append(node.right)\n \n return bottom_left_val\n```\n时间复杂度:O(N),其中 N 是树中节点的总数。因为每个节点都会入队和出队一次。\n空间复杂度:O(W),其中 W 是树的最大宽度。在最坏的情况下(一个完整的二叉树),队列的大小可以达到 N/2。\n\n---\n当然dfs也是可以做的,要记录目前为止发现的最深层级max_depth和最深层级最左边节点的值result_val,先左后右地进行递归\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n self.max_depth = -1 # 记录最大深度,初始化为-1\n self.result_val = 0 # 记录结果值\n \n def dfs(node: Optional[TreeNode], current_depth: int):\n if not node:\n return\n \n # 如果当前深度大于已记录的最大深度\n # 说明我们第一次到达这个新深度,且由于先序遍历的顺序,这一定是该层最左的节点\n if current_depth > self.max_depth:\n self.max_depth = current_depth\n self.result_val = node.val\n \n # 必须先遍历左子树,再遍历右子树\n dfs(node.left, current_depth + 1)\n dfs(node.right, current_depth + 1)\n \n dfs(root, 0)\n return self.result_val\n```\n时间复杂度:O(N),因为我们仍然需要访问树中的每一个节点。\n空间复杂度:O(H),其中 H 是树的高度。这部分空间是递归调用栈所占用的。最坏情况下,树呈链状,空间复杂度为 O(N)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3146236433","body":"```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n def dfs(node):\n if not node:\n res.append(\"null\")\n return\n res.append(str(node.val))\n dfs(node.left)\n dfs(node.right)\n \n dfs(root)\n return \",\".join(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n if not data:\n return None\n \n # 使用列表模拟一个队列,方便 pop(0)\n node_list = data.split(',')\n \n def build_tree():\n val = node_list.pop(0)\n if val == \"null\":\n return None\n \n node = TreeNode(int(val))\n node.left = build_tree()\n node.right = build_tree()\n return node\n \n return build_tree()\n```\n复杂度 空间和时间都是 O(N)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3141867802","body":"坐标记录 + 排序\n为每一个节点确定其坐标 (row, col),并记录下 (row, col, val) 这个三元组。最后BFS即可(DFS应该也行)\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import List, Optional\nimport collections\n\nclass Solution:\n def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:\n if not root:\n return []\n \n # 1. 遍历与记录\n # 使用 BFS 遍历树,记录每个节点的 (col, row, val)\n nodes_info = []\n queue = collections.deque([(root, 0, 0)]) # (node, row, col)\n \n while queue:\n node, row, col = queue.popleft()\n nodes_info.append((col, row, node.val))\n \n if node.left:\n queue.append((node.left, row + 1, col - 1))\n if node.right:\n queue.append((node.right, row + 1, col + 1))\n \n # 2. 排序\n # 对记录下来的节点信息进行排序\n # Python 的元组排序默认按元素顺序比较,完美符合题目要求\n nodes_info.sort()\n \n # 3. 分组\n # 将排序后的结果按列分组\n result_map = collections.OrderedDict()\n for col, row, val in nodes_info:\n if col not in result_map:\n result_map[col] = []\n result_map[col].append(val)\n \n return list(result_map.values())\n```\n时间复杂度:O(N log N)。\nBFS 遍历需要 O(N) 的时间,其中 N 是节点数。nodes_info.sort() 是整个算法的瓶颈,对 N 个元素排序需要 O(N log N) 的时间。最后的分组步骤需要 O(N) 的时间。\n因此,总时间复杂度为 O(N log N)。\n\n空间复杂度:O(N)。\nBFS 的队列在最坏情况下需要存储 O(W) 个节点,W 是树的最大宽度。nodes_info 列表需要存储所有 N 个节点的信息,因此需要 O(N) 的空间。result_map 也需要 O(N) 的空间来存储所有节点的值。\n因此,总空间复杂度为 O(N)。\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146235205","body":"```python\nfrom typing import List, Set\n\nclass Solution:\n def generateParenthesis(self, n: int) -> List[str]:\n # 使用列表来模拟dp数组,每个元素是一个哈希集合\n dp: List[Set[str]] = [set() for _ in range(n + 1)]\n \n # 基础情况:0对括号只有一种组合,即空字符串\n dp[0].add(\"\")\n \n # 从1对括号开始,迭代到n对\n for i in range(1, n + 1):\n # 遍历所有可能的分割点 j\n for j in range(i):\n # A 部分有 j 对括号,B 部分有 i-1-j 对\n list_p = dp[j]\n list_q = dp[i - 1 - j]\n \n # 组合 p 和 q\n for p in list_p:\n for q in list_q:\n # 使用哈希集合 dp[i] 自动去重\n dp[i].add(f\"({p}){q}\")\n \n return list(dp[n])\n```\n复杂度好像有点难算 看看大家有没有什么想法 我再算一算","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3147359265","body":"首先想到的是26字母那道题一样开一个数组然后建一个数组索引转换hash map去做 但是我不清楚是不是升序 所以要用min和max 那这样的效果肯定很差 内存会超 结果没想到居然能过\n```python\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n if not nums:\n return []\n \n # -----------------------------------------------------------------\n # 步骤 1: 使用“数组哈希”(直接寻址法)统计频率\n # -----------------------------------------------------------------\n \n # a. 找到数值范围以确定数组大小\n min_val = min(nums)\n max_val = max(nums)\n \n # b. 定义偏移量,将所有数值映射到数组的非负索引\n offset = -min_val\n \n # c. 创建计数数组\n count_array_size = max_val - min_val + 1\n count_array = [0] * count_array_size\n \n # d. 遍历原数组,完成计数\n for num in nums:\n # 将 num 通过偏移量映射到数组索引\n index = num + offset\n count_array[index] += 1\n\n # -----------------------------------------------------------------\n # 步骤 2: 使用桶排序来找到前 K 个高频元素\n # -----------------------------------------------------------------\n\n # a. 创建桶,桶的索引代表频率\n # 桶的数量是 len(nums) + 1,因为一个元素的频率不可能超过总数\n buckets = [[] for _ in range(len(nums) + 1)]\n\n # b. 遍历计数数组,将元素放入对应频率的桶中\n for i in range(count_array_size):\n freq = count_array[i]\n if freq > 0:\n # 将索引 i 转换回原始数字\n num = i - offset\n buckets[freq].append(num)\n\n # -----------------------------------------------------------------\n # 步骤 3: 从后往前收集结果\n # -----------------------------------------------------------------\n \n result = []\n # 从最高频率的桶开始遍历\n for i in range(len(buckets) - 1, 0, -1):\n # 如果当前频率的桶中有元素\n if buckets[i]:\n # 将这个桶里的所有元素加入结果集\n result.extend(buckets[i])\n \n # 如果结果集大小已经足够,可以提前退出\n if len(result) >= k:\n break\n \n # 返回前 k 个元素,如果最后一个桶加入了多余元素,用切片保证只返回k个\n return result[:k]\n```\n---\n然后我想到遍历数组 建一个hash map(元素,频率) 然后按频率降序排序提出来前k个\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n # 1. 使用 collections.Counter 快速统计频率,O(N)\n freq_map = collections.Counter(nums)\n \n # 2. 对哈希表按值(频率)进行排序\n # sorted 函数的时间复杂度是 O(M log M),其中 M 是不同元素的数量\n # M <= N,所以最坏是 O(N log N)\n sorted_items = sorted(freq_map.items(), key=lambda item: item[1], reverse=True)\n \n # 3. 提取前 k 个元素\n result = [item[0] for item in sorted_items[:k]]\n \n return result\n```\n空间复杂度:O(N)\n时间复杂度:O(NlogN)。其中 N 是数组 nums 的长度。瓶颈在于排序那一步,即使只有 M 个独立元素,在最坏情况下 M 可能等于 N。这个复杂度不满足题目进阶要求。\n\n---\n可以看到关键问题在于排序,想办法避免排序 我就可以用最小堆来做\n维护一个最小的heapq 按频率存入 如果堆的大小超过k了就把频率最低的pop out就行\n```python\nimport collections\nimport heapq\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n # 1. 统计频率,O(N)\n freq_map = collections.Counter(nums)\n \n # 2. 维护一个大小为 k 的最小堆,O(M log k),M是不同元素的数量\n min_heap = []\n for num, freq in freq_map.items():\n # Python的heapq是最小堆,所以我们存入(频率, 数字)\n # 这样堆会根据频率排序\n heapq.heappush(min_heap, (freq, num))\n if len(min_heap) > k:\n heapq.heappop(min_heap) # pop out频率最小的元素\n \n # 3. 提取结果\n # 此时堆中的k个元素就是频率最高的k个\n result = [item[1] for item in min_heap]\n return result\n```\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3156822202","body":"双指针滑动窗口\n```python\nclass Solution:\n def lengthOfLongestSubstring(self, s: str) -> int:\n # 哈希表存储 {字符: 最后出现的位置索引}\n char_map = {}\n max_len = 0\n left = 0 # 窗口的左边界\n \n # right 是窗口的右边界,不断向右移动\n for right in range(len(s)):\n char = s[right]\n \n # 如果当前字符已经存在于哈希表中,并且其位置在当前窗口内\n if char in char_map and char_map[char] >= left:\n # 遇到重复字符,收缩窗口\n # 将左边界移动到重复字符上一次出现位置的下一个位置\n left = char_map[char] + 1\n \n # 更新字符的最新位置\n char_map[char] = right\n \n # 更新最大长度\n current_len = right - left + 1\n max_len = max(max_len, current_len)\n \n return max_len\n```\n时间复杂度:O(N)。left 和 right 两个指针都只会从头到尾遍历字符串一次,每个字符最多被访问两次。\n\n空间复杂度:O(k),其中 k 是字符串中不同字符的数量。在最坏的情况下(所有字符都不同),空间复杂度为 O(N)。如果字符集有限(例如 ASCII 码共 128 个),则空间复杂度为常数 O(128)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3156831483","body":"这道题和上一题的区别一个是子字符串(3)一个是子序列(30)\n解法还是双指针滑动窗口 只不过需要改造一下,现在要独立扫描word_len 次\n即\n>第一次扫描:从索引 0 开始,窗口每次移动 word_len,检查的子串是 s[0...], s[word_len...], s[2*word_len...] ...\n第二次扫描:从索引 1 开始,窗口每次移动 word_len,检查的子串是 s[1...], s[1+word_len...], s[1+2*word_len...] ...\n\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def findSubstring(self, s: str, words: List[str]) -> List[int]:\n if not s or not words:\n return []\n\n word_len = len(words[0])\n num_words = len(words)\n total_len = word_len * num_words\n words_freq = collections.Counter(words)\n result = []\n\n # 我们需要进行 word_len 次扫描\n for i in range(word_len):\n left = i # 当前扫描的窗口左边界\n seen = collections.Counter() # 当前窗口内单词的频率\n count = 0 # 当前窗口内有效单词的数量\n\n # 窗口右边界以 word_len 为步长滑动\n for j in range(i, len(s) - word_len + 1, word_len):\n word = s[j : j + word_len]\n \n if word in words_freq:\n seen[word] += 1\n count += 1\n \n # 如果一个单词的数量超了,就从左边收缩窗口\n while seen[word] > words_freq[word]:\n left_word = s[left : left + word_len]\n seen[left_word] -= 1\n count -= 1\n left += word_len\n \n # 如果窗口内单词数量正好,说明找到了一个解\n if count == num_words:\n result.append(left)\n # 为了继续搜索,将窗口最左边的单词移出\n left_word = s[left : left + word_len]\n seen[left_word] -= 1\n count -= 1\n left += word_len\n\n else:\n # 如果遇到的单词不在 words 列表中,则当前窗口作废\n # 直接将左边界移动到这个坏单词的后面\n seen.clear()\n count = 0\n left = j + word_len\n \n return result\n```\n时间复杂度O(N),N是字符串s的长度\n空间复杂度O(ML),M是words列表里的单词数量 L是每个单词长度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3161453831","body":"```python\nfrom typing import List\n\nclass Solution:\n def minSubarray(self, nums: List[int], p: int) -> int:\n n = len(nums)\n # 1. 同余定理:计算目标余数\n target_rem = sum(nums) % p\n \n # 如果总和已经能被 p 整除,无需移除\n if target_rem == 0:\n return 0\n \n # 2. 哈希表:存储 {余数: 最后一次出现的索引}\n # 初始化 {0: -1} 来处理从开头开始的子数组\n rem_map = {0: -1}\n min_len = n # 初始化为一个最大值\n \n # 3. 前缀和:用一个变量 current_sum 动态计算\n current_sum = 0\n \n for i, num in enumerate(nums):\n current_sum += num\n current_rem = current_sum % p\n \n # 计算需要寻找的配对余数\n needed_rem = (current_rem - target_rem + p) % p\n \n # 如果找到了配对\n if needed_rem in rem_map:\n prev_index = rem_map[needed_rem]\n # 更新最短长度\n min_len = min(min_len, i - prev_index)\n \n # 更新当前余数的最新索引\n rem_map[current_rem] = i\n \n # 如果 min_len 没有被更新过,或者更新后的值等于n(意味着要移除整个数组)\n # 则说明找不到合适的“真”子数组\n return min_len if min_len < n else -1\n```\n时间复杂度:O(N),因为我们只遍历了数组一次。\n空间复杂度:O(min(N,p)),因为哈希表中最多存储 p 个不同的余数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3169922808","body":"双指针\n```python\nfrom typing import Optional\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\n\nclass Solution:\n def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n # 初始化快慢指针\n slow = head\n fast = head\n \n # 当快指针没有走到链表末尾时\n while fast and fast.next:\n # 慢指针走一步\n slow = slow.next\n # 快指针走两步\n fast = fast.next.next\n \n # 当循环结束时,慢指针正好在中间位置\n return slow\n```\n时间复杂度:O(N)。虽然有两个指针,但我们只对链表进行了一次单向遍历。\n空间复杂度:O(1)。只使用了两个额外的指针变量,没有使用额外的存储空间。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169886502","body":"双指针/快慢指针\n快的去遍历 慢的维护只出现一次的元素\n```python\nfrom typing import List\n\nclass Solution:\n def removeDuplicates(self, nums: List[int]) -> int:\n # 如果数组为空,直接返回 0\n if not nums:\n return 0\n \n # slow 指针指向下一个将要被赋值的、新的不重复元素的位置。\n # nums[0] 默认是第一个不重复的元素,所以 slow 从 1 开始。\n slow = 1\n \n # fast 指针从第二个元素开始,遍历整个数组\n for fast in range(1, len(nums)):\n if nums[fast] != nums[fast - 1]:\n nums[slow] = nums[fast]\n slow += 1\n \n return slow","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173197055","body":"我们可以用单调队列(双端队列 (deque))来维护窗口内的“候选最大值”,使得获取当前最大值的操作是 O(1) 的\n>双端队列 (deque)\n队列中存储的是数组元素的索引,而不是元素本身。\n队列中的索引所对应的 nums 数组中的值,是从头到尾单调递减的。\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n n = len(nums)\n if n * k == 0:\n return []\n \n # 单调队列,存储的是元素的索引\n # 队列中的索引对应的 nums 值是单调递减的\n deque = collections.deque()\n result = []\n\n for i in range(n):\n # 1. 维护单调性:移除队尾所有小于当前值的元素\n while deque and nums[deque[-1]] <= nums[i]:\n deque.pop()\n \n # 2. 当前元素索引入队\n deque.append(i)\n \n # 3. 维护窗口大小:移除已经滑出窗口的队头元素\n if deque[0] <= i - k:\n deque.popleft()\n \n # 4. 记录结果:当窗口完全形成后开始记录\n if i >= k - 1:\n # 队头元素永远是当前窗口的最大值\n result.append(nums[deque[0]])\n \n return result\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3187054447","body":"```python\nfrom typing import List\n\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n # 使用一个数组记录每个人的信任差额\n trust_scores = [0] * (n + 1)\n \n for a, b in trust:\n trust_scores[a] -= 1 # 信任别人,分数-1\n trust_scores[b] += 1 # 被人信任,分数+1\n \n # 寻找分数为 n-1 的法官\n for i in range(1, n + 1):\n if trust_scores[i] == n - 1:\n return i\n \n return -1\n```\n时间复杂度: O(n + m), m为trust列表长度\n空间复杂度: O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3187045338","body":"这道题的本质是判断一个图是否为二分图 (Bipartite Graph)。\n n 个人看作是图的 n 个节点 (Vertex),每一对 dislike关系 [a, b] 看作是连接节点 a 和 b 的一条无向边 (Edge)。\n判断由人和他们之间的“不喜欢”关系构成的图,是否是一个二分图。\nDFS着色\n```python\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:\n # 1. 构建图的邻接表\n graph = [[] for _ in range(n + 1)]\n for u, v in dislikes:\n graph[u].append(v)\n graph[v].append(u)\n \n # 2. 创建 colors 数组,0:未着色, 1:颜色A, -1:颜色B\n colors = [0] * (n + 1)\n \n # 3. 遍历所有节点\n for i in range(1, n + 1):\n # 如果节点未被着色,从它开始进行DFS\n if colors[i] == 0:\n if not self.dfs(i, 1, colors, graph):\n return False\n \n return True\n\n def dfs(self, node: int, color: int, colors: List[int], graph: List[List[int]]) -> bool:\n # 给当前节点染色\n colors[node] = color\n \n # 遍历所有邻居\n for neighbor in graph[node]:\n # 如果邻居颜色与当前节点相同,产生冲突\n if colors[neighbor] == color:\n return False\n # 如果邻居未被染色,对其进行DFS\n if colors[neighbor] == 0:\n # 给邻居染上相反的颜色\n if not self.dfs(neighbor, -color, colors, graph):\n return False\n \n return True\n```\nBFS着色\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:\n # 1. 构建图的邻接表\n graph = [[] for _ in range(n + 1)]\n for u, v in dislikes:\n graph[u].append(v)\n graph[v].append(u)\n \n # 2. 创建 colors 数组\n colors = [0] * (n + 1)\n \n # 3. 遍历所有节点\n for i in range(1, n + 1):\n if colors[i] == 0: # 未被染色,开始BFS\n queue = collections.deque([i])\n colors[i] = 1 # 染上颜色A\n \n while queue:\n node = queue.popleft()\n # 遍历邻居\n for neighbor in graph[node]:\n # 如果邻居颜色与当前节点相同,冲突\n if colors[neighbor] == colors[node]:\n return False\n # 如果邻居未染色,染上相反颜色并入队\n if colors[neighbor] == 0:\n colors[neighbor] = -colors[node]\n queue.append(neighbor)\n \n return True\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3187051602","body":"双层拓扑排序 关键在于排序的规则\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:\n \n # 1. 数据预处理:为没有团队的项目分配新团队ID\n new_group_id = m\n for i in range(n):\n if group[i] == -1:\n group[i] = new_group_id\n new_group_id += 1\n \n num_groups = new_group_id\n\n # 2. 构建项目图和团队图及其入度数组\n item_graph = [[] for _ in range(n)]\n item_indegree = [0] * n\n group_graph = [[] for _ in range(num_groups)]\n group_indegree = [0] * num_groups\n\n for i in range(n):\n for prev_item in beforeItems[i]:\n # 项目图依赖\n item_graph[prev_item].append(i)\n item_indegree[i] += 1\n \n # 如果属于不同团队,则产生团队图依赖\n if group[prev_item] != group[i]:\n group_graph[group[prev_item]].append(group[i])\n group_indegree[group[i]] += 1\n\n # 3. 通用的拓扑排序函数\n def topological_sort(graph, indegree):\n num_nodes = len(graph)\n queue = collections.deque([i for i in range(num_nodes) if indegree[i] == 0])\n sorted_order = []\n while queue:\n u = queue.popleft()\n sorted_order.append(u)\n for v in graph[u]:\n indegree[v] -= 1\n if indegree[v] == 0:\n queue.append(v)\n \n return sorted_order if len(sorted_order) == num_nodes else []\n\n # 4. 执行两次拓扑排序\n item_order = topological_sort(item_graph, item_indegree)\n group_order = topological_sort(group_graph, group_indegree)\n\n if not item_order or not group_order:\n return []\n\n # 5. 合并结果\n # a. 将排好序的项目按团队分组\n items_by_group = collections.defaultdict(list)\n for item in item_order:\n items_by_group[group[item]].append(item)\n \n # b. 根据团队顺序,拼接项目\n final_result = []\n for group_id in group_order:\n final_result.extend(items_by_group[group_id])\n \n return final_result\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3193081347","body":"模拟\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n # 初始化坐标\n x, y = 0, 0\n \n # 遍历每一步\n for move in moves:\n if move == 'U':\n y += 1\n elif move == 'D':\n y -= 1\n elif move == 'L':\n x -= 1\n elif move == 'R':\n x += 1\n \n # 检查最终位置是否为原点\n return x == 0 and y == 0\n```\n或者直接看字符串里面是否满足U==D, L==R\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n # Python 的 count() 方法让这个思路的实现非常简洁\n # 检查向上和向下的步数是否相等\n vertical_balance = (moves.count('U') == moves.count('D'))\n \n # 检查向左和向右的步数是否相等\n horizontal_balance = (moves.count('L') == moves.count('R'))\n \n return vertical_balance and horizontal_balance\n```\n两个复杂度是一样的\n时间复杂度:O(N)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193084373","body":"排序 + 最小堆\nmin_heap存放已到达但未执行的任务(processingTime, original_index) 按照时间、索引排序\n```python\nimport heapq\nfrom typing import List\n\nclass Solution:\n def getOrder(self, tasks: List[List[int]]) -> List[int]:\n # 1. 数据预处理:附加原始索引并按入队时间排序\n # tasks_with_indices 的格式: [[enqueueTime, processingTime, original_index], ...]\n tasks_with_indices = sorted(\n [(tasks[i][0], tasks[i][1], i) for i in range(len(tasks))]\n )\n \n result_order = []\n min_heap = [] # 优先队列,存储 (processingTime, original_index)\n \n task_pointer = 0 # 指向下一个要检查的任务\n current_time = 0 # 当前时间\n \n # 当还有任务未处理或未入队时,循环继续\n while task_pointer < len(tasks) or min_heap:\n \n # 如果CPU空闲且没有任务在等待,快进到下一个任务的到达时间\n if not min_heap and current_time < tasks_with_indices[task_pointer][0]:\n current_time = tasks_with_indices[task_pointer][0]\n\n # 2. 将所有已到达的任务加入最小堆\n while task_pointer < len(tasks) and tasks_with_indices[task_pointer][0] <= current_time:\n enqueue_time, process_time, original_index = tasks_with_indices[task_pointer]\n heapq.heappush(min_heap, (process_time, original_index))\n task_pointer += 1\n \n # 3. 从堆中取出最优任务执行\n if min_heap:\n process_time, original_index = heapq.heappop(min_heap)\n current_time += process_time\n result_order.append(original_index)\n \n return result_order\n```\n复杂度:假设N个任务,那么时间复杂度是O(NlogN)有排序造成的,空间是O(N) tasks列表和min_heap都需要O(N)的空间","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3204406944","body":"a->c,需要len(a) - a中c的个数\nb->c需要len(b) - b中c的个数\n我们需要考虑len(a) + len(b) - (a中c的个数 + b中c的个数)\n此外还可以优化一下\n如果a= c 的字符。\nb 中需要改变的,是那些 < c 的字符。\na>=b同理\n```python\nimport collections\n\nclass Solution:\n def minCharacters(self, a: str, b: str) -> int:\n n, m = len(a), len(b)\n freq_a = collections.Counter(a)\n freq_b = collections.Counter(b)\n\n # --- 计算条件 3 的最小代价 ---\n # 代价 = 总长度 - 两个字符串中某个字符的最大总频次\n max_combined_freq = 0\n for i in range(26):\n char = chr(ord('a') + i)\n max_combined_freq = max(max_combined_freq, freq_a[char] + freq_b[char])\n \n cost3 = n + m - max_combined_freq\n\n # --- 计算条件 1 (a < b) 和 条件 2 (b < a) 的最小代价 ---\n cost1 = float('inf') # a < b\n cost2 = float('inf') # b < a\n \n # 使用前缀/后缀和的思想来优化计数\n a_lt_count = 0 # a 中 < 当前分界线的字符数\n b_lt_count = 0\n \n # 遍历所有 25 个可能的分界线 ('b' 到 'z')\n for i in range(25):\n char = chr(ord('a') + i)\n a_lt_count += freq_a[char]\n b_lt_count += freq_b[char]\n \n # 分界线是 char_next = chr(ord('a') + i + 1)\n # 条件 1 (a < char_next, b >= char_next):\n # - a 中要改的是 >= char_next 的, 即 (n - a_lt_count)\n # - b 中要改的是 < char_next 的, 即 b_lt_count\n current_cost1 = (n - a_lt_count) + b_lt_count\n cost1 = min(cost1, current_cost1)\n \n # 条件 2 (b < char_next, a >= char_next):\n # - b 中要改的是 >= char_next 的, 即 (m - b_lt_count)\n # - a 中要改的是 < char_next 的, 即 a_lt_count\n current_cost2 = (m - b_lt_count) + a_lt_count\n cost2 = min(cost2, current_cost2)\n\n return min(cost1, cost2, cost3)\n```\n时间复杂度:O(N+M),其中 N 和 M 分别是两个字符串的长度。\n空间复杂度:O(1),大小为 26 的频率表\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3208576782","body":"堆排序\n```python\nclass Solution:\n def sortArray(self, nums: List[int]) -> List[int]:\n def heapify(nums, n, i):\n largest = i\n left = 2 * i + 1\n right = 2 * i + 2\n\n if left < n and nums[left] > nums[largest]:\n largest = left\n if right < n and nums[right] > nums[largest]:\n largest = right\n if largest != i:\n nums[i], nums[largest] = nums[largest], nums[i]\n heapify(nums, n, largest)\n\n n = len(nums)\n for i in range(n // 2 - 1, -1, -1):\n heapify(nums, n, i)\n\n for i in range(n - 1, 0, -1):\n nums[i], nums[0] = nums[0], nums[i]\n heapify(nums, i, 0)\n```\n时间复杂度:O(NlogN)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3208555582","body":"二分\n```python\nclass Solution:\n def mySqrt(self, x: int) -> int:\n\n if x == 0:\n return 0\n \n # 定义二分查找的左右边界\n left, right = 0, x\n ans = 0\n \n while left <= right:\n # 计算中间值\n mid = left + (right - left) // 2\n \n # 避免 mid 为 0 的情况,或者直接判断 mid * mid\n if mid == 0:\n left = mid + 1\n continue\n \n # 比较 mid 的平方与 x\n # 为了防止 mid * mid 溢出(在某些语言中),可以写成 mid <= x / mid\n if mid * mid > x:\n # mid 太大,搜索左半部分\n right = mid - 1\n else:\n # mid 是一个可能的答案,尝试寻找更大的\n ans = mid\n left = mid + 1\n \n return ans\n```\n时间复杂度:O(logN)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208553626","body":"二分查找\n```python\nclass Solution:\n def firstBadVersion(self, n: int) -> int:\n left, right = 1, n\n \n while left < right:\n mid = left + (right - left) // 2\n \n if isBadVersion(mid):\n # 如果 mid 是坏的,那第一个坏版本在 [left, mid] 区间内\n # 我们不能排除 mid,所以 right = mid\n right = mid\n else:\n # 如果 mid 是好的,那第一个坏版本在 [mid + 1, right] 区间内\n left = mid + 1\n \n return left\n```\n时间复杂度:O(logN)\n空间复杂度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3222475353","body":"排除法\n排除掉卡片的正面和背面是同一个数字 X的卡片\n```python\nfrom typing import List\n\nclass Solution:\n def flipgame(self, fronts: List[int], backs: List[int]) -> int:\n # 1. 找出所有“不可能的”数字\n impossible_nums = set()\n for i in range(len(fronts)):\n if fronts[i] == backs[i]:\n impossible_nums.add(fronts[i])\n \n # 2. 寻找最小的“好”数字\n min_good_num = float('inf')\n found_good_num = False\n \n # 遍历所有出现过的数字\n all_nums = fronts + backs\n \n for num in all_nums:\n # 如果这个数字不是“不可能的”\n if num not in impossible_nums:\n found_good_num = True\n min_good_num = min(min_good_num, num)\n \n # 3. 返回结果\n return min_good_num if found_good_num else 0\n```\n时间复杂度:O(N),其中 N 是卡片的数量。\n空间复杂度:O(N)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3222461055","body":"二分 + DFS/BFS\n```python\nfrom typing import List\n\nclass Solution:\n def swimInWater(self, grid: List[List[int]]) -> int:\n n = len(grid)\n left, right = grid[0][0], n * n - 1\n ans = right\n\n def is_possible(t):\n # 检查在时间 t 是否能从 (0,0) 到达 (n-1, n-1)\n if grid[0][0] > t:\n return False\n \n stack = [(0, 0)]\n visited = {(0, 0)}\n \n while stack:\n r, c = stack.pop()\n if r == n - 1 and c == n - 1:\n return True\n \n for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:\n nr, nc = r + dr, c + dc\n if 0 <= nr < n and 0 <= nc < n and (nr, nc) not in visited and grid[nr][nc] <= t:\n visited.add((nr, nc))\n stack.append((nr, nc))\n return False\n\n while left <= right:\n mid = left + (right - left) // 2\n if is_possible(mid):\n ans = mid\n right = mid - 1\n else:\n left = mid + 1\n \n return ans\n```\n时间复杂度:O($n^2logn$)\n空间复杂度:O($n^2$)\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222456504","body":"Sliding Window\n维护一个固定大小为 k 的窗口,在字符串上滑动。当窗口向右移动一格时,只需要考虑移出窗口的字符和移入窗口的字符对元音数量的影响即可。\n```python\nfrom typing import List\n\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n vowels = {'a', 'e', 'i', 'o', 'u'}\n \n # 1. 初始化:计算第一个窗口的元音数\n current_vowels = 0\n for i in range(k):\n if s[i] in vowels:\n current_vowels += 1\n \n max_vowels = current_vowels\n \n # 2. 滑动窗口\n # 从第 k 个字符开始,模拟窗口向右滑动\n for i in range(k, len(s)):\n # a. 处理新移入的字符 s[i]\n if s[i] in vowels:\n current_vowels += 1\n \n # b. 处理被移出的字符 s[i-k]\n if s[i-k] in vowels:\n current_vowels -= 1\n \n # c. 更新最大值\n max_vowels = max(max_vowels, current_vowels)\n \n return max_vowels\n```\n时间复杂度:O(N)\n空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3232274052","body":"动态规划 + 滑动窗口\n定义 dp[i] 为:爱丽丝最终得分恰好为 i 的概率,最后要计算$\\sum_i=k^n dp[i]$,dp[0] = 1\n```python\nclass Solution:\n def new21Game(self, n: int, k: int, maxPts: int) -> float:\n # 如果 k=0,开始就是 >=k,游戏直接结束,得分为0,概率为1\n if k == 0:\n return 1.0\n \n # dp[i] 表示得到分数 i 的概率\n dp = [0.0] * (n + 1)\n dp[0] = 1.0\n \n # window_sum 维护一个大小为 maxPts 的滑动窗口内 dp 值的和\n window_sum = 1.0\n result = 0.0\n \n for i in range(1, n + 1):\n # 计算 dp[i]\n dp[i] = window_sum / maxPts\n \n # 如果 i < k,dp[i] 会对后续的 dp 值产生贡献,加入窗口\n if i < k:\n window_sum += dp[i]\n \n # 如果 i >= k,这是一个最终得分,累加到结果中\n # 注意:题目求的是 <= n 的概率,而 dp 数组只到 n,所以循环内累加即可\n if i >= k:\n result += dp[i]\n \n # 如果 i >= maxPts,需要将滑出窗口的 dp 值减去\n if i >= maxPts:\n window_sum -= dp[i - maxPts]\n \n return result\n```\n时间复杂度:O(n)。我们只对 dp 数组进行了一次遍历。\n空间复杂度:O(n)。用于存储 dp 数组。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3232278119","body":"滑动窗口 + 字符频率统计\n```python\nfrom typing import List\n\nclass Solution:\n def findAnagrams(self, s: str, p: str) -> List[int]:\n s_len, p_len = len(s), len(p)\n \n # 边缘情况:如果 s 比 p 短,不可能找到异位词\n if s_len < p_len:\n return []\n \n result = []\n # 使用大小为 26 的数组作为频率统计表\n p_counts = [0] * 26\n s_window_counts = [0] * 26\n \n # 1. & 2. 初始化 p 的频率表和 s 的第一个窗口的频率表\n for i in range(p_len):\n p_counts[ord(p[i]) - ord('a')] += 1\n s_window_counts[ord(s[i]) - ord('a')] += 1\n \n # 3. 第一次比较\n if p_counts == s_window_counts:\n result.append(0)\n \n # 4. 滑动窗口\n for i in range(p_len, s_len):\n # a. 移入新字符\n s_window_counts[ord(s[i]) - ord('a')] += 1\n # b. 移出旧字符\n s_window_counts[ord(s[i - p_len]) - ord('a')] -= 1\n \n # c. 再次比较\n if p_counts == s_window_counts:\n # 当前窗口的起始索引是 i - p_len + 1\n result.append(i - p_len + 1)\n \n return result\n```\n时间复杂度:O(textlen(s)+textlen(p))\n空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235951126","body":"用一个 right 指针不断地扩展窗口,直到窗口内的子串满足了“包含 t 中所有字符”的条件。一旦窗口满足条件,就记录下这个“可行解”,然后开始移动 left 指针,收缩窗口\n```python\nimport collections\n\nclass Solution:\n def minWindow(self, s: str, t: str) -> str:\n # need 存储 t 中字符的需求数量\n need = collections.Counter(t)\n # window 存储当前窗口中字符的数量\n window = collections.Counter()\n\n left, right = 0, 0\n valid = 0 # 记录 window 中有多少字符已经满足了 need 的要求\n \n # 记录最小覆盖子串的起始索引和长度\n start = 0\n min_len = float('inf')\n\n while right < len(s):\n # c 是将移入窗口的字符\n c = s[right]\n right += 1\n \n # 扩展窗口\n if c in need:\n window[c] += 1\n if window[c] == need[c]:\n valid += 1\n \n # 判断左侧窗口是否要收缩\n while valid == len(need):\n # 在这里更新最小覆盖子串\n if right - left < min_len:\n start = left\n min_len = right - left\n\n # d 是将移出窗口的字符\n d = s[left]\n left += 1\n \n # 收缩窗口\n if d in need:\n if window[d] == need[d]:\n valid -= 1\n window[d] -= 1\n\n # 返回最小覆盖子串,如果 min_len 还是初始值,说明没有找到\n return \"\" if min_len == float('inf') else s[start : start + min_len]\n```\n时间复杂度: O(len(s)+len(t))\n空间复杂度: O(N), N是字符集的大小","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3244023262","body":"dfs\n```python\nfrom typing import List\n\nclass Solution:\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n if not grid:\n return 0\n \n rows, cols = len(grid), len(grid[0])\n max_area = 0\n \n def dfs(r, c):\n # 边界条件检查 & 终止条件 (遇到水或已访问过的陆地)\n if not (0 <= r < rows and 0 <= c < cols and grid[r][c] == 1):\n return 0\n \n # 将当前单元格标记为已访问 (沉岛)\n grid[r][c] = 0\n \n # 当前单元格面积为 1,并递归探索四个方向\n return (1 + dfs(r + 1, c) +\n dfs(r - 1, c) +\n dfs(r, c + 1) +\n dfs(r, c - 1))\n\n # 遍历整个网格\n for r in range(rows):\n for c in range(cols):\n if grid[r][c] == 1:\n current_area = dfs(r, c)\n max_area = max(max_area, current_area)\n \n return max_area\n```\n时间复杂度O(MN)\n空间复杂度最坏O(MN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3251910064","body":"Multi-Source BFS\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxDistance(self, grid: List[List[int]]) -> int:\n n = len(grid)\n queue = collections.deque()\n \n # 1. 初始化:将所有陆地加入队列\n for r in range(n):\n for c in range(n):\n if grid[r][c] == 1:\n queue.append((r, c))\n \n # 边缘情况:如果全是陆地或全是海洋\n if len(queue) == 0 or len(queue) == n * n:\n return -1\n \n distance = -1\n # 2. 多源 BFS\n while queue:\n distance += 1\n # 遍历当前层的所有节点\n for _ in range(len(queue)):\n r, c = queue.popleft()\n \n # 探索四个方向的邻居\n for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:\n nr, nc = r + dr, c + dc\n \n if 0 <= nr < n and 0 <= nc < n and grid[nr][nc] == 0:\n grid[nr][nc] = 1 # 标记为已访问\n queue.append((nr, nc))\n \n return distance\n```\n时间复杂度:O(N^2)\n空间复杂度:O(N^2)\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251914219","body":"模拟+bfs\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n \n total_candies = 0\n \n # 我们拥有的、但未打开的盒子\n my_closed_boxes = set()\n # 可以打开并处理的盒子队列\n queue = collections.deque()\n\n # 初始化\n for box_idx in initialBoxes:\n if status[box_idx] == 1:\n queue.append(box_idx)\n else:\n my_closed_boxes.add(box_idx)\n\n while queue:\n box_idx = queue.popleft()\n \n # 1. 拿糖果\n total_candies += candies[box_idx]\n \n # 2. 拿钥匙,并用新钥匙尝试打开已有的盒子\n for key in keys[box_idx]:\n status[key] = 1 \n if key in my_closed_boxes:\n queue.append(key)\n my_closed_boxes.remove(key)\n \n # 3. 拿新盒子\n for contained_box in containedBoxes[box_idx]:\n if status[contained_box] == 1:\n queue.append(contained_box)\n else:\n my_closed_boxes.add(contained_box)\n \n return total_candies\n```\n时间复杂度: O(盒子数+钥匙数+内涵盒子数)\n\n空间复杂度: O(盒子数)。最坏情况下要存储所有盒子的信息。\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260205356","body":"dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n```python\nclass Solution:\n def minCostClimbingStairs(self, cost: List[int]) -> int:\n n = len(cost)\n dp = [0] * (n + 1)\n \n # dp[0] 和 dp[1] 默认为 0,因为可以从这两级开始\n \n # 从第 2 级台阶开始,应用转移方程\n for i in range(2, n + 1):\n dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n \n return dp[n]\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3276673110","body":"dp[i] = max(nums[i-1] + dp[i-2], dp[i-1])\n\n```python\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n n = len(nums)\n if n == 0: return 0\n if n == 1: return nums[0]\n \n dp = [0] * (n + 1)\n dp[0] = 0\n dp[1] = nums[0]\n \n for i in range(2, n + 1):\n dp[i] = max(nums[i-1] + dp[i-2], dp[i-1])\n \n return dp[n]\n```\n可以优化到只依赖前两个状态来节省内存空间\n```python\nfrom typing import List\n\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n # rob_prev 代表 dp[i-2],rob_curr 代表 dp[i-1]\n rob_prev, rob_curr = 0, 0\n \n for num in nums:\n # 计算 dp[i] = max(num + dp[i-2], dp[i-1])\n temp = max(num + rob_prev, rob_curr)\n # 更新状态,为下一次循环做准备\n rob_prev = rob_curr\n rob_curr = temp\n \n return rob_curr\n```\n时间复杂度: O(N)\n空间复杂度: O(1)\n\n\n\n\n\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3276687323","body":"dp[i] = 1 + max(dp[j]),其中 0 <= j < i 且 nums[j] < nums[i]。\n```python\nfrom typing import List\n\nclass Solution:\n def findNumberOfLIS(self, nums: List[int]) -> int:\n n = len(nums)\n if n <= 1:\n return n\n \n # lengths[i]: 以 nums[i] 结尾的 LIS 长度\n # counts[i]: 以 nums[i] 结尾的 LIS 个数\n lengths = [1] * n\n counts = [1] * n\n\n # 填充 DP 数组\n for i in range(n):\n for j in range(i):\n if nums[j] < nums[i]:\n # 情况一:发现更长的子序列\n if lengths[j] + 1 > lengths[i]:\n lengths[i] = lengths[j] + 1\n counts[i] = counts[j] # 路径数继承\n # 情况二:发现另一条同样长的子序列\n elif lengths[j] + 1 == lengths[i]:\n counts[i] += counts[j] # 路径数累加\n\n max_len = max(lengths)\n result = 0\n for i in range(n):\n if lengths[i] == max_len:\n result += counts[i]\n \n return result\n```\n时间复杂度: O(N^2)\n\n空间复杂度: O(N)\n\n","onTime":false},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3276694316","body":"dp[r][c] =骑士当前位于棋盘上 (r, c) 位置的概率\n从 (r, c) 出发,能为下一个状态 dp_curr 中的 (nr, nc) 贡献 dp_prev[r][c] / 8 的概率\ndp_curr[nr][nc]=\\sum dp(nr, nc)\n```python\nfrom typing import List\n\nclass Solution:\n def knightProbability(self, n: int, k: int, row: int, column: int) -> float:\n # dp[r][c] 表示骑士在 (r, c) 位置的概率\n dp = [[0.0] * n for _ in range(n)]\n dp[row][column] = 1.0\n \n # 骑士的8个移动方向\n moves = [(-2, -1), (-2, 1), (-1, -2), (-1, 2),\n (1, -2), (1, 2), (2, -1), (2, 1)]\n \n # 迭代 k 步\n for _ in range(k):\n # dp_next 用于存储下一步的概率分布\n dp_next = [[0.0] * n for _ in range(n)]\n \n # 遍历棋盘上所有位置\n for r in range(n):\n for c in range(n):\n # 如果当前位置有概率 > 0\n if dp[r][c] > 0:\n # 尝试8种移动\n for dr, dc in moves:\n nr, nc = r + dr, c + dc\n \n # 如果移动后的位置在棋盘内\n if 0 <= nr < n and 0 <= nc < n:\n # 将概率贡献给下一个状态\n dp_next[nr][nc] += dp[r][c] / 8.0\n \n # 用新状态覆盖旧状态\n dp = dp_next\n \n # 计算最终仍在棋盘上的总概率\n total_probability = sum(sum(row) for row in dp)\n return total_probability\n```\n时间复杂度 O(kn^2)\n空间复杂度: O(n^2)","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gjwang224":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3086564307","body":"## Code\n```cpp\nclass Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n int len = num.size()-1;\n vector returnNum;\n int tmp=0;\n \n while(k && len>=0){\n returnNum.push_back((num[len] + k%10 + tmp)%10);\n tmp = (num[len] + k%10 + tmp)/10;\n len--;\n k = k/10;\n }\n\n while(k){\n returnNum.push_back((k%10 + tmp)%10);\n tmp = (k%10 + tmp)/10;\n k = k/10;\n }\n \n while(len>=0){\n returnNum.push_back((num[len] + tmp)%10);\n tmp = (num[len] + tmp)/10;\n len--;\n }\n \n if(tmp) returnNum.push_back(tmp);\n reverse(returnNum.begin(), returnNum.end());\n return returnNum;\n }\n};","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3093190969","body":"#### C++\n``` C++\nclass Solution {\npublic:\n vector shortestToChar(string s, char c) {\n vector dis, rearr;\n for(int i = 0; i < s.size(); i++) if(s.at(i) == c) dis.push_back(i);\n for(int i = 0; i < s.size(); i++){\n int minn = 1e5+5;\n for(int j = 0; j < dis.size(); j++){\n minn = min(minn, abs(i-dis.at(j)));\n }\n rearr.push_back(minn);\n }\n return rearr;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3087031064","body":"### C++ 代码\n``` C++\nclass CustomStack {\npublic:\n int stack[1005];\n int size = -1, mS;\n CustomStack(int maxSize) {\n mS = maxSize;\n }\n \n void push(int x) {\n if(size < mS-1){\n stack[++size] = x;\n }\n }\n \n int pop() {\n if(size < 0) return -1;\n else return stack[size--];\n }\n \n void increment(int k, int val) {\n for(int i = 0; i < k; i++){\n stack[i] += val;\n }\n }\n};\n\n/**\n * Your CustomStack object will be instantiated and called as such:\n * CustomStack* obj = new CustomStack(maxSize);\n * obj->push(x);\n * int param_2 = obj->pop();\n * obj->increment(k,val);\n */\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3086899860","body":"### 思路 \n遍历整个字符串,总共有四种可能,分别是 数字 字母 左括号 右括号\n1. 数字:定义`digit`存储读取到的数字\n2. 字母:可以直接读取累加至`res`\n3. 左括号:需要将前面的`res`和`digit`分别入栈,并将其赋为0和”“\n4. 右括号:读取栈顶元素,循环拼接后,累加至`res`\n### C++ 代码\n``` C++\nclass Solution {\npublic:\n string decodeString(string s) {\n stack numStack;\n stack strStack;\n int digit=0;\n string res=\"\";\n\n for(int i = 0; i < s.size(); i++){\n if(s.at(i) >= '0' && s.at(i) <= '9'){// 数字\n digit = digit*10+s.at(i)-'0';\n } else if(s.at(i) >= 'a' && s.at(i) <= 'z'){// 字符\n res += s.at(i);\n } else if(s.at(i) == '['){// 左括号\n numStack.push(digit);\n strStack.push(res);\n res = \"\";\n digit=0;\n } else {// 右括号\n int count = numStack.top();\n numStack.pop();\n string outString = strStack.top();\n strStack.pop();\n for(int i = 0; i < count; i++) outString += res;\n res = outString;\n }\n }\n return res;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092046146","body":"#### 思路\n\n1. `push`和`empty`可以直接进行操作。\n2. `pop`和 `peek`需要得到入栈的第一个元素,可以使用一个辅助栈,对第一个栈进行出栈同时第二个栈进行入栈操作,这样第二个栈`top`得到的元素就是第一个栈入栈的第一个元素。\n\n``` C++\nclass MyQueue {\npublic:\n stack tmp;\n stack stack;\n MyQueue() {\n }\n \n void push(int x) {\n tmp.push(x);\n }\n \n int pop() {\n while(!tmp.empty()){\n stack.push(tmp.top());\n tmp.pop();\n }\n int a = stack.top();\n stack.pop();\n while(!stack.empty()){\n tmp.push(stack.top());\n stack.pop();\n }\n return a;\n }\n \n int peek() {\n while(!tmp.empty()){\n stack.push(tmp.top());\n tmp.pop();\n }\n int a = stack.top();\n while(!stack.empty()){\n tmp.push(stack.top());\n stack.pop();\n }\n return a;\n }\n \n bool empty() {\n return tmp.empty();\n }\n};\n\n/**\n * Your MyQueue object will be instantiated and called as such:\n * MyQueue* obj = new MyQueue();\n * obj->push(x);\n * int param_2 = obj->pop();\n * int param_3 = obj->peek();\n * bool param_4 = obj->empty();\n */\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094511890","body":"#### 哈希\n\n```c++\nclass Solution {\npublic:\n int maxChunksToSorted(vector& arr) {\n unordered_map ans;\n vector tmp = arr;\n sort(tmp.begin(), tmp.end());\n int cnt=0;\n for(int i = 0; i < arr.size(); i++){\n ans[arr[i]]++;\n ans[tmp[i]]--;\n if(ans[arr[i]]==0) ans.erase(arr[i]);\n if(ans[tmp[i]]==0) ans.erase(tmp[i]);\n if(ans.empty()) cnt++;\n }\n return cnt;\n }\n};\n```\n时间复杂度 nlog(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095832085","body":"#### 思路\n\n先将链表变为首尾相连循环链表,然后通过`k`找到断开位置的前一个元素,断开,返回头节点即可。\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * struct ListNode *next;\n * };\n */\nstruct ListNode* rotateRight(struct ListNode* head, int k) {\n if(head==NULL || k==0) return head;\n int len=1;\n struct ListNode * p=head;\n if(p) len=1;\n while(p->next){\n len++;\n p = p->next;\n }\n //printf(\"%d\\n\", len);\n p->next = head;\n k = k%len;\n for(int i = 0; i < len-k-1; i++){\n head = head->next;\n }\n p = head->next;\n head->next = NULL;\n return p;\n}\n```\n\n时间复杂度O(n)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3102195778","body":"#### C代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * struct ListNode *next;\n * };\n */\nstruct ListNode* swapPairs(struct ListNode* head) {\n //struct ListNode Node;\n //Node.next = head;\n //struct ListNode* tmp = &Node;\n struct ListNode* Node=(struct ListNode*)malloc(sizeof(struct ListNode));\n Node->next = head;\n struct ListNode* tmp = Node;\n while(tmp->next && tmp->next->next){\n struct ListNode* first = tmp->next;\n struct ListNode* second = tmp->next->next;\n tmp->next = second;\n first->next = second->next;\n second->next = first;\n tmp = first;\n }\n return Node->next;\n}\n```\n\n时间复杂度O(n)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3106692662","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode() : val(0), next(nullptr) {}\n * ListNode(int x) : val(x), next(nullptr) {}\n * ListNode(int x, ListNode *next) : val(x), next(next) {}\n * };\n */\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n TreeNode* sortedListToBST(ListNode* head) {\n if(head==NULL) return NULL;\n int n = 0;\n for(auto p=head; p; p=p->next){\n n++;\n }\n if(n==1) return new TreeNode(head->val);\n auto cur = head;\n for(int i = 0; i < n/2-1; i++) cur = cur->next;\n auto root = new TreeNode(cur->next->val);\n root->right = sortedListToBST(cur->next->next);\n cur->next = NULL;\n root->left = sortedListToBST(head);\n return root;\n }\n};\n```\n\n时间复杂度O(nlog(n))","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112024319","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode(int x) : val(x), next(NULL) {}\n * };\n */\nclass Solution {\npublic:\n ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {\n if(headA==NULL || headB==NULL) return NULL;\n ListNode *a = headA, *b = headB;\n while(a!=b){\n if(a == NULL) a = headB;\n a = a->next;\n if(b == NULL) b = headA;\n b = b->next;\n }\n return a;\n }\n};\n```\n\n时间复杂度O(n+m)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116982615","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode(int x) : val(x), next(NULL) {}\n * };\n */\nclass Solution {\npublic:\n ListNode *detectCycle(ListNode *head) {\n unordered_map visit;\n while(head){\n visit[head]++;\n if(visit[head]==2) return head;\n head=head->next;\n } \n return NULL;\n }\n};\n```\n\n时间复杂度O(n)\n\n空间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121297965","body":"#### C++代码\n\n- hash表: `unordered_map hash;`\n- 双向链表用来 将`Node` 根据 使用时间 进行排序。靠近左端表示最近使用,靠近右端表示较长时间没有使用。\n\n``` c\nclass LRUCache {\npublic:\n struct Node {\n int key, val;\n Node *prev, *next;\n Node(int _key, int _val): key(_key), val(_val), prev(NULL), next(NULL){}\n }*L, *R; //L头节点 R尾节点\n\n unordered_map hash;\n int n;\n\n void delete_node(Node *p){\n p->next->prev = p->prev;\n p->prev->next = p->next;\n }\n\n void insert_node(Node *p){ //链表头插入\n p->next = L->next;\n L->next->prev = p;\n p->prev = L;\n L->next = p;\n }\n\n LRUCache(int capacity) {\n n = capacity;\n L = new Node(-1, -1);\n R = new Node(-1, -1);\n L->next = R;\n R->prev = L;\n }\n \n int get(int key) {\n if(!hash.count(key)) return -1;\n else{\n auto p = hash[key];\n delete_node(p);\n insert_node(p);\n return p->val;\n }\n }\n \n void put(int key, int value) {\n if(!hash.count(key)){\n if(hash.size()==n){\n auto p = R->prev;\n delete_node(p);\n hash.erase(p->key);\n }\n auto p = new Node(key, value);\n hash[key] = p;\n insert_node(p);\n }else {\n auto p = hash[key];\n p->val = value;\n delete_node(p);\n insert_node(p);\n }\n }\n};\n\n/**\n * Your LRUCache object will be instantiated and called as such:\n * LRUCache* obj = new LRUCache(capacity);\n * int param_1 = obj->get(key);\n * obj->put(key,value);\n */\n```\n\n时间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124142122","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n int maxDepth(TreeNode* root) {\n if(root == NULL) return 0;\n return max(maxDepth(root->left), maxDepth(root->right)) + 1;\n }\n};\n```\n\n时间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125702334","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n bool isSameTree(TreeNode* p, TreeNode* q) {\n if(p==NULL && q==NULL) return true;\n else if(p==NULL && q!=NULL) return false;\n else if(p!=NULL && q==NULL) return false;\n else if(q->val != p->val) return false;\n else return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);\n }\n};\n```\n\n时间复杂度O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130752830","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n int dfs(TreeNode *root, int sum) {\n if(root == nullptr) return 0;\n int tmp = sum*10+root->val;\n if(root->left==nullptr && root->right==nullptr) return tmp;\n return dfs(root->left, tmp) + dfs(root->right, tmp);\n }\n int sumNumbers(TreeNode* root) {\n return dfs(root, 0);\n }\n};\n```\n\n时间复杂度O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135775890","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n void dfs(TreeNode* root, int height, int &curVal, int &curHeight){\n if(root==nullptr) return ;\n height++;\n dfs(root->left, height, curVal, curHeight);\n dfs(root->right, height, curVal, curHeight);\n if (height > curHeight) {\n curHeight = height;\n curVal = root->val;\n }\n }\n int findBottomLeftValue(TreeNode* root) {\n int curVal=0, curHeight=0;\n dfs(root, 0, curVal, curHeight);\n return curVal;\n }\n};\n```\n\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3139476046","body":"#### C++代码\n\n``` c\nclass Codec {\npublic:\n\n // Encodes a tree to a single string.\n void rserialize(TreeNode* root, string& str) {\n // 前序遍历(中左右,遇到空节点输入None),用逗号隔开\n if (root == NULL) str += \"None,\";\n else {\n str += to_string(root->val) + \",\";\n rserialize(root->left, str);\n rserialize(root->right, str);\n } \n }\n string serialize(TreeNode* root) {\n string ret;\n rserialize(root, ret);\n return ret;\n }\n\n // Decodes your encoded data to tree.\n\n TreeNode* rdeserialize(list& dataArray) {\n if(dataArray.front() == \"None\") {\n dataArray.erase(dataArray.begin());\n return NULL;\n }\n // 前序遍历(中左右)恢复树结构\n TreeNode* root = new TreeNode(stoi(dataArray.front()));\n dataArray.erase(dataArray.begin());\n root->left = rdeserialize(dataArray);\n root->right = rdeserialize(dataArray);\n return root;\n }\n\n TreeNode* deserialize(string data) {\n list dataArray;\n string str;\n // 添加各节点val\n // 按引用传递,按值传递会增加耗时\n for (auto& c : data) {\n if (c == ',') {\n // 以逗号作为节点分割\n dataArray.push_back(str);\n str.clear();\n } else {\n str.push_back(c);\n }\n }\n // 添加尾部节点val\n if (!str.empty()) {\n dataArray.push_back(str);\n str.clear();\n }\n return rdeserialize(dataArray);\n }\n};\n\n\n//参考链接:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/solutions/1536508/by-peaceful-thompsonfsu-8143/\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144061296","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n // 深度优先搜索函数 参数:当前节点、当前行号、当前列号、存储节点信息的map\n void dfs(TreeNode* node, int row, int col, map>>& colNodes) {\n // 若节点为空,直接返回\n if (node == nullptr) {\n return;\n }\n \n // 记录当前节点的信息:(行号, 值) 存入对应列的列表中\n colNodes[col].push_back({row, node->val});\n \n // 递归处理左子树:行号+1,列号-1\n dfs(node->left, row + 1, col - 1, colNodes);\n \n // 递归处理右子树:行号+1,列号+1\n dfs(node->right, row + 1, col + 1, colNodes);\n }\n\n // 自定义比较函数:用于对同一列的节点进行排序\n static bool compareNodes(const pair& a, const pair& b) {\n // 若行号相同,按节点值从小到大排序\n if (a.first == b.first) {\n return a.second < b.second;\n }\n // 否则按行号从小到大排序\n return a.first < b.first;\n }\n\n vector> verticalTraversal(TreeNode* root) {\n // 存储列号到节点信息的映射:key=列号,value=该列所有节点的(行号, 值)\n map>> colNodes;\n \n // 深度优先遍历树,记录每个节点的位置和值\n dfs(root, 0, 0, colNodes);\n \n // 最终结果容器\n vector> result;\n \n // 遍历每一列\n for (auto& entry : colNodes) {\n // 对当前列的节点按规则排序(使用自定义比较函数)\n sort(entry.second.begin(), entry.second.end(), compareNodes);\n \n // 提取排序后的节点值,组成当前列的结果\n vector colValues;\n for (auto& node : entry.second) {\n colValues.push_back(node.second); // node.second是节点值\n }\n result.push_back(colValues);\n }\n \n return result;\n }\n};\n\n//参考链接:https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/solutions/3739810/dui-wo-lai-shuo-huan-shi-fu-za-liao-xie-iar46/\n\n```\n\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146382948","body":"#### C++代码\n\n``` c\nclass Solution {\npublic:\n vector twoSum(vector& nums, int target) {\n unordered_map hash;\n for(int i = 0; i < nums.size(); i++){\n auto iter = hash.find(target-nums[i]);\n if(iter != hash.end()) return {iter->second, i};\n hash[nums[i]] = i;\n }\n return {};\n }\n};\n```\n\n时间复杂度:O(n)\n\n空间复杂度:O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148379333","body":"#### C++\n\n``` c\nclass Solution {\npublic:\n vector topKFrequent(vector& nums, int k) {\n vector ans;\n unordered_map f;\n for(int i = 0;i < nums.size();i++) {\n f[nums[i]]++;\n }\n priority_queue, vector >, greater > > q;\n for(auto& [num, count] : f) {\n if(q.size() < k)\n q.push({count, num});\n else {\n if(q.top().first < count) {\n q.pop();\n q.push({count, num});\n }\n }\n }\n while(!q.empty()) {\n //cout<>& points) {\n int result=0;\n for(vector P : points){\n unordered_map map;\n for(vector Q : points){\n int dis = (P[0]-Q[0])*(P[0]-Q[0])+(P[1]-Q[1])*(P[1]-Q[1]);\n map[dis]++;\n }\n for(auto [a,b] : map){\n result+=b*(b-1);\n }\n }\n return result;\n }\n};\n```\n\n时间复杂度:O(n2)\n空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3154861022","body":"``` c\nclass Solution {\npublic:\n int lengthOfLongestSubstring(string s) {\n unordered_map dic;\n int i = -1, res = 0, len = s.size();\n for(int j = 0; j < len; j++) {\n if (dic.find(s[j]) != dic.end())\n i = max(i, dic.find(s[j])->second);\n dic[s[j]] = j;\n res = max(res, j - i);\n }\n return res;\n }\n};\n```\n\n时间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3158408178","body":"\n\n``` c\nclass Solution {\npublic:\n vector findSubstring(string s, vector& words) {\n unordered_map hash;\n vector res;\n int n = s.length(), m = words.size();\n if (n == 0 || m == 0)\n return res;\n int len = words[0].length(), end = n - m * len;\n if (n < m * len)\n return res;\n for (auto word : words)\n hash[word]++;\n int size = hash.size();\n for (int k = 0; k < len; k++) {\n unordered_map cur_hash;\n int satisfy = 0;\n for (int i = k, j = k; j <= n - len;) {\n string cur = s.substr(j, len);\n if (hash.find(cur) == hash.end()) {\n j = j + len;\n i = j;\n cur_hash.clear();\n satisfy = 0;\n } else {\n cur_hash[cur]++;\n if (cur_hash[cur] == hash[cur])\n satisfy++;\n else if (cur_hash[cur] > hash[cur]) {\n while (i < j && cur_hash[cur] > hash[cur]) {\n string temp = s.substr(i, len);\n i += len;\n cur_hash[temp]--;\n if (cur_hash[temp] == hash[temp] - 1)\n satisfy--;\n }\n }\n if (satisfy == size) {\n string temp = s.substr(i, len);\n cur_hash[temp]--;\n satisfy--;\n res.push_back(i);\n i = i + len;\n }\n j = j + len;\n }\n }\n }\n return res;\n }\n};\n```\n\n时间复杂度O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3163210992","body":"\n\n``` c\nclass Solution {\npublic:\n int minSubarray(vector &nums, int p) {\n int n = nums.size(), s[n + 1];\n s[0] = 0;\n for (int i = 0; i < n; i++) s[i + 1] = (s[i] + nums[i]) % p;\n int x = s[n];\n\n int ans = n;\n unordered_map last;\n for (int i = 0; i <= n; ++i) {\n last[s[i]] = i;\n auto it = last.find((s[i] - x + p) % p);\n if (it != last.end()) {\n ans = min(ans, i - it->second);\n }\n }\n return ans < n ? ans : -1;\n }\n};\n```\n\n时间复杂度O(n)\n空间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3167368429","body":"\n\n``` c\nclass Solution {\npublic:\n ListNode* middleNode(ListNode* head) {\n int len = 0;\n ListNode* p = head;\n while (p != nullptr) {\n len++;\n p = p->next;\n }\n int k = 0;\n p = head;\n while (k < len / 2) {\n k++;\n p = p->next;\n }\n return p;\n }\n};\n```\n\n时间复杂度O(n)\n空间复杂度O(1)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169793378","body":"```c\nclass Solution {\npublic:\n int removeDuplicates(vector& nums) {\n if (nums.empty()) {\n return 0;\n }\n int slow = 0;\n for (int fast = 1; fast < nums.size(); fast++) {\n if (nums[fast] != nums[slow]) {\n slow++;\n nums[slow] = nums[fast];\n }\n }\n return slow + 1;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172513759","body":"```c\n\nclass Solution {\npublic:\n int searchInsert(vector& nums, int target) {\n int n = nums.size();\n int left = 0, right = n - 1, ans = n;\n while (left <= right) {\n int mid = ((right - left) / 2) + left;\n if (target <= nums[mid]) {\n ans = mid;\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n return ans;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173606055","body":"```c\nclass Solution {\npublic:\n vector maxSlidingWindow(vector& nums, int k) {\n if(nums.size() == 0 || k == 0) return {};\n deque deque;\n vector res(nums.size() - k + 1);\n for(int j = 0, i = 1 - k; j < nums.size(); i++, j++) {\n if(i > 0 && deque.front() == nums[i - 1])\n deque.pop_front();\n while(!deque.empty() && deque.back() < nums[j])\n deque.pop_back();\n deque.push_back(nums[j]);\n if(i >= 0)\n res[i] = deque.front();\n }\n return res;\n }\n }\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178242802","body":"```c\nclass Solution {\npublic:\n int findJudge(int n, vector>& trust) {\n vector inDegrees(n + 1);\n vector outDegrees(n + 1);\n for (auto& edge : trust) {\n int x = edge[0], y = edge[1];\n ++inDegrees[y];\n ++outDegrees[x];\n }\n for (int i = 1; i <= n; ++i) {\n if (inDegrees[i] == n - 1 && outDegrees[i] == 0) {\n return i;\n }\n }\n return -1;\n }\n};\n\n```","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3213208919","body":"```C++\nclass Solution {\npublic:\n bool judgeCircle(string moves) {\n int R=0,L=0,U=0,D=0;\n for(int i = 0; i < moves.size(); i++){\n if(moves[i]=='R') R++;\n if(moves[i]=='L') L++;\n if(moves[i]=='U') U++;\n if(moves[i]=='D') D++;\n }\n if(R==L&&U==D) return true;\n else return false;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193632408","body":"```c\n\nclass Solution {\npublic:\n vector getOrder(vector>& tasks) {\n long now = 0; \n priority_queue, vector>, greater> >entry, ready;\n int size = tasks.size();\n\n for (int i = 0; i < size; ++i){\n entry.push(make_pair(tasks[i][0], i));\n }\n\n vector res;\n while(!entry.empty() or !ready.empty()){\n if (ready.empty()){\n now = entry.top().first;\n while (!entry.empty() && now == entry.top().first){ \n ready.push(make_pair(tasks[entry.top().second][1], entry.top().second));\n entry.pop();\n }\n }\n res.emplace_back(ready.top().second);\n now += ready.top().first;\n ready.pop();\n\n while(!entry.empty() && entry.top().first <= now){ \n ready.push(make_pair(tasks[entry.top().second][1], entry.top().second));\n entry.pop();\n }\n }\n\n return res;\n }\n};\n\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3213243204","body":"```C++\nclass Solution {\npublic:\n int numberOfRounds(string startTime, string finishTime) {\n // 转化为分钟\n int t0 = 60 * stoi(startTime.substr(0, 2)) + stoi(startTime.substr(3, 2));\n int t1 = 60 * stoi(finishTime.substr(0, 2)) + stoi(finishTime.substr(3, 2));\n if (t1 < t0){\n t1 += 1440;\n }\n // 第一个小于等于 finishTime 的完整对局的结束时间\n t1 = t1 / 15 * 15;\n return max(0, (t1 - t0)) / 15;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3213232703","body":"```C++\nclass Solution {\npublic:\n int minCharacters(string a, string b) {\n int n = a.size(), m = b.size();\n vector cntA(26, 0), cntB(26, 0);\n for (char c : a)\n ++cntA[c - 'a'];\n for (char c : b)\n ++cntB[c - 'a'];\n\n // 计算前缀和\n vector preA(27, 0), preB(27, 0);\n for (int i = 0; i < 26; ++i) {\n preA[i + 1] = preA[i] + cntA[i];\n preB[i + 1] = preB[i] + cntB[i];\n }\n\n int ans = INT_MAX;\n\n // 条件 1\n for (int k = 1; k < 26; ++k) {\n int costA = n - preA[k];\n int costB = preB[k];\n ans = min(ans, costA + costB);\n }\n\n // 条件 2\n for (int k = 0; k < 25; ++k) {\n int costA = preA[k + 1];\n int costB = m - preB[k + 1];\n ans = min(ans, costA + costB);\n }\n\n // 条件 3\n for (int ch = 0; ch < 26; ++ch) {\n int costA = n - cntA[ch];\n int costB = m - cntB[ch];\n ans = min(ans, costA + costB);\n }\n\n return ans;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3213189716","body":"```c++\nclass Solution {\npublic:\n vector sortArray(vector& nums) {\n if (nums.empty()) return nums;\n quickSort(nums, 0, static_cast(nums.size()) - 1);\n return nums;\n }\n\nprivate:\n void quickSort(vector& nums, int l, int r) {\n if (l >= r) return;\n int p = partition(nums, l, r);\n quickSort(nums, l, p - 1);\n quickSort(nums, p + 1, r);\n }\n\n int partition(vector& nums, int l, int r) {\n int idx = l + rand() % (r - l + 1);\n swap(nums[idx], nums[r]);\n int pivot = nums[r];\n\n int i = l - 1;\n for (int j = l; j < r; ++j) {\n if (nums[j] < pivot) {\n ++i;\n swap(nums[i], nums[j]);\n }\n }\n swap(nums[i + 1], nums[r]);\n return i + 1;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3213176894","body":"```c++\nclass Solution {\npublic:\n int mySqrt(int x) {\n int l = 0, r = x, ans=0;\n while(l<=r){\n int mid = l + (r-l)/2;\n if((long long)mid*mid<=x){\n ans = mid;\n l = mid+1;\n } else{\n //ans = mid;\n r = mid-1;\n }\n \n }\n return ans;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3213126368","body":"```c++\nclass Solution {\npublic:\n int firstBadVersion(int n) {\n int l = 1, r = n;\n while(l w;\n\n int reversePairs(vector& nums) {\n return merge_sort(nums, 0, nums.size()-1);\n }\n\n int merge_sort(vector &nums, int l, int r) {\n if(l>=r) return 0;\n int mid = l+r>>1;\n int res = merge_sort(nums, l, mid) + merge_sort(nums, mid+1, r);\n for(int i = l, j = mid+1; i <= mid; i++){\n while(j<=r && nums[j]*2ll& houses, vector& heaters) {\n for (int i = 0, j = 0; i < houses.size(); i ++ ) {\n while (j < heaters.size() && abs(heaters[j] - houses[i]) > mid)\n j ++ ;\n if (j >= heaters.size()) return false;\n }\n return true;\n }\n\n int findRadius(vector& houses, vector& heaters) {\n sort(houses.begin(), houses.end());\n sort(heaters.begin(), heaters.end());\n int l = 0, r = INT_MAX;\n while (l < r) {\n int mid = (long long)l + r >> 1;\n if (check(mid, houses, heaters)) r = mid;\n else l = mid + 1;\n }\n return r;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217486441","body":"```C++\nclass Solution {\npublic:\n bool check(vector& nums,int n,int k,int mid)\n {\n int cnt = 0;\n for(int i = 0,j = 1; i < n - 1 ; i ++)\n {\n while(j < n && nums[j] - nums[i] <= mid)\n j ++;\n cnt += j - i - 1;\n j = max(j,i + 1);\n }\n return cnt >= k;\n }\n int smallestDistancePair(vector& nums, int k)\n {\n int n = nums.size();\n sort(nums.begin(),nums.end());\n int left = 0,right = nums[n - 1] - nums[0];\n while(left < right)\n {\n int mid = (left + right) >> 1;\n if(check(nums,n,k,mid)) right = mid;\n else left = mid + 1;\n }\n return left;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3219872784","body":"```C++\nclass Solution {\npublic:\n int swimInWater(vector>& grid) {\n int m = grid.size(), n = grid[0].size();\n vector> dis(m, vector(n, INT_MAX));\n dis[0][0] = grid[0][0];\n vector> dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};\n priority_queue, vector>, greater<>> pq;\n pq.emplace(grid[0][0], 0, 0);\n while (!pq.empty()) {\n auto [d, x, y] = pq.top();\n pq.pop();\n if (x == m - 1 && y == n - 1) {\n return d;\n }\n if (d > dis[x][y]) {\n continue;\n }\n for (auto& dir : dirs) {\n int nx = x + dir[0], ny = y + dir[1];\n if (nx >= 0 && nx < m && ny >= 0 && ny < n) {\n int nd = max(d, grid[nx][ny]);\n if (nd < dis[nx][ny] ) {\n dis[nx][ny] = nd;\n pq.emplace(nd, nx, ny);\n }\n }\n }\n }\n return -1;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3223228330","body":"```C++\nclass Solution {\npublic:\n bool pd(char a){\n if(a == 'a'||a == 'e'||a == 'i'||a == 'o'||a == 'u') return true;\n return false;\n }\n int maxVowels(string s, int k) {\n int count = 0, cnt=0;\n int l = 0, r = k-1;\n for(int i = 0; i <= r; i++) if(pd(s.at(i))) count++;\n cnt = count;\n if(s.size() == k) return count;\n while(++r != s.size()){\n if(pd(s.at(l))) count--;\n if(pd(s.at(r))) count++;\n l++;\n cnt = max(cnt, count);\n }\n return cnt;\n }\n};\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243929010","body":"```C++\nclass Solution {\npublic:\n int getArea(vector>& grid, int i, int j) {\n if (i == grid.size() || i < 0)\n return 0;\n else if (j == grid[0].size() || j < 0)\n return 0;\n if (grid[i][j] == 1) {\n grid[i][j] = 0;\n return 1 + getArea(grid, i + 1, j) + getArea(grid, i - 1, j) +\n getArea(grid, i, j + 1) + getArea(grid, i, j - 1);\n }\n return 0;\n }\n int maxAreaOfIsland(vector>& grid) {\n int maxArea = 0;\n int area = 0;\n for (int i = 0; i < grid.size(); i++) {\n for (int j = 0; j < grid[0].size(); j++) {\n if (grid[i][j] == 1) {\n area = getArea(grid, i, j);\n maxArea = maxArea > area ? maxArea : area;\n }\n }\n }\n return maxArea;\n }\n};\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3268602696","body":"```C++\nclass Solution {\npublic:\n int longestCommonSubsequence(string text1, string text2) {\n int n = (int)text1.size(), m = (int)text2.size();\n vector dp(m + 1, 0);\n for (int i = 1; i <= n; ++i) {\n int prev = 0; // 相当于 dp[i-1][j-1]\n for (int j = 1; j <= m; ++j) {\n int tmp = dp[j];\n if (text1[i - 1] == text2[j - 1]) dp[j] = prev + 1;\n else dp[j] = max(dp[j], dp[j - 1]);\n prev = tmp;\n }\n }\n return dp[m];\n }\n};\n\n```\n时间复杂度O(n*m)\n空间复杂度O(min(n,m))","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290572491","body":"```C++\nclass Solution {\npublic:\n int coinChange(vector& coins, int amount) {\n vector dp(amount+1,INT_MAX);\n dp[0]=0;\n for(int i=0;i Date: Wed, 1 Oct 2025 11:22:46 +0000 Subject: [PATCH 06/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From 4a3bb682007118df7f8c1e8e977336052b5c6983 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 12:33:18 +0000 Subject: [PATCH 07/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index c333c9a4b6..2bc8d7caca 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759317173890,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759317173978},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759321997817,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759321997903},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From 8547fb142e503cdd0004d94a04a1f699d1ff7df0 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 12:56:07 +0000 Subject: [PATCH 08/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From c4eaa17b7d821cb7337b40d0b2d11f857bc15c81 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 13:25:45 +0000 Subject: [PATCH 09/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index 2bc8d7caca..608e0f3d59 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759321997817,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759321997903},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759325145672,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759325145755},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From 7d89801850931695743436612ed8a7e9751bed62 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 13:35:26 +0000 Subject: [PATCH 10/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From 3094188b4a2f6baa3aa488158cbe2ffb5e379daf Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 14:15:25 +0000 Subject: [PATCH 11/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index 608e0f3d59..b4ff05d815 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759325145672,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759325145755},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759328125165,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759328125249},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From fa95a58ae2ff29434ffe5d3dbafb5dc96ed0f291 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 14:28:28 +0000 Subject: [PATCH 12/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From 0a4454c85d6fbe5adf18a74d12c7bb81edd6206d Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 15:14:18 +0000 Subject: [PATCH 13/46] commit automatically --- package-lock.json | 197 ++++++++++++++++++--------------- static/meta.json | 2 +- static/solution/solutions.json | 2 +- 3 files changed, 108 insertions(+), 93 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index b4ff05d815..ee2869b60f 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759328125165,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759328125249},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759331658624,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759331658710},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file diff --git a/static/solution/solutions.json b/static/solution/solutions.json index f0fa3d0695..5f92548cb1 100644 --- a/static/solution/solutions.json +++ b/static/solution/solutions.json @@ -1 +1 @@ -{"1":{"day":1,"pres":["数组的遍历"],"tags":["数组"],"whys":null,"difficulty":"- 简单","description":"```\n对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。\n\n给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。\n\n \n\n示例 1:\n\n输入:A = [1,2,0,0], K = 34\n输出:[1,2,3,4]\n解释:1200 + 34 = 1234\n示例 2:\n\n输入:A = [2,7,4], K = 181\n输出:[4,5,5]\n解释:274 + 181 = 455\n示例 3:\n\n输入:A = [2,1,5], K = 806\n输出:[1,0,2,1]\n解释:215 + 806 = 1021\n示例 4:\n\n输入:A = [9,9,9,9,9,9,9,9,9,9], K = 1\n输出:[1,0,0,0,0,0,0,0,0,0,0]\n解释:9999999999 + 1 = 10000000000\n \n\n提示:\n\n1 <= A.length <= 10000\n0 <= A[i] <= 9\n0 <= K <= 10000\n如果 A.length > 1,那么 A[0] != 0\n\n```","content":"0961e884611df7d4ac47a79a9e3b6f257d8e3d84c28815f2546a3c7d65595a035782802456dafc2c2809827bef3c5c1bd14d07d3813a048bf263f62bb5fefe2ef43b2766959ac2fc046cd2b7869f517a3af7328790a5418a3bf424dcf5a2b5c05f2ddd042cba9d63203f137aadd4daf214bc076a7bcf1605f7075b0c830f9d54a739a8fcf3c94e787ba7408641de15b5555d00b17a292354cdd22c78eca5f0154c772b2568cfe02b4566c12f06df1c5f22abe7fb7a3704619e1ce97a49f53d2a5aad76fd4769cb7def9d730d8e66087aa517c2675b22ac8c09619ac733347e81a3415b9a53673ea5826c39bee7c9ee9d175fdb410921ab88476e916b6c234dd0ce03d5a3ebea6aca3677334b31191d33feb3e4209867a62e65b9804597e90b8b0466f0ee0998a3a21ca93c690c966349e9911b59ede30085b21480f11ed748ff424ce0fb1e6d3b75d8d16f958cda02d2c0a089feca80a011af4a8ca6605d49fc84caf177a6b378c756526703556b829604bf8b341fdd92f78fee6feae7fcb76c1ca251196530baf51721f42f77d109389c320efe9abf4f9fa992d34fe591fbcc2951477a72dd0a6688f27a52b8bcab7fa7f4f7bbd861b57175a797720d71c2e19445fefc8c4f9f291da2552f69c2382d639c7ad8d2ffb98085658fe6714c6b64d710753759e7ed42fb9e8f3e1342728acfe68f75dbde8a64b90e04d398854c9a9f4e80b22b931043b28a40e5b0e8d71139bc665544feb164be994f1e29680156e01e536052390b2f33527dcc9ee0ec256490ee9b8147bb025cda907205ed003f48140ac92e491e6efea2bdcbff5df4e4e323ca4ca346b47e97ee21ec2ec9462c705b735abfb7c391bdb392c56463f9e27f1d6e611607741cc3b40bb49ce4a1fa4a1635e0ae2ede8f899bc4ef5d9a52173b063e69b966c839af301776c6187508d85186b065d6d9bb673d98a23c19770f5281789f4c7b45ac8e05b23388cb6bf92ca3489cf8e533833b72edf06b8d222512ca9de6b4985f069cff4f37d7f3c41a0aff5fddde8dd66f994a166b492fcf4290091bf866b3c88da94276807070b305f8fb74bb8c50a70b10b8d9aa636e9470dff4d58a17cc75500b0f563c82cd0db5bc33b0aac0932cce53da08fb678755e4fc225b67828d9a563a968b050b253f277a36d9df9f6b114db3e0af2b6352946090989fe59b7928e548a13a9f0db226cca3d4d95a3f5d6ca0459456451229d8134a29298fd82809b841ef30e6679cf45235e111a7fb3800a4a353ebabacb497c24533124ebbd0cb243b1c21374f6a294c78a3796bf3bf6fe3598db51c64eb22045b904aa7d20a58584b3adf4aa3a967fc67ca9311c49acf7f2166c9d8ea60392d0c690a93c761247d00d34d9f4434f733abd6d29bb61b2a2d4802e3f3290490464c961d3a76a8820798a5253edf78feac30e5d8a44e11df1ed041a0126aeb05a87b7ef2ef4a986b9dcf0692360a7ce89690b66b7fe44c39edc33d5cb2d0f0b5f9faa3afec9ec7f99d6e85074c0b65c1e7c075f9d1dad1a377d5414d35118008ed5a732b2ef3022754c86f0af2c5ee2bd395f4fd128e9119681620d78e5ff3246ff7414862a33f54ef71702465824043ea75a4df693600a9c5df185989ac8d726313eb6ed63a8cad8bb10541867b22a76a1973656525549bd47788b2bb0a15022e96e76efe4fb9da8f9ea713ca8719cdad147eb190008c0a2c4d688ebb0b23fa72a9789fd302c12f046c17be1f9b2b94fcb92e66adbdf715a8d3ceb98d5e6aa21ccd24fb85b19008610fd87a73339b01b486ee6d72ab87606284cd02a9a6c2275e8c294b3c416ca4d0ddcf1b31307b2839b8bbaafd4c06e627924139344182cfb03b142c362dc9cc952a72104113e73cbc3bf51949729d83c58f8b8bb807dfe5813ee165d961916b929bfe2c781258fbd37d079c5eeae2ac1aedff334aa7d794930a18975006d86b3dd353ff99c21449aa3561f8bcfea18a0ad754890143d04109d6aa7e036f5011dbdf7441db6dbd0bc6079bea4790a7e74b31bb50d61325b374b1cc4ed8906aef52dbb55cf84e47f8cd4974533d2ffb4c5b245a1df84087779c1a14708d071e8f853c7c5008dd868ef0c6850c0b99a2afe44d0b94802bbe7e211a77ceeac6c90cbb87524728dc32d8cc230325e181bd44a666e000e7fe9c09f8d07e9e6f7692e32a3c8a13819233fd537d784341d58f937ea176f82e50bea2ba5ed98ec7bbfbb7a8cfa520d80e0271b007876ce072d61c7536723d634faeaffa0e0bdab2c2048c99b72c568e380e91212b2550a12bdd2c78c21b26953470fa7573f39dfc5a4f5228330fe9a841f7d67518dbe21219ab56c22d4b236b475fe84bcaaa2be690a6d04efb0fba234416c2719131ae36ac220acc0f4814acc8a32d9563e3baea8e608b27ea9e4f3b16ed19ae0e2778269767788ad4282f87c4a1d458c624dc873e5f783e6bfd4b9d9c7208e14f5cccd457a7ae5e5a0313d5f6e563932f2985bd997e030082db407678a96f9c689cccf6aa7418865f8e590aadf5037b9059fde0d503741a98042ef5071d105ffc9d144016e1b2a8128edafba3869da15d45edf86f6fe834791dbd238651fe7315953c059c6bc0f46a1140512ba01127696dd482575040586a3346ff42027778eb52b3727ee9bc5b44379e7b4cb432ca77346c7b02452536ed21600d2aa6b531f5d19eafa8db35e8bbc0b58eae0927fea0d3d3a17ab9451803b5567893623d59f9e9be0fc5a1714054b4edcc6ca7dd3b2221d886724307ff6d178c6e365c61753c3efdc1f3ee75a97a34d88df8735e3703753209870383f94525d5d3b9eb1ede774bddf4fcd1c9cbc8056b75d2cf4a6223fcf7579b4a9e6f64de0b344121b7a986cefd36dfb637d77b845e9721ab08f32f3a7e7e48dafee8e2ca3fc54fd28c31dafb327e4354b239998415ef630602cf7ec94a2f9ac79cd96c2145d0e30c3850e61fb9a7f1bd86c1207609000a228eb9acc2e1276dd655d84a2be2b1f1a35e2081b791d69fa7b98dcb8c659e2cea54a94ae1b1592011d5ed92d791e7c47a9de9627d3e28c2e95c8403009125e76fa02fe9d326c7e54f8e2d5dd7dbfa3484c28dc1332e1cd719af1581ab29de64df7de7aa6de5dd62db9cb684b6c9dba8b1cd709ffb5adae2c3cbf750ce08f1f5c91fdea6c87b01e74c720c3dde3a049f1c5f88b9b4be00f601ebf143d13acbfee79227adee3ad893f75d7485e428de08bafb154925266805ed203a104c35ed62ddc01059795147ca10bb8b8accaeae3a478ded13d8da8746728d17d694ab35c1df0f5b490556ae2f871e9bdf3341c4449292d1f359decfced08e0e315bd0347eec8fff898b92cd51d26b589b665efdc7d136edb07d9a3b0659ceda818cfaba1e18a35f5b9971bac1cbec1f871816ec9db9cb66f19e2f44552bbdad642988c725e62b503ecce8e08d810a05d52c4ac2ea239d9f4c3e9715d415543e659bc0344d3e14b447b2dc30eb92b3e9c6766fa267bf611382fd6a457f220e3862cf0c60254360535f646e14c597274c98af0290bfce3e70e0550603513d89ff0c35cbb44afc9e3cdafb0b398ab460979640452f7359d2a9885b0dfc6d8af88d4f6ac23abf3837f3dc676e133551594f65262048f77c3739072d442f17003e418f7d75bb10bacdbc0ff5b2d4e11a53d53cf6df3dcd81d8998f2cc7bfe3264b2562e58fa0457edf39ae5d58ccc89b25b0c5a010d64ef46e1298501fb4e1186f25b86c46d755134ffd866b56bb096c2746ac72e9287481314b65896010988efcf0b9f5e589fa13dc29d6495066768c72f37cca6e1166661db583af634499aa053f607f20f0493817b267295d81ac17f36d4b34376879107c893081de99208bcb2d72e2e106627b154a324a3be157605443891f20a5fc95f5ee8cebbac3757f583d97135152710b8fbb2c02a48a93df02a24def2c5c852bed2c1f9b6856bdd5286ffb8187e90aea6cc4de07dddf205c2d305dbbc3951f97133d5324dfed21d206f1476e826bfcd6b78f7e26e82877e03800fa8a9e2baa972f74885d8d96c6a566f5cf83da2590e165061024a75ba1239773d4eead3b25340c869411d71ad53db3d98384b1c5ad9f1b527f171f48235432ecc278a9b5334af86fcda5c243658a575af0528f159be129f81341979ef0ec95bbd2106f752fc46170b400cd03ba177b9e2d50efb3021970d8bbc6dce5fb93e6682a0e0f7495337943980c6683ffc6ee506ad75874eb23e43b25c61c7c50cf7c77d0889de677952b848e714f1c1b02e57e4aeff6ecff9c4cb8ce1616f56e5c24eea1d72cec21a43b8113f102fffd5623c2006dc888b209a2269dab7659492a1b029bf01fc0f6a8c1e1301d2229a0ce4a0e8039ec5d4e6aa550a78a1fb0e01abe2cdbd0a106d78af8a1bde2a2c79fd6501421401ece870dec2afd01378def0eccc9377bc1fbbfc58584f07474bfcae439093c66f1f1a56a680870927fd2c49e7ce84f75f505bff43a236877ff2c88adb23bf5f74ba0eb99e8fcaa59e13c8c35c8069941831584aa8feeb5bbc4217755ba4b361003f43e2e53c6e98aa605c15c9413642b509bc7774f311202969cf7758cf6bf7cae008ea8a541697d763af4ac5a1486455c77aa17dcdb452aa5a6deb0ef1b4ec6395cc41f69aad32553a8d2cb359786f231d2f5ed96374babd493f8503d9a0f03c3f71b448d46dea5674211e0c07a4616dbbd59585ef98c7dc80c2223653fe4dd12da62c645b639dbe6159a2529b6b43be4138d86b26ad5018829a52c6fdb822b5070b40a2519eb410d90e384a319f9b8d32137b903a563a54ab70f3075575c8927dcbba8a1771676c1ed6c0f176608b54b8b697b3e28064fe2dd6e226fb08c7390f4b8bb3331c4212325953512405c4368f23b46b058b0fc1e4dde9fade2b28697ffac46f790f0f06e3189814583db66e031616e4e53a0cf739a00bdd09d8a8623407bbcc1cc0fc9bfc08de1c936f2e4d2d9ea908ccea2ba4d33ba5b3fe28851c182295833431e49ad054aa293a1af44d4c38f07f223660969955bdb37b5cf5b987f78db20761fd01d2f5deb9190815cb0ce909ce28680bd53f5917cb04bb8aaf7a62e131b53d480efe1bc128eb38d0576c8403bff4042a3b032e7f9ce80b08de891acc52441148c2b9f70a899789e0b41fd475441191046cb8770093a4ed4d9f954372175fc8a1779e0877ed186e22257956cfb5ed2a3395008927acef79514ab34478f0d7097d4febe3c6977333018509589e163d24840067f5a534ea3a45079816aea8894ad8ce19fbcd3b2","title":"989. 数组形式的整数加法","link":"https://leetcode-cn.com/problems/add-to-array-form-of-integer/","question_id":1031,"issue_number":4},"2":{"day":2,"pres":["数组的遍历(正向遍历和反向遍历)"],"tags":["字符串"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。\n\n示例 1:\n\n输入: S = \"loveleetcode\", C = 'e'\n输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]\n说明:\n\n- 字符串 S 的长度范围为 [1, 10000]。\n- C 是一个单字符,且保证是字符串 S 里的字符。\n- S 和 C 中的所有字母均为小写字母。\n\n```","content":"0961e884611df7d4ac47a79a9e3b6f2477863d84c1b032f243483e5a435a7a0c5787a92a74f3fd1f23c502d161fbbd42a87d4088992f12c5be23fe2bfde9f36ff331672a8bc6cef10526cfb6c68e557025f0789580ec089727ad24c0e4a6e199566fce4462bd9a3c2832137ab8bba2fe3d96c1ccfec31329f917540c873870ca271d822966644e524da455bc4cc40dbb4f6008a376252e43c1e03c72f48ef103777b2c2868e9ff2e5d4c2eb98118626240ecf6910413761da95ab67234b13576379716a36801af53404be5ad8f5d2d729d2dc26c6a2db3ac0b768ecb351d7287acacfd1f94ff65e0800f4bb299a1fadb47535dafd4c72e0714248611330033aafc4d8584bf9a4ca04552410cd25f5b69dfd99001fe14b64a89d3c515a38865b55b3dc78253bce4db08ce744347c94522b5817206e7b56ab8c07abc9c40ea259a77e00f508da85d64a7ac70d2cbef6880f0f53e564c6850fcd275f3d67e2016c0e7aecb39fd950a86781b3f37020fa0235883ac06cb1917575a64f63ea5d7dc2938c315e30e55bdab4e20a15352b15405da6f1895c5a41dfca12c4ff430116e04a0be665aa315a0658bc67953adb18e4baaedffbae173b66c756262c50d47e0e3b947dbe75b68826f40b33d774d667a0608d8638e9727e5c6f74bed955d0e2ca351b3000a59dbd243f4aa8e10274074acc9da829c51bb24d49f1085f94e1bfc74c97b3366418ab069eb42c35677011d88e04a42100dbd8531f7894f0e4678615ae73054579ab4acc05c56d40942692fb9cce7ff869f4bb80248b6b6ba9262c988eedb877f3f49027eeca5bdc9e75df999d8f956cc4f399efe795a87ecf98b6d51d6f77f5c9e90e66790afef1ec0b74c06a88bffa5aed9bda73c708e2e6f7ccbc18e88973519a4016ef04072c94596248891080165b459c232ab00c0cc67ddf3bf0ec5117fe47a0936c6d3c09b6e524862ea1d728e4196e3e2d42ee5748d7715c38404f95b3953fa1f80a01c7aa84680121fd2fe121e957319bbd8b61acb8d2786c155f7097b3c6df9f8081815280aad1b97bcce75fc7d583a7cf2cf58fdd665984412139d3cbe79e050863c35da447838e6809db1b829e4eaaf82fcfb7552c534220096b0cf8ae96dc1069e6441b454fd46a0fbc92f25b06d135d1573672f6275684b1d4b5bf4bb7795fda3fddad25feb384f29515ec889309b2dfade03f844d6dd81c2eee3ead37cee218af3a6ec63a29288994a679e10827bfc23f6bf0b67be44d43b9cf20b0aa7bf44e1a8b558145a80beba88496bad4b7658767f89d68984fe3c43512b0ac625fd1f73c1bf65d382823de279438e90c3fffd0eee7914da25e0554c9d429ac6442157dafef28bf2ecfee0c1414ac99cb8b99719ac365ef55bf7f892df4fcbffd4ecc44e55f6b2002c26db37d4ee05475391fe49099dca7f67b08593a31179c58535de0fd704cd67c77d256874820f2bebff60cc3db392731154eb48149548729acd7d3aa6b355043253fbddc7d79addfd11ac792a2a266f01891f3972783d0ecad87948da87cd4ad73c090f60a8347803f91b6de19e8c1985efcb9145b8e577477365d4d505f1653fd4050964d15f719039496a22a0fdc47af8697f0eb68d6d99e7dc528d8a8266791ffa6cd61ba9ad9aa00876af7539b06b14766d432d56bac276bc80b83b37052587e545f688687e542216d69d9278aa984e189d10ef10f394d98f194ff95acab53991583be141eeb2fde44ad669831f2a64f1d068edba164662637e13f06bbb1cce31c989a0ae095404d64a42de3fbb7bdcf53d2894d50149e19404cffef56423bc5bd1ca8eb77607506f131d3ad6885f2a2baa49d7679429f93d056c1eb888e80c5373324991c9fc775875c5b6e00484d562bf4975a78fdead8ba79107d4ca8b38cb6ced6a50943c8ab469e9e0a31e65d6cc00e5eae48212f1f733877f089b9b01db01c1e43386af08867b503480850a93aa183e642d05d63bdb77b84c990a7184f97e7e3f5202c8c02d1a83398468a243c5eaf11f3424ffdf2cb31d7842be2f3700ab4d618f7388322cc1364e6df1ce29e28deabd29a37155dcc738ca4a8521d3c69c21acde39690d770413da87cf6b1f7a3b0fa6cde7cf5e5dc8aa479b69360671cfb7c6a230f3c22b6402c758989c750c7e3317188e09cb2ba465642deeb4c3689e4505ddf93e3ac30e8adb19e0531c2a5545ca87a134a947f90856a4eaed7edf90c6bbb8fbffa38320b9524d4ff95c9f52fd3ccb616436093c634fe0e7f37d0888f7e00a8b85d76551d14e1dbb7a012550a12bd2233b46cfd60a8ad13ff8ea3634519cf7ddef88c7607ae67b5b8b9157369ccb40d65af0caf6c3e2cf408f6926e37e307068c633bf09136e16c271d877ae3edf5943b10f3472f8b5cc24d661fea6e7c733de6ab2f537694fed12a1605cf4d52da8e14810b5ab524c2212f161fc7e233e1b377f6bafd73531b7c111c3917d1ac04a6dfbfbd7ac4f3272e857a6b3690b00bbb3b14754dbb0d137a84ce655434c6fe8bf6bd30859696269afbe5def265c0eb9e1975093933281863a5cfc5892ae950b0e21b71b13112769372198cb4130a2d7338899d9089842cc53bc896abdf66ef70306f9b8c497cc4492ea83e3307d8fdac858acbcf26d8ce93b5ceb47ff097289b04b2637d85155ad2ae07734253d024d564de21d32426ebba852bf9097d7f1db3ee8d0eab58efd4168acf496d7bd33e8007501a04c2487315951aaa1f15d91e4221458b4a4ae61ba9149314899d4201a0eff6817df2c0e1d216e7414fdc1f3ee75f45034d88df8731d3a5c2a7023880c9ef9091fd5d3b9eb1e893f0291e3b98dce999a057a7b958a650f37f4be7dea03ee1f64bd44704d7d9d8bb5f5ef088ffb2a916cea468476901efe3e2d23540b96ecf3fe9818cf50d3d86595d87371210aaa329bc505bd0654568a2dcb036c9c88c3c56c660ae4e34d7c149250d8f5e1ae9ae6243f6e085c67cdede3cdd76e23824bde4a37bcf7e689176ed5b787f5b5fc938dcbde20cd57a329ff12a2b65e3d5fc8e6959d8a9f8129dbe9627d6c6d96bc0eca4a1c8076b245e0348dc62b899c2cb7635edea39f70c1e8a781736e5fc106d75e84a42e8d2dac2fabb139a1923dc0c7d5d4fd9697f1e9d75792b253819e8688a31f9c14b8bb9d01def5c97a07b34a740a3ac4144cc34e198ea09dbe33b10a98b64397729bbcfcdb2eadb510d893f75d7485e428c34df6b25a0a29740c51f32068551f3d9e6c91855e576b110c964bd3f4edccb0b33a569de448b495d5467ac4598294e235dcdf1f40494c1db924ef3ad79a7d06900c9a9bcaf310d5c4c7d0d5676409a36133ec82e2989b89e718946b50e81d1780c7cc2bed8e5e9a7849179a93cfd9bfa13432f11a089721ef9283935dc65b14aa8aecd550e28726427f62a687642988c725bb01503ecce8e0c4cf5e52cf2c41cfb66880810535b44efe15543e659bc0344d3e14fd09b49927ac91b2ba93093df80ede695882f86a546f2b151262cf5b286c0f255357282b52da97364c98ae12d7c9ce6c39a71d52034d7da38c02798efa0da8d66696ad436bc8f8689ef9134b6d361e9be7805201fc3fcfab830a6dc032be42579599213a6e354c444f546a74468f32376b427e5f0517003e41d25728a03afa8dfc259b91c6e35b4eb63ab29727abeede8dd44c86e9a22610326ff49fac5468d228b900728f84da34b18092148131a0275dd650449ee1186f25e839049b1c0d6591cf3802a760227303eb37bb3674c0754657c60931b19decd1bef3d581ae408831a24945193b8072ba329e6e5a6f66469f83af634499aa053f2b39b410c1495eae652b51b9e549a7e0c8b3f1def4d4e727f5054a5cb02d0fb0df245496a7c9fbdddd8bb55ff8291a07cc4720b5d695f5ee8cebbac3754e3b44c30f381c254ec8fe7e1ca4d8d68c02bf04e76903c902e23654c02c2afd863036a3dd83ff3bc06cc4de07dddf201563645df5c3881fd90f365d60c8ea21ce1aea716ef165b093f9c82a28af7377e5715fa78a8562f0df357f8e46b68dc6ec66ebd283ca3e90a86856330efc71a1239773d4eead3b25345ec3c8655afc7be60f160f477b1b193fdefbd2d1b6c3ec95b40368f86c079f8f57d95b7d2fd18d6092a8292b943f9be129f84e6bca85daac87beab342d326b04f6ff729b3656e5a3ae59ead27531bc8db3752810626818247242000d0c7795f5d9fe5094e66f6e95a17c332b093ffe69bd37779206abd725a1e9663e5a6edc51b3094befe7d983d12de4eb20021d767fa50249b016ea351d6fabbd88718021acfe2ebe399d5866c18c0d9cc10e3f24c015bd5406a4d193e4dfe54067d5367e5754e8363924c43aadba4ad90cb02f6521e757c4d53c4972dbff963f7542a3d790e5645418265ff089677752475296826c5ba43bb9b84977a3096980bc0f163d1c295f59bbb868006599f3f1f457340ae5ac93f554d035497e9d68dfdbbe45c2b42aedd2881385286b0e92316fe0666b3e20207fcf72c80dcd48d20de10c8d0b6c2b6e7b3b4a213716d305725940b16d6e5349710878a57266a5fec0bd952b69beee9c8a861a597ac24b7a39b836c0cbbc835327b9bcf2600dd4d209ea98b20a8f7b2cc2e609434816ef377300c4bd68cbab2638c6c6566205a7306a9f34935d135e646ef694bdad0a15fb6f1b98af2c05d368ba33ed878e97b0562b65d7d31b753f8bb2149a046c78518c4342c116a91cde1e8bfdcc7d9448200d229f266d8fe16ea342a9eb71915beb7e48913202a66e54308c003ad09abefc8331b8d337649e42872cce862d4a6b77b69bf53b963f76670d0e1792de375217e0c346efad28e58eb7cfc23e178cad11e2e6375fada8fb6905b55e2066ea2d441c5e0b11dd67348e0fece27f22ffd8ddcee4de909602ad32294e3794b58d9b436c52cbe10559626341a1d3445cb9701dc1b9d97861db1a7c38c357f65525496950a2debb91d3e9c9f1073eb6d97c3629bcd47394cb3f3950475a2097511ebbfbf4af3aa6f3c97ce27b221c1aed53a549948dc676d9bc76236c27d229395ad39893ae71b3ec999ce38483bf6bf7bf60b24dafa9c8a3200b235ce0b6e0efa51d8cb7893e7025d09c33dfeea29031e6f4eb4528765d0c4e0893e1fa3bde199261299b6e87952e82b99898fae3255cb58ccc953b5b759a84a1ba72468e8b2c0eb2591801d8c141bd7bb75a19a0ceca13925a2a7f904a82df6ce71bc8957a63e3f29da796b6fd593423f40d9adac88b5e6708bba84a34c21d97bebea08680bce396ca6c1e2773078721d8983b9801118dd1024644a5429386fce4e840c3d7bb613d64d24cbe0335a4095dab6130fd5664472bb761a6525c6c860a10a0d193f11c2c08db8986352f5eb7e4bdb7e1f14764da8a58a4e160e58c310213ed758f03d5497a1583ab934230fff803f5eff167f73f41101bc02dc48a90e80bf4434679b6381211a038302a38a3e069c0783517bde8bcc687e8f46316766018e819a8b0606c3917f67309751583886588219c972c051a999c47ef84e553e23b945b30744b7101dbaa6491bbe2819316450608642eecae1c94d62f13ff385cf17c7e9b393bc8b9b0d292299c9828ebdc436fe794188c24b030da1f949494621c0d7f437c1eed3febe16928fe125c39967f26377b894cb69fd38fe5af738ce71d992aa5db542e66868fee8b635f0c7c47c01df181c1444025092a4255abc45ebb3c10ca282666d597b651d4c5e34a74a3623155d5ddf27c6cc637d015fdfe5a28dbff93e4051587db97a1817f1ee5c4dcdf728a735a56f1aa0cffd78ede0afc072763ff864055732a5cdabed4d47bee4f868227ef3c7c495de8b5c69f250c1c2095c2828a6570fc12b6b61ca19419e8aaa64ec8f3a89862f0965b59753cbe8a91e6cab1ddeaf4de5837dd797446f5e1ac4670874782e02a2f939aadb6c64f8042d5f28c07d96d5e14de12311d28e1029958ae1c4aca476dcf4ec781253d7b5791c064d73f843f73f57b64f3789318c4ee51c03a5357676a34381428b11cfe38e45a8b676316568f39389f1844cb5bd71f3496ee855c1e6e2b095cea3fbb45497befb073d769ec76216f3ead3b4a0050e81db4745e975b9906bac678d04287a9ab3fe38ab87ff7d1993c8f8d70a56665a977b6ff63fc1c50f5fce63f670c1041bccb7245d45d638dd3c5706733170cb383d671277124cb6f776ce39447fc80d1e48010a8f35166dd47b34ee51f6ae815e07a08e94d398ef0e8f1afd0a001e8cc0a93aa5b867ea2411bf3834ad55d03078118d54ee15c5735840244c7345b1a630f11597d8b267037b0c981cc8c24894a51ed43cf27293470e53a7f13599e4fb9eb0d57494b680fcc96377441e3027b3096a663f46cbd72195d42d911380430b493413b687de4d1accc27b0ea7235931e875da5a922390ef44383568b525d04efa6401efbdd66d5bf48d41b65220339c189521601e2f9c672813677495fc24d90c1ae761f791dcf289475ae6dddb2b49567bc87ac2c7be906a540b41c20b48ded2d6e0538dfc55750c3e8dbf272fa95bd9d1dcd8d963ad56df2f7029fe4d4b8cbefd40070b80c4f73deafff3b0581e2f13bbc6f2a3313d2c72183089ea22765ff0ea5bd90d649f6590b62c3d3bbb515cb0c78b26a712ca89b859f88872244364bd1898f357552ea2ef8d366cbe18b129a8c489b6ec17aba5925f548b721daaa3da107a6c22ece63f340eac5e8b1a0bb528c3b68c0f1e0705fdd18ede570aec15eb835dce3585746ed28eb63118d9cb32a9d831af3e91e84cbc0d9caf3769a20cf23f741488b5300f2e63c343bf2d8819da7ed7fb9aeb2e3aa0982a26742424591bc308aafb005becbdcf8af553a43b79ffaf712b7799968167c5b22460e283e105c4befe8856217b5ed512adc67e3fc628f935e9cb3ebbe41dc9311049f073aa39bf5056dd9610e9e5235c3125dae2b33a71576d885d58ea8d209024ab494f4dee8f824a3cfa957eaa070c670472617a7d111feb63cafc263ddec477101517cea954df2f5a2fef85afae6132cee91021a9c1f05be2ec234f6c42b066ab1cef0463c9ee69db09aad0305991505dbc877a18d11a401fa9a0eb27ed369a517183891cb9b1caacb8caedd889a3093c6a2a2739086fb801e9ab03a322af3d5db514463fab98c7c70201eb882726c4e28b2048ba88ced6a266f2f30c69a659c394e8920c36ab79268a5c7d92483908387a7aa7953cbe601a01e6f725b59bc3178cb1140b6c2c4c40d81839c7a28ee3406a7cbfb8927fe86b05d3d203758471250d7727e66111a1a442a231a948da3f1ec4ef54913ea63656ecc91b09a7d544dd4bf699158b9b534b4c60a3b5cf5155f24d736c547ce103e23956ad35b02bf2c4bbbc9c8e4f53614d06bf9a56af0a18709cf0156605575aaf74c2ec3ba2c9331052e1b02031763f3cfc06fa3c87ce495b680ec07678dff0a74274a297160b6c1cdd106d5098ba40a1ba3084bd31d729c12d62dbe6b5a4efd1cb247ba221963051d1d4c2ba9e28da4d5f40eaeaf2729bab7a3321fb08fc944a2c7b96a2198478208fd7969aec80bf052ede7538032dffdef197dd2a338f077fce3027cd8421214257769ac361bcf4d032df7add25ef35d8c9d94342cd95f8e5ff94d5fada58d305a4fcedcc19bb48f0f6439d5e6b02fd9dfaa88ea42db5f46110563c420779cedae9f3d967bc9c6b2b28269bff8502c6e52a182d783da55a2d98295f9d00c8330738b3bc5154c15277ac086f63b3e8900044f0749709b84a9111f3cd61da33fc483fa56656aaf67ca76bdd3c98854384100f9c26cfe2a50a6af4ed33debd563a9cedddb4846bc930123797b53a4fd54156da35857681dfcff31c6e1f74f8c286aec2d155b8639640a0105ff489355cdd76da057788b3a536ea024fb5139b193242f0cb0328d121108bcb41bb8c0bfe9ea1298425d75d8968787680fe487c1152a5e26e9f0bddfbb310bd165c61b226dfdcbb2126d59b514f733e00a6650a75f1a636d6ac5113dfa452813e0449ff9ec41866f81d6f105567357ca16acc8c69b5f2649a724be4b0e279db88b73401d03057f8b562b68652410b6eb4dd8624bc8f603a2cdf07e99637efbca400204dc734ef6af41ff281fb4ea00dcdeb4a40683a36933e87518a97104d67334195d7569cd46c49165ff1e5de2790c224e8e53e6e0d4b2fccf0ad86a34e236ee62a79502c9caf0b9b74d15427d617d7777e8199af38f9217a7a0c48c451e0c681f1b29d0a59d3b41c986bac7aa7cf92a9f6ebf903b471ebd151f0bae24829b75aec90ef66d34b63052e213ec189c076d6e749d1e0b9372a1db272ea696a67dde7f6df0be06091f4bc603bffe110e4ecfef7da0f550ac115ce62d9ab096b98fecf4642d342e67601980eb9cc05ab6b6c6cb11cd30931ce657718452c95af949ea2328338c4b22d3f7224286993f2466762bd097e84768b3e0ea7c2a0a75ff097a88515c838838036e5c71aaf00931f9e4058e15e38bbe704706580c3bacd9460a8df9caa2de6fb343490c215e2142b8610b6a2b6c47b4aef91faa870be6705feb697da714617cb6b5941c4491d23bbe3c3fb36589440b1c4a128c29bf8ff36eda41b1ebf19d1745132174597d2c39814c33af8df0b4305bc63db47177cc60abe2677f41232016b53d6ae05654a6fc69c75340835452d60a911232e55f6800e1206a87a97e4cfddcb0debe814e85d66027efc83bc7d3fdb437cc969cf9dd38baee39c1cb537adf52589c0713bc1b54f7ec13f83a1d2bed04c31dcba17f17e21ee63f2a75f3d8f6cfba361ee638a4007b92ab0deb42f9a77463161921a7ed7ad31677f7dbc4aaf9f620e413056ece16737696acc57cf8a7b55480fa66e6fd74ef311a6c80fd12ae1cb70d4ca749c0ed4a8116d347dd2992b6490b90dc7b5bc9184f9591e951230b0423740930535d0d0050d7cb06d8f80ade7a4c8e6c5c4d83e6498211eb4e6ad7a2ffdf510e39c7965d0f869fe90eb0d102c9c01feb16e1d76caa2f29286de43d9d3833d1d1a92a9678b6d7c460fa5204c8042f01a7aebc612f4d41ed7076ee2aaff22604e4eb5cc3399adbb999f5bc8cbefbb2c1691d809e1a237ba937a5679e36e6a6d09e95e339f533fe0e3a61e9ea507cb9fb9e077eb567b1aa5175b78ef6bcbd414ccec2e411aa82a6d5c35236d793f778487c3d68445c2f271b5815b4979d1f31ef37e333409b66090f43509edc79fe96fc2b178764bfd051fea51fef76fea05be893775ef9da0ada079c9f454d4a54e39d18053a4b541a993feb27199e6bed809e2b87486d41c33f73d101ca6971971490ccbf9fc3f7b0388b17cdbb37904593996ffa0904a2eb1de95231b234849272fec13c644e5b7884fc1ce6094a0d806a573c1c016e7f91a7b3e96be9b05d815719bea8a5b09160863b9c3f2e67623680dc367fde5f6283704772bfbc2ccc264fe3cc662e0c42132f37741ca7396527882927310889051a362203067d67aef8a30c82d223394ee215b707b48f7ab7351bfe2b7f22dccb5fcf593011cd87b1a90bb352ae0cd6515277cbc3a3b20b1293e580bc1d7591b37fbe10de29c16ede3dcadbb474f327bc734d2a4fa5c4db00330ad0f50593d4e81c7a85f65ecbe308e3e6d6bcc73538688dcf589dffb8d696895ca4e36bba98580495038812fc4280b4492e2e2c4516b01fd284aef71fe1fef755d560b654cbf5a94a28b86cc71ff28087cb56b4bedb6226ee279cc42ae2d9844d7c4ff9b5c60fd8a2580a6a3c68a4b223a916af325a6ef792e64c59f50b2616c38c99b5c812a0fc187effa4116d08c4825fced12e744bd504365ef6752bd09582d205629a4b7134038e6cb7caecec9693e1948e9787c1c568dd86e6d6d1a04df7c6d46a574b3c9e6f69e7df020fa4492b3a8afa84d55f35d2a34ea5e4f192fe681af63ed8e31b40afa0ee629d1d294bd131ba0bd346c9b9ea89e34fca9089ae383645b36ba57f800567a9b1bbaf956325669d650156f04a6f2a1201ac63b3213f4005ff99ea68afc0525ae3a402d879ff2a4ae37d0d5d248013a1a42d7240bc3017fcac232b9f2107adbda82cc83fb5126c2b27567fcf53f153cca9310567cb79dc2c0dd275e65ab6c3247b0a47abe5b063ffd3720192be96c9129c5b406b58b8a530d3686804a0bd6df4517ee605233bfb059d6473e7822a71adb254617bdbae32d02a58e5d170b14403d9a91f7180ecebffdf4aeff60e4db223a0bc801af1c33bf1a263e7b452e4c7a5f5e3945b0b4eac16d723e036e840c3be66755e3e797867f3d7b87a3ced7671180146438159695ed0912f8fc597d0aa505a72fe1dfbe05c473293cea15e3caf9a53704658a48871e03142cbbcb7a234f2f00d6354e799aaaba6125f44b0d97cd5f39ed2dbe879c2f61adaef55501e332fab34d47a28d2f6a7d3c919cb16f85d81b892955550bb0e7d8ea360941b4f253391c17a6920c7966ca88c6997e07b665f5b7ee6fb35b95a0e634acab74df82fbd6ee4327bfc696cb135eb54afa8f8fd30994eb6c31a1d180bc76befe075ed5c47242b2dba7d18a095d38af90b34243ebaf4ab96a354f0f6a1721b9b7eaa417e75a9d1b5fd069dc37cd19dba3c7cfd7139447cfbd938d1aa8f80d695bcc7a11f6db3c4b33482f2fb3a4e2b63ee6326b6f98471292a8ec7e63c373beff750b5547eae8581bfcbfbbe6579037308089ab73db53b52848f674f6b997365a8b8b937c814fe4ca035d6683bb2ee02174cbc988fbc7481b0da06e069e0715a34f7d2adb02cb2aafceb0fafdf14b1441ef2247dfa16c990b759f3f71cce041a83a22db97d7a4226037077078ed623515c4a51e6c4e3bfbee4b59c90001c914e5dd642039677fbd24e38121b64f710256be8de7116e1585976be3ede9aad2bc2d09a80453c9c03ef12300d5cc87e087c529fffc29b7853d49d1e0377b00d92355c866bdc6bdc8f23df290c5f79eb6e408360e32193beab4a871a0b0b391e002216d1fe79ea6cf26d2d841339a350cf242a8807fb1262e56ad75cc8e4d62b92beb864f442e1b42af54dcfa9e4d1bea57c25a4c70d735a64a5b4460299d509acab7407014a3a652c549f5d2684f1a4c25942ab9203608c097844710730341a53317fe099d584ba2c1f7b81b111313cf3ed19905e8d64f55e683c23677b398d249f80eeafaf7edf10749d669a3faac5df28931efd9c730d7e4c34c7079fa5e695ac90563a8b0a2de68eb6cfa42778955ff94a02cdb9f003f2ab5026c2c7a8f21ec72e5f11636c82d41533d7ece04fb83e8eba927a5bc769a4795aafbf58dc4fc13596ae4e8891225344e3f3411bb7100c6a1e8eb6635027a497bebe57d1d471894b17e550a01bcfa716e4634509ec02c07f74c43619187cfe40124cb253de7d7dd0756ed3b8cb66af3e9846440056612eb6d1f408a679590e8047a14876aa2a2b8b22fa19f684eadd39e523a5145f620128492d8fef08cf6f0b2f0b907a0a8c34972ba6fd4a1f649dcea89636dff8d79f160447c6ae24983bf0c20b1a182dc281665cfdb364f6a3d706ef5854c457a68dbb41915198fd7073f2dda5c3c389972e3f413b74ef3958d98ca4642e85362fecb1b745a01e5abe9b52b76cec1bc743e6d412b421e28cb6e3645d6ba545c9c1e077d3c8a41a156583291de0637a74360bb920250f8d2c36458ba558391f92b803abfce990f51297367682515187df61367b92cf981d23d625d10c02b561c8e9dae7a83839089ac1ee74f3e186f8e0815ca7eb69ef580775226165203321239eb9f5833967ae8f146dcfaea25243954c39051235f22bb12e9c1ea2da435e959f197b1b3d76be0518c9a87575e2b3fef3d13d264103976bee7b5c3a7f698c99ef57503dc368163ef470ca113ebb8349fdfbf99fc2929ee4567e9925be9ee85a059b615451c40733f5002c9a790ffee7962c93433028f78e5fa3ac53219033d64a7ddfde6352ed580b8fe13ffe6e5c09e849fa58a15a86d6b5116b691f0bf65b007ecbd4e2a8c4f393177097019593599b25f08a06199ed03c6c8fec9f3619d7b992d92636c0ab205c010ccf19a4d99196ffbe5548b6447ef1e808c785f1ea4492a41dafb919faccea74d8547a0900436272d5785c29cca7f2774ed948c173bef3132074e80330f21c05af200778c796c1a51598ac919c29ff132da613b731595191f9f5ba51afe10a858635dbc773aa7b94b6d87782962b9c220db9610e87414d71f5659b1a5134f2d671f330cd3ea6bf990158be119b7e4ff648cede803bdcd66af3a32190f50f3485b4536c1f8170b2d70e50d87ed6c61da619b622be15d8b6841825c358c638c2376d8b5a07f0dfbb1a3f585b5eca26d989a47824d31869689ae6524ccabdbf9440d53dcf22a8e1a862545de3d75f0a1c9c83fd7ea4bef0faccbfb9a97aaeaed04898776ba8c4073b172d0597f199b11ffd497c63bfcbc6a92493d185a9bc32b21b224e06c35e8a4c7474836835c0de18c4ef5b6fb5937eb02e7a567f7bc3d6cf177ed1780fd7a68a21f7b20f80f669cb929f25bb2d280b76d97ecd97926459072acacd5cf38d630d7c17e2548052ae08bc9433cb896f457bfdd266b5b0e9e9d4c7a9693fe6ef771a70a428983230125891b926810aed134341478924f9a5950f9638dfc3dafab5eca2eba1f78a770fc680af9754314b28d57a867e1e9388bb944350cb42d2fe473976401f7ddf9ffbe1895c9dab32879ac776cb110138b32e0d5aba79ba35e3da58160602820be78be36ac5f668dfdf055a582224908b14b32a0e5864317956326079941ceea198fb5b923461097af770867b852335a52550d6f3ea47ff98cb6d0e365e0339800589d0ae9eb524c137307a9c1b11031f6b86a344ba4f3280a40a14dc4f84dede39ebadb3e31da2707f70ac0f7d1d6822bc156bab8ac39366118be8189032cb829e378eed13717a776f2959fcace4cda81547d34850380e3749b94e940cdade07394f4440df9e6eba09201836bb90aa1165d026ab0605e8958247da1eecc69b1ed52b678e08285e6f357416d885f6fe19e3553ff1ba3684ce8bdd40d9607712f1d690e076587bbe145b34a1e600e5c4566061ae438a18fc40e5f161d36e8a27fe9aff4cc37ad21597535330f1ea41af502fe78a9c8e34b699affc46986901fd63616468adcdc920776b520d255694b876e7ec5cba4274b4d8abda40e5a1ced5c8465e38521d8d11a71e1c2b04d8f7a84f9a8486de7f4069c02e27e47033466a60c8e51f5bc66b758370a77197c8730f1b44a772972b45b7556d00a1aa10d97b2de8818c402d8e1f7e0946975fa1ce791c61a6f7a7f26e7eb076cabe64996cdf65496cac89d0cb45c8590da41708c29362b05e60bc860cdfc9d5455d073d5cb41228bfdb87032cf26b3fdfce970d667a4409ba7e1f3721e954234820929eb488abd1ea8b8e8e8b62762d8d26268546cb75f009ba5167cfaabf3abe48023ffa0bd306915aed1f06a802b699bab1dc53df480ea414061f8361366a5972c1bb945d685dbe981971f5004cae10fb6774f6f9d237192096ea965c8f83a134c6367387266502d33dc1373387166c5f6d462915f367e22b1bd2103fe9f0b9bc18b56c7ab343dc20f47ec5f46069eb11566408d44ad733a19d250e0dc2626438c4c34125728602acf92163634400ff6d6d210ba9537362a2e04b51930bd1f019f02e33ce0b51bec28c799e10d17b8d7253dd4f4ce6b684e21dd541485af6d23221ff951469e04fc923067652ac370c239aaf7195a9e40ac060576aa025ecfaa5d10fbe77dee8a2ea2bd3de4425672b2e578f06a0ce140252425940151f1d1f5c32969e3afa09b72f0fd4fe8a2f62b5e2bb5efe8c251720a0a8b8d75e978d12dbca4031e2ac867273230d974ef25e215c35d84160ac7eb9864d2112922edfd7fb806f37aa2ec5a88cda8eebc108de4b5579bddace8461a6576d62dac01a1d7621cec5aebd4825241df98c916f6104fee888ac62bd3c906015a9449a1f0f70565014a9bf494efbae8be595f0fe519a1b0ba84cc5e6525762c244c3c1b61397d73fd42bb110b235e07b7daf8a1bf24cb0dceab2d2aaaa14368b58fa30789956e4c05e30f9f2edc3a4066d59c12c58b1c401534579a5017bf5233cd6eb144520f81f0f0bc0d8186f0e782f6683950a09ab2107ea897a1727fef333444251baa1910605543e0d8aa09e84c4ca804381b23acc825ead5b1c64fa9a3c8519f8b6178d3275e3624c1b4383c98f1db1d42973fa4df90acdd39925d231333b41badcec736c158d6c5a5400fc12a25eb987840232049046c9c766fa247a1b45598425abd221877d032d5d5aa39ee746aa40cc94b2d0c661b55ebdf7c8e21122c04899cf7717f5d06e16f94513982fc4ab95c9c0c03288ef958ad02884a779c4398d9b9107ee60ee86d7dbe79405586658571452245ada82fcbe58dac861e30adcd80ebc123a6c6d1a30e44e0eb12dd805f30d42375de8fe12095ae3f4ab3211cdc9a0cf38ede22f9489880da0f9dd5178f383d122c97133025b73506a7f05fb03f58075be0471d8305ee5bad191b626aac981d612754d17500fd2c7ed6bddd881319852c84946be7b7fb4fc63c428660545e78046275076a71ac3559a83a7e8f975a1b2b349b7d2cea44d672c35b4d0dfa1769d2b550c8431ceae11767c5716c523022c4d861709d662fd360b6a0078d34c359963e3c028d11b31feb221b5e64d202ba55cc7de4e421b1ee123e244e21eed3f1b5b0b55dbcee63d5cd4de6991f9b7d2f620118c6810be8a45c8ed658d0bc352eea7a144d39a7f47d30fc60bbbf806013951ba2255082eee4c4f40b0b1da57fbd63827abb28e1246e29500b90bdabd685abbaeb370326d501b8cf977723cd43c976276d83ba5c78a6e754ad7dfd0d9126ec3b489e1d25506fa488d30b7cafd50108208d96df3d7e34591742d9d5de60f17d1b38d6a007efca7c19d754001c45f7145a4026f49cc78e9742f7854951300971ec6b25542db5e6b19dfd28195a148a6ee32a98bb48756b55f1b0f22a824cd7f45f867dfeb0b6f7c86f0888cff1c8e4bf1bc73f9b4c47eea7d642eb2cd9141e6e25d46cd6f31c56be320772212f4ac1373bace7eec41eb5fca3535a8701a119fe4d73bb68d03a1e0b64a47df81b1f4601f025c2516f534df2b4daf0836896d3f1702371a653c7b9caaf6dfc3a89a50beca53b054174ec127eb3cdde77f04e8fd3462845f4437e74ea4affe75768c8d63fac4299dd18ec5930c14efe924d3a4f50dd8bc1581032f7032eb336820394940bdd2b24bfc169214f5dcc87ddb145b4f6f2c927ca086f1b4353d654fc55e18f809910dba342b2f911971b6bb25fcd88edf7fcca50d75e2594378948c53641c317a792d59b3591a12fa7b502538362d01e98836bac2de18f605d91c29738154a72de4229ab8fa4a7d48435914961197014f72e7d78ced9824c1daa1e440233d64074ab6296d23de0b3b577375ec9fb67802e392ae87fdae6c0f10f05895a4837bb908561d4c83e638ab216821c302629bdc11d3592d3cd48ffe47394ef60f76e0334d50055d6383d68c7512cb73b597a6af5095","title":"821. 字符的最短距离","link":"https://leetcode-cn.com/problems/shortest-distance-to-a-character","question_id":841,"issue_number":5},"3":{"day":3,"pres":["栈","前缀和"],"tags":["栈"],"whys":null,"difficulty":"- 简单","description":"```\n请你设计一个支持下述操作的栈。\n\n实现自定义栈类 CustomStack :\n\nCustomStack(int maxSize):用 maxSize 初始化对象,maxSize 是栈中最多能容纳的元素数量,栈在增长到 maxSize 之后则不支持 push 操作。\nvoid push(int x):如果栈还未增长到 maxSize ,就将 x 添加到栈顶。\nint pop():弹出栈顶元素,并返回栈顶的值,或栈为空时返回 -1 。\nvoid inc(int k, int val):栈底的 k 个元素的值都增加 val 。如果栈中元素总数小于 k ,则栈中的所有元素都增加 val 。\n\n\n示例:\n\n输入:\n[\"CustomStack\",\"push\",\"push\",\"pop\",\"push\",\"push\",\"push\",\"increment\",\"increment\",\"pop\",\"pop\",\"pop\",\"pop\"]\n[[3],[1],[2],[],[2],[3],[4],[5,100],[2,100],[],[],[],[]]\n输出:\n[null,null,null,2,null,null,null,null,null,103,202,201,-1]\n解释:\nCustomStack customStack = new CustomStack(3); // 栈是空的 []\ncustomStack.push(1); // 栈变为 [1]\ncustomStack.push(2); // 栈变为 [1, 2]\ncustomStack.pop(); // 返回 2 --> 返回栈顶值 2,栈变为 [1]\ncustomStack.push(2); // 栈变为 [1, 2]\ncustomStack.push(3); // 栈变为 [1, 2, 3]\ncustomStack.push(4); // 栈仍然是 [1, 2, 3],不能添加其他元素使栈大小变为 4\ncustomStack.increment(5, 100); // 栈变为 [101, 102, 103]\ncustomStack.increment(2, 100); // 栈变为 [201, 202, 103]\ncustomStack.pop(); // 返回 103 --> 返回栈顶值 103,栈变为 [201, 202]\ncustomStack.pop(); // 返回 202 --> 返回栈顶值 202,栈变为 [201]\ncustomStack.pop(); // 返回 201 --> 返回栈顶值 201,栈变为 []\ncustomStack.pop(); // 返回 -1 --> 栈为空,返回 -1\n\n\n提示:\n\n1 <= maxSize <= 1000\n1 <= x <= 1000\n1 <= k <= 1000\n0 <= val <= 100\n每种方法 increment,push 以及 pop 分别最多调用 1000 次\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d768f228a04f50bab074078247f3c02341afe906d25e29b5c3a72e15c86695abf3ffaf3406fce911155659044b8fee931e364252a97d1c4e70a2cc6a0c49e533134eb70c984b3039c38bc28dda8a7a99e5025c14460f8883a28320c32bdd8dcb533df4a2a294ffec570f3ff8463ec08a1625acda3f2e3a3f5d86228960d950ddb296369ea6271a9dc196c8478c18ff1035e76370668dec42e50542ca6ac10446a4df5e4930f337b3f9e5aa87d38901675259814bb6005ad686a9f6b05805e147c8325cf69552f938e0b7380c0313b72aa87aeef2e95e370e2b43d44a3a9a0e5fa4b6f53a2f1de2e0a3526b20b331730aac44387b49c9b658045534f0ee16b584bf0d6912a38ea7cd11d9eb22e2d884d985d02e38f64a3e4c01acf7869a942e2e6e4b6285ac2f501908815a1f119ec44ff7a45e1c80b6d264adac2669895c402cce6a2aed8c5aaa811ae608f8e725c7ae88ed0cd76a29e7bc37b586129534d827a90006ab4ae5f37302572ba5487a88435940bd5c08ddfd7ec4650f96824fb526d907656c9fee34df7ef5d4d855b3c2c5893e41b4a16448d658ef77866a6b39669acc0ea574730fd7a22097fba6d41a3a99b11a0ceee0aaa6c49a5faaebcf0a3fe8227b12d540f0789ac4b637982fbb8489336e4e3df1e028c07401ca5fac6b77b432065bfb4e01a89ef062eb41e59a5175ba080664cb26fee338772e0b0c2cb163487c8c9f5b38b2dc1c2194b25bec4d526f5fbb9caa7d9b95b094ab3f1d9be7c5072380d008c12aa8d02197d16ee0f2d721231dcf0c7a2b87e01786463986b5a3b84469d211130a91228f9a56643da52c3da7e74a2b7ceadb6b78562d0f13f35cc112938513278da1b19d229313f1072a8dec96c4db4414660a8d8aa06c2473218012550b547c0308d36c3e17ad0e1b00ff51d75fa68041bedd2f7b6a690a8fc21dbed46f69ef3c8d526e6539da2f71b4d65c207465dbf579ff7567cc32fa3aed1722fdad71e95b5091785f0428623b1c373ca0a75066dc5f90414342b20a319be9bc571ca7d510371cbc258cbdf6597411832a9d12e9d65b030d9aa7582160e87c7b8eb0a992e63f0c9fcaa314bb5690b94bcbedd8ae377fde952ad22da59b4cf6d5345ccc49a0c1c5e5cf89a82f3a9aa856d5229bd9df57a6a16fcd5e6983b9c4c0b7f52cc8732a10b35a22abe21faa5ebfe86a4fab013dc8d191d472910b3f9ecb22d0f86a56ed157e46efa4941db10f5bb4b9d0c76d6b70cb498d20413d30e2fc0d2761b2fd8b3dbddbbd7fbf3f6cd75c0db2529d626e03372e99f6bfc99820ff47b529a58121776b4891f164dc75d1d079b2ac1e2127b625f10a29f84a4eca2825b354b417f72498267c2db07a3733d7b19db626a051b4bfcff3b7eef5544d43b1225e4d2cc2e39b0f10a1ad6ad32720357c3be6636aa17f05aae67a026b8a38a800adde37c5dcd0bdb6e15b9d0dd368c8621ddb57a33e89631748ad0a4f869182c160c5f56d67181bda4dd453a914c87dea1067ec666c4bf13403882348eb09b917dffedbd5dd7a7331545a005380c39f62554a9cbcfdf633abe539b8a56ffb3e61de7810d365b5f2f90dacc60d980a4e2c9cc2151310dda590c0a85ac9646cf13f661277f32838b73fe8f5af6d787ae91d4df5978fc714830afacdda13630d37f43c0ca8392bb027017758d87441f95f559aba28a84941954e47a84fb758a5631e45bf9f3e6de4e9878dd5c7636a69b75bd9e4a3f1c2f3063a4ef7cfa009f62573a27c3fc64905c344c9a71f280851145233ab9e70f07ea39742291b861a29eabd68c5b5d517ad59a96b7879b743102ff7818ea15aa88e1b8f9140421f3c3a4fbff542a7aa2dce23e6a6bac34f674bf81f33d80e9918b8c8405f1f24ed95caf71c229d177ceee39650d72600e96840db5612f09dc6a563c8015b30b4ccf6bb6ebdc59caf457f5f09dc9156ab43665f4b2cf918036e791365ddf3fc6db2c36d1a6ab8bca89f63c3cfa2e8372b84bd599d6747765f1ef29a107311db76f7447e51fe64c8f08cfc905cdfe6d80df45b0dac3c238b8225adddf06dc4e9411a0cbe372eed9003657250b4f920e1d979f86d7bf7134aff51d51d5b80dce3408787bd5aa92e50e8c96092e499222cdcf320b6afd97ab47b8772b915d672de77335bb0bd78addd46e64c34ec3880a809ce1d4c39c3e4771a723952c8aa86c2646ae52473c760d51231d29e4248bc49d519157906cac2da4d68eddbff906f4d1b05b5590fde33e8b8c8f2e16930b57e96466601ef523c8203b925964c52f6df56a59351d549fe0eaecabd3a68150aec73056caa0415bec02da727347207305bc0987c873a7defcd207b85de17c23538c259923a236bd321ac5142960eab569ad7ee71e507716e78b54bbcf0c654fff02bc635c204b841152a2817e7bd999db801c857ec2db7107337622af1d9297baf62ec39a72df46dcbd5b571f1ddc3e75d8568587693d31b78296477bdc7669b97c38f43f056b02a0a7149b16c30ad6e7136afe59f2f0bc037459cd577aba4a6e441dbf139cb29f0f0664ac061c572b8ba8955d70ff30e2c73c88ddd83c988a53e77932873339946ac7c368184597b71ac66c5106a2a43c354de06824683abfb267089665f05c3fc0ff165c63c2381ea37aaf273c6560024a2a3666ff869ac818a823a681ccf0fcc53e204f5e703510cfa7566952122c9369000a50e5cbb666be97f13c4606cb5d3b713b299eaefb3fee920d5936d8976b145eb0381f94654b536575968b4904485075a46b34d580e673dbf6f9e3f3934f850436c899374c0d2ea5607746cc8c93af5a3636c28def1653916249adb761ac29a35e3cce0d2a413b819ec69fad659fcc268c70944fdc2da603fe2f3d33442187bfa7acca078a1f9ad86985a5220f7904fb66d59b17b9491a1fcf6f8f1f4608076102a2c2d7787a8befa1921996b6f1b992e221708b94f03798beab9039f5a647e4744a35f8acfd66bfc8101f5119235c56097144f53deb5edcff1eb2f50672cb1022ec89d1f5ab0385c062b484b60773daae6043c5e227cf788212ac41cab50612e8f2194d4e1eaecf8d07b38636bb55fe1d0d4cd019b051a75861a5677b59ea91ff42287cf1b5aa08d43f75cf210d7167dd7acd0bf1bc875c8ce3cc701bb30fe1e9d842c0904798bc1b496d32e770ce732043d055d2a5f5bc276a549e1e256e9be730ce02960bb6e6d3f888f5d58ac70af396faf048ca1b68a1d4a4d5c222c70f626c082813fdd1302df54c1f1fdeb50191132403f27a4bc7dce0c2a701e22aad5d4c868e58e85536473bf97207516949cac9cf15f8f57f3727010d4d7ffc17eec554faf2b4899264a8a012d46f069f7d7745114673a2b8399ca9509b4b5434059471cf9860732a24b76149a09be7b1bda90b21c3ce2178a1f214e6a8b0d8d2421258d7aa87a238d2d10c2e5bde6fd3ecb1a3224efded84d30ee32619cb23714b7e13b5ee4386f4acec0d3cf2f4a7adb4d4f147cac48a84daf799dce1dc100eefe43478af0a5155a8bf7cf9ce9ce8a43b75c9a25973d1535bd21764ccd31e4ae6014b9e8dc191d8234944c8a733a3636e269de01b81708ca91153f3ab83a497e1c0f8ffce378f3f373b172d1705d0ba9a8765c1ed0083320b5de0775c5301d6950efc772aa12130191d55c0ace4a2765f626f33250892df44ed19b9ba09251fde670365d25ca32fe2ed5097cd042582c90fc2f1a437d9f1f55467a8c63fcaebce812faf3ff1d659ba93bd03aec80373055e70066c19139910d8ab0a50673b45dd02fb39c192e1f683023669e3ec5e10a1faf2c322ed6c9deb63e9f69f2279e86331735d6954f487ae7db0058ff308e4a81f17aac4533a7c7f33380f7ac317a783ce6be8ef297a506c78495732c3255c416e06bd941c751b9bb67edb1e7c103b947aed18afb0118112f2549d626ef443d1e020260131804846eedd04dedfe48ee0a3dd54e9a2db42c5b7ddc95c17e940e24ba2f2381ba582ffc030af3bd61d9bbed202e0967df658fdd8e62deca7ec9c3fbf9acc843ef3e72c4ed6b8465b8b63d73384b7877869755fd59b7d46d22fb4422112556c4b2915f4fbd2d1b687a98e9e5617b1224ecbf028d15a7d37c2d32ec1b3363d9515d2af7df1096b979ef0ecc7fe811e7d74278a7f2fe0089e568c1118e32d5beff80b19758bef9a93f092ddb268370e1f5e9533794398036945171764a0f4cfd4a316eb6680b212eb7a3bb72e2efa88d9a331957bd1dd39474f5e05a36f4abfa2b9fba951ccce1008be091365abaaed37c621a43b8113f14bb9a02f4c8e46638bc6e609be29c1ee6a50142d5f0891b96689b8efdbe1f59986ee1068019958d86ce68dfb2f963340f4b0f15f219f551602a3122c6d64146b665f3442affcaeedd5457babcd37fd101da7c50eccc6383ff0f4f2d0cac9f84839bfc3aa314f2b6f92bff170420870927f858cd730e4097ded40edb224692678d53195ada221f5a50ef4becba6aee21bc57dc871c0169541c846c4e6d8f0ffeeba217a48ba5a1c1003f43e2e538de9d7fe51851ec139376e1cddc9241b3f1f67ec94fe5fa6dcbf7cae528fb9b6136e33672de2fa355ad24d0f6fcc0cfa9b4e708fc59aee269fb541c8e401cca13b7283980862af70f3e92c8056f58396f3d331126027c5a677c6ff1232d38300a139875d43116b3ea287f20a349bfbdb0a7ab452c1e4b6c5118bd57cd12f871dbe29d7e67ec40e6c8ea861b4ab6459f42e9a011bf663c1eb1405d1de9f5ad4e3c706c0d20c0d367959f73d1ca76ffb40c326af8f49d5b68999d633d8576a48258fe6ee5b26e9cffe2f569f69c6222c1c6e4b1d89b3557845edc8040b295738ac9502dff9ae6de19f978886dc37bcab53d6711dd2e428731b7b20594569088b736d532afafc0f63920f058e3da6c3ab809d2d04e7c950939b103f0be4a0a26e5e0ed17913c68328439430441e4c257c043a07259bcc31b1cb744edd5c26859796ab89a376948369576766cc290f1b9e6ce1e8abcc7d8d46c155789277f9b778b699f241c8fdc71b765b7e83271e3d497d67135ba16543bf3bd60337570bb381949b1354276e6b9c727044cd864eb9d43e90ab284ce66974564574546750234ed9b0d911ef72c4205ad868868c298c89839dfc82014ca09fcece495d64baaea1ed587bc5e05440f5536952869368a179be0f38c4ce9b5da7472968835aa88425a070f9816a63e9edb3f3b4dfb65d6411e91c81dbc3951b3216a1b5086c9020bfadd7f4c5c0d8b5df916c16453c558525d9cc1d923159d18356130db0198e91e9eeec0093909865341cf14ce57b70f05300e5a9ec28c0f9ef36d42f3693a7ab158cd80d5989824eacd6776457a8c1ec2a2a2f10245cddc3245bcd5f08a61762a2f3f86cbf79c51ec4501f839d825162fddc4deae8e76fe67a0e4d60eb77a2a090a444c6110b61a63e5c58fb737f7367fe8369d6776c7aa4fea6ce9ed3bb221c366541ba0dd6ff3435691bbe3a4f453c8fb820db68818a4f4a4f94b65de282e816b97ec80e357d0f31089baa6491a087f9931e1c485aa3fc5f75a2380b9aca38bff8a566729b1d689caeb2cb9c379c856fa294393dfcde4a8d57e5569f51d3c0952d12437f0f2c16cf78adf30d61aa4b5522bc016e7e6ec84de2d6dc81cae6478cf1008967e4de4f1866f581a29307185869769d4fd0ca88043125636b1414a4a81138c2842682c1e3186a308b13202fb3fe7896b5d30d570ba03fd67e8546a9b15e1d8fb6a3d44c33adc68abc815559b1e48bdf21de32191db8c55f849ef39759a8176806af9d6a55732a1fc5a5c2d17cf80afefd74bb7331672383f68d976c4d4720113e643e97a47f9b1128bb1653956e653ae20d086c1db91050c6fefdcc794d430c5a521d6d0533d7d138ccf0dd325b0882e82c8102134f7f9387a0e19237804a96bd9f7e8d6d1d7dc003360961ed44cf548e160ef3517bd44f8e945b3d235e919b4e9470ca6c27f53f2de96a9b518bd31189210957667232173828b20dee35f853e86e783c7c8f39389f436ec454d7daa4392b15f3dbc7a19bad07f028fea7e3449a73d769ec76216031adae8dc9dc3fdc25808e2ede5b1dd3af36940bc4ecf83f7a3835b84d75008e244bf002f08864f25f0ea637ecc34f2866f3c3c0a0b45f76f0826ef963c99adf626fa3c1e36a0261a8b8f1e276eabffa4951c320654d4845bf2737cae31be901870ede14bd47ae7a05f81f558ef8acb8fc84a01fa8e658d6f920cf03ab4154ac9244ce5d032d8118d54ee15c0522922d58e87a4649730701461df5692037bb94bab19753a34a51bf5bb1727b7a70e72a6e443a8054c5e404536308454795d3197e4bf220183e82e66ba83cde7f011c47cb5d424b27cbc70874267dbffbfcd02ba8a37d66f457d35db8ff0a3b0ef31ff2568b0e0808bcba401caf933590c21c9d5324700b6a95db1b1e09b08ac23b8c2a36525fbc448081843f1f651d8361d93cb33889b9f1dc7396f4a2603ea741f108e73f3b9e8ded2d6e0538dfc50115d3e8d5e325c89294831693f28935dd3f9bb25184ced4b8cbef892a70b803402e9dbc9c2f0c80849202891f6b500ad3c16fe670dead2126fc17d5bbdcd91af2103c7f90c3b1be27ca016ff93c6b4afdde85d1cbec7a377f119493c1606e55ec28acab7a82afdf4fd48a178633c234ff4537c4629d21daf969e044edd868e063a109fa97f2e4a4f90ade3568eab8e06c5fda4daefe3ee88d10b77692a517045ced49b93150d480b439d0c92cdabe78aefcddd9a9fa359611d539e15d489a4f5caafe2e2437f9c387ccafea23efc6f7b1a309d98867421f6fbbbc64c2e6e30bf38ac2c4b40f770ae4cbb7ff4ad930d3360d1f5b3e4640333e0d1f09b5e69d0643b5f05127cd7cc9fc628f9317dae7ab84699ba75f5ad04214efd5fa46239f2e5d9e4f358d570aae4a61f5542f828dc7ad92e6535a43aac99792a4f034aad48357eaa070c670136e5eb7900cfebe31b18765f7973a6a2b517cea9510d8dfa2a3d270aab34064e6c9181ad24a48fc2ddf6feccc340777f584ab713c8efd9dfa9af84546ee0803d6d23aa7904bf754a08b4ef236dd6eef44627190a49b11bbc28cf5f7889a3093c6a2a273c487fc87109db73d6d21f5ff9a13176bb9c6c532602114aedf5a72726bf40a92f4c48f627e66341ac69a659c394ed40ac36ab7db738fe59d6dd0c4d3d6f7f0351ab0e129e45c68721e43dd2a52cb1140b68b82c405d5cbd52926ad7a52f593b5ef6e8e97a45d2b2c30590e7650da63654c111a1a442a235986e9f0a5ec07bb0a13f73e1b0c85c2bed333171f91a0698b5982b572a9d022743ebc465167c448e547ce7a7e63bf40d0584b31abc034143eede6a2a26aa36d2faf6f02ad77844b066eda9b546d9eecacdebd5fe986eff6bcd8c6ee3a6f45ae5871e473502b2c018be14b428fbca8deb2a5852041275aea0d89637281d069818b078b876b9c23de78b7a5dd47b56a9839ed9ce94c133d17016c6f3a6359729c1803e28c2c7338d090437802894f5a17fafe2aea45867cbac95e4bf605c43862cf57c245541085a3292d992ffc376eccc85b8acfd0a3f3e06b8cbf09b094cf60221dc20039e5dedf79ac32a3865427d6bf3d7f49b096e30b251397ae46e09cb1390527ab74187041679e49042c6245ac588cb064203e07d452fe434b1c0845f21bf81c696140a1420d5b569b195c436e3d54860fb4c405b75e155898f9af0a5b3f2f3e47a78f9383d9b721206fadf6bf66bb2ea77a4772dc6c2a986f83e03e2d404780bab6e1730eae76ecb83a48bcf922e5c4db0f68c09bda9c5e4d84b0bce5f33c408f7f2d2ab9d087b950ff38dce0c66b8d2a7e29c5c0ddf715c2c79fa736d0f526c3941c81023bbd58ee9e2cf935caa5c34de1b9d90531b011d5c0792196c9b49eab77ee9a576a77f1870e30396dfaeda9384f2118a98885800b9ba041d40b8767f115607c806c4dab15c71ce11f72519764137f636ac506df49e7289d0a91080c0fc1789747a7d46133432ea30ac091c8c90e1519fa2ad5382342c386c22b744f8d80d70dacaab1d0a89a2d6ebf2caed26319ae3ec9d9467afee0348a717c7cd200d4616ad76f06b51a56cc5c4e58049647fe6058a26c77f06f6d59cf343e4e7579e147ec9164db1c53d97b0f2043826ddcedf19df3dc1ad54405e909eb6880b903d5d7f0b8b84d16537d59747460f41abedc8f943ba6b2d14bbfd98ade7d51159729603045c5869ef7a857cb2b886bbf961c45278e15320416895c0bb973528344a5fe78b5a0309e21a709f887a8945295d43ca42943f8bd1a4900cf0deba9635fc59ed18c0f86141db3a088618f1aa7990194adb38326f3db81d7ddd4b11f3c564b62187782acddf706c99c9caa24a6788775b66812da70be2bf202b820484e9c0645c6a2774f387583a8a00430aee7f0061780a0987b685048bd6f64e8335cdefb1e573e6312323aa3f344e40c8f15d5a952d7d9c183e13be897491d8ee0cfec942ebf42008dd48fe9c128edd6dfe5aae8b6bae2da7e7a8d1d98d72390ee6adea522aeded02637ceded5d150ae1636d5437d567362c63ccfddf308805edc98cdefa2ded99b15f1808afe2a4d07b28fe8b33b5fe0aa79b1fa08cfabe267ba81d5bfe97aa28073557085fc60f75c449693a13c4983343fa0d5a4ea6bf302122f544ce2e8b3c58a8d4a97d44f3ceef61b035b7d7daf1804481c1b5dac865bc9b80b4eb70766e16700d4456393b7309a720c61af3aa460fdf9c9b624eb08b9c89e7b3b15521b5c61ec58d70e1ef49e43b15bafc85e03451b65f0c50aaf090f98cd5f201717588b544ae406effadae43356b053025c31a49102db852bef48414ec8a320e5448d5f2b860ab0ec1edf2ba2de35854e1a490890dc5562ca0c6795addc593332053161093857532c3758fffc0ae2f20ade774eae6951788d09fe366ad62562833115288f999d5118b39053702fc74144a204409c36820a78e054c1e6bee7e40b913910efdebe0f977089dbc94ef77423c932170f98a2bf7c384347e9706fe82b8ede2d25ea04f47eff335bbaaef5beaca0f1b4eb6a1d97903b2a9824966215b264b5b780c3b18a67c25797157a13ea95fcb5743c05cc2d850e51145e749d4a1d16b26451c3eff1129c85a3c8febca37a91f35a4477216e605320383a59169a9d8707f11d8a3ab4d49d5b1eecf2f75576ebf3aef7293f80a30d1ee66e47d245f64b488d6f4086917b41a403cf19748cdb9daf7210cb8cc38bb6bf4d5581abc500a161287bb73762271c82a5a23fc625b2e15ffbdec2acdce298fd77c52395e969d11a9a0db01e8dc6726ee3060025fc14fcd735bbef3a5a09732a0f7ef96df6874fd7fb8ce36b266eb2050a2233b42173b609b1c5fbb2bf878c46833f806b3b752863db96adaa3dd4f21ac5e1d8dcfc62d45e0aaedf692877022b7cf2eba203c1b766c4e2f49d6ee64a261f624249031dfde2a30cd21be6e5c339bb27c265499f54b6e54cabedd24817f820e47e74ffe2e9b55e31e36a985551c4910506cc986a73beb4eb8c610685ccc212d9406ba95eb3810913f758817096330a3822e2eebe60206380eda45f91e5b6be1d1a11d0ad43fde6cff9c0615e2bd38058d9ffb5abef8d102400bf2b7fcccb40a483de598f6e2cc42e6d2b57167cf4330b535fc76150329f71a75eb55d0a67f2b80aaf2ea6f28d870ef93d745f116fd04de4d05eb1c4cc1a4729a3b2a176e1c1ffd9e3d1aae19c6622cf63b698bc30254295ab4802012ec28e817009cce6fc1874f9b85ce0d92b319d2c43aede8349e9d3c25ab0b2031c41310579915b583833cb3fe3e3eaf1b9daec999ffbfa087fd8071b3e5d007e4df7056bc8142f7bac5c28fbd25645f7016166a1bdcd881667a1ee2df5ebe9ea8e7952b83f9274d0c5411041a7129c2471ff33940c36f0b7e6f2e0a6419fe198c851000c05d1d529db4dee4ee0e2a465e5ddb772f3f9ca0b91e4fa95a55983f68da33fa2621e26ae3823f6c74e1ccb68c52cefcb66b1eb2477807ffbf7bcbbaf09daea7a70bfc52ba6c13f3c2ad527fa6df7e2cbfeca9f175bc11645628ac2b804ec059acb338d7af3092c8be8ced92c2017f96b38ae802649c2aa0f59ad8a86d43e6da76eafee9f3543b57ac08c67cd8fe36b8471dfe72134ba71fff7545f7ee08a61993652b7cc78ae480d9cca1f6c809fe5b39a04fbe70a0bb16affe4d216bc9868a5f334b4fd42e9b5b5d3c99e5b5807bf15fd01b273bb3bce86206813762a5921e6dbba7564b42e3744485a52db222d40dbff71bc8080fae3504672b71df6e0474461bbc2901132be91540b1325f7d03df47a42f9aff2b31ee38d164954e7c48081a6125018f55db45a67446b522f94403ec5f8b75c3c51612fa378912e289bf6bad38a478719f602cfbed7cd461cef6a10f0eb7b9452006b7c91ca1f392894d372abd612d3837b3211622598b33bf8185d6b188fad70b101f82fa27531a9176cac75c144b5faefec319e52f891525f29219a70c5a035ad76246821b944a5980053555078d2a793e437636c10389b6c4cab7831b114eb447a4aac8db5e311cfe57ed096c45770ee4a20521ab2dd71b5fe858db6d78095eb4f6dbbd2ab20c5f5f2241c1d04ab277297e596583b22c2daab37383daeb904e17b09aee6abbfc1fbde377d19755a5b9abf36ac301e9289126279e37b66a799ef25df58eb0aa629c17f2dabdf032045b199f4f2318ba39a06fa74af325a2df9f4add325b2f1d6eb0faadb0af71812ef6732bf3ade8ca241b7d769d1041882f826fe32506526124b38488ece4514084a18e6d9e3aff6a1b0da824321cb0215850546f46cfb9b45331b1b3f8f55713ebad93757a7780815e93ec387b06fe49f9a9b4e2cb50fdf576359448011443a5e9fbbd79bf993105483e0fe6baa55fa891dfe663487dc36d967444542966e4b8371c92193beab0fcb00080b381e1f1f51efb030f014b73e56cd1334a341b22437951afb442dff6b9b0ac6b298018ebdbc6ff342f9f8638e52c3b497cbfbe43a3a9a89527f4b3486b44b5fa28209a7f03b03400e5c603814fc7751c5d4eb8e7f43a883514aab49291f3b0f666b2d106d25b383d8eae67f101eccc2457070b7ed8401e04bd265968cd5a5a2abea78d09980fa91b460d44331a125da2491efdf289357fa8e08782c4029ff1ca7e8bec6e5d17327d66963afdaef86b62f788a5bf2420297f7f00f8fa64a3df9edb4f24c822d711a522cc1863335fff1d202d66a9dbc8a095b8936a42566f7c7119711e235cdd964a291220101b7a6471dfe11477444fc98312022e4ca94d97582ac38b041488a7a8a5b8fe755b4333c1ee100d82c69b737101a28c45b1d0fa26590203687162dc992cb66af3ece4a49174b767fbad1f457ea79115cd25da14c22972b1cb82ee949d699e2d10ab909d6185f211443312dece608c410496342d37a5cc37d9a65a2a8575771d4f3f2da2b98bfd8fd1e0d5cecae24983bb9840b121d3cc0966200b2b370e7b5de42ba0b4d8d41d9c4af0d837be9d77073f2dda5c3c3cfd87c3f49216efa7a5ad7c1f1277d8d2726eb9bf95ea05751b59252b16cec1bc743bbfe38b421e28ce6ff60112a953ec9f2b46a9e87971b1c219150499b2a07742b0ba972415b8d6536588bf60c785cd9b615aef5e998b5549a3e2e99655197d6617232c19baa125ede71d1544bf63cb3f29fbefd7b0a089cd0e445d9e186f8e0815ca7a272c57a4e753c617529337a4fd1ebf58b7029fa8f5d6dd2aea51c0dc7186f401561ad7ae245ce1ee6d75f2a95cf2e7b527335ec40558ce62134aea9c3baa462451257ec22937b4127220da699ef57503dc3685f70a07098546dbb9e15f2afb0958980cee5067b9034b598a7140280774d6fc35379b9422ad30f14c5e78a2cd70a637c8c8e6ce9f73c6cd57d820b318ca52a2fed450b9ffa15fe6e5c09ac00a90c8856af83fa5f2f72090c96380075cbc5c282e5f3820c5ac754d7df10d825a69865779e99722fdda9d27305c6e58ec53c36cfee73415472cf4fe595c5bcf98f7f08f60454db9851da83eaa40df1f65987d267f282e76dcf76724941436533e57c1e2fd1b4f8314f9f0a8636ecbc303a5ee80330f25840a0665438c1c48bfd46dcd1dea44bbe4125f556fb775551c2f5f5b016f6994fc8c37b8f863ff902dfc9f27c9f967ddd6e16937b5ade110871a67fc6630566d8d62cd96de714e6ffc37f2be45e5eb9f830a6384930bd197ecc351d919ae5774ad1e4d0c189248e7546f1b4509709298720d62a987bb0507d2592c660c500804d3769e41c16e4dbdd52719781cd29914d4c20d5e26ebafeb74f29d3f677050e199d59a92fff134b31bbceb8270ab39dc1162836b7242e19710625f0e472b8ddcb539330e91a2ec8f3adc09e333e051dda46c9fca1690e163aa86076124062b378bcf5ce874aed34a1fdee4adfa1055ab50252f9aa6653ba7af12929590e8e968a64278b7c419ca6b66da006da2c3ecc4c2b07e1e8436680ba43d6317413e3cfc19f5a0efc51a7490e7f1726c8389702ec3e7dec475dc29fe70f528762d3c3e7d7d5d4af945b36cabf5a8eec0098f9afda104cd047e350929aced37fea766e078410971b4c6335245168431d2218e1ec651d662bf4f9cd8912e112b8fd514c7171d4b308fa5630d1a9b7cbc9a2dfd4c6e9965896a332ddd4ce63b6d6b09c649b819d7398e907e4e410794b47cc5fa6c7e3a96554a07f73c2eec9b4fb6d36dd66efbcd2fed7b7e8c7e8b414a55a200533d503fce0a5bc44dd42e66ba9fd5cb2a5566722901d4732e8aaa294b99c8c1aa0d392a471ab8b6c0210d3325a6800f9690cf17dd754e7bb5b4ccfc96bb5e7547079160999a15474729c357d314920991668a98fc9927911b2e3de50e94237c45aa6ae7c6d18df96a3820e2d310222d98c589128610d7c2ab528cb058aa338978ea4d15450990dd8f09ab50855c6320f65b7a50806e7b8ae44f410230a6288358d659c27266778375a18d196f573cf2ac2f70b38f4564a6f1e87974e0dbd224b5d31b1294fd96a6776364b04c3fd56536ead5fa41bdc7426018ca9444ce62754008e528a38c004f00377f6f95aa9133ce08ed28d7fa41b2400488276163bd5e7aff4170b8c331f3d7e6a4f43d6e65b85b044c9c8fc93f2736d1eb3af93b7e02c2221f09159d43ac7eb6a2584d8ed1855ddb326bb1e7c8996db202f29263b5f91a02d1299671f09d1610e919622184b19a919e8182ed2752d7aadd78f12bca04d40f4604929b1b8a5ca5300bf840433061a65050ffed40cf3066e9fe70e932843464278125a841a3075ad071c92a92daf0a5b9bd75e93919662401c3b76a60e75f5c88a103eec6b07d9c9910b654e4d488a1f05170b8904621a259ad8efb49cd9f68399a5b1387868a24a2a8f15e27df047ef4a679bf8eb45f30a476d81768e2cc215ae735eba04b6d7f285f32d9a1b5ad05b6557c260733b1f3ad7bb83093c12e0b21102f9002fa710a01e31bab0d36497f0642f24df195d7db972afb4328aaa9e7ff814d0b97fa4e383afd2d0f173b927afff3cd5a5424e6820f62df67ada49df2fba67c4fee7fd1491b29fc153b9089f5e17e99d0dbc722813c5ca507758429b133c8eeca7dfcc936d3e2802bb5d7c2cebe0242ad0339dab0abe670a8b0e7baec29679f75e9732c33b07841023aaf08ab146d400df800459d9aa6233ada17ed60e96aa5c52ac370c71c9f73da0a9e40ac7774a48a363dbb7e99308e40da4adeced6c8d843a25356e7d579206c19c46430b196f021f5410165c7a949810c1239d434086fe822762a7e2a211b38466496cafa1a4da33998819c1973e79f9accf79782a0d8522f20d64107cd902e676ff6315faf48525bb16056b7ab1f23a8c2a01211d045c04a75ddd87b33e7b1e02ab3f9dc5ce0c50bedbca810b55017596dee3c827ead761224af8adc5ca2bd126a76078e810d2114239185879e8b8440cfce291a39fa2b61c935c53e96dd7c9174b5e801cd693e55bdbd838947ed868f778a53526e1c68128ec640f66775c066e8e904ec51bb08561c32077c8da3673593435858ad11da2940161ce9cacf073a9f40ef4aa0b2c9681c37cfcdfc03f048fe09c78054c8395434fef6c08eadd294975e9b776513c59e9e4dd400918750a8abbcbfac8cad602cda86885d10ad7555834beb12ba41aeaff1b8d7e75e8625d1211efc9dc58fdcf0d3ab453816580968534c728326f6be899bf68464896461a1440d66b8419f489ae033513ff21ccc972f838794a4b5c8b7eab971e8e3f15374019edd5b56cf7159fa5fb98c14be31ff1dddee7125ca5108f43bdee2d6d9f9b2c918275da56616aa082ab4a8dbc076f0faf7433cf4c94086e72907485281a3634421cccfbee91f489ddd281dac893ab49a0c207ab445c05dc7dacb583c3b7f659eccb2bab17d0079feaca996e72a6e9de585e32eb8b080d276fec7572ea5e15679d0f3d45cb78b0cdcc6c5acbc5c4f3e3e4ff9d8329eb3858f97898fc0683e7200776541eb66c467855dda0c5ffe88115093adc0d5456c856a16397f612bfe72efc67ab20250d5eb58f4e00172668cf6f8d3f0578703d75d3b239ca2d5d760280facbd90140103ddade65010c40a9542ceb88ecb1e370bcb8eb88649d991ae7149a84eaa5bf25e1ff25826417a74aaea33b61ae7361cfe5bb0a985d7089cfb2da7b8dab4fa34ed7765c03c49b7b0d1db576fe1bc61e3d2c57319cba49cf8a7a16b10d5cd318aa4d9a692467d7665fc3cfd3428753c8b15c16398507ef9ed6ff658cc0e406154ee066138997762001d7d84a53bc10cd7e12acc34f4309d4f1cdf231a6fa2958d16fa452c7e511b91d5274b40a3294dfef81542fd69e4f5d7290cb7fd316b28a82f52e6ea202972ab3d5a6638a7327f332ab0c198fa9e864436ffdbb83a27f41079f5b7745a11e7942ca70b22e7a1e01c15a4f9d54c3fa47439956771581c0b4d7d315f2b160af87f59913f4431a5529e070ea3d1cf5219ae6473a3dcdb4e7def015a4613707e7266427e72dc5ffb3315b6a9c0879d88e43f0f872e53fdc9fb5ed50ef6536acce4f8905ae5f03b78d60f78387500e42e41f42f352fbb6655ec2cfc3d1275656147054fb77926440c4527a9a74280e1a224c7037749caafd83d3eef415be09f31254d0f51da71191057096d373147b23934b442dfd0fa4ee7587b54763c8adc4c619564b4b05c88d50608b41607e88545f8614ebb7cb9a47e9d2c7fca9802a0b05c0798151b45f1962c61defd897c5ff5990690b1517be9ff29b63c2f4439d548900f290bb11e0b37f6099722c2a8d52c7a71c1ee3141c525d0eebac9bb250532c22ce510003fd504a4237247d42e99677b88edb59ef0a91097168d74ce825e76dc192","title":"1381. 设计一个支持增量操作的栈","link":"https://leetcode-cn.com/problems/design-a-stack-with-increment-operation/","question_id":1497,"issue_number":6},"4":{"day":4,"pres":["栈","括号匹配"],"tags":["栈","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个经过编码的字符串,返回它解码后的字符串。\n\n编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。\n\n你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。\n\n此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。\n\n \n\n示例 1:\n\n输入:s = \"3[a]2[bc]\"\n输出:\"aaabcbc\"\n示例 2:\n\n输入:s = \"3[a2[c]]\"\n输出:\"accaccacc\"\n示例 3:\n\n输入:s = \"2[abc]3[cd]ef\"\n输出:\"abcabccdcdcdef\"\n示例 4:\n\n输入:s = \"abc3[cd]xyz\"\n输出:\"abccdcdcdxyz\"\n\n```","content":"096221cf5b628be1e73e8bcfe626c734768e278a04f8088208427f247f0e0e2b13ffa443ea6410d1ec9878a833a0e65ebe221bc49a2e129cbe22b42dbfe7b231e23168699ed9d2bc0d26c1aa8d98106c23f6748893ee66f477fa654b0266256db0a53fefe6414a444360493f2f3825348314cce6efce2926f8275a0c890d935aa8d6186b3b463d3e45c128b70f9331de2b684feb5b6445588da61c16ae9fb05e7d33760b27afe875237c64fb8877175a25aad5fc7a19366fa826e86c7bf61b225baf5df8686427d864592f36ed21343cfe01ae3a6975ceb9492995976b1803cca3e3b41dd9ae4db9ff3104f5a3d884ff080c51c949a44e314b5586684c2942d5ff03dea5e4fe4dc5015f1671ed331a78988c996da600fc3eb49cb40ae2d161fb0a09aece76c08bdc46af791639f4256495c515029fc74dc09a6bebdf778a46871d5daa9c12045352a5a36ccfcbf84848272446380ce1926ed255c4dc6c3617e7ddacef3ffeb8008963123f362f2b98df7e9bc972e74a484d3a3fdc59edeea56c07845118673a83cf190bdd216ecd09358f312ade9abf75b9b16304e87b584757fd801d13755ae801bf8e284ecde9ba04c3f981d8c032c960230c63b7655ca3a8b811a4dbec12986f409e3f5c4b6057130ad062a999d2c2e9bf35d2d6243e56d453ce532a019afd0c87aefa602a352abaa6b2bf3bbfe7238ac30ae97ef2c760c7c4792f6b638c6fcf0b8d42fab3f0d7191e92cfd2fb386eca7724f4cabdd8b8c24bb6f3df78001c06fb054cb1fec1ad7f714437080361824e08e7907d19d70c16581f0ed3fbc384b9650675474c9a755235b1789f3325f569e4b7066af89e4859c6dd735bb8b7ddaab7a18b6ce3fd3e19ccd4c9c3c5c0dcd92503d1380b3828424128240f23738da5f460712bcf3282c2a80a21706ac1298d76c4462e965d3a779a1dc5f93691b061eebb97a72e1a6d3e973721c76edca9d28970dc1ac8ab6086eb069c3f0b3085363722debf24a2677c6d81d9a2d71e86b59fd5563dced476acab2ad762d2d7ab83dd4c56024c439356ecbfa5ed2db80c0a049cf93cb4f939d16452758a82528c30d30cb41cf380233884e89feb09862164eecbd3a6314ab26915af793e7b4dac519b5b9624cb059f450ee8e7a544253280aafada2a754a3b5b2329270b1eccdad139343ba9abda15b60e0955493ea0a648f00f44df34df46eff68ee3dfe9d8d97dc43987c2b8ec76969c9390497fa1df03dd3a8f61b12c7fbe6feefc01bb5200cbe149b8f28a317555e4e99eec1d6423a2d5f95f5589fbb089ed05a6e74f51e263803f3ab98427978ac349d2243db4e781d19172ff2f72ca63b3422ec442fa8c6d6c1ec0aaaf8c80aed58b8b6e2fa786d4d6a675f53806b17a85bb9f911fe1b297cc99375494eb3eabcb6c93d6f92a447bb23baba496ce7865ae8993822978f2993ede19d70bf165c166257b6aa518be69bd41cf3a96b46b87eb67bf30a3160d8eb42627f8d35f5c54584f309ed976779d50bb0a730da07e8e76e5d0f81289b00fb8530d8381168e529ccf84912ffff3bd0be9d64a2a812fa6edd6af42abe2ba9a9ee32d02811ce2dd9d00542ef831fc35315956c01d889d4fa60f5a63003a3e5d625894067b05c29b9937a01d92fcf580fb6a44f02e3916e2d888e39cc2d25637b00ec3f8397953193a310cf1f5f8f05a0005d6a8b87296bedeb8223ac703f3a893843008d24a94c77387545879961e790c37d54581941d2975a99c61feb95c280b243856f284f8359248f5e73a3c0360183ade3a6aa673de9f8d375b7041d9cd4e13fb2e2814a1a85db98cff84f3c08beaae7b1b59243299f3f3e97993e36ace74d0c3f386146d34e0d7c19c8f036bf0534c77f1bf098e2bffab27033bb0ef43134d203c07e9cf892fd3895bdd543db43397602a24674765ffcc00e5ebd6ac12ecd8f43090b31b5e20fa05eb08d96fd344f5fea9f1157e9d3549c5b2ebaa6fbc78922454f50ac6c83137e6bea08fea4f0d856bfa6ed522ecc238574aa2bb04d576fe4a88828176f2d58e7bbde55c8109f8d105cdeeaa6061812f6f7974cd2af1af5528d14d82609d221d7ea62516939e89bc92880d7c5884e4e1e8f82e2e0e4bbcf31210a50baac295b4063d5e38805f6081efba5bc9165be1babb7a366cf213b150903138208c0c1ee862e5c36106bad3789b4825dc52dcb5db9ac13415159475c50debc7615424b410f6a0a2a6f221041ee636b9280ff75415a239f90fd653251727182cf4f5f3732cee7737db1b5578ad866980b13ee691819617b21b87b746e6e30a94f63cddd635067d92d9c1e0b5e8606be3796c9899471895ff5cd645f8cbcaf9e1f878895612e87a317169de339304fcc19c0af019f62aac6585a7098b84a96934699846e1114a99a4b429ac6d46b5afcf74d403e198aade53f4d22769aceb0d426748f1039a434fa5d2fcc3926ab50752d7ff5cadad0970c00b22dd9fa2ab1a7642a93696f130065cceadc5254187ccdc6ec66eae33442f31e0cd03f547f9b86868b1bc48fd274937b6ca92579882328fb0d5ec529e3a5314c482a92a99d4eca38a97935d56f3f64d52e60f5316823a68e69a1e0afd6c11fb0dd69011301e2b0ece4c030932cfec0b7d26c32f7b489e0c27f4df78fa70a9cebe9a9d878647e0d968856fb3afe9beaacce2822660610b32e5e331702d49387f65f94640222a376a91ad38137e40748f3a9cb48955a9ef64dedfc6402d2685002cc687d8322936feba8e8fb6ce5c7ca4dcb872ae9832bad3fcaeedd4d170763462f36ec0901f1c63b6a3dd9ebbd123a2019e3cd297396d052da651b2c66a6036289c948b1b09b34e54eee2e3791fedb17aba5e27f644b59988591b4ba4b0754a60954ad235893ca27cab6efba09454069ba1bb746fe44e9b2a1fc5357392a0af937cbe7f4d935dd906519b3fdc446c0a1043c528620fce26f6fcd00aca1e490a397028a787d9cee0ce0869595460c3098f4b1bccc771424165afe1d5ccdad292e293454418a3268223f352ca2648d3ffba5b2f400d092744b52606e5d63e25cff75c41dae8039039aa30986223ee0f36aed46558c0c015ad12061575f6beba57e36dd84552bb468816db71ce60e818f5625a41386e6c54b8d7cd709fac534947570d4ffe07af5c304db21b2b36f2d961cbbfcc8910c4c23fa311d0f9d1f7b866ac221dee11be772b710fe02168fe40013efad940608550a118228df8f3b0c7c04fa8ff9df4f257c61b7580d5b2eecd3eefe2f401672f7ab8ee5a5fc635413e81c829d3483f6eb8719f5c5b54051fb65fdd26e09c4e3cc60492546c7691515b014c34674e08d81c3ba4d6b6c8c893e85e826511cb2f1df3919866e2f4118d7c5c03c090d1cbf39034dd4d92c136862a3a13931dc698fd559eec5d8c0f168ff2b0b7116bcc984c5ca97f99fdf87a65262406c2d331a0a82c24e83547ff835ad342dac8844fb1c14f30365ce013b0ca79eacdb6b4c75964a02aa220088dee2b1c3f7c0d1c289f4b690f69a5ceecadcfb34b3fb851d87db23ad50984d426e290c6f1d96c63a0fd44208c4430a8371c8af05534f2711b9ccea891845d6728969b5af0530747928940843bf48b431ae7c6d48ec59ce7a7a5dd83609aa7aecde79a9fa3c784e5929488107a351150ed4061512fd69a01e775208322262f1e43e0437933e0a8bd6fa6dafc1129865bed52b12f26f05ce2beae57d24ff4770ecc5f4bceef513f6cab3752d24c5f1fc088295af66e682344e21d91f2e966b3b79e0e87e303680853720a6d26339b04d36ef89cfca73f727c9a2faac1e3affa3f4b29c283022dc2a4e2b540de07d4f633b0c0de5671810f391a244f18414422aa42c1d2c676a08d7f43889c091e0d21055e7f6e815f9edcaf7d83bb391e1b652b115e7e5bef13432b934a794846019db02adf047afca603c430a9215fd117f7785bd17c34bdd63530ebdfc7a22fa62193c95d91d16a45246d77df0b28b31ffad09af33264dc228b67daa90eed384e254aeef161c2f8e8230bfecf967fd4d8343ad15d58154cec34ae82c68b6ae3fc3a0bdf8f60b70fa650c9702b30b9e0a8a3453bbc138b713e96c4838489c596a9194779171e7328503eedf072a98a2849d874cc96d0417aab547ac4bc179891ebea58b16bbd9f8b91cfb6d54a7e6271c37e2cba41d31fb46264aa7d54a7ac534131cca49c85b9d8b9ccafb189c8ef18fce5ef5db3c78cf9d0ef5c5e553d629b75ca4659d475a7b15baeb93d323929eb2f01ae8f0a3214531db13319fdb7b6e2e94c95875e18e82e0c24a2f3d3768a71aa71d154f828d56fe0a104bccd0f131acc19b75d378f3c307d1551d467d70a7f6f7acbdf5d1d6dd7e8a00ca91bec447f60bd6d1349e5b6fa1953bc0f4f56eb5d62a2f8ae414c1f7451bae9e8b88f072fbad527ec156aa7ac428d956b7bc6fdbed5d1d0bf5566d985a33142712a9df1e12f2b4734d70cd1de9e7eea472efb49e7f82a79722c8678daa4b236ebf718f4b983c2aeef0aef7dc871c045c1008b5e81b79e85c18aee217755ba4b361045bb6c2e108da0cbbb56ca668f39642b509bc7774f314f28f5daf7368ceba27ca92fcce6da13277d247fa7b7701486455c2a804af6c9403acacd80c97ecde31d84f906afef6f7b83951662c13fbdac36aa56f583c4b6837453720bd8f37092b6413286c564e67c8f4d4f112677ec8fa14f78ddf5981366f11ecfedec8b7ac89e7c9061c31ded7d96a535ec4631b5a633fdd02a5ff33fad014db72febc1544591f4b530a7e3a449849716274e7c49f2361bfe34a34af426f6db68c6bcd588d4638b103f0e6798f1e31e2afce4d93426da43c6282336380a4f89d0002b11a285745f385b23ac4eac30ace255b7fcd8c686d47afdf3209f2b58dbe473591b2820504f7108967d655b3ed0b14e3be1465fcb268cc3abd4d56457e9cd4c9b941e3f45b09a9c3e74128417399add632adf41496f616a671639523390cb35b0862f09f7040c859d96cbdbe622c1d127573c3083604b46b43eaeb7c4ee7cbd5ddb565fc62bbaaf22a788f61bd7e6ce433a5525d626136d113c75255ab77f5eda75d60b6f5e0be8ab949b5a1227663fd468770bdd9901bbcf6099a02203e064240f04746f7a512d0998a19e45bc0a81701f9968ad8a2fcc8eded595c90f1cf5cc86c611547f90aee4fc2163c4e07e4fff5943528c9308f33cea5a6a8ace9347b34920239057d2c161eb52d9dd1337a6a0c0a7f59cfd017117f31a808f98c7507609a7ab0022c427a9a89d8acccfd69ffd926688eb91936ec64e56c912caff0a3db2514ec93dd0c56e1a31c7744b0de990c166ee20b3b36b9ae8afc6b6039afd3db778a4c6492f33878cbb1c9d0b18d46e06abceab765b68e29a813a77561a19d0d32a81803ccaef571c9024ede34ccf27e78146797fd68d1e54d737692e98a050547e69b9f97226550bd262dbc3359d6cd6c03aedb7b9e42308ac6cd681a355ada181141a4baaeae2ae8b6e8122124a463a5db0b5b79fa85940a10f904e0bf5c5ba68309419e78c15b236c4c8c3818baf87eaaaad31540d3621d1f0adc0243699fb17ec892545802c3f60b5ff548ff8684d363403bf4365e1566ee7a00712fb209f39ff59c2660545fdd6d39bc9bfa24cee206cbce26ed2d3e71aece1b99d03b3035803667534bf4955b740911757c980a05d306655a1ddc892997cdc3d06448083a6c180e09d2a5996e3175dac0aab899cb8ea14f291b7780df0445b14ea8d8f41c01e825dd1667dd7f67b3160088fc825c64f130bd88f48576978b405dc9cda2228dd145b5b4ed26b91fae27343efc2b6ba8e5d6f3b58903ec33d1ae2728eb388db0537565a8d93d68fcfb997c11b51ad5781e25981c050c9fff342bf9ea5ee32c4e41e450d4c83decfed81eaf08e776a5b3ff2757357fbe7a84a6e8d4791cfc68b3c5d17544fa50f850a1104fc3ca582c459f1d881b531832d9303c8a883577cdd1593dac991dc9e2368ac03cf02f4ad30a29e65853ecc652ed53ad498beb5fe86dfb9fb589e3bb626c66e6ebd87fc49b4bc5a9ee602ea6b1e39a6eca17b1267130a7fe5329f454565e55fcf5fa04cc4e4fd8365626d4d24ca62c16118e857c5b069699a33c276443b9f85381f7eedee9a3f978f68a264458d718af78c54af9786f98e666359665ae5b37d35a165cf0f3227e0fc7b470fd7d7ea18744b44b34f293dddde06d1cf88e0d5bf64789fad4fe9c51fd158e04ada7cd2cd5284bb16626a0d6c412da83063d71e5abd09bf0284dd1b02963389b584ab15d58740fbc0d847bfb434fde6a0e2cbf5caea27e9ec9b75040d0929ef64f1c579a81eb4ece1b51dffe9a0e305d43b814017aac0acc16f0654397ea4e7cddc137a80618c18f5cdbcd9179f8dfdec267dacbd86cf7a664e5ac55e6485be7d842994195faffcfb7c8a18d85e8b879c162883cd6638874456b570c897b6b6d55261bf9dfa724c7ceb05e5b1dcc42c81143e43c6b9b68163ed2ff521ae0d7b5a27bf214665da9a6fde45cd07abfe3e112491cecdbe7e00adb0450c1f67fa311e7536d2125e17eb25e10a0c94216d13236f2a7b8fb4238685d20d241eff845f177cf959a8c9aa6f9a84bc6dfd5b45f165ae3afd370c348e3aa399977c5e5e419103f2e32e90f8ff491b3e6f4139a081aafe143b23f3a3bf6de21d46c0266a52bb5d528b0bc62d5c90dfb357a425ae1e329d659f2c07cd19f44de3643118b18ddd3c8c2073063848abe537ca6f14bc1e46917fb31943c492d85aed6fe4d4030a3cc2314dc60963c326fcf7daaaf9761dc405aa33a921e4404ee2e3367c1fa188ced6beb22b88c7fea2f95a82d1280e4a3bf2f37e90859a05becb9af3b813324ebc88b5fa57d92ddb3a5872536d030c753259045ae6bb8a1a1eb5e04f2a8f33b1e6488f9317dab3e3cd3ad1ab5719c6410aa2c8fa6e3f8d6814b45235c3125dae2b33a715768a92c3a5a4ee5d6019f0dddec3e8aa61f38ae80395e33f933e13260ae4995880ff72fa8778f7ec477101517cbddd04beb0a2f08631a8b21330eedd4754944c0ca4428d66f6cc62483eb184f05b3c8efd9dfad3f703159d0f1fded36099d056a406f59243e92c902ba7063b38cae19b1caacb8caedd889a3093c6a2a27390cfe7914e9bb83d1969a180d4471760a4c69649673d1caf85740c3328bf04c2a197c76a266f2f30c69a65d97507cf209011e48f6ff79be06dcdd9839edcff262ab0af7ca91e2d201e18f72a52cb1140b6c2c4c40d82835ac1bc28829633220f3bdc2bacad5d7969640c5c3850d7727e66111a1a442a231a9af3e2a3b842f51d6cb96a1d44d191f4dc2e5c1e80ac7e910de0fb25efa9592076f5155f248a1c985ce4507e63bf40d0580274ab9a380a38a5b286cb25f6237bafab9908e751be92d41b118d91dbf596c3bd64685c0c6d67204a3fc4a59b5ccbb86caaca95f2b63824e2ef48060cdeb4a89c360e3a6bfa0b9e0437cf8400cfcd48d8fc3fd46a8d76f4eb8947b87bb77cb6c4a851222d58796c723a311c228473579ddf7821388fd85e545f9e530e10f7ac4ebe4dd439ea8c4d5add13d9232ccf16a1165a43d1e26a66977fb36766c5c8508a869ee0e8982edcfa48b9c1a62f775396496aa68b9d1ee97cf78e1f3dd6f168320bf5c4ef0b731797fd00ae9a87281434f03a65261333da4e2201786fac588cb028656a079d52e34300072245f21bf81c3b6d52f41817134c9c564d59363d1ac316f88518c810415efab0fc0418717b3e4ca79e88a9d9b721202ae1ecbc7c9967a7644762dc652acc27cab330640e04d2fffba46f1f977deba31660a1ab2feec8a65c188ecfcd8f462b84b0bce5f3616ad2556d6af9faadb35a3aef2567299d48bbe5ec7c4c1b49a5c8cdb58d3bd03391550fee4192ed5e9e0179b926f251462a49e6c09105f402bdd5903623d35b526121ea161bbec6a14f3b87c7ed82544a654069494492eed8808d5a67ef03bc33a2679782ff126e63941acc21e2346f52825619794c6ac51013864346dd401dc6e58721a007dfec67a2f71a0afe78e3d4b8df66673d9169c25a9eb306dbfe4b25601241228322435df2ee96eaa46bb1104fa2b70ef8b3f21929cfbb6db4d8d5c91ecc4a2839e710a74cd6df48580a72c30dddf34e76a27076f06d6fb45f5597b0b222fb2697883ea20e1d94496993c057cb7d294c1c36736dab745084058525a4d27ddf7a1f3b2ef24a610f3177341ce34fc4dec2c901d56768c451291c3bc09991556055b58f3c1357373ca43de0459e3730e1d0f46c9cc5e5388e670bbf6a4fde46cfea7db7a725923ce752bd0c157ad6452afa178a986a0acec8af1b92652caf924c4d12289c23fb983a6533ee8f10b051ed1bfa998039ddd9b1cdd0f395d88ef284e8a8bf6e501aae1c85c89efb7d961362d036a3e14c8b15e066cc38c9aedb71ddc70e6afdb0a2f0616769e3f428122884e077695defc894b72c8a9572ddb45742f3c5e78f83ebe4233eb72888fd4acfcb14f58ebcbc81a63e1ebec70d2d226a5df435ac9e83ee89e4e92beff1cee4bee8b593fb13b58c09f4539a6bd3a401b8635f89b69001428fc6bf7cf9ae1c2ed5454b59734ac918f4dedd1b837cd3573d10cda0b7d4941c3d86fb39402c878feba03a5dd9a0618c77cc343f29e7b5c3d3aece7bad877dd1856c35943dd7cc2b84f16a1fc96464ead7b5ee73e382cac6544adbdc76a7b9ca2cb6bc0b20b99425ac4b4467c448024f15499bda9e1997a46dfc30074dde6d12ee444880b607bf7f2a66ae079760eee625139565fc5e5f7ebabac7b1de344c8b3eca5d71efe125ae32c3e02a6d5e5400cbab638c4465869be4fd9cd0b008a29b6ce43e7f489c6b6dd2f2e1dad4523bef1c04b28e02663f8bb8800bda77e48241985c33895e846917930382ffce9d6850b6e75ca7f545051d98e5dd8490fa","title":"394. 字符串解码","link":"https://leetcode-cn.com/problems/decode-string/","question_id":394,"issue_number":7},"5":{"day":5,"pres":["栈","队列"],"tags":["栈"],"whys":null,"difficulty":"- 简单","description":"```\n使用栈实现队列的下列操作:\n\npush(x) -- 将一个元素放入队列的尾部。\npop() -- 从队列首部移除元素。\npeek() -- 返回队列首部的元素。\nempty() -- 返回队列是否为空。\n示例:\n\nMyQueue queue = new MyQueue();\n\nqueue.push(1);\nqueue.push(2);\nqueue.peek(); // 返回 1\nqueue.pop(); // 返回 1\nqueue.empty(); // 返回 false\n说明:\n\n你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。\n你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。\n假设所有操作都是有效的、 (例如,一个空的队列不会调用 pop 或者 peek 操作)。\n```","content":"096221cf5b628be1e73e8bcfe626c7347784218a04fa31bd094e51256922010200f19c5d26e68d9092e660af7dffba08f46803c2903e14deb929b72dbea4fe2efd717a7794d6cdf604308dac848d517a3ae17392d9b0199b21bc68dbf4aaa28a1431db0862be8861435b443cea542d78f736adaecbac7434af8dd8da3da9927f8fda0055355d153140cd2896109331de26736ce8595f457a89a4312dadbc9d5e5e09702f0c4c61ebe6c422bfb01863484fc1e19e200d958d77df6cde35ae1474299f14bb60038374adf77b64ff5b751d8e7cb0571773a0e66759e8bc00532ab6d4f7cbb37a37a27472a3da39216b4c554d5f57afd1c12f3a0824ad0c311904abc45584b9a89646b3464f660cf35f586bc0d68f20fb0898a84d14508a244dc0339465f0e405bd9ea228b1335735994f6eea8b2d56e1f700ada615b8d819ec4410858f601886a194eb126b03c3b9857cf6a6ddabb9a49fd950a327e99b3720769de2c99427b8db1de3ded8b6ffc4b42859ba0e64b4af423b322542b54397a5b31278991a457d73dbfb4b53ed722fd56e8fd9730895c08ccf5703849b32a2d8bd85387dd19f85b220bc1305fa8b02184fb03a251d3865fc68eecff6ba379f8e68777486716f39831981896bbf98acada7e49c1ced7e1e5f2d1765b41c16effeae5997739eac9e5246848691fc600c39ef19202b75f32e39ae1e14de26f04401d951012d1f1721b4146989688f03301817d0e04b570100f6c36eb2844c0eede7c89f5bcb533b13664c40d104419dffc28da3f4c13b0a138e07848004277e1ff10e2c6a1d16d4fafca8b9440d7b58439b5a4936ac6558848c3020cacf4f7cadc062199fde3102b0db6644277c60a43031f9cd2241756d523f3d57a7e459e48dbae29fcf88d26a59b811407aba95ef4853f5c61187eaea358c32a26a8ac3d27fdce3b40ff11875c87e0b3dc7d0e582657d4b8e960f37c55ff1abf98f71c31ecabe538bc22e9d142333a62dffe90838f34be48c9d14215158d06976f9fa1165cb8c1084c274d60b4f036cf1d9cdd9ebbdd1001882adc24dc3b88cd0e8013352ecc966b8451638b0df2c8665b81bd9aa7082033d87cf91e939bc2d72cacbd3b63f54a9632c86791c4642a676997b8b24eb399c5a27e9e1a844103281a3f3d12b7247087b23232d0d33d937981e576bb5f18431d05a343a3324c4e0688942518548c30ea0d0e1a5f68e83cf1d9f2dee5cc4b57bd7c582f1096bf7850495678032ef0623f14da68129f42f0fa68f7ee0afbb5a21698dbfac896e5687313a0b75b9e7c0fcecccb3393ea6de7f25f63d71e0a36dc3ad842de894b85a186e7c39b74a760ef928ed5ca92be35f8e53471dd88f402b346249e1cd6048eca4573b11d1f50d3e5edd317d30de7ecdfdcdc6c44176f1a11c2c26db37d6f503a8c322f2581b9cfa638b1a2155044d1cd7fc6dcd893865e91aa84d6e1043e65e3c8a98758154a0fe2c2f34b66c6de46508eccf1550a0ca1c22713feba4bbf7cc94e26be4665a693cc38573e03f424bd1bb45d55956d687e546c93d0a2362ab2a71c619e5fb48c5fb1d15782466c5379c257d191ae0876bee246cd643716faf3b4f27ae8abcc0f2f2affc33ff8ce49c49cec0b9e019d0bccc166072835c897f8ecff58d601aa20e4c880f536b0e16392cd0dc05e3bed8a3f883e36f67c3a8fd7edad6dbe746483d78a2bd4b00b0ff799941516e02e5ac6eb3747eae4591f93ecf17186d1eb71da62a93f79a20419b7964b7a8d0c057d74c05fb29a848f3c63a7b98bde15bf437718873d8b586334ce6c54e05efcf7ce397a94a5ce341778fac1fa0a49df050472b3d4d331477148a13388e49a823523623f9cfdf6337499ca6c5ca9e2c5410ae899262a657ab27033995e0ac91c5236c943a204e67f618b548de3d810b78e09d40412543d5dd0fe53d7301c13199af23dcd9173c9378ce664a9f706f8f7590c5c77417a95520faee8b9df15ef414e22acc5c9ce1aed97f65121b18ddd97d12ca62d971e24dc8a3c13b6267afb06ae4567358f67a3e18ad160ae6e24bc2b77fe9a2e07f08fe260e1241bc48f6c7102ab233811fdc0f5d2783a6815c6f4ce3acf65a68383f0a6c2a30e969152ac4d268659d6227b0c88c4876436cfb700ad7d9c727cc988d7ac5d7594924d178eb41d9550fb65bb4549145a985756ae5dd05f47e4c827195caf8c19726a5158171c419cac45f4e27a52a1f2a116d74464f179c7fb791d57ff51b881df939df7927d6bbcfc0484a37958a0d3418887a6504e3b91fd5b2bb33e4b9fcb2e441802f838cdc6af1c571a0fe695b7cf289fb85fbc80a39e11cfc1657a0cd5b1fb8479a3214626c7658a11683f829b0d4e7d307bd54f6782a188821d638841c6b869c04af85a079196aab74e40f547526cc4fb4251782d08b74ba6bcee6fec73b7d78296db0e832426e6cd200b84f4ea6cff3e08d6aa92353e8cf559a8d0842f10a16d45a00cc405af9a30f922daf7901d3c690131dd0eeb036d331fe3b066f3ba1920a9b17f1c5314a03bf6af9276703b9d0bab2c3a341c1ab899a6fed57724199b6e2789abf9dbbe537335757ed233f4b829cd0df285dcf7459b689f1602efa1ec3960d1a113709c3561b0a11eae13b582ad73878689c0b3cdbdc44c57baaf1502dc4e8830bbdd505e27fcef3ebd6c4f0b5f003eef5c4c0601695790c60345358fa71782c1d3f84cdbc72687327218a44c485df33b0a20ee0b79d6163778d7864f5f6930e4968ec121bfdafa7146ce6ae903af48e58d9d19bd0d15e06325d5ffdba35d6201b2d5a5937772a5a6341dc58ceaa4e3af083b7a24e9734458befe98ad7d697415e3dd7857b0f6abc78e11979a14f6478e3ea2efd2006021610b32652f122c546d328e51ab23886a2e6d9b35e2a2c7777c9459f2ef2525300a6e1f18e2fe4720ade5e8e97990be203c7f3774e4e52eaf3abe4c94c07699a188ca1f3afc5a860744a410c2e8ee3b5d9ad6169d518980d2ab9b6ade41e44ff71556b5a7a31425720ad01952ecc75c91573d3d2b4533f6a0f390445b20a05c1ee3e7897ba14848ed665e131e5bd3a681ac700148510f1fd1b4457f202604851a2e8a41e9e62a40e65ea19977baf7b5e47c2dc08bd94b7d0fc8488a2a5c22d9cfb03c88bcd9dbe00c141bfbfd04e84a8cb6512ee250d99ea1dbfa42ed48e64305757b569ad2c32e81ba676285409e33662fe412c32f2fb417fad50a70421a1e7f081ca05bd7569584cfc55f41b4e85d39ffb2eb584684503551b7ca6fa5874d934620880da3cd34d186289611789fa8cb995a574c967d3dff5e9728c3237d1a3168ecf096a2a8bd39f66c18a231e4e5d0b2f21e442acc33fa3e2750349b22975dd5cbbae9d5771483b6e7fbeaa39bf9653b94f540f129e66f977ceddef99d00140efebf1ec1f344e0385c7e00789506e99bba88d46b0f65bd2904242d15829c5e92ac6368bf1fbcf1206b4e536d11beb2619cbece8ccb98d09e978a733e9f9a8d2a3f7e7eebdb4a6548fa7a5e2a5fcfdacceb74630a29e0404694e3f75f8d9639088bb99e72082047d9fe01aaf846190e10b2e8db22781961e0823385dd4aa8f0253b37d83eece592bcf7fe67d699499293a1e64041c1a726e214eec7c7066112a1e465c5331129d1b7df473b5c3f37c9096d2ba011bf73dbfc96faea6c0908e288badf76f1d7e26b192ee0d659e6dfc5431c0c09f7bb0c88b11d80daf2e77fc95e1082580e225a17777cf5d1304910ba09862c69bb58343f8279a3b95217c45874209ca0b3d0c3e28334733f54bf20963343e3b48fd37fa16ce9cdbe980332260fffef3d9093f1f29b30c8e1a52fc462d4fac2ad80bcaa3e9dbf49e95b166a6461815e0790fd39060118c8de3f9cfd880ad6e84684807a11e51e093c0b0ee91ebfc963b5045278c4138142c4e93d47e1cf0909fdf0cf603d23d4ac60ca47f54a55121de867c27adc0ddfc6fbf38b78a469e942008631f20eee9d504f36c1d0419cfe633c340ba3f21d624a88fe7ca7030f2293fe86c4ee8df9968e3de2e3a8555c484c6b74cebd2d78277c3a621456a70bd32ea2dc72687a6a5632c2f26db803439ec228a5a171351215061708ab48688e686e298d17968e56c41cac1148d40773584d72792a146788f5cdde121f94709decdfea392aaf24a6f7220c23d39fa4fd71efe6c69c92d5beff85f513c8ba49f9bec9ec6b26023152574956e534398512c11110066e6aed4d4aa5da42ed4920ff07c5a937e61aa8094fd5dc830aea41c166d4e0cb02644b7eaf6e6a8519c9e5818ee221960eeadc771936fe76fc85cbf02f7a97c52e8006d81ceb201a37ddae27518552b422180e20fc2b6a39eafb2cdcee710332bca1d942abc96e672d92a5ea3b1e003719f643c02a34f066d64462e320a665feae4a0aac50560fe9259a94074c6945a848f6b75fae7a6f3d1d8b35072bfc0ed76167d6fd6f1b41773222d8955afe18e41f80a28fb0bf1a6657e27788c7ccda3f776a5a312a0f699aefba149bb34873fc01e9c41933f81aaccbbe8f5bc6f7701f202651e4ca16a5d07ccaaceb5499502c86d2c2b4d86da775f31492ebcc8bf3cdff8f632dd068abfbb1d6b386a38f3ff70099b585c3a9b60ab802f40e2d5a5ef6fcaa60ed4ac4ed1a03b22d3d0182b8f2df2f962aa4bf5c5c3bd90655b692697ae37c6ed7632819506af30ca4d47456e3ebf81e8010b89b4db0f20f417c4aaeb97328b8e56d12f871dea619eb570d81e74bbf273a39b2374a176cf0919ff66b8cf1d0be2a0f473ecedf406d49f1f2e071319b72a65d07bdb0aa9668fa559dca39397d533e0567b407de09ef31b2bf8ced92e439469856462656b0a22d0a1556e44e79f5d75681437e9ce02e6d3a960fc82a7b98e873fb1b529850158dbe473591b797613263a06c63235535eb4f81a72a00a1691638c9ae481876413a8ce45d28b0f6d43a78f8a27315382166b8c870869943a447e1c662c475d077ed5997cf3dd635f9b0a45cbeec28a98ad22dcd15c2a163083604b46b43faeabc7a1678b46fd4c4a857dbae1769db6971587eddb0d331c60c43b03695c2e640a53eb2b20f075d60b381642a4ee94c81f5e6168769a48770bdd9915d09f30dcee660bb221270f09661261567970cca9935aba1994701f9678c6963fce9cd995f1ba5b5db68788965e047799a78b9a72269a8f384faf0c101a84c04dbf7ae65a3290ce895da6036b20cf07eccb61ea40b0d43937a6a0c0a5f79ed7533443a648ceffcf96163c03a2a04534de32eabb94f4c38fc2fd92982e0c2c77559c228b9d1a92371cc2a9025b44e317ddc7aaaf8d0ec3dfc86d3d549e00a3277cea7506eaeaf563d2a9a26e9a256b87e281208cd5581cd5824ca6d5641d4fffadcf252d3b3a6d1889b95e1a9f1e45a64c2ef5bc9029ed24c555ee2250ceb2845563bcc505f4a6f76ee172195e34bd70bcc5ddae0de8430867bc224658ef63306b76e6fc2cdc39085df1ffb7d586f2a1305f292350bc42c7fc25217c10e47d2b066ecaf565953e8395650c1adaf509ab84e016ff7a900e30790f7e068fd530e2b289e8d80c600908a3b55f68a228109ad470eab4b42e688d5f7dc6a6bff3c63a9a8032dcdc223db5d5418457be7c9f51d3c08f2e5e0d38406542f725eceb6c6feb1b0567f2112e64788a58b8ded1b9e5ee79c7f44dc661ad9b5d184cf581a2ce2d180a71089506b48a9b01574907651701d79f1f3fcc905ce7d1ab510a5bf7780a7fa2f972dfa6960b5042a0299a5bd915f0e0132795a3fab54c6887c68abc831e15cf9ff6df728a733d13f7ef0bccdbf39845b3596849baca051836644b9bda809d35bb0a9daa25ed167c1477c2b5c6d663035d6f087f6f0892b834dd4427e24212d6257f10e20d5b385cfa5b5088bbffcf20044450417c0424546a9e8b7db1ebf7601e5cd7ba628151024c699dd5f8a4fa49c109ddc6cf45f047377d9012310328eb09c94f9e5a5dc6486e9547cac40f7f3418ddda4e9470ca6c27f53d2fa2069305c4831094001842706b72287d31bd1cf270ac08c23a30797cde6c7dca5d448d07d79fe9697f4cfdf1c7a1cfe257fb21e78fc9449a73d769ec3f67607fe2a9d9dbda38e17f869020974245b2af77da4fc4a2b76b274170f40b7b12f17038a443e3963c94164da67ea2974f5829a3998cf4ba2738f0f63cac26e39a962467f78ef63b4c29a39bdbe276eabffa4951c37b1d081c10ed6937aca257ba44ad1cdb00c23f8a3b5ea8041cc1bce992d6c4e05fbf8d0e97d3638342f81259cc9f7acb037c688143ff4ee15c0514922858ff282f547303054834bf263979c3c0ea8fc762894a51bf06ff372a2f35ab16625c368411c1b54d583635785086d51f202f8c285170d6b675e670de72557148fb440e1e39e9ce082f0c7dbffbfc9965fca37861ca4ac61eeeff7a7a14fe469f7e9754025dd8ab5e19ea845ccf9f42f016766e03638ef11b5846e28aca72c231634f2cf505d3d1846b1f37589828f527b562d0d6bfc42ff9e8cb2e6ae206b45aa21d3285a7ed2d6e0565f5ef011580bcc4f52cff92aa834bc1bb9b74c171e2fa59cd8080b893e6d45b5ab8034073b7e1b66f058eddec20ba24656310c4cc7d945385c76165ac47a2d2ba9849a1100f7f81dbb7b054d70e78b26c7f30f5d7858aacad2244364bd1898f7c6517a135e2d509d6ee9c4794975ead2bdf22e31f25e762c60bdaaa3da107a6c2688131f348eac5aefebcef47853059c0b8e06c5f9303edf151a5c85ee31fdce3580503b97db92d11c2c9ae1fc9ca2ac3ae33cb86d5d0b2d076d95f863099220bce000ef2e62d300df3998b98fba426e7c1f9eba309d98867421f6fbbbc308ae6f605b684cfe38e017349b2c5b3ed77e729dd2a1e3c523e1d6a333e595740e6e8de4817b5ed1864ce28b6a86a86883ddab3e3cd3a95ee1144a80759aa9bae2f6dd9334bca07678d1212fb7f40f35435c1ced6b0a4e40116518e8fdedee8a50e89cfa957eaf025843c0e6517a6d110e6ba33b4873dbabc132809587cb1bf4df2f5a2a3d270fab45678bbc34c1ad55176ea29ce2df885312d73e1d0a953358efb9bfad5e45735b21d08d48f7db7bb52a71cf9d70fa04fd323ae1c4c12e0e19b1caa9bdee78bc9ce759390edeb379086fbc6518bad616f2ab5ff9a13176bb9c6c532632114b194092e3261f17796e0d48c646f3c4a7d96ce3c943047897be96ab7db2ea5cf9d6dd0c48399e8ad6873e4ee3fe2107d754d50ff631cb84501f589ca9442d18b957333c43406f58ea8f26e83db875d7969645176657afd323e263b3079345a237986e3e6ebc664b50953a96e1f6e8fddf1c92e54208d9c798058aefb6fccd30b6920b4411a3ea01c985ce4032a22fc0bcc114c23b5c834140eb0a7bac366a3227afb1c56ec6087197f4a93d5173f8deea0d4e97fe9d2eff0938487a7324b06e00c0ce46e503b6063c2ad0e4287bde19095b98d30046051e40f98773fc68d0094e748d8fc3fd46a8d76f4eb8947f72eb14ab2c0aa4e532e59782467732d2a26807148ecd86323308dd111010cca010e1af7e500ea45867cf3877f5ae313dd7832d44f831f4169d1e26a66977fb3673befc8508a86c3cac29a3ecef340aea4cf60221dc2242ed7d9df61ac74fe8e4460fcdb68320bf592a04237528be115e6c1b5351475fa67187d242eda495f066245ac11c2c37c24294c9302b610480f7a4ce931f81c69285b8b6059131fc85e51593a6d07d64eb4c4179d43150cd0b0fc0418383d3e44e8cbdcda8df6626b61e8f2a932ea6fae6d4739f6652acc27cab330640e04d2ffb2ea2f15926ca2fe7219f5f92fe5d5a60f6380b18cdd1256aeb0bce5ba2f3ed20d6d77f9b5f8e7296efd326d759d07e0f0e5764c1b49a5c8cdb58d3b9f66c52609ea568cb140d10334e078990539791db4ea9105a647e980c27871ce142d336fea5200c7e4b14611c7cee3fc7e102ac0a6ec8b2f17371a0b9fcf49c50283e12bbda0bd47fca7569238fe29f58fc46badd4eac3a5028017e94b28d444d25a494284368a09732899a3d69b7f9a64577f5fc7a28d3ff352fe9ee0061c44efec87c8d0ed57afe3b08db7e5796cb233a98f2863ab37157adcb34974ac24f6bac170c50ca8ea07d5479742139c506d725cbf473bc9f565f0d7358f8427b0a3d9e3fbab32d61f7eea69d1d607bd92b1e34bcc7624034a6100fe51afde2fd301f7484cce584b1f362e898fb192abe098f23b9d425d61069aa59ecd4ab8df89f25c5336b1efa544d76f6a387b6e21c278cf66eefa352f7d93724532ed4e88e5f1604edd0eb4dd2598e06ad430e61ff8d7684ab21f36a572a1dce8dc0a9497471a22689ff612404042a348aab7743b01a7fc2ad5cd3ade3c19820cc5d996d2d2e5b21e2e4349592976b6bed2e03cc8a0b2ad1d9478877854f7b5da548e2cc92c5b8aef4ea1144bf8ac7b7c01759388a32920a8ccdeddee6b226bfcc2c48977d3c962dbbf5c51590f0a06733c74f2fcf94f88fd4af50d52e2e1c280c8fe047acddb4b69122806da63de9ce7ac8e9b8b25b78cdeabe1ddd6f2fb7af3ac4487433fa37433ed120d2b81dfdc2432277e773fe2e17b3fb41b64183b55a868c0bcb02ec303e7f894e724317a2416d99588c3254d2f838ee0bc3b5fcaa97da1fc38c24550feb9cc524e13f6697059b8c721fd44fc5f43ae5452d6c353c9b55e1536178e6779064aec36bed6c1a58cfa2eb1810837839c22af8df7cd67dfdeddec945e91875af18c0b4eba0449ce6f26dc4f4d93b62cb77e3f75ad1ead63d8fa2b2da767e9755e40b3b6d4b3df037b8c06cb5b7bf60d812d31e9c82950495134d7a754a44772bf98ffd69cfe830bb6896fd618724280684ffc340d3757bbdd65d6ed74ef30194da8f4368d1f9737429675cfc1438236e38021e11d2a2157a69d2e48a9775ef9dbe50e6b115f5d496a626a3e483b3d614dcd7b540bdd414eaa7b5d7bb6eb5bac3b81e8a469acfcde510e38c6b86a05948de50985d034f9c238c715c0e96db00e2b0c49e515b93a2bd9d1982e9a57a5d5c456fb643aca222f0e8ab7bd44114f5ddc7775e52485da213dee05ee5afe027bb884f0bc99adfab3cb6433879f101b951bbe6139a3a07c4505185a4e39f514fe1a0269dbc07ed72935539b3b299a8aefc288f7123a96503e4d91b2f56af499fab2d5f0ff4fd0ba7a0b0d2905064c6c5c02024ba9dbc53d9544a778f3fce7030392aee9391af784cad17c519eeb7322b8355cb221c5063c8b1a14a6ec1478cb5fc95029aeb9c6981758f4d3bbbed2f441df6ff5c07ddc584f1c9c48c794d90df6f73ab857898801c06248423d744510184fef173ce579ce2b4deb06c0905e2d81239bab08f3610ed43b0ee8e582aeee52768110d3c0fb4dfe91c4848dd7b2242926089b2c7ea60a9df93f60540143b006f555f9b3cfe2f84f59d5a057b9d443a3eeb77a0cea17a48b7b00e0f596d6e1eaf8f5b00ee4aca37798928ce908d6e1a4c3a7d9cbf76b571d2945a110702ce872fb2af6e67930da70c557263792964da30a2e7497bffec102069526a81cde0d18d5aec3bd757d888ee6a3430cbfcf2e8b798433ba13c0996f6ce73ce459ff6926564bf8bec76c473cb4a936df92cf9ebc3d3fd61079c71507411c2cf099e05850e213653b116d2cd57b19eb5a58879c51c71fb7399f0872f792e8cdb2d223e083087c7dc4404a33ae7ca47c9b51365ff28012a312a81c181d0fcc1d76413867c44ae7f646b0fac81c6725ad9cb177eaeb3a2c255a773f178bda53b850134e89e1fa3b13e0737d00a0fea62364fc5f7cf5aa6241b16d11de836ac3d3337c45ee00d8c67cbc932a1c7920c6907dd0aad1bb32f973002d7b7550cb5f0e2e3d7b7cb04e3877370820d56a0957c6fbaaf01fa7817620bbd0019ea8e959771c759bbc357fed3f2b30141dca993da87064c79938720262a2312477c033ae09d56ed2b8e1b6e278f4918bb4383c525cd808b52795e150602e48cc0429dc72c5889e52d9a6b4ee945381f6107acbcb0d236ea63c2ea6cf450bc824927ee6a26ab9ef7967cf51a1f4babba036cbe66a34eca251ea84727920c46cab47cdfec0bacbb3211dd55e5a70c781a01eb904c99839967da91c109ffad6cd234458f46132b7cb6354d9fd1f0e9eb2e2d96928aa3de7a1ca2a42f4699d8a24cdd8b166c70f9ea46a67b725b0fa4e5762eac17f952243ba9075ac54128ca5166c8d92fb99b0c2133683c905ea331f48d47218897e76e36235d1760712200f3ceaccf44150bb6ef727d874ce8666a1c19bb196aa710545f6f207b9b1fe49405282713a51d4d677a68dcf92ed13093fb85cacac1d1b76f19fc94f29ebd04c4e4a71e7da35f75ed21057b76e8f6d48bfe4917056471a0912435bdb11a100754265d6ca42c6d023dac59092d6a4a135bc0891ed34797e485cc76ecc3ed2092c7f779ca65a859f562fe72397ebb9f9313095c39b013fbd2875921b37fbb8ff9df71c24fe57ae9bd08c4a608c77e929a552ebbb75ffab0bccc138eabfe9ca2a8f45b658ddf6cba6195aefa14ed07e257a75ba52f3d10140154d2885f99da06419630521d03c55f9767be153e23d1505e9833a04db5831865c6035deb3261b591a568f9567a9fecdc5e4c5afd0a11624a6d09a6e83e8e8371d4246e13a7297ea8e6c3e22dcdae93b2167edfb49ff5776ebb5fff68eb58d382e47334a5788fc7cb73e49cc884f773be72420aac1bb37d95ffe09bb288f6029addf403509ac9fcaf431c8f78450a434bf2d592e94cbbdc735a0f8fcc125d3","title":"232. 用栈实现队列","link":"https://leetcode-cn.com/problems/implement-queue-using-stacks/","question_id":232,"issue_number":8},"6":{"day":6,"pres":["栈","单调栈","队列"],"tags":["栈","哈希表"],"whys":null,"difficulty":"- 困难","description":"```\n这个问题和“最多能完成排序的块”相似,但给定数组中的元素可以重复,输入数组最大长度为2000,其中的元素最大为10**8。\n\narr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。\n\n我们最多能将数组分成多少块?\n\n示例 1:\n\n输入: arr = [5,4,3,2,1]\n输出: 1\n解释:\n将数组分成2块或者更多块,都无法得到所需的结果。\n例如,分成 [5, 4], [3, 2, 1] 的结果是 [4, 5, 1, 2, 3],这不是有序的数组。\n示例 2:\n\n输入: arr = [2,1,3,4,4]\n输出: 4\n解释:\n我们可以把它分成两块,例如 [2, 1], [3, 4, 4]。\n然而,分成 [2, 1], [3], [4], [4] 可以得到最多的块数。\n注意:\n\narr的长度在[1, 2000]之间。\narr[i]的大小在[0, 10**8]之间。\n\n```","content":"096221cf5b628be1e73e8bcfe626c73472812b8a04fb39950a4a4328440103223cfe8c5225e0885c2263ef418d6a54a5fb0e268eff401fc5a93ce974ffa5f124f52a696a9fd18cf0076dc1aa84d24d6d38e6718399b2439335a168cdefb6a2864a6fdb062cb89a252c7c1470b8c5cdb933df4d665120b0833e62574efa09f32786b545596ce3a3e7d5622abf049835d22a4b452d9ea1d1b208ab060542303b9b122c0a4916e98f70450073b7cd6c700311c286d7375a0503fe1d94334abd442f31d34b840d69820ef7c62c19cf22301dff068f374f53ce8f792d8ead87bdb4091ba2f32197dc79e195044aafb14c6b15c88fdba3d6d82f3a0828bf213f0f3ca8c26783bc919942ac46636b03ea665875f2d98418fe06884787f4c738898870895601d68d779de5fb1cc9667d47cd4a21b6b57311e2b57098c249889c42c12180710f80f0493c1423b0e40fc7888960e5aae1b9b39084d848a62bef96362f429fdcce950f98dd39c63d28646a0a6be4c8201179a47712135b5b59ea3fb0eddc1f1ae430230a619fa56d34a16c6bb1543f0fe7985b46e475df03c38311a55b504ffcb4241e487de50e9c831c41c7d9b304dfeb81dac030f76920024cb55e4ba19d85138cf3ee3f926d6dae3d564d6c6b1d09fc54a88cc8c2d69639d6ea253661da69eb502c3a98e1228ba7da631f372aaf8abeb83cb9dc1c8be639ec59e2ce4af2c47c166674a962f6218644edb0f0e51b0da0c2fdd23655ce7a0aefc88bcab9c04fb6f3df96b3b4c04b620baf94b2bc0718457a5f06dc6eb3cd68261646f3565d7c6c5eec819da0fb3913191f70ee2f5a4ef46bf44f2d9921fed74f7693c074249feb1401bcdca1aed6ea861ba2cb695ef6b5bed69abfc8b06b14b49ea73a186146130ae3b514d4978928737e8d06e1aca45e7e71d404ca50f522b5a456a2bb98788c2a07b74a728458d0dbbc62434246d283ad29dc99f1d7d513f28c0d45a5114dbe55e796fb2b9e246b82f07a9b08f08c614857044ac1a47390527b82ee15112c2ac36914293b82ca69500a4843a86e38deb75aa0107e5d19f1b026e4a427ad2c6c04f08a38f0038d6aa1b61fd70b7ddff0d58702c5404aa3b3ebfb4370c63703ec020f0f2a82fd9b5daf27ed3c96612debf3aa44382a476b4b19b6daffa9e89d9faece81771d4cc2f06481cb8503c35a362f332fe6248e2187f20d827b906a6c5a6f433539ba25f045d0e5cfb17ed5e3a6f23360fd830796458430c21c23e373a29b2f175034f9e3578f37048497f98db1bc8b7f5b9d613409277f52764f5e65a26568ef8173f738ba7de3ac67f89e5d8d5e94309ddb8df190ae60791cd629ec5646ae619bd2582172dfffe4a2f2c9efe1e5774bf9beb8acab1eaf2152ea5cf7f8921bac723650597ef2f3423db60618da37040868226c08fc443291f2786eac8e93ac2d7ac284fa39b11eac7adf63f69bcbb84b98d63c22cd09e9342beb503ffc0649a614299db91004fbca7a5a7040a2a0d89ce1ea9c61b10d4d048aa9d262995e7dc03d298b4f8405a59f8c3bd05957112fd20a9ad745aab9581059ccd1b1dafc3aa39b1879f5e33d13b8169d30e0200b6ee15f6c883b796491274c03ed73a0d5b4e144f4f6b6ef02d6a0e6faca9a0a9d3592376833f77740fa28053e8996cb6764115aafea980e077fa37b4d15fdaf5d4765dfda541e1e39003d78b9ac482093f24499a2c3d2c44dde00a41727b806e9f779870b9681a01a1fbb3e7666362d7397756dbcaac8c8571df067870ecd24dc66102bcffc6a9e753441859c511941a8e1e5e17905dbdd9347f3f05b25874d100a091d93909df6434622304f0a297536a61f2eaf4b85185c0736fbdddb672d4f7026a0aeae6e140feefcad08e057df7c2e5ef9ddecf0cc9bfb7ae7afd51b8a19d5d02fe9388ab17e26540d2032d509be60e6f0951aedec19a51400e9f042845cbb9d43c8f619fb71523493df5cb9b553325c1257c5639f6ec2049a2a71415cf1daf496952c25e5cf51ab63b12398342c0d81f1a85d78c87a8ba1af7aecfe8e5f8fe757830bddf409dbe5ab4e5e862c647b4ded29e9835427e54f94739d143f71b524148f8a84a48c871652589fc6e6f3d72f1b3f4997f91210a50b87e99ab9083e4230865a548de29b59e82c5bc0a7bb53166ce627b16190331626891433eb42dbc05b0dbbf06995720ad661ffb4c183c00929d22ee5c710d5c5427327a2301812376e7e6546358c7cb194d962e216aa0ef925fbbe9889e3fba6267772c19a687715cd194048655b95105aef21eeb5c16793522c40934565c02561eb694b8e5e5cf86578294834aeb215ea866f4cd4bf0359a5438322003b2a7659b10e8ead6bf293fd8c09ff3499fccb8006e91c31ed79f96c5e9f743d12e5703fbc109a3ee8a141e127e72857daedd52aa80aaacca09d2fe378f5d4e5b02f10305e9866a9092ca49095effd35b4590ff6af1687e26c7d7de6b05b9f9cbd154f4fa80b9439ecf2cc3057004467e0b3e409aa70c354794faa75086ae7019f982c33bfd237c6452828df99a03ccbb259c385bd9463ff5a7d69998efa71b08a9cb5dcf0913e03c6b3374aac4c4a73e138e0e679790f9b33078065eee46923555338951317456cd1b4536b469e11393ab44566c28924d31fc0ce1774c287f00ae19c1abe25f399aac6a080bfb06bf0a399cb29a835e3c09cb8a3db33e89ca5e2cbfc0de8620c16217ff76d8d1815a4546f9878d1e176e9ff5d97a1b6faf072510ea93e5a858afe56488c1a42b03f52cf7e8de4e5751f46afc13454d16fc6941d1d57b6bdea9287c923a2c4107892806f163747d851c28f440d7c3532561aa909b3717eefd3ef7431dc748854d8de1982c88bfd12370e101eb01255f225c14ef5202dfb4cac3ee891f8cd2a1f7c2a628b30a787992ac77aae8dac9375bc4e629049e0c39860b925ab6c8fda9c0ab9c6110959e9b49a13966d6565494f60f48083b2f8a2687e240366ab8e118e71c5a6175ed789dff16c7e7d7359403a49532ca106a62ff16cc6166bd1d094533f7cc99bbf44af2405dcc1fab0462dc40e8cfb55e232cb7a95034ee54870b344acca5f0671bb427a0205ab8ed436c23aa76c2ae172e47de3237dc52c45f7040475421d441c230e0bd32077c92e0d736530ea6acf6a460fa16262188a935f80e3c6ee43d09045a6b51e546dfd77f6cf6d18856a861e737c7f970b26bd5b5b79dcb23074ee3bba707cba97a991879f59e8b5958a8d43a5645dd6b88e9ebe3b846c71016c0d709af4597ce534622981cb10d34f2b6da74019b3f28ca08e62b707fb077333876cf5551a7c36c75007495347eacecd3bc1f7742926051b4c77c014ccfa5ffcf83e67731cc728d138fdb8e50872304a5010da8051de901de75a024408f900f2ee20477d5689081482c9ba9b136bca9b4d5d8a749dfcfb525f252511cde839a3b31725f33945d48e5bc044d3ecb1a21a4ef1c384d30ee32f05cf206f757e16a4ea6da530f4d84458c490f683d3bbd10b95f1e3edd296daf9ab8e215e8bcc5e069d4f0d6efae86a92878d94ee1938b6910d08e33904c15a37e1ae7146ab6571dbd4d4f286112f0ec8c65ea6081127cca905f537bfea795ba1d69cf3def28aadfbb3802bf581da85c4fbc6b7a2f6e17e92a61ef3432838bd7517091b9fcb16b72a10e1523b5f426ba031696aa88af4cf5a5b35fcae7b9b7d99e3401876b346531bd11bdd15b79a4de382205ddcf69a2e818b5c9dde8a1f75ffb803afbedfcb748e7fafcb06cd80d749aa875057620b78601e3074e72c910bebdb9c9644eb11fd02c29fe9c480213f69dbcb5d3281fbf7fa23dc6c91ee50ebd6bd2b50d4603277566d72327d54e36c948cf202e8951f1a94fa511d6d7e142b0c40f816b1bac242fde60d59516d43495b1604cfb7def26fc7b69de3fb583ae7a362605949b2138a11cfc825e58e4855a55132bcd22823b69381fd70e425949744d38969456c364ab9d49855d70c201a619a6cfa2e8675d4aa1aef384e3d49cbf060e1d32edffc6b1078ee0739a6ce219a073e0052da2f49060f913a60e68adf916cb53ea251d25b2815b4e1acac4e3c8ad43bdf3493fb6c3eeabbb3f9537f1479070777445993cc3fe2b0591ce21fb591bf1e79e10e40465282155e44813ebdf352045fec86acd312eaa9c609f7f47c86139059def779829e5f56cca3d1d8eb8487fe150b7c6879415d20d0770602ca5143484496b3483f0b1b3cfb7bbe2f72921092d433882ebbdacf29eb39ed0b3ab4c9bed2e848a6e4417d1122239f630989947bfbe9ef762ac77ec6e61e9f44b652c56b20b3956ec5c85e4c2a84a23992b73b16537e0a5298e60281f9bd89e8df94862b96cac774a1946bba8cd43b9e6801ccfe72eddd5ef197c41682e8f2e5d2cae99a86bdeae3a7b1c24e6bd48778af7a2dc4e41fb1c6ffc1117a7c01432c60dfe3724302be86adcf135631a5f4a4b930fc41157ff822dbbb06ab645ba5eef3a910842e6b33ad3a6be7655b1f2d0656ce77d00dde4fd20ec40bb52380b4e0bce1bc730c4ff340276d0332928994374d43038ad00ddd6b64ecea3f02dfe8f6e68f73005bb1175878e82c975749f00327b88cefa770e49643d9e92ac94a3121a1ae172c1022a05a4ba74357a6464fcd51a9961561c1fa183fff1ed832210fd9f93c12eee616608b569c763182c14e22e70c8acfb00c5d24002c87f07d332ccbe814f3457105af62df9d339f05ad5dfe6987bf7ecc5c2dd9b66fca936165a776877202fb7abf881b0b99bbf77ae2a0f0409ebd16271c395df2314fc021a929a173ebc47af1b8a897c967c65d37562286f2bf5b2afac5847c26da43c6282336380a0cc6854e7f6ee3856a5f2b5b3fe0cd41cde5af60e6d89c83c0952fb1a764d6680cd3ad3d0d125174110c3a06c632351078afff1a44a34642cb65c38fe79196301ea6d457dc9c1e7957b1978b313d109e5b7087dd2b43943a447e1c642e4536492dd5847ce3a40c13dd040c859d96cb9da970c1902b577e30ca2e4b1cfd3ce3a6d3fd24de41c14a5f8372b2bd24b4c2b40fada99e4b33552ed674563d547d620940ac6575b10e97766f5516e8babe9b5a1227663fd43b234a9ed24cb5ca7e88912470f05c744158200d04032d0398e8d011b458c4205a917ace8635d79483a3fec91201f58fc9935f0000d2b4a1f13c75dec1634fee7369528c9308f33cea5a38cf9a9541bc0a2a63822da8c46fef70b0de33f2220d061a575967d5f1eb008e703f90cf74164bee23bfe759d17e26100d4a3234704d1ea3d1d5f9f376ad28444f942d0c82d77d1a4426a571c5ebe2f24097a08a6dfabd7f8a6a9dfd3aa5941c3f77da073c768612dcc11a712dce156adae11c8218868d02470e7c776ae09ba5fca9d21b03efdd25ba8311dae5402a7fad40e278f72bca934765481034d39923cfb4bb266ba3f0d5c52bf2760790c04462dbd4f346fcd5c304ec85a5e6392faa7cda6c14f16a7b1b1a177ba6dbd0adac4a871836aff0839a2decc6b2e60e6fc351a40553d7861a99ba5ce599e3447ea968cbc6aa86bc8f0510cb5845556d2b994a67c73f199ad322ee9d1e44b1393146bafe4cbefd754d341a14bf415128f2b32a53bcd18e18fb7bd909954b4ddc05128fae95f6a314b6360ceed4358ecfa47ff5841d17c51db653037274038c4b40b941bf2454e1a24cdf82a1cd2ddef8899457dbd0a00dcaa5c6b08f86cd0e04c2d04136bd6c1a2f9cb8dc14eeaab7601df0477217d6914ab02383538450affedcf2773f40338ad00802172346a89f2107561bea00731919f6a10bc1ccf318aa79dfb2d93a1bf55532784d9535323135e845cffc62ab433d4625c2727c3b25475a661a7ff9e04d3b951dd2d333d2ce33a8ddb52a92e2fcc5459fcb7e3a282ce8f5858587b3999bc9840621ba0b4f33aafbcc1a62e9199a81b5bf5706153525ab48ea3a7855c64ecdbf57ba90dcf4ec35c851847f97a10cc0b319827b52c98aed9e2654a00cda02f39c31a78d66a116c1583bd538c4928a8939f9d5e6af4cdd639e4c9361e6787f33da776ce0594401e67bdae7767e5ba7a485a10858f33dac51457de755ef7ba173cfe7e0a66a736e4e0cc160cb6b19e055ca84516aa605cd7c633e9195d7af1789effb6784e938a20c188825dff422b918338afdba6a7f47674decb36013a841ec0f3227e0fc7b4a2bddd6d13b777452b3422f3df3f5c97187c3d8802292378eaa5daf0b8d9307ec2db077be955ac1d02c300c1b381c0bd943559c4d7ae74fa268e1fb8bec089d4529e8248b1cfa6f9ba7e9fd5300bafcc89be1f3d2276ba1653f62fec0ab0b36dd6bd4c878b337b4c6fbb42ce9062270c057936fd694a4e1aa2eed5edbb6cd2e8897c459208c05f30b8b254545c25e0584e04dad4922675795bbbcd935a5a36a37b40f93008fbc2b3b09e811ec508953174df3a01566af9835818f42f15369315309dd8e55131596c5b93d902a735f57f201dcdc88765e2b4fc632be75e72389b2fa957affbbf72e6aa75cf14bf35977dbceb964214b6bd1814453c1e9d8f42afa98bd8b54c0a6d65e9124b1b25184ced4f684a1ab5a35ea4c3f30f9b5b6724cd084b861f96f6b334597c53b9f5a83ed714f8647fff8909849a11019659197bfff54dc4065fc3c6a29add6c483d4a12217791985cccb3d6245fb73be9b5082afdf0c9ade0dc8668f76ba5e6aee21d27494fe46e07aa6df75813ce252a3c5f3ff96e10ade640c83f6b46c528e03fcac78a58c17a559dc27c3f946e039eba6be355a52dc9d9b69473ccfca9993a6f3bf249620c523e708ce69afca3a13457c44b099c2d6afa476a284b2aaec09c1ed320c4b14fac13097b2b015a4cbd4f8b32a684fab8485fd5cfe79826e16245b3d46047a781f57847d46de58177042e9ec74d7e3ed62400fbb94fcadb260d0bc5e66c1490daa5e04afa941c1249e5235c3125dae2b33a71576c98fd3bbb5d448624aaf92decfc2f824a3cfa957eaa070c670476f51e4dd10ffb12681c505f7f15a71104b7ca4da038dafe7f19d0fb9a8472ce38c020b9c1c05fa21cb20f608f9e63ea08435f48448552dfa8ab1ccda4a1204d1fe6ea18c50880bee8b067ec27ce736bc3b38cae19b1caacb8caedd889a79d5c6e1ed26de9bce9663dee474663af4d5d45c5914e383977d4b2a13a9d1023b3339bf07c2e5de812c26abb49ec68a655996f64f88736abaca2e6a5331239f8afcc3e2aa737ff3e128a9db87a0da80570052cb1140b6c2c4c40d81839c3967bb7a528eccd5f2639e86bc777969640c5c3850d7727e6611535c44646c54b6fde6a3a331b60747ea235244dc8bb0db33074ddff02cd40de8fbfb7a2f176f388a4f1a76c563db12b050b9ee16844af60267ab00fcd2ba607cf9cc23e52b2f6aca8a648044c5eef85458be15f1a1e990e936a7c0a0f782d8dbf5276147ae5f26ce2e107b1d01e1a01d038fdfe79aa3f7e6590f2e54e31e9a6f1d9fd14283840bd8bf739539de7687a4c512ec32aa77e6dac32f5d7e0c2b6c3f6f21153b82324aacd82c3e79dcbb427e4281527a5584aa52be00c274f3875875df50d72430921fd03c5a43d1e26a66977fde2636d9a11edec3d9a5bac66be5f15da8f9a0323c1d810622e8d89a29e932b2d91f5597a2205f4aa5cce6105952dbb446aec9fc7b093bf66e59685d2ec7494f1d4845ac588cb028656a4ed306e30d4f497800a054f80169381d8b6059131fc8171f0d3a7406d23dc0c409ef13504f84b0e104592329300febd1c6ecd1be3a0a6fadbff966b367a70515309d3c79c27485e1646c4b5c82bab8f03441ed12aaf76933f5f92fe593e95d63d5d2c289121faeadbcf5e86123d2496d2baba8a3ff1f74fb256e60c943bbb1e56d3d3149a5c8cdb58d3bd03391555de25b93bf489e4e3ca831e17e7004069eea9105f402bdd5903671960f4e7d3bea0b5df0cef41e4182c4f9d3373d74afc7e4822f4c1d1a0b9fcf49c502c0e738f3fcfc42fd800a8b77b564ff97da6bfa9ba69eca0bce52af0a7d9810da024542943fc34c6176c5ecf49264b064577f5fc7a28d3fae31b89ee8455311a1b8dbcac1ec0db9eaffc5fe963d24f1238ddb6733a33e0e50dcb34974f10edcbac13e8a00bde0199a0fd7096dc55864720795473bc9f565f08a1fddc173e5f197e3b2e541825e74e7679cd818bc85ede40c8f242c1416356eb710fd9c21cd66a71c15c6515035362e898fecb8f6fbb2963493583219439b6b014a8c057d4c68da969e17291bf4804f6a12766ee775ee06d17a3fb182f86185cefc65d1410be57a0d9908e5e763a2e7319e27c609d98ce1974b96c73bef3551f8bb0a5d0fcc13ffc237328acd85e7008f3e37b0a3c22749b2591ec355d39701d10b17407414742ed88be384c2fe9515231a669d0d000065b80abc1fd87ef7fb539655aa3bc17a8cf4a3288e824f38bef8acb32e2a66ee8c675064c1ad24662ee2adcce73789c629d7b44c01c29de18682a2e96371e43c8829db6f56be62490618453ba1d90a4fcbad8aa2c06fbd5e4e112c586e42b533616a232547703663da3734ce4f80b04cdeba2b92a5e41d7314bb8b0d3731fb7225fcef4b9b9cdefdc81daf6a1175f16ec67757515588f4d49bd0593d4f798188ea4a187b18e4ed6a6ffd363f98606f7afdbaccc9cd9a33f8c57392ca2167ff4d9bdf3293e8720ad12337b1cea2e527e183dd987e897b7e763d2819c35f518e9d0159b4c6cffab612ea9481d2de33b9ed21e40ec5fc30cfc99f1f0ab13745faf705f6061326f124cb3ac7a9502ded20ee3f2653f2e4f5c0b5291ed231af0477919c0ceb7aeda65851172034a5e760dd3c68f5c7d9adc1ce0aca7607c41ee1f1b429a818ea5e483a07c2c02d582fb283184431b9ab6dba7fc52c15cc568ea07ae6a16b475ac3487f3a07fb9d4b2eb11327ca9a910a15495e0617752f2a002d5f07eba356f2548d0982c462a6c60c8f8f1192876ea9ad12f5eabd2d19926fd9666cdf88a15785906acf9e4dd94598f207c23b4d5157a749ab66ab75782dc556ddd48ec603974a41970798a730d7e37d723f6b8e234d8058b89c7f228561d4ea109ad87cd8f5cff98c9deec7049f0c5ba79051459a1869be2f053b8dfbab8660ef58b92c7b15fb97cfaa762f33c729800f47205353934b080cb56744c2edcf1cbf81a0daeebca05291d1534665396958512d00025a04bd9da12ff6209dd8104958032d87afed21df38685f7f2a2fa9ad0a04eb5174d166c74943ab6f40959e7173a402f91a61b2d982ac7305e14a6fcdde92f372aba8cc16a25936b46adf1a0dd73ae2fb21bf589a9700fa714c583b7f411cfb29f45963cd16852704ad1a8eee6ca808fe526c75ed0a5bcd6164f4a7d9ae88e0d68231cac3d771ff98d085b1c07f94484a22ff554ad066a38a415f347969c668df079cbba28bec0a04e7f03fa3a711ac417813298052b1f8270289b9b1a792e59ca0ab52ac8dc2169accfacb558fc0cfad979391f5213c34ae4ab6327025c272cb2ff6e679df4b359e69679212974a9e06317697bfde0c925ffa1fc742dd5364f1c08bba0b2aaae78bba1d47a7b041a611e83ec24fd4f83e5db451d4259f664f0c4ba6ffd0011b09d1ca0190c4fef9e62d75932726aa2f652a0a469580ac05799d7b476b4a4c40aa4568907e16f59d199115de54bf6f09feed8ec7293c7ee31d085555c7737a33ac72609f04949aec2424b7609f79d8463a4e9e3425143b1a66cb2f78fa7598fa773f11c0f09813b5ff7556151df8b01ebfc05d9741d6fd30edd22b19d4687f0184fe9c3164da4473e88b6e55b7602ac88542cede0c5047c23cdace6ebdb4291d493acd9342dda5c5b826c1cc89a5ade1c9ed8d8293870278d7ea8bb05c28488a576004f692117a109b84771ea9d13cbbaaf17b753c575f376024c8636b18b8c068df699e17b83b09d0ba842995596648ba4aa868b47cb6c0c6e8ba4c90f794ca64090509f36def33c139ade7dd95ca0b3330f069f28253cba7a799d21ad2ce819f27a2455ea54ecab9563e9ca46542fdfd1a50e16626b0bf07db35292d5c44bc301bfda3052b992c06b791ab0eef3f96256d38155a78c89430cace9e220d77e173ed1302f87be9419dc11051096388206ceb346ceed5240e9abe6f9a765586fe336db56e68543ba29e52f8566fed010538d31b5bce28bd987cfe4bf7151af7362bfd4cc0d32f7cb05e9c927146dad1375c4511b009a8b3468a0587753f2b97697de26938be5f725ffa0139020f1bef0b5fe59553ac7def17fe254ca2f3c6e6d1b7ec08293593ca9e7b2d5701d3bc76e6b8f51f099e365d10165bdf466678815a2681b661fb8719d3bb3243accea0aa600ef477dcb77548006a9441a71b4940e7033a25628afb8f28b136ccbed6dd9c7fd0caec2d3477f5d0d1f6ea27ff5eb2845e59351742870ef75e843c5d1466f936d485815a2df61095c99afc103295f9b1012eb1edcbdd4231bed3f9f39739758377d7c1d132a5e936ca40b17299517fe7387fcc42cc54d4e9c08368cb7ba2ec7564c4850cb8650cf135dca493a32dbb4d1980a7dd97cd0a37163fa7cdaaa8b75ff4e16df5b2769565d085a2251f5068fc226588151d2c9ef8279fb6b8dc3c73913313344527653436689df1445175e70d0015afeefb8157d8e0633d01bedba8123063fbc2ac281604fa0c58baeab9b3d3f7cf3b2d2a2c50465273ca26f6870667b8f4a318bbe012555bfe5e8a06cb73cb47a3d62f23e8b09c570f202bb15d515cca31e8308b9f873adebc1cb91e347854ca421e8009999e118aa947f55c4066c56533d72ad1905e5065a1a9ccc4e29ea9fdcb391bc6b9c1f79a22414e6a3f50341309c5c739c7a52fc6f77c46d15efeb3df83a51bba8fad5d07f08d4dee8a990596734105bb65411017bdd828d63ed785ab897bdfced2e05a6a625d3f7280c00973029075e51d08d55ba1a23d19e83eefa8ffae2ac78c39d50c9c247b3b9e03def1cddecf97c1d56a4bf42da513f8f87fd6ae0c860880f00ea93dfa9168b6778a486c19de70306e9378862972945ada3b6958251e6dcc9a107a84b6f6c84b2ccb98095bcf104dfec5ae87d6bcbccc7698b53e472e09d8964203e2cd48b4eb9accf9f790a3959dc425545f4c13b048991e08d7b1a43a4472e369d616fa2b370e45244850d4237a03017d29e27cd5c873a3009f724c57e133ac717ddccab0a5a109da263848411122faf6738cff06194f6d3dc0f801972ef6f0597a77b04b33f1e94f6b725afd46e6a89db1cd461aeaa82b0c58d112f864700599bf01da2baa871271f7479c6d945343ca6b2ca0c7bd1e6e8df672d2e6fca53824e4d6ae4654500d9c1f76dc23b9d165fe0d9f1549903a90a8f0048a30b1b12dcd9dc2ad72b3d48871d94ab0b559819a003567af12bc0ca3bb9b859ff7712169af03ee89eb15a940dca350a0ce61a5259566701abe5d649f7fdecda08fd5b2eb7f6ece30eace879b56d2bb48af52a16a5dc3a4ed58012e1cda0f7b1b7cda95fc2836ae5eb4440796a98bc12c10b9a126408e67187485328bcf50a662124c8d1aea7445ffb76a7d615b490b47fdfae6e5f52795d5440e63c0bd40d29a38215a9700e594372c946cee29b65486495bd62fa425052c6395c9a57bbc460b76a3795c00a9b1e77ce38c0785cff3a8ce0fa8ccaf2fe9b9dc4e08edf18f317ec64f6b343d7bf228f89d2b88eb3313f1ddf65d2227c8ca13975e8cd063f20f0b1e7203efecb9567b5b141c4c333070229a2743f05dc1cef79a1c6d6867753582f1fa843c7cb9c61b2880a0be17009a1f6e4a1c3afe26a32e880ffad85e449a897c35546939f040159afc3436a9f5b1d9f3bdf7bf9f73855be4f8efe09f62014292d4820cf4baf85cc10e8ab27305b467515b106233563dd9ba399276056295dd73182a2bf67a30bd4505ca2115e0e8da229e5a2a3f82916bfaaa3732c320911b73958e245bc772158f29a047a8e4866fa003c57ab5334b24d9ac8189f709d1a0decb01072508682dc9ff0fc62f379c34b5385881fc027c3ca8177757b1f957514f4dffa74166d7cf819b0a9b071e76186412e9cd56bd9b4734950f77792ee5364fcf2f35817f2b30ec1ec7fceac4d8becf69abbcb803407599ea5faa2dfe602bdc9ae32f98a43dc4ec2cafcff61966526ae70b584a3ace3d8285577cd1bfcae80b52593ee21103853849a97701db1bbd0d3837e724508b21ea9a36b2fa78d995fd69e3378d9dcb1e6efe36986bfb0f2d46f99b2be92cf2c95ad33a206c8353dc603b1d8c555ff5a5707ed3cba8e7332223d733bcec2458d820bbb659ac19c9b895161bcf4cbbf75e9ba42ab9c2437932f7e1501957279c7d4f13eee173a1ffb17323e0fd76032fdd17d5a83bdfd5f3b5bac4b12c0ebf9ce21c2b3fb4e1ac792932bfe1a9fa5c0e4a8f77f592284e96e6f8bab2586d3577b74c8da1a02864006df65814474ef267f7d681ee069c5758d8d9b133c0fa5c72dd5d7951653572d324ddb9e898ad066c6cd1ee79334b50067aad064a821953a164425adc40ebcef422c8104a466fb8cb882ad8cd99420fac91c3d06fe046d3069c414848903bf3f4be1417f15663e9f6d4106ce6f3556894b2d86bb434faafab9e7846b305d92bf2bc858e44af116f59da13f26b59126218393661654631a8a778462f3f928cceed5bd640d6e716284bfb3aee39bf143a90ffa48399ac5714314bd1130850d3421c7fa21499cd8206e89ef52ca4498a322d8799a5c5168b221b72ae5e75a05e57c1c2f8b4f94935e079e58ff4fed486ebfbc8bb33a15a1c113cf01cf2eea6be6fd042e35da3c453b08a566615b0107817e8b48d9bb8b68d3fbdd1878f738cae6e0e3ad30c48a696820c026d938b6fa519b9915f74a20b7887e7f9ada3dbd8491c3990702419ceb65df8ef7a15cbb56e11b4f6dd7cf7431dfc58b4837e533b19594f07e4e7b3dbd6a7e719c29cefdc9e8719fd5360ce907f29270e69b1d55bd85e36737893e8c33e0c4fe671faa9e5ac8247db00095737a06f81b15ba9edd095e0f6b2121e24108c69eba04a6eb616073730ad79103c1db7b3bbbf0c681ff63a30609a9e57f2992853cb6116b57b984486955b73812cf3460818dd3f9d44a1339b9fb77d0aa029c7ef68722307900417323a8d4896835cfe8cddcf6871ac615e2a28154409b2e1d44be942a8689b0258abe052eaaafad7d743501a441dac2968d1f26e289b9966f1f1d19f2fba1c578abec521180626385093ba231ea569fd83b80221dacf097f0136e54ce45348d0074b6cf98b9771f39d2429d52f1308f3ee828c3031ffd316544f20385627a2bd1957efcd3ece2454b0c3810642bbb7cc34979765e79a767feb58ba850a7c3cc6d7ce201cc2abdad7685810176a3b2ce92aab1036af37021759498904461762c545314961acd1a39eb7d9f784d7f0ce302b2daa49608f0bea7fd615ba4d629c85be1cbc581328c57edd69dd16ee3531f350cd83bcaaf30e9a1644d0122b03d8193677593494f5d7097246b1db5a02e40054da3aa04d74f6f6dd37deec6e7d399e4a5d69fc39b59e328aaa9e7ff84795f539aaaaceec49341bf35fe32a2bcf1120c8f39abe1aad5eb35b9b5ff915f02b096a50e4136a5902cf4dda3fbb9c1439c40ceeefc72e41a8dab6da36d6a63a24285a4369c4abe2fafd123fa72f4fff90275cd1ed04ed2e50ce1451aec2967af796379e05bbaf40dbeb20392b268a7a85175a84b23e65aeba4e02e310b6196ec4f268af86b42705be7a0b68dd12e197b120ad27311f64c328e53352066fdc1248ad92f2d4d9912ea60418c186abd6e5d2f59fe8d8cef71b439078cd2fe486094a82222724725d995928f0acbc200b391e913909d1348d4436a9ac0adee2ecb0494ef25e215c3ad741a822ff7e08b3a29f76bd12127528bebc739d5355605e4f2709b6208edcff396f774cff3f90d8ce1d7abedbca810b550175dc982533d3620ae3a8b80c655d76ee509a45ded52da07ad4f297dfe2dd2d479b85075b1f5778364ff11396806d81187bbdf4e536870d2728db2c20f05d98b13ab235e07b72a08ad253e175724c775c056e4630e2c51aa19077da6eb12310b395e5a2e3351d24e96501adaf754f2f31b1a7ee14f6bb051adedeea3d763441a9f77f2d11d5e8dc27bf434fab294eea94670a27acfa331f6851f9f4c30618186d44cbb1ced5c9dbfd6981b268cc9f5ede55552abedf64ea5ff0d61b4ae5e12ecefcd4d8010e35b97424b6bb6ab31a807f1649deac64617541e899bf68464896461a1440d66f891cfec2e71e2200f92789c668fd74796547568e0df5c32fc82f56380e15becafd2fb11bde97ab9bd561b55ebdf79ea752768f1a85863943ebd06e0af7540cd33dc08f9fe4cc8923d5eec8f29966c3a70ac839ced3d055ee46abd5c9ebcd940558665857141b6a0edaccfca358a99579e707d08207e44b6408031271ed640eb12dd84cbd5942785d337ec9b7c726330c8bd716467a729f2967ae1c332dc23c5518eaf8350e1caa1dd9a6b8e2b6a7e3fcdc1a826d72bf069abd7eadb35f1e172426ef0d66fd93512102454c469cc1b63fccc39c65dc598f5a3fc03a3cfff549ee0226034a9faa2d1e6e388d798308dad0ecb8b02ea5beec41ba8ad0f26e243b5ee783dfd239d17e0145cb7fceb172757d6e13f160050600cf5901de6efa3e0f2b551bd71077d271d5dc53cc4968bbbf20eab8247464f7408e901a5c1d1ea071f90be24d8e3f06460b07d2cebd4408959d228db0f986e82042d82953f59123c8f065df10e952eee1ee16dbd33113d346c616abe34f4f781ee85f08073de5004e38f5ba835eabfc292eb0988e1246e29500b90bd5b26893472376d8a2a9c8bb4861a09e9960fa17cabf59ad600560fd9abc5c7a3757d5ba1702252972f99e79b85fa7754d07deff4fe649bd115c799216bfed71cb0f89d835eae62989af00337b4a100c5490163e0bac4d2d03893bb272359af439d5807b9f183fc0853bc8a7fc481e7f1f67a32028ba336d6507e23ac88fafa539b422c2f237fb732e92f9ba1c46640c57db34ef3431cb245a39e817f2f28905597fb70a5efd8349e8f465f736e882b7ec742984f72f1a8402d96699458135e970c5d3647a3dda692df321107ff8b2311d4a7f604f4d0c25d352ae1b94caaf0836896d3f1702375465217b99a9b0d6c3f5f113f5c416fd0443179b6bbe3a93b34557a3b52f7fd4284d60e81ca495f94f3adfe96a87ee039dd18ec5930c14efa524cea4ea02913cbd63bca481fb4a8ea0e598c99c485f0ca813a63ad145720fc77f83f7c8aac22bfd536c7300d6f4e1d909d4ae31ae3ccb0ca4ed9b4993980834a51dbc8e8d3e82e2487dac505952948c53641c3e7579e5f91f591b03e8435258fe93a2850074fb793e4aaa1bca48b0a0c10d926bebb7799cf9b4014f4c5b0e1450a918c7f3d222530b2a22c9addae8e45d3e3d361d60b6296d23de0b3b1e3d21ecdce32a02fedefdcebcbf0d0144bf089dad9851b908561d4c83e638f9217521900c24d29d5adbddbaa85e235481a8ef1bb5d2259ef89895fef866301ca5e2e121f0c48cef10d56bb4471854698eddfb6b3e5a2458b0a57b849ee4d1c0f0cb6fedce7e5c0d9f9188da5b5ec75e853811edea1bfb84be88f64dcc70141463cad24ca0457dc082b27b224a67569c623ed8f00fdd00d39f4b2517cf929c08597af417549d719663c92784c54adaf303a4a45dbb86abc6ee4741572c8d0e0551acf68d4d9dc02fcd340509c74df039dd8284a96844b86e038af6560953dc0d3f9dcc925cefca54f84059e9c48c7a5ebe7d73f56286c0bd3d4428c3a447829c880f94c8a2213151f9f1e84959bba486decce4b238566266f3293797c4b959694de22e193524958f79907b24bb953bb1d7fd031b0f4650aa92a909fb5d64e859080e3be56d1eaefb46c9869a952048cc593fb6dec743cd13a5358a12a4c485d879442b815f0f37a885c7d6c58f3381ab9f38e92c353bec4963fd7b29cc0e1623791d3385ba760f709f0aa88f1d156bbfb9c449a5d77f7555b95cd6e93f472679f231da94ef3c2f73a2e28a7b33ca293fe72a47e9ddb9aa34469a4a23f6af488fe91533ca2c730f32ebaa653e564227c001ed796088ffe0048efdb3fc296e37cba371d03276a2a035c9ab535157dccd15388b9a301e98679a2e0fae2506acc5799505910234b6fcfdf923733517320d1f4106aeeea6da918fcfee020c6a2f2ee07309d250f72161e9842eb2966720512d313d5b32af5901227c27e63826f072f3e2dc396c0bea22a3d87e988fe4da7a4ea8c248b2641a85f2af863254a47fbd6cd55f97cefb15fbde772e9948f81bf6216519e8c52d893ddbfae8972830a282953879fdef1677e09a96094b3f6403dc6a505d4139b66bb1fc3808b62a38e7df64db694c09c5ef998db8df98980ab32bc5f3400a6c215aa5ffb4f8ab2c574ec2b90fc3429f0d9b37debf14916c1c8ba7b207c366e0aaf399eeffdd8280c5485945f2d84fadc13493265dc608d5c4f4d5dc085e6787568949eb547aaac38a4bf2152fe79bddc846158e67d40206c3b42988abf03702dfed56c57c8c42d8d09a708a5d98634f1ad0746dc6157ce6008a1e7867799b4d1059d937c226c72e01da8c1070062c0c281220d08cb5032f2e829e4a8719b9c06242aa90d0514479031162b084477df22184f3b6dd75be9f52494af416ee6646ec02fb55246a3099ed414753ee88ba1a92c60adf8289287d81e712ab93947b2bd5f43c6e535af74eb22d388922fb577617c397d51cab0ad3bea57ee8a06d65c7f82946cc65e66f8aec5cdd610697ee54b5d2549c3f057b9c44c28f9019e9a8eeadaab96a0fd2e5d18f7557a69cc667bad7575d62d125f33daa6b6a1a04530ab2402b29255427149b682f7fe81a9115342296b692f5bb9970a1e725d8d714acd66667469b3e1a9937cb05e558577a20783a996a74ee7b5eace9a103b355a002b58dd86cbb250d020df6443f007cc43ff692cfa6a68fee63b412ea077017440cdd8cdce074bdee4ba371e6658b446689acaeb45ec6230e8de7b56540cabb5c672276077171482a6386070dc6ba9407dfe320c2bd2fa9134c9ed6bb3508efebfec191ab3d8d52a2d343372824acc5a4e641266ff9f2c3226f7d01bd51c43ac95c21986bc75ac54cea34310b98beedfbbefdf63a43792e422d817dff56368a68d4b93caebc4a6fe2e6293b269bfb47f9ee1113d2ce27f3e4f7612b18ef2854d2bc3929392a8c9dacd13e6310a6830fea2828a55e1ffb41bbc94ff7b12ffbbf3d5a282dd4bec01bcbc5035045edc24bdffd8fb2ed6999f0e8993d051418f363d86401ef7d1faf5cf586712384552c69ef21417dd46e6b2f66beeee00bd47362b5793ccc17e189363172eac83dfa0ff13b8b3d2760b7ecca87eeb3becfed7e8586333b7300fc2ba75fec32c1cf39514f0d76525f60de2d657b8a0098368b273604034b6297a030a5747ff543069231278048ab1585e48cb5d3453ec89a0927bbda0bfa163d3f469ec45a4a0e1d75da09495d3a8431080d294b4ee640a55fb9ecb575d5bd8bc4d90581f42708841f715b87dbf410c72d9dfefbf8753a15fe4374bf1716c87e7d92af8e273a6b43c4072224b4b0fdeee78523d41578f9edb521c4d4b4ee9d24388ce055966fbc1ba428d635f60cb148b084e1836730754271e0b41c450d5cd543388e4a99d6563037964ebf8e692080734886dde6e0e0fb8fdcbfe2970e817b20ef13196d0f8cab07f0d8b1982ba9be9cb24519b36e4a8fb993dff75b0e0e7460eff819d4e9a5ff0b3ee80877433503876a9e4acc5fd2df632845a69aeb4d176952e2a802408cc11ba4d76a733830119a4c99645fa698e2fdf710cc8373c0289937ee9e711d57f8a33c5e683ac6538f71f2a93a8707668f95a88a3f9a8cd33da0da86c4ef62d5d60f719374a0e4beb33917b685c3979dc8fcc267694ba70e932108ef44fcc246d5418f14a78f5f62868c037f924f5c7c2f3d9e40ad92dcb02bc45a9cb31ca25a275b65679e0558187c930120fa56fadfdea2fa90c510e40f353d4c8eaa079139edc57e836b621533b573e41940fafb1818860526fe659b02be891309d691f7468d29ff6eca668ee664012089bd65eafbe698ed9f828cf9a48293b75b6a82bb439cffb589b22c14e174a3481e13bc821f45644d663ed06038ebb267c52903599e9b6b92490f1caf38a20f13acecb3c33e82abb0eca0c3925a443342126a52240551c3cac57911116b4b8c5e60eb0b43f24c454425327bc95f2e22ba431a1e058e581efd32573c25c6fb6c5d86821714339d798e2fd39440d6f7473495aac3e9a06957f1b4740d6e190d77185875081c05ed967cf2408408f3056db582d75f2a4228bf3b36c3627eb22ebac9000c7247ea809e05626f4eb3ef58b9dc29c31d6f0abf13a496edd6af8c305c950e6468de3127d82f8105e0fdfe40fb128d59caecd06ed11c4d871f7bc354294939adf76a65f4239e2385be827d202689d1d60e8ec29c756ef9b5def1b1316b374f349af9bb815a49729ce65acc3210433489d814c29ae6a338bac6140ab5da09bcd2955f2cf120422959ab2ba996c8fa54ab63210203d3c33f4d3cc8d078913bb71bf4c8469088fffcd90ef863f173cf40a5efc93d20512acecebc525559b059c1092dc92c792427fc4dd92a13b52864ea70325820b87d76950094b9bdee623ad7c33d2b52abd966d016cb7640e9b204991aee403d8c69f8c7dca555e8dc98fbf07f0787c3f544c250639c1bbef331692c4870fa49d5a89ac983efdd4b001827781b7165831eb56be34c6c6b9193574cfdadb40898726405f282ab95088a90fd8aab9d79ceed45bb6deabe6f1576174563ab64af6786be0f115ff27d3155a0a4f44ebbfa6fae54e4451585e6c66c44ab1f0285d6f82f876b58a95942dd95291fca580287932efdbd2b432f4a8f183a1fc13122ee3bcbe2a33d40c5dedf2471ab94fce276a4550eeb62acfeed8a63be9aa1def0ba29d763895659cd8e9212f70660c31266b815cc51078017bcf5bed509c7ed2abe3064eda013d06dffd1a8931aebc1d881b2fa6f8b1e11828b84aee3d4920089abe016d52c08e854c745851895948b7abb805b4f229d27310d6bb06df6c623da1e0e945423ee633578003394b032c58585d673b631e21cd7e3378b866e50904019e5a5daa939c2f0abcdd4a7f17b733100728024a9331ac5c617b52bd7a3823e48c8da6cf780173fa458e5a5c6daacb44a82640ab812fd30aeac72e4ab4de0a6689b9253b28e26692a563864699deaccd52808dffb759957344f7c463fcc62c2a51a4a8486a19c6b485a54c751af180a5f15c8a552deae50598634979b4b2313a27ca5316baa94d18039870e64120d2b01d9a68d8a268ddfc60a676a8aaf59bde1f915105dd441252ab932a9eb2db17cb71125c4c381505b9f1140ddd3c9c665816097aa2974524c2348b5c0dfff807e2214819e31c6514ea71060e8baddeb523bdc5e4e1c1a1604ec117efb5bc1bc106d26245380406efb9f2eabcb35ad1edbc6eecb14e82dc06221b386f685a8ccc4e7c15c56ccc055e545bcaa25218dfe48c38e29959ac35dce161fc01ea14ed9badc7ec2d8b72fbb4def696324e8124e57f700f82fc82c3f586a4a89bb2d9bf235721b41fe5e02e40dc8bcbd68c3ca28a3954529c004ac3756e0f62443d444159de1ab39d5e5bd12ec00d6a9cb247fade098f48408e538169285f1244f0a2bb8dcb272217c53eedf70872ccf20adf8523fbd6721c246a6d4a664728544a39c8e87196d8c9688edacdf95d3b1091a1f22e5ff0e43920d6ee68d96a932c97a19e7aa46f59ab0a199d3ec426af1654150c3cb11cd64d0946c0f88deb53e7011867f19ffa15bddaaaf1de06e1ba8bddd03390215b8d7a04f623fd0b3599a17d117ef2a8f21b4367f40b2a5c8d93dc3901935d036159acdf724ded286946f8ac5adb03821b6c370e0ed818d897ae472af9568ce4ce6190c2aaee26016aeeb3b6eac103a706b042f8caa31cb0251c034f33dfe8034102e0fed4db51a035dd241de6c47f69ef9bdbbdf96a2ccac74a52e725063d30d0445c5b02eb929cbc8832644788081698c39f98e3e053715c1acc334cdcb06bdbc2dfb31f585d5976d421e8652f3eff99cd105c2873d84b328980799f1b07b6ea7293e9dde58cde84fc8612098f949d917edb10e2cc5ecd1bca049725a4d77efc67380d08ed43d9180e2ea8987301d259fc101c465936080fe71bf1425b19937e63af09d5d7c21c8795b04b35f8a28c2bfc12f073236fe1b2e62e70246a9fe6ecd952310f75d8bdc648379147a1b6994c199c84b10985a00e9d3f3b7d57ceb7fafdbcf3a37d1dc3222141c7c9f1da3db03fc83c75cb9296af37be2997dcdfdce8d80b3fcf4391fc077768310c6bf3051304fcb1ee34a563b08001800bb5228a7d353446489fc8dc2a864a2dfdaad2fb6e87fdf40d14a86f9b66fe5d8c2d4e0d327633a9ad10264f7532f4afe6b73d870c2e1373e41fb8d8252424b12dffc2645739e1551711f952b106aa9fc12908a4a30e2b067e704f98318286e7c429b6c0705b738820c1212905e4247cc13256bcda7683fcde62417dbb2e54bfe6cba3e0aa1b235d1e564932738b0f9e0261d17c840986ee4a83b3681678a57baf0ba3e9a84333b0ca935f200d43f28b8f1a976b538538703b6ac09457a7342d38dbdcc481180a09399f11237bb71b0b7cff068349e21bd2cc9b0bc14da2787f7fa521c208ea8f099d16f794438c34d41e5ef68c9e052e35c68565399d5120b63f26f43fe5708ba223b672bd32754e82ee5cccd00e2a778796be87bdf6e06a8c8a790d40b0b2381eb1d5f756441975468a224c9b51413147e4f46a2a4b47dcfc265871115d9066bf5bafe2c7f8bb834284e27c465f7","title":"768. 最多能完成排序的块 II","link":"https://leetcode-cn.com/problems/max-chunks-to-make-sorted-ii/","question_id":779,"issue_number":9},"7":{"day":7,"pres":["求单链表的倒数第 N 个节点"],"tags":["链表"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。\n\n示例 1:\n\n输入: 1->2->3->4->5->NULL, k = 2\n输出: 4->5->1->2->3->NULL\n解释:\n向右旋转 1 步: 5->1->2->3->4->NULL\n向右旋转 2 步: 4->5->1->2->3->NULL\n示例 2:\n\n输入: 0->1->2->NULL, k = 4\n输出: 2->0->1->NULL\n解释:\n向右旋转 1 步: 2->0->1->NULL\n向右旋转 2 步: 1->2->0->NULL\n向右旋转 3 步: 0->1->2->NULL\n向右旋转 4 步: 2->0->1->NULL\n```","content":"0961e884611df7d4ac47a79a9e3b6f2a74993342b3964da843074a7e2f1d4ea5ba126cb6b71e6983b7c364be6cfbaa5dbf2242c49b6414deb063ea3cbfe8f124fd2d257794c0c0e70c6eceac9a8912155da73ec61144c917d450a23e0124585c33489e47213c61f0acebc1fb773f4761925fa4cbbeba1b498d393a4abb6cc640f19c25c7efc7893e7bc128bc37952fc3297d68e45d584c6aa4a61c10af9c875d783b7b003aa9d744236c5af8b457117b0ba6c1e37b053262a70ee4767afa3c3d58bf42f3576127e0695aeb6bc7437738a79120fed322b8bd076fa6258794b40ad2d1ef5ccae1dd0d37ab45be81a3ece0a2e5f26849a4420f457c866849084ce2d6e16b11ebce5cc92e521878d7331c7399a5886d981afc378d9c8c0e2d23cdfa0c2ba3e06ec283feaa2cf9d283996e5eeab73859f7dc0d9795f806189a0cccfd4e73e0dd346c0c46dbf34195bede0fc9e7aa88d0ca9fbb1e886283a06e5253d088f6ff76a8be74f26a557a2756628f942289a11ec51a2d6e5b4ccd3e87f3dc2225e43f082f7554815150fc6228e8616283795dcdf2e270ebed714fa177d60a40fe940b136d49e835ac8d0a4cc1d5b4eb45a7cce7a96bd82665b6f558e003f894e470bc7d289b0fb5ca33e4dee4bde3bcd141e87279316b2a3cf10253fcaef93614e5247239c753845a0356b0ba99fe0514682da86871be202ee242d397865597a64f9a8921bf1bac37d118e1de85cf52a5170793d47bd075a7865d1f28666e57fe665e634627016b8ea0a223fcca927c717839203883358248b5ba7c0febd398f6d6886632451f73e0bbb0c6f850f78a875db5724e05aa20cddb686c2e1cf0bc92ef0801a9f77c14622236b56960eb94737f0c016e767857a8a916a0a7342e63472f1c3f09a61c0d23edcef24588291f7da29322f742ab5199902fa462a9bba75a8f201bb04b41ae631799ab23c7e9b65f8ca70ee840627a7ec31bfa27c147f2880cc65a345cf70fbb6782fcad6ba72212c380ee8c5ddfa55446bb8d272595ceb65e9660415a1cee995019a2fd85c653af01e86d76b5d684b44a64906e0fd67b85fb768fa7519633d61bbdfe44c8beac41819daa88e169f867115b31e7c50cb2de5fd0dfe6ca609775e907e16b58f94049b9d426a8591cf1d5fbbd70663361736a4b1e6557e3b698395267a6da8a07c459332d3c24f7ec74bd4e52aa48ce11a1e0c463082680ed339427ed9ba9b010b3f9031e9ec738d00ff638947eb2136fbe72e3fd219a5e02cb0ddb2a37d3013615e988c6fc721a1fcfb3fef7b9e3d1fdfec17acae6270efa25ca3f73f09a66c7a48315c07652b89fe6cffd0eee7614d828ed5c46b15f9af9732e79d8ffc4a71d724727885804a796dad8ae79f50222b252b0b89cbc1ed29295edab3666a92ef106ca5bb23a61a5820bbf88253bd2947806f990fec1232ca2aa648538ba6bc93ba941761759eb5e08aa996dae5b92fe2d1813b6474fe56938efdc0a5288e61d1378fa2e1ab8c1d695f076e66c748c8aabdd609b61511d97a205816ce8357b05ce05cfe75275e5444d61801803481d49f95069352ea7f1fd3a1d7305a6f36b5ffdf712c18fae7db0ab6fb789a9ea3f859c77a50678652e2863133a00c21c001ffae0da039b1fb07f663e3ed1c33fa28a14f8b1cba2df8155b0f67488a3b51115cdaf3ae466ef897e7d5b2c1e1d4378e55e1fa7b83f67ef11882c4e4c8bb70ec0621236dc56b72e836b100c64a87135d8193362f3f47f97bd5f2c624abbb8416aa43dcd1ccd88a282054120d74e56308e35bc9ae36d55ba855c578bee06a8b5d12677a32655044579aa3f7301af81f5f7ccdea89b807a97e064de1ac4dffd846d0b3bf797f6b684462a6abdd2af6b7166e562f67495d9b4740a2c3946657d923d6600e715f778d00fd1349bf42b2a484a3942d5d31ee53e76018e5b56338f1528d8b75dd015eb9d1588ae47bb7d5a29cbfb0af0b8767b4e4104c52f91399205d2530f8abd3b463b087ad4a76d019047fce750ad5c7024f1ac843602fe35f59dc801f1bcc74cd0bc60e165d1b55ad9a2d07e09f51b0c2643be48e6ca0f21b00ead13c71b5331a2637780f7d39ccde121011f879989cd51c3692139cace606cae61efeac2f71c43ec8052f1c280c39559dd2e59d7b6b7471263c93fb057b53003048c0101ea41e305ccafb0f46b995f16d157f1bada9ecb0f2616a24bc717fdc4597324b41adc98b36c6a6e4103827eb69b37eb5ad3d2399a47c1cbf0acb7a48a6cfbe10ec25c3866e77d0a6efcdf60e114f56473715067877ae98b32493a997821d07657f3586cfc8ac2b6fbe3043de3271186f2dbfe160fb8130ccda9a8d39756a0038bffe87a357177d23e8b24ffd3930ded381bba38acea9578ca92d120151deb63b276643f8e6c8beb3155d5c3ed2ab0374576f6c038a4e7461cb29650543f13e762f0482ff9e79db0a503d43526b6f2160c2b0a68fc0433d79e88a5186e4aa80e9333a57205d2cba02e12c2cebf12e131d01c0b6d0ba3bf079713d50ae6f5c7e65f967c4c6bf0e0d321a1ea6daddbb8ed38c31e277fd5c7d117ce95f9eed391e50061888d7210942c175b955ed179962207f1651af90ed59002371a3707cf4405cdbb64e2206924f01cbcb93a0b3cdb19f94f75bdf55218eb2f7c837055bce940d51e46bc8cf2e3a51ba69df0bb3938fe2a2ae6d7e0d53e207e7d702118cc8a4b69601a21b27dc7a2e431a4980ccd879e7565be44c565e9ee91145f68d92a1acca662d2d42b1a1fffac8f17b6e1feadd7c73eefcff32be50fbf946a4b4de3dafadd272009830c8ff990ad751b1349d97cee8c6702b9cbd9c1d205cfd97e0a9bf963f2e231fd03fd116478d4d6c1ab034b6c2c7ad716e679c934dd4f42811ddb4e8f2d6b114ad27027190ce716cb124fbe2830fdb9c02ef375d505c9418cbdbc0ade2dc9d95e4f42492524110a7bc7b4be30977a6c89d61b39c4e1c2aa95d453256218fd0f238f55de2865bae2fdc01763cbb7bedf92e293e8cb49ca0deb6dcfff1da2218bdfc2000f02572c7224ae425bc8b5a1b80464d94dc0ca01bd33a021958dac7ac7b6ce7aff907176189e26052f58334d1c55ce531daccf6fd02dbe60eafa6d8add7ede9c9c84a5cadbf6ff81319eb23781c5ddcb927add06f191c912c0a6e43558f90f465e4395776682110fdd97cffa63f644bef669c034da26630ce21650f2723130ffed858002bfce266ed3fc9af2debf28819dd5ca9724d143089198f7f3a658e0511772537529bc92057e48be9fc989ee2117133c12f06e4cc8dcd20576a5e001995f479d846bd755154a36f356cf85d08b4d284ced61f45626242d334f59ed14d3d75ffefe3b4746f15749575fab979c6d7547347573ab8734808e53b9759292834dd65b9a754d2b23b1637da99ae2a9753ad5e02974ea27ad50fa5168281a300a438c75168725f90e45d48056d94f15452e759b07a5defbbc248f7e07a45f66200201cc9d4fe06cc99c1a72afe8ffecb78b48e5cacdab85edd79bfcc3dd3409edf7217bb51150489cb478fec29fdba4387ccbb56a7bd646b444dfed0e218adb68c51bbddca899a852541e9a8074f8750f4abfbb43a8301b2cd9976773137e515c4ffed0ead524baf0d1e6b7ea9ad29ab86bd257e00ead3f224ae07f6a5302cb943afff99a2ce7ba941c6fd4405c32e19cbe043007269cc270ef1b99b6172a13c57d0d52d75f8b3eeff77497e607cb186fe0488bc22e8c97c31d843809a771e6eb89239d19f1d6597b41549e5542d7cfebc3baeb8281b3943bcc63c896f6ab1eba109059ccc3612803c7d7af7e44d1ef447b4570e71684000bae626cdc4d5782123914157d95304c6def5fa78dfe29074ff09f0e7e95a4c97d141b0d7ee5f803de9c4f80a01410217a28204a755fcf7962a15fa3525d730fc4fe0e45f09099c2cd23e1c2197baf6de42214947f10a2c72e73b7c6dab374af1e8d994f89df3d15253113b697c150974678152ddbe76a8605e36d35a86bfc9ff18f7661ef3f36ac7112f28ad663f2d6257acb18c4d9cfec34ae86d6987090e02d4a5d3fd671a16fd227d4ade26e6b600c9b9b0e1fab7bfb0f52085b78002e3f96be9395ade9ecc8c96121b4290797c1188e003820aedf2e92fa2237d81586e167b7444fd9dba8b8dcd4811e2e3128832432e003884ddd6c32be075befb30b047593aad3d5bd9ec6a83c31240f74d9762d43cb4f2612444f28eebcddcead53f67bc8a41af5360ab72e2eadc0d4aa329523c2cf221b12550cbd3743e7e393b2e705c5875b16b62c5126eeacda37d628a460ab13f102ffa07c5a8e4f3ac895b25aee66c5a56853422a0d78d4a34c89e5c5dbe1f599c0af433c01d71dd26bbb8aa16f923b44aad4b55724bc7f1644e24178632a5133325f2911a2f5a9a78d212fab8a6fa90165c8bc0ed1c66b37fae5fccec0c1a40056f385f07d0d626195b4fd3e681570dc2ac9c0cc1aad4f2ffb51f4a6642a3a698637a2f0a911b5b70b8ac1f3a9f8ae0a8c328c34da3cbf018855cbebc8bf96e3a2602406ba38795c56a077611d8db2afbb05d04cdf6c266719d8c71b06621b46f3d8b275deb9eb3dfa17b9b5b75b73754836f4e31e5bc2005c62c50bb2970523c1d8d4f1239fb82a84fe0185ef6f7b83dc506a897afce836b74bf5cdc3bf9f314e7a68dfe37f82b81277d9964efb618f031a5d6a7eecdde41b2d8fbb980c6bf91691c7bfdf3b8bd57cd12fce53ea2994a92bd91f20d5a622fbfa2d24f42587014db743a292002bdeb0f030e9acf34999975e625d7d029d774f8d60f14ae926f2c760c9b2d396d46483182205299ff8ff523082978d660cda43c6282336380a01c687003611ecca205126512bf8932899ace02eb5d6d8c686d47afdb06fca650cd0ef68731b7b74110c3a06c66f1f5337fab14e3be14614cb3b8c88abd1d52718bcd450c9f25b3f16e4dbdf75743f83006da7c6662c946908314b6433453f423f91957cb5cf7547dd190ccdd8d78fc0cc22c1d127573c308337030ff829e3a1c0fc7cd05ccb405fc637a7fc38b387f11cdc839e4b33552ed674563d547d210f53ea7a07fd75ca166f4e02b381949b5a1227663fd43b234a9ed20ffa9f6390a1310baf2127060a77126046755783c2d011b458c4205ad83ccec57adff0d7dcbfc90f1cf5cc86c6115439d1fdf5b06f26988b2d1bf117060ad88822f33cea5a6a8acec04ed80a6b2dd10782842fe91bc9803779e3f894a7e89cb5167507bd62ce8f9ac55e3c46ee894122c408a5a7d1a0decac5b5ca983f01206b5b9d21d39854fd6259cc83025b44e344918affa3e94b9b8bc8703d498e00a9321fa40652aba9be6d93abb77f81332ddfb9ee5997ff1c59938241c3d8460e4af3c1ec557971726b18ddc03b5eda046f8c0c6cb7eee303ae688406bd5066ccb1874479f3df579ba6b222a47b195660ef79bacbc4eb36ef040661fb3f5714e629307266e2ed73dc140f4aa5c3bdc596acef28457d225fbc4b82bd7e6c5517e3276f492a8fef4f953c81974f0c1adaf6096e620ad01d920dbccb16433808c0806491e681ed935e0f484cb99f5f68a228109a8338a3f8f12e6bd91326c8a7b4c1d651d9cb28f6dc223db5d5418457ee6e9f4cd388992a5661360f30168471ada82761aa4b166de91b723720c60f9c979fcab1af3a8cfa1d8931a5db542f66e5aba2ce2d1858345cc054fa8ac8135346456f421ca4d75e379db40ca881a3582071dd520a7fe6bc34dff69a081b1ae16298588841e7d4136edbf7e09f4c6887c68abc811c17e59ff6df72c93c0f18f7ef54999ee2f417fc173c49ff864055732a1f95f0809d35bb0a9df835ef217c4465ccfb83c7712913205c7f3c4ddefe3a921173911653952b2969a71771385cfa5b50dbfeb3892e4d0a420e29502c5d409ec07dacebbc325e08c1a779cf566d002f939aadf0891d804a96bdc2548d6d1d7d90563d4535ae498831c7520e8304289c47c7da0f3d7b5791c0649470ca3c35f5222de869d241ee831094725d1625393c7b7d66f559a638a05ac973782d56a539389f1844c454d7daa4392b42bb928be4cfb245f56da0d5b75eb073d769ec76216031adfdd9889f74a7719fcf53de0356e8a178d15390c6f83f271235b84d755da4244bf002a0dd76ac1650a62eb099011d71f7e1e3a0ef7576f0826ef963c99a966d21f7dea2795129e1e5c1c876eabffa4951c37b4f4d4845bf2737cab756b9019a5ccb51e65ba5225cc3047f8ef8acb8fc84a01ff5cc1d9aaa65d529ab4159a1c60b9e46292d8118d54ee15c5735832c5ff4340e5f6602680d66a1267037b094abcc8c79f35b5ff143c3267b6770d930624d59c35493ab4d1763610b04c79604290be86d0924d6fb20ec79d6757f1c118a114b4b7ce1c70874262ffaafa9cb2bfcf77c7f935ec71d8fd5047151bb72d05b802c6944fcae4c1cffb259c89853d91c6035016ac7944f1912a7f883358a2a3e7716f210fed5c0331579558a69d079e76ac7e6fade73bcaf88603ea741b84ebc1d73dbcca92d73183891904d59d0e8c68a6eb3dbe9831d8ef28328916cf4f31589d09afd93bbd41d6db84d153ffbb1e23d66c0aeb861f96f6b3319cb843ecc4783ed716c8647fff8909849a1100d6f97c2acbd54d6056df6271a4afdde85d1cfe376447a0e9f899235320c837ab7817aeee68c58f491498d6c8f35ef452cf362d5649bee268b07a6c268d679ba04e68bb4f2bce94292653698ece06d42934db8e037f59c0cea1f87c9585746ed28eb6311cec9a86c808b2addf26e9a989881fde15cd95f866db3080bce4c4becb864676eb099c2d6f28e5ca284b2e3e10987bf670e5a21a0961a8aafb005d282c9e3931a764ff3cbbcff41fe7994735e701a7a5d6a333e59572cafbb8a2658f1a85b2a8f2bacab6292935f9ff2a7d610bfee1119825011e3d7eb2f659f205dca5f2b8d5705fa2b32ba1538df8ccaa5b5fd001f118e8fdedee8f824a3cfe011eaa83bcb7d473a0ae48e56aaa458fa8778f7ec477101517cea951ebebaf5a3cf70a9aa5c7be38f4c5fc44b1e94688d66f6cc62483eecaef05b3c8efd9dfa9af74215b25c569fc775b78a12e906e58752a04fd323ae1c4c12e0e19b1caa8dcdfd8985847ed69ef6a26e9087f0955ac5d369662aeeb9d3404305f6828038342718aaae4163726cbf19c2f2db883d2b7161759ece7eb6394e89209026f88c23bb81d83584c49e99e9ad704ce0fb2eb2342d201e18a56f069e430eb68c819372c9c6dd3e33c4692cb5cee8d844898c68d9d4afd9ae99a2d612dad8a0afaa104e000917c961146725f9618c9747f8f2e6090b3655e1ee857e4feb67942d47942307e3e5d97fdcfe894fb23e987cd4b7c2128f4cf4c4c03d01caceb8604b3f35c866f7a96bf798a94cc44c5c64b9d817f8523b20277df3236d661865491421a6fdbc26b08620f3cffc83a381eb82c032792c68ece70bc9eba99d33967bbaf85328c74657816f68fa50c74bcb562e13c1bc14ed28ef85c3","title":"61. 旋转链表","link":"https://leetcode-cn.com/problems/rotate-list/","question_id":61,"issue_number":10},"8":{"day":8,"pres":["链表的基本知识"],"tags":["链表"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。\n\n你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。\n\n \n\n示例 1:\n```\n\n![image](https://p.ipic.vip/r1afvu.jpg)\n\n```\n输入:head = [1,2,3,4]\n输出:[2,1,4,3]\n示例 2:\n\n输入:head = []\n输出:[]\n示例 3:\n\n输入:head = [1]\n输出:[1]\n \n\n提示:\n\n链表中节点的数目在范围 [0, 100] 内\n0 <= Node.val <= 100\n```","content":"0961e884611df7d4ac47a79a9e3b6f2e719933409cb941ad4b0a63642131446523a6ec636b8aa2147f768c33830d2eb0626e65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dbb21b9f24f42bc1e3a6bfc0502c821960bc893d665b6d3ce9914d58bb5fa4c0bcba15478a36d8e122a75a29858d4a6c750c116e13e549f53bf169ef52165fbc10580c30bcfb4112d0e4993c13011b4032ca83775c0267bccd7a4e0307d08bc62e5b0728f307a83069b74e1c30df4fb70d60a00cc1c52d03c22b2c19fc008a355e6fcdac7b28968768133ecda1cfb81be8a2739dfe3124f692cb85c834006dc780c368661b49cc3276451bd5b457fbd8b4f731903ccdc3c5493c06589a86ac608112fc29a293aa20eaef54f92e05afd753c295ef4f9a56191ce9287ea7ca1c3f9de442cdb95ae9dc4e8b7d891268bc9621275c4582af57e6c8ef768fdbdad1d3b4edbc60d254eed5470c17f8fea3f02efdb732856f183c1b182e80f290296ab7671b0f505971e2d1026d1b6c0dbf5d0145df3560d294a14141b2512bd9481799d181ff5724e90bf069556948ff96201f6f6de61d9f8c0059cafab0eb45634b7da44fed017f21c558c7cba2bfac12b4ce02a001a8d8f778752e18797760fb2df3876e2d0670b163947a172e9266bf0f175ac5c34dfd9080243f4873a4cee2a472e3f864d4df48837b9aa4409a996847187cc608f25ff87a9edfef957c3cc99bf99c675cbd2d3f86b59bbce6de26d8d1b8e284d8bf5f057d97f1fbab7a7e49d5bd57d628cad00a72191fab6612246319b692eec9e4716e077c2de970215d8911f22b46927d96d62f259f8e1d2cfeb41b58c3eecadcd283ee1cebb74539a597d8a88cc4b1a50d73ac1045630b1803244e8fab73b38af77a5425e51484cab3e49308f0eb4831b710c1ff79186fc755f3bdf03896e784736c166be79aacd95adae357a602756b1fe679df5d4db44d1bea0593d1e67ed461329eb63ba12b123892cdb0b4985f069cfd5037d7f3f74e47ab53d2d2e7ba4943c186aefaf82a16b4a8cf4afc77542fc2467a8c7c75af0494fb74bb8c50a70b10bed9aa636e9470dff4d58a17cc7550224a0a78f9c901d7cd00742d7f4f874d905fbe9916b49e791beac5a7828355dbaa743f7e5031604d63433e74db3e5c19bfeda3407e3fb2b8023b56520da6b84f4e9a8f326cfbab4caae7d384a2deba25e6a76595b8b71b92d3edac020192bb6ff366e74cd34a51e810dab548811f78cf840c9fa316e5addf453e1f5ea7de42c7d071657f536b342226f72c75b5d433e3598db56c0fb2754407cd6094fb19588cc9b770d13c9e4dee74d983c74ee2814a68f25ff2f5b8fec0faeecf7f4ac4acb89fa219932e53fb48f5c494de71c5ffded1c66e62ff9635cfbf48ff91fd63286ce5997963e3f6120d97ebe4ac4c06cef256e566a21da802cddcca1f71d65c37869968a9549cff2c2f34b75a56e74933eee63c5290f4133f6f32fbabb5fac19be25be5564d6020f88650fb354e76d2b84adb5b46d993f44ad410083860a6044003ec396ddb888f0ea5ece99549afd27c435b66f7c507c56431f7060b6cc45e61923b4b522d99d0c66cf26f7023581be899e5fe55b5a26efa2561ca198722fced92fa5250f9061ad3193f0d1a504509b9b02aaec0e4037a5616fd9867a4fc4c1213167eb9affa1f93cb1114f99365d5136c187bedd32fa816099b05cbceb11cad783327d2739951fef2f5487ce62356daeaeaafe1aa353e9978bb12a3cdb228adfcaf0ef490f4dd29c0d2c3072883e70c50c09d25c1fdc75328bb6d1c1926118eb49cf56b443e2888fabed3aafe4c25eb229a88fba94384e3b1093a2c2b02c8c19b2e702b6b6971e147f3ab240b3992ec695b4ee48665acd8e065d02db97af63c9602bd236f18555665ff0aad5aebf8aa1cc2c8fb0e9dbf0c620a805aaeaf59cae74994380f63d0b30afdfb5c350b5f11f4b40d8854eb22c4c0083ac2bea795f14f39b48548f7d671be41f9ea8f2b344cffb262f22e3902a0743a0db24b4203bb61a6df4491fcc63d73cc777c362dcb41b78e0555cf2cc677c1660507e53c55d592ce254a05ca9cff3f9eb2eabe4604afc0490581c801099dd196a02b3d5e0a8767488dc8a15be6185fdaa154de4509cb73ee45d56a2d70fe2d57816aa6b77568c5cc0add554d835297e5e2c89829a5f82beb02d64fca4641249a0f1b3017a8bca1d1fd207fb8a5d849e5d359ec64d603631c33396356b2be920e0bdab2cf4dd2d3cc2b5d821176bb21013b50c32bd0323bcd0c2c985647d07757f3fffc92e5f0ef91d06140e5be98790e8fb095fb4bd67ad00e0c490c48e81698fe46e690a9dc2ff613ad3920539a25f331ae1cb22268cc02376f849f853ed822e1baf6ef7d43850b18bff08857b6ae2119690f97aad446119d9e96b682fe43c6659ece5f57366139cd12908972089a0b3fcc911294fa397038c7407c2ef710f9b90e7205c4292ac29b003c2b830ef926d69bbfaa7808e21ad60d04cfee2919fc17a5b8fa7e431af91f04a555587152b21dcab6d0420e0fac2c53186b691de7307a85ab7c128107144ea75dea77962713fd6d19f83bcc922422113d07cd763acdfa3661fcb5a31c63205ef24a29b2bc7d4ffd4c34c0b09d83904ac9fd6b8647b284dd7b634de0930ba5afec73f6fa74d7900b475513b95a1843278761958b363f6a4269a433b897865cb5ee51f4d3c14a2f2d87013bdf87da032b3dd9737ddbe2fc281bbcb6c75ef7d238d38ef4eeb3e899355f6a29c005bc89594963e5ded6f32d61c117b5586ffdf050797c438e17c4d515273143303e4fb7a1b14641edfcfa7b0dd9779e78dac40481f490f33721012c24b02069ff2ff14ce035ea0ea13b9195e6f8bd51051f777dda4fa33e11c52b70aabdac9c7fbc61459555eb0c08e5545b91c70b0e6c00b8dcd4674e84cf8a5ad150313b66103bd52425085179cd8fe39de36e408246c04a01786051678af112035217264655267444cf3ceb48cd3abf0c218ee80dccf183a1d4f4c5298bdd621c3e25dce93e844750c546a962a32fc3ac410f1aaf13cdd21a587afc0b6b4b4cb6e796159262930e51e4188178a9554caa527973d39c39092d116b166551d15b01cd49494b0f6fcae422eff5994d9bcec47411e702395e2c8b7a1a827d11d0eacf947dfb14ebde69fef245573a0fb16560b3d8c3a5181cc0a56c95ce1941d0e8843d23ca718cfd8bcbf276ef1958bad8a0c9c212c7015443051015f2cb11e42bf2d799461681d2481e6c9b4e1982df8f88986cae18f3204bf6e954822706156bd3177c50180fc5ac8b28a8934a4a7f14b1a323cd58afc318a1de5c084d8cc7c717da7b4c0ae4da81c5bcbada806bdd810de96e1a453beb0efbf82171665fa90d17beffbbb33765ce8b4f65bce02b503ecce8b2c8d55f00d3654ec2a32cb7814c73b44efe59116a655e69998aa39a72eb4750d14dc2fbbac04c7ae3ed47f7900370a2fecdecb78b48cf0ca58ceea7ced1a2c2b34725805fd6fb4adf95d33e38a51442295160647380f153148e6414a6350f89c940f175c59b560a291c1e9b2f1fe6c44781081127cdbf35f4088d2cc4dca0e29ff1c9f98bafe9bcb707f595f2687e5f525f497204da90a42cfe622d38bd55103f159cf12fb63f22e25b2398dfc96641652ee28892ab6c1564feca158a200e3ccadc8eb27b6817c700dc29bd548d7a449ee118a8a964fd9e37d8c8c559659ac505f9226e032cbb37f2ec60b1979b0eabe00d6d3c98b8e2f0d5995d8852ab8cae9dfc1dfc7c9e39a7e8c7665b9f4423ef800306c1a7e5b84de606f6c7f2622941b9cf6ea7a9d399fed1f41168be3cb6d49431a5c72f64ecd53a6e691f470546d444d2291ac040cbe42d76516d6444411804d78a1f2086576c1c384e0d4ed0db39561020a576ff09430b8547a4a5d852e8a05842e4f92d232c358273628a9b5f89df3d15a4e8d1315b28db41ccb8f7ca5d01ffac4eea6d6e47c251112a01b8cc00b3c5407f00ebd2832baa97a6f8099906210274ec2378210d9c0982420b1924fc7eae2353ec5a2819a2e398ab4f29b6d71cd63c92dc898883c8ac84167a7e152e6828503ee1f576a5a73947ca5523387b84dfeb3b57abe501d33746e04abb418a9e37604b3a19beeaa9e104dbde73aa1a7cf76c32e3ead7633c93b9b140201e7f5c16317f68370ecac43bf4e4cd5eafce8cf6fa02e6fac1b7f953b93ed4b409ff3fd9029aeb41365a5cd352b03748cff3365b09a54960e4bbbab2239e46099db7944d98b06d77479600952bfd2db23e9e45a0167a0d9cc1a2c9e4486db53edb7f4252315841d8a32f82b3c5f18b8699e5a1542dce56a7be00a89eef6b844946f0acb5042ed72f6643ea407f6d79142d33117745a3ffa6e39e436aea8223fd5a1d8def478ac6307afdf7b3c485c5ac1b7dbbc0e2754c7b2a83a5ac6a3a4d24c72dcb8c9f75ec0b669405a1b86f7e687e907f88b0b273b0b60faea5dcb0faf420ef7d84349416db0e9f159caad6bbfde4f50b7755f60e621053a67b401cc9ac85a6059e09d839086203cfa9380b744721a7b6f775dca4fa12e1168ef2be567f292462a7ff3555c25e762a801dbed2492f8f849af57d9fe50684b04ed2e1213edbc11f629a15bdac36aa1ab0d796bd9669464827d3e33edbb6127dd6cc00a324db5665112677ecc3e41b7893bbf60b6afd5297edf19a63dfbb33956a8953fb7183fd54974b20c8e87db7de6361ac71871c4df961858e10008adeb530a7e3ea0cdcc37868587c17f93217d960ec4aa769f2940385f7dbd8cb61c677704122c4faf6033fa88a8d28498217a867677323204f89d0007b43e7eb381b2d146eacc64dceb7ca2eb5d6d888c9837ae0f36ed145179fa168731b7b293b0c3a548366600179fae30b68fa6c02d00ccc83ebfeff0e16bfdb04b1971f7ad97861f55f34138a19789fc8082ad87b172d1c1761092253379ad77ca8a42613dd045cd0dfda8298e64e888273397374c6601811f53c9ba6c8fd7bd67ec74b5fa879feb976ae8efc518ea9c56133552ed674563d5434674e5da7704ef068cb0b210b47a4abc8c75a5a62277bda756612cad212e79f7e89a22a02b273311e1072522e4b6842dcf3fa11b458c4205ad83ca28c29d6b49898fac95f4eb0a2c98254546290e0e4e7724a97992a21b01d065a818204f374af1b2e83c2c041b7597007d10782842faf5a9a846b72c8ef84e2fbd2b80b6043bb4886cadb81451646eee508719066eab1d1f38c9296fd92d9284321790d877fa1cc4fd76259cc8302370db043b38aece8a7488a8d9b3953489f09e53435ec4313efa5be3ed6babd65900f2c9baea70ac290440dfdcd58ac9e464e0ab3ebc62520256d6c1f91e67c5cd64c16f22263b3fbba28f0248b00a21c1585fbd25679eec219dfe9f667aa71194834bd37f38adefb08ea4a151ff36c1258a025303a23a3a9698f3d0556bfe99cce97e5ef7e5f3b2243bb16ecff24293710f52b551d44caf565953c81974f0c1adaf547ee95f278fe71810e7e3c107d4b8fce20ffa98cee9d580f515cb89f7568a228109a8338a3f8f12e3b8e5a699bbb9fcfd63ed7856dae882220b59b04dc03d033db14c8eadc6b124b360f30168471ada87424e9041b66d21a627233885beec39fd7b1e973dea949e77ee1d74f1866f581a2ce2d1858345cc054aad88d2a544b4c240c10fc9f5e6187cd49ebceed1c4e3e99171155ccbc34dff6d34e1b4af36cd61d8047b8905c2a9ef7fd9f0a21d595ded2ce5852feb5f6df728a735a56a3ef5f849eb59745af435206bbc3404873645acda4eed271fe11b7a827ef3c7c1477c2e8ec9f250313205c7f3c1f9baa6fc05f73c353008e44653ae20d061201d01b109bd499f97719420d403a504f1204db91579babb7720b51a8a16a814c08542fdbdfecb48952d24ad8f29654c5285c399e18311d7cb444cb5e93075ccd0460d90683f00f3d7b57d08e37946dca006ea66b43ef68d60dcda91094725d576b6a3235383ea159bb38a11f832a767239d76d129f1844c404859fa4242b54bd88eda1cfe257ac6bacc1a644d236962dec376f2431e5b898cc913ae2299bc479c30306f9af36940b8aa9a06b270f35f0083419aa6a0ea8568add26be164da67ea2d930166cfb9fc9bdef3b33a8d660b72691cebc0e67f78eb3771f6cb9ff9eba22e4f1bf1105c3664f050d04fb0d37cae31be901875ccb12ad1bae3f50bd04628eb6e9e0a8aea01ff5cc58d6f9208746ea0557ef8353ca46342dcf679b0bb9082f70d7790dba34461a244684b6f26790e0f11c33627e2453a34a51bf069b727b2a22f27f31083b8615d7814d1763610b04c7961c7e44e2284c7098996ee164c31b551c118a430e1f29b3890835682eb1b5b9c131d6e3716f9334e456aeff04351efe0bb53585460347ecbe2520e6cb61ef8443f25924235c2bc5ab5a1114b182a63b912a58541be44e90d2c1375b701d94029475e723c0f4fa9d32f9b5e66023ba41bf5df0596bcadfed713205709a8445189ef2d1f83ab3c6f48353dbbe9324c576b8b203c19a81ea85ef9c4531fc186a59b7e1b66f2089fdec0fb62b2e3945d3d13881039ef0612be910ff94d9cb1dcf5f1b6fcb9aefff54d6056df6352b4afdde85d1eae47110580495cc85357345ec2cb79c7ac6fa9241c3c527c8668f76d65e7fba0cd2659fa03de252f4c2758161a10df586a2fface31b970159c0b8e06c08db4aa1e97bad8b0bb11fddfe581913a164bb37438d9afc6cdede3b85be2dc18e89d9a8e776970aca21e35c59c7005588b36f7c44b099c2d6c3ed25f6eafda7ef0382ec221a4b6fa6bc73dffdbd1bf08ec2e3e67f320af9cbfabe12aa3adc211b2b157b1e143323591905bebcd35659f0b50531f667e3fc628f9317dafda6956e98f05f5cda5359b79bed7a3fc24b0e9e5235c3125dae7b61e2437b948ec3adb5af141f04e1d78ac5c2d224a3cfa957eaa0709622027017f99e1cffad69d08778f7ec477101513fbfc74deff5e1f6807de4a85674ba8a281a9c1f05e3428d66f6cc300d6ae4d6be5b78dbb0d0a397af4d03be0850b5dc1ea49e5fdd62aad5c33fc8159e0cd98bbe0f493dda147b86a4f7a297305571346bc4040a3179d8635bacfcac214920d5becb7f7a6cfa9ecb9a5f48cc89b9e11ea9070f3103f286a68e9d0906c95a8ed8409757af3376e8186d58f756001b03a397346eb9ab56a41eeaa984d140be974fbc860b60015e8b4e1f26bc9464f09b6a491c7aa7013b68d9cfaedea89bb1ca1ec5eaa98db6ddcdb0eaad5d62275c2af3578c896c3a204cdd98b4b057574ed4248c77c876491ecc805a237633b5e2ec1d93b276f55e7ea61ad316cb8ab11768b8cad2216b494ff110ab910ba09e01e6619190f035118fbb1f39635843946062396d58374626c5a8a646c49168adf0991d3985e18ed2297508782e7040b6ffc0d313fb09bea9072ea2086fd1d6b27a8c3e8db0584c4cf709bf7d92221949c3d1ffc58bdeaaa7d19ec865fa9c564997cdfd2444203802cac991ae325ebe23e520b42745c9be0c972cd2ab28814397d2865576a2cc35b811fea9596000d99c57404e02f6007aa040795fc4e5914e8ded0a4802be21d65549bda4196dc1182130424dcdcdee1c08ed6a5151bde7d76df2b4e395b412c7d1c1deee68c0277680d4afa1249559e77bce91db3a9a70d8f19bcf23f2241b579c434f5e203247ca03f8900ff807500183ffb0514c38347042e4d087fa96fb747426e2f19d23e726ee2858378e293784739ee363611d65d7ed9da12f3c8668e3f92e7aa1b17aa7dbe5402ed889ea8f5706e1e3b9f79520309e46747de0e2b8ab4f2cb96340378c0de4bba329231e5bc38b82fbd97e9e67c2504fcd418ff65ed51a72ae30b6175f3554faa1d441f94ef486c4383cd209536a3faf4f4ce4012dead8602b6415fc88e0032a7f24e7c28fd2940f0bd363ca1c11a9252234b808119554b815859ae850a37e18784962d90bd875f102fe04921a0311ae709609223385b8909236e52a5f371a86e68415ae78b7d8e0c284de28654f450530c349553778465382a737c40e1fff9367a6849876118ed66855f6bac170970bb3f0199b029257068172642f2d95828b6731fd5013ad5709d94736357ab2f841ca1b7ce569dade0fbde1b9a20e8b342a025a6d27aa0decc774d84462acbb02c9f0f1aea441254e7f5462bc963e85567e610c55d0b4a414a5b9d4e2123c3cd08b82fa932018467673e73dab4795503fe3c7ef7b82cea8ae31ba9b7583c501c162188f314beff12e831bfd898dfc1dd9903372a2d22f32ab7a251981672fb7934c790a21ac2ef1ab0ac9f8aed5167010c05a4805eae4064b51325aa6af74e5f986e88fd566237929d9481a2a4ff84afc558b54a1f44ed85cb828de01c6a6db7b8e9f4f7eebb6efe7676528b3ae2f152585a4243d04e2ad85a17ec7c769d1ba5d4fcacfa6c29eeff12e7fb764d06ddb6f5fd1361c54564573e4984e54e1ad8aee853bf35f45133d646e0bfd28566a6b600634382d9f6f60d565dd9a2e9bfb6f9ceba1452714a68b5e2936ab0a2afaf342d680d4a5816ee03e5d7be4019e235e4a7f88f49ade880d53003dc486e541132413e2c7222abc7224b2606f28b8ee99c6a99a7dbd9d27fc85657fce4dc6c418d3a83220fb1b33b3daf0c868e48894a97ec93b3e3c215405c35c5d8fe47853cd4c070224e6071f1b0f319b1f2bcf0146839f59c2a510fbc816cf957a73fb67fae1932aeb56f57502aae870cc09bedfdb7e3b1a42129b80629e6098db54278c64b16128aa869a97bd7d63834ecd863001036911114b8a1741ef0afab6c73dac9923bec19691541df40d13fc47c89bb648208021db0c998a09cc642a8910e52903d84a9cf3d5c75056a2ad0cace218591fd2a1c386c184da8dee9a8b9b9f4b67863d158a4899cf6eb794de1370837641db6c6385364d35d0cec66f59be85147d64c95c1db66c04846ed15d76aa4ac3b7c0a36ec976f2e5344f71ab42d953572b8229f6850f8a98c9301329a2e0dfa907b8a70cb57337aae003da5cc03a99865640723a715c140237f5e16e17ea8051e075e1e4338a0551041b4117d50bdd7ac7efae061f1846e5dcd84dab03cbdfaad3887e8ed6eb3bab98463e29873857203927743b9f113fa69bcbc5e493a587d5fdd88632551fa559c96ca6540b1c83b10f69539ddf793a0d36aa97682be3ba6ab48750e436dcf941ef88391f96b124951f98b452050356f2c92e18300e3675983b81474ab464e78ab42bc30d5545827032d444d07e2b8b1886dfc89fb0ddb0328b77d5bf249506dd8774e6484be3fb0ce04662e100efc208bfe83c7212406f92a849e6195f1bcc122c41412b6e759ec3a0f06de7ad5096514de6fbb9819f47e450ce3f33672463cecd2762c4432c8b4d0e2a889f6cd74c65c9f92c770c731938727336862b772581717e530d9f1f332d2e4f17571ef9b9fc73c35cfde68216fc22df5b099f5ffab510a1a2dc1150aa20ceb6d4536e320690d117ef47d94c89de1b53476e9ee15b227270d8815c37ac35ca0eeb5e807a20b4db3fac08ac60a1d899eb313d2f90d1ea1425eb1410541c5085b011998f49fcf7ecf3ca702f68db9d0a87aba4cbe5cf55a0e937c4d04304dc64ca48a877e5f00c242e364655f722edcdcef744b5b1a462d17eaa54c0dafb1d02a56c8e04b4c9d49f38f4f59eada004a4633c903a193f9dbed13f4b47e13e32af90b092abf390731cda51a785e0636d01cb980cc9a4f4416045bcba76ccb55637abbb58f7c42b47c02c52f687834694541bb73154da9faed940688b674d2f31db21acb2a9bfeddab2dccdc9b485d56b8ec3e8cd98f94da18f99396a1e50fd2120b3865050f04e3c27f1e0c19b106aeba34ef8ceecf8944230f33b1da03a0ad698873e9759484cba4aa4a716f0597071e1917690e283cb790c0524c960ea09ca3dbae9d7a8c918223ef27b4e31c61c043e5c67bb021de4fb1d2881ffcb21f4d6302bc9cd70fc12bf1f27985f6feda2448434a087fc8c738a81343b62669b6f76abf9ea3da747b04d310378025aaeef189794bb4176638434fd454fcc04945ed48f1121794d24e9b74bfde0500f889a5002a29e6c536973a3ab12fe696e37afbf7df94a7920561352ac1dc11650b5f13edc394aa5dfa820805dd87d1eb3fb","title":"24. 两两交换链表中的节点","link":"https://leetcode-cn.com/problems/swap-nodes-in-pairs/","question_id":24,"issue_number":11},"9":{"day":9,"pres":["递归","二叉搜索树的任意一个节点,当前节点的值必然大于所有左子树节点的值。同理,当前节点的值必然小于所有右子树节点的值"],"tags":["链表","二叉搜索树"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。\n\n本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。\n\n示例:\n\n给定的有序链表: [-10, -3, 0, 5, 9],\n\n一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:\n\n 0\n / \\\n -3 9\n / /\n -10 5\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d758e3d84c2812cf0556130537954472458a5a8244eccfe0314098752ef1f55d56fe5890764637dbbb538ee3ea3b0b26efc3b6f7198dbc5f64420cceb8a92503027f6728498a4018d7bba2ac0f1a6be991431c01b75b09f632538146be7c5c7f07cdf4a282953bed37be6a0887ba40eb273568dc7d7ca8af61ec768fa28f56ac248147bbcfcca92f808a73611acb8995e751a753f12a1df6a23445af5a96b1d6c01a1d2fa7a193862b909e95b7ef710365bb862fe616bc448ce9d722d837c1071a110c95371c1192dcf279d9165163fcda1cfb81be8a04ca9f5372ef689d785ce040971f38cfe4864225cc038794814fcb673ced59ec1368d0b206b6f8c44073de293ea1b956ca73ed2c7ac4785c60b9d0764c3c10bbf85a420a43c5e37956a44e4bf2857d9fb0190af1596fc1fd36dfc7b78eacf226d1244d9d5779890c003d0c2a188c6c9b79b10bb5c858f5c5370db83f3fb7b9a9778cf4e585a1554758d951d99af09e212135b5a61da3fb0cdd32436e6111a09689fa74939a07456bc7f3bd6761a9ec28b10c6a92f4fc732196f05b6ba41575633b921d4f11b1ab5e3d361d6a4d0dda87bc90c63062ada6c0dfe82e94a80a3b231c10b7a14d0ceeaa33e0b51917fea3d6e0a46f469c4946c07c136df7897711efa8e09d02462a8b74e5c96c2fba89c767c64d4f74b815099b16a99956746235525806a9b4217d4cd8ae95063a9a89dc66ee05ff2cb0324e2e3c59f6ecf97e5f2ee878f3e617bc08ae4eb385624633b56ee3ecad02a7d0026ab6c3b254f16b593f2cbd3596c27772df35b21689e16c42544a04296d51c24a18a1c3bd8b5235ec5f9ded1e8a9ed3df7b67818aaabdda998d6bdb30172a6084a68321602394585ab9e3bd58f6c1961f052dfe7de52152ee861a66eb9438ed91782f8cd50da5f31f9125702b7b8f6e0266c2f1cdd541ba432c9cfa0883cb30ca1c158ea8b23e45a0c58fb0abdaf3a5eac44bbda921537545bc74770f6cb1160cf8d2781c362e309522d6cfff5041e1a2b1f861bbd95cd57c27f53287cdbef58d0fd678f4419259ade0b9ea0016fb694f36e793cdb838e848829c32df1b68eb24313bb08769615765625e964c10b856aa402e3fdfa234a1c8e9097541c5e05bace97a9e8fff1aee4b9bf85fd7b6829fec0cd50d3014f295150e49033b42334a001b41ddc17586f432b5779b945814f511a39df13157c78c3c5380cd55dffe578d4494bf713fabe45bc1f77e7bd0dbc9cdf233f1bda96cbd650170cd9b0c1f3bad6e5fccde877f3d7263ad625f52c72e99d64dfb58811f094d21a5844563ab45a95b467ed77da8c01927549dde7d5663a6a012e4b49274dc88f613a723b1cdc229d9674e2183e705bfd4a395348c6575efeb334c1b353ff9fd381a8c322f240169ccf668b3d22929e2779c59d3cf21fd538e964ef47276261830336eefb6ecd0a8092731f58d96015814878b6d07d098eb373323c50c7dddec09be7fe118152283905a8e57c9a7e551e8dad0cb47604a3928019c95940272cee33296ceb6d09d1c7f315d088edf62d959d08771812c94d06c25332f3290640c45d5ebe397f482f97dcc663c66d7b3a5910c299e5f650bca0826c491fe54eda3584adb38f05749d75218d64216f677f1db93f77b124c1d30f7b6115f3906babdc67f0b89db5100dfb1db7cc1a371510018c172e654f888422cf7538f36efab41daf640e0368b556fe18e6afab451aba3034a8f88dc5ded7642ef02da449cedbfeb57f390d9f315d56dd16d8dfed07278fe60d7fe49503c9f3e17028b9481605241197ac90cc70473e094f151274078f110f8145af185e3124fadfdf67195c701fb5adac48153ac0f6bf1e0cd57eb18e3493d1ac96f8e6a172acc1e36bfe3db951dc3c8e3f79f5a787a3ad65c7c10321b5fac866ef9eb207d1e3193fa849cc73549f476063e63602b9485ccd527c99ecc8cfdb0fbc2b8057e30fc9f81936eeb1ab89fe4c038e4d15c259e577815e5426fc94ae3a28fa37c289c93ec55e5ce41fe57c8b0ad0d707ebc0a45b4e8c1f5b7b65cb2bf1bfb8877b88ca49d0693539e62a5dd7a7ece389c5b8e2589acdedf2c82e2018489fe81a36bbe40d645c3845777c6eda5606d0cdc604f85d03f1c5d2534519e071f842d7782673e31959b276ab9d596be7e20bf66d4fbb649ce1d4c39c334b4ab023a73589ae4b2a5190505325752577212004e826afc68559904b9d619620a6dbaf33356d06256640cb994f7402ea167f64a0b04a8d8a25e4bbbb9902a31a969f45fee20994d435f9f535107f9fcacfee96cb6056e677649490721096ff7cd470c5c9cffae2ce72825236e044049df64df51db3fdf59505f1301b84f237a1cd4caeefdb6a73038c19be0b82c08217ca79e8d36d301ba55de0633f3a50bd461292d44e60d29182fe1d867586d814017a2d39fc5dcfc3372df64f7298ab18aedd2f5a0f039aa3a42fc77776e1bd91364641c6d2402d52a96fbe2e93cbeae22049e8568e0b4ff9a05135f217b5ace265741a98566ba1524f5e5cb81ec1ea981a4f29bb065d0d670f3e3ab2965a1ada917bc693816bd70ccc17fada31bdfc7de74a55f9f990dbac0a8f89cdaa2d6294f8aa1dedf8f227d9a02358a203ba093ed1e40e7d79833500e166fb5d346c3747112570ef33665f6ea6e074f7d4d7d7f1db72ad84eae6c2e15e27e3a09bc1a877ee2a1840a34c63863d1751bfa8ed5bc5a06c4000f5a4e26cbcdb406c23ca802e544ba73c179c634b082b3c121dfd9ad9ee75a97a7299deac7300761766385d8642dba1003bb196e1bf05f4774bdda6eac9d3ce8618092695807c462df9ef29aa03ee1f39974470487ec98394c1f2218ffb37c229de4ff07fff5b907169665c58daf0ecbf9c0dc60a9cf27895e77d6a3d0aab3e939956e84942449c76d74a2d8a84ce96692046c7f8677c14c01f97a1adae96e0277044155c238bbeebc3b121748c059b1231bbfca9e25e22dcacf0df9faed6d99ede2b9e7ea51bab1488b83c324ddc89eca3d0e3c029e58c26382402e8a91cc4000f9364832cf16ef4d56bbaf94a813c1c918ed06faec28d91666c50d815fd699aa038b0629b25e7b722ba893684f0b6d7fca094dad9b975fefb00d5a68c8fb250864db0b1c01f858c813555e70f271708833f41c35811c0e9cfb928ba46e2ba11916e8fbcb2b869f8a276c3b9f75d7485e428c74de1b3471635790456e5687f510839a337918c190b155904c268c8de979ef9e57b02d8e43ca09fc2283dc952d6d0ed66c9b346081d6b52e1619c7cde9e774dc428dbc1859d169a8ace84cf042800f84b33ec82e2989bc0a1599a2e19df6643e0c78577a4a15e9a69430d9b88cf8cb4ef5254ea30089721ef9283ff14950f33ab9aa99953e580725f622bf5e8256d84c776f74e073ed1e8a8c8c04e49b7650687e2689dd60467d20bf653156d319bc1294d6a55fd0be09f65e584a7e9da0763a67ca069599ff83e1526671c4948cf0c60254360535f646e52cfc47c5185be54cac69a303ea50d520d1f25fbab171fcbb44afc9e6e9fad4e6b8abd2792d30e4b3e7a51cce9ce1759a824e5ab830a248632eb1b2cd9dc676e1341031c0a592c3058a5607824167e420559456941a6056de554b5c9b92d8c94dae05505f73fbb810de7ab98d9cf66d4a6ed721e7e2ab2cbac4968966eea083acac59e7ae3969f10cd12bb0d5dd650449ee14a206abc3756d25b181b91d23846e1332a204fa460b578319821031192400b86c6bebcf6a7a881b35dda17ff1c4c7d3bd23df56685445a6f3b6cc2a9ef2304b38075663b38a80ac13711b8697633c7a504e7f98ab3b292b587b427864a0609e46440fec50e5496a7c9fdcadecaad0b807d5f43a00e73e1a2da979df8e3e98639551d6e8b4a79583f4ea4b72d48ca9792c90bbf40bf697fd702e10c1b9a6920de867c73e5898ef220a32ac4904889df6850222047dfc3881fd946705d689aa366861caf393bd025fc9ef2ce3a4aa77a77e8714eae8a8779f29b6127c912cb81c6aa27b88683d73efee7264e1524b434e0679b739cabec7f0f1e0c869b1e13817bfb581a0f586a00757e8dafd290f887ec8edf7a3cf62242c7db4df309387b84df2e92fa6c788f15dda07aac135c97d8b1bf93f0cf5b766565823424e0228356f76c32e32d5beff80b19258aefd6c8fe82dfa93f000e0f749533794398036945440164a9ad9c80f900a734d7ef15f46745b72e2efa889de6779562c28e211d590163e5634ae7b8b9b2e705c5ce1d46ec225265abe89337db21ca74cf56db02ffa07c09c2006d86c7f64ca23492df74535f10591691ab1fc5f7b8d5b7b4d58fc4106801ca1d942ae897e921842f5fe6fea84a79d03e4556b9382c6d64146b665f3411eab0e8b1d35f7af9882ab34e73c8c50eccc6387bb5b2f2cecaddb51530b6c3f7315f353c9ebde3643b4722c63ac1e09e63f93b32dc76d5fc626f2968dc0688adb23bf5f74ba0a5d6acebe158a63a8025c00b95128d59c7a4cdb1eef4ab651b1ce91f425f61874a2600c1a6d2b54b9514db304e2b509bc7774f314f7af9c8a227c2f6f133ea17e1bcb0530d574774acb7135bc2004600aa0ab6db463adfa697f66bccb000f7b14dd0bb2634cd954d48916affe07fe94cdf8396f3d34540632df9e97a83bc5c61ce901aa338e3041c4552388efcd5471494a6cc2a61fc1780edf79a7acfdc7c8a05871dbe29d7e67e970266c8ae7aa5916924e938874f18fb63bb95064c91a6f064f2b1ea49cac25a6b4c6d4bac5d4f8d60f14ae926a5dd6cd1a289969b60cc4b6b4023a6fde00f1fe7f5fe12049206876c2f36765f03c580547918b9af775f68142e86880299ac947cf093b689c29170fda06fcd7f1d9f883a0a4f0f3b737f4e0eaa7b660759b5f50b31e10e1a8a6280c3c79d863039a6de41d8d80f7e5fa8d2df2e5e53ca5339c9892269dd7c447654216f01771a63d5cd3dbac22f138f4158d0cfd8cb95b36e8d817305271aa9604b46b46cebe781c3618d46e0574f833cbaaf3aa99cbd0887e1db0a774e04d674563d547d214679ab625e9e3a924e655e4da9f8c09b47126f237e902009609ed20ffa9f30dcee3143fb6d314a4d665d7d572d0285e88450fd14c4265cd87a8f962e8fc49999e79d0f1de8ccd28758187690f58bb07226deca7e4fff5943528cc044bc6bea476ad9828f44ff142568895399ae2faf5a9ad43937a6a0c0a7f5dabc006043bb4888cec991532208abbd5c7c8e28afbbc0bba68f96b5d7986c4d6f617ff9648bcc4fd76259ccf7501e018d589980a2adf5418c8bc8703d499e1be55d67e1433ce4edfb65c0b5bd7cd97f359ea7a211a6d51c5993821ce9853e0145e7e6d86965636e244bddf03b48cb5b01ca057fa3caf54b9e50cd1dab11518ffd815c7feb98569ba6b222a43f5c1060ef79a1de9db016ef040661f371120bef77647f67cfe03a880c097b82d9fad29fefb86e41332e49bc4e82e421257557ab5901066ecaf565953cd3d21b594894f55be482f20d9b35c40e6361696513eac024d1cce2a199d3cea4ce1e179af224edb83c458613f2fb04110c88bfc8a1f1440ae11078b63e5daaf4004a841ed17ddc3d7bf9cddcada5ddffb8a4d300dc6b1585a430cd9abe069c8685f85bac70172e0d0b0bfc1b6bd813b7610ace3262b9cee58029d7c4989a4ffb3e1268818aadce90e6901b5198c00b58bf05453ee4e6c44d9692e5e6b87adb394fe2def173aa5b9916b56639a9ca1d407656fbfc4242277a3cbed27f193247e88e1c5218efa018ca97f7f41afcd0b5d33631d490f787d928524507b37496276fae75f5cb80b24618002287c689a698e7a649b1f676dd563d981279bfa8d99325b7fffdec569edd5d3a2b24ebc9808692939584fb86203bb4115932afe9cf384cea36948eb7bb561e003634bf45d0107870f84ae487b427c2b1c18568f93bde5dd4c11fa8ee34f6034183f8c7df595fdd5dd766abbc4cfaa927e91d930125bd52fedcd2be92fbe0d0a26df962a0429962cc52167df44430d74c109407cdd5ab69255ca39284af99ab07f473f2d4a902c37d9d39ab7f0b4af82b4b1c2d37b20fc00b45df0693bb31208353bf5f295fa5e294977cd5df9a1e808250b06540947896fc65de0050fbc9ed396500005db0eb4244ee48a4733e50b3f6321435b387f6b9b597ad31a4bbfa8cea43bdc2c98fcc25ee805e269f44c73afe5eda6ed070ebce518b7f8ab4e3ffb280a063ffcc91764be552b16ee6c467739b5be08ce4229012f4459b8cea1ece997fb0ebdc9ae48797e06ebadcf004056f5622b003f89422b45ed5e6bcc527ba8aadb44ace5a1cd9d2e7cccdb96553cebdc13eb25174b9ee31ad3858adf9d9aa0ad7c6cfba415ccfce82ba3661352ef139279ce904bc42c7233bffe05abf7e97538a410d0db82dafee85b2f3365dce00c7e1f4a6ac2879dec2c0250267b75cf0f3a0cf68fe0e5e1cd6d8db84088a0db647814d2b5150d3113c27fff834f434b434d09e364862b1a98a9f185eb8d0043b512ef87b547d4b82293d43ce9b2e7434f34270687e77461da0c27d9ef2ba156273ffdd061637ae65d5a293f75219c70ada2f2adbc164ed5d3f32018f14805f56c9973753e65bdd9e779bada6484e4077236481ccf1f1754c30afe49609bc042cbe1f1319b90ad4070bc62dbe1abbe471db588e5f62b21cc01c66ad289c35e7134d043e2f12ef4a97da091852a9c221c64a31bd10589b45ba1540d090fc49ed54f9d731103cdf304ff43466d6141065566d62d61fdf11aa09acc452acc63d0aa9fcd376306f1e0c39b11910744d2fcd1b1aa4e2bda71b10f8151679a212023a0538c880cf5e563c0b826dc32db6a9af9d82ca8680939dcafc205d4e8c8f1829c98a1ae7743fc22db93d1e2b4e05a53228b9a8469cd56f341fe8c349a8ae2c97a871d4dd1fee9502dcd50206095a2537a9dadb0648647a2d47be65732591590db45bcc8193872d3dc26c47fd3f3ce23262fdb6bbf5b376394d366d386667f53f5d89e9602bc78d0ed89e11ad31ee3377fc8ca61b436be2f90a7a58740c768df123fbd1593cb12044b934e8021abd3ba35ea768bc8aff70455c9530023b3a180c37f62e646738f5556a231190603cc6e9ee755053b3ada32661cf38fdc9ef384cbbe0a4b97a9e44a1ebcd6ae0e080f45e3aa00d9b8b36ba04eb171d9d080b00d116711393ad30b2817721cb6c809ae5b98238b6fe0f88ff73525502b50e83983464a17348f14d08506e44173699e5f5a3b6f8fefa77b7e9e1d4b59580b1a6dd7d2f676b428b68fbd673a889ea7e542a35baeee911698103b0493eae6046f186b04ba59bbc07df38fece7abbcc398554eec7f32c0df3ccb97d593e33fe65c3aa6ac08d69b849cbf5da5b4ab0fa7e2d2c0c46f00948652a5b491010acc69c23acae21e1c9ffad85437ef28b2e0f615c5e2b71f687e18066c360e6b95141bf550bf4543a8c79ae10ca325e1947cc73ab30291d45ccfffdc8b2c4aaaaf29fce683277eac225732584ac026503d8080e66fde512ea4e8632b5dbc3920e9638fea714834eb1c0856c676a129f31ba67a3414f960c24585867ca25c0f04ea37d45c2ea827b8ced124415b120f74f4a87b0114bccf5b4700c60adb0f2799e830b5e38e6f3b30ce6dda992e645ee988ec9802afa482883aaf6bdb778e7472a2d564dbc12f801695c0eef454b1a1fc2170d0d313d068954bdd966cb05474d93ebb2594363263e47a78c88a3d9bf5d663decfca228ee3cb5394e62a26538cc2ccaa1301a0e16d280fbac411c9579e9ac276eaeeb72ecd5d80f70dd908cd31c5884adbca9bc2624d25f6d16bfa8ecf00174e12a3426e3629afce8474cdcd83e0c5129488740fc0df9982db70101ac57f38e2fcd3bc09cf5d82845559d6e02c9ddde3f718b0f733b21e54054edb2bb4603c78cadb97e8ff329244601ebd5b51a7f978140c5c7072fab3b0a37823912ba5c7bf968f78c579f56f6c9c9a6596d8b5a8ea56c8241ef63688735c047a7c7713f491d4e9aa1ecff9b5f3845b131b1491029b5828c6e641115097fa77824457c2521bbe446ec625fcaf51e9ccbca5a77d1eef561d4f4c874c9884e058f4e871fbdc801c3e1b69a0a808f4133d06010ae7904e34338247d7a64c945e49964c7085eda510e1b62470eeba18b96afba1d842a38a350fb31d5a25292f0971c048a8cefb83260311ffb7c285d8f9713a79ac14ab1f28ac47b5902ad4368f8dd064b195c448d06ee659e3e7aaba8916e90c0e238ab421ebf2352d619fef7699aa0258f07e639cebda7cb1e9cc67df56d18a7fc0a5847985ba0e13769a0cd85ab45db3e65f5f08b7c49c1674abc1b87ce0edd135a19755c2c729c8ff2d6e8a5bf15234823ce03505536f002f45a993af9e35d9406f4438e7187efc16dcfc64f25beb0e9f26a2428f6fe334b4ec1ad794c2ee2ff89b32b9d8821d0bd4a47c4d6f5cfd6babc6a23bc72867597214ac02a490b185432baf35754e187ccf78e2ca7584f05694e671cb07a0e392f250b7c3631d3376fe44fddd320deb26792bbe44f7a14e9ce592b25b57a25e6ed5dc5e491fd9945fb7a553cee44db77071007dbb1bdd584513503798c88f90d4b7f13edc7616faf3f24b2606f36b8eeccc6a8d567f8d873dc8f763aa135de9a5cdcac37028334219ed6b9ef5aa9d6a48354db3431226e4e01af4b11d3b76f15ed0b191223a3481d175456d25b2b925415c6cd30c2c90be7d32c8e837634e064bbace32fe457ae2f2bb0b724ef0fbe9ad0366f57064992c0629e60ca9e0072de63f73b2fa093c5bdfd4a238d5babe0535654693a1b4e8b03258012eef69970fcfd35beccccc2062bef1414e60ecf90f75711fa749940d0c913e60863da44ff3402d8249df2c8993e4aa9ba58f4a63c550dc2dbc2a1eaa4c9cba7c9dff5d00f22c4781c8b07938336b8bec31323d43711ab2d7c92261134c78adb4f42e4c0547c65d45b0f874604846ed15d76aa53cea6d88821857bb9ea351724b65f974e5e2696668e8c0fd1b2c930137be7b48afb49b8e949a3681da0f74891239372e6993d5e137279597f6c4ab2e36714ad887b833aa5a129a02f11445b114eb70dd07f94a1ae3d151557bc8bd946e97dd0f5aa97cd388e85bc7aa6c207777bd430046575333d6f820630e2d284fbf985b585d3eac9fb7d3a72d13dce70b67f1754c6bb29691dd29b3c69032ca5cd636cbeb339dbc614e479d3d30fa0dc392381b525f51e99a90c1f504be5c93e0e12472d64ad30c91e3ebc32a2c9e064df54445fd673349c4fde7e609651dec2accbb08ee473d92391fa2c9f5c938762f64156b88249ac006cb257ae9231b8a166724e4f789efc59b55c420181312c13047f3b27d08dabfd75a5b3419c1e67d1fbf1c4de03ce7ace767d33242e87db622b911927c5474b7fdce678d65e1bea9a287c1e105d7c643d5d943f2c4cd121543f44cc4b5d16384f583902eabda603d05ae0e18a67b53fce6246af48b5f036aba7dd101ebe4e8be5af1e6e307b918278ae03d95194de5506596d81e1043c62699e9d196be86b9b12fa43901674fa8f05b6269344fdc4dfaf262b77c5d0f0553ffa5954027f3e8cab3b99e300afa382bc8e676a27c9d94686b6e39eb1870de1fe63bc840640b041d04f8856c8c73d26602a4753eb60a9809ab302f7e3e63adc25aa559195ca3728a56c8e04d880d58e02eee395a7f203ae7663c5755f40d3a6a3362f2af33127d5baa7983d207ce5d139dd6f502d988e843a6642ce9090c0a395b5ef5c222dccfe1863d9241fb6ff41a78d281023f9be3653f6b39c03106603c0b472deb7dfbb14f7780413764d6824043c407a701efa6f422813504eef206452ad84a1bc60b7e90412c79109ddd3cb3429021cc7beafbc0badf5a5bc1bf4b63fbe77e21b4daebee663a13a2472dc308c27d470d1bad3bee97cf590ac8e3b2c475fcb3eb735a169aa8db9aa96623e669d491855e756abb0dbc2d95b1f42fb1c378dcef728d0f53e13cbc267f310811627926b63c0b045980362555627e0086fa1a1a18009e8c83bffce324bf7124f221f7e2974add73f95b48643586d822afa4456e5049a72d79c2d2e7b49ebbbb33cb7e42b75b6d21722d5e372320c48f6f21ca62e4258fab53cb17600b5354877f15dec4b22a5997ccc5d329d9cf63e1e36bf6459bed552","title":"109. 有序链表转换二叉搜索树","link":"https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/","question_id":109,"issue_number":12},"10":{"day":10,"pres":["链表","双指针"],"tags":["双指针","链表"],"whys":null,"difficulty":"- 简单","description":"```\n给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。\n\n图示两个链表在节点 c1 开始相交:\n\n```\n\n![](https://p.ipic.vip/bkdl1z.jpg)\n\n```\n题目数据 保证 整个链式结构中不存在环。\n\n注意,函数返回结果后,链表必须 保持其原始结构 。\n\n \n\n示例 1:\n```\n\n![](https://p.ipic.vip/bzw15z.jpg)\n\n```\n\n\n输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3\n输出:Intersected at '8'\n解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。\n从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。\n在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。\n示例 2:\n```\n\n![](https://p.ipic.vip/26cojo.jpg)\n\n```\n\n输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1\n输出:Intersected at '2'\n解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。\n从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。\n在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。\n示例 3:\n\n```\n\n![](https://p.ipic.vip/2tpyar.jpg)\n\n```\n\n输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2\n输出:null\n解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。\n由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。\n这两个链表不相交,因此返回 null 。\n \n\n提示:\n\nlistA 中节点数目为 m\nlistB 中节点数目为 n\n0 <= m, n <= 3 * 104\n1 <= Node.val <= 105\n0 <= skipA <= m\n0 <= skipB <= n\n如果 listA 和 listB 没有交点,intersectVal 为 0\n如果 listA 和 listB 有交点,intersectVal == listA[skipA + 1] == listB[skipB + 1]\n \n\n进阶:你能否设计一个时间复杂度 O(n) 、仅用 O(1) 内存的解决方案?\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347481238a04fa3ead0b547d2954020e2d18310ec8ab1a6ec9ebd627f465eaac46b8280bc2d829199fbe23f761a0f8f223fc3b6776d4ddcfe70c31d1a08a89547039a97280d9b51b9179b52cc0eca6a8c0552bdc1d72faf1446a7247fa4f14415d9751b4cfbcbe22aa14b6fccbfb27c824afba4b4a510034741cd849fa0ae46ac9601c538112782e3392d64c32ede6ad361e2f09a5bc684b2045672eb2b7165a774ec0e99104057a3a8458965038b83399b714d13b0e46aa0de7c7c1874ae4751a957da6541a59a309c2eee7bc335f36823141729a50ae4db9ff31041a0b6b4192066f34c6fc4bc1a181e1c12d4e4a3fe3b664eed4b2cfd426c3a791e18e60243fc39fe830bc6ca208d8f6b54b9ed305bf1c66d1ee0981b5af2aa43d731ab26cae684df2fe58b677a4059a69199e2ee6f54966eddc196c0966d9c25599aada02d1f9ad8bc8c993ae128d6a8e8b7a5f7fed8ed9cd7bb9907afa6c59612b575784982f94ac33cc152555595ee53888c2de231ce72b3c096d9ba7491ead5b72bd4d2dd8651397e28e11e7ad2e60da38014408a79841616ef76ef45f07bf1fa2d73cebaadbd6bae96fb75c616377f80378f8efa05dfcdba042a8091f9c63cdaab2f77453f420ebbc83bcdef46bcd9c7d14c1369c3bd79db45c32f946461cf1e7d4f507052a2eff2b35e3400dc77ef61d4a921210bf8ee9b448a343b2029e165f84d06662bd8993ec6e0cd83c8b879198b0f3fbe0b3e6e996b295cc48520b9596bdb80a18555b530bc66c96e562370247d2415f4c5455d39d7124b86d217b7c449275483796449e3c11f87be7b53152fb9d6950e4cd7e74a2bdfab8bb9cb66ce5f63c06c8d8f8f602bee7a16e18b771286a757e3d4d018ece2fa2d58d44d020e8346d40f34e93c0b745f832ad2105701d84c4228909d79a52d7b6d37a5f0b72f68ef3ab5dc2b94aa6182c6a46ff27994f5ea05258f95bd6d3b036b81d27d0bc41cc08f08c6148551b9f5d0f101681bd191afa4852991283d281ab5d5dcdd9ebbdd161de371b71f96aa9c48db5407a880d6da35ba082e75d168939db05a0063ac848a6b4554b05529e03baa1235f2a3ce4d413a0b079f7fa9ce820ca5fd02e2af52d9c5a1be1c7b6ebdece02420d50f59ac7e1e8a7d8a2c98b7c379538736a9cc58d04ca5b330b310dedec5f974c508149c125a3ccd4a7dbbc446db99311e79a98a115b7f4e6a8230cbebb6eef43e46ef3487cf21ed2a545bc1f77d8bf0dbeb3d3360417dd82c7ed471a1ffb754bbae3e6b594ee4377f2d52625db2be21a72c7bb6ade8c8209de7b64ba9dc3fdfd3afd7721f022eb764ab27097c855e7b975fef29b371a5d2b5ccb976d2e7104611eaf215fc769faffb81bb560fec8d20385e6353eb61700ce3b0479beff0d8299ca61e5dad4c030e6ce894420c6f341da678828a308cd31424100ee356b94f6c11b92e4ce615d3ad10570ba1e2b91b9041c3d14da5b6c77aa86d09ee7c59e4ea506470467cdd82ff6571466be03d91d125a95f3ef2c883e54544acca82642d36e35e3e2c9a3dab4cb1fcd771892f1ded912498b0bb4a7099ec1e53694b577b786e2bc7e100cee75e990e6d38e270d3851bc3f400490caf08243ac7d91eefca2779771e6c646f0de88f6a9c0dff7f4af241670a3f184e16e43c3704fa9ca9e87ba02012fb11e7981b873739645eae9ccc73608a51bdcae4bcd5621fa41fdddabb01aca37960f207fb8bc22a0fd0e4680feced55734f02db2e525187f7a9fb9e144b1b6f454e27b1d50accbebc64704ebf876f181a85974e47b516d2c7bcfb7c0ac66255318145f2a2baa28d76fb225f61b126f209188e80c526d144abed7fd715676f3b3ea17b837ee374947a582f3bd8b8b8505f1c58601d067e94a54ebfb0714ae8ae22bf0d47b0ab341e6d88b12cbf2fb0e9dbe106ccf4ca82e49f20077fe3dad95b24c7dc3437b94fac6072496bf09be9238830c4288e2720c63072d4611818863f31ea06404faea46adae2e84ac70e0432d727dd4d6622fa3a8cc46cda4e94c9af8c13c75d174523a20d14fb6ac0b57dc25c96bf3ae88b6e53e5bdb95eee2a6d95d5426fae6a16f19e96a3703c3c1796dba56e3efd6f02a5b0108da3a6be5abbe3572899cbe9bf43c26098f15ee2eb1578971ce2e55b3668d85ce60e3d2e9768fc859d7797c037a0cdbdb866ab618b84052e2aab371d5d2dcfaf8fdf6ddf979f8460c57a913da3d837cc221531cd1b9d0c3457e3c92bc8dfcfa088d9e89264cac0458bb3c2b355ca167947f6fe24969cc4f7ff67355e7e0f05a031b7b672ba6e741c5c73043a6bc5304a75a9a000e7063355ae81581f277849daadc5cdcd62d8aabb158be0d8be063e06e200488aaa6421f60b16ce62a46763ed943882318a7cd876c9a6bebc8f4c737a9ff4a13a3985e413f1bc16afc7f15f6d6b37f58afd6050d7212880a37c0cb2a0332f793a19d1477626cf13efd37279905120c97a683d6da83a843f957594562fab168c70a9d92273cb0e53ad8682436d399a100c0b471c881bc9a55f85679555f4723e343410b6e006357d98741f56f72e7094b11ba0242dc9c2025f155153cf00d1cfdd9d95217a6d4f086e3344694354dd7682777fc7c2fb382708917a6a9342c988f95a9b3ca14ee78f3f0f4f1cbf6bbfe2fe8f6c7de6113a9720a48326d77fb53502c380a6696933b1b6d84a766b94c188354a60028f83d733f460ec8413bbedcee9ec7e225e989212aa60159e8b0ac38ca8e5bcbdb9bd1fb9a8c67c1bec439e02960ba8d3ceb90befb85acab11ca2b69938e711721711e905d5bddbaa485d195864b0969c4cf384869bca66da503ff1f78a0441e4b7fd88d90cff17593fb379d7c9c65942da603fe6d666a046a96a3a6b187669a039bc578c6fe7b750b04fb66d5837c30cfa4c471c29f43259ddcafc5e0ddbdceaf042f40f0501e67223a630eabbec0cffefe02714fd9b33a66d0189b0931c1bdb1a3d3f64fb7caf55a7a314b753065d265b9009e0f6757ba7241d5f092ab91733d804259e6ba9cb10d75f0cd041a8077fa2afe7bd1c727c9ab1bd4241c8d94b14fd789c491522e179147801dd5f87d92648c34859f3ea39423a29cf484b9a9f15a2ae7575a2de8487055046bea0a95713d6a821b1607fddb79c7a9df8a13d7c01a96d76a620640e9338e467cfe76ff4068fcd72fe3e73a1b335699ef20239c1d08daee045135f8e4a028ad82d7f69125e55e05b683f9ef9d59c360115b739a997a16ddce62f1d98783db20d04b1a6c8a441780fd632f10a5ed2faa535ebb6bc944573d7d35f579067c78a467670aa3a48044477a345d1a527bf8685b9866985d7a19a162c77d973bc0e567dae080fad81edc699ece2aa026211d5bdc4e575d217b4450b4091688f9ba8e2b69fca44c5f857f99daf15044260235cfd43f6567872bdb0349cda651d252d0cda8a00b66342c3ed02cca2723c7236b467c32a0e5498633cbc14775d291caaed0a1ca0a94ccedc2e890ffc644198e5186d45f03b2423463fbde4655640398d33d378dbd0428e63a1dce5912cbad565eac5d59dbe1cff1bc022138ddc44cb90a170bcf972ef72e9de45854a3f69e39519cc28fa6c89561a899aef1d69a9dbbc8bfc916cfa567805e445ea61b401f7ff1f171d12b5fb7766d2056cf07862011b8d8b3e7312d00540ad2e10a9eba0e0c1dcc470268c75e8124eff77497e60722b8cd0fc2fd9811d8cbcc564f99cd3bda085943ab77f1655e84345b50c61c42848af29685e2fc89ba5d875dab8c938bfd34ecdbfb2df092eeee81252769cae45f16acf7c5d220e65893e458e9d0892858e48d8384d1b892b1d486e36da88ec42aea862a840e5496627a114a006636c55aed828a0ad0bb707c1594273f757242fdd68cdd06a695d48fec0f5ce736a4d8b74aae188413c1ce35f661d2fa19aba1312cf459b8a3a4a568a32081de6519478dd1fbfe9a7c59d335d946391b685f25c440f056a8dd2aae647a7f0ef6a43ff7b258fa881223b5e20409a9f50d98013e0345cb2378210d9c0982680b1924ae34f576c53dd48c873b2556ca2a3cd7a129be4bbe97f6bae887a8fa7473f88c9ce9be8dca7c3ab66c49cac31bd906377b4047aa5447edb13c8b5360a13e81c05122592b7c664584aaf6c9555b3cf448a97cf46f31e3e9c06c3f8bb87db2d9d9b6f5da9acc42407d0f17da773c59b229290504187bccb6d9c9f917aa2fc1e146b17154ca2e5dbfdc95ef6cbf7cccc73d0a1c1328e56257fab8f7e7ab49ccce463cbe67186abaf1c9768265ac5a8808db02ffc17c14c2616386cdea5db903cf81715e53325352dcc14c88a5f2dbafa0d5cae710332bca1ddd6ce8d6eb6083221ef9bfe65f1b9f761650e646793f2a14097d75341188b0f5e3f40561ee9e7ee62b6aa7bd4b98936a35b5fca7ccc982da5b3cb3af8952493e6fb8bee12f72225ad23fc5cf8760872334ed51cfbb6e6f68269269dcc4fc6fb0a518e5a8cda1e1a164a0398d79ac5fc615a65ac5ef9ef4f4e5af651659ba277f43579a716a168de3cdfe44942e86393f01509bc77706774f20f4d9b631edf6a261ae3cbe909c137b212437e2f634768658412aee3f9af70c6addc980ef78d1e36ef1926d9ec5457b8395162f806fa1c07ff9029bccd2b6d93d126427d8ea20c6e51977cfd964e67c8f4d18596f3ba98fa9073d9cb1f94d2ee3788aedbfdf3b8bd57c826ac253b06099b53bc51f2898e77bb2cc416da771e94e09f225e7c1160adeb8ab38efa6e50de59b16734e6c5cbe7e54a760f14ae926a58f29cdb29a9cfa339e197740268ed5be4525edcfd97d26da43c6287e1c380a4f898748625de7857f172d5537ce8102c286e02eb5d6d8c686d433bbf328cc6e1d95ea3510553f7c59497b42a43b35522afae20b7eaf481a856284caa2d4872103bcc84ad2901e7e5286c0f5757453ca5339c9896a2cd57e267e0164660036431cd88732b6d67208f7040c859dcbe1dbe622c18362036962cd602533d800f0cddc85689e52a43201ccf33e51b05b69788f016c36edf5eb9edc7e7c17597de7f1832b869e35f17bcdd2fcce722d5b07e016486e51dd3f09479e1586605687482be2a6749cd68fdfa6d3b2b9296c9086d9159e72c7235a1d936203d62513657495e30c1ff6cc4066ac9ce81f848bbd72e24355b9fb779ddbd6480b8235904d93d8220b46b134a6cce463af82c523af189a11919163084b61593b38e38543c744ceed9a0dc185827661cecc11af597d5c2104482c11121cf885c59e9271fd87cc8b4fe69d5409c4f7e32aa57501332860b55b1a78c1fabd7f854596f03e80971b187bdd3d3e75b011cbeb1c4b092081d5d9c420825de940c4dec22d750f96beedbbac56bca3b3a03bdbd538858f7f780dbf22b869907ef6d00d5e1bb79d791ff7753b1fe70caf95a3fe75b7668af2ae831ce78bb167a4b8fa6787a9f5bf188364dcbddbaaf1eff2447b3027fdc1b4d88f20c30ab0026cfee414b69198a7697da322aa4e0be3c98a7c3087080401bb74bb7ecafe918690980933fa596740abf2168db3ac6631cba0088ad7381af73f43db233b00b8be0d5379461fff11548f315489f92d5841c55bbe3e9f977f6715d9ba8c8d97f9b723be3104e2c9138ceeba75f481ff9764d9140e5b522b6ba20833ae17f9241a9389fe311b260997bc90a1cb05d3514262e6dcad90e5def9617bd8b92f27c4271565e08eb545d6cee76c7587413e52c6dfd25ea95ba515a97539a8f61f6d6458eef144662896ab1d6c9897be8b26da204059acbf51cdceba9d19aa5e6c46b4c2141e6a6911dfa0c7941f7496356d9c713c69dbeb6b9fec952fc78bba98e49c8947563ad31d73d3169539c9ac884acae0a0955bfc97615a742bb78992e2cba7eaeae5cf5930e5757173f5e1ac4a7dbb4485ecc885315d0f69961d46e2277959d845e2bcbb28f8b0dd886adc32d45be804892e028d49c71f9f9bbfcf1506d915b979f2ef74b7eb0c8554be5c478a10b5e7b2edacabbefacd3df304ff4bc305f5fffbe702ff9015def2499b4b766d8ab5dd7253c7b0cf26cf6139e5cd82449173b42923ea8da982333558009f66a7b5574449c34364f9a436f74b0b704315351c357dd0c65de5248d5ca5696f8e7b86eb6fcd3c5fced029b2cb000142b0d85647e055a6793459b8cb3e291eb291d67d2c7627de7a7649d79942f34f5f48820583f24e77d343a340fe028f74b927de9e2cb4d149632b7f670969be5809f6703e9b5bcb0cd29e1a5ecf04c2ee8f18d749e227d181b660ef0dfb3480b6808ff0a5af008bb5991653116844ee1e8dd724c203e87b3a11b7742c6b73c854f1eb828bd84b180ac753e497c2168e5132d6208c03f525999cbdbc4fbfed8cc6450f9fc9e1fb243f640365bcc13124b97d8756a59e27b5c6003bb5db598c879f3f298fed60048fabe147f7136e23212b95c61b1003a3ceab58807e2b1b17e405d4f8ae215730518a28d579a5e525153327d2786c0fa7853f867ca17aa2ad9ed6c72d6e05389683015446103369dc1b1f7119da076819c3070eb1b25184ced4f90d4373c9c210cae7de726f0cabd16d6b10f130dcf5fbc41f84170be03a28e5f16bdc4c3f320163a1105f2a86dbadb67e9e402cb23c30213b7222183405e7f4878e612748b2b8d203f27319da463272269ade0dc82fc976f8d18049ab2f891e32a7668e3c04df171bf348a38bbcb1ab7de32be2c1687147c19a1db92931d66060ce2aac422bd9df468cef51c7d409083df72e4ccb118a6384d6dd9ce5a933f35f866db3080b8cc6a2057addd481002807660163f13941186b6e912266faef353291ee75defae24bbe8ab0f7bd151820fac8f9bed631fa4ef3b73d314d49306a6a11180ee98bd5431e9fc73b59dc04acb82795b93d9af3a38769bfb8504b82401cfef2e07b288b324bdd067c8c5c33e16f76a70876cc95c8b6b5e646514aacc79b9fac9928a387ec16aec279c62b6d2617a8db0baabe72e78730b2ad03100d7b7cea954db0f5bfa39a35bba27137c491024dd45649fb688527f6cd7f487cb884ab713c8efd9dbb9aac0307e6415682817ab19253f757a09743fa21b123b41c503684a4c348b1e18caedd88d8308ec6e0a26e8dd2b59a4b92b569792aa690db57766ba3c6873c7a2c05a9ca232633759504c2f3d2933f74212f71ddb03887130ec960e940c7827aed80d36db38bc7dc6864862a9aef3ce94e740a5d54b67901cb620ffa97908d42cf99b67a28ee3442b0c8a8b52bd7efe3093c3b37491f6c19983c1029555f12176f6f5cc5a7ebb4ad0a94531386771c10a2def4df71540591ac68a717eb977db5d7376f32b01c5f29941cf415b704102cfb05ca720277abc87d5a7de4a7f58828a3702fe72a43e942c0021d25d2917515dba1e990e936a7c0f7ed8ec0cba7286107fd0c4efe44503b372b8be14b428fbca8dea7edd1730e605aec07982e7e898441cf88048bb93f9c2fcc3296c18947b87be539e681e9055d7e4e2b716f786d1737996603abca2c3138c194596e0c82444f5e96cf00ea45867cbac90c5ce704c3242c9b5ea1561a03fbc8096d9c7fd0282280d27aa0c6dea0ab9a3ba6d340beea8b2f6658c24330e3d8f37abd39a5dd5a7e82b8277c65ba80aa031f1b88e028e18db97b4a3de72f5c47022eb6000c520c0ae81d8cba60202b43ff5be3182a072245f252be1c616043e00e381302d5177178565148da1abd8c09f607770ccdadfc6a6d1d17374cf5dbdcfc8bf9214e1ac1d3e24c9967a764470e95367ea2688ef63a645e65d2e2fbec781b8359b1dd6933f5f943ac86f2612c99de86dd4234aeadbcadb6202eb04e476af9faade41273f03426739929b0f9f16d367940a593e7b58d3bd03391555dfb74c7a210ce323cf47eb36b4c1571b4f5914db143f9b7902c71c66e0a2d21af0a09f6e4b14611c787ada87e100d85f0e4d24d4c00070bf1ba25a9029ca825f8e9b673a8ce028319b839fe87cc6beff6e3caa559f73dc34b28d444801f1d17d678c317007ce6aaf4d224f04e7d7555022620f913da3b0466c3b4e2295265878e922fece3396f755f9ab934fc0a1dda9166a4889f40094d1bf960d5beeb7dc5896e3f8262961f96ea03e5c6b79d1388a773f10af8c63cd9eb","title":"160. 相交链表","link":"https://leetcode-cn.com/problems/intersection-of-two-linked-lists/","question_id":160,"issue_number":13},"11":{"day":11,"pres":null,"tags":["双指针","链表"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。\n\n为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。\n\n说明:不允许修改给定的链表。\n\n进阶:\n\n你是否可以使用 O(1) 空间解决此题?\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d71853d84c3930af0524c30537954472490514debc96472cdec9c7be126a0a557be330cc8912f5ad2b362f921bda5ed33ff3c666096c78eff002dc9a08dd0517624f030858da2009b79b02c818dc9efce19a40feee6784544437c47fa453d4e51995fb6c15107b3498d393a4abb8370e335134b57630c1370f148e0334cc420b5637ae507d5e38333ade74d1dc1e5853d1d0722a5847745e8207647fbb0571d4200a7ccee782631618b36eb5668f41a28598b4ef4546aca51d99c5b058f712773843ecd68702f92a3095b86c9132b7185afa3ef3a95e26a0d28a582f591ca87d51f0b68d48fd9646a0c73cc365f491ce0b771e5d5afe731902f2f71688c742232dcaeeb069f6d8a2edbdb9747b3e504b52c8b4149cf05e8e538c1415f45ff432eb29c9cb518338522c249959d54f622a2750ebdd9471b0a2e9ee304c0a18858fcaadeaab5bfb6d8579d2bd6b3351d799de2ef941db7df07e53311776b084de4c830cbc316a07f16343e5e9e7bede6b963009d5c33533d9eeb1723e42f42fa0339b2323ae896b861b8925720c3b9c8a48cfb8c26f0fa33b83bd7d1191483fdd145f5a7d3c4a87bc90d563927f3420ffeaae66f9da08605cd3774f8527c2d387b7552cb22d89f82b2d2f644d953b1e1b81c1ac6127f1fd58e00d4c7fb3b7f0667cd9ae4e829c5ba0ecb9e26be30ec9f1edf8921182e23b50ead05ef19cbfb82ce7662928590c54b0eee1c8b530ee0e4dc9f67de9ce1fbe9bfa7fb0948abffc49fb98ea4ac9755f3270e45b675262eab612127671ebbb0dec7cd60613c502fc5642260b01fe420469e6b90d0282aaf8e1c32f5be27685c3d3514b6b48d60ffdb3f21e2d6cde5c6e0d6da2813de3b2b3b1e5f453222e3aa11d4b5a62f4c4f8d0fd1ae89637d76ca05ff4af7129fa47dbab8bd598d0b30b1767f6bda879a813b1b5c34960a3ac056f3454ed839e350b5aa38dff767cd3146529e5ab9ff5463e52096a1d549343510ea060ffd91666683c837c8a64d79e51a03108ce95b5a3e54af2a1ab79bcc55e97d78137cfbf959ebe4678a761607b716fb31b119acd1bf438d092c89c093ea34902f67eec6c9843648be86f06afc99e68923d79a70ac27f3329f6e3404710f81939a81b0e3dd2141a88ff9e88c6b6f3ebeb3fb794537fff7c851c30240127d9bac9459f33c64dd1edd47e9c38cfbc9eeeed77efe1486ff96ef7ca19e8cb14a7a90dc30fd37a17eb42c46bf63f0ff17935e32dbe072aaf1841f7b6fece6b6fe1f503da7faf4b1e7c5be9eeeae11f0bc5931ba43d95508dadb3af2c1f721852254dfe3c490b7308c1705a376fb1f1ca427ded218777ebd90c8c695f88e9de90213d4fdc999d84c8f490eee3281d6f5837ba8bbd88fb95a3a8da079a6aefc251e756e046ce4855c61c4e111089deafca64c1ef3f146ca66a104ae3ac33e615001df1569b0f204842ae5ea639957e84515b85c7e8bd17d3a9bb57a3ddee96b1ab9dffe9be468e44355631ce74d23fd791643bfc657ae136bb2f3ef2c883e54527aff4459498e04248fbaed74b0adb49a0efff21a1c7d3bace16175ca3fc53d096dcb5f5d9d3856592d8de4c571e06d5e225a20ea99e7f55e9da08c704c1ffc46dc1896a3ac870b66b077389467035167592355abc874b685ba1f140a1cb5ed5fc18b4a77573139dbaea074aba9481699ff6d8140766803d59161a3727d945892eb1acd04116e3d8b1cac049bf0992d539a784197a8d2ceb8a3586ba71dc00de38f9a8a096534d46c46fe1f71f796863341e5cd4504edff7cc39dab7a68e66d54623c7dc0bffbac7e185220285e3c0b6c8258678002f7323e6d199380e92e9de1752ca241132d4e38afa2a063a65e7595a4bc7d06236a64677d95286853a203e626d027be6093b46d254f01f1cc4509bb4bebcca910e9fafb0e9d51c3b0439c4deb861c86bd8d6d95c6e54a16836abe767b4e4e0396be0c9757ea3ec8f12634dc87aaafd84c3e858448c11ea064c0006747b88ceb433727d84f390fbe26311cbf4d6ecc6f882135c15a6b6d3e53fa75611320d14fb6ac0b57e519c96fd5693539e61c75d69ac9e0abc35a623ff8f8b0457be9f3afcb400e90aa5ae4277552384569606fde4c07e1c0ca36d05f3ee3c5d146490ecd72c445d46d0f7ecb3cbb2dcd322fddaf372d82180924be34e1d5bdb7aa54084910b828e50a56b9b1ad38d889c6ffa8fdeb896e8e36d09ab03cd96bd215b4a8213976330d6005e3fb37958503320f67f5e5cca1835982941ae79faa960d8a12b081e93abb509807bb33183c0150393f22021923d5fa22f192794cf19a1317ac59994b4228372612a9128bbb3ae6d3f28b4e855be731670de826d978e273ac2a42894e6d66e5ee852dd66bf7e8bbca3cdf6ea7975c3a47a557ef2b55385bcc4678e1d42d7dd380fd8613c67d89ca7a4c117f39f212d8db212c9a5d0bccdf57ccea1a0e530d9db2ae64db7b78ebb482540300dff1407630ec2eb3688ec3a3ef244ca211cb015eb6df5e51a01cb4b5fc305e54cd4862ee2d5d501cd672f8a3861e0e0ef842564201697761d8810066b1fd7edd92996bdb428f1ffdda6af5ca73ef1301e4f79797fe20d4a3cdaa3471d6bcab1bacd0bb6990ce385dae4ff74c38d1f30f4c6ec03710a546a9246002344600257eeb21765673fd8231b690ccfdf1db3e8499b9e1e0e14d62fef09cd7e92ef5485d01b01f00ca781759f9e9be0fb6e4255c38fdbefa02f599053462cf9d73535aba2c17807e05193d753655ae8980ab21b5167d8bd9963c59334f2f6212a20c9ef95435ffd3b9bc56973b0eddaee9cacf998718093b8c83674163e79d7db129ee1f64bd4470043b9dca808eb523c6b57ed829cd41c762f44abf7763705c5bd9ecb2b8ca17a00387d87895b532256904e77bd5cd56f51b43569a2cd10f3c81dbd5ef256f11cee34d7c149250d8f5fefc9aeb3c6144537667cdede390fd6e23824bde4a65b7fcfdf55e3d9ce39f9b91bdd7c9c3dc2acd25f17eff0fa2e516720d9ca3c6c991e8ab2986c3627d3e28c2e95c844a1e8a76a972bd7fe8d56587f35e80737fdec0d03484c28dc16e041c9156fd1dc8e57d8c688b35b5aa6da6883f8c87d584a8d4dbe5809057b8f213c1e2e9a8fc5bce6bbeb18c05f48cc17515a45f777422c22450ec535598f4c5b338a24fa8ee208d7996abf4d46efeba5497d7b25d7ecda169d101b5bd3f58353d4256a874267c0566b90c9284551a215957da0786c5edccb0b33a3ad4b71c9c95c30372875483c6ab28c1974a1a0d1e37a5249c34cc977a0d81449ad184a159dfd2cebefb210800a33a19ec82e2989b89e7519b2d5893351bb889df70a4a3139278530bc7da8091fae95b5dbf144dd965e79b8a930f830f08b690ecda40f6c80c5f7f2bbdad6429889460fe4f5e7782bba5dfd50211c8370f9cc8689d814c2e9e4efe56016c6586c077186c19aa09a5c137fee8e6ba8e0970c924f46958d0bd3e013d65157c17a3607b0f1e4a131f24443e849dedd53578af295054b8b548f3c0bde16aa9d526f150304ab29eaa073787d84739e94d178bc6ab96855c5d249aab5ef86d3245bfb44592141b06d4dca1d985fce6cd8ab3ceb2a007f7aded8de2e50178085048d67d25a0fd731735924b1d111a9dee14b6281ce87b119cb6c7088fed880c13316f31002792cd50ee15a7bb3d2c1ce556eff95c9918a0e1fd6b98d311cb32abbd42f0b919dbeaeb5646a2cb10f4e7f7ae2d8a19f3ee46b3b79ec6052dc281ac92393b044831e54fe9258ea497f31fc9738a08a8e2e0a2db00441beb449dc50d2e6674e7837bf09975b6a5ae7923f92261541a3478671747853d8acf99368fcb2d6ae1f52c62783b400475d46e1481abc357cbe51a59516e6b48762504c19bd4c16fc994bbecfc6039c4b86272764995388b1cecce0beb62cae41d8c983123efb77f274b5d8c2cc06317b57510bcb9a6d4f33c7e0ad863e2b4c5db5321de42d755a9f238a373507014d8a51beabf77ca862f2613b01c50fad946fd3ea7ec29c37c161e79f91e1fae98aceb60cb8b09867dd42b2381e1ada54203bed719f1fb491315402fc69f9817497add704c430e12a862f2a9ae3247c862cda0ff4252ab98f060bc17b55f79a3f8400dd8c9f02a6b5948ac863dad43deba3889895c32c59f2bb2e02b60abdff85da0dcffecdf9323f599ca97f051abf38534a4a0f7ec95937e333d3a3fe47d51aae15bb12e1f9debbe5c88dba724c12b4222d686aeb343efaaed4a7d3708239868c417d316f79598707846bf03a530f2229bfdc74f0cbabe54002b89dbe6096485356294bedcf1b9945822892632e5d1245c344e71abac996adb19afe2d48521d76302bffee61b36c17fd0ae04db9ec5a38feca1c4b9d4431d207c2d07e92469ec71803d872aa7610ea7c0712a5246081cfa1156d996ad3187a8dc1f6921aef082b63ed84c3e7ff50be2bb3284664fb2e3c98b139b1ea177a64632e20d23334a694d932aed59b7789952ef47d23b0e5b5b396541a25d7f7ed39dd9be76f886e24972097e8a498a02bda29dc95d54c2888bebee311f30f402301ffb66cd703471bfe0f384ba0a02b89b2783e4844fd64cb12f678fd4d472ab1724841e398d092bf7db451997a57aa7740d916df46ca9bcfed35d12e0d0186eab5171feab446ade21d2008af5b5e3d2694a0eccbf7f6c5ffe8a70c5372a394411a1d87cb22f41a531ee7969b92defe56d23f74f53ea866de02f918a3ba32f59f4831d75728b3f2a05ee43358fe0a69dd120ca880bfbdb60e426c18fef3d781c7614f439bdfab4ef03012c9ecc075223fd0cb969ec29584b30421bdd8053311eadd57916385d30a2de4bc9a3f537e081cd85889e2abafa0ab54758d0e41059ddc3fbd7a9b8c06a95fce19f3224defc5be29672804b45301b49c89f4936c14d539d93b12d6977bde1c30de99d011e9fae12a182c693a28bc7b1abd91c2bd4343482d74580c9253059577722bb7e14b7c6fa880c60594ed86ce0e7e2a628d21246b8a703a9313ada41020fbd4f3c0e8c89f1e641c991bbcfb9b8f9d04dbece6bf011bfe75e67e8a094f85a19272837b73b284afadb0f321eb81b6afcc42e8db1efd3e484a30363035e505fd430df00baf41fb16701e02cdac6dc7873abda40584073819be33c6a3b1cba867b0de5fc3ae9eb97231ccc68b92fc4dd4f695a139e0a762dd9498f9526af2690d43154a6abc0c3fc9cf653508006eae4a55f7edefacb6a23a0c054fd66263b2f481413706b10a8d5ebf4f576a307408b4fc29f4002c5e0dc2ab67a001803629e651a57e6fbab7c855781f310989710177bf1333c76bf1bfdcf177412cc0c42d8c33f4abc4c40cae3cc3f6a019eb8ec9b83916707b3b806dadd068b8e6e7802a62a8a4a9254f4d0267817bfb37b33d47e3a1ee429bb9aa7f67b936c4c3c098d14eb443f36c3ba52aaeda5aae4190da14bc5819f6a696a1bd3c4ef685f75251cf94b82cc6a6c313db0780162670569c951a53e52df9ddc627ac1245960b333f368a9aa8eebf09d5044fe37e6acab56bccacd900972c4dd65869f5d399ca3b6f1233bd913fe7447363a36b34e76ef7047e19d17ff6bf01fff289802d381902713611ccbac9c40ea2e6fa7c065d7ef08961566777795469cd1de99e5af278cb258c8758fc1187d31f59ca28668591c3453cf9165010ee199c9a58d8be70c02fde14132ab6d31129da4e514f18255a2f33484dcd34eded578aa7aba19a7553ba3df1e474e5bd4ec414b0f96811cd1401d3073d543c1f293135e9a34303746b73a9ab963a286171d3a665a95351f16f31e885b0480268ed4d0ef6f727d07e28ebae6ebe9160498fefc3eb6ba23be9a36f3a1a278cad2a29a4dcd0bf1feb3db6b195f1040291e79110c9e8472b12d65b39db42b2f820e281a2a78dbd3e1b589d81fc15018409221cad4cf3892ece8ef15dc5e966e94b9155f029c47024584fbd7f05872cc51c07ba9975bfbb500ea1e80ee831052d7dfd0899ef5c9d5a345e86388479e5acebeb1f9a56412cd5d10910699dae2787841d99b87e1e5c854f820e54978c75df37643c6b2bae3f62d5c1f3c10b20bd00042e9a970c965035cd55d85236493574b61f0023b4ea8242880728af74ccd162ee93ae758d3e203898b89e0a5265cb9c46ef12b8cdbd2247aea8efd225320b9ed87e23eaffebe471f86231b4d5558bf696286af12e953c208ce12a615ae2f44a51f55c2bdf8b8bac5f34bf5d158deaa6c8054ab5c59e9834ada4f3207c557d515cb5c0539917905fc75154e27475f0d28f46a3c37b692ab8acd2af7441ffa5ecf727a6770f92a60447ac30fb9ab4d1763274a579396493b43e77b057e98a378f032d9740d480aa0114b167ca48b5b31262695fbfc9965bae2627bb9038713f0b32b6170bb11c235c5061048f3b90f51afcb79ce9c09f9167c241040c8db4c100faecfca7a843f654f5fa05990c9c839487006e561d275ef65c8e1ae9567a1f4ec3572eb48f15af9416eccc3ed633b4974c4ef4754d3e894bd6efb9ea8c706a4a5973ddd61b1ba17c59d80b8caf2d4533cf7544973eccbb66f0a81fdec61e46f2d7216c38a3b8902caf64b65ac14b3b7c79854a14313659499b0b60cca5b06ef166225a98bd79f86eb63176250fbc9cf75093dc33be1c07ae1e09b4980f4278826cf3cfb416dc432c86396e37ea144ea833bd2318007efdee8f8a6f54fd70173c0b8e03c0ad14fa4ef7bc9810db77193a71d5702a87cae2045eec5b920d88305c1f337ea99999ca9b233981b8f6de8220bce000ea2b36f7c0df699ca9eeae532a299afe3e45cceee6e424445bbbc308aafb005becb9ab7fd07775eac99b4be5cff35c5683c355b3e4640333e590a6ae6e8de4817b5ed51469534b7922dcbd61789ffac9a3a88ee595cc34355aaddef7c39d97c0ed61774870977ae2b33a715768ac0d1bda8e34c1f42e2ce8d8ae8f939a381fc1ba6a9709d5a472617e49e5faaff72fa8778a4a00826014c7cb9d902a5fbece68a24e1cc132cee91021a9c1f05be688d2fb0cc6a0e7fe2d0fe1579d6a99dfb87b14d13aa10429fda1ee4de1ff748a0df06bb65d323ae1c11388ca0c848aad68ce89cdbce3edd83faf67dde8aed8005f4f969662aeed59a13176bb9c6983271250eb8d1520c3328bf04c2a197c76a266f2f30c69a65ce7c1adc728d6af98e62e9d4b76dd0c48399a7f83c00b0af7cf4342d201e18f72a52cb1140b6c28d820d89c5dd297cee291bf5dde4bd398a86f6777969640c5c3850d7727e66111a1a442a4f539af3cdbea80bf51947b83e524484d4f1de667e4dd4ed2cc50debfb34e683592076f515086cc350dd5cec002a31bf41cd58513be49f745a26cee6f9886aa36d2faf6f02ad23cc02556093d5173f8bf5bb90f436f794f2ab89c9d6f3724b06e00c0ce46e503b372b8be14b428fbca8dee6ed9f3f003914b45f9f6278988a4e8a951cc3d63fd46a8d76f4eb8947b87be539e681e958777e0c2b6c6f3a635972c13203e28c2c736ac18c5f7942ca515a48eccf00ea45867cbac90c0ea250962b489b1f8b165a43d1e2374c977fb36766c5c850d8c3cab5ba846bc2ea45a1a5cf60221dc2145dfba6da74a956ddfe46699ebe26210b968bab4e6978f1f406ee99a5516a36ee2f4b750e5d95050a522b0ae242a6b028656a43d814e30745536706a678a15f256d0ef20f155513c85f5a4c7e2748ea0fee9022f8075005d0bde2047438286a22e8dacdb3f3b721206fadbff966e02be833477fdc236b9f73caae302c4b4596d5fba43d5ac738aaf73133e8f941aa9be32549dd9b8cdd1256aeb0ebadba2d2fd2132c39adfaecfd1e3afa30752fc706f5a0b8774c1b49a5c8cdb58d3bd03391551bea4693bf0d9e157dba37bd4b7c2149baa4d45da028bdd5903671960f07336fea520ea181e6460cc7d4e1e7294e21c0b5b0a82f4c1d1a0b9fcf49c50283a824fba8b453fb8002ce66b574fc8dc325dedce3caa559aa17e94b28d444d25a4942dc36de4727269fa3f49264b064577f5fc7a28d3fae78fe9ee0444e01aea7ff8d84b805e1e3ffd8aad02d63be2ca7837d19a33e0e50dcb34974f10edcba9335911bb5eb4bbb4d94576dc55864720795473b9ab92aa7d728dd8936a4b5bde3b2e541825e3da130dcd21baccbeaa6049d7025511f6d698010ec9521964ca71c15c65150667a61de8ff1b8a5b7fd8f7593472f1f2690601a608c057d4c68da969e4f2906f4856b0e572e3acd75ee06d17a3fb182e96b84d5fa25814713a2742bd90bea980795e27ddb10e61ff8d38dfc5e9ad370e6697b84fb590461925ea1e83d76cf99c0a454ec6774fce6830d00e94e3fd95fc2994cdc1a5e5d74143219d886f28daeecec414d5522d80d0a5329f75dbc02d836b2f458c325ef698e71eba6da7ce0cd0b7dbef2eaf27d7e66aea62f152585b60e4c2ee2adccb036868a6494f35f0ec5c7a6c5d0aaf62b22ad2c96779737599d62122c18453ba1d90a4fcbfec6ed976fee115307265d2c51f66d133e380f47703663da3734ce099cc932dea72bd4e4b7497e0af5ce552a7ae5342eebf50af4ce91fdd500af7a183cec44ce241b1e0288e9c99b96186e1b7081d381044b7013ffc76a6ffd363f98262e29a9bad194afdf72bcde5992ca213ad5679bdf3293e8725d99383ea09bf8f86bef9a8e8249893d3f25340b44b23511ceb72b53be034b5770af48511b541bc85364c85419cf85568d9e54b6d23dd8852459a830bbb1e36ba204a67d6ee3bb24a246bcdb88627e46065dda881c937ed69e0c739707f76960efc7de97a06063cd1bdce0305d5f6959540ace190faa52fcf38e75fe9976a1c1d0c61d72a05841b24780def75111aa21db0cc4a009cc08638801df3315d34abcc3e1ff2533bbc24cf1a27a36549c6a096e5f6d6362741c4e33398dd97e725ee46c1311b2e3dac3d7bb4efea235e5ab5fa3e5e0522c36c9bc5807b8aae72498d70de42eae63d19bc13ccd317b51498c4b8e5e6eeb91ea37e5dd741a04cf36f6880f4d1153f9a4ef2230273df41a2cd36be8c55fa029c967c93eb3","title":"142. 环形链表 II","link":"https://leetcode-cn.com/problems/linked-list-cycle-ii/","question_id":142,"issue_number":14},"12":{"day":12,"pres":null,"tags":["哈希表","链表"],"whys":null,"difficulty":"- 困难","description":"```\n运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。\n实现 LRUCache 类:\n\nLRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存\nint get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。\nvoid put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。\n\n\n进阶:你是否可以在 O(1) 时间复杂度内完成这两种操作?\n\n\n\n示例:\n\n输入\n\n[\"LRUCache\", \"put\", \"put\", \"get\", \"put\", \"get\", \"put\", \"get\", \"get\", \"get\"]\n[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]\n输出\n[null, null, null, 1, null, -1, null, -1, 3, 4]\n解释\n\nLRUCache lRUCache = new LRUCache(2);\nlRUCache.put(1, 1); // 缓存是 {1=1}\nlRUCache.put(2, 2); // 缓存是 {1=1, 2=2}\nlRUCache.get(1); // 返回 1\nlRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}\nlRUCache.get(2); // 返回 -1 (未找到)\nlRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}\nlRUCache.get(1); // 返回 -1 (未找到)\nlRUCache.get(3); // 返回 3\nlRUCache.get(4); // 返回 4\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d71813d84684ff03508524a256a2400100afd8c74ea6410d1ec9878a833a0e65ebe221bc49a2e129cbe22b42dbfe7b231e23168699ed9d2bc0531d7e88a9c5e7732ab17ecd7e24c18f45ea20339c9c6c019a73ce1e46d77a6e8f96d32ea583b63f6178c435109b080f71d6c0ea92f70ca3b1347566d003368f148ee30889908f7277366ea664644429948aeac6622f1025c76153667dcd52d7f4223a3ab1a5c4146f2e293222e7a099c57b16038b133998f19d2f34658c544eb906915815c3f73851bc253702e849c095bbec900197091a8adcf3d97d872efb50d458a85a9ddf94d575dadf5da2202382997083e123da4d178889e959770854663560ec76d5b5fe1da831ff11ba44a9cd32aa82e4ecdf71619acf142c38ec848996afba910aca607c4292f9fc74dcc9852eaf17a8a48961365a494340c52538fad66d2cadb748ed1c1dbe0a0e09e48dd60cbd6423617d6f9adfd23fc801d856c17fbaffc9f5550b2c5d514af423e31225cb96b99a4863a79951d89cd3283d01419dc2e50ef090d88f751f1fc0d10f3972e6cd3f7f19ab55b6dc79295f7e73088842366285f7ab31a03093e25b07b8dabf3ef318b9b27646881606e284e992e1eb3790b5c3731045f9078d0d3dc9d83be6880f44eaea85d8c3ad4feca044941e6b38d221c4243be0a1652c37bbb3cfd9e0396d3164f825e46a0d4abad41fe69d307875f7588d47c63b8bb90fc6d03c13c4eceb925333903e0b0dec5979697c1616209958abfae011a7372580fe76da6f16f250e47d5775d47485fc7b19e83c93913191d4bc126785ef469de4c29892cccc44f578206d7875ab21b662624295d362f78f13076b0d7391132285b767855e6e016e2ccb0e5958b8843a3ab72afaff645432afc1882e7a60b2e78b75acd33be32c0dd5ad7e2a40ce12e75d76e0b15e6d2fab060687962ff1c72a36a9ef3dfd530d550b3b832e6de6ae112467a8856afca5571d3239eb0dd4e213536e9071aeb9d707d83c63acc9d4b906f7e590ed698791b6763320d1b8a87c94dcb7b68377cc9c55aecd2669a51143da6df3396688e32d39e4980261288fea0e925952676c6cac59f3c4eb5643faf790f444f866e9a668124dd0e9f4811e8f68246093182b9f3d01e4e4b1c6c2030020a0adedbe135343ea4a8f610b7262c554007af897bf02b6ed712d745fdc280c3efe2dcef7fea1d88e6afef66839d84ba4a69a4de1de83a876cb0057eb160f5f82d9fbd9a49ef569ffeae08724fffeb92ce1c6608a4c5ddb0d0c0b2afc9ac0fe17b8c9d6eea455602ebd615cbc1c3208c035adfc2c2939c118f3118a145c7121cb82ac7cd1a6075b389c7c5aadd86bbf2eda54b10ba958615ad2659e84d1854f88564a59fd5622985f1555ccf654d957f5577a782cc726eb4a65552d6f1657654088bbe2d71ae40af12ae3bf73bf4ecd8c700ddf92a53c10bc27502e9999071859777d3bb2a7effd16974d69ff6bd204e7e24762621c65cc2edddb16341fb22f6d2a1050fca0fabce1f4054f3439cb684e66e919cca49d1b9350c49ca01247121f03b58c3caa2ae6f3ad022ecf72190b3974c5262943b6276c04c0e56b02fa6dfe2c9cc21517f16c3594c48d0f1d64a934af478673333dcd23ffcd658ef97cbafce8d930678b23079566b3a4e7b9d88e94723a0aff1dff55b483df17871eef97c72801195e99f821a1bc57ba5d977821e37b91aa4a781e168ac58d71f2373e68e77e9f50e604871740bf0a130b1cf10d889b7900a442d10afe3e904eb515630de8262028c884202ec39337deeec32e8cea589d608d2c5d8190c2e7e3014b2eabb27c6ac2e9f2d9ac783c84c3217e1d4a3f382472e6de1c3bb703923a426f060bf46638983d2874e32168d1b1d2de30eeb34de04ae6093ae612a53082f4fdac0032da1fac766dc92ae33d1e72e3c974fcd75799c626a8041b6c7f067d118f021c1c78b9dfa59e73de30ef0568de3424bf11e34024d98812d52cd7e8b0ba076ed89c3767c6bf1f839a6472b06a5747448ea102fccef52d4b47aeb6460eace417674342ed273b4a6029b5fc47da239efd8fe64a881466b4431084086c1863f55266fb3662b693da1994816c5529db1cfa74567716fe66c0bfce3c711c5988d7ac7e3484931f778eb41d6691073c70c5795426f5ec9b26b64c34fd29b44d71f0f0d6445d0c79734a247e34713e5f8e33896dc85bca83a7b3d6c9b07140f0cf95c15ab23fa2bffbc9e892e494a928e904f458cf7a00a9a99c47611c14514bb21242a5069b469e9803d4967e6781f8f0618b0d5b95408177c3b5dafe141bed63c59d4b09bc858d671df0e79496616a86ce0b824e65804748b6eb27bb8e61d07de3df41e87659194048ea145cfb6ac2ed6e411557b19f2a1056059abacea45d520cf999cee53f7d3264f80eb0e7f6c4ffd02ac644d86d83b134bda125a0bc1ac17beee5073906a119df8bbc466522fc31cfaa22a750eedcb9f2518e0d45283aa56cf5b4d756ccdb968c4029fb604319bdb36c16a2700f79bbf0fc29f5fc380bd9360f45556589b94c372b6a291aaddf2af1a0ed0853753b44d407ae536cb09f62b4a99577e922a83f03a7d473f608e6e6c5106a2953e347ff5693875ff540fb1a542860ab9a3081c9fb79a4bd8c869b240b1b8edbda2c2e0a71ba7b6c5b50f08f70a390b53781e9b7f1f76194a34a7e1462f16006efa5688dde852c38443bdb2ce3f5d20ca7929b5daf270761da9206e898dce5a74823024fe136a95361f083a26441bf291fda725e0393a8ec4a87c5420446179408646cebe5d1fd5163f49d860cb8d610f7004025c0887cfc85c0a99c0ab3335bb0e992a87ee7aeaf9c19e0a4c5a227bdd3e22ac00a919de418321da658de8b9e7cd3c15733e4f8b248a427def531eade0ce9e21c65002ca598fb7a40ac217c9dd644c5368e1f7bb0d43ef563e932ba5fdeba88bf73c3e4b070c6984bdaad3f3386ad244910177a4a9bbad5d3e92bef0f55a4713495316a32f862ec952c91e45d2eaa7551e440e2b1145b42b04fff3f894622fe41a8df259ea35c37b860742f04c70ae65acce520670af427a02079984da2df63bab5823d641e878fa2159e82f67d7073276410d431d0c3408c11a7bf1020b6369dd7acf738cfd814b8af6d22f5ae85f29171ec2340ad45541d2b19ba629ee53e5f0139333f0c438208a65719d1f276699ee2b22993fcc284bd0dcb2f8d2aa2b9c93d9f58522fe71058eb8fac68f5ad25918766a7628bb920742876e764fd9cb4ba040512d970761b39ee6addb198d55b5051abdc302e701556d589f685f097e0788c19e60c191c6a8e3e3e681af05863b0b816951adc99866a4ae59cc7256568798d995b0f01052a15d01bd0b293a3257c64a9ef26e164f04d30e79e0eed5ef2000a2952803bd10c8edbc0b52444a2f839738f2c02c7dad263f88b52d8b64a65cfbde1b04acd7f8a814837832aa584021002acdb04ee369e79f3960afdbf6ed8793ab6d8fa4bceba5fce8a2e296460886585722be4c3158fbc04e90a39595fb1538a2bc0e11dd3900ce5b35e5ac5e6aa7597fdbeef3f3b901213cf2c56495061601cd9e22f62b9ceb4452a1d396f3e5c78981f3b3b32cf792fc81defd2f3d01453cda1f7cf46aa997f32a8fd6dce71210b825fbca28f3bac1c8d77688a3f26119184531190e92d66ee1389eb701061cd570026ff45da104e0f35f95e1092488fee3599fc1279496fe3b0ba5af63f888bc9f47f11387b05bf9ca8157c4ed450b3e13300d02492ce44cca218eb0bafe25e57d890aa8f4eaa1c1044607f3822800c1a2c2b65be405ccf43591eede5741803a0414047f116878228263c1d1ea7797ab7771ad9133300c291e504c5f814c89de9f67818c3f10397f2a11467d5efbd78bc800af9ad4baf60070eed93a6f1024b37bd62daeb1218f23c6917695ff4401b3ef494f3252e875dd0262ae1945baddece694424d4fa57d81ded4ad3f34ae00ef2cdcc847d774100b2fbaf80db3ca6ab7f6304d6bb7702dc5b018f05b10482fc649f8a9cb45eda0205f4d74af6bae2cc77d9dbee4782b6245d6940e04982ab4595c0c446809191516646b1426522a7011ece7616c6bedfa571e958bbe0967e9285ea8e02fd1036bee76b3843a2b386b443726b4ed91c909cac271a0139e79edf56d9a9d5362c2aefb11286e11667b5a5beaecb38abb099fbeed11c6ccd282e3822267315962d023fa0826e115fa810ce896754f0155b218934307eb86ab8f8679cf8c4f097d296bcc4378d8b316aee08b263666ff66826c8230d44ba63617f2c040b8ab700776943dee2623e3a590b991ff1216dc4f15611c7a465f384ad6d584029c1ced6c44688f5ea6b5263804fdbd0bd2d99e0fd6b7e8ac8af5a3f7a4d868082f5818c3a90a00bb5fc68d2929b95a0f8fef70365f46383b3581fa3025011b683f651d4435adf3acbf0ec08f86fd1a68c9df78bb1d3d8a83ae875cea3d3d75a05138d70c2e22686a779028d341b4658150fd40d330005a631164768bb0ef1e8fabbdc469b0eacf372f2931c36dc94995eeeefe0008ebe3f9d09178047db33f5b7be11295715836a4b1b493eb6233ddd23be799b0068c4e14010587e2ddbee5034fc41c53c60969aacb2b5c94da079b1263aa0606b4d0c5307393380c629d6f8d587eddba4e5ef1ec76a5674211e3f14e491ff3b17d5c5eefa771e114253e57f41779b96da7408607ec595cb63de9e76a3ff7507eeb9264e005bf851d8d2c63cd8a0d587398112b04ec43108deea5bdde2cce8a03da39e04be10716ee3f531d6f0dfa348dfa81ca0c09119ef12e5135e90cde2cce392a32fbaaed4d4da6eda92d4aebf3a1a7ed64098a5f1365e81c48106c2413d864349a3bedef4d2dc4cddeffd9d7b198c35cb4f3ebb8fab521338f4f5b04ba20061b7813e4c02d02a91554ddfaa64c125dcdb2f7659ca5654dbac45ca5e3b683dce8f9dec2d46b5fef4646a7961bb1bd463d34e1d6e6e77d59e0f9b5f526f78df71ea8764a46158c1a8c25dd8676f22271b97a677bbd366d05c7f5eda110ddfdf8fef5e6c18e279b8237db5fcecac9c474075001c0d5b6fdfa7bb1eaf63e1a895b588c772afeab759de88fd5b1db9186e4a22b2056b072f15ae7e07cfb604cbf274d1260370cbc9631540c028cf9b80d206528d8e94266bad25991cdd34b1dbf3580709cf80b0762903693c3e5708d443c8160c6361182b7602d446f6a2434ef948b20e909142300d09f827645cce91aae4e52512d3c8753067f5df4e1a7bddddaa236498759f29c5136c6c0e4278e7502062462ab541a74e5f99c7b887c81f139ab9536277af539366e8710f8dc1a7b3acc345ad4df3245a86141f4eece2b61039688e0a2889e5c2bb2a71ad6cb3689b14278358629bc4f55a5154c83385d89f526258a0b027b913af7dd98a817942928096bd81384fabd30ccb0903f9cf6bab46516ec1ad1d8d042333a005b6845c198dff2d652e64407f6a58eca75f7acc0d36830ff13f9110686b5b71f5d996f570016b55acc1f6a388ca4a40418c959796f6f08958e929f650dd0af2bb2d92d17fd27553793990d89bd0d6d4f4538fb1c63b83246843db1ba49ea5ebabf3ff3f9cddcaebdcdf38b86d918dd6a1cb6a530e592a5279c9fb3f475807e1617021b0dfd2e63d8399f6d0decfbda5549246febb2f2fcd3459c50280fe682caa08787e50a0ce4d84306886c1929908ad31af093b77902fc4a6115f39e856fc013a650d3707ad5c66a337b1385d4270e0c1d46a6b32327791add26b6eae76a5cc14c1f7b16b750d3a4e4393ecf90de9fda2541492eab738b156b874d1656d0eb48715d1ce283b2efc0c516679ebe7ab81e7c914606c1444f73a40d107d05fa9edd633b0f0134670a420e299697c986281bb51b493090c2cd22740681024700e93930655a2bda22d3513a599125fdd4ce0e9ef5cded2ad050b84f7824c6487bd95dedda0f3d7b1ed7c0a308c30fe19f33a4ac64b6351fee831094725d162539fbfce6af4cdd6084499f72c0bca4dc4ba1b257b2e603f64ef0a4392b15f3dbc7a10a4ad7329a61486de75fcf5fac5fdee4f89d657c514c07f960cb6b18eb43c6965d851c940bc4ec3e89b7d7ae2289edfd60bcc138a8021a84273c4da67ea251e5f2e109690e0276b0dc7047c669aa7a045ea5ef320a27bebce493b1dbe2762f03728ce26bbed7e180c437e3af47269957c42ddc5df868d070de22c32e7081f8ebfda8ae8a56b3cc1393a0200a8e1384e529dc219e46292d4987618b5ae2cdda75beaf23f1e6860d46420d66678cdaff1a366c6e15be24d194179652c1e5b2f13fbaa89cba60dcb9ee0144267b2104c79654f39a12edeaced6eb318e7cd7717f361289124b8fe7620088d50c577b607f5ee55d6585a07fb2269239450d099527bd9f75845002cb20426c3cdf9435f19253ff1c6a5a2100d48d5a2b05b0c39a26c21d795f1a8b6ed0dac43c4c535e8369c726e747c6e7b8d93fd0bdec2b7be32db85be87b74dac8ed76440538dfc5425aceefc0f23bf08fa6d115c5b786789172f0fe04c1c7d4e3e1efd40070b8034073e3a9ff3c428bebe161e46f20761cbd8475cc5a9eed6165f80fb6ab9ece08ed451a2ade97a8b218cb0506b23c3060fdde85d1d2e56b17381b83ccd9353e17e72ffbcd5082afdf0c9ade0dc832c73fe91962ab3ac921c7aa73f44beae8688131f31589d6969baaf70edf7873acca950f1ed04ba8ac208fc85ee31f9fac160412bf7da8375edf94b92dcdca2ac1f43a8dd686f3a9fa76d95f866db35c43875300e1f23f3d07f9cd9bd6b2a435e3d4f3a0e35ddb8867421f6fbbbc308afbf84cedc5cfe4b811415ab888bfbe0faa69a37316355b3e4640333156572da7b88e0159f2be51659a67a8b93b828d5995f7a6c31095ee1119820759aacfe6663ed7294fcd1a7882425db32b68fa3f768ac086f5e1af094b02eddcd09abdb569faa7ec16aea06dc63e02711780d10ae8b33796ce36bca9031d48022884da09b7fdecf69e3cf6e65d79a2dd0b309c1f05be688d66f6982a016dbfc0a51671d789dcb3d6b11e46a8191c9fe57bb19c53b224e9914dfe21bf6afd487f778ea49352ff87c0a2ddc6cf7cdfcf88a27390cfb5d41edead212f79e091cf5e5a32d18384763a2718a585093b337cf74d91afd392276b365b718fd64f9c394e8920c36ab78f66ec9c93298589cec0d3b9754cbeff2eec482d3d1e4cbf6301c55515fb8f9dac48c0c7b67a28ee345bdfa4a8f26e83f9e40e1f3c28405431508c587e66111a1a442a23488cf3f6a3a24ea1015ab9301a1789d5c3ca3c1708d4f031d80dbfb37db58d1a6126b4561670d336985ce45023499540d0580208f98d30152ba188b6cc2fab2360eb2a0bad78e602556093d5173fdbefa6d4ac38f792e5f3c9c2cbff3d611be04243a02b5e757273dfcb4b428fbca8dee6ed823c0b2b1ae71a947a399fd64599cd55d8b270902f8326a6aedf6db87be539e681e9051331486e623f68260f72dc324db7c060593884d80a2b0cca014055b3a00ea400de28bad40c40f71cda5c629b1f8b165a43d1b02f32c22dfd67288a8c15a0869ee0e89741a6bf09edbe9a216659b6061fe3cdde3ca733b3cb163d8ddb68320bf5c4ef0b731194fa15fac9b43e0131a2731872466789471b532f08f530c9f16c6b2442c506c94300072245f21bf852266c43af041c4b4bc80a1f457f7c0cac46bdc44cb743150c98f5bd401621297b1aa78388e796f3640a6fadbff966b367a72a0826996b7a9e629cb32d645a4c9bacf5e068178a61c2b22877dff92fe5d5a60f63ddcfc4944158eae5f1a8aa092f93116324bca2f9b3473af23e623ee348b0f8ec304c3149a5c8cdf2c86fd878d40c54ab4eedbf109e533ce963b34c7f7915ffafc805bd4cbd81d87f229847466027a7130de4ceea6c11c787ada87e406f85ede4826c0353495f9f8106814783b56de9e0bb41a69c438033f866e0b9df7aada1c9caa559aa17e94b28d444d25a1d0acd65cd382023888391fa21f1205f2b178ef18340fc3db3d1b643720baba9ddc3cbfc40e8ead5d8e3962d2df178a7db6733a36c4b0489e10774bf4198ffcf268402b2e061d502da1247c558642f2d95473bc9f565f0d770919236e5aabde3b2e541825e3da167949b57bb8eedbf198470295d353573aa10ec952196118d1c15c6510d1f1c2e898fece8a3afba933e840e771d4ddc355f698c5e574c68da969e17291bbd9b6548593337e73ca006853276e28cf36f83c8e52ad11d5fb60901994baab22df6e976db73a954b2c9ce901e91d66ab67c09a1e15e0303dd4fb4ac7666cfcdd1af458f7d78e2f1ce3219f55415df55c09908db1b5a193c5a2d3395c9a4c8c2eceb15775566c94545002dfd4bf811f27ef7b51cd80fef698e7187efca67c0d11b38f0b7e8f62e3766e7ee2e036a89ec772e63a3fdb7ac3b96bb0b94fb194f9693a6c3d6aab06a3fb665cd37842e41c127491b18137aed8c4f65cbad8aa2c06ff311004b690a7507f17b451562610304790b9f7670c61b95d335d0c579d7e8ab4b367af4cf487639b43e2ebaa83bdece91fdd500af7a455faa44c67757515588b198c895596665798188ab044b7013f0c86a06bb3676cc673c7abcba82d1b09a78bd9c7db8ca213ad5679bdf3293e8720a983772edcfb8e274aeb2c7d032dc37327e690b44b23511ceb72b53be034b5770af48511b541b94102bf612049b9e5fc28a18ebd43d80986c73ee65f7fdef6bf041eb3238a6bb70ea03face9a7f325b4854df9e46b46098db54278c2df76960efc7de97a060208255d29e3013102d1c5417ce4d47e301a0f28f6de18e02b3c4d39f560ae50e6bb24780def70c3baa21db0c998a09cc08279f08ce32029d1e9affde9d7658b5a041f0b22b5211d2ea8388dc89bc8dee9a8b9b9f4b67ce7854ce46d78a36e3c08b5a70da4843ee606581202b34d1d39a4f59be85131921910814ad4604846ed15d76aa0486efc08568de3da9f8345356fb1e9a5e1f67ec32dc850f8a98c930137be7b4d7d149b8e949ed2759e5a446c176cf3599b82e58192e741c7f2809e9e22616ebd714837bebe529e16b554412454eab07916fdcf9ae3d151557bfbf9703b129cbdfaa97cd388e85ff35b5bb5377359b7441656861367e80541aadd489e5e8acb8a7d1fcd9e37b0b55cb7ac47afa710101caab73281fc89a70100d7fec972664b7ba22f1c614b031c7aa01e89d6a1f9eb130e01a98b57b1f1e04f9d23f0f540e7e30d97fab6d4ab464e78ae063c41b036ec32976e84ef97f64815590c4a6dab9f7b0328b779dfa65d10893c22ce6001fb0a61cff4528c107efd13df5aa44211a0e2acafc47a8012d4fc5382c1c6b76445fb482efa213e9e915b74a18a9fb9db6ab608f39867a332866298bdc3636c6582ec7030937dcfc62c4580eadce6e3d5855127c762758c628762a9d64103f059f4b0e372942077d4da4f8fa42d015e0f7c07aa871c57011db7682c03ba5a0d05d58b24b9ef7971a732d0fb29958ae559803948e14544a6fb1a4093f2e639a831731ad6cdc0beb5fdd503da3db3ebb0eee60a0de98a026217793c2e84128a77f54453950c5f051b3c96aeef5c3bced7a612d5248e2fed5e496a5cd51b7ec06ad9c02578f08ef69897aebf7016b2e3e2916b86ca98e9fb651afe3935a952eaf54dce0af736da537a404d88087cb56bbb192e9f44caa6721e37509019faecc701e00b37167ff90ad929cc8986d27de5c9b99ac752812d6931ec8baf4416045ae8b5ce6b55637abfd11f5c23d06972117cabfca15df591a983a6fd0d1d8975e6df5180a7d7e8e71b798f9eaaf96a8da8ee29688963e85c2ded6dca145ae889f6a414e3f8e2d20fac85615db4d2f25a4f68dd8040eafb864a5e4acb8d4681af9319361cecc763a3def54c5fbc07cf414ad1cda737d712726e00f145b5bb8a1de9914f331c350e41b057e080fa48bf658d9d4b95fd9abb4c8ec3cc7b3423fd5da010827ba2d7a9bdd0f18ae26837ef5a477f1aa1348c952e5e1ac9aad3ecbb53978e4ac49e3c1223c20d536fa7ac9f8cddadfb0743adc074c63c390e74dd22cc98531866a945c42cef6c6d0370a17f9387db294614cd7fe57599fb9f8d46d24fd2ba3eedc2756e216cecf2999dfac22c21a8ba22150d638b1bc425e5ce9c077d02452f69574fd551690ac0446aa9fe5b39a54fde00a04fc23ddd5f530b09e6eb4ba31a9a95faa8ff5ef8add0f5247e50bfd2bb273bb3b8ac3663b0a793c1134b58eed1968b4762d440114069163705ec6917db395db93aa041f699d1df6e00e0261e887d3587db99b004f5a68e9cc71fa3150f4f5f6e770e3c9430419beb0c1c8ea38504bb011f25434102d563e80056d81beaa0216350d66ed33d46a46d4b2ffdbd019e15ff84181ead7c65b48bf0976daf67bda17132e5efdd31e226583f871a99a1ad786517b5f363fb2b33bf850182a5c81aa73e906bd7ee42f33ae0f779b68c154affabda9659f41ffdd511e5164cc70d8a07de83729350bea01e9de533a310478ccbac3a36f05255338d22218ab3f74e51ca2596b06a1c6a5a452c68a3395d890163cbd31177b1fba9877bfc4cac4f3c5b3daa4176df597a42788f4f969091d1de622638fa0de0968678e9ca5747669e7f204f8486ceaa3aba2dcfb9062701b2f5a14dfb826b23810cccc071836b3736fa792ef76951be442ef2cc77468a3c2042750f1cac2ee2282e5dd11b474e03f1279c59aad917cb2a485a241be9e0fe5455bed6b23bb23d28db800a8d05dd004548db865d82703206b426612558ede6f14084a18ab96b5ead1ab94d9cd4467d14d5cdd0c4cf46cfb9b45331b1b3f8f55713ebad93758a66f6731957f8fd2f5308bd99ad20032cd6092122d0d1c86164435119fa682d2f4dd140dd7bef669e455f88210fb6670d78858c0684d0a2d9f6e10a971c92193beab0fcb2d22422510161d31e3ba21ea70f87a13cd0e34e000f16c729b5dbe1025e76b8e45d3d1d642dcf8f12abd16f1f230fd51c5beda98a3b57c7a8c8b4a7a4b24a5b4465fb3ff09aced3b550142792f351592183bc582e4cb4b62a3820e60c84f6916254e74654200212aaf84d8cceb651705abb1113133fceddf2bca4bd265f293c8aaaaa5b27fd18980bd9aa329ba5f21a5668c3ff5aa8828f772fd943840686728f80beaeebed1bd906935811626a6c1c5cff87b78c71aaa314bcdb2f051cee81363dd97e1a644c9387d541e2bc7d13e2fe8e094548f3edcffc10112c762a46827aff51c8920a45dd3b220aadf67566ff8e2565cac68493905a4eb787a67e4d794943fd18c38b041488a7a8a5b8fe755b4336f4aa043da6a74bf2a1c176db7115c0fa829872864b63c2dc992cb66af3ece030754193332fffbcc5fe8615405bc5ca05e228c20058c35ed55d191f1d877bf23845d126e1f2c6f6ca5aa009d5e212f0b907a0a8c34de65f2fd041f799dbde59b30d9fa8d855b4013baeb2cca7ebd8d5d5f0a1cc09c6500aabf73aba6fd42a60b00cc19aa8df5488a7bb2fd7073ffd0f68a998ac3563f49723abb3911d991a47435d8552ff0b1f95ea05751e89217a015a91b9c69e6d412b421e28cb6aa225d639871c4f9ee3c8f849256153cca2c08d77f426f010ba93b0f0f8d2c36458ba5587450c4fd32a8c7e9d1f85cd9717bc7464abdd6617232c19be35403fc38d1484bbb1f99a0daeaa8791641c780ab2ad9b7c9b1a4811de3af408a1a42346669014c7a6f2e94af9bc4346cfac1122997a7b7784e955d22055b35ec78fe7ac210bb850b0195d933335e7c32a52f18c9a87575e2fab8bd963d2a1c19a97ac77b5c273762e7dde119156597733c3ef470ca113ebb835de4bab5d88ccbc6fe5823cb71e898f35a0f9d764531a70738f511519a720fa7a2cb68d9442624d8c73faaeb3665d528fc4a7ddfde3e78c7580b8fe16fac270a48f845a95a955abfd6fa54626f1a1ae35d4430c3a1f3e181b8c74834d845d09317d461b5de77199ed03c6c8fec9f3605dda982853864c1b47d465f7e9b19b9d982f3e6e07146b35c00c0b25193cdbea444f1eb17a5d776b4c2ef7cd57069170446316fa6795f38dde0ed6b03c011a136fda71a6774c20330f25810bb690271dc8195b609859cdeb22ee80451ba3ebe361159a699bcb713f08f64cac270db893cee3c9fefd87782962b9c220db9291f935e5e34c830df0c0d28979234fa2be73ea6bf835501ee54da79118254f2c9eb7fd49825b7e6288bc55d60dce44b5c35ed39e183254bdf7ceab858a67dda6bf05e9df0e8554b8658947d8f783bce6046a493ff562a7a0857e026d989a47840bf5175668ca22103f5e8bf8f43866ea96b81a0fc335a4eb1d74542739cedb230e1beb6b5ccfabde665a5c0cd4d93387ce5d9075d17070597f199b11ffd1b7f78b899c1a93f9882ccc2f275f7136e685ba77d9f6c7e5e836235b9914d96ef371d89b63fa1236c2d7944899291436e86700ddfa69a21a48008d3af2894bbd62dbc682244639754829a96323f426eca8c0ff3de364e340dc8548a52c2288ca409c1bc2a5834eddd35d3f9a7a183d6b81b4185bf1e7835ac6bd96271511183af7d9a69ed500d085b9c6aeea1cf00db4aced1cbfaf7bfe4e5eba3d7656e83d9a68c7e3141289a38cc700780dce19a55728e6993fb417c11147b38d5df83a19b59e4fa188c9ac704f9554f12886e511aab6cb964e9eb036f5502e667aec5a82f819a218c8b6b151c356198da0d9b685f11756e002d7b6072dd43c7a1d8be13a31e61097af739c82fd73020bc225bcd8baf14d5d8ef416d5216457d24cb59425364f1750ea1daef53facf869c41aca023d506ba6b5c86ef1a36fa763bd7aeeddaed583d98cf9c04bfb8b5aa8940f7e774516046998075015c95498282419f776de2dfacd6d3ed971d242902649dc418c2b7afe4e28277993fc44517b7d9cf938d117fb412fda3dfe7514e2f92ad4f9d07ebe06f7f6ac618f1700e599439c8aa6fcdb4d0a5fefae8505e596cc02599b25c7df147522b068e5fd7e4fc3e4b4b71e7ac9b70a2ffac641e916b31e5b0ad62df259319847259ad8c28e75583c9ea03bd779a25b21f4f7febe908802c0ccd9bd08969a48497ef1d90750fb75361676baecd60d6afceaeeca8891a3490152aa14b381ffa913934df2c0c5a530dbbd9c6b98c4ee860c1e77f2a93d0f5125c18719a7f86d14f2e54e4b786eda310ff9b40469f0f4f2db93f3c1e16eff5c2d82317fb3420d0562d72b8d79a16b6905743fc4d4b3989b296e95f04838b3e0b05366e0919ccda0ff50267a40baa3aeecfdf437d3458802fdfcf738ff660378f6ddfd030ec4c9f83866f520d3732e1556586f48e142cfb1464919a8b017f3d7d65801a547865e54d314e0f90daaac3ea8b92cacddace302b2dee4873c20bf258e11ca64f56cfecf121b65d4709ed3fc067d4148e7c03bd3ef98eb7f6871cb01b5ad05b6557c23372221479cd8a9f4c60568f950f4cbc587ba70da00921bbbb84488aeb686346c4601427fc58afb4328aeecb32b51eeaa178e3e6b2e19ec5ee73a173f3b32b80f50f6c6a42996cb205c1279a69ba37cc87aff547d4d4d9cd53e15bd14359fad159b92566298acf50347b42c0393c8eeca7df85d56d242b4ef5527427e69f7d72ca2585be7be56515971d58ae99bc79f75e9732c33b07844366e6e4c1b647880f8fdd500cb7a23a3a87a17ed60ecb805c52ac370c719ab27ee9a7bc4a84ecafbf2eb228331668c33df13c692a6fcd0348b8b53525380e92c34e0583d9bf8d90ea91f0f19faae3b58510d009b7694086f18d6335efe237ce45449faee74b316350b65c69c75c3e8ab178240afdece3ae444ef25e215c3ad741a82df07e1bf4e457ba5d96ea80e05550f03f99c481812e5c04a75d8ec2ff78113105b174d59ca25429eab585c54e550b3b90dca69b7fa6da2a387be2e29f92548d7ddd1f03a3558b6c5913185879e8eb0140baa197bb998fa71ea95a42e965fbba541667c51ed0b9b61e979e36dd309b68f761b5293ca0c49d17a4786c1a3610532b95ba4ec549f58c1e916e779bb57a35576737c493da4dfac855628781bdbc7ee2e44cb7b10035d399d671e5c9c76f10f5e895522f6683954306ed2946a1d13e7562f4b3604b3b2eb2ead45f0c113e4ba0f285aec4ca804381b268cc9f51d1551e6fe7dfa167e73569934ac4d12ec1f8d7fe3ce38f1db1890373fa10d320cdd3af0ccf2a2a300584d0ec3c2807d2031a1e0e997c8455af87ac082f3ef423cdc259f4357a4e7d5e802f85c978c83156791415ed9ebc6cfa15c097bfd6d155e31ff1a2dba74f76d95bc9d37c58c1d03d5eb61747dd7c90dfdaaac5ce36c5c39597e62e86e64eb731809c9410e718cd868cf1e79405586605575157394bda97d6a358a9c62da6449b8c46b41b2e49475175bd4eca29801dc1059cfef39a4f5aa7d1ef5b5223e08d14e3bfcf28edf82fda92a20da0f9d25e78e28d98a91bd3a7bcfab4bfd7fcc10d807479b00981be589bb07f1c1e0d1ae30f61123bd1e8bbc189d6025b59c95e334baa0cb004f4c152cdef7167f90c82c484a82caa4e6e1e22a753c3489a93bce8bf7abda0f352722b436aecdeb0a420167124b02bbb90971ef964489f87b1065fb8231f2c00cf59019720ae77046a0531cc3a7fcc6eedec288a123ca5d128bcfd67202ba55cc7de4e421b1ee123cf6eab58ef7a422a425486a0f25319d4d43dd0b0fbd2eb2055d9255de7f55d89b929a01df702bce2f75ff99a7f47d30fc60bbbf80653394cba515b1c22ed471166c3ffc713b5a9217af1d1c21b5dc89500b90bdabd685ae684b370326d501bc7bc7327589b78d21d3b996bda9b8a68614bdcd7c0d10876d580c2a48b5c40fa15961af78abd7a3af2518d25e1b3c926de3068b777a64f5781eaa74d2076e1bf84aa564507c478714fe94d274dcc6cc2337a1611950e009d1ed7b26266dd427419c8eabc89966ea8f87ff285bd9856b55a564334e437fc5545f867dfeb0b6f7e84f2a28cbe58ca34a5f30caba5dc6ad0757971e5e18b5c88a7545de76f31c56bf9742e7257f4ef0938acc353880eaf1ab57874f80f7b088ee4fa7eb18d21ade49d7f41d590d7f4601f025c2516f53480034f850836d4476f454b6115316461faefb8d790f4fe1fec8e16e2115331de23e82089a95018e8df1779ca6b013ac507a5bade7d77c1c97487a546c4aec08ad7496ba2e474b1bfcf0d91fa15b614764379b36a042a6a5862a1d3f705dc52c759b885b7359e071f2d74559c3ae9c8d1d03f7f2e1b88187bab5dff42fe712b2593036efbab5ae1d7c7c14199c8487dac50101cc08c10254c7039307900cc42627da90019586e646408a08b71adc5f244f07a9c59243ef25c8203fe6483fdb3267d121e1d5bd254970b013da39285edc34787dae8e45d3e3d364f25fb663b66a1457413360ae4d1f93c47eac5849afdfc460f10f058d4e0c704ed47295509c2a247f16f3a65d5053ff89255db1a7c27b2a5f54728478a403fa4330c1441226589fd91621d8f5ef8a0e0a65e9e2ef02b51073de092bf7976192652fce121d0848d9aceb5863fb997763167d08c97de5c7980599e0656a0b15aa3869784dd3bdf1f555063d7d208f5083099fdfa3e630e185b822c7bd3f055b461ddcf04751fc689b64c0c37b94e2bd534d727b62a9a8b0f82fa29b9a413f4c2eeddc44741572c8d0e0551b1ed884bdbd02fca221b019918e6658be5ddd62001f92a7c91dc7c0953814873ce89c938a08e11f55e17ac9cd87a43be2d21b034aadcb93f4b3db9f114ca94c95dc6b3bb0e7d1cacb9ad081db6bad68c89b2b2250b0629b76c2cbdc4b959343af904333524958f2fd03d607d47d639151381dee5cfac60281cda538bab65bdc3adee1afccb61798e4d4a5472a3b7619ce01b1b57ec088334f332d32e3d7712ddb0bf7199cb8e49ea9f82c59233cfe4db2fa1662e2cfa1d2b833a6a8700456a235875c3e519026ed14fadf14d1011adbcd26392bd706c50e67be2f92d423a238e70dacff8303e61afbdd1625c847b2ee63c119a8ff5b12f4b90093de3c010dbe90863f11b532a6ac1e32b6a56527db248a52c2ec3eedb04b1b2aaed35557adaa476ff1c09ebbb2994ab433e0ed5cd4e128b9a3072d129d16b19873800aa971090148d3a3faba6b8d53a7326233c53505a0dade681d686cd8ab46e55225132893d5dca0c98597fe18d35dad9286c516462421d21ac477e223c69e91268a53ff3f8dc783e0ba676ada03098c4a1830500e7860dcd2954da8d6874dccb49e770f468860f077cca0e5bbed209b675f4668ea2a3111ba277e165752d01aef8082e29de816652f8c22f5d12f7b4befce15bbaa1d69abc279e5476b7fef36b716c1c9f5d9dbc6a84bbdcc9b89ed6dc0af06a89b00a4ea4c0a5632c497f7bbbbbc1677dfb11f364c61dda3872805ee7f5167c0ac642a940021966480329055961ce81837703b23f18954fb6f90985244d1a714af183e3779e5ff3529289484c03d270f0e7204c3454f48e62ea5ac4c9293abc1b3d2ad70ad5a8ca59850ab4295033f769fe0fa5d9fa58b2e6ec356ae24800f7e2c28b5a220a73f3f16b8d0288b81d25b8fffca0cbb5fb5ebb8fbe4d3624cdd01a16e80a0cf9de693f32c1b9c8d6a2af2c448c1cbf2a80f4899c48a5d31e5a60af3cee6602a944fb2a5b237ed0b93e385bbdc2f95c586ef05e4009e19760639d107c04dde36b59f9defbcc02ac3399d709d7618fcbeb41745bda17aa163a22bb486fe18e2c30c99746d165aa6713d677c92c97ee54b5d254cf7a493d921490cac619fba7802a4450405c86a492c475911e404a8b4e1c9ba6fd3f8121a168e19fdfe8f4cdfe522c3b66732e6ce9546cf1158f7d8394e71231110a59b30fdeae6b91836bd3de35220add321ada3fd510a65256713a6573846a3cb71a50feacec4ce510cc40e61f6ec1659497cb8b4081af9eb46e9d313056aaa64b7cf3704cda540d232d55e30e1b5ad07843fe6be116e967b0ad4357c5f05edb2360c2a3f06d50c6bb4c6e0876503938046f638e551bdebdd91890e33fa7ed7f930500d2dead3f08b1b799c18dab6ed913e1981e352136ceccb2f30d2128bcf1bd22727d52f81d82349d1d68d441c75ac54cea3431589fbae2f6befbf23e40213b7c298429ea5f7ee52492b774ebfd0e45c8e6293b269bfb47a497545f94c06bbcabbc347b18f228109bff3e757143c793ed957a0f51f58442e53b74e1046d840dfe874feab16cbaef7c193c79c8d8b95ecb9e291400abc20c9aa987e1a825dffce8d2780f5a59f966822c45a60f5eb546a9d20e6e8d4e0669ef214134926e206a3fbea7f32187362ef377708358f7f6662b58eac83dfa0ffe348bfba7c8722f3d041117657731fe7477f9e8bd8916f138b80bb22332d5dccbcbf6fa98da7ae8e1fc4fc372bf5db8a2f9c1c189656fc44ef68f6ca0a13d1b278048ab1585e48ce7c55427dcda4830ab9306fe5c2b7f36dbcc5351241d75da09147767fc341c18512f24db15cb30f7fab473acbdd0d1d512dcde710c9a4c7900f5b8bc458966ce8ab48b3a6841e94220f7451e9d3d2fecccc1693a6346d3132b74bacef5bde1862b8b4133efe0ee62c69afde2e60f62eab510ca20a755f86d936ce845df1afed1e0a92e30694230b2e612400e12d9522995039edd0e7c7b8b6af3c1266b94234fac9cb4b29bb2f2c795e2970e816123a35d446b0b82af5ff995ac9a33a7b0cefd1a52e0383197a88be1b50a5d5a3523a4f65591eea4ab0f7bab00357b795b8967d805dc2082d6633558a68ae14f02331fe0a52f0cd48f52da962938436345db0fd26a13e3d5a56f15ba0902ea78b727f37333b680d96741d7d58fa30ba85bf9086632498ef21a79470fc8411718cd242b2c4e1fbc542fc9b43ee8b8b3bead3956bf8590c3dc8bb7cc646357e909da4e45a012b9ca15c3598859a4c44e73db8a4e6493147f67053d9e40adcfdca622db5992a972e65249142122c51a5c023b9d0734e54bb797de93d090c510e752da95cc1a398358d83659aa59edc8e4a056a985170cbfb51b09881e5ee633fe14bbc16a6690dd3ec26ea0068906e62223cca7e6370d6fe09589d9ed0a7056761d5a197cbdf96f62c8493d3f1b436d229430aa4cd18f1047bad3ee9aaf7bb030ae367eaf3efc9c963a4fde43c3d1df62d6457d4a862b3a59f7353f7568434a6bbd8fe78185a2e670381cfbc3dcb6c3f2eaab14caaa235d07f288dddee0872ea4444f5787156c1a4bcc707947867e3f250052a1dd51377c7ab30d8a0ffb1f5ef7187d99de5b0a4d2f15f9906a10bb919194cfb8d289ba81c6f27b5192789470c123effc57250fdbdec8fc4bd7ba42a6e436e8174b95f1b8fc254412e6dab4e6506ca85617e72d9bbfbbef857960015a2e48aad853a3e6e33efaa64de400c7303b4ec26ccc5ad9601755ba30f1d009d8c16790b1cdae7031eade30a75ad8484e72125cee0b685cd940410efaaa61151a693bf6a0cacfee567145439d858f0b2ef6d1f4fab3b56966dc541921199c7f69d5816a1ac15c3c179dae28b8b2bf847f75e218195ed246a1cc864b625d3a431b2a6a13c936fb46e4be11a8e596cf915ae11146d54aac537b088da298cf464a76daa3b13d852c84fa0db6fbd5ad178c48deb11cd2916bb9fbdacb5ef8ae3e87427c2810e0932b0897d3b42704d63ea64fb0ed6b31fb7bde0a9ab059856a002c6a9d095578523786e2131a32c90e83bf29c23f3b94b689d1b460e712333e0c541c56b7aa91fea48ca0b500ab38af3a89fa87501e9bb813310ecc05eda19b4516756a883a6069647c18a63e6be5046d4d4c8794bed6c7aa60e060cb4a3280d6e556b9ed94223c39cd5a62f96fa267d9a4082f1eb3eb6d95cd091268ae42bca13ad8cc18338cd976f1c71d3feb84b0701928e48d29061edc2a21db0c0f372e3c897373df1e60a38fcb2719890647c42a092b2af45fe1cda4b39488a712e70e93c9624d32f974bdab40c6e237fb57c7e75d96081d281ace4003e03da6cf2b158315fd6e17101cdc42614d78577bfa6388de450c6a6460565e896a7e58d61596e726d775aa07da2f7835c6741cf78bbb22b0e4c8f85aac3020f651c3a41d82f168b2d930483d146ec20a74644be73cfa46853e43954300cf940ac4f548271c25b804453b21420734ebdcbad99849d67fa38b3e44c057e06d4c03ffd80e26b2661c86a163b5765c7c1f617dd117c8cf06be56da762df0436cd64461d23f54ef114b67684c080c1e198097a6e6649f9f9670e83e29cb717a38cf50dbaa354588a48571d0c69ce94299289b86bf864040a9f4cdd8f75db9766d81f7e13e9e57b79267466e3b39f31d64d5b78fc85b1e4a75ed06442c8aafab416d9d2f391b92c1986b92c0b75cb3667797ca6aa50230c9c38d4c639f0d55ded8e3c66fb06dae8e2a4c604f097959697f363cdee5ae250bc82ad2d05a8486063f031fd1f507dcacef67034cee0462fd04e4b35c28637010cf0462b3dc2ce1c672b00fd2d3b48811f82bca6d30fbccb9d5fcdad2ff8a410a949756fe50bbfc4a6cdef1058ac060d8cf8e5080405247c76a86316614bc255840f628be04e2b4bd75fecb0c7de92ce611bbb89c9cce796ae7463ab98082c73ffe8b25e4496a1468c3e02ba09583895bc337847cca60efb15bf3fc0b2c42be2a21319e04883c445acc876d3c7a6150a03e98cd1b5e2da4f48c6b835f38e8eedc2dacdb35ff248a7f81bd3939ca1d0a668a224c6efe1bf77afaec80dd5b60cded83a3f0f6f5471edba4bb23cde00d55ba0c5fc081b8aefe09d5981063d01e0fbfaaba9eb81f2d7d81a6778d85d807b1542ca89843313fc69f8713b098305ec03a392ed23ceee47e3b2584adc4c324347d00285f94945dd59718b660d066e966d3f6cc792f2b1ef7275997b112aaaf4a482196402348da66bd848dfe31bd6b20b81624064f00b34de9acb449cc6ad6d0c0ad7272c3d0d6c44933a6526672f9c8c70703b86eb0c562fe12bf3455fd1940c68a48e963240db86eb40165b6e0f1d6e8dff5faf9d635b27a3a7e29b5007819fbf9719261bcdaefb390ff6d45ed75cb68ca1d64bd","title":"146. LRU 缓存机制","link":"https://leetcode-cn.com/problems/lru-cache/","question_id":146,"issue_number":15},"13":{"day":13,"pres":["递归"],"tags":["DFS","树"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个二叉树,找出其最大深度。\n\n二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。\n\n说明: 叶子节点是指没有子节点的节点。\n\n示例:\n给定二叉树 [3,9,20,null,null,15,7],\n\n 3\n / \\\n 9 20\n / \\\n 15 7\n返回它的最大深度 3 。\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d75833d84c0a729f060673f60565b7c085684842767c9fc0e2909b27d2085c35aaf331fd4cf6558ddb829ee2dbfeef86cf330246694d98ee31b2cc0a98c904e303ae5658f99b401d330bc35daefeea38b1420c60760a782633d23027ac0bb8bfe3e5084cebc872daa14aaf2af55da70ed36d5025cd7e38af5dbab57ad4dc62b58c4decfea5840465bbd48aebe6b22f03e5f7a132669d6ed2f5155c11705df105930a8f6d97b051f63af15e54e6ff61135598f483b8d875e936a9e51098e6608728235c56f7f22ab810a5e86cb302b739281acfd1594ff57eeb8134190834c4c554e4275a2cbd922022024b807311627a9e94b88bc9f9a63be404773e144fb5564e7d99427fc309a4685d1c93f938855a65139f3824ba4e6dd24ce5a7244f27529b1a07330d2b75da5cd4d8b9e66e52180710c92c54b082d20a7e40fc1b1845fd2a6e7acbbb7a6d76cb12ad2b339395a9defcc9614a2df13d13b0157673041e4c817c5d13ba2703a303570b45b8ba5941a768139455a67dcc373be4eebef750527a63029df98887ab5b679e869b7dda8eaffb73d1f5e4de439b38f2756c6efba04c0c98efddc3aef68230e71b76d51a382b71385c7ed0e856d4faf3f576f605713e57e21f6bb81a8eff671f8945b0a2d8b4dbe0d315ac5d342ce97800f15404d91cfd2b070c7dc68d1e74b816f9a8c6696ab4747017dc810cd5efe7e9fc0d29a492ac399f19d6660b2082f8ba487bfdec326c0c3bef288352f33435acf81d439b91b4469521efb60a4ea60182344d6465e4e7c50e1be9db2d73b240d1041ff2e466bf663fc412b9223f1e9494c9e2cf051deeb7f5aa7bdfaae58e8b31da1f0435df7bdbcc2abbcf8ada8cf05b894f0a2c08ec6d36945b85f467facdcf25d9a5017de5215c05ac162f633992f61d2187108b56397b061d6cdbc623d5f26a6dde6a452ee9d03f6517e7110b6778127cc68f78818eb590d54f82893a12c5cae62a5fe8543486a1850d2b59af877d20b09ff212cec50cf17350682cc43521d6b4d8f78003107edaf187a5024e65cb77362a3d1496c7ba899be1366901dd18c7d8d3c0086fc9eea0cab204ac8cafb943e60896a0daf75137e4fbd65997e8127ca249a5d232e9eb3185626cbd4c6bf737c2e6368574b186a55cba19a2b726587c6873de35b32373a0bc5ed56a84e5d974ae004a1d8c0aae39481e80b9a30ca99aa931c8ff7edac150da3b96cc857ef6ac8a6cebd6ce1ff15a75130d2e171abf38e3e7a54e8e6affc1f4335a6cfffb3cadfb099c2ae28dabd5d31bc43e75815d1d82bc8c0df138c0e44ddccc692a2148c3c21a16dc61f1ca429fbdf145b78bdbccbc896cc8c89eb022af7fcd4b1da6d9a453cd63090e7ff877ba89afc8eb34234adac7dbca81f978bbd35330bada2260df9946808f798f2c1060cacb44b8b008f6ad32dab6e401e45d05f178c9c61ab579bd62d1814bb5d6be64126efe2105d9dd41f2f5c3dd192b5f9ee98c766e773686e27ec844ccc3e487cd4a36837fc0a80828c29e35b562e2fea052448df6e30e3c7d21cd1b0d1f20a9a9d1e621602dd845eed274dfe415e45a02c65e16d70ece03d84997ba6197e6b072faaedd99e05a00a4e13407860f70eb634aebd84094796772489652e5b67753e5bb6e97db8a8b83b100a06b2e54dec8a774c573b21d7908e7884ba4a16aff965b3a2c3155ce3d222b1152b9407daf376b209742c1fdf43bd50e1eef36664e62454dacbd5a6c88035048079ab11a8ec9828086122d55b7d308e33bdb0e86346a984535c8af12aa5aaee244490ebdf611c5ecda6f8ac472e51082e91b8720a98120fa4448c28522f25f9f8f16936587e0aa1ae98531629cbfdba0ce265c4792d59f8d6f8f1cf8ff85bcfa7d20e8503dd16f455f00215a8a4fec69adf1367b221b6d2c65bf099af23dcd9173eb25fcf6b6f9c61458e4f9cc6e77b17a95526fcd9642d8033ec55b921852e85930b67b182c3d5f8384491e118eb77e656a05d403dfd97b33907f3f845fe9407b1faf22e878008bf47a4eb6d90cbc43d4ef877721a20d14fb6ac0b5de924c748ee6b2008e53d54dba0f5e19cca5a623ff8f8b0abe373682f17c4f7776da357e0cff6fd0d49002af23878ecabbe3cb71c1bbc94ef31162d42bdb44db3300211823a0fe552d6c14525bacf5e9a7a18dd65c97d3ec4a4314670b9219b1f86b5622a61805e410676044420113320ff1c5052b600dad4099ea84b6b3819e0e288257549cb82437b19c3164f74a0aa76808414e89cab9923931a969f46ece70ba7f639c5fbd9b734dcee9aafb08c006941f8de6e1994e45a57248c73a596e7aa91d821c4727887445818538a6d9b769cc6de45f254973d36ea2a5883407d61b7fce865822bb12d01227dcd27fb90523d41a157e83b55fec73ba9e5521389b9507c1910c64af15726f9f3adbba102d73804b7f6390667cc19f7626ac2f2d78d623144fc509e9b8597df76514fcd8f4976bc31c1f72e9b91a4e53106fe16c9115ea4f5c6c95e59a6e8fc31114e96486bb35314109a40f15679709b97c572a3809fb8d8f2901a04dd8ff013b625196fbc5ffe67961b1339b5a83ca84618ece0d1d1ad589bec99a4366dd3b8b651a0bcb43296ef384de503f64f389db91bec9721517f688270bfabd5b2a5e9e39e1fa4a9d3bb3910f52e3d0b4274129f5bd0acb5480ea7e36708160a57f45b90dffa50cbb666bc8aff3f5131c96d10b5dbd8717a3cab217285a4ce5f7c90de9459ac8d1abbf8fdadeef1d34d673454d160c6941e1c5ab0bdd47b0d75094d822030ed903b4b132db66fb3d051610600553835c193d31653878ecb0d73e63def4eb1a024ecb7bbbe5422754907d1407a88a6469a4184e53b9b3b9b88eaf4b95322097651e44c8e051ec51471a9b3aaa44551ff08d0578fb8be06de2dcaf17c4d6655e0c0870b6efdb4be30977a6c64467b61d8b281a8e5a851412b0f49ab983c4bce4aa01a6f380c98ad7515f0f59cff9349500fa21e8dc07e3b94212296d3cb282c0065307a1d93f69a36357166d126c028200f936466f31145d449f765d576a4427fae99847ccb8c8da27c6a595eca4737e2a53d9e7d864ae4e409ad9b3a8ed5abcde79adbfee59f7dd3b211c8868299ae509a5ab4b0c95191e2c43b7fa443660d1d8b044bce494594bb81ed57f60aebba07917cdaa3bde043e8be6e909ba41838c3e828c747fab20f58416f0740836f7e554535e07cdd895e442573049f42c8dec7ccb0fa7c56d3ab1cf288c80926971784d1ff6093910f4b63051da5249c349bdf61049011c0dcd1e259d5cf8391d645374cef273da1c3bafcded9b319da3917d43250b1829762e4e157c97e4a1fc097c0d49eff4e4cb9125ad86ebb9cd1da1a8e0f54edf4acd9558ef94c1e296abdce2b6dcddd0f9141107e86a9b6ccab491edc3655879127d1d41867d100fe4e7e3e659bc064187c58fd04e0d02db1c2abfbd66d68b370bc612cd0bd2f3a206f5012308043342c433b795f646e148e972851d1f81ad9da816a70fd48064d042ceff6571fcbb44afc9e6e9fad4e6bd9f13a8087461923360e80cd805201fc3fcfab83570e8632b6312cd9dc673c5661040b01370e3549ed3c7a2a1a7612444f647b11861f20f275b5d9f2699a9ec1be5753fb32eafe62b7ffd0d19d29c9bdac74597527a096a55463d239a22a588f84da76beef8e75da5be00d77bc2344fdae5c2a3fc21344db5c1a1cbbc032088d60287363bb76e97739c02e7b4383442c858be0cbf6f5e7cee7778858ab294c766fd520f432c5200f222403cdde85634e9680537e3d70aa0599301bac782419f0e502f2e790cdb891bad4ef75ba4a1e55b07625b0df6d1296af9bf6c0cccae359cf295452800b29b58dbff5ee8cebe88621464320c31f2336254e95d47e1cf69d82d950f14dcc285fcd49e9230cd6617bace23923b1c186a06fa538ca92429b8b291963291cada7cd4f8d0e780f27d5f768d407ad253a8b62fcddb79e654afa615da8310e84a0b45bc797023bc11886a7ecac26ab91d39a14d3e429584a248f3eed76c33a9ba0ad600f6459c4d757509b51fb0f52465d615433729fa3b694e697a4c0ea7b2dbd0248dbca5dd95b7734d0d62ec9d06c788f159be129f85a079f9fa2a388aa881e7c743f992332b418987cf76c32e32d5beff8425721d8e69393aad18ee6256b566b31c567314bca4c2611494c64a3bcc894e279eb7b80e15bb13f11d4607afadad4a13fc12b998e3c0e447f0cb53702efeaf6fdb308db9c5451f6335530c4b0c737c621a43b8141b456aaf232098f4135c0c4f74ff62592f96f51522a1f52dfa35d9292efdbe1f5c4acb30b42418a5dbe00e2d46aa57aa5ad133b2fd1bc3ed9d0bc131826474e196ba0e8a2d85d242d673bcd920903b07bceab37eb61c4a8317f7a2e5e45200f3483f1f3eba3f5daafa7715362c8f1cec502bc252efd3dad88f424cc1660efaec5ea688e4d3734f4694d4fcfe3d1e1aa209643b86de7048e1841cc5d85aa5a6626666e90b0ef1e8da181c66eb8e1cf212f391bc06de34883c0edf33e02d1da314b60b89c30f8253225d2ae56a5f83f8f8bb881e9632ffd14e84598b21a825c39c2c8164a612ae5034fc6097ac73279a9fb325cb6c204930b699e3a9f461d5e725bf2b28442bda53dc670f5bb4453fbcc564ac9c8d4a8e128161e8ad7523103c1ea25cd4d59371aaa2913f050e626b07b877121c4338d965163ae4f1690a13ca204c4eb24e0776d91e006302883615e21810b03d38893fd8232b3d212a745c2209e1a4a8132327a629b51e56af099cb0d0f279dc52d5310f9cb6ecb03b0a5f3a9a88b1651c68a9e653fd35f0a7200ac4e8a186a5db1707b4b03295bb95d51e53ab89c414a733b7d0874d7a48bc25dbef1cf8d3f0dc6ff79f596499e4b4c0c136fc0944930c262649cab94277b74bdebe802d2950f32b6a11bbc83e5baa394e1b39cd51202d1302e8439","title":"104. 二叉树的最大深度","link":"https://leetcode-cn.com/problems/maximum-depth-of-binary-tree","question_id":104,"issue_number":16},"14":{"day":14,"pres":["递归","层序遍历","前中序确定一棵树"],"tags":["DFS","BFS","树"],"whys":null,"difficulty":"- 简单","description":"```\n给定两个二叉树,编写一个函数来检验它们是否相同。\n\n如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。\n\n示例 1:\n\n输入: 1 1\n / \\ / \\\n 2 3 2 3\n\n [1,2,3], [1,2,3]\n\n输出: true\n示例 2:\n\n输入: 1 1\n / \\\n 2 2\n\n [1,2], [1,null,2]\n\n输出: false\n示例 3:\n\n输入: 1 1\n / \\ / \\\n 2 1 1 2\n\n [1,2,1], [1,1,2]\n\n输出: false\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2294143385f274563c504b5b7c0856b8952d7fe710b3f0987cab7ab5e61db7220ad3962513d4f02ff460b3e5f06ee02c656797d1cce04630c3a88cd0496d32e132ecfee24fdeb279c2492a7dc6e71462eb2f52dfd66e0b173415e7914e7d8fbc2e6a780a7a3aa062684d198357e0f19d2228507ca3dcd861edf62dd964d247147f8b115412dc22738abdaea2845c60177a0d16a1f066227e4ff9907f1c5e03aad6db7a021c618f10e86f51f7121b528b6d11dac80d03d0c72e37c1202b18fe1f9c356b640b668ebd77c0313b7391b1aef51097fc70e0a12645ab98a3c5d24d4167aed0f22e102e25900f32152f4763c541db99ce3a962d21517a8e41393cc5acea169c6f8026d4fbb247b0ff0b9e136ef7e60a8590a03aa233533b975768eab83e59e5f60293a616b5d813fb68f35772e0fb28601365daf5639ab1e900fce7aa88d0ca949c1f97568e8a4f5c6ad783f2f375b88f976bf79efb661255e7eb34c5c61baf421fddb4bc3cbb02a7801c7baf2f445571dbfb5b50fe4429da65639e465dcdf2e049cbec4f7b876f3d2c58b2e923471642b067aece795fa2bc9c6daaeeebb9f679b57c6a625ff40d70fee29179fac78aa0286e5e9c3c7355676f350bcc6faa97f5c2fab836d2e027104fd844d1500c0698f9288192e4602e112b90beb28a14bcde398bfe19e845f6c66dc6c4552c645eab6fc9048d42fab0e5eb162b82c3cdc33b44d67610cfc89df7bbe178b0e3d19590bbc65b6ee423fefeb97d40401d17825182248039097f27ebd398e2db96733f5b1f7efea9bdd8eb5de9e4e31bd958898130e453708aec3306a6965a71bbc40c7269140e0528a4647ef9996d11797f027a780fa8b416b48deeb0d0829bac0f09b4111333e0d0e333874b781dddc4e670c1628d2286176dc165542201d72475df4cd7ae26450a638c1a6d3e960c1c03e44b454ed828c453a881ed434da3559c83e63f92376790fc6be6223803f88df09e50c1b55958d5f84449bf0b06ef53cfd29cab452de795a2ee8500de2a1b0aff66b8c895b954769d7061a317e9c39915169439a010ac1636a255b2aa3c4b102f9203e9917b030569b5980dbecd00967b5239e570c5d904a42ad20ab8abe9df96460e31a5904d0f9ce44a3b5b232927d4937b1d5dbff0a32a6f4298709c8893f597780ef5358bf2188e7b81666c47633f264475b95c8d4f530b55f9135b29348fc93819a843ff20f6668ce478d7612a8d3d97a2490dc92437169ebdd345541e42c8d2961c795b757f3467385d65a11451c95de15080372f671fe41e4814c860feb85a726e5539b48f1619a070f91d3c8426d0eff7cdd575f3cab3f2fcfb0d40c74af098b88bb318922053da51187330de7ecdfec8c5c6645cfeaf34c3826cf388d56d015be4bb518e7351d7a1f982e4c1160e401ef941a0126acb1fa7616ff2ef81240defd161cc3f9591513156d05114b0647192f371348fb3472d3b66c9d2e3e095faf6118466293d0ba8da479b627913b7b10f80640687928d08ee5b5917c0448fe10fe9186ed5b28c168feddeb642abf4716c516bedf905e34030d4240b47d35d46833866492f91d529f163637f1e591ddf95effb51a18882707b1cf252da16afaea38305518a7a0497663d586464155685db759ea0b51433043082ed5fc1874d63541e21dabab37488bc4b1192fe59ab406b5a01f98d6fbc6b7f9e5190ce11cf231c6e00af1e81329ac8932d78b797f01fa5e8d2b88d4266af12cf38e38b808c0b5434d9437c3d970ebea8ee6e6c9388734385d001aba9ee245089254f214f62ae3f73ae4c3c5e373d5c0639639a6565b33ff526016103bd82d23350502e49b0c7fe537674eb88098e37f16fbf4b549b8eeeba8abba604e4d88715c36af3689b67985c06f5eff0adf3f571098354ebd7a71df6d5f7178fbe037ecf5db82d76d60249cf32839ab8607dc56c4999d4ddc2c826bd29ab57f315c7e01c36ceb245015e898de4e162a84b9329a3022f2db62e2e3a22cf34cf88c635ccb1d26cdbb85627dc60b776c3abf1570be1340e0865b24dc3cb0f20b02f9512f52db19c22a5d213fbd7a6c3c033e2b7f7d5a4a7f349681b01caf174659d744d065e38f0a092e20cb1d187f1aef633ceddb59fd297fcdb629d1d9e1196ecf20f7b0d97e745459def353be90a8eda19b4000e394a41e7dd977fe51fb70957a2a0b771d9928abbf8fee4d8a020e23e021db012d31fa86c823d253618766a06bbd1f30e06c4e0eb198a9f8265198a4512bd212a744b8b2bdd7111834926896038a82b59fbb7fc5a4f52783d1fe7b641a3cb21568abe0516a013cc67246d632656a115b9fa6aa3e9e5990bfe4ebd752b50967d9160a07ae9645ec50f2f69cfb5af2dd66be29bf2c338ff7dec9a153941bf5be927083d5bc6622aa893657b9ffea8d454dd1f919014177b3f138562c4c33a26d41521af901389b4717052439ca6b346d07278fcee990d4c4cd78f093936b345f76893c3afef2308e50cfd1847e881513eb751b3a5e238521ac81e2e8155585532b31cd7eed00e146dc354561d450c736491cb4c2ef09561c79ccf089842cc53bc8939f5f07aa3081af9b88997e44490a383e53024c5eac858acbcf23ac4a07719eb4fb35b29c0e5096137f72900e800e077346c7b0245257fe8607c1027a6f831f9c2ccb3be8f3eb9cac0b58eae0927fea0d384e933f5525d14a15664ca1e5615aaac940fc5a1714054b4edfc29ee88126462c9da765b42ff750a9d2f450a2b395e55b385f3bd30e53c3a91de8b32503325752e4c805c90b51173abdfb9ba1092320d89afb9c4d2dd86564c399fc1621b10fdfa38c57bab5a6ced4a224d7cd5d7ca8eec7bddaf70c4388065c46dfa34d4546c75150bf5f0fff405d03029ad9838d5ff7373282ea437949e05f53a494e9a2ad64022ced3e4c5256f119eb60f305dd1509abaecb09ae621240d5b2f2680a897c2b82b2bf6199b0f0bf8b8b8a34762d5c3889ada92dcc98e8c34972cb17eff0fa2e516720d9cea80c999e581349bc32c287264c2ef5a841b4ed838a921e863eb8f6b9bf352813a1bde948261c1d9a7c1332e1c9156fd1d81a37dd67ddf7dfae423bd913fc0c0a384f9d4c6a5aa8328defe5a819a869fa2028008b7b4854c9bbdab3555e70f275e4e8b3e42821441d3a28ebb7df717ebeb4d827b96e7fcea62f9bb689693b11c38d6a133bf08b5e61558353d4257a8746f420235a431ae815d554b0b41da4a98d08b89f6e73656ccea04b79cd34f728b11d6ddf84680924a2f1b4058ad749266d2987b15c844c39c83ba1e969bc7cba44d6409a33c19b1a8c8d8dbc9cd7bb11b289b0511b982cb1cc7ad17da785609e499cdcda9e91e6bbe565dc368a0dc83c877960e1fa897af833fa4d3265f3d64f2e16460dbb464f644246c89ade8f9d34f17f32a42c2e868cd8d4c5acc0bbb7b1b7a2091c065443e4f9e47e09963e5c2affc8e017de339e96916d7b426043b79151464cf5d60385e601d0a282244dac52151cafb46dec7803e24b20043187b60a3ff0c35cbfd0cfc963e9fb0536b97a424898347196d30189bb680531cfc719ae7cf5a70d43bb663698d893520137310151c72785e1da532376b423719051f503e40cf5766f576b6dda877dfde93b70a53ab6eb2d472abe7c88d9d6f86bbe772456021f4d9ed183b97339300728f84da76b180870ac855a07750c80605d2e1057225b9341acd5d1c4f97c9384bf413633e469f65fe737c9078115d834716c6cff49be8ebedc7e7548854ad49576048c13fff46cc2b1f67364b81d1e6240ccda6056e626eb50d861c0af5374619ede544fa838e82dbf4b494a70ddf0f40993480c90d7de1ce1062611f49267af44ef80317070af0b67c6101306a212d0761b08997a15fb53c732d20c1fab180081d731ac627c0a1070b41df3ea4d46feb80504ed6d1222b1734957aaf647c2dd0dfe79cf9adea61060cb21ffbd298f21c6cfa3c4a8565268b6f334a1b4adbf663e2fae8394e6a124ded3726a6ce219417350376e0287221e01493ab68ce888639eb0eea36de11400b110f370f859bd8b33cb36c80786cd18784f589533f4a557040790e1e98ae40e3c22f09906291fdcb2810b23e3fc3f246a93b29af59d6e913584661017e30d99495ad79e5b82c8244cd44aa8c47eae0773dbbb579d86f7e5138671e20e89bc9b5d052a8ca8526a7affdcb9798603d27053ce347b41c4d9e1eb5d8218ee67c29584ef3539d0948f1fedba1ed23ece522291b7741a0004084d006e8999b68777caf039108f821b1db283908cdcd598ca86707769227ec3214e3bc93b7aeed110bfb4c36511c4f655c174cd6e48003bc39ef467860bd7ba689273b09dfbf19d0d08e22d783dbadacd4a3dba0d44f132f7716cc950f009d6bc497342981780ea6d8712a7646060c369bcd343f07f8fa8aaa5f6560cfcbcfe412b93d0312802b8be51ecd0660e98acae9538e4e130eff6d5a8f384b514f3a209643ba73e506b8108957a1441120fefae1a27232961ae9f396a13280929b03764c0c8b15c223f0c7b6960946b1f3988a870d5b59e5486e12b836f2035b64d6b7ecece01372cbaa86110e7fc58956392f408c8fd7baee0460c7045f2baf27e0f64b1db6a475b07b009765ca4fe9e5ffd3414b7220d8e82dcab63673d78342850cff67657b55778fc0e50ab7414fb26e6ef812c0be95897ad9d535825cc650fb5d85a33b9756208ef37ca384646bba258f5141b77ee2c10f6f91f4f975f3e3e71cd6fb5371597578b76a4ff6308c51c326a5c36cd1f7988dc95fc64f7a4905caa9b3203ad58ca74c0cda148e616f7338020cdc826c6e47e7c9165124513debdc4a99aae62ef6838aaac3823fb1912ed36e169cb03b501b205e110c3a068a77615379bfe91a57a4101a87478cdeabafa87f7de99a04d2941e6b16aa9e872118169c1675ab893f69ef475f541c642e4534483086cd7cbadd4978dd190ccccee58a96a34194834b126a75cf680813e600aeb1c4e349d212cd4d59aa73ecb93a84c7bd5bc2f1ca2776036b9a155a3d1a38791279a7674fbc17df10455e0be8abdddd5a1a6e3550bf322311b4d20ffa9f30dcad3359de64220f09411c33036346c0bcbc54e21d884141f23ccec57a82da9489eda54a4ab080e4c60c5431d5f6f5dc37709b861c54d55943528cce08b670b91f6ad1e4c013f20a6b2d8342d6d17de15adc957564e3bbeaa7f59cfd0e1e43a615e4a59ac50c7912bbb74671c434bfa68f8ad194bc9f91cd220e3b751a9d64c29f3c962f1cafd6503701b55291cdebf8f56286898d215c0bdb0fb07b59e15017e7cbb26dddbcaa7fb824359aa7ca068c9b5901c7ee59bfc0202c03b3b0ec25206c7c245e9ef62676da4800ea2d22bbfbf46eb96cc554f34d15c0a8807c75ead401d3a8fe67ea78085869bd6dc48a90ae44f4061a60a122121ee169637f3889a96981524619b7e2a081dbecaa375f346b0ce85299b0296c255ef326536a2b9cb029f432cdd2014b4e92ee09e2c6ad1fb16eee0e633c43714ec08865d8b5bbeade5324464ce6bd1c3df04455ccc674c283b85337c8506e9a83b4d6d737bbb0618bd52b3deeff418457be7c9f03969489395c4b704e7c45c16a87a82761aa167f22bc552674689472f3c1da86d0d473f1fa1b8f31ebd70c660ab0d7e7824c1608610f885cb9df9a285e594c66232eedb65030c2d858a481e00d721d98044f3387c77da2f881075c02a765cd37d015fdfe503b899ba5c90924e5bdc3c1811a11e5d1b38726e6360c13ef8d51d4cba0961fbf426e25bad00519115156e8feccd873ef069deb72bd503942328ed7bdd6580d41691b376844c5d43a924c59911601d03a3068ac0d0f6a09bf407a86d499cf7b03491647661e2c1413edca30f485b8761e00cca768c4634b0061dcdee892801ddb6096bd8b128d651c33df12312428f218991a891d4ac666219c1cedda0f3d7b05d49431c63eca2268b17a4ca0318e18c4cd5fd0373f0d0f393c265766f50be36cbc088c6e367338ca5836c95908c449cac7a4776451b6b9c9f78eae4cd123e582ec44c836833cbe38212e7ee9b8b8888269ba71819117866106a5f3369c458ba8bd5e271433b8033a19e1464bf604a09369fa532ca828e3db4f4534becb87efab3014fed42fb56ad2b0cb0e27b7ce995d6f35edf994ac65eadcb50d14d951650d0805ef7e1d89af5aba52872fd40cbd41a93546f32e7f8ef8acfcb9c2a056a6bf199bbc549d46ee490ae48a4d92467937816c870ba4324a3492750deb2e466e7503076329e5637937bd8aab8ec336ef507bbf069b727b7a70b7366a083d8c0093fa4d562d250b4a88c2546b1f8c285170d6e620a43c9731551c43cf451e1932e1b35a216357bffbfc9965fca33166ff1ec912f1ff367a15e911d1509106121e96ee0f4caf983581cb07b75324224e3ec089555820a3c69937e87e361b5fa144909ad5671f641d8c67d839a260ddfbb5db29b2b0e7316be2498a58c11c119e8ded2d6e0538df9413159dbcd7ef22ff9eaad754c1bc8c7ad561e0e7148cb585c5c2c5d40070b8034073b7b6fe260085aee970f92e257745c6966fe65a9eed6165ac47fff8909849ef5f1b6fd297e3f3058f4e7cfd6c7c25bb8a8dd8acad2244364bd1898f352317a934f8c53f90afc20ccbcc039829df3aff5178e66bb721daaa3da107a6c2688131f301e58bf2feadfe5e827d328cb8e1715fdd4ca9e969ab9e1faf05f6e3585746ed28eb63118d9cfa6c9d8b69dae537d18493d9cfbb3a8a1aac6db3080bce000ea2b36f7c44fcdc8482bea876f0cdf5abfe1882bf670c502bfead3ec6eaf651b2cbd4f8b9102304ab82bdf6468079897316355b3e4640333e591b05a0bccc4417e7a416628875e3e162c1dc539fa1ed817fd3ba1d19cc481def89a07d249e295ab45235c3125dae2b33a715768a89c0f5e9e1464b4ae8ca988af9f124ddcfa119a5f4708a35017205ed8475aaff72fa8778f7ec477101517cea954da0b0f6f6803efa805260bdd4281a9c1f05be688d66f6cc624877f784f81573dafdcfb3ddf95757ef5c359f897aab8a1fa501e79752a96cc909ae1c1138cae19b1caacb8caedd889a30c183f6f721decfd395528dbc43662aeed59a13176bb9c6c5327d2f5db1944f7222329504c2a197c76a266f2f30c69a659c394ed831cd2be78b6beb8b95219582d788aed23c00b0af7ca91e2d201e18f76314cb4309f18a90d517ab839c7a28ee3406f58ea8f26e8386ad5d28786a4d0c681599367634585d52103b2a30c9a7a3f1ec4ef54913ea3e4f0d8a91fcdf3b005fcec72cc50debfb34e683592076f5155f248a4d8a52a5002e26f104d8144731ffda74707de4e6f9886aa36d2faf6f02e465cc501c27db810525f1a1e990e936a7c0a0a5c78c8ea7696106b11e02a53e007e796f83b30205c7e8bad7ccedcc734f6e14a95f9e6b639ad64ecf83078cfc6ec56acc38b0ebc708ec7bb42bccaba9451d5426412d397b633a3d857719c8a66c3378ce995c6a26894d4f49a4e573a509d328f386420ef97a9676629b4fde54160a92e22829d833f62628c58103f9c7d3a59c982ec9b77dbffba00e6d59874927aa8cee66ac3999c15b78d6a0613250dfc4ef0b7352dbb446df9cb92e0569d63c5d6360619e0c41063310e90dc9b035652442ca528f0a4e4c67019e52ab4875360ea85173131fc8171f0d3a3d01c046b5944caa5e154285fcb0041e777b6f4cba8388e78cfb6d296ffffaad33e129a7301537997e00cc27cab330640e049bb9fbac6d5ada25aab93c7fb9f973b9d5f70f7ec09bc2885e1aa7b0eea0a734389c552b2bb5a9e8a8703abc71267bc948b0a9b928335e47ea8e8bf0df33803a8a7f5dab15c7bf109e536dbc26e64037365bf2afc30da50ba6ffba3671960f07336fea0515a482f44619c6d6f8ed2b0561ccbe81cf7f1844120296cf12ef0283a86dbda8f212a8d402d30fe762f5acdb7bb1dca583f70afe17f44b798101871f4712cb7a8f4f687ce6f7de9264b064577f5fc7a28d4bfc3dbbf0af425944bca996c2cafc05fce3ae8da6c36823a137eb976f3ab8140e50dcb34974f10edcbac1708c08e7ad0d9c50894647d845643c52d90b3bcff365a39276928f37e5ec8ae3fcb00dce573de228dacf1ea79efcf161ca70244c1f3573aa10ec9521df0aa714538f0303613633948fa2edbab7b28427dd51320843de241a7d9105331924969f9e456c4fa18f2b40543722b430f52cd17a3fb182bb2ed080a86b815d19ed2b47d019f9e623a0a83adb72b45bee8ce499509e9d65f77558e8e04f045a8f54e4ae767ed9889ecd008f3e37b0a38b6149ba1a51c74ec2cc039a10595f3846617591d4a1d9cce9fa5377137db70d000065b80abc1fd87ef7b54d8d4aba2c803ec1a9cc7a86d10a7bf1b6e8bd626f20e7af7c7a64c1ad24662ee2adcce77ecf9774d1ae5c41d9d5e08684a2f62323aa75866b9b2845c06b522c18453ba1d90a4fcbad8aa2c03ea654550e67456709fd7a43396666083e726d887e73861bd4814cdeba2b92a5e41d7349918b0d7e77fb7a6bb3f3548a9bc3b3d554fd2f5d6e8044c677570c7fd5defedb901917651af1f8ab67043456e5ed402fbd767cc8304539b1fb9fc7e7e97cb49027db856f3a8e4dcb8a70dfa13110fb5b72e59bf0e968ef818eca07fa3a3333145001ac17659cf26e3df1470e5d70ff44516f065ede7164db110ecf8713c29273a89c7880d13f73a879fdb1eb3ba219bb7d0096d748a240fc9a8a3663460675eeb7249760ca9e0072de63f73d32ba82c5bda06063cd1b81ca3014196951040ad3040fc427c2dada7cf0d727f2908291682dcc3448b215c58aa25e75aa679a40cacf12e60863da448b66479d1b87f3d8d6226db4ad49dfad14595488afdc96dccbeba7ee9a8b9b9f4b679f2d11c01682d97eebc4ca0823d4371ea4072ad765457b9596925043bfce4a6672d90045a45d048461de7776aa0486ef94cd21da7bb5e734172daa0e8c5e1c2f8b6288dc078391c96b137be8bba0fb49b8e949ed2759e5a446c102927fdcb533591d7031507b6e13c2fa621da48e51d26fe0af6ff2605f10531855ff19c47e9aece125585d089b959703b129cbdfaa97cd388ef1ee3fbe8648333ede30562c32292c5598103be29ccbf8f885ffafc8f6d3db3a511aa564d57afc6a0b08cea23e43539ddf793a0d7fec972664b7f364f1ce15a83cc8ad61ef987c57d5f6609a0394ab4e4b6d4bf3d8724a250e7e3fd655ab6d4ab464e78ab42b8d480d11826d32df4edf6e6c8b089b90c89fb0ddb0328b779dfa65d108cee82cb24856e3a849ac006cb257a19d52fea16e211a0e2acafc47a85c4e09c53024400d6e2821f0c2a1ed39b5bf15cf5704bcb3a5aa91478b7a9263336f682688cb0c79d5546f95550a3edcb431975e06a4d2731243541371293f5d8a623e6fd17a7e3f44cc4b5d626a0a1d574daef8ac038247eae1df28fb71cd740a885feb9f58e4e3981850f10aceb6d4537a5e06989952ae03d95194de55065a778bbb59777d64d0855c30bc569b04eb0bca3678ef8f78e244e030fa85baeb63787bc583a4146dae55541e633f8be044caab08fdeac5f4da5b6a2cd8d94698bae282ec9c10eea206eed04304dc08831bfc19aab4187b6b6b5343eb24a18196b15692acb373d17eb658dfc6b43e33a56c810bf28087cb56bbb1dba7a04ce12229ba30511086a8c1636649f4393391dfe9d7f5ba836a2bd34cfccde830274daed648c4baba043811e88b5ce6b55637abfd11f7d22b1f8c2c17fa81d61e8f365ef6752bc8f38c8c2f1a9f584a5754847b721c047950782403084352671ecb708cbab3b2e94d21715da38991bf538ce60e24c78f22d4f2d3f5dc8cb656206024c860413a7c4ce51a97311cbc0d0aeb8b851eb5544a48bb568d6ba94ab0ddd30d2be09edc8dc74a35061dc663cd2dc03b86e0e2b20bcb838751dd460ff31c0e22515e9bc7c242fb1d1281e6d92bc0cd3126fbcd72f712a13427995d6ff3a345bc326b745827c60663a6826c48ad625992f8f22aa96cb7403422702578a1f1099791a04353498a0ce44861d8048c63d5b31b2f747dea9cb73cbcfa2766b4d936083873d5f4ac1197c063f6222b05c9c178b20b41935d175ead17ce1967901e9072fcf407dc921b4ca55f463d7278d5389bf81c52b3a81812202935c312068fec12e61f0147c8421b984d75f96938d1530a3d0e0f17cecdce549f4b877bd138ff136ba3f5f0e7e195ef360b30b3d971df80819bbbcf738fe5f07d548c5e01025d26cae9bb16b0334ea8c5fa5b4162ebf55e42c7b097e01439be2ed8d812767111bb263d9081db7302382f628ad48d338434d485d4fcacb87f9db5315c2cf5b47b4b2ca07b91eab318313a72f32803d07589094a1172d4da52e1f5465111e75e44447bc7db7a434ab4965da29b571101c15175767ff2f968d24e1c3918c6b745f01ff817b63e37e75e6cf73d8f17fbb3f2e765c350ba910e47037ab070c5e37ae325392e71b844a68c4a55497478d1bac3a468063e547dc9641ca7784acc1df03d3f06a9ccb2fe069df061d097c25279ef40730a56a48177b4f8c1c5e4cdac99e02910e18ccd66cbfff3291d0c49a7276984ed80711867939cec3a393beaf156f8562fae9dd6b6dad1de377f186809129aa53daf2454848f6d322bb33a21e8c0ab33c81cfc08ef1cff2473cc9a4d2641a99fddef74cfcf9445b420ff6d1f73d69ae88155bcbb99a241f19c44b81646bc3960aa25de8da444bed6638c0b1b8db86db264596820051c38558ede265a47185ca38b93a1efabb5d284026d9602058518579722b4c90176496a31975f6c25e095351fc32b2236d8149e9c9a01e78cd4915426a80492427f480381104d2e5acdbf82cfbcdd050ad1bfbf7c9a55b38e0ff76e6bd6930c96341c4268d83b07cf78c97ab9beab0fcb081c59650b060a17a4fc64e837ac1456cd1334f104e67165db1aba167fb704d74c95d1d6429daaa324ed43ebfc38a750c5ae91ceffe4752ff3c70623193ac0e6021ae1f75be3a26f5b4d0730747454970f698d99808e1c5cbe830432c54c3b5723017f7e09016823a884d489f27e16589a9b113161b9b98a79844b9337c4e4abb9cbcab044d08e91f49ba87e9d5e2ab222d46db3bd9067c712b49b215725093c964ee2ecbd88b9c2703b99437eb2c7ef81ad3734ce1af11b4bcdb2f053ddf955768694fcfa4e827f2d43346582865032e9f1c81deb3e9dad931a38c762f94227affd168206af70c4fb36edde760f4df2e04759b7031b6b0cbfc1787a26b6859ac461899779b84b1cf474dc1ac3ee4e9e336f03ee0cc16831e571070267e3010e05ae31da243fdd6e7fc089e166af6c8b575206573373adcdbb3cfb0051019239ce7163882448a02cec54bffa92d437e269974e1e0b46631107ecec08f0004d6645d92e43c37ade23bdaf045e79dff4e89b21c8bfd7855b485ca2e160dd35dac2011a1e3dc399604de1b966e3ee8442d259458977e5c9b048d151b2f77073f2dda58a8d9bd82a7e056910bb3311d991a47441d73a6a9efebd1ba01b14f3c649c646e61bc743e6d466e664a7e2f9ee675d319f79c8e8fb40cec2c7131521ca0e1bde6f693b6f4ea1320f54d006364f8ba558391fe6ea03a2c1e3d4f95cde706b821910dbdf61293295d3aa075080799d4856e663f2ecc1eaf503440291c1ff6fd995d4bda5ef13e3ae3c8c3c53757420292c33553794ae9bc4346cfac3182b86a2ec261cd0184c4a1f70ec64f879cf4ae2d7157d95ce337b1b3d76be0518c9fc3d3cb1f4eeb29579721201ad6e8851412d7f27a699ef57503dc33c5e77a77e865478ef8308a1b7b4909695b4aa5c739934be98ee5a41d2664863de096abc5619ce7212efb5c36b9f5e78568ccd22aaa57921cd19d6407d82f46358e27221ccad7ead3d5c7ae34cfc58935cb5d6f33b2f204c5fdd47423982869fea80bcce491bd901dcc02ada68b5a37e76dbd8483ecaa9f1790fd7ed97876842d6a7366655628a19f5d0cce788a57f08f60454db985e9ccdeef601beb91dafc119ba8caa24817e39452d596226ba5e5e28dda9f86b58965ad973a9f55b6c1bba5071be2840f4201a75dfc4f4b2148d81b2b632ea5d3bfd5fe05d5551c2f5f5f958b5a743d6d229b28927ef3ed3e6ec77d2c46ec8704cef3e088d504400a6629b074031d8b723a1719452efecd7491fe65d801755f61b9a8caa3bdc8638b6ec73d4aa0f688ce816264da86db3c2235cc479eaa06daf029c22be15d8b4861a0f930a8377907328d91c56e1dfa70d34045a16b6638bdae53455da031107c9e64f4cb1adbfdd09da6efd259ab3f13a0634e3921359599cedb25ca8ede2a9f7f1a4ec74a5fc9c099f7e7af2cb58036f5444db8199ac1fb30c6d2c8c99dde834b19884bcee6bff1a2868068d579066747483047c938a04ada10f2abb902cfc6b60636254828197453d90753093bbd82ae19e46e1a93b9bb6f325bb797a5a2ad00ba8d9d77e73072acacd15bdc231493945ea048c52e714ad9509d4b13d0b3ae3e73cd5d3e9e4d4d6d46934e6b7137f22e06dca3a611e589eb820d302bb1f5f1254841bb7fbb76b9635dfd1d6fab8fdfcaef8b3d12325ced0fdd200630a7e9028d53f1ba583ebd31925c76e87f6586a1007016a9a84fba08d5c9c833acbe0cc65b4180338a4281152a172bd1cebf1076e5543ce7bec89e163cbb3398a9e49095078288da40f8f7c560a6535665c7062709d04888bb9d14ab834615450dd70867bd73633b9215f82e4af429a91cf2d744e184f6b0cc7581e4979f07560e4cef816fe9be3c84daccc0eea1be8495796c61420fc0674c7b9ac86e64f368d98bf04e492b5cee509b9ac31154549cadc4901578441969f5bd16964f7debc84f5edc15c687c476c8dcd14c2e7a9f3f5dc5cbe00e90015f6d3cec3974c5d8d778a80dfbc0c550592ad4f9d6387a973717bd726f6387037db7d8da22683e08dc4f2faa11e0a593a813dc2f31038e8514a6f43c61793baef3d515a77e7ac9b70b5d5fc365bc7635f90dc9139966a8f1899745991b60bdf52cfd7f14c9b2ad55dd90a466cebfb44e54553aeda93c12ca4dfbdef1a977614b00c196f39e18258aa88e4a8e7b4c012298c007ca7583b1ff5d17647d62c165a4d66c19885f0d847c521d4e77b2ed0cfee02111863fe30d4950a7c5c90e5cca7cd9a1365858f4a8483a57dcbff4d06a6d1c1d5669814c4f9729bb98e6b5546e53270e88514ca8fa4357d0a45979b730bbe9492e9b099817c00bb33908271c424cb01404686e3919d04bb1a5fed470890b17bb14919d78a42dec7c2671c587b3abd0302df8bc6516dbf6b648c9ac5447a784d5c9b1a0417218904621a61df9eb2e1e390b8cacddace307b7fab4374cb03f92fe712a0572783b4b73bff0a133fc020cb7ec211ae3c4bc350b6caf2fe8e079a4f08910d200591727a791870d0fd85466e46fece504ef01b05a710a04d74f6f6dd678cef6e7d7d9a181c75b317fbba60c3edd62bf447c1a778fcef9fbfc1d9b52ddd73eeb36f88921f1f3f4a9c6ddc50d0075fed17f12c0f6a6fc111567f0bed5118953d73b094cb06fae1ca1e4191c0b4ff39d6a608233b6581ba6503644a32cf93a71a76fcb20e76bfedc075b4964ea59614665ed3559935ab058e9747e3c4ccbb84259b40883844849330648798423bf819922c6ec1cd6b8384b50014b57e2a68de2becaea8238329311f64c13eee32561e6fd10d4a8b81faf2d19229860711c28482d0e3f9cd9fd7f5cec73d408a56cd2ff34082918a0d2ee52d6ef22629a3c8b864a8cad7e9015b91153cd3c35d6465dbbf88940ad1629d81fe10","title":"100. 相同的树","link":"https://leetcode-cn.com/problems/same-tree/","question_id":100,"issue_number":17},"15":{"day":15,"pres":["DFS","BFS","前序遍历"],"tags":["树","BFS","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。\n\n例如,从根到叶子节点路径 1->2->3 代表数字 123。\n\n计算从根到叶子节点生成的所有数字之和。\n\n说明: 叶子节点是指没有子节点的节点。\n\n示例 1:\n\n输入: [1,2,3]\n 1\n / \\\n 2 3\n输出: 25\n解释:\n从根到叶子节点路径 1->2 代表数字 12.\n从根到叶子节点路径 1->3 代表数字 13.\n因此,数字总和 = 12 + 13 = 25.\n示例 2:\n\n输入: [4,9,0,5,1]\n 4\n / \\\n 9 0\n / \\\n5 1\n输出: 1026\n解释:\n从根到叶子节点路径 4->9->5 代表数字 495.\n从根到叶子节点路径 4->9->1 代表数字 491.\n从根到叶子节点路径 4->0 代表数字 40.\n因此,数字总和 = 495 + 491 + 40 = 1026.\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f22961d3385f35e6c3f607e596e3c5597b2276efef2331a0b8a62ef1a79d776d08b1e7eafe53d32f01344dae2e935e02d302ad4d8c4f61d20cda18cd05e7179e7728bdbb11e9136b520c3f4ecbf98546fdd066ea1d63a267c0b7aabd785b36bdb462c2959bcaa14a4f1cbf60cdf2996ba455d5b0e3d67f148fc3d88943afd2b4d6beb6e6f476ea8a50310afb99a5e7f2b74350aa0cb59227e4ff48a671f7d07a1d2fa79331361981ee4637ef615175baf5dfd4877c855cf906a36805e1473931bc2504e2f92880b768e258794b40addebd65eddf9dd0d37ab44b0904c4c55eaa9824144618fc4f1cb22acf58d4dd7ee0edb9a0775f30c477f5c0cc452b7d15d1c2c61ba10fd39939daf2de5d25d14bee12b0ae6c2bade458840151bf0287ea7c82c339ddc6cce8563e3c476896899127081950107507e95ac50efcae25e81ccf8d1f1b4eea448d176ead7681030d857674a51b8df07e532286b6a1d5aefcc16c5e61ba1600e330552ba7bb1a5b3357b8e03454045d7c97353c6712bcf686d897857cffaee76e0ed72418b76152c5898e81c501642b0649efc7c7ca05f3c05f1cb8dfbcf3aef68213c41b44a52a38fb11096f1ed07b263729c3d6f706b603e0aca416c064919543def5a53253568d45df351020e98c4334e1f5ab674274d2220b2ae37bcf2178ac020e879c6c47ecec44a166669bf62c33a857ccfb2f9ed180db6c0effd3863d57437eac890e8b9d757b1cad69798b3c65b6ee423f1f5b77f6645e575138e07988d2a0a7228cc0e3a7b1d2efcf9f7a9b86c287b64429864543a9b7b9f2b18f75ef7b8204efba44355fad391eecbf6fcd0ec8428b57e54d351f3a2bcc887607867b9b804b89e819ad08288863423b411133ce0acc94896556a11ceaac0b85fd13394101f61c00d54c04eca5e17d2cce76ae9b999a63f184134973d21c67be1a7ceb271d50fc5937886d307558d8ee92d92f3fc1334ea6ee48d821700479e41d3bb739c4e568dc926ceae7f9660445926f5996737654c1cc849a5de944966a9c58baa54b206f3a9229f2f6423fa9b2339b103a23cf362c47835c5888c8354b6792fe7b88d9c6211b300b037bca2de8a2bd74ed004ff6b8c4cf3abe9df96460e314702443f9c061c162d4309b8cee86f1144b3e0af2e6353e55a9c8893f5834324f53584f264a47b817f6c4863530ca6f5b65cf165490b29d30271e1aa3c0c9f83b251ee30e461a62cff54a89c2727bd74f8890fa4aed3362d16eab9cac36a162dc3b2f9ecb7d8f9f1d2cdb37d76fd8c72fd509071e69c6ade8c8138da7b75ad58504f2fba607b2fc92bf74346a97e9ae64b2255c5f2c0a3f0c3d0efda484aff9e7d0511cf2a808865f7f6e5b3d356e8fce5d8c67344393aa31702fcf38bdb6d0257e7937061f6c4112c80eafca64c1ef3fc6dcd668c086bb662e8f0d801dc1b65a9d707bc02e5db5c958463ccf8e66a37ecf13c5ba1da1c2a643fe8adbaf9c798e87821d3edb2b97a41e15feecbcb1708ca09c6c2023b549e5d8ac3bdaa2ec2cbec4aa9ab8da9e47688a6b68a08ffd71ef1f5af6f25a52ccafa5ae6a8994c97fce2576829709889a251a6047986b6836e5d1b3ee53f2a47d3e3da8c7da270a3e419140b4f9d7618ba651b5267771156bae277a9b4bb19190525b5e75dc98b4b71572c1adc919174a8874b108efe5e9d4d465b0ef1bb618f717c9c6b90fd1ece103d6d2d831c930699c4a02d53927a47bba4dfefb88e5468962fcd2bf18a87ad03600ed56d64328414bea8ee6e4cb0846b4283ce15a5a4d62b4b8c26612d86bd6e6659ae721a5e3f0b542e1dce5ca4a0ea148f4e22264282e7b12e0e2d0e3fc6c8aa2c7a22ac838767865d45958dff3e46ada2cde4bc6043428a39ce64f171924fbb5d11cce5dcbb5e3c1a53af8f6f29401aedfa50841eb408547a895ca38117edd32afe33021e9f954feacf763b0e4706c62bbb67de02c0535bf7bc324b3b5a1fc78d766b8038946da54782c08235342eb6f128f21c6c42be697458f13520cc27cd293f95553738b6a01cfd8afbba28e5055cd7d71bc74b9250aec9f96ef2d813646625044092c89d3f5a6d2928e1fce0c15851d5ba08d50d75523880f9c6aa43ad871c3850d272cbc9371854f48cab48ea5dc711f5a3b61cfbd869cd2b438ea70b3a8619a1c75db8597d2a484bc783d273ab56b70157a1eae363bcdc8ab3a8f2e489a969ff140a1cab1b9c43a03cd0242d634b69782ce0fbf30e06c4b2ae0499cdc4644a950a40b63f676016f52bdb2a3b821b3b836060e43710b4d5a8534f09023349a6fa41bed63c56dbb05304b95eca6a136d2d731be84ccaaa37e696b78e01b94abe2738578e6abb31ae36ac220acc0f296fe5b5fd688277e3a6a8a47d8b2fa9df1d694fb038ae6f5c315b976c78a5927e27c49be78050d87989cd6a5b3b316ce212979763799a0d219e901898a3450c534fd5edc06c933e39afbd997e4746d1d3123937fd62e93ada84a3fe6908e20ac35900ade4137bf959b2afe12a5304ce4562fc1c37105cfc58cfc88d44242df74639724102616098a80e74b5cd04a2909562d2039a1296a37ab9f86ff04626e2f48cc3ec459aa39680642494f0b20deef0bb79c4e9394deb0efd5a77be9a5b2f37832b00ef66a93434253556457663e30e671231e3fa62bee49eb8b4b571ac95eae7c1e15d2efefbf984e933f5001840f4406c99704516b6bdb20fd5a86a6a54b4edae6cbadd407827cd8172540ebe264486544b5c6a75033ed7c1f3ee75f92f7694c4bb734b3918636b4dce5f968d0670babdf6af5bde250492f2b585d5d7d20545348a9b221349bcb77db129ee1f64f402785674d2d7c693a075c1b37bc065891dc179ef4cb0250723540b96bfbbb1ca05cc0bd59737c1bb7e602f50e766c8cd18a0054a02c9789f5d2381dcc0976c28599ae3506114dc0594b9aafc848d6f2444085c67cdede390fd6e62cc18de4178b7b0bcf0436edfb7cbcf9ff793df84c331907aab18e425a2e516720d9ca3c6c991b5817bc397372f7033e8e95c844a4ec525a932972fa7866bc9b606d42c138dc8827bcb96838d7668489d56b15c9bb17dd42dce70e7ef6dba923c9492a9c5e4ddc092aacd7d92b25381c8878da4589c47bea1c74d97e1c96159e743660d1a8b7d04930c11d6f49db832a204bdfb0fdd21f0eefcb827f0c467f2d3b71d5eaf9471c140faa8153b7a79071fc70a7a500c65b448dec0745579104ad616819189ccf6fc6856dce40abb94c6142b8d4384d1ee358f904b1e472f1ea567d075c88c33359601d7fc9eb71cc4e5cdd08e4d6409e72475ecfd9dd1d5c0b32ead630bde2a18f1c7893ff7c7549a3b0659ceda818cfae95b54b7145ed66def8f83cb77c55b5de4deec9915a4d3751a336db3e1216fdcc738bb6f1f7089c2e38d810a529d650687e23bd8cd0a20cc07b95d003e789bae7b037b3e9e04acd830b6c295f5c25c79aa6bba737282f86a542b6e5312319a410e700e22160d376647cbdb6e5d98ec5dc4c1d43e04b210436d1e24e6f60c38d5b403b2ca74b5ad4e6bd9f168c5d3570e2b365addb488004eb36bc3abc05f768f289c312cd9dc676e133551594f372a321deb7d636b103110510d006c0486027aee3aeaa7fc25dfd895b75b53b673b29a6ea1abd6969b66d4a6ed721e7e2ab2cbac15269628f74f268fd69539b7cb8116dd53f43d5d841510cbb3566f66bd6b04911c415f91c43850e82f767d55aa7b913674c0750f11c60142cacfa5c4b3f3fdd3fd5dcc14f8414c7c74d47cf677d83a566f2513cd83a5635589aa0e3f3d3fa810cf021fb0256c12eda102f4a181d6be8afa86ae60bd51465cf3785db0d5244586a7c2b9ddd785aa4a8468560ee64720b5d695f5ee8cb9ff9720415f6e87496b14770187aa721cb4d1fccc42ff678b03788524eb2611c40610b4c63c39b6a3c8a76ea9388d9149dd8c75580d3110b786da4cc84e221227ceaa66dd64ea6d22c73ffc85e2c27e7da76a6cc2714ee8df9968e3de2e3a8519dadecebe29a4868fca7dc5fa610b420efc71a123de35d4e6ac696a7b588f9b4539817bfb0f5246466a54666d90e0f8d1b6c3ec95b42968f86c4bdadb579a5c6a08d1922e8ffa2f2ddd1591e138e8134a97ccbfa393f0d75f622a41cc717cb441c556ff6d60ac620fe1b44e5f21d8acd0d5ff83dca93c245c4633dd677043c3296945445228e6a9c9d0f958f67bc3b409c26a5c86042efa889de677c76ed0db2301073149e5634aba92b9b2e70581884e1eec28137fe0fc8271922da478d4418257b2a96723c2006dc8ccf45aaa7bdde472184837511a80af4ccaedbda8b4b8909dc410685ce01d946eae8da773982c44bdfea55e62bc7f1650e646793f2a143833122f3bb79aa8a3d62105a1ccef79acf1304dcb5640fdd313744c308f93da31b86801a37f42f1f741390fc8afaae954df1e4a62a062d3d1be4da130b2b0aeac64eb32097bb04d32d12628394a84c507efbb7fe709a101844cb847173c3b262621bdcd51d543781907de332e9404734c0c9115c822ffd989950141b8d38b4b47b4d4fe71a6dcbc7fae30ad8fda39247e277f6117cddc11ca760045cc545dbbd6470340ba4ef9900042468e4062ebbe252ed1c94dfa1829f936fa302c2035669dd7b6ce5e2088012cdbfd1d6e8744ff4bd4e71144119f8f64dfe91b4d1781ae1a970a4f7952b84d58ff1eb32bd523af1e6ff251fa860d3a922f4c81e165874290ef71816309cbfe52541752c190a48c2b18de8481ff8b36beed0ea468e22dba1d4692203847745fae25df878aa1641875f4ea6e1f0ca0b145875f83e68696cdc12917bbbfd43214b1e7e7d3f6124dbb116f408c9ffc10402712eb5f35a006eef04b23c9fdded4e2d4818ac17c96fdc4b83f2feafc5be29a798a435f071d77e791412bc049549d95bc204352bcc3c70cdc960d1182ac059881f185a1b4f1b0bdda1039e03a2dbbd54ca6c9220750765e29be6d14bae4f9992ea5dae473d64f2f2b0def7c8b48a08403992c39fb560317b7400b0784aff9e87cde93b2cdb8bbf2d042adcd4bed13a1ef9ba67b6e3b1499b2854c15d738204a5a498c3d1f91f6c4a29031e6f4eb839493e8af8ccc0452ba627bc4684a1b8e7dc2b523d6929892acc56c6c85e6acac62541cdfeae47fee9cf4e03e0fbf131078cac646b068a315248a9d955e9c5f266f9455d18c7de015cedd396c8ca0c0ebb0c8fd00610ea655ce9f81ef5e3c0aabb10832c53486a6c2e5c08f8bb5ace577676f3c1c9564839e00983650ccd8285b44e3179e90fac1e2588693c63d68549344b7667af00f4981a9be30b9f9f27c9c282f9aeba349d987701cc5c750e7c929004de7a3cf257b0f3a2456ddef314e9f5000fe1840b2e8ff65ed39c52e934b3f83fdd21076f3c34db9eaf776a4765c0d60ad2deec390b244e5161c59b63a5714ae69757464f7e172dc314d12f8ada9abd3a0ef635f7d2754bc42c1e5326c245ef326536a2b9cb029ee75fc8c650c1adaf509ab84e016b976915c6d70067e5cc9803fbbe6c8ab93164a0908e0e00d66ee6d56ce8d6ee2b4f1333b8b4669c6b9b0cc9271d9da38f6d7227ee0874fc812f8289107928cc741124b360f30168471e3ed7f35c60e0367f05b76626e8e16f5c2cdc4fdea7cd8f306a331a592543266a8aba2ce2d185834158654f2c99d16155d406d0a01adcb0556879e0ca881a35820328800042daffb7c8bf8850f574aee6c9548821babbf5f6ed1f7f18f4c638785dfee8f4e5ea2d7a2d124cb3f417ca3ef5f849ef3de17b252641d93c316103f244fc0a3c89576ee5893fa6ea874281d6ce8b5c69f2503137d767f3c4ddefe3adb5773991710c03c6b76a74b0f385afc5b5198abe1877c044d0a5a20507777409e8b7db1ebf732085dcfe8279c0204557d9dccecbc9237804a96bdc254d0471d7d905674456bfb16f55e911742831928d2029f8e63782d12dddb4e9470ca6c7adf3f2dfd06930596c644c1201316766c7160573bdf19e678c370a82f2e7d7cec767cdad7d87e7efd9ae4796154a59aede283a304a82396c2af11ce3a9827ec2d0b6031adfd89dddd38ee32cf971d970355ace258c14686a9aa6c2f6667fd081b12e0614ba24def892fbe4d67a67ea2974f5829a3ba9ce5ba306a84d02bbc0d86ded33a67a6dbf6225a6ca4b195a721ead3b3071a863f23041b11a3393fc3f831e901875c9b40e815b12f4dbc4171c1beeafdae8cf250ba9851cdd320cf03ab4159a1c642d012297ed455d553e14c1e5afd790dba34461a274615452fed63703fb1c5fe89d93cad0302da4bcb26227279be7f772273c35493ab4d1763610b04c7df1a6f05f5610b35d6fb20f569d264101242c34b0e4375faed0874267dbffbfc9965fca33169f64c8755ecb1337a13bb0c9f0fde060a04a0ee5c05f5dd2e81820cbc5a242b216a95db1b5846e28aca72c27e361b5fa130c2dfc118503d58cf6bc127e73e89e3afd02ff9faf22f72eb49f813963f3b9e8ded2d6e0538dfc5011580bc94a027f5dbe1c048dcfc9331d770b1af4c848081f487efd20670fb56127de5a8f12718c0b3a561b73a277f4c97df5fcc5a9eed6165ac47fff8909849a1105f2ac397fea001d34031b26f652dfdd58592d3ff2c127707caa38f352317a97ab7817a82afdf0c9ade0d954ca576ba172cee629d21daaa3da107a6c268c877f340e0deeebfa5fe09d82b72ddb8ae3913df0aedf751a5c85ee31fdce3585746ed28eb63118d9cfa6c9dc83cdaae2fc19089d7ffbb3ad942862ee65a05984142a2b96f6d54b092c295faf678eec1f4b7a45fc3ee7c681f6fbbbc308aafb005becb9ab7fd55320af9cbfaef47ef2ccc7d59731d7b1448706b0b590ca3ae8a410c9fed512adc67e3fc628f9317dab3e3cd3ac8c43b19820759aa9bae2f6dd9610e9e5235c35b1bae2370f24778d889c1bdb5af08024aeada9292e1f87f89cfa957eaa070c670472617e49e5faaff72fa8778b4b9157f53183ba2c143a4b4eea3cf70b9b34122b8d04e1a961f14ae688666b59930466cf8c3b80f32d8bcd1e1b0b10346e65c4b9f8134e4de1ff748a0df06bb65d372fb59447dc4aedd5aef9984ed88da9462da81eaf67a8be5b5d41edef969662aeed59a13176bb9c6981834695dfdd109263328bf04c2fcbdc76a266f2f30c69a38b6134e8920c36ab7db2ef78ac938828a83caf2b5272ab0af7ca943077d3432b76a12e13b30ef968c8b439283ff356cab2e2cdfcee8b23edaacae5d1d2c22451271049e3d3066575548446b235880e9e2a3b54ea11b56af3e010b88d4beb07e540e98ac7f960d9fa971a3ed166433ef3f5c248a1c985ca0153863c03f99164b23d4b7750938a8a0f5883ce22132bf6302e1668a56480edc9b5233dbf3a0d7a162baaeefeb8285948d6a6106e00c0ce46e503b646ec7a74514cef0a8c3e6bb8d3f656d14a95fcc2e37cf84009c88049ef273912cd976e9ebc502fe2fcf3ae681e9055d7e0c2b6c3c7f2f1f7c937b44aad82c6e38d6914d6358e042425ba4b600990aca29ee804340b87a9676629b5bce505a1084af0433da3df63535cd9b15c6c092e0ba8524d8a50999eca0254c52860c7ea6818434a032a394353dd6f168320bf5c4bd4e2052c6b45684c9fc7b4075a26e18770e33da0d1a573700a451a6b028656a079d52e3120e467215b755bc14617a49ee1e550316c13d1f0d3a3d488646bd9304fe0f500c81aad60418717b3e4ca79e88a9d9b76f6f2be8b3af27ff32e2645a628d6b7a837786f67630060df8fffba43d5ac738aaf76933f5b069e59be94b26d3d7c99b464c84b0bce5f3616ad2556d6af9faadb35a3aed7f672b990dfebce46528540de0c681f0cb6fdc65d01908ee1fd6af1bd01c78ac6de5447570149eea9105f402bdd5903671960f4e756fa41d19a8c0e30f568fd3b7827e406f85ede4822f4c1d1a0b9fcf49c5538de93dededbc56a0dc4c9c3ff029e28bd377a0d0b58be90cef1df85b239a0b961f4714c57aca4e4b67ccf7de9264b064577f5fc7ebcb3fe037aa9eae495801e1a090cbd0b844afa7ff96acc22d63be3ce2d5357ae4765a4af6b34974f10edcbac170c54ee7a54bd502885714c553797251d40b6e8cff74e0dc7b928536eba7d6af98e541825e3da16794c912bd9eeba44b98357766357533ea3ac6f651e64cc45351834b7a1f766ec9ccbce8dcd1f1943a8e51773843dc354e29c34b7d17428ac3dc5b6058eef76540127627a921ee55843751e4cff96b82d3a01fd3511a836c45dc41aae062b9bd7fdb28835bbdc9a7d61eda937af03959e9e0451f5bd41ab6ad6367d88385f71ba53e37b0a38b6149ba4b04d34ec28532c61a5a7732502c39c686a3d9d98fbf15231a669d0d005131b65ae94c9076a5fa538c06f443a47187ef89288e824f71f0acace07b6766aea6774b4eebad24662ee2adcce729878f6dd1fb114ec7c7a8869bfae43379f0288862f86f0d9462490618453ba1d90a0685f98af18935b6111d4b385e2f1cf1720e622a3e6d703663da3734ce4fdd9a66deed63dbe9a11d7b47f2d148737af27a3099a111dece91fdd500af7a1875aa44c677230310cd9a9bdf95533d0136c5cdab194b2147f1813820b36237917b457afdbacc94e79a33f8c57392ca213ad536cfd162dcb87a03ca5b58e59bf0ab27a0cd8e8354897b7e7660020daf1f1980f86f16b31d071236fb4151407e1b9b1f2b9f5404cfd61ac2c959a89c7880d13f73e67ffff4ee75ee41e02963fded65ee46f187db276e5b0c1bd5940cdb6d868d156b9707f76960efc7de97a06063cd1b81ca305d5f6959545b9a175fff01e6be946fe8927becc1dad75251bb7241b24780def70c3baa21db0c998a09cc5549f0448b66479d4ad2b68d933e19e6e80cb1ab161c56d8e0c98694ce93eea9d2df929f104dce7854ce46d78a36e394c31323d43711ab2d2ad72b0a3fd09b8c535fbd884e3e3fc74958ad4d19847fc15d7caa4ac9abd1c03fdb72b0b05b1725ab5fd91b126ac632dc850f8a98c930137be7e5def519edba01e56916a1e14bdf24897dd18f7506727a311c3e2847acb52658a49351833aa5fc038a2f11445b114eff48913b94bcae7550545af7959f02ff668f9aa789817dc8d1bc7cfde80639349075097b27283f73835d7eb981c4a6ad8cb4a8dcb9d3c0761d2ba535803ff23a4458c6ab2569539ddf793a0d7fecc47329b7b13ff1885ba03c83e759e190227dd3f0609b51ddec061f0304b79d7b4a7e535430d97fab6d4ab464e78ab42bd0620d11826d329c0191670fef5dde8be29fb0ddb060ce23c8a82bd15bc68f37984856e3a814865d77987d84d238be8b442b10cbae673afa0a999dc900908a87ff9b647fb4a72133bde9ad150a9dd7335153037c9a08da55f986f7ebff629f33365589f842bbf4b77402e522938a791ce4dcae3a7c7137afab50a280f214a5f9f9f96e8ec7e4a596a75322a6b6a507a818af7203e07cc61ff0c276dc4d179d7e655784eaf565c6e7dd57e4d4a45e25f26bbe76962e7a93a5aee76820cf9aa1ea4348ddec44fd7be9688665b5a1051dfc7d8257a630383ceb2d78be752f6dacfb6df5f6651cbe1d2ad50243c4360b453514fc92fc5850f5124206137f01d553012cea9e470419b82fd2448f6f05cbe1b2dacb8901aa1142164c82387b6df373f6219c28464a95ef07f549be7c46325b91003f1e1b288a5f83bf64fa99e3763e2ffef09818b7df7055233e3d0159e7f637dd5a7f2eb0998d187a8e493e7cb3aed60f0599492393ba1b35bb0750ddd319d8b36866139c2f929b61fbef0d741413bff56db40a79308163b3986e04751d6c304d2658047de2041b035f366c88685a03f599c2f27ce4a611429abe67bbcc43db771f5c5f6caf7cfc3f222c091de3a23cab5ee7376e411046ef1181e0a27cf914bc18f059793f273be00a005a71a6e8de8936db2bc458fa125137550ba44947d8f3a39711d6b9b488c64592fe3d64cc95454f3b903331fb8d025fd5169e66b6e1e74c2b5d0e8452a1b6e8e9e268f0e03936a59347f4807c677fcd3ae84f8cab47061ee0655350e2880eacc69f45f84980d67ad150b1131b8ba6ced63e201cf9443bb0876b4187f7494b8bf3acc93e02af20a6c4","title":"129. 求根到叶子节点数字之和","link":"https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/","question_id":129,"issue_number":18},"16":{"day":16,"pres":null,"tags":["树","BFS","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个二叉树,在树的最后一行找到最左边的值。\n\n示例 1:\n\n输入:\n\n 2\n / \\\n 1 3\n\n输出:\n1\n \n\n示例 2:\n\n输入:\n\n 1\n / \\\n 2 3\n / / \\\n 4 5 6\n /\n 7\n\n输出:\n7\n \n\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2695173385f366503f605659512a54a08f2a64fcfd231c098867e6334038d12f1bd385394d9ef220ff2ba4e9f225f573696bd5d7cefe4633d0aa8b91587224ab7b8f9aa5419c3bad31c1eaeea0885f36821d73b09e633f300b6aaf9ea2d73d9504acde8f7a209760426df41dcbca1c028ced387b253063ea28b7019835d2285358e24a4c4b69b1a43c32acba95527b00762a36a3f543227e4ffb886e1f7c2da8feea78093d6eb527e3685df60f34589944fc7c4ec952ee9e6c0081540c72ad39cc454a2e978c094a91ca02207392bbafe9327a4df4243a6d0297e6ebdf7fa2c2f1adc9d0c1af82836edcdc80840916b86b362e5cfec539791451cfd1b7f65edbb425ff2593a837580382e4cf75f92f2fade563cdbef7aa2cba91c37a2b7d94c938259ceb65cc9d58e8c276894993134a949c1204515a97ad4bedcafa638ed3c5d1cca2ec8876dd6fe6d5590417f0d7acef13fd8f3b896a043c15342880cc79a3cb9e4d1a0b6d5a62d7fb397a318f76bf264568700549fb9464e8ec67e6a51ef79d51220dd57d38e9c243e4b7c208a69f417d4aed0ab039a93ff628b2925babfee37d7fef59ee2d395cb76f4e7c0d0bd53967288a02abd82fd0cde9a3f7b1cf54ea6c6b6e074630f14953f3aeeb1ccf5197b79e5d498b4e0e48aab7fbc5080a7a20a27b7ca05b5b8e2eef7501d65e01e580a3eb25aa699842de56626778163bb5c2f2c3e4e0629869c3240f383c1aca5f507e52487976d1e6cd0a3a7ae51963236818b9616dabde6234044bd94751606350cfb39394f53b392c1d5af7216b5bf544d84f219e20cad84f4d86c24030705ba5c4c9ceeed2f29eef1ec0b84539a8a1d7a99adab09d0472bf2a485420163e2843b28f7c8f8af45a7426e80a84cab3e49323c74fab748b4fa3cc17b0d8c04eca5328d8125505583d522660747761fa0271834796d5c0d60ad753bdaa33dbed6bd430a9fa3f549ef95554fb2f80bbd64a2d381ffc060ffd9f59748fd11fcf9e659b65705b09dc7be7513a4342b456ef8aa828fc1701341491d83bb7ef03d0524576b08f50a10dd83981fe46fd7a20cb8ea7a15b815125f6a383a3401da60078be2877542ae44ff4069540ae04f63420839ea2245720e3d6cbb47146298fc2a6cce2e457e0991eeaa2cf7e3907d4b4041254791badbc55f01a50d024d946c4f58cfafce3d4e47fe4021d13447d1bb9f9ee9616e3fd9712956689b832d4b01492377ec1f90f2aa7bf62e1a6b4561771828d9664137f2aa4dbfd3b300b33340527b32a2eb1f93ab500dcb9571fa211411fd926fbae5f144a066fe702b7fa28a932d4cf44a80b40f7e7d83b7f32555b241f6201c9df34693519529e77c89826be75366412fda4a1d40b56ac9f7c78ff4a0ccb375e30f3d6a2676da5e855521d069de7d2a94f27eff062e865870dac2ac4315b4c00ef08ee7d0dad4cc4651a2f0d0ab44b480991f76a5692973e75da5b6f79a29add737699c157e64e4c6014e08746fe354e607d7005817ab2466f0dc10153513b802fd4a009d506c83870639b7f5b7156c2731d774765884501831faaa470d28fb866dcb569baa7a3be630f4e9026ec8bdaddcc38187f459653550a93b49305931fb066247c6ac4de64988314efde9fa29cd4c17931e461487cbebdb6e0756d971054f8da92d2f3470d6ff8590490b86d758a4586bf908b5631a90987f27f8d1372b94bf8eec7e84c9c7798102e78af8a6ab4fd444648607d10bceb6bb146c93318566d9ab9ee10e9f28f68ad511a42abe1650e96cd441efc393b26e2f120f1cea5cfd914151a3e8eedd3eecdd7bcfdef7490f4669630c191a28d3e1c5ea097ebb68c00286cbbbef73d7c6fdf6f8261f3cbba69466f3f4e6d79993d040bf408ef7f8001a87c93fe38782c44620a99b44a9820334493255f28a5157b94f80ad04bbe9c3582af0cb9434b00de8343b7ad087b480145d83ec970fe06c545178aa32b4d271b13dcdf410486289a5aa57996b8cb727c7af6a456f24f390fe35e7448ea1f728974cd7d7182003601be980cfcb3ae9575bb304289b875880fd719fbc9da64f0945f3f51254a05ca9cf17a0c6c2360c3aeafd3265dd5f8449a72271c38d2bc95b169a2d9622d42dc58b2ec235736bbc2ab2bf833a80bdf89f60af4c174e72c499cfc2c68b01383dd4db41c33704846d9ca916eec189d4f02ece3a77dd0dcccfae6b686c6fd74f6596e58bf00a556e569c7692a7355616f06b2b4bc5a0fde98ae4ddfcdcc6518da1441fe746e254da168926077c60a20857b23a96b1db6cca91f475b023349a6fa41bed63c078ef50612e2529a314b23272e04a7099eb20de69db7dc4ef61eb36e265f8e349160fb73f96710e60f296fe5b5af2dd622b1e8b3c238c568fd971d744fa157e0670d641ec22971cbd42d2f96d4a8d45dc635cc8b6c12687f24af43c8d2272ce1165cc2891680845b5a1203dcf6ea6c933e39affbd62c037f82920e762ae821b02d9b8faee4225ce45694730aadf5037bf259e0e0ae7e5e1a98042eb6524f1041fc09c7a7851a003df8565f1d6d173f28b2cb4130f0d72e88d0d5229842cc53bc8970b3b97ff6145be1fd9fc3bf20d4a3cdaa642494f0e258acbcf23ac4a07719eb4fe25c29c1f5556e67d33e1be922a3226662374703713f8460325f73a6a831b690ccfdf1db3ee8d0a3f38eed5c75f0f29ac3a167ef2a1840f4042aca781759f9e9be0fc5a1714054b4edff39ff88052423c98465544af72b42cf7019152d3d0a1dd7c1f3ee75a97a34d8dfbd2748241f27394cdb26deb9141fd5b9f8bd5f11ebf1f78cf9c5dcd3c753485f9a836a1b30bcc432fd7cba562bf3442b2e3b9d83c6e3fc25938f79d829ce0ad621d350aa7b6a66061596f2fae1ca518a4dc28f78fdf4616d0445b767cbc55fee630602cf7ed64138cec58f9d492a478baf4d6114824bf2f5a3fcdff73a6608411f6784a3b790bb276dc629911e31f8b191e6513aa3f6968adaf4e7df8ec90bd168af54ad40edb11f7256b6a3c6c991b58129868a247d367a8da608845753c56bfc23f126a7d42e9de3549a6845c5ead03484c28dc1332e70d818b6588c89348d79c314b5a1288692378582ffc0ed858efdaad07ddcf70481a48a85bc158a64b8a69d03c0ae882e7fe70f275e4e8b7704c6594088b1c1b639b202b9f50c8033c1c4fcb827adee3ad893be132085b66dc608a8e605431f3d4205ed203a104c62a52b918518117b1c55ca07c69794a9fde36e0f95ed41f281ad46728d17d694ab35c1df0f5b004b49a577d56ededf2e418001c3c794fd0a97958bd887564e09a36133ec82e2989b89e75194240a9b6e17b393d17fedf0578a200610cec681dfb3e05b03f153039c28efc9a9935dc65b5de4deec9915a4d3265f7f2bc9ff216ce68861fe011e7188ade090814e17cc304389b227d1cd2a67cc1daa1d5d254f9bc0344d3e14b447e09963e5c2e6ba8e406be32cbd69459ff87a5d6f703f1262cf0c60254360535f646e148e97285198be12d9d09d3e6de01b4947146ef5be402ee1b44afc9e6e9fad4e6bd9f168c5d3134b301c1e9be7805201fc3fcfab830a248632b6786ad9d4292157705f150a7137741cb832793e0e32564152516b04dc166ce456bbdea82d9197d1f2551ff335e6933ccdab98d9cf6686e9a22610326ff49fac54219428b14e3dcbc1d424aa829b0b9a1abd2713831c0897a55d3e70ad3745df583c0ec29b304ce824677d51a270f3627ddb5f0f11c60142cacfa596f6a7a8dc995d8852ab491e333bdd58ba329e6e5a6f6646cdc6fb3616d7aa577a3c6bcd44c1545ea1063133ada5048d83b0e98111686ecd0db5450a1fe07d25f3936507c5a7baf6c3cd9eb70b9c29412d9c1262f99fd6efc48cebbac33c5d456e8546765847019caa3151c89d90d874fe01f42c74c701f76a208c697f9ac93836ef89dcbd6fbe65c4852ddddf201563645df592dd5a8c036c293adfe608c90aaf6770823ae7fcb78f7e60a77a77e8051cebcfb964f3d26b74c413cf8ddbec089ebeefd11490a8680b1924fc71f02dc72687a6a5696a7b588f803413817bfb0f52461478487a739bfbdad0e7cda985ce7d31f0650e9fd47dd909387b84df2e92fa6c788f54d5b229e5131099d8a2a389aa8917351b6bcc717cb4088356f76c32e36415bbf858502f9daacbd5afdfc0af326f06066fbf33794398036945445228e6facbd5b01fae7b88b212eb7a1c90272ea1a29de677952b848e714f1c1b49e5634ae7ccebf7a26b8a8a581cbe240979eeadc766c867f674cf47f90be48a7c09c2006dc888b209a22992ab26161a2f18029bf34480a3c5dbe1f59986ee106801ca1d942ae8deaf68916318f2abe75a67da3a5056a31b066d64146b665f3411eab0e8e3960b2fabc62afd016683bf5b9f8e3038e0e0ff9ec9dcb64f75e8afa33142356fdbf1a56a680870927f858c9e76ad473eeb57acea78632f648125a2adb23bf5f74ba0eb99e8aeef0aef7dc871c0169510c645d4f9d6f6fff5bc2c6907f30c7e440aef142e538de985bb05d04c8f3964767a9bc7774f314f28bcc1dd758cf6bf7cae52cbaeb547722f6a7fe6f9231998131d669b60f69b056ad2a689906adfa32aaef40b406bc2bd3e37d3f847fa150af014e6ff89bcd9de31d491fe5e11aa0332f1f43c608b7cfa40d1f515497f8286a580e471303dd2ea20df8a83bf1ba31113fc60e83db976837521dc0e8d9558659242fa202433ac1dc8fa23ea6f6c92f833312fb6687f1e4deb9f672e18f6851bb2ea1ba469c7e957a54bb11f3e63675e9b34d08a9aa250327cc7c76e2b2da3b175847c8ce5959dcfe91c16b8a4d73904b3c5c4d1dc054e8228637c82735b5c003142bf4f5f20f12b9d6b48bae18db4e8bdc99f9002aab85359fa75d6a127c6ee0c9c280b017612c6ce2f3a9f146dcb153ce7d8df111220e0793aca8a22af34878ce9934e0483f7b6b96f3dba4f2ee3a373c094255517671d4fbc0479b791809046f7cd8e2af52c5d256a8842dd12b4c35bba7f50c022531dd11f025bdba2939659b2ffa393f1ad828d42f5927ab07191a8f09b2f11305dcd83e2fcb91287838f1a55c8403bf8764ca1a92beee8e68dbfa5e7a481c42c6015b41c9d5e8f9379910b6bdc47744c191e73c08059092350d4dac154362c75e889176bd38a51ff87cb3356a77cf871dfa5166205bc78c3d78d19812340b012921575fca020686a05323e649688cb63e75d473067999edf2b4ca5b912ed2f6730673c295318445dc3c2ac9cf7f9a12e5b8b4ad19e4234c4c8f1278f470a340162ab6b1a52c2f4a676894b8f35f6491dff6622c1546266ed7ee5a7474b6f920613a0f956069b2f12fd8b90352c7c81e58a82edf1726ce8b65790d563d199313115ed75ae0dff4c97b71a3a68b4f62b00882b207dbe08fadab2a6038a2b17236bed0b8be49734ce8b9e37b4f5a0a56526dd1ac4e6dc752a3416426575e597fbcad46cc54d2ccca991e776c895c0d85a33d935f90510899b8b1f6f8f6e7f0ad12a8602b0dff5c2a1cb60224ebbe5cba893d2d18acf2314754266b3935d0399654c7ee89769dca77285824f0ed7a9927cbe936cf229792bc501ffb303fdb0b0ac413821450f5359c03462349d4b800b1562f6060c7168885de2ded084b1e973c2be7fc665f1dd195e23b3d5d48f614d1d3c0e8f1bae83c81f310f09660701a4861f24e3db5cfcc9a3452061c6780a7faaf960dfa4961d1b57f33e9952841babbf5f75f1dde09f082ed4ced8f3ce4819a9dab08b7e8a63534d89ef5fc0d8a0d645b3586847adcf071d27261f85f99bb71fbb0acfed73ba6e32142587e6ddb50f03136609317f1997b174925535c21e10c03c693aa6480b6c14f35b0bf1feb3892e044c42062813790f499ed057b1ebf7325b08d0ad78d450091b05939aadf0d437804a96bd811bc33e497dd30326216dfe10d11bda524ac6547cd447ccda1e26515791c064dd36ca6464a06d49e57cc74dc49d10d9330572606968337466ae73a638e95ac26e357d24eb7c68cb5044d954948ff65d6e45a793dc8bcfe257fb23e5dfa6179a6ed72ab9242f3670e1e6f3889f74a72ce5de53c30342bffc3ed75e96e2b47a614639b80e200fc0611ba44aa9c60cbe164da63ae4c4471b7cf1c59be9a83d22fc822dac31addfc6702ffe9599771f3193ecf1a236aa95d03908973300034826f06372d0c931a941c70cc26aab59a1295be97730c2adf8f1b3caa850b7861d95ad29d529814159a1c64fdb002952fe519b07b5237a78843c41fc3d5c302746420d66a1267064f5d8edc2de3cf04a4cbf16b1727b7a70b77f2c08208618d5a500563b1e474191d3183b18a6387b5ad6e620a478d277555a58c455290428b5884518633beb8dbdd530b9ab626af5588b5df7b0282e53a13b9f1fc5064304bcee5c09e3de3bd38e54b74e24224425c1d54d190ac88aca72c27e361b5fe501d69ac0304c714f8067c079e76fcce4bfd973a6dea2603ea741f108bc153b9e8da46b6e4b778bc5535acfe88e8a6eb3dbe9831d8ef2df749124b1b251849c91ec9ebd9a2a70b8034073b7e1b66f4cc0aef127f9232e6500db846bcc09dba1276be106a787dcdd1fe45c4500c397fef3549e402cb23c3060fdde85d1d5e86e02381994da8f282345e635e38f2cc3e3f50c9ade0dc8668f76ba172cee629d21daf978ed41a88f29d94ebf0df5cef0b1f4bb03c97d368c92e06c5f9303edac7ba5c85ee35b9ab0500509a27ce52f54cbc8f66cd1ce3fcdec638fd6ccd083fa76d95f866db3080bce000ee6f53c7416ffd696d8fded31ead0bee3e64cd4e72b42146faab51a8aafb005becb9ab7b9136102ab84b5ea1eaa6980593c355b3e4640333e590505b2bd8c0617e6a81d6cd235a6af48cfd357f099898c6cd4ee7256c6424380b1ee6f2d932058df78768f530efd2b40e85923de89c9bbe1f4231f4aa48f9790bcf869e297a94aeab06bec7047261789df0fb6963caec23fb2be4b184f0539add01fecf5efe28270e7e65d69b9916a5bcf5768ff389178fec579623eb184f00b69ccb1d4b99af84d12e61a02d1c556ab8a4bb805cc9a40ef13926ffb59194c98a4de72e58fc9ae8fc7d5649ac6f9887390cfb5d41edef920202ae687d55c436ba4dbc57c612511f4d15b63677ded4ac2b18ced6a266f2f30c69a65d87f1d81728c25e3d73eacd4b76dd0c48399a7f83c52f5fb29fb502d6d5f48f96d179f190df79acddf2781839c7a75c41e06f58ea8a421cac2ad193f3a6404286a15921c3122541a540b6e661680e9f7f1a00ba30c5fe3656544cc91b09a7d544d9dab2ccd43a4bf71e69e442038a059132dd136985ce4507e63bf40d0580277f98d290f2faafdd3886aa36d2faf6f02f009cc02556093d5173f92efbd90aa63f5ace5f382c08eba692d43b64940ef7f4b11372b8be14b428fbcec98b5e5823c0b2b1ae51a8a7a3b8cd152a3881e9db036cf408d76f4eb8947b87bac7fe689aa500f12497d29233a7d593f806a03e48a2c7275c58804684384554f53b9b66baf1c8e3fef9b604bf415da7f6bc0358b165a43d1e26a66977fb3672b84985edad3cae8ab9f39e0fa5fa8f2e92e6d59874721e7c0932fc37cf78e1f3dd6f168320bf5c4a24a2b52c6b405fb9b903e1630ee7532260e2eda495f06621886588cb028656a079d16a51008496d01b715aa552e6052ad090c41738d415a413326628646bdc4119d69482690f0bc2e32120b4e568db4c8e999f4717045eef3b835e067d42b0b37882c658227919960314c489bbce18e3d5ac738e3b93d33a7bc7cfeffa60f63ddd2c289121befe8c3a1b6313e9a55706ae9e187b35a3abc2769328d48f6b1a22904541df18780d9c87d8445d01908ee6a84f042db5b48bb26f66b763d58beeac34abb56b1d5d97825964b42633ba25b5db6e4b14611c787ada87e092985e5b6cd6018100447da891dc55edfa83ff2e7a61fb6864b9433e12eb099be3ff4dce3caa559aa17e94b289d02d2521b0dcb62ce592d228aa3d7b864b064577f5fc7a28d3fae78fe9ee0065a0da1a8b7c2d0ec4aac8fba9eb7e06c61a43dd8982861e6365c1f93e7446abd4b9aeecd70810bb7f103d509da034ede7264720795473bc9f565f0d735948773eda3d8ace6e85fd0177ae9339db157e9cbb9ea4bca70244c1f3573aa10ecd368d808c55341921e1d597368ddf9adf4a3becd9b348f477f1943df34177ede4c3a043cd696da52794fbcdd6e40037f75cd75ee06d17a3fb182e62e95ccfb2e814f75ed2301994baab22df6e976db3aef5bb58de2864a92932db67410b0cd4e155f8952ede86c188acd85e7008f3e37b0a38b6149ba1a51c45ed4995b940d50562919776599cae9a7c2a5bf15231a669d0d000065b80abc1f953fafca589d5fbb218e6c87abcc78daca5412bef8acb32e2a66b3a66750649c8724662ee2adcce77e92ec2194fb1912bc93a6c3d6e3fe3e71bf68c67db02059c02d046a5d036fd798461a8ea5fef0852a9d5e440e630a7300f77c426a780f47703663da3734ce0994d422bcf57fc6eaa9713652effd4c3222be0528fcf354d69cdeb2810caf6b116e8044c67757515588f486de840c6f0179d3cdf81f617013ffc73745a02d15b2202f3ad790c69e221e9e3e78d15750a7ff7dc15d618299e25820dc71b4520d391cb365492345e92bbee4f0af9efeed7019a0be2f9c22af8ef2e66bd0dc1b3a1b5f87b159d4b5086cbe0a63fb6f3ee14671a4b51da078114141af0461f4f42a0cb067c2575c6694bbc180d407614cf168d0d250e8108132ccf62b5f5397e860a75581474a819ae5cd90dfb20b838969f20c9c","title":"513. 找树左下角的值","link":"https://leetcode-cn.com/problems/find-bottom-left-tree-value/","question_id":513,"issue_number":19},"17":{"day":17,"pres":null,"tags":["树","BFS","DFS"],"whys":null,"difficulty":"- 困难","description":"```\n序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。\n\n请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。\n\n示例: \n\n你可以将以下二叉树:\n\n 1\n / \\\n 2 3\n / \\\n 4 5\n\n序列化为 \"[1,2,3,null,null,4,5]\"\n提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。\n\n说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f219d133385f155623c4f4e5a461d5782802779e1ff310f09844ded3747d754ca8a1d7aafff2638c00ca16c03974bf82a7e75888e8ebc0526c7b18a92597a7ae773c897ae01d124ab2acceba6a19e1631ca1b68b4972733344a7ea4d585b97bc5413b324bffc964e2ff897ae71bb26f1ed6bfb88c86dcf161ee334df928bb4e7a089d70273767224895b368eb8f051f29354b36cb8e784a035199cc47780211e487d40752230bf3028a3249bc4d1b2cd0689f0e46bc0ef2ea222fff211523fc35b4364479ccb8602b86a96b2907ce81cdb906e9ae5694f3293affbdca84e5240971fc8cce64661964cc32694a30e5b453c5dbaaf238ba1a224d648f461833d99ce90eab67a62ed8df8747a3db0b831169e4ff048a94a23081d0fb8053ec20adab7112c659ef050514ace9f041e658b3b90f5e8eccf2953541c85f0d897dd6aaff925626251013ae7e83a96eb0f85b446a9a3180df06cf323254670f7d0a7afa43299ea2472032364bb9579ea6a32a7bb133445555dbfb5b52d1782ad84262854454effae17dcbe149678678042051b9e41956165aa2658bd17743bcb28d4ca8daecbbe241b46d7c6372df0d71c2e19278fdfa94459e0710a14105490f321e40907ee9d2d4a18ead7d8ffe636b5bb21bc133712bcd8f29c0cbc51d722567cdb6f2e42edbb838c49d38893dc49710f6b72d200621a90fac15fa1acef882ce7260b6ab93ee680eec0d4eec81e1e3f99340cf9be2f5ed82b43c5772cda5faeb276d2e570756e42ecad0077e2208a64719255521b583c1c9d0716c3f7b24c1452d55961cf73f468b7c96df272a8a9f1f0af5b81c69caccc2d1ec98ed0cf4bb5726aba4e9abaff4bbbc0a9e3c7c026b785e1c4008a4cd2cb1d7ab6a176dff50d4dfd7733c2ffe7fa558a34e9fcd17b7d7ce49f8500adc135701b7bfe8e30a6b2d3cfc5718ae33cbc0a1b801b23abbc757e1853cec55245bfb0a9aae294cae6898fc8f524a4a3a955b1a9cf062f844497aa4ab2ac96017341c80fd7b522c5943936becb28d25e7140135229ce82cbffd0fd3745176909c5d8500d82ab7f246f97637e083888f569b632ef0a38e935012811d75853377570fe855d4069e4dae36ee382d989f94185402e7d4c69f734335626460483a5c56e28b99274466abc98a07c9581019301adee379b34f6a8a4bd42ca3f6e7a6eb9181d90f9815d599a5961694f0ee8e2b0fb8a86fca4ce648d34f44dafd4bfc09a7532ec83d2ba41d3c5a20538080808a415b42f1d39feefa8bee9f88f31facd44a53ff528a0c0f5735a25f04479c60bef81a57442a10b44aadb467ed64f08301ee5f49d2e7a45f3a6a01377549274dd2a54bffe7bed97984483ac233aae43019ac7136424410f2bd6c62f60a42837b5c79bf8edb5f39ca62f6e21325aa38b4844323d3f062eca37ee92ef60cb9a49dc5802323edf66ccd0fbf915f1d57c96614954872b6d37c0c9dbe7d0b3b66c9d2f3df9afeff1cae59280902a6f94fbd7abe9f5257a95292871ffedf218a347a5246d8467b6a8c05028e80f876af8cb7b511f2c417187f00abdc439a79619339702ff93f35a6650c4b4df2efb534fc13182b3146dbc4bac439da9ce8147d5a8e44a07d9be4f7a54817981544a02b5e6e341b1a25d2ce16e2b2e5652e787abda106cbdc1a452b5a2e99c48a33c386357b9f98ef3b40664501f5b5b3eb507eae6c9ef410cc30236c19921eaa0d9bd1922e7692784ca76c4760b8b5786bae1108836b8587910a5c03d55b4a3db219bda7c76e6c9b8466458bf82fab9bce2d708c2548254163acd0c3c41929217d242d770306ff780deb179f4d321e4192f1b32e202d2539c5f18d215d37ad81ac62917fa815183a9de7ae83eae09c6343280ee2678972d3543d942675faa54863523cdce52920a8ddc76bcd909b3ed0eb323c9270cc73449d5d558c5a91c4fd6116b05420d2d78ba2cd52e13de13dea5580ea416efcdbf3bc951322e8e967a87a972398342d26a3f19e5176dc4887a6a8be16123beada8f61e257cfb469e2a1c14d01d51c002151bf75dccb0203b3308012f0155d1fa2635fabf9fabcc1da3d0d35889f85d9bd691f6834a89b6333c45288b1cb904f65796ccc4b07cecfcd00c8b2b63a433ede8cab48b766c711f5a3b94ac8bb2dcd7d05ddaf6c42c35ccf8819f25301520704938fc63ae502a26542aca3c91253462576004521251fe4218e021f8245df05a52f8e2f2c7a552b2d53acb7ff1a0ad1cfac8e7f6fccad8763818c16e4bbb49619a41b848a46e1ce099cd73dd1c23427589fc1feed96c16260ed7b7995905b0197ce44dc56decbfdf2e0ee67835a1de37e3d7344c430a73df0ceac05cb35f5349a698da30a8f98a86439689969e505577613ce4d87191a93c58a489a6af5f0f4f43eaaf8501399a7524e0e17fd641fe6953e929ee9fc21ac5508cbac0390e554729174219ec0bdc674412fc025f8911f7903d8c68e2e1ee5febc33c332c73a056b1baa94009b16f2c31077c7e7489e7a6068f3ddd938a604dfc28db69864f85b606799b7e37ea6a99eabf2f2bb370ee987357b984c484fe716ee09f6344da3597c930a80d51c7d473f62847466601fabb838354dd2643a53ff5406b090718719abab36299eb28445d3e56b936ebe94d6b3a8e7e29437a597daba1e17f432340b4d571e937b15453a4d0eabe36523140448fc69ba326ab4446a9a213d1ab5a8ed5cc5c23e0411f7f78446badd402a26dc9220494bad2156d137111962261b58bbcdf3bc3ae62e3dc2a7f8731d7651276b09d90c83f9177ab39ffca84a9738058ea8fdc0cdccc30d722796807f356a96b77db129ee1f64bd053e573b8083c18997758fe6378c6c894fd365f352bb3e7c397e0b96bfbbb1ca4c8a0387d878d6e060257404b675858206b90c4056c777b50f6cce88cec5256f11cee34d355292138da7b9d6dfa76f2444085c67cdede390fd6e23820a901965bce1fdf0433cddf48f8d91aad2c1c28c6e9e2be653d50fa2e516720d9ca3c6c991b5812986c333737f7892ac12c0420d9077a723f869f38f41c9b606d46855dec0d03484c28dc1332e4d9f17ad4d8dab39d66e8a32e9b624af9527c9b6ff84a8d4dbb8aacd7d92b253c484908eed7ace08f1f5c91fdea6813555e70f275e4e8877cd3b98d547520768c43fad477edb79fe424e3a38b06272961d366199ef33219a39ce0c68dcf88ffaf8a129b897d8c2a528ff680581b2f8e3a09f20aeadc70a2232fffa0721e079f08746728d17d694ab35c1df0f5b49051de46acf3490c233468a11dededdf473decfced08e4d6409a061f550092708054d7beb17efe25ffefe395f5bff4d5a9235acc9c5621c293d3e2192dd5f81ce39882a1c2050fd64715de4deec9915a4d3741a2b7eefe36468c6945ea10c4143e6a8a0cdab209506c3c31841af2725899e328b73939191ea5363a989a2ae71e8515ecd750d7a1648a19c27bc5ea0e5003fd0f0abb096d5e26ec9c5b386eeed9afdf8d0163aeee9177b822d534e8fb57afac3abe6a50f49ca9d7b70d05a5be03368ebe31d6bc4007cba8ded87d1074b48cdb838a7456d2bbbe01dbe71b9811c6cc9ab83a495c5f5ffede6d80da2f4cbe0bbf083d284888462f9e11db83f0946e14261520dff943fe97a30852009011d56d9427102e389a4aa6e3069fcdf17840fc4e829477ad42b5a6a9a3f8d65a9e310e8cb5b4e97abbe6dfd9823d9fcf956759ccd3bcce6efbb2e9b0df1ce64b3b988039ded0e561a53680f6f0f139825e764d5b2fa9903b72aa358d6d5aac8dd563a2ba5f8126f95a1a8ca43448f0112b02ca9b47e20eb286a733bdbf4304967e25a8f82da11e8922b1abee151176f71081b0c56f51781a0c165eae83b44524f4acc2d1272b1889dab6c80fc87a0895347bb92081d7304c625e164c6a243c715a5c868e9956349e0df2d163734a07dab6c48c2506fe48cc8adea6106188e1ce9ff99f31f6ac63c8675caa91edd39792047e3fb61c7e92ee0ec6b2d4de81735a7fb31981a2f0044d72c493a0c97306ed4a2d18e5eb603ba53e87a2b3abde09c9c43348dd71ad53f97f883bcbfc4ab941a656f173a422853302979f8a99b3f4ad072cea4cd4170b9515aceb12d965f78813d84d3502175285f5e4586a4f9c16eb6de2dcf39f230f0842682cc294084193c17367a1c5c52577fc0efab99b102b5bcce28cbc3e783f0b1236a0d5b41dceb6980eb5bf8f08d31eb81694d1056bf3f89432ce88a8c8a8f5dec4af5b8b3b2ae05cece0cd922cb9b8378786d9501833dfe118237ba70a03509cd007f0b281049a2e10d12e3b99fb699ef1b3fe0401a6c1f785d5c2943d5f2ae0fb523ef44686aae4ea78d313b25c6bd0ed2d0ba2cdb96f3a08ec0a5ff963bc0756e4150b5936d6e9b3ab5bf4977ae085eb2bc3b3f370411517193bb771f6b9be0f2cd42361fceafa0e657f2354972a36adce671990d33a4a7ada841ea240a778b443fe1022c3b716955ae2be54cb5589c50cc78dd2b08595c256f728dbef7398fafb8c670b9e8d52f2f3d34cd4ff549b9f3ecea3f08ebf51b6529c7e1ff3dd8a2ef2fb45dc4acfe5a77346771f1fe201bd715096dd20df8d1552d86a6fe7c822e279b083ba93f29c6d6453aa6a769af79369065ca4fa9bcfed32012e3c7006e946471feab4678ea22e40b89d79be3fa5c470bedbf7f6c5ffe8ab8408a2810483b4e67d0d13c87d811be1446dcbd4620daa6f74f47e58e56e225988a0d8b2f59d081097e70bd172b0eeb43358fe0a69d19a3778a22f7f18f5b8aa59a2940584c1b3b91a9143fc6c7687713f9a80835a76b0c93430387b4fe92a8882b49c791b5661df39bf09eb62138ca330e278c2c116262869468fdf920d66b581e4be459dec9d8114c2806cc327c533cfaa00e3b24e9c808862ee9811258e0915e0cc04f589e90992c7842b1e8e90ff5800c2eb8ae05a180e280acb1fcb187e91223d83715a5d45da5c31927bce19ba66291880d573c3083240e00b428aeb4c4fd619f5ec7424ece65ffb030eacbf954d3e8975119552ed674563d547d680015a6705eb175cb166f5945bde7d89c401275236b81696d4af09d41bfb530dcee660bb22174040a64597d033003dca98450ba0b946c138c34c9c97d8bf0d7dcbfc90f1cf5ccd4895e007f8daed5e23763b0853a0af7170c16c9c073e341e3706a8acec013f20a6b2ed1c3192aeb37fa5f7baef23a0005205e5b61e5f1ec318752235d59e8f9e9792197f056c765270c00441a0170721da5f5d01655d3648bcc4fd76208cc9e02180baf5b9886fce4e84090d18c286c529e449e2167eb4906a7a9af64eef0d82bd46163dfebab0adb9d5515d6824df3af6c4e0ab3ebc62520253a24569ef626169f5745bb4c7df9eef579a1618301e6593f83fdd21030bc914db1a6b222a73f4e106abd7fee4c28218131c5869f51abb0c16fb99cf2830fa97bdc724650f16a6e37160f78a6d0e4ae8b5c853814a5c9af9b3ecdc7bee10d61e750a03453d7961ac8f503ab84a61bb124c4c9d998869dab0714e45e7a64ab56b9d9c1a20172fdf16798bc5d339e605853043bc8133bc8eff180927bd9cb61b0dc303dbfd508845abe6d9f4dd38c99251a05794b75458d6bade47161b74b1b6df810754c2fc614b6de9fc7b1be47a6fa1d8931a592543266f581a2876b184a3456c01dfa96c8085e4101640d11e198576687cc5aa89ca3166f359801716de6b634968bf94e1b4af36cd61dd015fdfe13279df7acc94c699ac68df2d4505be285dcdf728a735a56a3ef5f849ef3de17fc177049e2863407366f71dab4c59579ed03b7a827ef3c7c1477c2b5c69f250313205c7c3c884e58ff0597bb3bb49437f7a0884e0d9eb6ff3de1f41c62054c81da0a500e2350655d853b0eb40954dd325b0882e82c810247002f939aadf0894c8e0bc6ed871ac96515319c56664522ae0d9012ed520e8304289c47c7da0f3d7b5791c064d72598626bb07979a0319349ee831094725d1625393c7b7d66bc1fa66abf5ac373783b32da757498026ec454d7daa4392b15f3dbc7a1cfe257fb71e590e330c8369207a332646863fbf4f3889f74a771cfde53c30306f9af36940bc7ec3daf81d79a2b85dfff6386d235b00cdde330b58a1cda650bf99d8634cbdba0e5753ff0896ee8630c3f13eddf48a4b3771f6cb9b1dbe276eabffa4951c37b1e430915ef62798eeb13bb0d874e9b4ae85ce07108f80d76a4f8acb8fc84a01ff5cc58d6f920cf03ab020cf3c859d70161798105d51ccb760570d7790dba3446486212175f28a1743f78e4beeb8ccc53898ecc19c023fdbfe2da7ec2aecfc9679008288a97c2a7b38b030ef9fe8a3fefebd4197a8c618717f5cd86d722a08fd0f0245da7b18eca7a574a5edf586586b97cbe3e980069a2f4e47f8932d97d89868a102baac46b02994464ae71d395bf97c65d44a29cdf5d4c72fd06e69cd2e22382382b41c9b4bd8564ef2ed123bf26757621b91c5667dbbe61cc75c11db2fe361d2abcf5c1a4430d9eac463c0367d417dbaac24ecbf21ae400e02d0897286c1b2471c5fe010bc50b0827e3b1e57543cffeb628a926283d13ded47a850fd0a27421a20dafbf99b263698fe6ee5a28384bdb58e89d77959da9405c4d5e126f82f9f2d37b4032b7e78c2abd3720bd380b1a96351ba57fa323c07f8eba2afa30e76225f939a76f40df44bf5f8d0603782b457ee025edf3717a40d09829a72802c46073de20bf7ec97292e37bed65ddd912253ef4174ef72065e6191e5a5a6c5ce516c32a6d7588930b9fad6a2cd7bafc3f5d5a7c6619f4642c03241e924518c38bbdec7c3b9d4f142eca2271b09dfc2e4f02b19faeee41b0768623187c0b77054e6577095811b6bd991a50bba7016dd54dc939c719569964754b7cfe0e62d4b60dc3c22f54329547f36c0e59e6bd078af46ab3b961b9d143722e304909ccb7c16223791b5849e2165f6ecc4e67fc4ab4df86de6507903653b5760bbc6d408ef09894ce4652c17e313a0a1bf163298f842b17a0dc22a3c033d048da7e0bd8ecf63e393fc795416131320508cae14a9bff178164f511835b18b2109a1735c02368a194fe4a4653923a04100218203cf53b4d6a23fb574b2f11836d3cc0cbef6a715da3b1ac03620d9896aeff641e958af6b50cc16b0c5243cee1df89f77c3ead369b892bb904d0131eb9230a10dd186e215e0561f9b21c6ae11adb848ddb9c53ede26dd6fa120a6e66ca231a5bc08c2b9b953003183ac421410fc4bac9c626513800c672b8e9bedc96c5eda4810c0d2b3574ee31d4be25a2e314de917528d1541dc7edea4aa22d77b52104c2e5dc7dd1c7a04e81359f44f2546ebf10c1564e32ed9c7d477db4f4e2883ab2637de6284af923d10205735075b515d6a12f3c48f13c4d643d6d453325aedba22681892de4d4fc8cbf4e49db42dfada819617609d9c7abbc3999708ef27f2ac36f6f62f2398454ac00f230700a8038da20a9774571a894c492eecad6ffc4c3b65b94c0422ee9dc954142a5eea47dc4a2ac337e832dc527b93c6bc896099f0acc48b15fcb560a1afba62f20973bf63423978111c6cfc4a5e0992ec0f905edfaa4346314d86377a68c9a7daf7cb3cf4b7cd6ec75320cbb91a3477448dbe603fa9cae35401bed205d0c0e2eda4911492600ff5891b06c243e469301b30f49532a42fe1cf136692806a118165c4bc80a1f7968780de809f98144f90c514983cbec79115b7b3e4ca7cf88b4d9f46e6c23e8fcad2ffc29f46a03278d306fc45c98fc7f30730df8fffba43d13c725aae74333f5f92fb29def4326ddca8c9c5c12aef9bcf9f32d2f9c5d2325bdbffeba5a37bc633c51c948b0f8ec6d661b0af09acda88d6ade63de0511ee5393b719b4533ce963b305397951e2ea8c05ba4df990c34d389604072212c0525dedceb14611c7d5fba8634021caa9a1d154051d110b8db263c50283a86dbda8f25ba8df1fd3699f27b0c2943ff4dce383e359e641e94a35d4439c0f050e832ce9476167ccf7de9264b064577f13c7bf8d4bfc3dbbf0af42594ca3badca784b805e1e3ffd8e3962d2df129a99a3763e6704a5890ba6374f10edcbac170c54ee7a54b9657881c0b801e30721a950b11c9f565f0d735ddc13aa3f1c5b5b2e45c825973f42bd89c4dc3cbb9ea4bca70244c1f3573aa42ec8821e21ee2597b8915153d647880a5ecb8f6fbb2d87bdd02774b0cc16e5b30dc40330860889fb417291bf4dd654012766ee775ad5383746df8c5f37ad09da839ab3e5fed2301cb0efee77fb8e924943cfd71fd89e7fc34120c8a72a1db2130b297b453d25d75f0961c081c71c41793f1082c4eefe57fbfd952812b5ce93d999fa8baaecdfa5a3e35364c6a23b9e787c05bb58fc5c82ccf0eb31df05b70b950cb75c54bde2e2909994b1ce7fd1d57632f82ecda1a63c7efad6839e1e88227084423e463038e3d3d99fe512902066a3a76dce83a812a13f86c0e94a6d285dfc59a8bf3ced4486a0a0306db7cd7aceaa6969b25cbe7d7c6537c1338792df01d5ebd4fbed5229b75b7288fce5d3354f1d8273d38b5293fb3f2548c87d0b19c5aea7a0575a216893803585595ead4c0fa593d0c36cfdbff041a2556aa826a72fd4d6dd72f3b07e690cc94abdf67f89736c1ca3c3aae1a80f53293bf3a439d3472edcaa5ee72e5c3c2c61ace2f367f60596ee91f11cef4641ded574b193feb0d5106544ace5a7eda5a57879f5c96c150b3b67880d13f3aee30b3ffac2fe70da62644e3bb24a246fac89e65700b5348d3d306d124ddd50266c024ec4360efc7de97a03136884ec4c460080c21511a458a5c01e617e8e2d33b86d776f28d9f91570de50d04bc17d58dbf0475e5659e02cbc34e845c6ac16e8b66479d17d2f3c1c07b19bdc20cb1e2501c5ec4eadecdc98592efe698889996504dce7854ce1bfd8a36bebec31371916344f9632a85201675dfd9db4f1ef8cc183a3abb550f876c47cb20820976ee41d5aac68460c17aa6ee710a25a31b984f5363c62fc28554a098c979557beff0cbaf08b8f454ed255ae7ad469333946fcb957c530d367d07140247acf66916f7c751cf73f6f529bd2f55050f5040ac18dd72c0b4ac79525d089bbf9703f266858cfe979f77c1d1bc67fba642207ba06241201b2e3c7edf1837b1d5b0b9d0c9eac39ab9dec07c0b55a564d57aa77f4445c6d077261cc9a262100d7fa0d27264f4ef70a28946e4648ee8148af6395784b829d714dde4454a5157f8cf7b567e4237638d71e72804f330af83b470a7480d11822e7dd252c53a6b8a199b8bff9fe188f567ce79ceb22c975c9bcb37986256e3a849ef4f22e103aede3db8f51860560e37cab00efb087c0c906a7f0e1356755f9e8de5a87aa6ad469a051fb2bcb990a842827ad33f7f2e7737b5dc3764c25e308b084b63a1ae06bd0c4fe39a6e3a0c181a39713d6a87273767cc21563c46c54b06486a0a1d574daebbe34dd141aff9cf3ce11fc47103db07f0fb1db3e3ec4a15b46481f2915b6b3140ccef13e20ac27b94de55060b2280fa4d6720609d8f4d76f5389805e852ba3579ecc05bf944e030f58ac1be262d3ecbd3f14725a61911096214caf45490f82aafa382bcd31f25689dd41192ffac84acc058b5db6da2d04219dc0a8019f519f19e492e2e650316fb23e79e87f750b5a4bf62b22fa0549893e0796df26cfa569dc5e98412feb989eee704b55439a37c446ad3fb896b3400fd3e23ba9effdbbfec8523719b4abc91a064460dc09353eebaba043811b5f009a3e01339fba842ed9f2d03992a43c09cc71e9d0774f6752b9584fb970530df5b5f2f2dc123b793b4bfffc1cb998edbd0c1d82785d2e5cbd6e41fa8899f71145861fd6160f3ac2865fd4f2626bfb3e7971b61b5924ee5a4ece88d4219f9559d62de82226e0beb5f9ca6a52ef455ad5e933d3c237e26b40b10520eb3ee87dc658f738f46ed417c2d087bf6ceb33696cdd65796e9fed08542cea9683c8588485e66aa2d3cf6e3204d89218344cde976b8e631288044a7bec2f7e27a8eab393ba5ef01f584737a60c620b61295abdd9d9de068539253092486c2b808fa068e873f857afa0e06e5a7809c062317f9387de2c6281a96f9571590f9fe9d7925f36eb2eef12948bc16e48c65d8dcad6bf7149ba2622e9071fff7075e77e08461953e5ef69d31a7445f8aa5532a8c9fb7fcd550a1b86c4dbf23b1a78053f19c68a2b265e7fa58c3cea5aec9945b0b4eb405927ef773a63bf1912927175e531129b59ef63368b421650d4d51068377650b9e8b14f2c59ad0e3504672b71df6e0404d25ad87c1576da89a554e0175ebc579a27d3bb0f5b7a934e38d164954e7c4c9c7a65c1f0ff50bd854341065137fc4057081f0ef551651616eed2b9125359ba5ee81d14c841bbd4fd7ab9bcf5b17fe4736ddc17b9452442e3a919a506920c7963eeddf438bd82e3e51776fe2f675bc1013245ccaea7af414e96ace7b72e7436cb168c154affabda965cb00e7c41a1b462fdb2095e57be97e236165af0fbb9749584f0d52ccba93f62d496c10389b6c4cee3462f40ec1173f06ea83fcad529da03395d890163cfc7f20175de9d335f8a682aab6c5fd95e0526de8c7b52f85e8b426000b32f46437aba0ef2368678e9ca574763bebe051a24823efa8f8c4dbf6cf4a167d0c70469aec73a43356c199596173e13a2eebdbb5339247e848a96b826929b2db577457a99886bb5ec7e59445b420af3f137a849aec8764b2eccbeb08fa995cb1441ef57132b477f58db845d18412824154c4f665fe29142d75032b3811cf8a2e1a5b1a54af8deba8a9e3f5b68c006f9f021898051e986cb5d4113355547b98433f6bbad26343bb6522518c7086adb02ba1d99ad2006fb505dd462d104ca7064d393cd0b48893fe92001dd0cdaf5ab97fb3c749f7663999dc09c36c541a688b6e30d13e8675ee94ab0fcb494e0b6b5b50599a3b6ca371917182ffcd417bec15b2e0ad33d567e8e817ae11c14c3f4decdce9f1ef21b67d339bdf1f8afa9f98bea87c7dd9da066261558fb4465fb3ff09acba731c4d0776697848d6117eca8ae4c15849bfcf4b6d81187375714e302a07532164e0d0d889fd63001481ac116066b9b89a259a04826d86f6abe4e1e0f6119ecdc5bdd4e67e984665fd66df70ffaa8c53da639eda73052c0967bc4ee2a5fb88e3c63f69cd0d2ceb9fbcb4b17b73c70bd71b4bcdb2f0128fab5b26d3c7b4bb4c8960244a346582865060aca59d4fa53edcb687015e9162a57527a8b75fd77eeb3596f364a291220101b7a61355b742053918a49f2a3f228a98d0d13c968978c00453a07a8a5b8fe755b4336f4aa04393623bf33c5b016df15b5c51e935a4283f9c3c2dc992cb66af3ece030754196267bacae518e77a41049c57ec572bf44f48c363a811a5d0b89477a2239f5e5f731f691a30ece10b935f212f0b907a0a8c34de65f2fd041f799dbdf4da6e91cbd1925b6313a8eb2cca6df9e80b1a4e6881d5290ee1fa2aa2bdd742a6454f885ca4dfbc0fc22fb2e07021d8dda5c3c3cfd87c3f49723abb3911d991f52170d03a21b1e1a91bee1359e79b78ec46ec1bc743e6d440f175b7def8aa70122c8214aafca02ae4e2cd19d0a567bcf439ef9df2eea30ffdb1bf87261c6f86a59e8e895b0fd2222b015601f652a4b94dd3eb93b9691c3bc5547ff89b73ae15d0c6e65bb36442706ea9f5cf2b6537c57b2624612634cc644b96ef7f07b2abfbac97a7e4e17c2d4829b5b37c40c1d7d6c1e423479192bea99e907af229b3876feb13d6cd5c7c8cbeb38abf0b9add532ebae94e3c04531cc4c0d5ed48e430de8481eae11e1629ccd1f959c4d3915db64aa0f1272fd32c7f3761544b2c06561d99f10e3427e2d71daeacef2891fc6d9c51f472cb777d4cac66cdd9d8446d806d07e0e730a810ffedf5f407349e58ce2a77fa70d09aa911c83e831e8a4410109ee8b1d79b118ec7cf6f0a0304cf350db89f11a3533be85fb86f1098bb5b7991a915435697e657436144f49a4d40f0cc838e0b82271e4c1d6735eece4e8b9c442197135a791ee03e77e3c0b943e3d8e26bcf7e5a0a05552b588c77503cc8b7977a0ad759d8369ee85e7f1df22930f25840ad651230db81c7a907809184ba69ed0469b35afb251a1e96fcefd358b5cb0a858635db8336ec79c6e6b738d0d26ece2a5ff6340ed70b2271a67f9b490566d8d671f3308478a6f1cc0101bc1bd4694fdc1b9a8caa3bdcd66af3a32190ef5d60dcb653224abf77e1813b4cda66a7ee37a619b622be15d8b4861a0fc30a836c9765238b4753bfd7a5103e040601a16ad089af7826df1a3b26c9b61d09fefffb9854dd3cfb2481eff93a124aea92185909cea8fd62a5fbe4bdccf0bffd3db2e7c5418239048a8a0e463d070597f1cbf44ba81b742cbd99cae63f999485e0a03ab8473a391c8046ed4c5e74836835849b5ec4ab1e3cb98737a3276077730e90929e5162d17d00c7e7c264f79d1489e143daef9f6ce82d66446c9654c78ad76373436b9e8c52a0dd2f44281fe058825b8470f9c74882f46f587bebd273cea9bba19b84902c66eeb7542a5aa4289832301258d7f6748143a41c0d0815d677beacd80f9e7b909593a9b1fde1b9aca8cc296095fbe6ea542c5628d734d3321bd792c3d1102b823fd2b71439180f5138dfd0a9b39e4d9b823587d8cb67d85e447d882e115ae83ce94eaaa7423c0650cd44b38bfe6ab1a42d9ab14a1e1d782f8cb4189d515a253f5e2a2d7b6072940d93a193fb4af238615b35b8248837922035f06a1e86f3ea5b879cce7f2c555d0b39598b20163d2bb5300eab8abd16acd4e79041feef08ed41a6695e8ad75378ae4826d6a4bf94e64f6d86d4bd04aeb19fcee509b9ac31150c0fcad41b1c5d8414d9cc5bd43028e998f38bf5c7c15c687c476c8dcd4687b3a8f3fa8a49be16e71e5ff2c582dbd06200bc54d1ea9f96265f0f5729e25bde256cbbb2ea2ad27e9dea3dd157a7af2645574627456e649aa79f8723ac0a3489e10006642b238e57182e11b7bb98bd2960d717ae3b64ac9d47d2982a7809c171e27fc51a93c10059e6a15183553e825e9d15ca1cf1c5831a7f926a91e514defcc964addb7223e4179cd030d1c66723ae09943e1c2d5e685a68dbf66684b064c5f4f27f64cda86b83d1e0b48a483d40564dd12fe74b15b1a351116ed7f9dea734b931478a9cf8e4d9892713799e9813129967120ceb632e9352d4b84b19b919d12720c86b23659fd7b62fb59c7a43fa70a5","title":"297. 二叉树的序列化与反序列化","link":"https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/","question_id":297,"issue_number":20},"18":{"day":18,"pres":["DFS","排序"],"tags":["哈希表","树","排序"],"whys":null,"difficulty":"- 中等","description":"```\n给定二叉树,按垂序遍历返回其结点值。\n\n对位于 (X, Y) 的每个结点而言,其左右子结点分别位于 (X-1, Y-1) 和 (X+1, Y-1)。\n\n把一条垂线从 X = -infinity 移动到 X = +infinity ,每当该垂线与结点接触时,我们按从上到下的顺序报告结点的值(Y 坐标递减)。\n\n如果两个结点位置相同,则首先报告的结点值较小。\n\n按 X 坐标顺序返回非空报告的列表。每个报告都有一个结点值列表。\n\n\n\n示例 1:\n\n\n\n输入:[3,9,20,null,null,15,7]\n输出:[[9],[3,15],[20],[7]]\n解释:\n在不丧失其普遍性的情况下,我们可以假设根结点位于 (0, 0):\n然后,值为 9 的结点出现在 (-1, -1);\n值为 3 和 15 的两个结点分别出现在 (0, 0) 和 (0, -2);\n值为 20 的结点出现在 (1, -1);\n值为 7 的结点出现在 (2, -2)。\n示例 2:\n\n\n\n输入:[1,2,3,4,5,6,7]\n输出:[[4],[2],[1,5,6],[3],[7]]\n解释:\n根据给定的方案,值为 5 和 6 的两个结点出现在同一位置。\n然而,在报告 \"[1,5,6]\" 中,结点值 5 排在前面,因为 5 小于 6。\n\n\n提示:\n\n树的结点数介于 1 和 1000 之间。\n每个结点值介于 0 和 1000 之间。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2a9c133385f155623c4f4e5a461d578280275decff0317058956ec014fdd67ce65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dbb7098c20b026cfebeea39f5d27dd4475a79a382c23147ea69cc7bb33d7092b3244f2d267aaa69976ec70ca3510822b7d6e4e7b4548c73e88991eda2b4b63e55768a9fb08a4040c422f355d74017615014c61ebe6c42287961a4240a34443567b053260ba3606def2308b7638921b9b6101bd6caded7a876df5beb5fc25a2356f42cd8760288eb26a2d13ce83cbb501daae759ffd100cffbdca85cd280b69e18cff43652b78ce215c4a3ec9b96aecd983f938ba1a224d648a5b3f3fc3b9e830956fb403dbfbae46b4e508bb3369dac30bbf85ae21ab3f7f259f704aeba4075bc3ff0cab981783d71ed763fd6142e0ec146f1546d8d16f95aced02e6c9a3a2e5c9b4bf10a86b8294735f74cb6d4050b038d13ff9332675693f42e8cf2a2943f4279da5300545b97592a481097b8e3c464d44d0ff7d52c84129cb6e6084585bf0f3e27bdbe17676864c232d65aeeb1f691755b964b3d77c7ca05f3c04e0f98ce0c031e96ae5af977ecab26f27e66f9da1a725c63352f9617e2e016e796ff82de4b78b9beaf554df9676282eb34fbe1a0759c6fa43ec978d0d11424783cee78d72e1d2a04623833ff55f78db4f08e54511480fa2119353d2560c4043d766a6a57f733860df7613e3c898f9b9e442b2c9e296b1b10583ccd30934336dff97a5b6c3ca4b6f89d362103247c659989adb8b7334124038b7e7f48cb25d26785ef756f74c1c832cdcf54f529ec140099ee9150397c1a1b6ebe98621acf97f5fda87b6f1aebcd0ad6c2f9a722155744b2c4c1e8fcc1c81d7ab4b1759ec5fc6f0d454162cda44a747994d9ed215bae7cf73ed5210e41951060b179a9b161b69039b3205c651fea0f8b975d734272e32c5ef65eb20476fbb56afed5767d82180a1d64f203703de060ec19d655484d513ceae569a4964590eed976710675f2fc7648edc915ea11a515019c8be03d3a433b82a7111153c52950910d416f364f47838e68e91b557994622f5bb8e87471dbc1277a32675660fe566f504be46ae36ee3500a698ac205615e8d4c69f70640760594c45015355c7b499275067a3e58503c35b2a0a3037f5e15d824373904ddb234c46624984a2deb127f78d5e939793f9397103fc117afdbc2d9e639a8d6480fd74c57137c368dbfc6f699c687b1a8fa8df52522586446d42c6ef94e9c5340d2d3165c87a77f28002ef3e82a50013d948793aa782397bd3ffee99a60e607a08ef29ef774799699acd4c227de3fcd38ffec0e4e1ed4048db9ebbb2b914951852ec5cfde29cdd7fd1fecbc4c6517cfdb53fc3ad71ff9eeb6d0257e5a05363fbcb103c9de6ccaa8bb47a38fa52aadd30d188a852761d75e95731849a619556b8cceb8c90b47876e44a04edde21519aec1d31643fd9927c51514c56d42cdfe4693cd46b2fff6616428d03d91d1370b33b549b4f5b77332ef606255ec36d30fbc7eb28d080d7f025bc9d1f41180cff847fd7e0ff4a88cefa6f9a399552c5e4fa3b400eee6a654317b645cdc1bbc00c151254d02760ee1a840bf3c9aafb6a44f81c13d11f13cbaace8d931865bbeb98c789786d2efeba596d58d21d283a7188befa1f93c12a22f89455d43461d1cf5f17a904c2b3f561f458768c377835061acbf40ae6411cc2f4ea234edac9cdafe1aa8bbf33a3049f6758363dc0eaae0789d83c8b05bebdd8647d993abfd9315ec27f466399fd2cf4d9b3fbd573062467a796ebc5a2533532639d7d6fb2371a4e1a304293c9b33b2e2e3836c7d19d2f642badb88b6bba53aa1f1238a5dc692c4ee68e6d697e4e65f707b548d03fac117af69987a3ad8a7255c44bbebabd5db4e69f4b8ddb5065a71795650df965d38e51aecadd7c1e965c20e0f388adc053ca3b249038820c4e88e5031c6fd7c80442b1ed17f665e64e9d5d4a1e35212e3911ce37f3b1ca17d9bdf568d0bc60e276e0b559cf6478fb0bd91f0c24467bfbb2ae30b85fa2c978ea691f2cee3a6b39158aa5b587286c5aa4e9eecde22f1b3f4a97f61130afce3675978a2cf9d7ba53efc28cf4a955c50c5fdaa1543203048c2ffd2a8a466414d37131b109f4ae1935d168d35c0a3ab5fd426d681704571679f3529674efa0c6a3a378bcf689b0a8374d246ebd37d3bd9831db753d833182051f45332a63c04e493694a9ee98ad4edf0b6cd8d04dca3e91e6b08a983e8c1885964af4f60993ed3fe1d03427589fc2d4ecaac96966ed7b4e9090670b96d36bd644f7cbe2fa26328e35ca7e954a9dd5ba3df6db24aba98d6db72d986aac0ae6926ccaa7d5220f0be94c84796f304ae72dec097d37438945a36af4d0f4fe3faac56413a38f53781e10c566f15420f7e0b5b6bb17d13d35b7c83dc3a76e16d57469e0d4d4915d3056c5d3faa2017901d4c6a8121fd8ddbf13cb3ee909067105a3a2299a3ff3cd3646c4d96b9e5a446bdec2d504ac57f5c2a0a09a7cff5b42629aa9c2789aba18e4df9be62c7189976313b7371647a35efe6513790f9b33078067ded1692053503eb91301546ef989536d6c9f1724378a686febb52ee70ac0ea2275fe87f129fe901c8027cd90abe0b18287af6bc0ae97ed056da119536c5fb1dbf95274230c3e6ba1b13d00714251bc3198b5864c8bef5ae9d1d64d2120ac022fd185f9012934ca7541ff004898af5d1246ab3c47ce6444533a7b1744b482fdb83cf9757d8ec7ac6754781b772c00a2265b7ff6f167797c508011ebe71b0e0841071543aa83bc656fe3cec27428c679a842dbfc1d82fc85fd2d3f011a3fba134af314c14cc90ce92781398aa523306de57027190cde0bc53b71bf3c2cf4abc3c357dd1279c73ad5aac467cf5b97cc0620420c86f2d7766c4d1872e19f445c6c607362ff828ca2fea06f74261d45ab810a8e76daa12f5c393b9dab661f1f47333412050f14e851b046915a99667d9b7246d9fac60d092f49832404c0e4f99266e904848fee59ea35c3eb6eebd32ec9729e4eaedd54056d8442422a05abb41cc9563aa76c2dd77cea7df92244f12d75c4081d774b347c1f200708fb1a75e7090e765b30cb6ac0707d0e9b44691d9c9647ade2c3cc4ef1a64d80abf7de8fb73dbc59c1e169d43adaeeeda227d6ff36cb9fe3205e85e4289505a4fc152320406858c70a7a500c1fc77cdd06a580f9f48a59fa47197962772f8c912740876e7643dedf48a57a5d298d0664819fd7aed828945a88321a96d20ce526b8fb34c2710751774ad5cec01ee3f45626271c3f4e57f71df7f49baec1440349bc2b5ac15f9bbf9c615048305a7298b9349591529247571b3f9547d3997c532b23b16266b699d2a57532dfe1096be123a196b24d2e4e3f4490fd55fbb54245f2582cdfeb31c13db5f6144fd48bfbd192d132e52627df2d5d5f7e1683e97ea432cefa4662cc9bf387d3bad30b97ece0d3dd9bd0d1abbe0e53b0fb5103904c2f6afae864919e8998d9133aa4a30e1eca3806c45a03d5a8795342efc21d4ba9adb05f7f2a97a96cfb570044b0804fb32cf4b6761acdebd684fb9ed484a4d684628893aee2e29099bf793e846fe7ee209d332d4ee078775a2bf279a47db25fa1456d26650bfe022d3aacd7a9dc333d3590f57fef248eb5341c1fc64f0a4ff35fb319eedb6095e13627b2eae05993c321b897d422089a9b62c0bebb9d48f22b99b760d7253b03a4d10e550b517a2b6c19139910d862f0aef69316b11a905bcbccaae8f8592b1ea7df156faab0abeb628167f99b4f84a981412dc52f6d4b143478591d659a3081fc993293ca1a5fe0cc3662581b49254f36c351ecbc940fe782704b1730682e2426795f39512e83456b367e64c8fe7e1cb5c2d6d728bf4da1690b8547a46f46d2572bf895706798a38ef220ea6cc4de07d0cc2c6e761977dfc3881fd91b7c77689aa3668b5ff06d35a86bfcd6b78f7e60a77764f27135b8f7fd2bb7976129af00b6cd86ac4cc11a1c73f8103faea3a8e067fd689a13b74e4868b4bc3454865db0a144e154c0ceead189adf6b04732757d73524e0f248d68a16cc1313d9243a6fdd6171a811d39ccdaa53f5e47843eaec450225b2b4b72458482f5f346b8c504cd2bc034cc902688cd2a76b5dec9736f7e453a49392fd5a8c9b5d05080d18600afa1c4cc95b3553c22393cc37abd0f55932f9cd7058be84318597cd15ab72848d9fed880c520c5e72237207747990360afd324c899867d7568b805810611abd55199381ad8cf7f85a5471c7d950eef3a1ae28d96b7aaf21c25ed4127541360595d1e47d6e4800cb326ef727160bd7ba6b8173b1ddcbf2ef0d38d3a12746da1a9dba0df93de761cb1e353b69f6d468dfdc48521efcb6c5afbdb1798d849271a3482d4353235f8f5a1aa5f5c63d7cacdea14b93d0312b4178aed0fc01076e5b6d7ea7d9d4c363efd48728e084d5f561e2b924fb950da0f8a2f6be218816f2d56793842e9f6dd7cf796d58742fbbff14a5321bb4e95158fffc4b094034db1faa18990335a4bd5497238ba16dd0d7c41d49dd9e1f13a72ea9245e5fe008d4a3328adaf17201c3ba2586f8c4064ad407ecdbc393116298466bd6a9631926d09504643f7aaa9ae1717f97c1295b93907d460bf2fef651c26b25f2764d7d4157410818e24953049797fa04260e314b501db06a61166cf50f184000c902772b4e241b544a1ef9d052f58eb8001657388282b2bdd4124bee28495d136ff8837c437ea72e32b16e022581e6a37f503a8f8bfc30c14289cd10c5f27c4cb78da009db3f080858a397cc99387653fd39cc8b6b61708c4142827a72f1f6f524350d73b4e825ab1de1f7ce9591f147c7f053ec95a9e3595994874d49426fcfb0ea22105167610fed12c1e831a7fcffb8e7edbdb1b381c8d3d3d06158eac31ac80e691644045b39fe41319cd343482db77a6cb2704506b402097511287f5161a80634b822fef2c672085021a890ddf8b67f00e73b04a6a72893dd9c71f7b1a6019e8fa5727b2bdea76924120da058f5f271145e8c8dbdf1f080d4c7f947b7313b49143bbcc63dc9d2947e7753d050b28536c496840cce1ca3bb458c4201e9d7ace933fd08e9e9ffe857b4eb49ac39442153398fde4fc342ade983100ab5059788c9308f33cea5a6ad98b855df2176b6e9e4bcec16cfb13d59a6a39e2e586e6a0d0a9177d00f240e48f9ac55e3c46eee508719066a6a2d9e2c8ce8cb594d720012a7f019a2bc59f4193271f8dd64e0f00aa5489cde4e4f45acad6e2473d07db4ce52935a44217eda9fa2bc0f1a0649b356fdfb3b61a80d54544838b06c3856c4e0ab3ebc62520253a241f9ba33a55cb1e17e90378ed94ba29ed24c555ee501583fdd21030bc911ff4f2e770ea155c1060bd36ee8a90ae44a6431d70b6226900dd5e69472de2f93999360211a3e2bdd5ddf6ae2f56576b11e84282b0606c395eb07345403dc2a72ada688fdb0a4a4ed6f551a6dcaa16e83ed507493c433808c0806491e6c8ab93520c5a00f1fa103cac7a59ddcb6caff8a9252ac41362c3fef8aab87bd9cb28f6dc223df193128c05f133cb58f9c0dc6b124b360f3057ca22adb5271ad7615522bc5526373dc61db6cf9f0c1f1dff1655de29908f92543266f581a2ce6b570a3404c01db48a9b0b495b4c6e4a06e18e10759db40ca881a3582071dd520a7fe6f07189b39f4e064a8811fc1dd015fdfe136edbf7e09f4c6b879f8a7a2faed27f30dcdf728a735a56a3ef5f849ef39858ae176549b6c840063c784bd0b488ce70fe44e6f05ae626561477c2b5c69f250313205c7f3c4ddefe3992d4d30dd0fd27abff95c80d5b385cfa5b50dbfeb3892e4d0a420e65157a180c9e8060b1b8b8600f4dc6e07a814408522fc59ae4be894ec50fd8c69a29f6346074ba56744528ae44991bc7520e834566cf49868a5f783513998c21c23586650ddf3f2da02c9305c48342d12608446b397d352e4cb519e612c330b16e1b7338ca317ac6182497018291ed7022da6f61ed8b8fa217b170cf82e94eb073dd69883367297fe4a990c7d174e13e9dde12c3414fb7ee64cd0b90bebd7a275c7afc087b77a42e4bb657ee9e72f75903a60af0d20a3666e78ec1f6ae397ff0d944f969c99a962467a3c6fa24113af8fddbff76bcfeb6527bc3714f4d4845bf737f83b015a544c1089b5de841a8335be75636c9b0f8b8e184ee4ab98043fcf92acf5e814153aeec04944c032d8b18b51ea00e443dd72279e87103746802075066f3693f639a94a1ccec2be61e04ed489b29352f3df53a7e730eb829ce814d1d6c4b5d459596027e57f26112319a9272e56ad263065d5d8a0c4b0d29af845c3d6933bff3aed62aa8aa3174931e8714e3ff6f7b08f45ecb16c5540650e9bc414cd4e52eabe107b75c2b70ced7251d9bff8f592c0fc26abaad9e5ff944552734b09fded8678e53ee430989b2b9da34efa0a23071f441ec08e74820b48ded2261057c999601dc2111510ec87b714b44bf173746e259aa2177cc31085b170f775ec8da1ac4e2ea705b12aaf1706838c6d36f6b7703c48c278315cae16175a047eff18bb263a1105025c35260449136d0ea1b9cf6dc54162f73410fbb818bfb170928f093b966e61b44df2a6973a59a860d0ddb3fb03ab0e943c558bb756c9313c23c6d428131bf0df78beffebbef0ac82b6ec0d7a2261ad057e3e73efc9b56b3508fea725746ed28e5305edfc8f264dc8769caa96399c8ddd2e8fa7bd954c46499080bce0000eff23f744cfbdc9bdfafb968a2d4fdb0d142c7fb1a4b044591bc3085a0b0c018665d2c44556a0a3c764a78920dbe32ebd385f7f9fce4f5b1f690db422074ead0177494976ca1635ba72735d272382563885074be3382070ae5c9fa6a29d97c0ecd1d67975719a06672f71d7ecdc986e8ffaf52354aa48fde99e6ab6bf19ba15fabac708479473b09e4c575aaff72fa8778f8e347280194c15a53cd5532193b17c05621a988210daedc30b6cd14ca4ac46f09c2d4fb1c2335c19348532fd09ab10346e65c02d9813ca5a50f8a48bdc21bbb27a833d315116a8fb5ce4ee4cbcdd5ccf59a3d9384d9b30e8be5b5d41edef9696925ee102a95d2c30009599ef2c5f4fd8809e38e98798465682e6aafbcc0e99e74b0659c394e89208626e49e2ef78ac938828a83dbdce84100bdaf3dd20e503b3418f72a5296185b9cc2c4c40d8e8c9cbc8244345ff54b1542a8032168f3e2afcaa593a4fc1fedcaa3aaa4d2ee88e4b85062036dc64ef54913b87b1b119edfb0dd73190c84e5248041e2fb29f8831c6c0de468563fa01c9801ed4b5449bf40821d5622f9867d0932b6b2bccc7189472faf600dad29c6085f6a99df1d35d1abe39ae33cadcaaaafcd8684ad636b0cea0606ee645a311d2b8ba71e0ccce8e191a8ed88351c6646e61098223797880096c44883d63fd46a8d3fb2eb8146ea34aa6def81bb40092b5e65774510635972c16a03abc22c2377d7d856770cc25141498cbd7dea588607c7c01724a25096766d941f4f89e7865c5aafdb27b933c0a07058962708517c440ceb107a9542785def381db9107ba6dadb789456f78e1f3d86be3b495388cabf5e201ad3cf1fa2c9ae340f21ac38596a7327c16375066245ac1ccae320372548c95caf0646532e45aa1bf51c782406f84a54130ec10c350d3a3d48c200eecc1ef80c410282f9bb4c4c7d7b664cac9e99a5d9ee212d6fbcb6e24cb367fa4e1a79f6256a8c0de0d0401406468bff9bc26f1b897be3a4646ba6ba26ffff8c4f239dd8dc8d3815e2f1efb6f312259e003923b6b4ade8706ae9336a328a529af8ec6d66481df79d8ee18d759f77d47f5dab15c7e43a9e533ce963b305393053e0eac744b81997d5903671960f073326a4065db5d59b4611c787ada87e4026cbb9e4db34661d1a0b9fcf49c502cde729f8a0bb5cfcd454df32fb73b0ba9876ba88e3b3ac43fc56a5437edd488a52314b886fcb3e683c91ecf49264b0640a6475c7a28d3ffd2cbfcaa9451c06a0a3998dc7f555e9adb09ca6966c21bf37e39e6771aa140e50dcb3125ef10edcbac170c54eaee343940c826c05cb006d580795473bc9f565f0d735ddc121a0a5c2b1fce5008c0621e369cc807de9cbb9ea4bca702405593d32a44992d72fcf458d1c15c6515035362e898fecb8a4bee68d2993023645558c221439972f7d4c68da969e172949b18930125c762fe923af4acd3831e7c3f735fa80a86b814975ed2301991deff179b9bb6a953ced1ea3c9e6cd34da9333b6701fbcb24719418507f5f827228680c4bf58923326a0b39b7a63ba1a51964dc2da12db0d034f38573d7c8a9abbc396bba115755f34c944434129cc58fd499d2ca4f450d07bbd2ccb1fc8abcc228ed00077eaf1ace8042a66b3a6675064c1e9623526b0e283b372dfca319de0334f9693a6c3d6aab0393eab758078dc2d48d32b070e11497aaf9c440bc3a486e18d3ffa0a2a4b690a214fb8284b3c6666133f647f8c72779a008f862f90ee358ce4aa4e7b59fad355733ab23433b8b018c5e491fdd500af7a1875ec0b947f160401c7f48cc3ca183465798188ab044b7013a4ed6a6ffd363f98606f7afdbaccd5a9c948a09d7dcac76c739b3fe6d162c6bb3a75933031ae93a8f329f68cc28a4fa37b7e76600244e91f4ce4b72b53be034b5770fd0d054e06559b5e65cc4f2ecfd61ac29473a89c788087703aec30fff7b063d656e33800acff61a846a8d594627212484f9b8344d72eccdb0d2ea62df76960b4edde97a06063cd1b818376550d26160017d3575ae61efee2882986d776f28d9f910658a05841b215c58aa25e75b10bdb0c998a09cc08639302833e5bd0039cee84b93e19e6e80cb1e2501c5e96afc08ad788dcfff5b08b9b9f4b67ce78548700dfd228aed59b4b2afe3711ab2d2ad765457b9596924c57a298076b3abb0814ad4604846ed11c78fa51d5a7eb8f60ce78f4e53e5360a30d96544667d8649dc903d29490391a60cdb48afb49b8e949ed631fb6ac148e3994378797395b0c7669112f241ea7a42f438e9351833aa5a129a06b5717534301b01c9c25c6f5e93d04584bba849b5aba38c2c48097cd388ed89627e0c247373bfe1a0e6fb0e5d5fd6af6bb78070e010b064f5990b3b7a53f58c712a3498866ffc0f5001687acc91b10e5800910e4f96a2bf0d42bf5098848bc2b6fcb38513939d334f801975d5dc1a5a7cc1d3fbce8e7c8deab1fca3baeea164eea8a73a21781ba8547e99f5abc33ffbf43924231e6f0b8b3b93644eb313fc047cc0b4f2cdc48927b328f2cb1ab08f36638da3903f7e7ba95ec7f6c8408fe2d","title":"987. 二叉树的垂序遍历","link":"https://leetcode-cn.com/problems/vertical-order-traversal-of-a-binary-tree","question_id":1029,"issue_number":21},"19":{"day":19,"pres":["哈希表"],"tags":["哈希表","双指针"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。\n你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。\n示例:\n\n给定 nums = [2, 7, 11, 15], target = 9\n\n因为 nums[0] + nums[1] = 2 + 7 = 9\n所以返回 [0, 1]\n\n来源:力扣(LeetCode)\n链接:https://leetcode-cn.com/problems/two-sum\n著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。\n```","content":"096221cf5b628be1e73e8bcfe626c734a10fb742b1ad41ac640b4b4ceeb6ece4c46c74b1f94135d5fd897cb866ebac1fb82941c49a2758c1af23f822b5e7ee6ee429652888c1cc99636081e50c7898f6d70dfa767226f84f5ed37480a7277449dfd71f8db85e1edcc5b6fd9b2d0a27389b0ec3e1d0cf2906fa3f5f0c87219c4887d6065735461d3241c422af249929f52b5d59e4757d466cbcaa0b38af9db0527b00702f0c4c59e6e50c7484c17e6b0f0bd68ace12592402f127a33154b6420415de50830f7d8305f6f5230deb202801fc09a6366345c29e4d2886be690c3bc29dcab917c2a04d83ff042ef68dc188e720094dc281c05f65117acb0f54a7ae6e73cb889e9598458245487e03d66bb7d11e5f6c82ff33834793e1c41a8d8955b45214ff8c7995e7d210c16175831eb9ab7e0c732df4b75da8c14aa69f61c220ba720f85cf8efcd5b4582e9f9391ec0fc7f8a189fcc994981e9a6b8ca6605d49fc83f2de75918678e66e5849035475ba97018daf34c0182f6b5946d8328ae31b6126a5511847f5d9d64552d17823e9606087615aceeae26ec3ed7274876c112f7a9cea314a176c84658be0795ca5b6b66345a4d5fda85afc007e222ad36d03e8b9e75a96a0af27ca356bfb5f482c0c7d7553ee20e38e819df2f469e99779242c9168bd161f5dfdeb40d3a88e1d384873a4cccfb071e0d864d6d64b9e559b99769a996f450647c83ee95cda739ed6d096433ac1b3dd9d664ebc132680ae8752bbde7ab1cdd6480035c260750b87837a6dec93b8ff8a9330ba0248b0b6ba937fc598f3ceeb7f3f0f4f2cb9ece9d8f65df0ced8f462d84d19aae41d25c7bf4716a7965171f59141211d050f2f35a4767ef2997a11646d1b50beb508708d31456304153936865e19b811024ecafa25f51381f0a1012550b56bd9309a09cafd7a743b4d9d2ad8f43d19510758deecb860736c6bce28ff57a2013c7e1fb93bd34850b40c09e658dfcdf97cdd7a68c0ae24a46e7d5f8182a4c91fcce60c15ff30fafe7b96ba29ee6c1701198cd36b530b6d429d6fed80b62bcf180e291097d63fb5d405d3716b7ba29a5ca43dd82381fe78f0792bda829e9754b5702cc4a78d815a1b9d0079970276792ce44fe50b996ea303c4350eb99d9f0a5622e9d5f98f734a26664844a6e28ed351375ebcf065bbc88515eeb6a29ef552da8c30ad273a9906518c66a9e7cf858ae3bc0bf4a7655f08291aa9c5ecae09e31214a896718033da39ce52fd62388e3d5219cee054aaf0a91b755ce3052543da1b34c9b0c3d9b7cefe1e666ab06a7b2535c22bd21fb5701f64e5908227f194d2dcf8f99ead3b8f211ca063d71f2eb421c3e5144675b094ccc782f18f8ac30813cdfff288da5e9c490ed433aaf4f5bc4da794c08fb95af3777bf706c97eb3d6c326476bb4fe4f229dca74649d885644dffd3873bf16a31fac25f722b6e01e7dc85d1dae9b58b65787cc2c3b00b67e5ae56427ede71c50a5fb1f32673fca9556735f5e59d7210a762567efe0c0753e4959d0836bdb624dd997e441d326a7d6bc2fa8cb8609eaab02411ff015736668a7670dfa9796e16f028f1eb3a45af781a633ceb568b0c5b7c01d4003fc63fa8aeed0c92e5d3616c26e7d4484b795398852b07d256745b0de71e7ce47af9b82ec8b81c75426f5615075a3e6e7b23a22c36d4fd2f0929eb6130d3dbd4c4bdfb076749111c1e9ccc75d00a940d0a6368f033fe206e1f9e5ea4e91209615603de1f422bdfd1f6c48607d10f0ae79fe5a8422026e2886fcbf10bdf2ff15a7601a08abfd230f91801f5cf5287528b6a43be19fae8dd02215596bdc8196b8889bb2b1aa3ad7a067cb38c6cfe4d7450e09a09cebf8d94d3842a3afb2762423f067ad28fadaf5174669394e233cc169684ea24da371d054fb349bef287e15537a4f9b8a54e5673155ae0c0d7a831531c9e320fa08ebce59c7f949a77d5628829f0abea00b7b074911ed06ca29834f930d4ad9e8541e6f1350d4a7706b902d960bc6079be98135f1aa5279c1508aa3897bdcd28e54af0ae62acda7f85b9cd3f93e4ae476751c2de16b6b0e96fd7d9906d370a39b70963018a4ab89a1a9862f6a58a5dce6f3c1edc1a7c0724fdcae0dce233b56fc1863001fd33859eca4b703b7021a50297df78fab8e17ca25867a899c8e2c3be470edc36520b8dc4b985526df4defbaec85c2261b16a26fc402dfc577472482321a3c2a6d6e4b4f14a57cbc86db4fd9d357fd7dd0263c62192a6348b5b6b30ec07c3d6bfd590955dadd57fdd107a92b651ef4668e6c37838fdc7df0f676a1c04c5853d58bc9adf4fd2e3ff21613a4fa1331db9f62830ffcbbabca869054ef0f2cb521061815ef5bdb1d9fa68965b62b9568833ce7877bc0b5c3201d2beb60afb1a8e7cf2fcc6afddf106901b85fee6f9a89d452dcfe2473b7e838446e63cb09a9604c85c3fdd1bc69ad185ff3e15fabb20970d80f0ef9703800dff5e96c57a5ba683d3854290a881ef3debd31c33fe91b055325acb5129a16c1cf356dc4cf7a9e5a4468c9c8d32f90e85885da99c635ef06256afbc8db2ec38ff721491d0bb20fdab337578f4e645ae434e303cf06e378a3f816890615edb893d6f34bd4f8d4a7753498e1f00586ffbe7b97f3776aa403e65d25dbfe5b741da97b55ad2ab02276203241456c78fa1b4f5f27f1e742e3ddc4b4bf8f4595d0a4e0c3fd0527b7ee8784bd72a7475d14fd0471e0781759f9e9be0fc58b714054b4edae6cbab0017a7ef09a745f49ba3a1b9d1705082f321b46e3c1beaf25a9673496c8af737537026f0648d81080f15d2ed5d3b9eb1ede774bdd8cb9859c99860509759f8079486bf5f929b160ee0264ad5f704d3b818388dbf02681aa72c22bdd079f2df315f5372d787e0b96bfbbb1ca4c8a0387d878bfb532256904e77bd5cd56f5494f44cf76d24e3cc0cb818b712e5880b026394d9a1e8db8f08796da662d6e085c67cdede390fd6e23824bde4a65b7aeb8f7423c9bb7949ac8fcdac39ff718c561ab04f148e7b11e3c58d1f0bd80ecbc8d29cf9e79573e28c2e95c844a4ec525a96f972fa7866bc9b606d46855dec09d75d4ccdd94672648d004ba589ce570de638a2db49f2495d1738995e4aea8d4dbb8aacd7d92ef7981c8c3cbf750ce08dbf5c91fdea6813555b54a730b1cc5774ac74b1194ba9b8c00ad57f09043d43adab3d6e50dedae7af2b9f45e778521ac38ce0844d0c2b3f8eaa32b9e8a3a6638eda5545ad9a7ab9c803284757c025636a93a52f2ec06fbdead4b724ba0405d1ca1045ba29df4a7d83fa286349fb03b0fcd40b8","title":"两数之和","link":"https://leetcode-cn.com/problems/two-sum","question_id":1,"issue_number":22},"20":{"day":20,"pres":["哈希表","堆排序","快速选择"],"tags":["堆","排序","哈希表"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。\n\n \n\n示例 1:\n\n输入: nums = [1,1,1,2,2,3], k = 2\n输出: [1,2]\n示例 2:\n\n输入: nums = [1], k = 1\n输出: [1]\n \n\n提示:\n\n1 <= nums.length <= 10^5\nk 的取值范围是 [1, 数组中不相同的元素的个数]\n题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的\n \n\n进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347683248a04f82c98cfa5f9247f160f2728f1a65326eb995e2c4c21d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad2497027a976cb92b3098f21bc2bdaaaa6a0885427c11d72faf1446a7247fa4f14415d9751b4cfbcbe22aa14aaf20ca816926eb7da005c3a672e3063ed2880209935de265247ea6c44476ea8a61c37adb8815c6e3b702f0ca3d65b22607df88e7d1e7835a8fbc67930316f9b3ce94f65f61b1c528b7efe6749c951ef914b0e8f5d0171a424cd475b2dbeb308758ac0313b70babda3ff0396c770ef9936448bb5a3c4c8475359aecdcc2d1f20249229321529a8df738e808475f30c45495903e44b587fd9daa23efd1a964686f1c506a48a779a510bd08c6586e7e82fc04d5447c84c2fafb47104ebb675a0c2498f9c43cc259a77827107defb8ee910278e195903880c2a685732026b5f9b1abe185cb2d69715146517f67f4af804f9d2bda2d1a32d11e85128ed68dd46551d35dd48e1e2a36d1e82500f723185c5150cc42c74ff0916b6320afd96a65db5a77907de425b5460f0b3351f625be61db3832060c6e8bb06f2ee8fc7c932d15d2a3b43ba5572a2bfab1d99c4ef289b6f41813f5341666f2907d344afb7e62d6c33f2499a63162ca752bd381856c2d9ae644e08e59d4074b1cee7a072e3dc64d6d1489b6d99b44698b4754738400fe43cd511de93c7e1964605c29fdf9f4b5eb3071b434525b7e0f628fac4b9cfaad79a4f0975b7fcdfb57d46663a30098c069e81250b7d2cc90c314fdbdd73f6d0b6b9440d787d489a7d6431917b9c1401f54bdcb41169faaa73969eea2002a8ddaf95e8eab20b64b6662da8aac7aa8fcebe9d0077b616a7d65250a8a241a193708fb833f1cac9625ed9d9d46b3cf0708f37bb608a1861a9097219c5589ba274c4c1bd0f1b5f6da6c0e9b6785a29b033f6f57e10cd669a1f79dd84c939910228f72d881d4d5862d82387bd08d2c3a5d303c1a85923c4854749f40b1bef42e51a021880f6578fa295947df4c89b20c7a01778523dceb901ca4b8906e9cdae3f58c174f31ee053789e10f6b85d5a103e827dfcc0210f8c865d11ae1a758a207b6029e56ccb05bc6d6be548f181e8ee9c450b3e8388d3d12e63451e70233c0e0929dfd8f81c3737bba8f83cb40402554007140e3cb73335a300bd34f6aae5ed87b9f9bd36fd4ac2e8cda87bd6efa6f01769f785049752a233d8092cf76aa9b419f20b1ca59259e3acb25a255e8086a24e91de43f9ff92fec786f48589cc10aeef6352c5478c2b13b8af0a99bcc848fe313c82f883ec9e9ea83f9e4d25e8614ab97890d5672345f5fcc3a1ffefd7efc34648ef8dbb82a916892950c361fbc9a4de53cdfcedeac6647539eb25a3c557ac10b1373a0ab895e0cb511cd4ed7f65564a82bca5a85687068468f32f6fb8025803ff176b9dcf069236e5d26c5000dc017281fb9d6a3cf8be1775d99f327ac2ddf1c7767757d4e44e4b8cad6f8744ed3f48753d0ecad8656adaa3e946ce14e7bde96d82287cd76f31ce2a63bc15ece9b84abaf192f1dca16f846af2276ad443716fae155a0dd4c8ec2f84e8c664cf625e24b68d6d98fffe50bbb2814a4ff047ddda27bfa29381047e9674289d89b1c8a1df4733a8bc12872e566406597494a705edd614771c5734abcb9912c598217d90b5018a0d2f7b6d84ac27c05202f36de0ba368b69242f698253fe06f3a2816617a005d7356148a8f391372088778723afd4b0ee796c65aa503b76a470f79b68a6e1e6fd4c0af8ed7fc58ba85848e96364630a58c1b2f5ae73375134049bd9b16fbe506794291aa2522705f9c9c366184472148aad8c791508cff0a115e073ee783458f5c9d4f6d28ffa69d8acd52e880cfe14cf7efd3c1aaa9ec8c487e71057af2daff70dd53a136a8fd1e30e3da267c06a469e7d5d8f40a8cde17c874bbcb0197b8a9fdf53dc0be33cd354baff4d71cfd8e39293292fe5de69a86aa9248a0a2e1b9cf0b67279c05b87a6a87aefdf8f71b2e36c85e74ab675eaa2c54b09f314013c59bd61f0c7353eb027b910d6229bdd21635594f8f681cbdc3e0c04809fb9febd51216926bd994e26c66898b3f091808da9da4394c281da8c55f0205fdaa1ba6c2c63e03bb150943d2c2285283deb65dec14623bac74c98540dd05de9b5e7a0c0080a16a24ec401d6c7704c25a934192505676e5ea38331b714c4b34b9149b86c8c2ca8d98cd1b8c4c174793692b303093a8b714809caae1dc998bb4a2be0d426ec6788f41fe5b24380a87cc79d683339dec89780a38c3655871064f9cc7475e3f929bc7ca69aefa6bae32cde50bb6ce690b7cd4e31a417faceb4e8639f316bad36e78a6acc89cd201d26ea62aa7754134bed24ea2979dbe6e02b9e2fa6ffac9334f1bd4e62eb933611387b9a7c910b22a7919bf8f633be5838c469d106e7405e91700e9ecabdc671652fc31c142aa1bd5ce188c9226489d6d16fc47eab3361c180a190079633dbcc0544c7e07e9c48466bd6d5dc2581ea6eacda8bf13ff830c8fa5c0d6d72b5bb9db3efffa010c087b16611803a154f8db268cf50bf89ff5504f434c97f877e580162b070a386ef3d2452486d9d0c203da668f63655be0ab3cfd41b75fbb3f00ed2913784e03c71357bc5ff81f306d7fadefb6508939cbaddf3f11e9655156d1e4b02bfe36600171c63f574961802a147618f2cd8c5552d26af0139fb85e71c2836c0725cc82a21d6816e4e4bad68df13ee8ec1dfb3eb8438616f27f718bcb859a7ea7d1db2ca89adb528c92e5790ad5f172161d85fe18e41067c02375027a8ccdb7f0890dca61427b81e9f2bb8febd2f70c0a31745731e975f91e6f211df4eeb12e9279e3aa792e6fb8452243e7557d34db70f1ddd0371a993afaa55be4f629043d0c0917ab103a36c0a1248038dd9d96e468bc49b55eb4c330d791737cce3f0809bf4562a782f3ad4878218911831b7395a3ed1db459df09fdfbcd9cc9dcd65c535e745ef03b3fc1b6018c1898585d0e6d229f58c2e286a618da75cdf6064c525a96fed7ae5ca228ab64f9a3c2ea3c0847bd4a9eb93767f49d418a91581ab29a550df2eb2a93ee4dd3a8ec8ffcfa1d4809280cd7d92b25381c8c3a7be039a1498bb9d5a99e3d32b55b54a745e538b3941d51c7d94ba84b2399a43b8ee5fca32d3f5d6b827adee3ad893f7313dd6b034fc46e1a3521d67233978ed626f530770b962c0c05e55685968d6119ca58999fde0341ad8aa0fa692874d729c6acdbeab35c1df0f5b490570e474805dd58b760681169e92b8bd0d9b888b82904d2746f62f67a9d0e2859bc7a206d20319c82e33bc97cd28e5e44cb0110659ceda818cfaba5857a31a00de6fbb92cdc610dc5b13b193bf903fa4d3265f7f2bbdad642988c766f4541e6a89baeeddd45e5ad3304b8be22bd2d4027adb1cf052116a0ac9a4710b7f41f813e8d736a8cee6aa870926e335fd7272a8f86a546f2b151262894332254b0d120f6a0b5adac5714df1f046ced28b6c7ce03c48571427e6ad12358efa1eaec7749fee013e97a52d97dd5605396447e8a2d45a08f53f9481830a248632b6312cd9dc676e5a7b055919762f7400a577793f10275142525448009e026da833e1a7fc25dfd895b75b53b673b29a6ea1ab909b9a25cdacf65d467323899fb149689c7df54c7ba584da76e3c5d35f9a1ba0275dd650449ea34d2c6ead6d7fcd5d1c3291d2384ce237221f4aa57cfe721889265b0dd8094bd1e5a596f6a7a881b35d8852ab495c6678cb37ee49c82f16126807dbc7a7260acdf85c312835b32f840d56f5257733ede544a7a9d399f183defee727f5054a5cb02d46fe8b241ff8f284b99298dae56ed2291a07cc4720b590daa7ee84a2f497755a1173c34d6d5f6e0b9cf03259ea9f82c402b24db0720bcc47ba7f54ce373abd8b717acf898ef220ea6cc4de07dddf205c256455b796cb549c120b14159aa27b8600bf21228b41fcd6b78f7e60a77a77e8714eae8ad72bf1d833748d14d2d9c6a92aae9f99ca7cc5eb234e4d5fb50ca878bd59d4eead3b25340c869b1e13817bfb0f5246142f00617a8df59395f2cba984db6461e346079f8f57d909387b84df2e92fa6c788f159be129b37d14da95fbf7edfe811e2e316bcc717cb4088356f76c32be0771eff80b1975d8aad69cb085e89b68784b5b7488333706cf03200b1029639be1b69df953eb7b80e15bf770439d2667b4dc9daf77882b949571061c0749b7261ee9f4fcfca0518dd51d5fb56c5501eeb0c737c621a43b8113f102ade528728b7d6dd588e04cf127d5ee721e53770d78fea34c89b8efdbe1f5cbc3ba453a4fca4fd17ef3f4af21d7634d9ba39f1739d6553c0fa3d49bfbada3ffa3db99d757122d7910112fafa92293083381ef0aa2c2fce32f744710420254d2c96c4039b768386f1c783fa3df9cb516d2433175f537c967be01cefc44236c20d528e6a976a36f31fe302c024c675a952ae74e5bea1596410da6296f06527421662ab2d51c8d98a2c66e9104798eea86bbc370f147aeeb017a5c7bdc8a99df287a0d55b0255bbf37ae965376f0dbb8c4e2ff3070cab040eaf3e21fda3e3c8fad2b1a1026905742b4425d924047ffbc371d16a74199bd6a8b2f9e6a385e727ff7bc94ad0d09fd661476188cc28952f48f88cb96eff67a4a21e9781a4f3c8ca1059d164176639b4353dd14bf21db1789115ad79730e67d36f76d67212432a906c7f82752eb04f1e6566f11f9047e61ec01529681d3a5b572d1e245ff4a82688aa5c429437b5a1d348545a79ec0c7567309ffad1b3a49fbb019e364022e36ffbec789159084d82313b2dfce14b4162cca16112fb21913774c4f68da35758158b0cc1d48d29c9bddb3aba8ff8241f7a5fcf3621189807580e74426c7c36e7946a1f86659a470f271f7895d1278d9b2fb7b97a2454085ce538eccb990e8eadfdbc0f9785fdc4e46b19c1ea4aeafb787c5db23b95b16acfcf8a823a4d3ccb43fa2bdc4afec46888e730b018c1e39e649023c8342293884aff9eb56d292a5d9b8acfed25895cc48fa1084c09a93626d210b9da883afbd65fdafcb5a4d8e3c3ebf1f4ec4ce3287b1e2f8e59b85c681b55c704ad63dc20780f8f22ec0c5bf0d431153100d97963c4e37009dd57ff3ae6e2cdee24664bbcf5990c2c48ce70835b35e92f429015cbf378cc9eb6fbb82e72fb15aeed83954a6667b3833317f53408c3ae409140e03f29d837e4ac1f006a36a4552000b47023d1438ce67453f56d3a0104f8857c373e64799d88363b61b71276b0baf0c43720e4d7714d0494374f2477881e9fe2dd0f2f92b8f7073d2fab257a6965018c0d11c9aca201b5efaa488257b0f6a711491ea3700b51e45a64c7ab2fdee66bf388c1bba4e15d7b2827b56eed41ce4e3fc76ac69195334f264f2c3defa5aa0430060be3f1e58e96b643a68aaa932f6784619f1adf281d3f5a12c0d392e43ad06fdfd213c2517fe270d4f209eeb65d673d4d91b5f01f0f509abcda616b135cb0163f4cdb9cf4e37ad13570e27123c4a0908a3b55f68a26e5fc88b71edacf1673bd213759da2a2899238969e66a28f5974c8de4a9f7dbe7c9f51d3c0dc6b1d4436c98cb641e1026da7c7804b5522bc5526373d964cffd8cd83e5f645ddaf58dc74b9c2157b34e9c8ec9a2151166042cc54accf8b10545d157a031cf6d71732d39245e6d5bd462c719a004f3eb2f966c3a692074956ba228211995ba9e00d70dba6fbb54c6887c68abc811c18ea9f335fd44eebd793064c98101e37468dfc6cf5cb4e40ccd4bcb6b3534510589527779d6d824cfbe7b0b85e190306b3c593b99ad2b2845c4ffc1e90b40a82953feaa0aa4dc4daae997afd9772677529a9670a420e29502c5d40d8c42fb9aaa2661408cbbc2c9b02044f7addcefef98946aa4a96bdc2548d6d1d7d9056740c6eae4cc815941b54c60c219c46dada44347b0cbbc0649470ca6c27f53f2da02c9305c483419a2208456d31713a36238a09e771bb528b3a766f39cc7676db14448d00d99ced6b7841fad2dc8bcfe257fb23e58de3449a73d734ec336d3374ada6f3889f74a771cfde53c30306f9af36940b8daaf8376e463beb083612ea604bee02f1d372f14645af70e4de1d0b7daacb928aef7576f0826ef963c99a962467f78eb3771f6cb9e0d5b239bab7f3527bc37b4f4d4845bf2737cae31be901875c9b40e815b17458bc573786b5edf3b9fbf05ebc9e509fad2e9c46e80e17e5ca0bd712276bc84a861ae8551e5ad7790dba34461a2746420d66a1267037edbeabcc8c79a34a51bf069b727b275ab77f2c0873c35493f6671763610b04c796546d40e57c1e22caaf6ef0229763104f0aa0114b4b7ce1c708747135f6b7b99134f2f07875fc168e54a5a44d7a5abb119f1fc5064304bcee5d09fc9665d4984fc81165334062c4d54f1716ea83c421873d79551ba85fba9a84761f791dcf289475e723d8bcaada2ab4fdb94a3ea741f108bc153bc3a7ed2d6e0538dfc50147c5e8c1f220b38dacc049c1a0c33ddf70afba03c19ddaea89aa93493eb00a4c73e5a4e5611e85e0fc69f0667019459784759170c3f64b25ec07d5d2fad91fe0103c6587d2f6b506d10d2cfe797534be91c1948bee6c4df9d76ba3a5756357e33be1c050c1e39e5fc9de7e872ada22f35862ee39b721daaa3df152e48e21c231ba06f7f0c1b1bdf41fe74d2185e9b52911c70ba4e22fdeb55ead4a91b054570fa37ceb28188dc7d06c9d8b6988a06384bb9c89b593388d1ac128e1040ba74e5ae7f42a2e5ab0d68195faf624e7caf1a6f9099fa22907486fd3fd63c2c2f155a2a2d4e3b8127758f5cb93f046ef3ecc21083d52256c40333e595740e6e8980745b5e518648867ada92f8f891794e6ae9e3395b53b19820759aa9bae2f6dd9610ed1117696400feb6570e24678da95d2fdaffa44134aebcc9d8bbaaa61ed8cec04e4e735921f154252a2df0ae6ab7ab4d235fbec5778015a7cfb9c56d8f5a2a3d270fae61371c4bb021a9c1f05be688d69f9cc2b066acaf9f09c862a3a11765e29a3827ed68e3a22f3705edb6ccb685e8e7dd043e435b8d6826e243b806557206951045eaa3f023a28b6356c72409e1a62eaaeab661100b5dfe43c0365aef1cec73a7f99e1898c79884367225740266f2f30c69a659c491cc06f9123e3825ff08ac828cc8dcdcddc852200e1fa39fc5b2d3d1e56b27d52bb4309f9908d9054f0d6d92f6df27d48a1f5d5ec66cdc3fa5d1a26295c1d6a11833d2c7a58544e3f573d12c0a7f8dbec4ef54913ea3e4f44cc91b0ca2816019dae2c8c43bffb77a9ce096124b01d166ade67e55ca95c7e2af114ab250239a2c826707de4e6f9886aa36d2faf6f02ad23cc020725c7804571dbec92819436aac0eeded6f1958d696106e00c0ce46e503b372bd6cb4b428fbca8dee6ed917a544414a95fcc2e37cf8446809f48d0917e8464e838a0b9d05bd135b17ca1c4bb095d17427f29287f314772847c57b0d52c6938cb9b497e5e98444059b2b60eaf0bd22ee3ba495aaa599f7639b11f8b165a43d1e26a66977fb32e2891c81edfcb9efde88f25d8ed50e3f9a03449589b417eaa8cd97bbc32a38e023d93bf3c6052fb83aa5f051397e103a6c0e7514075a26e18260e2eda495f062b03ac50dde56d302f09ce1bb906080e2258ef1bb31569732ca14a59131fc8171f0d3a3d488646bdc405f1431d5d85f5a94116213e7b07af97f3b8a4b73d202ce2eab732ba67fc4e4762dc652acc27cab330640e04d2fffba43d5ac769ffb23c76fba960a999ae0678f79b8cdd1256aeb0bce5f3616ad2556d6af9faadb30b6ff9246375860ef6bdbe65285e1ea58183e1f6468b7dc41851ab5688ea5eca0e35f249b30539791db4ea9105f402bdd5903671cb2507336fea525dedceb14611c7daaded32132a85b6ce822f4c1d1a0b9fcf49c50283a86dbda8a347ed8147dd34f361f5909c71b18be383eb0dd16ab2057d9948d2190617ca629e4e7a4dccf7de9264b064577f5fc7a2d015ae78fe9ee0061c44b2c6d58d84b805e1e3ff91adc25650f12ae28f672ea3704b07dcfa07208a45a1a1eb70c54ee7a54bd5029c5d15c5502d3c53950e3bd4f575ebd77cdddd73aeea97e8b9ac48820517a167949b57e9cbb9ea4bca7076094b4e3ad710f19570c309f2591b961e1c793e27f29f91a3dcfbb2d87bdd02774b51ba601a608c057d4c6888d3ca427b55f48f2014095c6ee775ee5bfb27159ba8fb6e90aa826681d2e87beab60d8e2e1feb4b4bb341f5b35bb9a6afb81ed0937ff97e3ae1b606500bb31e2070adf43f5d427ca4468ba875390d4b44baddd80cd2300d8310f2d9a4dfd1f3b5c286f6e2cacbb6112f1a62f309c498ff7ebf2cd843da3e00831d9569a612dd437712e008238ba0243d1f1bebb2ca7b27ef95f8616490c604c8aecfe47e09669c5c6c964f9b93635c5d6310d5b859884e925b452751fdc2cfb8fafd0f6bcfd56468251a07e85ede9ce7ac95aa8618978dc491e0dddff1d97ef1b4568a4239a06635e2320c21bae9d0232bc9e6fd3dd1cd7609b7196c083249ac6aeabeb31fd401ecf394fd2e304c01d019710a3fd5c8a7040b225ab88f3e2ffdf2a71ca4f7f0fdea8dc6b355af5400fc0b0eb9be11ff11df62d2ba260a14d7d72221546e82030a1a039121ddb8e4fbc7c04dd8a16878b7ff78b4dd9ec73b8ee994541ff417659f5e0483995d8cc05da49cbc1d77f9cb27f6283925cf0dcb3ad1a84b0ae039ca3f3551f0c6d4cfa73b13ce3fa63145918016e85ec46084c71a0f2aa6d65dd41d66f5c4c9adc1f9c372b9c72cf36b134ce6107eb36822500daa9e09f8870eee497e4dc4a40de770aa5c22af09aff9da2f8ba2df178c6726420f92dd7b77c92f5595b5f396c48d07015a07127e5328065acfe00ae2fa0bf679438b61948d132ed47c116fb5a011d0d5be380557ae993960b8190b54bab868d98f4dce6e9bd818c11c405377854887736fe9b7e133f21cabbeac7ebd1319a34f0742f9b3c42e14233de2312fc642e1d56460de6cb25c80507bced8c5c8f992a1e1f022b57611f2dc0583fe3d25ed3ea8ded8f7d9ee538e29b450270bbddecbda061b539b11ed555869376f12a4400ed63e778cbedb6bf6aad7b0fbd7ff4ff4b86216043501064d495f04324888fcc70690459967fcf3ce0f1cb1acd73019c498c8e56a519eeb7223b137708d27d92c319019198bfbd3a029cd1e89ecc1a5a7cd1734bde1f7c8c2991cda38a2d618a15c0a72a6098d83af4bd497599b25fd914d9946062424241834884ccd393cdd5ece1062ea27e3934b388f1990ab29f36929e03b2ef7e7ad8eef50538101f1c3d37ffcb1de869fe6bd110822268e2f70a00da5efd1d1f2c7dd030ae14df8b3c60e490a04e1f111b0a43f8c8dde7d7ab02d6f44e855bbd06651003d3f2f4e8926372a9464007c0b880e50212403d2cbe1c48b8629e165dfb5e935f134911f6c9b5ab0f608b4c9db5411a259cec59b1f72204fd7d752f5298904d6921c451108ceb509227863918d1927bb778614a650913969e6896da905a962e9c3debf6f78328bd7ba0a6bae03584f7f34d1b042cda252fbaf82f5c061252dd39054d4a9e195b1c842fde462bace45048e4dd717fc50e4e049652765583cb86ca9cdd3f702fcaab962dc30ad52d3cba43735a53ecf4a9c888ecb53bbb99ee9e44cec222bbb340d14d3f0897a3d00b87134abd1ffc6e38ed1236c9b18f5d6e8637f03d4de1ebfeaf3477354f1dc50e6e32d64ffbc43f1ea7651f44817aed3835b941c5ebf3b7f958998c14a64df050a2b05dd25f6cafdc2e389a4dac1c8bedaf275c086b09998e44dae889f6a774b3e927920ae865141e5493a72dbb384d85f24afb864e3abfeb8dc2154ad3191248acc386e03f6459cebea6def14e41cc66e7d346962fb591c1c05f4a198b36ba5708f05a1002f7e080fa4c2b058d1dfe816a4a5e7d0855989f742219888181730a13c73f6c77504c768d73bb2e125fdaa7724801caea4bba3a32a86fd4272ebab44fec1343c7fed6dfa44f3e2f8be85ca68539253092486c2eb4db64080cb7ac367b45743d3e3c5c2062017f9387de2c6281a96aa1204fcf7acd43e6da76eafb3b56606f93ccecf2999dca92ac453899c7260fb23ab8a0b1a64ddcd7c94294fcad863d72b57d9e01f6c809fe5fadc04a0e94651a223f8e9c416a9dd2bf1e12ca6af0be0cefe84c9945b0b4ee550d72bb273bb6ad98c343c4b7575117ae1dfa46764b43f6300444c06df223152dbc37ba6c99a9bea4b6c72b71df6e00e0261b587991b6fb8df5b210f25a49571b27411b0f5b7a972acdf16411da99080c8a60f5018e450a0002f102c1363d90539cfb4aa0d0d512824a8719175029bf6bad3d902cb5ff84181ead7c65b1cac056ed4bb2ec71a3b6c7bd2d1583f5b8eeb30ab96408dc9726075363fb2b33bf8185d6b188fe46b9b52bd63e47b72e7436cb168c11de9fab5e265d500ffdf1b0b5b21977096f474ff226d2521fb08e98524101b0478ccba93f62d496c10389b6c4cfa2b7ee340e3413306a3cdb8e80a9dab3384d4905372f93d734513a0df32b0aa8880be8cb3d1a50a6de597b4328aeee867455858e7603dfca9c52368678e9ca5747669aee92ef00623aee6abbfc1a6f4373c5726076cb0ec73e07646849e487d64af3a21f38cef22d544c662bd22d3782da8ce452241be9ec0f3688eabc05bb220e16a176f88dee49d71b2badfeb54d39e46b1165ba12460af39d490b245a9c156fd0c1594ea2cfe325c686f4d622655c19d2c415a185da89aa6fcbecefc9c8c006f9f0218de4a05de64bace117c1d1b69c7106b3ea5c43e16b201223fc33ec387b02ba1d99ad24f2ca41fc04068430f9607732a2f94fbd6b1b0dd445883b6bf27ed7f99c749f7663999dc58c06c420b27c4721bc2389b3ddaf0ff03cb00005f7545530f1ee0ab21b9259d3e56cd1334a341b26278c71af30578f861d14c83adcc4293bbb27fef44fdfa73b04c83fac4b2bea87c34d9c706734b7f8fb4101effaa4cffe36b00520a096239179d5570d28bb1a41c0cecc64b6081093475714e302a07532164b6959bddfc7e5818cfe50f3161b9b9c401ca4bd26596ff81e4b0b3b943cac593fc98b33b871c65f06a9169faa38a6dc010e7932940240067b14ef3a9fbdaf4c43374864a7885daefcff87b78c71af8741f98e0be12ddee0f3df9c7b4f24cdf577943344fc2c6104a86cfdc19e43ebfb0854408ed48e42867e5f50e8c7ea879d7a037a2e26d4d54e3ef5c1bb719633905a4eb282f25a89ed7947d948b0a970407ef2ae13ddda204e176211ea80add780fca791b1865e4035c05a72d8e63369c6707c992cb66af3ece036a15492f5bb1cbe551e3781d41bb5db05e659b3756c32ceb52f082ead139e16685184221072c4c2d84a75bdc284a7f17f9345ec9739b37fefd6d512dd8fae3886d99b698fd1e0d5cecae24983bb68d591a4621cf812940b4b72ab8bd9917eb5809cc42808df5488a7bb2fd7073f2dda58c808c8d2e6d0c3c79fe6a1f89c4f07c7bd03223f0feba1df50503f0dc11a915e25c8217898676f167a3d9fafe2a13369b3280ace96ac5c8d61a0e0bca7a499b2a07742b5683110f0f8d2c36458ba534704cc6a40fa9fbd7eda254c17f73d70a0297cb613c77969b82060c9761bd0118b229faee8e91d5374c018aebff6fd9e186f8e0811ae8b934cd1f46252c042b74617879b8a5a1ce376ca8835d049cfaa9150bc74322401561be6fb1248751a8941b05c7817d385e6e78fb4b4c9bf10630b6f2b1fad922451257ec22937b41277f27a699a619043d8d3d5b3ee9708f5f6ae9da1be6bea5bd87d796a35a73da7bebd6ba5a5cd2774e7edf5e36b25405ec3343baa28225cc20637c8cc722aaa579219033d61c3c938b2601e3194fcbe971bb395c40e254d271815dae9ba4116c6f1911d94f096ee1c59fa8cff3820c5aca2b9593599b25f0d72c7ad08447118fbeda624b8fed89ce3f36cdac2773515bd433a4d9ccbca2a57f08a7571b89cc59c58cf2f101a2e759fa9f33eccde671c42d3716084a747aaf371d7c89e2bd6b03c2068b26f1a7513345c20330f25840e9205462cd90c0b208cc8a9bab7a944125f556a65d7f51c2f5f5a90df78743c68663948e37aa28c5fba0238afa62cf7611f0350ea56c1671f03ed71c4035d4d638bd64cd6df2fed1010dee1dd56955b355de80aa729282118ea373d5bb516095aa42764da86d88cd315cce26aba553f219fd2bbe4ef2b4861a0fc358c6388b79398b444eae94b21b714d085fa9688d80a47049924c73239ba70108fee0b7d406df6ebc2e9ba5b572544db7d3410d5997eda339e8bebdb5cdebb1fb67fb848209d6302ea08a0e25724b49d2b2cdf850b31a347fba8adfa13b9c9d82ada179f7437a014dc8139c662720c23a61c9c532eeef5b6ffcd57ee26b60636206939e84583ad12441c5e79431e19a48c7be3dd2bccb2dba796f3f33a40ba8d9d77e73072acacd15bdd963443253a70c804fae09ad861ad6ef45587baf9735cef9e9a29b84d4617da8aa5d7970b928cb6671400cd7fd749058ed130d5d08c82ff0a48641df3ed4d8d6a192fdaeebace6836d25c680af971d774b20833bca2b128686ae944423cb36a9a66939061251689686e6b5d21995fa7b8791c767b6110a38a22e115ae83ce92de5eb0e794556cb44a9d8ed3992b738d78944160d3532cff014806e5600367f2a3c77603b9d16b9a193fb4ab83461097af770867bd76661b9395a93f9a41fcef28b2d241c5d003948820a163d769f300eab8abd16acd4f1b641aca047b94ff4207a8dcf1f20ed4c3ddca5bedef04a249cdce045f3edf09de909eaf870475803ca9d550a5d884890a8719f3c28bbd7bcdfdfa4875c6037477090cd5d8ca3b8f9b48719bf07e91e4fbe97d1e1d91911c17e91aadfbc0c5505c3fe00cf378fff60787ac727b42309639a2fd9ae26caae94abaafaac1e1b553ad32cc4be462fff56626d09c20bdbb2f67b052479b1edd779aefffc6b5b822f0cd5dc9a41d325dd5cdc2651c3f9448b5cc5dde5189f63cf5b98150323b8e95cad0c2db5dadac130b9dff4f10c97615df400406c62ae9626a4daadefafe0cc127dde412ae20a685eeb9d3916846942335e08aec08efba5178a68d4e7633e95caaf0c104c22f976fdc132357ee4b789e2a3d5572085dd05cb8a837da7b61e52bab88f8123df51dfa172c7a0cf23105df83779b98542e0dcf0742f5e459c9b2b44bec7eaa6ffcd81611dbb7dc5ce3dcd24902b4017d5acc3c90ced5b13b8020fcef064ba5f0fcec6479f928a6f1743737ab44a6d8b87c60328eb022ac8df9d4828761904c95c567365cc5c6217618ccaae99b790b3cadcd3c72b012dee0c268f46ab27b55def0374e5f1f16ff30a476d812ba42c9150e2687ab47a9ce0b2bece2db0711b861a1614907a66235957dbb192c6bda8dab25142b94a7c8d1faa475ef6fcdd578eeb736e74df115a72b11aeae649f7f79e31ad0ac6df39a0aaadbcc1c7fd7bf728a0e62297fd10681541f62dfc7aba5fdf3def65dfadf4bb1299bc9c9f289c4fb51753b2be5bf03e2829c5d47e0b2007ca4679c0b8a7c2859338232e1ab41c7162b7ae6d67d07ad1a60ded757ace1412e18cc52df71dd8678d6f54845e66bdeb9fc812da07c082411fd1e76e3ac9f433d641d0aa1207e1640571c19871e6a7ad07cb704151b556c1a3e8bd06b85dfcabedfc2ac9de6b6b60230057ce5ac18c4f43004a3b55735a5305227a9fc9558409e72809d4ad827e278ea0b81ba0d83b4765b0fbac9462cc8f03c6841a34b8fcc771336f54c564ef402127799814e676ac0543bfbde229e918146755f6e91db700017258481947f3559eceff2834141eac31dc9d805a2ef6dbc7811a59013ed683c99b62f4d43b3456e2ad8b9662926f833334a15397195235181370e6a64010b2e491b999bdfa51cb0c07e175c1ff61485e890ce1b9b61e98913618af10f3128a29dbdb66215b79e1753419391f5227c1de4e960cb99477c5663bded92e39573528cc92ca41aad2472c9d8abdb535fc9740b7f84e2895cf9f71f5ca9a6f55c2e8c71b682ed79c431481294eea94670a75e9ae664d264a90a19106054514108af285ed8b84d31781e2219ad00ab71b116fe6df79ea0fb1874fc42a3ca72c555e1def9d831de3c0443bae19c80acdd3cb60c52b2f260ea4dcb124090f9e1d1a44019f6a9259b2d7ae1b3915d322cdc27eb929232a2c15c576f89b14c8390630425ab9f7f228bf4d8ec5e68edc04f318eeb2caae522da51a85863943eb82780ae34509c65690dfdaaad5ab4a80bcc1d8d020c3af5a816f8187b91baa46bf8690ece7db431e351d031d1b3124daccfca358a99568ea01d8d84ee452770913737ea00b56b126d85db15910321abdaa6d7205d8b2e56a45a7d295cf28edf872dad7ee5ee5f9867b78f383986c9d22244e0330776c7509f313f1e329f7433797733aa1ff8991bb26bbc0ccb951210245116c9c93ae41b391d26a9f1c07f9ca51d3d97249f303b3c287922f44d6eadaba2d03821aceb9bce8f620f3f1a91bf8d5c5ff05352356e09990ef7ed16e135888319ca31f6d7c255fe3091f2c00cf1a4ed973fa3e393a442ed01144993fa1c361ca496f85a961fbb5335d308f5cc7de4e0e5e4ae160fe50e20ba47343005f1cf8cebd175c989b3d91b5f294a25050de3c79f0ce4c90f078df5cac14babc8b44d39a7f109b468a4ebbf045066b4ca651090720e85c4e23e79b8857f0d6292ef9de8e1a16a3dc52ea7099e83a279d94ce702c6d0052dab67e51168f16976276d83ba595cf697759c9d7d8d5076ea8dfdbb5bb1b1f954d9d11fb8afe2f68fb4aa725bc99e326de6d42b777a64f5781a9f27b4734b4dec1ee3a0c09ba163e0bac1e7a42d933ef34721a0099134c961dd4c24758c0657118c9defcc1e800e7bc3aa88bac9408fb0c5b4a27f54ea62d1191299bae53745484f2ffa6d51c8e0da4f230b7a9d260af2e6075e2969d1fccbb5446964531c56bf937613c04a0ef5d36bbd72cdb41bb1e836766d3287d58e1bd877eacdd2ea1e1b14a56ecd5d1de305e4b0e766dac49c6034f850836d92c7645514c0d182166d0bbfd85ddba9a50be9779ed4f3d0ed3229216cde7c2a37e72cca441a4e9b814ec337436283380ac62e9e70791d1487933c9a9406d8753614d9d91fe7ada16411f3bf2046563fe8596272026c052bb54a9571952fbc1465f3d6711953ec3","title":"347. 前 K 个高频元素","link":"https://leetcode-cn.com/problems/top-k-frequent-elements/","question_id":347,"issue_number":23},"21":{"day":21,"pres":["哈希表","两点间距离计算方法","排列组合基础知识"],"tags":["Math","哈希表"],"whys":null,"difficulty":"- 中等","description":"```\n给定平面上  n 对不同的点,“回旋镖” 是由点表示的元组  (i, j, k) ,其中  i  和  j  之间的距离和  i  和  k  之间的距离相等(需要考虑元组的顺序)。\n\n找到所有回旋镖的数量。你可以假设  n 最大为 500,所有点的坐标在闭区间 [-10000, 10000] 中。\n\n示例:\n\n\n输入:\n[[0,0],[1,0],[2,0]]\n\n输出:\n2\n\n解释:\n两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2790133385f074703f574c55731a5782802456def33e1703b4520385a146af371c9dda651bd4b838f921b4efb022fe70696a969bd1e10621cea0848e127122e97f8386ec039879bb2ac1eaa6be8c5725dc460bdfd86d69b4e2ba2331213a8e30c3ddea20999130a737789b6cc24cfe920a2a476d4d6e7ba675b941fb00ba68720bb06a27377ecdf2157bd0adf212407a041b68cbc92e5252228a9c10446a4cf3fd92221d7904a45a8b6e37891f7637ac15b57f009e7fa5c54768e86b742ebc73aa501b52bae57761ebbf2b521885dcdff95ce3cf32bf966303b8e7dbc491147734c7ffa24b004752a06a6e214cecf80fdda4e8f348ca3471187cdd3e195698a28e6da22efd0caa9db80debf16df82801acc46cc08cd247bc5e151bf02b6180c82a279ddf73ceac79ead64f887c9c166a879435305269abae66e9c5d0648eefcddbe0a0ec8a7ad046ecd47d3315d6e7affe06fd8615847027380f32c70a53b903a036df1a34795853d333b7f0318ffe61d5aa0a6ea6a65f2ea1717fbc7127da6f3851bca79b7dec665b876f302d7094eb3e7e1755b96e8fe77d7cbeb0ad7fa9d7e3b4d843b16458a729ca450cd2b6e677a0afa902c52f42f940692c06547654f0e58e974c4e4a30bb4553aaa7099c13e73b723bcb8d1cc30eaa25fe656f08cfc88cb699fceaacdb8eea60f4c861cac65f246b73b26def03876cfa75afd29747860790eb52ca9732c0a18e25bce5f129c2c7bae88ed792460b4892fec1bb7e5342300b3b8214ae80211b7222cd0121531e33d0f8c0aab9440d74597198734b3dad709b29231ace95d9142994961c3ffab7076dc9c9d8d2c584e111d2b9433daba4e9a4a5d5bbbc0a708b3448533f14190d4384ae7c9f8d330250ad4850fbcad44a3e2ee85b62e3239acafd7eded7a80ff53e77da4f0a14d6d2e296605d4e61ee1a7eb47b94c3fed901e3967609e6535db3459083e62f822777edfcaf7eaffbb270a7da59d45b71c7f3cfd261637795b52af64ac8b6d03e41c185dfe2fe11d23a66069674b4d8e8c47e5c55eed266b073cb992d3cbef1279365b19cc36e7a20c58388a557b8572cdda482894f109936b051c7a2c09a5ddb24d308f2169222ef8d3e2671825528eb10256ea7c292d8e49d9eaedeee77664db3e0de464502d830b6a290f697afa452f2066c32a476810b2d1c2b692b44b00af448d7f0c3a85b39712a378f0082876dcb790adc7a8c20e05aa6b62417bdb360270c8d9ad1033314faaac7c17cf4ad6c759ec6d78aee9884e83b4376e351e76782322cb4a8369793fa4acc253094d983d88d72fc2672f4585dd783c740ed8c75501fee9eafb19fa4f6bd8a462fa685f8d9937719a79577f7f4de8dd340ef107a8d87443bb6b57e9e881f96bdbc293a01be972520de945203f5b2c7c23312ad8d678639b465e91aa9524f1759fd5d3db99979865489c82e320ab56b72e56d1eedf03e518dde1e075d3efd90bbfbc55d02d878c2b7693cc38473c93e4a6e1747834ede9a13624c930bd59e9fb262d8e80ed6136ccfad8e138cefcb9149afd27e6e4f61cfe30ad95632ff2c066cc75c44893944622eafc4c45efa6368385417d09af9c350b5ae80494812c45cd83683a4af84e7f4fa3d1ad039350c004681974d69ba7c1570fbafc4b6f5be6f6916cfd2cb8fba4a1f34b9c59821719db9018820e9d5830448a151dce33fc14b72cd5bfceefff612812a96516b6ff9d75ce6ef426c43607548e2ae32b1519e624c4473dea1ff14ded833a127bf80ec6d7081867e698aea36aab5d82459b0244c36406f91d3d9f2131d3a7e213b762a2ffc7f11ea16bc4f141e4ca9fab3260c2c0c28c6dcaf2c720bafa09c62b47eaa202b34bbe7aca5eee5bc58acc7d966d705b270f63d9c2a79f6a685aebb8b4e4ac67b86ba8f4cb7ee804aa9eb525b9915a07b08e3533ce34ef085fe1642bf3f79f0bfd7b88006ea579c1d852e859f1c797414ab8bf9402a80844ee7118f630e922922971e04bfff3cb80e6f4e945e241da853698f27842e25c11b3120b98b1bdf8edca734a0345cd3dc32db079e14fae0cb5adbd14370056b50139bc8c61570296f7be9e7e98e040d9ae34f9a74754f2580b793e60fff9e146d52d33bd6c8290d32b1c2ec1cff77f10cf5b1bf60b4912dcd6f05ddaf2d2d97099dc619ed4857520704938f9b74b102e50a51ecfee3288df6a0b3a8f2e4cfe672b91c4b53ad549a17b43c927a797f193b6356afb2bd5a55cafeeb039899847e18934e1fb221700f7aa12bdd2c3b8349748a7b3ffa6d10bdc9fc104f4f282352a6b041a2d66c1992fe0704e25f8f2f49392b3d56a24dc1b227bdb79ddc4ef61eb3396e16c2719131e770ac2a43cc12346fafbc852dd622b1e8b38e7d8b2fa9df1d694fed51e121087815c22963cbfe2d2f96d4a8d45dc635cc8b3e11742d39a75bd3c372229a1b21dcc45787ae475a424c95b8be3f9d727ce1facd361800c9d04b7f78f245dd6893c3ebaa6508ac5f8e590aadf5037bbb1fe0e8e57e4307984d2ea95b1d5b5ce14592a8d9750e6db70613582b43372198cb4130f0d72e88d0d561d70c981af2dc7cee9316a34655adb8d997a50ad4a3cdaa642494b9a458a4fbb76ea0e9244daa01f04c64c4ff126163d0001cd026e0277b253556165e7cd36932426ea6ef74e2f485aea59a70ab95e2e5c1e74773addb9af9e533a54f510ea0575181051e50d3e9be0fc5a1714054b4edae6cbadd402a6299d420484bac631c86544b5c6a755e14fdc1f3ee75a9271ed88df8731d7651273623880c9ef9091fd5d3b9eb1e8c321f88f4f785cedcd51e2328f3e57b1a2aeaf629f429a75130bd0335505fd4d092cff336caee7ec238f2328475b61eb7707958290bcfb6bbeae0668a0387d831dbe1327d7804fa7b8cb64688490b0297058f7277e488cec525265f9ae3146d148f50818eb281dfaa6f7c3f19217ce7c7e390fd6e71c71f8b182bb7a4eca31d6e8da6dad49fa5828dc18c3c8f37c009d54fe2a53c58c5031a035900723ab1435ed1b9a4860443f64dc8f6029e27a822b46f09da0d2ca010f0f517617dfb186e495c95e8a41e9052ad0c7ff91bbd4ea47b5ea8476cb46e0cfff0c4b1db7c306bb20e1e97187707535a997496345a78d870364782c32eb8b39bca26b1b920d98b5b32777879990285c418c767d3ea33248b87c4fe412c32cde5435ca753a004228ed4fc81e2cd6b81fe8cf4f041d4195b93d7bff8c005e40b7e650f1011f9f63fce623b5c3183d725de542c6c8e4f1780cf494b1d61bc16f33946f7d96981223e156bed19427a160fe5aca900a98a5d47473b5c12439853f19d01c991616b18946e29ce32fdaee80a410d4a461adb9c47df9935e47118443dd200e3d22c495d5d8d091588f6bbb11b62f8854d7ca57f99caf77048280b20cfe907a0883d24e73245d48e5ad674d2f6a7a63b621e67f7b3188e5d1ba77d46232b2cccb369e35ae69d2d77aeccc2eeba9da65489a4b9fba5ffe9a0f6b44a0f8394293cdd172ae414b545c3c38defa43b52c58f5572e96f51f23368d3d81f59d901489f8ed6acdb155d45f79738a7426f1baae01eb87193b5d9bd67a9a99197eed9f2c3cdd2399ef2f2d4bac7b1d1a3ad865ce0e037873d0b67e1474295a45b940cd77538be20113c1d57ec405c32e98c9ea6561c68cdc0148008c4e903414ae7256c4d9a3d81668efd10eced5b53b4a8877139659bd4c7f25649a3c63ffa2260032c8d1ff1d659ba93bd01a5d40f7f0b504b226c19139910d86cc7bef69635b5009658c0e8aacef158180ba6f4316fbd84a0ec466eeb92d148e9eabb2b4cda6201435d6b78f49ae7e36d8f82cb0dea892b1bbcce96b4c97e353c0d5cdd1db5b6ce6ec4e42c7e535d5f487036c97fdab1c705a4b1dba9c20c64d2d83c52112e9b79f1086945858023cf9268b5fc752eb3ef49402e5be641e503528b194789d1fbee9a575a4ea3704e3e5d659ab26f42d660abd81bad7d7ebd85bdc005b3d56bb5d7064f6cb17219dbb327c49cecc628fe5f1a1477f91633ac938324ef71669933b57d4e6b878cf1a30953bd8e44eb6ac9eac9142b4e393790f6c3d8b2c32b4f33e6f454a498264af853c198d84c669f5660cab018a85c67b23c8bdb978d3f706b361ea6e88dc204ffe4718c399352faf6789b937845cc9fee1d1b541a627d5b79d1ee96a2b105a2bcec30c6d2fb81fab822603a5b51e22fe00c26c00ef79f1ceb8b594f0966be179a4320d688a6bf8052ed8365007d2a4dc15f68d8ae05a8c0872b2d74f062b7618829d669ae3721f4ce7688a55d1f74b427e60e0ae28eb7b8aefc131ad14e024b1c5d5e5d1e45d8e6930e843de9487c850b10d78175641b9efb2eb8ad8c6b948dabf5b6affcf93e1b230c482b10aae70b65e244b0f2284cc95762ffc1117b731a40035f11763c190ff4f9b5a9567563d4d2cce80cb83f2811873b8add07c13959e289f5e44a954e2d25fd4b4d8f3875567414c520af3d8821993cd30e9a15c8aad7b0bcf2af6f3010b2053f0a29f43e2e53cba6d7bb4fd005c139366a1edc827f063a5e24f295ed5f8cf6bf7cae52cbfca052742e0e3fe7f75a3e4ee5f0e33cea3e1da4a21035123abd595dba40669f4a73d551a9d55622916697ea79f856bc83dfbdd36353682fd2ae70cfac763281c24ea033dd4d05116f39ecdde0013f98fdd64d3492528aedbfdf3b8bd52c907cd437fe6997cc549448200d03a12964a3e356bcad2b40b7eb765e93f119310698627b0881051fdfa5b8fc9d13b0ff2ba753d32db92449880addd6d8d5334781b5c3d25a711cedaf301349fe861cf656ef9992fdafc74f7eb2eeb91542f0f2af85e86a308d99a8bb4fe8a996b894d0b5615fe406949d4b75b5e1947b3a6d063248cb233c791df9b24eff7ac5984b87a6e96f4f56a3d7485cb05d1ef79ed97861df1f35058b9ca565f97b3ddc750a6d364e440421467eb6d638b6940c399d444ccfdcc08adbbd33d2dc36433021946d5a5ee946bbb2c3e3619d12c7565fc678efb134a399d253e5e6d10676076f983305351d33753d68994c0aa03a9f453b0d02e8f0beb15a12276676923b2b1ad19b41aecc30c1f36645e76d384a197c1c7e4c644dccbbde5df116837412d820d3c5688bf0d7dcbfc90f1cf5ccd48345012ddeaeb1ab580cdeca7e4fb6171752ded65bf321ea4a71a0cec013f2672a7dcd6eccd06ae81fc8d8395ee8f485e0b0cee3537112f30982ecd590106846f3e54634c76682a2c7e8e1cec6a9c9906556451655d3648b8a0085625185cd565b0de30addd5b3adee0edfdf982274498f1feb6570ea4106e3b2be6698b0fb2b8f4b49dfebab0a8cd51c59d5cd4ee98d25005eb3a1c638203521241cddbf744ad0570bf21f22bbfbf46eb96cde55e55b5f8afd893a1abc914db1a6b222a43f5c1060f478ba8ad4e70af5170f7bb0291245a062756e47eafa3d9d36055cf9fdbdc89df4bc1816006711b80dcbfe343f4214cd7a1a2c6ecaf565953c81974f0c1adab058fe8cea75fe608a5a6d6c166c0084c92ac2b289e5d05346094df2e01e24c16745d4d736e4bda54169ac567d89babdd49a3f90857ba29d6c7ef0d941945ebe779f40dadbf66b124b360f3016842c87822761aa4b5522bc5560786fc616ffd9cbcaf2e06fc2ae1d9331e0c301732a96cef78079160e75109511a982c14d310f092a4255a4cb5e7c879e0cfac4f0582b6cdd11452aa8e834d5f6db0d541fbd38d610d004f4e5396edbf7e09f4c688783dbe9c05074aacab88b7cc93f1f17f1e7569fb4f3de17fc4a1663ff864055216f4bc0a2ce9d67fe5986827ac5162c463e94f492da254a5d745c387919bab769c6503dd2535bdc2031419f0d03345cb31504a083b3d0274d51682429502c5d09d0df7de9faf72f5b51f9f851810f47585483e7b6da891d804adff39654d47c1d60900f0f5455ae499943bc4373982e029c47c7da5d782f02c38e64cc61ca6627ad2e2dab2cca14c48910cd63463c78137c3b3d4cdf29ff6ca1158c7d785f33cb7c22b53204841487838e7a6754a088c7d280ae02af6aaac3f96e9a73d769a83367607ff8b09bcdcd1be11380911e865147b7e8659c5881a0be3327427af103210ebe2427b951f4a64af74519dd37ecc3322520a3c6d7a0a63b22eaa86ef963c99a962467b98eae775329f7b98bad3fa4eba9407bc37b4f4d4845bf277684b01bf40197769b40e815e07a08e94230dcf8e5b8b5caa04db4821f93f16ec619814159a1c60b9e46292d8118d503e1410533983541ff7712536808110322e4603162fcc0ef85cf2dab031feb0fb1727b7a70b77f2c0873c35493ed0245632b0b4d8996067a4be16d593edffc0aa43c9731551c118a114b4b7ce1c708746234ecaffc8465bde16227e951ce13f1ac1c3327c001e21fc806134bf5a05b1fd4d248fadb7abe532e7a0b7895d01b1904b1829a3d8b30624824e839eb8bf97612794d8061da21b458c3cf818407b5f4a86a3eb56bf108bc153b9e8ded2d6e0538dfc50115cdc7d0e93de7a6e988008ee3f5749124b1b25184ced4b8cbef924f22b8400f26f9b5b62602c0e3b637b8233e76169f8d6fe65a9eed6165ac47fff8909849a1105f2a82d9adf35f83406ffd697e34fdd485d9c5e2770a6246c080a5352317a97ab7817ad0ea8b59c8900d8928dc5cfa576cc448972b1f2e9067ba0407f207f45bee65350cbbe39165812bb5772e29dbcb5687406ac6070dc46505dce7375f08933ae2673b809c3de50742de1c65e72910607b6c60f016c33c69dc0045c70424","title":"447. 回旋镖的数量","link":"https://leetcode-cn.com/problems/number-of-boomerangs/","question_id":447,"issue_number":24},"22":{"day":22,"pres":["哈希表","双指针"],"tags":["双指针","滑动窗口","哈希表"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。\n\n示例 1:\n\n输入: \"abcabcbb\"\n输出: 3\n解释: 因为无重复字符的最长子串是 \"abc\",所以其长度为 3。\n\n示例 2:\n\n输入: \"bbbbb\"\n输出: 1\n解释: 因为无重复字符的最长子串是 \"b\",所以其长度为 1。\n示例 3:\n\n输入: \"pwwkew\"\n输出: 3\n解释: 因为无重复字符的最长子串是 \"wke\",所以其长度为 3。\n  请注意,你的答案必须是 子串 的长度,\"pwke\" 是一个子序列,不是子串。\n```","content":"096221cf5b628be1e73e8bcfe626c73476993342b3bd4c92620b7d4d2211716b1cbee358478886397179b73ea41f2d8a696e65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dbad039033bc36daaab0b98f4a36dd006fb2d63920250f70bfc585af7bc641282f43fdc733e4ba8a61e819b47341d1e2d7e38af5dba748b641fc04b55e75089947caa9e706624c22d1e48d141c0f134912c68c734a014ea5cf657c0012df8bfc375a3510f230af3d738b4c0813d472990e5dbc0fc0d12c27f0211f36ff07a335647dce8376289680642b17c29dcab917d1a142b7fd1126ffbdca88f70b0845e38dfa4b661b49c021774b31fdb57ac3d3b1e03bbf2b226263493f05509a878c6fb70fff308c9e9013e5c35ffb3b0dade66bcc93cf4f9a561718e1294ca5cb3c289ddc46cd9543eae0558949961366829a3c00507e92ac71f8c9d8678cf7efdddf84edb870d64ee8d6741d17d6d1affc3cfc833888542733303725bfe973a2da7de56546753a38e57becf8bb61268a56206fdf3560d294ad6a54b2772bd8583d99c1b7ff5769a9826930065105b69640427033b82bd6c6081b8ef3d259fdafd4d1a57ae400782729db540ec1bde470afa3b007c63375fb4a462f1f5e7868f920e8ba818af1f77dcf945b0a099c1ac7377e2bc28c09fecad037550728b2aeb39529bee6268dfb2c04d398854c9a9f4e6223f515804350dc6d93d0c848dea747451618bc8937f08969c6bbcbb9fd7a6f536e78e29886326b641339bf98391a73655124cb61a9e5623e1747e37e5f6e5d51c99b9db2de371c221d66ed2d7c60f761d7898371a61072457090c073369eea3e01a9e4afa1edeab222a0e663997ed2d9cf2850bf983270881f8deeaafaa8401896cc11940933e292a10ad405683b062759b566f8ec339b2fa9559bb7af63539775c3560936e8d1e8a66f7a4461d63f728e4196e3e2d70cd350b1a43ef6d266d82c476fad548fe890fe29e4eda4be1424505acb4470fcce1c4dd48c258dc277c9cfc35f0be77b0a11382a1babde390120c7ae267b501cd16c9d7231f440a294e43d3c5ca713d50b8c2cd9579470c6c4d9883819e92fd18f8fa46312b62c798d11764827e55ae8048864ac24fd3b3d8e92b91d5517f7d4c68770760d4768e4dbe98b91b481f1795903fff4c75dd50a41266a52f3a231ad11f20b4ddb234c8ec863432644bd36cb4bdcd4cd8d7cdcc785f01249ffa30c96729430f62421e772a8ba16fb2f3f63e24494f38e0cbd14ff8bc6fb451b1de7bac7d97d1f217f096b51e9bd5b1abb7be5542df7da2fefc1dd228f164fd5c4e892a2198c073ba260c71e1b932dffebf7a7983510400234618fa7ea0002ff10571c1c149c2150d850fbcc9831da60fccbf9c6547bfea40dc3a3551d1d756e3166e7a34c6cd8dafe8b332156cd3122afae7c68891facaf3ae2316d71ef6d9bae289a68a455bdd82c2a15bb4d7409fbba2ab90b3cf8ee765775724f177c9cf3f19c7886075f0e8a456be95cfa146c8ec559a8c7d8d981d14be527e7bd2cc633255dc56f04c7c4d234d396cbf115a99e117b191ec68679fb257aea405678a53a5ee267532a79bf86a753a6025b6a2a0dabe5f09d2693c6df51284cd9d7157e83ebfa99601bbb1f4699145c4724183b371f7e749985b8382b0e129808e96e4cd1da560535d48d9c9720c0163bf8ba64d73c66176becd435b3d0d077971701f25ae4ecff8730b37ac01d3875ba9772e9fd7c230c25673adaee7ff142df41433022e6fca81094a2b547f7361a19f8b571088a8a1152ea473b65e28c72a481f0d497084e173e91c3d3ead5b1b2bba51081e17c8d7ccdd4eed0762832ccd8a5f1c9533f4abc90e13f6b6aea61ff72bfc8a973053d70016d3cc93a614ef967a3719c11af34c9f83e2a5d012454ffcf03a3612d01dd3d13678f5c7b89f81acb08a2ce45c7aa47b97d4c3a849911f0ac577047071ebc7b9124920fd6545bc9b22e1e72130bd4960741d06dd667a35698e2ce70602eb5bf61f206220ff4746848b9116c89698a3439da552e66f0c749ebe2bee87bed710edbd4758042960ad5c8cd6bdbac133e51380415dc8cd87913672a3fe0aef4a40c5dd5aa01ce2775106ac5b88db169ffc2486d029c2fb29c7a037ef48ce609e70cbe6abfdecb4aa991799f3a40c6857f68c35ccf884bb8007d650769d2db9a34a843ef4750a9b0ef38dcdc87b3e1f2ef89b829a23e021df9548e3da93cdf4b79364b623753b2b5f35c4397a98410c4e78c2558f06f1eb1e4af88961c8918b6bd46e1d20a8addf06f73d990fc9cf8c4e184dd637eec786b9e9341364957e87cc22f707f6a225ae84284bfe37e077251f9319235fdf6840bc40ef434b0862f0a0b86b3a652216aa97be40c4a7614fb912fadb0153a46e91eae6b0f359f0ff6bd6c63eaa3101d13729863960b1fbe93a3f5ff1a82b7bd716a9ac0975519c479bc419fa1ab196e46a412b639a4bd5fe5b2c5285387fccf6cc07442b9c0e8a965ce0ce246ce85ccdf2976f259e02735ea98b01cc0b655c3859a9a67e95748589884da72a99097b7eff2bc2b0ccb873578ad4c4858e522e609de0b4eb5737da40e8ff2007d5d3a63bd426c5106a3bf133779d5690c43ff6b33b1b0628a378eab1e079e80b440dbf78727e07734a9e6b18c84916bc8a296d40b6db51b55414a3657b8e890aef58e68beb1313c7f417995328aaf855b87ef5dfed3c77e2f0a99023df885fc24edee28fadd85a7d55e58a6de9655ae9b1cbbecc6addbced347653773d86ee7bad886f862ded6f30d6609880c5a61cef165757c749517d7f41b0f274034094388beb25549efd0c97a3bfc748e74d8ca2d83caa0ff002e011333ba134af124dd4dd408e815913aa5a8e4e08352271b7552c64fb02f1de0397db3adafb962b35b5d9368fcc08d60ba0785a9433f0949a3a9ad6e25fbecd135ca1f5b333b6503abb9e9cfc1e90e4d41baf06e23828e62c2a32c4d38099fa95f001f701c3532200e22c358997a9364ab655fb2ba923b644e62552d0cee324ba6e59eec5a63992bf287628a61e12dea3a33ac4301c37beb926464168824070946fa9b8354cc7bde684757f42ca41defac39bc8d20da93f0d4a69d8bf1e9c32bdbe25cd9809580e445c042a1b2c035f4a58236552394a499ce2a7f6ec34a50aeb79dbe2da20588b148dd10f084bdee66dead6891c3a35d17caa06dbf22f5a6551266174d0fe70a3a1a4c55bd238f815d10640a50cd0b86999acce3993a5c9d841ab78ed2143c8d4c98c1e677848d5271490f128f72dd669b93760f8310dafd979f1690888b83da3e314bf03561a5cca5988689a1049c280cd22910fdcf823fedb67d9a3b06598d95cfdfaeba5359a11a15977ab289a9935dc65b11a18aecd515b9d33653552bbdad642988c725e9014d3edce4ca8d810a529d650687af29c581512e8e55d43f543e659b977c047251b44fb2997fe591e8f6cb476ab76cfd6903a8f86a546f2b1512628c432e7617600310376e098eda6901e3ed69d9e8b3255ae05506035160a3ff033acb71cc5e58d023ad1d108b8c6803688d8ed1be1ee0ab8c5253813f093032cf8e0ef53c86e9765fa3f69ef0f6c38899f35e1da532376b427e5f0a1800fbd143919c36fd66043abe6e1d3f3f9cd901b61d19e2702d5c4748a91a45648cba3223f45900f3a160807e87e94a2e52b34b55d30ce149dd27994efa821260ddc8bf2f97945ca6f48b0c62ff9f2960297312c137bb3674c0750f118f4742c29feac5f6b9b581ff5d8e54ab1951603b9c6fba60976e166f7b46cfccfc634f99bb1e154570e744c1545efc2c6316ed23ff336f6509f18d8f869a2730a2d09b1ebdc80a7be0c93b605437a598cafe44d2291a07810670ce85eea793f1eba7c327083b6ec30f381c254ec8f1711c6c56574b8c088b3ad8ce2fcf63e8e31b83b93102fbb67526a4f220ea6cc4de07dd92614d63795d9882dc57d70b310560d7e23e8a4eb86d638227fcddb79e777b8d7a77e8714eae8ad724b897a7ef349836050166d12e7d000da5176ff386dc8b6fb626b851da5d2b31bb0f340c869b1e13817ba904595d3e2f00333f83d1d2d1b6c3be8dca7c3ab66c4aded74cf3542351c49f6eb8d00f738415f8ae6dbd396bd7deb0af97aeab5d6270389f710ffb44d602be237ce37671bfad49553c9bb0fcd5fed193af267e0e4331db742d0bf745050a0a156db5aeefc8bb00bf29c9af1cb96c45cf6760bd88ceef77ce01848e714f1c1b49e53604a8eafdf7b54081b15057ee7b1f63afe2cb7e8875ba3bd256b44ce48a7c09c2006dc888b240ec7d92e6674e6532531cd4be4c99b4ef97e1e89996e2103a01d71d8431c2deaf21d76310b1fee21f30da3a160af112306d371a382f057119e3b9e8b8bc0b2fabc62afd01378def0ecc8f7e7bbde1b7c5cb97b35429bdd1ab62396712d2f1bb6a780170c955858cd730ad4f7dbe05a1f42a2a682cd565c6f9b277b4a41fdfbbd6bbaef20abc388d3fbb45ee13b5689a809efebca0ee217755ba4b361003f43e2e1acbe98df7448318f0692b785085da770331492ebcd0b626d889ef33fd52d7e1f0412e7d7f55a7b7701486455c2a804af69b056a8f8cd4ba2a9faf0099fe4dc4bc3b04d3da4562ca3facb71caa56f58396f3d33112266897a63ec6b6011881c24ee67c8f4d4f112677ecd28b4f78ddf598442eb8528aedbf927ad3aa3094618700be6496be76da0a78b7ea77aedc2d76f428874d4dbc2ffac84f6f91f4b530a7e3a449849716274f7c5cf90c1cf6328c37e93ba5dd32aff7dbd89b3383193f0567cab4e15060b3bd8d660cda43c628236b120a4f89d0002b11a2d7320b3d463dacc543c1d3ac6bfbcdf2c686d47aa0d97d8401189ba4597318787711ca9abb0ea5ba311dd074e6b226f2d7c12ce482f89ca62103e390c26f5d9e9792226d52b3ccdc0fe3bf0f358ba0339781fab1a1a3f2b08bf81a05d03617b0d745b0cb311552537b22ba4b1488eff5972ca8c5d671f15e2f1438ed59b94a85a601ab3433ea4a031690d4ecca8fabd8eb71ee9193c4b9bbe0dc459ccf74d81386d899876e6408379fba9ea0944bfebef95b7ba23f12871876f4c207beb1d0c3e5ae824e6c5bf4ad9ed41bee029cfa1db84900da1e154b7079678adb486c4356b79cea076b261bb6bb730de3c1f55386fd1f548f68f44dc9a32d6305975fcfe69a168b0443950b9f2a7afdaf0664582d31015094a9cdac4201133600c7aa80444fcce83ba3434e531a284a1b021014ea89f4920696304f54c2dd689c6218cbe2c0e91d1e650a6b1bae066f66207c5fb709abecb81cc1e80f6c1ef1565461ef4cfba5634b62bf1312a6fd571ab12022c18b8e1e2c7c81e5a88ae0ce4f6ce8b6598dcd60e88331021aec5d8a0dca5a95ae3d3b6f91f42707852e1e7b9e04f7dab1a515b2283c1d6adc0685c2b43cf0be9d1ba5f4a2b96606e614dbdbd0731536195e6646c398e6d2d652e6473dd7a8a1cc75e493c1f56533dd1af8193a86abb71f71a46c7702d22b9307aec116693b0bc380a00a650f2b323c60cd932072dfc9649c9f5c2f996c644b2e5189457ae2c59bc1c43ad9a867b29938179f9501c457f43dc910d39bcd7a1e5a2202210ed95beee46632f94b266df000727e72881eedbd9fcab1af108cfa1d8961f0d0187b25f5c8ec9a2d541d7a1b941c95cca40b55484c791626f1890d28d5d742ef89d00c723893150a2cefbc6ff5dcd34e1b4af36cd61d995ba9fe5f2b9da3e0824c789cec8abc811c17e59ff6963cde731717fb831aca9eeede07e73d3c49ff864055732a6cd0a49cfe7dfa58dceb73aa6e62142487e1c682254d56775c177d1e968d7fc60d6d991f48bf44653ae20d5b385cfa1d1f89febbc060190a0b0e34503c4640d78b61b1b8f97e1e46c5bc64890b5c00669891a4f0d237aa4a96bdc2548d6d1d7d9056740c6eae4c9848820600c2406c9414c999477c2936c5c82d9d79c36c7cdf3f2da02c9305c4831094725d1625393c517d66f559a638e95ac26e783c7c8f3938d2591ca81199dab9394654a793c9ec8eba5fb662bde1a60a9673842cb87872296be8f5d081845ea771cfde53c30306f9af36940bc4ecf8686f5b79fd4d7d0eaa6703b150c1892ef2530bf277a29652587aad8881e1bd1422f8cb67f06392b0bc2467f78eb3771f6cb9b1dbe276eabffa4951c37b1c081c4bed627a85b55ee152891fd301ba74b47244ac422b87f1b792fc84a01ff5cc58d6f920cf03ab4159a1c60b9e466568c74cde45fa760570d7790dba34461a2746420d66a1262d1d9a94abcc8c79a34a51bf069b727b7a70b733694e27c35f8eab5c0c49610b04c796543b05a62851708bcc20a43c9731551c11d73b614b7ce1c70874267dedbea8cc37b2a35c6eed568910e4a76f371be37dda51c9061041e8e05c05f5dd3d88c21c9d5324700b37bf86311806a2a0e078c8bbb2b6991ce6550002b3b7dfdb71989e7fcd0984b23c22ec754336a5ba0a874caa798fbd848de942664b31db0a9db984f29064f6291e6434da02741bec03ed042d941e48feb5cb285d9ab90f9785f71a270bcd895a2877fd436b043b169e80ba50f69abe65a134dd3a75275fc527d9e48c06325d34c01e84b438fa85f0d7","title":"3. 无重复字符的最长子串","link":"https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/","question_id":3,"issue_number":25},"23":{"day":23,"pres":["哈希表","双指针"],"tags":["字符串","双指针","哈希表"],"whys":null,"difficulty":"- 困难","description":"```\n给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。\n\n注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。\n\n示例 1:\n输入:\ns = \"barfoothefoobarman\",\nwords = [\"foo\",\"bar\"]\n输出:[0,9]\n解释:\n从索引 0 和 9 开始的子串分别是 \"barfoo\" 和 \"foobar\" 。\n输出的顺序不重要, [9,0] 也是有效答案。\n示例 2:\n\n输入:\ns = \"wordgoodgoodgoodbestword\",\nwords = [\"word\",\"good\",\"best\",\"word\"]\n输出:[]\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f20940a3d41ad5d0658542135666a2c91e14f5686b5347f768c3ea41f2d8a69a8d32eff401fc5a93ce974ffa5f124f52a696a9fd18cf0076dc1aa84d24d6d38e6718399b2438d21bb36daf5aaa28a1435c61d69f898212732066bafdfc9a977d94a64344cbec172ebff9c7cfb1eb31c3981eefd0c2c7312c244f438fa6ac67ff9e53cd8e0476da2a70034ad90995d621d760b27afe875237c64f8b34f117c17a7f4c87a073968ab33e8694df7132958b979f35552ce6ac873f9a3472c2f0cf01ab93a5153ce90672bb6a36b2f38cf9dc9b504e5a36b9fff0734f689d785ce04084bcf8eef5c641154cf15524835efbf57fe36075cfd0c4a65690cf2755b54f1d7b33812827ac25d71c719948843845039cb8e548fe4ea37c1765747c87ee67e0c732df4b75da8c14897916fd323a0530d9ecb4b183821a5cf0ef1b88848e56f325b2e487bd376b728e38d353d4858146a972bb5de1cd13118666a3f62e4cb3fc4dd25678ac0a5daaf7c3fb0eddd0c1ee729290858aaab5e39a0707ebd6d11db6a1097f69712c78d2c4ff333057a0782884c4f4732a70ad7d6121b9ffbd561cd4a62bbfe7db5604a6262c20e53f4efa774fdff868a55e48a7aa9cd2d3b7a7675f020c1a28c88ebf57fe59644262eb045b2321a51c1e540d6838112234377a5c2d9bd70c7d565ebcd4ab54f9a8c61998d634f3f48cb37cf5cda739fc9ed9a5804cea7f691477b75e5c4114a7678b8c26db0fec89aa5b2c1635e06a88dbd991d176a655209e46baeea8d907d06f40d0649db87bca3e124b6601a787d6e92755ed862d945898372a50136c5a3684e9fd0153ef9855e3f275a702302f32b2cbdca6d0c7916003c3753aab814f6ccaeb2ada8401896cc138bdcaf5aabf3448f3a40d9493a23d76bad6a89a0c1fa7cdfea8a0cd522b068d6081cde17462663414961d53970b95294e2d4d42ee553a5a232ebc665ed1383f57dd36521dfb369e6e78abed28fb6d11f83f40b5ad53bebeb95c3985c9668485b11e1984c0f67742ac44687d2ad40ae3e6999b92f6f91601ca3d3706e758799528509d619bef154f07839e984b08db8c46d70ae91e03ceb1b9d169a00742d7f4f8552905fbec8389e44fd8379145ec6d7d50854195af98ac5eaa7a2cee79dc72c520ffbf2af11380dca34cf888ef5ec6b73ba67cff0148c3cce29284a6f41640126ed5e814d0b447b97112603fc117afdbe329e639a8d0aa6a438974b118e3e9776e3800ea9a93cb4b0d380a2b889565843f9e771787f8ad9988ac514a0c94bbf72e380231db8870e9785cfa760bdfb1a91fec8ff2ecc959e6aedb26113c854c163f7e4db75ffc3acf0fcc7e0f24247ee9c573b11d1f63e3eb16f9eb6b193fd6d3a95e7af385f9ee708ae26fc3413756d2273eaac6f8e739a4b19f69ad9c01012a3b6428407bd6ad136aa5c5b1d60c25e04839c61ab57a4d12f0823b75a78e74d0decc01150a5f21e077e3cc689bacae992c66e0be4fca8a0abda445fad9d885350cad87347d992ee41d3309ad8b82ad1e100e00a6df4a98c1ca0e0fe984b99ea7d736865dbfe05f75032d7330966e05e64b5febde0eafee0b934fc0d1a212b47e1dbbbc004d0acdd1945778c629a7f88c03346cd1b833a8347a35f532f183b37d0d328e3aaec67206075a7ace97f41d21e0930b6400df92598c1283df9936ede14451866e0de07afd0e93605cee07590207a020ddc65925fe9f4f37258e625671f641f2f2f54a3d52fcc06c02e027d7c84fcde1af4a5bb47f228140eeeaf64158cc44c9503c9fee25228b873d5dc4945a4d3e6ee1b3d3db8f19b740925ff6726eb22bf4c012c438ad674f7d8b9f2df00ad8c791529cfff9d00ef5fef783a43fbeed91364e69969aed4e565c12fb548f43cb3367bcd978896bb55d509bd41e7df81d50956f435b1bd236ec3679c2e52f90e4de933808d7dd88645a2a10f7502420bd12fd92d93439c0053d3bc2c5a3c13941100e8ec65a5598c25a3352f0698f2a27e79c9628882977aedcc41e61fe67bb104d7e504d1c9ab466c8c2a4e7a70e1ed1e06df937c840f9a5a6a032c21f19e417b1f25cdf50d0d07b99989cdb251386b17b49a6f0ec779b1bce5ac457d6b6cfe5d07d2ebc723e85e20f6c7e6594904c77fd470d855197ed513528d6f452f1937d4a17ede0834b23adff1bc9da854087ffc45bf7fd88df6e327a333142a10604b5540088d7cbaa4d566f3149f02f31ecd79ffb88aa6a846fba00ec25c2069f77b0b7bf3d16dd1d13f8ced98f264b15be8a3194970a33c23fa6859be9df75a5e5b2c3f49635fd77a4eb15695b097cf76139961cbe0d4e1da6e825229ee53027246c8fa1efe39aa8e5871c67efc72ff591ab101652aabf2fb65d65ebbe8e4c12fcf7ca793582708b95a61f3f0f5c228a9e8701295a09683e7861995350b319a92b6c8fe23945b37e9af2f96e26c7d9e7b2092d8aac6796523d81dfb85277903d0c686201fddc3bd01eb31de1ec3b8aaa2b2089a03e9ce35670302f29f586f6bced8df378bea6e82daa4cdfc0fddb0940c0eab0296d4c38f848d855e75e5f65867e1147c1296098656fdbcde76a7fd6fa382cd207d74226d85796a7835a1be123559c2693248f5580cb1b15a8b2885a93b3f9fb4b246ebf3ad53e0b19fcabeaae3e39e1ea5bdc6b63c1c31e1df9eb9a2a02e95195f2a4b348fe04404171c49f76d8adcd87ec1a77abc8fcbf9b9ff5d91f27d40911b6767d01a15c68ba73150e6ac83ff3f58cf3a185cafc7f214ad80a1ba26a9beac554a42d7d8dbe4efe4a44eb4113ce4b33b4b192f867eb2e7446f1c28593415c0a6fa16538780fc057eda1dee5a97a025c0b49cb158306e4b25d94767bf44ed01890b997f9167fb8ab993a5067937300cf91ac62a4bbd3a3af185cbc07fdb137ad031d1a6c657f45a80f50b127a01bdc2d5564982e0b854f47730126f181acfe2c98c9be060284b3638c7b144fd478cf60238650ed1e356705b5150603f4a500ba205a12fc442c72d50d2eaa6583b660e161844841506cdf2fd8860c37687494dc5e132ec7aaf06ac4189f646be29039fc08b2696ce9fd93f3d0c9c45ec11dbf070cd3b824aa4a82cbb8e73b3d3b3d1fc9d94f6aa9657b8b25381c8939eb51c874bf199804c8abae87b01a248620c508b314dcc586288b69ca32fbf44acb230806893a0bbb874a1ee498cc1be1333fe9928c247e7a246513566682fed203a104c35ed62b189434423304acb078f9b95d2b0e17f059df948bc9fd04613df4597cdc77c928b1345410c068f0e9c349bdf3341c444ffd381ef2a8a9d879ec9416460ed3576abc7b0869bc4a601d27658d52309fdaf9065a58016ca271851c7c1aba6faba1e18f11a089768a9928bc412941f0ee4c3f1995bf19f6a5f2377bdfa2b7bcc942bf7441e7998a0e0909c0a42944f0687e2689d814c2e9e4efe15067b31ce927a4d6c51e75ccab363e5c2e6ba8e092da56ba66950f1ac381d216c15452d9d48603f43371c0d203d1da497285198be128b95ce3e70e01847535f30f6ab046284e60ef09e23defd402c9ca50797b7560d2c6352cfefd71d53b833cfbb8a0a2f8623bf2a06f3dc676e133551594f7e2d201df65e722542635f56194c7b0f950360a833f68dab6a8d9cf9f21553ab73e5d575a3f8e3c9b268caacec61447a67fd93ac17278766ed006f8fd39524a796dd13df55e77315cd7a6e9ee1186f25e83904d252044fdc8e6c41ef603f7313f01d913674c0750f11c60104859da59ebfe9fc81fa5d9552bb521e7a3b9c72e95edb205a626611d0d1eb0f01d7aa0f3f2c3fb20a955455fc3d7719a4ee4faea988b3dbdef4d4e727f5054a5cb02d0fbfd0e1ca216261294a05793bed7fee90b009e8a3705b2232620a2f22515f13116ec30f381c254ec8fe7e6ff08a9fc245bf0ef43b0b9847f76c078b6e69a0d4353da281c7fe20a36ccfde50928d6479262a5dffc3cb508c08245473b0a366864eea6d6e826bfcd6b7e23f30bb0923ba3800e986d742f9c32433c00f828d92a92bbbd29eca70d5ff68635877b41ce0738b6ddce7b61125340c869b1e13817bfb0f520f5a7b00793fc3fbc2ca9ce9ecc89e2968f86c079f8f57d94f772984d73592b06c648f56ceb327b4560fd0cab8e4cee581542e3a76cc2633e64cef13b96532b80771eff80b1975d8aad6d5fed193e6682a0e7c20c77a370498542617005235e6b9c9cff700be39d3b509f87156956422fac29ded77c264d6ca1d0a521252cf634ae7b8b9b2e705c5ce1d16be675c2be1bfc7f26fab62853c39f102ffa07c09c2006dc888b209a22992e26016127f5b1384ad0fc6f6bb9aa8bbcaedab496056854fd023e1f4af21d76310b1feb55779967f1602a3122c6d641429341a755af19ac2e3960b2fabc62afd01378def0eccc6382ff0ffa28ed5cca4132bbcd7e73d42612a96a1ab2d2d5c1fc01bc0ca9665e11b75e94af3b0262a7825d52788bcbb20dff74ba0eb99e8aeef0aef7dc871c016954ec71544031438021dc4217755ba4b361003f43e2e538de985bb4c964c876d2166009580321b391867eed8fe7592f6f23dfe5c8cb9a41b7032763baebe5a1486455c2a804af69b056a8f8cd4ba2a9fe30084bc53c0ae2460a9951662c13fbdac36aa56f583cbd9f93112266897a63ec6b65c32818b08e674c54d520c2634b9ddaf033d93b2cc0c26b15ba0edbfdf3b8bd57cd12f871dbe29d7e67ec50e73c6e776a4d8642def0f87014db72febc15418bbdeb530a7e3a44984974462486c4bf9771dc833ea60e926a58f74afaaf198db73a933350fa24e1975e6c96d0d0ba3a47c857898293c12208b1254006511661ded9ae5a3b4200ec6013ee05db51f6d59434efcf1f36d9fefc041e42416493f2711ca8f9601a99196925976dabb25ded50d931ccfab9fd5a0cf735fa9671cc3b516b3948d31749647e4fd511bebdc0bffdef8dfc48c6f5d0a7e132eea3a39b2d659a9ca383f53515dfc22076dab9fa8b847f8e1801cdd2f7c0d68927ad500afcd55837c44f9235b1b15d4a95be381908670b0cea79cd6a4838c70f59056b3589ea0c2a720342d5fc0a9e1e8aa138187832b4dca6019f44474660fff217e4a0e24d3b2afe88c012c4abf72d76be4c278fa4050bc2a6b1347330fb3bc30483c0fadf4b7160f6733d2e0614f7e4bb1594e52c19302f377ee5aac064f0f8f5ecfd0ad178a06429839932d40fcb30b667d0530067b97acd9a64ca187d4c5543c0beeef083a99622943368a818f513c4d51dbd9aab8f815d92909d551785998c64f0b4426ab550130066396631944ecf899518b4ba6f138bc9a2d0f79d6253d6a8110f9c319672acd36711c0dd6cf4c2619c08bb1332d4ba120717f6906dd64cebe5897df6ffbb8320232ed76bf03f14196a215387a8bf91f0c89290b77a623fbc6be60b959e6c799aa48a686f5b535e1969f29bff98db7662dc41ac5e4dc6b2b361949a0eb0c573062152be2209a","title":"30. 串联所有单词的子串","link":"https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words","question_id":30,"issue_number":26},"24":{"day":24,"pres":["哈希表","同余定理及简单推导","前缀和"],"tags":["前缀和","数组","Math","哈希表"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个正整数数组 nums,请你移除 最短 子数组(可以为 空),使得剩余元素的 和 能被 p 整除。 不允许 将整个数组都移除。\n\n请你返回你需要移除的最短子数组的长度,如果无法满足题目要求,返回 -1 。\n\n子数组 定义为原数组中连续的一组元素。\n\n\n\n示例 1:\n\n输入:nums = [3,1,4,2], p = 6\n输出:1\n解释:nums 中元素和为 10,不能被 p 整除。我们可以移除子数组 [4] ,剩余元素的和为 6 。\n示例 2:\n\n输入:nums = [6,3,5,2], p = 9\n输出:2\n解释:我们无法移除任何一个元素使得和被 9 整除,最优方案是移除子数组 [5,2] ,剩余元素为 [6,3],和为 9 。\n示例 3:\n\n输入:nums = [1,2,3], p = 3\n输出:0\n解释:和恰好为 6 ,已经能被 3 整除了。所以我们不需要移除任何元素。\n示例 4:\n\n输入:nums = [1,2,3], p = 7\n输出:-1\n解释:没有任何方案使得移除子数组后剩余元素的和被 7 整除。\n示例 5:\n\n输入:nums = [1000000000,1000000000,1000000000], p = 3\n输出:0\n\n\n提示:\n\n1 <= nums.length <= 105\n1 <= nums[i] <= 109\n1 <= p <= 109\n```","content":"096221cf5b628be1e73e8bcfe626c73474822a940a3d41a850084c70200762692294ec417e86b812b8bc283d9c3b20ab7f6e65ad9d3e03c1ae76b561bceff835f3316e60d5d7cfbc1931cda78598506c78e97c8d91ec1f8b39f421c7f1aabf845b2eca4463acd63e665b6d3ce9914d58bb5fa4c0bcba15478a36d8e122a75a2586bf4670440c074c1cd24b384df500b572730a9f7a273952cdf50378ee9bf20069760327844c48ebe50d6985cf64560026c186c92fb795e777df06336a8a4f2e1dd34a9b0c5e870ce7da2d18d3220525ff0e9a34484f0b6d9aa37dc0313b7f858cafec1997e06cee832f82f69dc686ea05cf34e6f9a75e32457aac606a2541c2ff0fda99e9c7640c446e4b04d5525267f2dbb137fd368d47b4d2c41f9488689d5335eb8d76a121a232aafa1920cd2464a60ce69f9ec651c1bc56eff8784c22a2780f80f246260ce6dafb6d9ab8d403d0e5a3a1eccbb3b41fb6738d946b536bdc84caf19912d032d630007b670f59e5eb04c7f434ae612f3f185dbb7cb3a9a221799b31467155d8dc5c51e9582ac05c62855355ebfaee60e2ec73448c6b312d469aea3a661640a06780fe794783bd8052a6e2f0bad67bbb4244617ed00557caefbe61fcdc968a0fbad8fd5a6fc389323c7f9250fcd0dfa346f57ff39778072f8446be390858e8d943d5aa8c3d3a4f70b6cde1ad71c1d864d6fb49b55d9aa475999565430346258043b2855accb1d3f9deb4c99bef73d402eb014ee68beae4c614b538007d4f2a6416f7ddc21d35685eb5debbff8a935d82c6d6147f1d18a15522f3f15ef4bc92a9d431350796be10bae436a9549d2c22f770d3b53840f89e40964b617458a0b6feb9ba8cb56ce6f5f9c96dd7ccf9cbc3fcdf0816d01c3c382b5c472709e19231d694a82969678d1bf7aca45e7e71d4c119e24e8acafd7eddd7810dd42e75dd750a3af2d0e582636f4560ca08b715f692cfc63a71f30cc99a5c435f6cc926a9ddf70c84a23579a47a9876479fdef08350baa3554bd9ed475bc20706bf53d2d285818dcf7e5005744a9c643831c26ae5716f3f76c8cc5bd8d0678c651704bfd0078c679737df8f5d80252385daa5eb0aa32d72e0caee9f3e4081682db5792d7b4f927b97418fe2729e9f4815e7e2884d0c3681acfed12a76441371200d0a082bf4dada24391abfaacf28b62918546e33695fe039998f1841e72da3c5c1a7de9f81d01a9b19cf9893b3d3684d2527f206a4b56de353e46eed8cfd7814c199a7fa132aa7b9622424d90207f96fe791fd1f7b02aee9e13b2a0225345169c87877f1996c9e4990e57d02a24c2e8f13f97b5f8097d8ec2a9e823837ae4add151fbb2bede51b4648b0bff7c5affb49314d0813cdffea83db4a9c4535e93fb0f53008d7a68fc481ba7a37a38879a6ae109eb0b13007088a8a243fd5964c0cf99ef6cc0d1dadb3618b1a9668f039ab6b551d60e45f39a89c61abb8e7d271510ed8c2d2371e2b9056925ca3c51f3a7135f9a0320c110e5ac921b5fcaab263529753fa82da0a03dd371e5cacfee2148000779afb444a6645800d01879cf37787a9b78924f3c3231f4217a9f75a99615f9e19512ff82d3ba0650c556ef2cdb33ad63a18373845ddf3baf11fd19dfd1545798d499f7f8ecff68c6116bd398303a35d7e36163817d6d4100ec3f8397953193a370cf1f5f8f05a0005d6a8b87296bec3ed7269c50c8892c0d75d0bb919c0aa26d15a63a118bdacbbbd0ac92b9a4d7b26f8ce32aded0f7c356c7d40f0b33fa22244f5ffff8f56333eaae4d8de3f70d4aa852f7becdd7ee76643b971266facb96db2dbe9c3974f41116bc09c96a9988e98a0aa26caa060d87ddbe1e0f93e5b69a086fbafa6116b25f4d2e26b253ea437ef7695cebc7d6c433a4d23fa41ceafc33c67897cd09152995c21cdeff2ad1e42d509b675e9e4a5ff7c565ece4133bef50a15bb430bc16b31c87d12287ed3d1c34a7b99e1c82d6f9b7b55bc1f841ea971aef07d1eaabafd4e10a3866fe81eae4a2eb2e782f087863a27d03aceb125b374b1f846dbbd75e243dab671f3a1c25109c7100d135dbd43f9cb1d0e5f850f12f3035c2a816363bf1566260740546820f7cda64551202c1749b7d31210a50883da94983d3f7e258b714b8ec5b358e9145bfd98b74d086fd017b16384ffa970f614569240a79a6368e4e506d17f4eac6d94e6dc0d0e5c137efe789d72d1b5294a6afc0e774d090c3451196cad0ed1b0b13dcc4917e23c45dbddf0acb3a5b3703e53a3c564108467197758a0b26182ae1fe78b989836a419b79644ede20a8ce23cdbe33705629ce6f2ee8fe06140e576498291403d96da5cd57ff1c9f6c7e9ca44816e2de256337f52cf319004f1f1a805ea1cf423866a979a0b948da85f116a9f7a22e2bdfef12fca61ee9adec9ed28940ca9e28d9d22fcbf7a70ea953212084f987499ccdf71037a3339a212cec23f16c8476f8b9a570a16d45a59031b4c4eaa26aaff1a2d5cdeaecf1e7789d4fb6df65fae3b722f31e9cd3cce4bc7bd685d93bf68ff24780ebac6905d80893da4b3dfc05091334f15f1a8a839aad5f18b858b885f71e5f57d67e83d4012b93c8d50ff79268f303d9b6be5fb6920545119aa131c406dde80515d719d0333319a6665eaaa2ceb25ccea3676e593f111fa93118324ecafa8e6b780a19166c39c90ef0a618d16584a5c39448a2d6b54b583bfca875c8af941748032a48e8f68a8ee52d2dfc6692f08960332c485f9272933f37f77c0eefa33118990c841d5d12ae882ebfeb0dab93b7c512bef2fbead674a43ebd8f9c8eff5aa41872636c899386f122eb64ebfc956a6e1855a2c12ccb0f11653878ef21e73e008ef5b8fa330edb9b3b554017e471ee84a49b848f70c8a149072914bf68d809cb22779033e0ffc0cc62857bc0e30f6b8f6c353f31378c630c480c657f358b5c80b386201b8d6d440598accb25dcc74321f571a0fffecdbb69bfc40286e203bdbb345d07a8ff52639522cd3f5507f7a7c5745224a7f04a037812dc85fca1049deedb654226a0d0d0d44853000c2df14020455d04dc8f6008a26ab26aa631bf40e028e11c1f8195c70f1366e8dca33ebac3d9260a40d6bc7199d79a8785fa56971b75c243a281e1b470280e7709275e7100d6a6630cc6ecd43590fb76f621ab992588aeefffd4efab444a9811a6f6bf71c8d43f1f03ed4fd604a390a8b687eab1e2b785d24d7a17bee42c8e61858656f07569669370131fa71ce186586d4a7d404cf108d8dc70828293a379d23f2561f2eebb511b7132607f6617d255649c2a934e12c985f428a844afe55227735f16f0b555c49f2e1c002d2f774062600114f6fd0d220585ffbe73b7241f15675922a97c1e36a1c341c3f37a9df4a82cd308e200e2f56c3719ef57419563dd0044fe3d1c5ee1222a0b20d0fa730011b3e0a5d7444388e913dc72cad26f23347f4a151d252d3fc8fa1004cf1e2b1d02fc22509c5206b4b7d12a9e8518832e1d982b36a93d58fd18fdb09b9f0251b6095ebfaabbc1e529bf95d26be431446fae86d9a9aaf99ff1a3b94bf0e07e23906c2572cc6ae4960ad6076d6d6def2843d2229ffc6609f0a192fcd9e22fa3183e4704ea8f2bff3ecdc87b9f3b18010f48bcb84c8cfc2ada4fadc6b919d303aa28d39aa461d0f039ce912b72a31e1670c574563ae087967bba5f4d354591ac4af688c7ebbfc483e7eb05b4a17c700df3a819b7fce81397bdfe3a32d89ac539af189006dffb8036a28b5bf4bf004bb7ecab2b5b50e9efc0d5428537b176e34239a13f668e9bc191147fc0df40ddb9ef7cc89032f69cbf55d3189fac0ff23df4491fb54e4e2982a6bf3620e495f5145304954e04fa18ce920ea94141a96f896f386edced4ca38cc532951070bfd84714b2c335b1c24266fbd9d81aa5b953848641c8fbb2ad338741f2e817bd409afa334833fee936488fd4f08baf3424c1e63e652e3ced4c17441e5bdf3a0c55505068a1fcef15d239a64eb2f8a70c36ed62aae91f2db7ea71ddeb265c1881b1a10b0139d6bb725ff5a1e4e2ac2441d1f66f83819ac9095ed40d169a536b57b5e689288f1b00e5eadbb44e357c7d3ced0b78df58b403f4a71725b66c8840342b82c47cfd67d8223387b84df3e88fa6169a548b1a169b8396b530575295d4a4491b7f5f062b7c924cf18f230f8b026b1eeefe80bdcf17c6f4a753b563823c79ccb82c45386e98403a7aeffe0948b433f3a083af349718a27c839f9b532e1b24040025fb12da44016d18b84918058dd8f7f2070154acd436fdaac1aa1f68b2b2740f85a8d6cb416d65b833a3fd9cf6cacab670971a90029571b88dfa7fcd0fa656bd3317c774124711e436086aea854d90e8c2d792fe876d0d7206571cbe551c5b2cb21aaebd6ead0f5dd9ab0962f3e7e240da8eb324620f72b1d8eec0e0a68b0be3a2e3a1f225e78b0b36f2d6481e4fde858361fceada7ff5ae8164448976bc2f977a62931828ca7b07c06a2acc946fdbf1ff4bbcaf2a1e05ae13498388318c308981a97eecabdfef6e06b2712b3611c1300f4fab5d04a6924912f14d70cfee48a962f48b1e39080b4069c9d34dab770e00252a88c801f57247037e8f97c14ec367600ea0ba0da0509c0c891a000b5e90a426d894a73d57692951362d53f7934aca7473a1f3a3b739dd48ed9533db2000ae3f43d798a7ee68f5e808d8ab3741565d5de15721b81882b94076e774b844d60ec17be25d92390107dc153d380073a9e29778ae340ad876c0ce367e587180adea6d87fe32c38e5431abfe2ac95dd2dd98a28c8fa5ee9e30322ef0d76dbcc9139a933faa8f40528097141e8d7cd255c8a698f6677367e4600c6826d6455aac638113b4073e5c6569faca122b5959788d5807ab4bd74992b1ad2ce28731b7b74115e7f5293607b533fbbb1453ba34f5fce26ced88189ff2417a9b02eb8990d7e1687949b30bbcf70791389c96223d56c057e47753b49651473c78f21d9c76b4392565885d7d79d9ae87795986b59362ba94a080af53fb8e7f2e0648b46c75745c66d90d676e6cbbd45d2ebd202705567982056701d33521357a36358b12cde42210a7095abdace17412b66769a6f230197d254d0b530dcee660bb22174060a6e5b2e576c5198f5d001af72ee205ad83ccec57a829c988ebfc14652a1ccc8c60b5431c5e3f2b95826deca7e4fff5943528c9308a77db85a6197ce8e08d8206b2dd10782842faf0edb86392aa6cd81f3bd92bb1f7b0cf42581cb92911f6e4aeeae016aba66eae394a08c8f96fc919864192e6e55ce798bdc46d7301c98d6501544f30cf7c5a8ada70ec3dfc8007c57c725ab7d70e34300a7a9d723c7bcb56e867f6392aafb0a91d5521cc48274a8d624234be3f7d82d293e102456dda3741a9f1e08e71c22a7ebee21fd28c558ff590ea9d7d21030bc914db1a6fe6dea785c4032f870a7d290b344b60f551ff36c1258a025303a6aedfd698e3d1519ecadbcd49ef3e12f1a332c45a059a89a606c395eb07301062885a7659d75cfc34f451ac7f519b0cdef16ad358a5b2e6f4d744d8ec730d9fdc8e2981d430953899f5f68a228109a8338a3f8f12e6b9a567d81b7f18b8f7b979e65a5a76b40aeff418457be7c9f51d3c0dc6b1202785b305bcb35adb5270ceb1f1d2cfa1969786fab51f29fcf98f4e973d4f61dc238beb87e1866f581a2ce2d1858345cc054b3ccc84c564e5924011aea9f1f35c9cd67edd8ab356125955c4c33a9f366b2b997464b18b62a9f45d018fdaa523cd7f7ab964561adc68abc811c17e59ff6df728a735a56a3bd1ad79eeede7abd437447b2cf0e5d216f4c99f0c99d38bb47dcf829a879281c1a83e18e91634f5c6f0e127309d6ae68d7573ac9165e953a2468ee0d103155f3407adbfeb3892e4d0a420e29502c5d0ddfdb73e1bea33a1647c6e42cc80b5c2a2f939aadf0891d8017bc97c2548d6d1d7d905626007cfb16d71b95175d8319359c0992975c333712df8730dc70d56c2ae43f37a07ed656dfa91094725d4b0f64163b3d26df73c533e25aa1213c7966a51378df58079404fd99e8787846f3a888ed9ab61eb46de5d6c914cf319b20af6c0b6031adfd90c6cb74e13d809101ae4c42f1ec79da5890ecb470695533b80c795de76b05a356a09169f0514ba63cabbd4f5829a390e3a0ef7576f0826ef9318ccec37629f786f2771a6cfbb1d0e234e3bfff4913d8514f4d4845e20d37cae31ba04fd35cd609a666b53849bb563ed7f0fafdbfd0ef4de9851682e726cf4dfe0c0aadc642d012296688188e64e15c0570d7790dba780954604603412ad2733d37ad94bbd7a679a34a51bf069b723d3522b777654627c554ddfe0017796145518ac55d1105a6285170d6e620a43c973114505df944064b77fcc746216b6695fbfc9965fca3312fb91e875de4b32b090ff6119a02c54d582e96ee0f4caf983581cb46fb1f5725466a88db5d1409add8a73d8676775713d211dd96843d166237cf289475e72389b2b3d37ab4b5ee2c4df20cf115a1152b978dbf683a506a91c5110eaabc94a06eb3dbe98348c0bd8d30d476f4f62ec98f84a482a1800c70f14d146db7a5ff2c18db84b861f96f6b334597c03c8f0ee5fd1c65b147f2e98bb263a1105f2ac397fef318d10e6bb26c62258e8bc8d19bad325f1c4bd1898f352317a933f9d57acfe69160df900dd566c123f74422bd2bc764d2a3268b07a6c2688131f348e5c4eeb1e1f201d82b3ac0a5e07c44934aedb07beb9d13b0118faa02124ee433eb2a1a8695fa37b78b6988a06384d6ddd9a9fa76890dc31ee6450bc51d0eece6222f3ff9e4d9fcafa476a284b2e3aa0982a2670b513bbbf17fceafad05f887d5f8af387d4ef19ba8fb61ff3485735d3c40144640333e595740e6e8de4817f1a4127ea72aacb81f8f8e1793a8c9e73a95ee1119820759aa9bae2f249f6106da1b76971c1ee17e7df31d30c68fc9a78ce04d171af6caad8ba5f829a38ee51b99f53dca700c2f1eedb45faaff72fa8778f7ec477101517cea9500bbbbcee69c70e7e65e65a0994f53d27340f0648d2ff6c1620c77f2d08b1d70c1b2cf97d5f50b16b41938cacc34e9de5ebb04d38a4bb765982ad3150a12cae19b1caacb8cae80a29a3093c6a2a273909df0804b8cb7692b63a0b9df5d1776a4c68b67793a53ae9853633b21bf1bc2ac86c7702622667eaadf2b87134e8920c3379d86358f8fdd2dfaeef3c0f3b0734eaa8556e95e6d704732b46613984240c58d889159c8ccd26002ee3406f5caedb46ececfe32e2c2b255e0e7909df213b2a57161a0a7f6e49c5a7e8f8f664f54913ea3e4f44ccc5ffce3c184dc9ed7f9040e3b561abd0500a76f5155f248a1c9811ab147e7ebf149f0c433babcd7d1157e4e6f9886aa36d2fe62902e06c8802487d93c50d3f89e4bdc5bb78a7d08a8fc78c8ea7696106e04d42b76e4d3b7b6ec5e90517c2efa1f4e6edcc734f6e14a90b837a7683841dcfdd62d8fc3fd46a8d76f4afc004b866e562f69be9084c23262b6c6f3a635972c1744cb08c667371cad8586a428d440656b2ab08a410cb2fb3c01624a2509676629b1f8b165a43d1b62532d633b36c7bc58605c7d5e5aa95e06b8cbf09edbee560221dc24934f3de9a29e928b8da5e71d6f4687921f5c4ef0b7352dbb446aec9fc2f0127e52b4c26132ed20a0a546248ac15c3f4286e6a4c9452e6434b2d2245f21bf81c692806a14a595a59c8435e5f7d781c860ff3c408fe000f26d0b0fc0418717b3e4ca79e88a9d9b7216121febfe466fe2ee96c062c8f692a8627c7b3742d4d7f86bea9e3780eba3180f76933f5f92fe5d5a60f63dddfc59e6915fbe2c1e5ee6120f87f6d6af9faadb35a3af537263a871bb0e5f16d2a5e07ad8698f8de32ca1991555dab15c7bf109e533ce931f6516c2b53b4e7802ff402bdd5903671965d42673ab81c5dac80e26c5187c78782143375afc7a4c26f064e305dde9d49834ecce73fd0e7b612b5d4448635f673f98dda3ffc9defcae750aa4cc34b288601860f1b0c843ecb066162ccb5d7926fb0265e7f5ac7e09615f363d4b4a6535207bba59ac384f54caf90aa9aa2c47f6ca870e98e2a60af3e4559dce86374f1589de8c13d841ee7b84b9b478d122a84086c7b1cbf473b84b435fe847089c963e9f19af2bbfe6b825e6be03594c912bacba4ea059f3d774253703ded44a48e0b964cf15d47c6051167716bdd8ff1b8e6e098d87b8b43254b4fc5324813d9487d5168ca8db417295dbb8f65485e333ae73cee1bd16a24b1cbbb32d0cefd26d21a13a86d46cd03b1b264fde27fdb28835bbdc9a7825f88d476e2395af5b24405428e61ad952c188acdd8cd008f6a76e2e4ce3549a71a05d749c0dc12945a1f52663e693391c0f28596e4ed52664e6680101d0075b10aee5a8c2ba5fb1cc814c5698e37c8bd8920c2c71b38f7f8b1b33e3166faa67b502a94e0776862a7e38bb336d4c6689ff0104fcdb9a6c3d6aaf33f23ab52dd74d2720d9c2c1c4b4b3e72dcd9014f88f8d8f0b33abe18004e69413a6592284b6a237306223633887262bd1a909a7bdefc67ddeab6703c50b3c8582c25882f26b3ac118a8fc3ba9054a37a537cb16ec67757511ccef4dcd69109330738d280fb560e2660aa8a6366fd6d1598606f7afdba9ed1b49a2ef8a832c6822f779c29938d77c0e47243d17c72a8daa0a560e59986d306cc2d0d232d0b4df23511ceb72b0e94034b5770e2090115075ecf1768ca0656bc8357cec910a1875280d16259a830e9f4b73ef04aa62f2bb0bb39bf5bfad48e7b2d554a5ed59c1cd66087db59368c37f73b25bcdcf4ca8a20238d31abc03a98dbc49fe9a80b83896ffa08706490a6dd5cd84904150616a09cd92881354e30979f639444c9030cca6caa49f0498ba0f00b836522481793df5b4ac92b649f80e492c0858d90d4ebaaee5d020156fcf30bfcf908fb754fac655b5fa927bb3f5ce26322996945309c9f962b3cf9c31af49a09cdb13e8f863ca96ad3b936ac4042160a9b03fa7e13be8b8c8175c51a1f67c63fdcfe6487fc80665a28aef6c6be49cbbc0ba16e0ab1d94e8922946acac173121a337f5d6c7114e9f4741bec9d12cc77aaf17bef6d5d011642419445f572c2f5fd3c121856bce6c241fd60988ba397c03590af9677fb931e606fda30c1d7d9a4d7b41fd6f5e2eacb6f185438501e7e272bf7d5b1638010f8699e39508eff71390087d07676483ab8d46920f2b761bfc857ab3481a95def9e75129ea36fc8049fad544d425dbace2e072d033a798f36f82408f821eac8ed26c647043b8f6d4989138234250dc2604c7912776714f706c75b4ff5169337079e1e355eabfc1dfc5376bd58e2d73daae221655f036984f204e711081f97776e0d04663d7addc2abfc70a7b65a9b5640a8aeb3858c518f23c36c662a2b6ae492624d5893da4cb8c57fcca72297c5fb435f93f2c9b7ccb49efbd96af1fed1455c5c7710981b0e786505511208fabbe347c71becfb8539fa3fdf70158f15b8fd0aa7f1880a42fe5a9cf9961f623955978925f617a9129bd77f0b0b59d8a61835202c1f52a6be66b913de00c24ce7f8246bb74cd427ab514c257ba4c3f5b88bec4039fe064e403936c0f545daac44eaadc1f281657727df981d99acab95aad25eb5a078a6954e4a8945c15eae14e5f2446c6b245642f12afc81dea457bea2a5649d39b71e918e259e8562f02ec144224163e0742d77611cc029b6f02bedf58561574cc299c72fd1a24d3c690a586251b446","title":"1590. 使数组和能被 P 整除","link":"https://leetcode.cn/problems/make-sum-divisible-by-p/","question_id":1694,"issue_number":27},"25":{"day":25,"pres":null,"tags":["双指针","链表"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个头结点为 head 的非空单链表,返回链表的中间结点。\n\n如果有两个中间结点,则返回第二个中间结点。\n\n \n\n示例 1:\n\n输入:[1,2,3,4,5]\n输出:此列表中的结点 3 (序列化形式:[3,4,5])\n返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。\n注意,我们返回了一个 ListNode 类型的对象 ans,这样:\nans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.\n示例 2:\n\n输入:[1,2,3,4,5,6]\n输出:此列表中的结点 4 (序列化形式:[4,5,6])\n由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。\n \n\n提示:\n\n给定链表的结点数介于 1 和 100 之间。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347d80258a04f436ab074f71275d3802341df1937624d5895e1a5521d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad2507633e07183d9ae0ad320b12083ebaaa2865c26820568a68f61435b443cea542d78f736adaecbac7434af8dd8da3da99d6e96d62f583473173341e42a892c9902de287f68e464484056aaa42a38acba9e5d673676282ea3cf61227e4ff48a671f7d07a9dfcd7a2314629f39e95c7af5333c528b68ff526ac862cc967701827b3b739c39cc5f7422b98b007282c9362672a093acfb2e95c8740d10a88130e7e6e6920551db4144612e0d2e27a4083f3f2c477dcb88afb3977f84a9cdd2c8493227659b85aa8212a53a4593fbc52f9867e73d97a1a2c874c29ae946a955191cc0c6cc6d4cf6b59fe87ccd8b68e8c07a887eb0104eb194151b534486af53c60d0882092b8794bbb68cd96bab29c38935376791f4f49b32b0d721ed3c024f6a2b53e9e324cbe83ca0672b330671b54cbca7801679830c436d5735491412c62e52c90a19b7330ad59abf5fb9b1640bf4635a7373ff8e1d154c5be509aa832068c7cea806e3ec8ce7c131eb4e213f62bb7d5fa1bc92129bfeeb2aa081f2dc7ae7c364732b0bca4e6c068b9bfc1adb81cd526b4e9913e72dcc8f515b885d025ca9a2fac5c094c9e511e1b33cf49d03aa3cf7b61edf8921182e23b50eae03f119f4ec4d41deadc39dfa9c567db01e3d8693a7bde0f52fe9e90641260b09eeb1c723f1e5977c6555382d378c33bd8f05237f22f20d0078db8573fcfbac7ef66f287323d24d2361aa1ec33644bf7d9bff0f2ba7b51d34c3b4216bc9dad1d1de99e025ecb66609aba9f66d79697408a4a16bbd4e5c12fa441b0ee3ad1bde8f9f2678528c0dcba28e7a7c51ce05f850f712a5a54a927e64801ac3de379288aeb586c4e318762e1ef657389a3ec0ee6451f8245991a83fdcf465d50b4c6b85b87629c3f23da76e380fd29efc9e118fe6571690a01f47e94a4aef4ecfc690ab041f9e9becabdd54d0645e52b968ee89d9b94976887c61678c6c141c9516d577f31ee2536e8d4af0fd19131e61d75bbdea770f254995b80f8677ae26775221c2574d0c985841b4916332ebfe894d0c203c015207badd8eb1e4f380b4b3b9b383ee7a5739f4f3f85efd184d3b425fe8ac31ad0635a22abc1ad5abeafa4332447d7cc6228af4bcec7fa59eb4b64a5597d634eb8434fa6280f205de4bfc39ac532acdef46a1f2be297552cde9b3e71e4603a5edd1b1e7c2bf83d8ae28dabc410cb07fe95515e1da0af9c1ef068e26621a4b449388184aab7bfb41b17232c575d38142531dce84ad8dbba5d38b895f05a6a1ced6be48f02d345e15b2541add78d0fdd4d2cc624913047d9db513b9aabc181c06a3b3271efd954f12f780cfc23e2caeaf518639bc4eebb38d76256a69a518bc384f238956b9fd222204b0627009fbf76a3c92be3e75da595447ad8df373769aee5ce556696238e58746f8336072df8d5ad94e58daa4ce48e33b042542ab304d00ec286de4a78003bd2471f012bc9e147c1610c7874cf0267bdb4c5b7a6688fce1734023769b86a67ea50678652e28abd2d09e1a94c8d140e0cb4a1b923dfbf79ffb506dfa2d08d20f3c021077490685b11ab4c2c028785d2cfd9867abf8441f3227798fa1fb1888c2211ff6886dd420531442d0de01991824a808e5ec798925783320dd7ba255fcc91cc2df59c0f557381c302e0affa16fbf41dc220f347e85acad08a7e3bd59fa755012ece8096b0c42ed9401c3fdd97b2ab3541d22271186879df27542361aa2b1b1b2aafe4c23e90d91a2b06d1fbd80f401515f394aaccaf67568d818f6bf0856a63bf7c1b22e6c43533d235f8e2d2d548867e331901ea81e94b76700400b342f858e51a4637f5ab9380567e15a3fd1a50a984daa8a73c7f349956a4729858344f0be30321d532bd93fd479b843990f71d2b22c1e225a14cdc1682f9f299321f104debfcc766067b0f17cfa077c4efa7d7413c01f2080629960228d1a336de6ce41f689edbc7bf07146d7d3318114fd5aaeccfe68ea9413371f694b1792ce9b3f1c683c2fe9a8a98e4a1c86fe0f80622d063180a2ecaa43ffc20e2c51c872859c3c422da082e50def23e35fb0fbe2519e912dcd6f5691e02868de5c9cc456aa5d333d5f5088a5d23ab828b74f50a9b7b66ad8dcd9ffe7a5ffa3f43b9354425dd37ea34efd74cd2f6a367a682743fad1d94e4684e2f7679c818d364bda365bf7747f6c1fef31f72c3b83493089726db72c1db7d1b93400166d3b1ae3b607b2d674139af44957805a9935602227635fe84bd4bb4bafcee3b201b25ba9136e16c2719131ae36ff6e459b0f346fa3f4fc79d63fb1a0f6cf39a12fa9df1d694fed12f927157d1e972a39b2802d6ed890a8921c9561c2c57b0f6f6513af129d9772699a0621ccdf578aef080e121edcb0ab3fc73077eae5cd704d45da8f6a7678a96ff76893c3ebaa6508ff13c10e0ab0f55037bd0eeeaeeb260a3098042ef5071d105cae1dc6b782110e3efb4944726b03770bb2c14bf5747ae8357210b81e8764f57a3789ffb3168982ce29b8979761924e6a7e34aca51c3957c769267410eead77df5cd97abef85134f6e98a21becf2b30e0735b64350b410f3baea7bbc5ba113cf4323d0a40531ea46ecaeab1e1a6182efa8a","title":"876. 链表的中间结点","link":"https://leetcode-cn.com/problems/middle-of-the-linked-list/","question_id":908,"issue_number":28},"26":{"day":26,"pres":null,"tags":["数组","双指针"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。\n\n不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。\n\n\n\n示例 1:\n\n给定数组 nums = [1,1,2],\n\n函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。\n\n你不需要考虑数组中超出新长度后面的元素。\n示例 2:\n\n给定 nums = [0,0,1,1,1,2,2,3,3,4],\n\n函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。\n\n你不需要考虑数组中超出新长度后面的元素。\n\n\n说明:\n\n为什么返回数值是整数,但输出的答案是数组呢?\n\n请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。\n\n你可以想象内部操作如下:\n\n// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝\nint len = removeDuplicates(nums);\n\n// 在函数里修改输入数组对于调用者是可见的。\n// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。\nfor (int i = 0; i < len; i++) {\n print(nums[i]);\n}\n```","content":"0961e884611df7d4ac47a79a9e3ba8a0cd85258ac19505fc764a3f4e55595c03568db42578eafe01350b925fe00844d77fca86064ca5cb38d746f23aa4faee7bbf7166609ec0c2fc0d268fa687d35e703aab6d949ba3009b39aa6adce2aea39b5c6fcb1c71b9922d2825026ce7d7dab2739b5726295ef6c433e6a09972f055ca1c1081ed386c0c3f7bcb2a832e9b19e3c4f9de23d6252c5acece2374da8af1035774092b6afeeb2f62692cac931a666d46f2f49e30067a018e5a8358379f2c7a2fbff811cbc50d0ceafe2c20d9ce9ab8397dbf631470af09c2eeeba001511badd2d9d9b37a64f427f3111cf5bbe06b7f85cf36e5e9a44617a8cb0bacf64406d5b770cfda82f0369313cdfb8b09bbb73cc5a6e926826ca222d9c38a4483ff08a43b67deda0b9e85a81caa3e4c03995046e58a175ae4fbc5cdab6de9e44a4c239255039cd7470f39239bc60efb978769d8a8dfb0b9a98bd7429521d6bf34074d9dd9dd953c97dc25cb31385868046de5ff30c6ce2ea0731f33065cba77a9af870976be2145764bd8e44a5ddd6c29c56263ab6755cafae06fd9ef5f528a42022d5abeef2478fadde439be83397dc6e88906dbe881ffd030f772221d4bb47f5ba1bc8512b0fde13d966444923e506966681406d57ea9abcc07839e4e8cef71ae2f8352bd232e56c3fa41eb8b8e10274074ac0abfb920bec0288ac611e94dd701b95610ec806a66b26fed2e8557ccbcfac6191fa2c1e8d83a51e37613e8cbabd4baf250b6f3df7800352f3c4854cda7d123a8c4c1d55008f26d80f2610f2a45f56d98ac8edb203f460e05efa5acd4f920e5ced8f47ec54f34a021c9c44263b9ce45229fca0502bae2a1aed6e69d3ba1e47f997f1d79a89becbc841c71b80b4b492017192c866b5cf94213f45a7426e13b83f2950a2160b564c131a70acde359dce1860ffd0e74e04ccdbf7e174de5067fc38e960f37c76efca6d8b07ef137c5a4548bf41293291330a436f3ff1d34fd43e79f88143b6057e55e70c3de1048e5800289c155f70a773f6cd1d10e3500c4428444ee85a1ed74a2e2bf7ecfcf58fedba359bc9ce03f0b9442b01cbc1a27d555b2a94d551c3d9e10e5f9661b3630d3fec40b2dec09230910941fd046cc7ddf5be2434798cbcb383453f28f9b8f30ce97a9e82315340a0bcfd8f3003616aba8d93c70d2dddea697ae9e51f0225fdc14cf45fee68dc6e0e1d0f571de068bc385ef678a9fb1ae8fd93419b95dff32fa779fe878c3a29b2f17bd74fea70dbc9adf221d1bc38ec7ee79163ed0b3eee5b8d4d2f0d4e47bffde2632e525f3007cc88067c582823de47745989ffef2ff11e97820e72ed778a92bc497c6492160db20402bf3f9d3e3d6674bf892b58ea814883350c167f7deacdd6feffce5dcc54b63f6b216c29170ff8ec66e2554e5814463d4e6122098e4ee8b4d09faf361e666a32e7488453e6f4f03d4106b8cf00e953ee8c8585035f60467b3162c8eba001bf9ed5f5c5456a086c99ee8d599748c085b3f65f3ee2ec37a1b7aa5c470b9195eb3f3da37893862525bfd455c668c16238da7d477a0b8b89221f3c7361d6b3ba7df709a45729c315e2dfd3e39a867017644ffd0a03bd722170c3946d5d2baf719dd87e5175a7e897dbd921eafaebe0871b07618916538586a4e0056b3d17b878cba1010092f86e745cf8b4a7188b49c1c023df35f49deb8f9824ad5136c1367f1de35bc170ebe03f6cf77be34793702de45bb5ffcd9f1527ae11d5fdbf5f7a5ed813616b0798718a4d096ec5451679f6d377aab73d4b8870a5be7da5f09d1e77fc6aca776510aa89bf186954d5b5976dcd3d3f5c7cdf7d5ff6a9be96dcc64cdc9a1ca6b0a27a98cc19c830f6bfc555a77cca4e511b636c8134a63b380dda086bd8f04cced8817dd64ea749174ad5f27c3e2d0a2f3fb5d07a340e8c78e10ded9fb08b4bc2e5cc970aac1c156c73fc96cfeaff3144c8a375ff8bee99a8323eb59bb268628be9c3e57b7abf0d6ca0f812d845ece12bd56c231594798a4eb5825ba47dffe941ab0ecc52290a5059252a5eb479dc8ce3e75dd756e1b2fc149b7a73254c921ca72f9690f36e20673397903770448db86c93f1329727bf9b5afc70c41d5e644803c751b338bf0c6f169ffc2486d52ce3bd6c8724d2bb9dfd001ca7ef63ba889f60af4bb07ce6c051800d3ae6ffb063ab1d7797e7b0404552f6ff2728d9d650fec2457b052442a7730782c0632e615b3cbaf519b4fbb6da422a5e1bcdc81dac04c5c3abcae0d130388716b0ad0881ddeb07881890f5da1e27c8bfe2bd9bd6b99a87ec89e493939ffec95bcb349e632ce251090f11202fb17ecd65af0c9f6e4e1cd65836316e06106747cecdc13b3f0cfb107d901f5369b6992a60bb58daa401668b95622f12d1537bb2788606db5294f28823faaf59c9c10f7bc7974eba2131b347898608c092ebb9e99fcfd37985832d1ae0e86e26c7d7de6af20271a4b88a2ba3f893136ffb3d02e4a438c8d092677e226b327cb95e5e0354fa575a45a09aef5c7e0719e604184549a811bc3ae54c1a99f9a50f95d7e6a357da22baa63017f0b786f8be16b5a83d74dc7949038b2688c13fcc36adfb636a96c55a7b8b9c7e45895eecdf12a71d9b2a70ad7c1af3a8af53a4ac14fb9090cc6f50f7a65cd7b0ee37fad35713e2628452f398436730d73f4ed7cf9c68999a48b72a193abe1cbfd093afee686caaa67bc4f5640fc4a7f872b1e59a2c3be0f89e4254004a5edb36caad16a2a6299d470080ee268078654615c6a22165db184f3e625bb7a28d8c3ad3e4e781d62254edc4497f90f1fffd3b9eb5798774393f3f4d6e7c997780974c4cf651d2eefcc2da354e71f3f974470043b9d83969fb67e94cc378c6c894f8463ef53ad457d32290b8bbff5e4871ff15395a563bfb532256959cd7bd5cd56a55b0d09d4549f0f31e488ce97603b449cad4d2c05925bd8e4b8d682bc45640448764dbdb4b7d8b220308228910e20add6d7e3572e85eef09cd3bdc0decbff2ad279be1db041aaaa543848dff7cfd3bbb581298687273b3e7a87a413d20f2a9075e526fe6ef3c338c1e543982e59de8e8579d7cb97eb332e1c9156fd1dc8e77fdc07df60e7e46de8dd73dac8a6d4edd495ede79e6792de1ad29cb882b904b322f1f5c91fdea681354fb55b7e0e0b91774dcc483bddf4cff77df60aebb841d610daeefcb827adee3a91d5f7133bd1e466c045e6fc150a70691757a3202a3a6635ed62ddc010103f15089f10c8c3c7dcbcb32a7c9de448f2da874672da5f9fd8ee3593df135b054053ad6ac979c8d6296bc4449292d1f359decfced08e042209ed347ebff9aee59b88fa519c3e15c81d0c80ddfb36eded579a3b0659ceda818cfaba1e18bd1a038a21feb883935dc65b5de4deec9915a4d3265f7f65e8e03752c4ba25a6011e6b81bb9bdffc20529d650687e2689d814c2e9e1cfe1e493e74b1c0344d3e14b447e0cb26b197b4f48e452de824e54318c2b8407e6521d096cf09b1c2e0d9e696f7c2a8aa3e9d227bb27a890f95803eb478cfc0b6c1a7385bc5805471d07ab444591ad8a26e65ad417ed5f6cff3841dfd80566ef471c6afa9cdad1cfb01a5e95d71a1d3b1f0cbdf5537671b15b43b3341","title":"26.删除排序数组中的重复项","link":"https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/","question_id":26,"issue_number":29},"27":{"day":27,"pres":null,"tags":["双指针","二分"],"whys":null,"difficulty":"- 简单","description":"给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。\n\n你可以假设数组中无重复元素。\n\n```\n示例 1:\n\n输入: [1,3,5,6], 5\n输出: 2\n示例 2:\n\n输入: [1,3,5,6], 2\n输出: 1\n示例 3:\n\n输入: [1,3,5,6], 7\n输出: 4\n示例 4:\n\n输入: [1,3,5,6], 0\n输出: 0\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f20910a3d438573096d622133746935bde07f4e89a717775081d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad24e7a36f67e8ed9a8028d31ab3183f7acbf844d2bc0070bdfd86d69b4e2ba2331213a8e30c3ddea20999130a73650996cde69f0ab0d2967654c5e7dad719f4df301b44274069f7e241b7bcfd82079f082f21c777422146bd8e02b4566ebf9906c114431a9c1f17b0105629a2aeb5f7df6042a598d7efe6060c555d1916a018f6b3672a21dcc46472cbb85007282ca013271bfa2aedd3c94fb4de0800f4b92a2a1c6f888b18d14374bf9ac8228b231331702abc84486928d9a53b94c7b7d0ecd7c5875c8dbb408fd26804a9bfac62b9e8860bf5112ed60e606226746865d160ecec6cc200c7330f4b569afcc608472d74c22a0790f8df5a48297e51fa271c2c8da4162456814bb8288d57ba0c46010f39a1bdaffade83dfeb712896b0dd1855776999534b9ad2cc719177d5852ce3eb2cfdd102ee60e240847b3a74934a07066b2772bd8773594febb1ae1852c7ecb31287807a38840425d31893fd6e32f1bb9fbd041c8a5e8e1a269df017c3127ed7e0edd99e470afa0bc08c7376dfd5a6f2c25557771e822d7998287e1f551d59779032e9164be2b3f5ac7e742fb9e8f3e13437785c5e68c7ee4c865f5e54ba05a9a91709a9d5f48216fc906c051c34493efe2947117c3a2d09e446eb12f268493abbbdcf8ca5f97e0d2efb08a3f574bcc98ddeb37402d4a0754d00ccad02a7c0d02a76e35275f3bb69af8c9ea7e6a1d7ac177a9a4b21b1edc1345ae4f536190c616ce44259fd43ede0c09771861233da87203f599783bb1f3b1bfdf86b2b4049e4a782a141c2364a51bae3b39fb7e6326ed135d6a6adfb5f97cd46ee04e860573f8d0e0bb0cee0daa78c7e769f68d9bb80dddfabe78b87f9d4594cae10ab60c870117fb5641b5289083e0155aa9d4555bf1fc222c3815096a5ace6ab54d42ffd283d70ccea36a49cfa98da7565dd899b4938900ce00d3945ea31f528fb9445cdd3021893dead2b3f9ac00fc0aab6a8583f36ebdbb4247d68f2fcb7e6540258fa459128d2d798b1176622ce669e5079c7cad2bc93a1a8a94902e5515dcd6f78b71420e617046483a4456ff9a99255e64b6c68602de9cdcd2a7d02c70f5f23156dd2ee744cbff8dcccce5e4d793768e4c5f0bed48909ca995a5e3fc822b967f8130c30322d476aea73757e49a496789647d45b4eb92172f5c0b9b8cc4291c15263a1d22345169f53c35a0c136ac0b90bd334aef0c0847d90becbf5f0c4d56619e4abff228bf77d2cf44ba5f00ddfad865216a48377d4969188adc6f76385f5b857b96963dfc39773040fd603a50484ab8f33160ef4b5fad7e6d75b59fce767ab2e31c06dda16b0856048bbc6a34a807f747fe25a226edcad8c54798f0025fc154b82056b9d0c426909c239fe2672fb6d878389dcbbce14f4767731c1d1afe0bc4e76324c28757fd3f485cd2ab6cdb687215316fa48b074997a46e46795c8f1f3b8f9bed78a0b7b4af0b1d72b5db1915f98874cb2573f7427348a3007a3dfec183e2794907d66eaa18250649dac9badc3bd3bde6157a5c50dd1bd73c7a3a3ae7f43cb183d039370e0a79abb91677b124c2dc1e755a3d100807f5d11642185a28b8c8b00dc598217ca79702ae0d2070748aa702cc5e02f25adab40da16b2e2a6ba670fc2af7a3a94f16bd043b9ffb8cf8ddd6712df8059d44eceaf2826e3b199e3b6e58d22dc2deda0b25bbcb0178ea970accf4f34e2a897f1d22241d94a29cc547463a044c0025772aa6183c8248b62a5c1738f9ebc8640f667216a6a4a5451707cdfc9005e36ffe7b1340f9def3fecabff972c8afd51b8524d314c84cfb0711a5ade2c5a8f81263bf21b6dfc54dfb92a818d3fb083dba7ec777629d5f628f5999c6e74a15964a20edd18688ec52e611ed19fb579afd4c6cc6d8d79c941423e9db76ae7683c6c11e48448b88ea623fb97dd6f19007b0ecc22faa8609946ca7cb6591fffa3e6ed574501e2ecc6db7a73255ca0dc04bf66a0636e53a6bd59fe2e19de8576927f0c69645512f061e4a97d11136bb09bccc96a0203d5e2087674f81da9659d20453e6afb7543663d710b3758a330f178e2e0bea56d6c2670bbbf7429a6e07df46c7bbce97c00b021b8d71c717d3cd704f2583021a3c236e67454e218b7c92a0d961fff93dd23df91c717e4d733355faf4fc5e088de2e70ed19b8535178a1700af323f2b1af16cd45133cb1d209c6777f56a14b6cfb11b061625791aa8bd08ea9e6914d5f91c58a156982c4f24272b1aa1108fb662a2d4e3931cf91dbc7c2a5f967ed468c47cee307880666320accfbc479e61d6aff4f818f96ceb967c2e268e70cc0433462bdb2120adae635ec597e59813875db8c06b3c282f75b866d1d01e31ce4756be9415abdb0b3371138886a30ef07b34d8d4c9114277d09e0d2435c61ce120c68a94e70a49d50d832a13e7a0706dba17f1a3ec373f5df1674c966e7e0008ea19c79bc5335f0adb75035542265a6e8d9b1420e5876fdf93986ed603a422a5cb4eb9f246c41e19c4dbc9d0c87998e08fe30563fd93803bc5dfe26ed1cc6576fe23e26e00e7a0564652f23440fd7ff062642d2c4022537bea04230b32d1da7af4f7b9ba9a825fb0bb9ceddbc76a46b9c9b6edae5f861354099e56669a3a0417b4fef44197d83a1438c0f9e91ec9970d6330f19a707654b32303f53206497d390c4684918b8961ee1357b9ca892a7c223d537f4ef97ac6ac3d569e94d08e6f991b38cdabd0e0f9d0ea666321a3b7411c1acbfb36d863be080df3363f7e4c8ccfafc4f23cf58141c115f139d769d977ad5763511b71e1aef7c7872ad342f0be31d7d2447f004eb76cbc803cbd301456813dd2167d8cc5bf8c4a267bdda22a3004e823b1a6cab2bdfe2e5355401f298189a182a53860cb22c8232cd99a8cb3610aa7fca396f39ff9d7b1fb0bc86ea726b74ceca972301fc4f58580f8a3e860e88e18304465b88e29cd262daf35d317d73fe6f10d90f373ba3e17b9d9895dce8dc4805b404ffa32ba4aa4861c8640bb01ab880e89c81d8988a6eaf2a5cad5ce8669ffd63e94a2b080be3cad62a6b684538adff95f4096423e0734ec015df30e088eb6dc9e34994381f500c66d9583b6c970c18d5bcafe942827ec806f8764ff8f06365148156a99676d7d167ea109aea94379713748e650d18bbdabd6ea7f23f7b20bbfa8cb0539e34194f3b26ca8954012086d73f64ff84dccb35020d629f1e7829a3d9995a29afb140b7dd2395e98c1f0f6ffcaab3aa1020bf2282cb1849f44bd942ff02e7714d783fbeb8ce36f0ae8494a8448a6fdcaf91285490aabb188f846cdb75f081558eaea0b4df19248f1424050b889f5e2e56b08f21673d78b21cac80f46f41ebc62326720edb278085666d005f2c135a68b8face74040bb49ae0c02ef9c0b1d03487f4818b86236670e121b1c2a2261f4ef6041e9ac0bd8d7dd57398f1c6f493c04c2a86151a2ec23b5c927dbca38329d96248d905d07184c66d3f7f14018af7ddcc2ca656dec6bcc234596b3147a02583538185a07154ac85656332e1d3e107b4a4b16bf3349f7579eecab48bbbdc6de3f18e31dc6fb708acff98ea202e7becf555b7b0397f5ff151fc764c8126bdcc6c91faaaa9a36d076fa4a07bb0a29c48851386cac5e728f583521c78d5f1bfe09683c4a826dd66c19991c5c788b100a8bb8b0f5b7b5ebc8dc14e118d93c70554a9008dd5bd739132c7430d5c1bd760fe8e75171063aa80da84624b1562163a69f37cefabad49b88b799956bb64f2f15df6466fab0503985caaccbecf183a90dab64035eb62056ecbbdc9cf8e5a2d48b0c647726ae555555492da2b63d52ce8e929e4af334d61b6fc755fc341797452c9dcf112988d3e3a84db0018db264b792620776742fb8a5dc5eae1e653422d5ea1ee524fa2e23f422b8a1d9c00418d63d35901f0dc7c3806cf3da172dff3afad8bf9f31acabfba06ee9df3f427547963ce3318263a1fce12d5f476590f25476933893481b2a7745534a48b4b790b4dc8b95daca672bb57516ddc22690667112cea55adab6031ffa01f2a87eb1510c8ed58a99adacfb47472702851f1ac518f53285274baa413885ad490b0794db9bcca7abf490314344403dfc693219f6590b20351b41b593d1f3aa179315909b23db5c508f6d6795c1f4ac0dd851c9f43c3d507200b22a33f5e0a8f1f477898d567ce8241159a2f38e5ed048ed55c96a8664b7cd26648b6c0ea2c3c87ed861d6dc7e066e195a0795b322dffa88c2b89cd3c9a779326c9070ce47b2b3f648840a5ec3aef13021da0e041bf0503f042d7b220f15594b87ea81aac14255dcb46487746fc59643ba954936d3f8b392c1c0b2080aa6ffc058545c26b5bdca0d1d1c0ae638cce0b45ae5366ecc53e2bf407c2b61a760cbe4db2d9cba03faa9faaff7817ea428a63ba904f835b101ece0f7eed1f9b9661921f11e584a40e6505a3e9f84dfde5cbf2ffa6a0d4f1788ab3d0466225cf78e9a11cfe2d118c31ea08f99404e304235e3d0694df7080864e900b9d26c7af9e8a6cf44f89149edad68c889253fe48c4f14a649a9e853c400b7e48faaba7b5d6f11dafe76bfa40f7beda124ae059c3f19526d2fbccdec391c9fe7c0126df13b9c84f29b62f1ad379843e477e468a0a22bee3c78ace420b8866e6d9d33ee4820ed42b1ac1d29f29eef71d0a7f130f3cf635d647109c66556de22e223a049ece663e8adb682f27ad4507d620183cec40308ea84c5054dc807a26a316e6e4906e0c669627fc4f467290c6638d5c16efac6b357c2bc9484e3be2cb8964ac96815a9a83012752d367615636f8c7d7c125f94e2255f885730b8329eaee1ad8d0a1daec36998a901537585cab0066040a40940d8e47810ce573017080e5d1230681a96cc1387ef7e7ca97d5bebc7d1dbb6bf5791b86e007572e406023cc3349e9df9e738af00974b49d55ff3933f8c82ff72e1e3df125a06479b2c007f471f543c6daa217be26c85497c374287e2fed21875412c7e8d527023d3c759bef846bfac7561f95b0c2021620e76556e4af1feb958da10bd573c905194a833eeb9bd89fdda7d508481d288604666c3ecb2d93b4997a33435b2230e3cfbf5439a75bd1328c7d7d06984782768b975e6c63df70cd99d5021cfedaaf48ceb93015d0af101b7f8f4d51f443ca6a16f3dc624a189c2e3c1fddaf69cf63a0f08250cba2ec485268d1b4ba2ca6b082dae719781cfe1b577bbad982f2f12b80df76d51e6140afdeaf7048590bb45990f04a6fbd140fd9c703af9d86691e37d347da6a1bc50353478533c91e03f74c95c22bf1545bdf1f36dff6c951189255cef9eb84a4acbff5df0d1ab77d572085e11af2fbdc883c70dc90a246c897e7810cb41556d4eeafe2eb10c27409dce93d8bdd49a3036190a448626c9e009256e17c90459161bd8832fd15bcdc10d4770888f19c59be471a86cad442c75072a4090c403e4afa4c8f94c307e66b3f42871f7595dcecd49b1e1a26c28a14a5282a0b8e9800194b162878b4f5edc8628ca25f63f8d05b082cf0159314e6554549629fbeb6e08bc221c4fad387c4570bf53dbdef3a9dbbf43f4944ff87cf1dc25207fa6c3b1a76477115d16af339f9fa52369446063151ce0ac3826c68f7ee4c4cb2a4d30aa16453b83d2629d91ca177200bc25920f9845b9996627b7948a8f3510e994fcdbf7085380f1a09d15932a331ceca61b96d6a39a70895e502a9596392d1d7869f28694d950c942dee5738b7e6e4c2181fcaf894c4e79732508521fb7b76ddb5514f74c12841c297f8a7f2b7c24880111ac8cfff83c5459001d401943142ad7c91ad7a1b66b325beba65ec94155545ae9e2e5e0f80fd81aefaf961cf4204531e1446d166abd2dd0748e3b44ee6049c62ab3a355543200d8b913fa608b145db9494ac676d215aed553d90011556e576a391a7fac30ec77a033981b22521bf57041c67117ad19b190e05e670789adb5e98cf0039862f7c98706882b812aa51f370978c3b4a3c5f267dd3cb6973fa06948bae27adf7ad6f5ab7d347b7cd7041f0ee5530fbf46c7997fc46e06ef12c1fd041a3bb687bfc7892f37e0e83c8373a7ccd4437eaee7f938562edefd95a31e98f1b90427d612061a013fd83e62b09569a1429508f802fb7fab007083603d9ca0fafbb5edb676b88801ac816b866fc82b13e28b478e376434d862b238b82d1769843b1ed37d29534e0c38401fb5491470a4fde29bc500b02001fb63f120016a1ee13d4b112aaa1edce20e5a152a624d90df105c1ced51293cbba757b170e6234c4f5399780224358b9e72035734d39896ca1c8bc97d6ddc70d11fc2e63e1310f458e6529d4e3a16efa7632fc5d476cfa151f4184e22717afb8d593f5fbbe3803d8b176c6e4ecc0ef9c3e93f762a74825ecd36aa3ad0c49de36ef891cc367cc058a861f65a72f7d7983c034f5186a8487cd3d5d9ce3dcaa387d96be984cb30f24da7db18e996b9e2aeb5b96411f16f2319faa0c1371fb6c6f436831b0a7a2adeed3fbe2ff08b1075d62096b1c7d133ec5c0c68a5e5ebb033eb1845f8737909efa4c8abcbd7693e452282e0c24f7355ce22c2c402e0e3b245f3c864852ed534d950768306ec72b3ce58f66ac5b73be855b85acfc1d5a287df3adb440787ef8d3614df689ec528cc8524b35dbbbb2d123e8f64863a789bf5b724c7c90acff80ecea78eb0cd9f21b43cf33eda6c40946c44d7ea000835e8f4b695bdca12e1c8d990c35aebef1d125d08e3c975f2cdfc6bdda28cdeb01d68489a8ca2d048d32ae0177362365d33135a5a12452cac81cd2673c0ba3e5e9b308ea629c3f864b3e08a8040c5ac7641f74221c8d7c05c04cf0843d60877a05509c04864e07802eb97ec86b6e8666b27f1e1aab7fd9640c697c70d93b01e9f05174f5eb3d725e7b321b8e10ae2af2004133836a5dc0c9a9bf1c8b637a98f7749b9fc616fcf7661f57ae12c9fdf0c2c4be6eb841c6be3a7d6b6f1c26a158f1131cfc353bcab5a8f2aecb15fd273ba6ee646535b8db9f478ed98e5cab8dff753e695cbc638caa3ffa147b18d183e479a96887d7328f5adb6582d2f2eaa984d5e5163c67cb0ede5b018762b48299ff32fcc7437fe789910cfcb278fe555f2690113086140b3c51537b917b5ea9abadc6d869763b78625770b58a1442c13beb36bf3bd61480677ab063165d3ebadfda59ab0d111cfe14c3b1919472ae7814a602350c66431d2902dbeee82781e7636dc9bd16e876d934c2467988cf096bcda854c0b6cc55257c048330e13956aba195436abab321e38feccd3c82ae3276ef92e28ee6f8d510660e09a5b6a8fe8a6dee96d8dc0a0a5c7dcdbe5252845e04542b06e037e7679c8a9220cdcf9fa8aeea48227341314e70a817d3bcfcd4e9bcd1c99ae78913e8476afc18947b87be539e681a0435d76427e213c342f1c3c86664be2913173288dd8586e589f53401afaf41bc06f867cbac90c0ea250df38369b53ce500e43cce27a7dbd7fb36766c5c8508acfd0b4e89822cbf75deda3e52e775091473be3c2dd60a17cfa8e0e26fcdb68320bf5c4ef0b730593fd0aebc9f4370533f66e043b0e7c930e17526b45f772a6b028656a079d52e3430007220cbc4ff851206c06bc4a1556599c17140d326f01c10ee9c441b70f504a84b9fc0b186360144ca79e88a9d9b721206fadbfb020b36ff325152599312ad22784e67d3775499bbb86ad3d01ed38aaf76933f5f92fe5d5a60f63dd9b8c915710fab0a1e5be282ed25e6d7be2d0adb35a3abc71267bc948b0f8b16d23571ae0c884f38d338472c31218ff15dbbf5ecb1e6f922efa4144701defc09105f402bdd5903671960f07336fea520fa489f91211da87e0e13a406285fcffa82f4c1d1a0b9fcf49c50283a830bdedbe41edd44b957bbd73f190d37aa0dcfed7a517ff5aba30659d00af5312688436c3476167ccf7de9264b064577f5f95e7d96afc36fed3a942076eefecd58d84b805e1e3ffd8e3cb072df178a7db6733a363247adcb34974f10edcba9335911bb5eb4b99479c465cef58647207c86d66e3b525b0fd1fb7b27386bed3a6a8cf6bc21e7deb34becd16bbcbeaaf0a98336c25516636f844ec8821d019e95f418f1e1e353e60dcc2bfb4f6aff38a3c98567e4b57ba601a2cc9517d002d9cc29e0a290bf8f7654012763cae32a652d1673fffd7f67ddecced25c64017ed2e01885080b22da1a13f9736a953f18ce1821ec68e33e47016a0e6035054f71ae4e83771c583d6b300c27773f4efce6154ba121dd35dd3994d940d565e35406033c698f29cd98fbf15231a25d243535465f543f85b943b81f4508d4aef748e3fd2a2da53c3cb0b7cf2bdd1a8042a66b3a62e1664c9e06d226aaee8baa6329a832189e6044fc2d2f48493feb96a2ad3218839d26f0dc6271d534a0b3bec904e0b87e89188c06ff3115d4b2c46720ab8610d6a2b680e34722f9f4175821a989a7adeee6ac0e2a1497a14e0a10d7e77fb7a6bffe4578ace8cfd9849eb3e5430aa4fc6664c7b5588f4d4c6d01c711c3c81d381044b7013ffc73826ba7e6b987d6f37b4fe88d8a29a3ef8d468b8ca213ad53ab1df32cec2720a833426b0c9beab6be58bda987ed460543620426ec36f489aff641dbe60041335b5627b5b145bcb4601dc18459c851ab18615fdc831cf9f2559a830bbb1a72ee404f5382fb1f86ccb08a9df896276084357ddd748d035d5884e27e064a43d1ba6898aeaac60378c49c68f64475f20170003ce1411aa1be0e2c00aacd776f28d9f910614a04541a26d80def70c3baa21db5e999709804d2dd20ade2b14944adfb69cb91419e6e80cb1e2501c09dee6c186919cddbabc9391b19f4b67ce7854ce46d78a36e3d98a5723c93719e72678de6a4a69bf96920116fac01a3321910814e40004ca3b9c0e0de74dc29294d03c8d67bdf9365271b175d91b126ac632dc850f8a98c930137be7e6cfaf1ceaa749a06e1dcfa446c176c03a99db7c1d587a785a3e6612e1e65d15edd72c8326a5f568f2685410413b4eff48913b94bcae75505413b1959703fd29d6dfe7de89388585ad50fbe807777bd43004657561787e9b073bf8abcba9adc0f1e99ab99d8f325801a535806df22744158fef2564538cf5793a0d7fec972664e5ff76a4945ae435a4b94fe0f61334a38060f81e99a91c352944f7dd381a2e243d7c982cf86d39fb28b2defd64c348563bd23870d048d2200fc55dde8babd1e4dde377ca25deb20c9f5bd69078ba1e13a0fc06fe1c25fc03b09478b0f42372160e6384a847fc1d5508806c25411a016e759e8de5a839e9aa5b9a0501fbe6f1d4d2039c7ad33f7d326930c0cc2b6cd4196b90296172dcb52c970c4fe3cd6f35405556747b6900db6b656fd17a7e3f44cc4b5d626a0a1d574daeb1e2578258e6f18a67b53d8b3e46d348f0b858a8ea970a4bdb0aceb6d453277406989952ae4a9f519c90004b585983fc4d5f2e31c5c94d37ba7f9114a706863f69fc893ff909a974eea0baeb63787bc583a4146dae555406707a8dfe44d4b07be2eac6c18e29253cdc861f91abadd6a9870de1e065aad04804cd13a91bfc19aab4492e2e650316b829e59e96dd02fce3f736dc60e411988ee03728a56cdc04c580ca8212bbbcdbb6bb66e12278ef755f40d3a6a3413400b37167ff90adc0bdf08471229b54eefce8302842d9fc15df90fa44783b9fab562331fbf1165fd43f11bae278a4a91ed98971bed8c5727565951d490dc3854fdf91d9b73bee72022f95c7d7e15f391033764cb0442b76243a21d761dccb6e510d3698666eba822818a4dce7f33804101ddb896905c6607e2aa2d46c75f120d120bd","title":"35. 搜索插入位置","link":"https://leetcode-cn.com/problems/search-insert-position","question_id":35,"issue_number":30},"28":{"day":28,"pres":["队列","滑动窗口"],"tags":["双指针","滑动窗口"],"whys":null,"difficulty":"- 困难","description":"```\n给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。\n\n返回滑动窗口中的最大值。\n\n \n\n进阶:\n\n你能在线性时间复杂度内解决此题吗?\n\n \n\n示例:\n\n输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3\n输出: [3,3,5,5,6,7]\n解释:\n\n 滑动窗口的位置 最大值\n--------------- -----\n[1 3 -1] -3 5 3 6 7 3\n 1 [3 -1 -3] 5 3 6 7 3\n 1 3 [-1 -3 5] 3 6 7 5\n 1 3 -1 [-3 5 3] 6 7 5\n 1 3 -1 -3 [5 3 6] 7 6\n 1 3 -1 -3 5 [3 6 7] 7\n \n\n提示:\n\n1 <= nums.length <= 10^5\n-10^4 <= nums[i] <= 10^4\n1 <= k <= nums.length\n\n```","content":"096221cf5b628be1e73e8bcfe626c73477842a8a04fb1e840a6471276d2b030313fe984226cabd5c185021d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad24e733ee0748893ec1b973abd2ad9aaaead95502fda042edff16d6a71829a6f582854f926a2aecf9b99aa2fa9f20e9c059c4c91da30453b7529336bcc29ab289b2adf294254e8684b4c6aa4a41f0cad88bd5c500476202da5eb4a22707af992711c5e3aa7ccee78121863ab25eb6f76f4103e528b7efe7346cb47ee9174148e431c70a92acf5c592dbeb70b768ec60c249d201868715fd0c030aaa481a83d21a3eef94e6356a2fbc9c1af8227931e33270caafa7c84b3ae75d40f80e71871d73e077d743521a8fd13aa4ba7c52aa82e4ecdf71619acf142c38ec848996afba910aca607cb2d269dfd7fcc9d72e8c0508a53aa12518153c0fdd9b5d0f7679ab1e903d0cfa18cf6c9ac971385418e8b6a785213a5ea94099cde26f0313773681a5ae5ff39c7f21aa1681f300558bb418ca6a7057bb613445372d8e44a51ce6029dd5c63ab6755cafae06fd9ef556286580e2c5ebfef2478146aa064bcc17a738db18d44a8dce3b8c565b6786d6174c30f61eee0ab62fcc8ab4fa40e1f845ecda241777557de23d987818af1f351eb957a1f2eb654bc1d005bf2ca42c1a18e2936424082cfca9173d4ef67c9c04b84719b99769a9c484303462580a107f61bedcb8bc96f60ac8f92d3490fda314fdb83e2c2d89c5cd596f9d5efbf99386c6c231398a393f423602c5af33ec1d41d909046f34950414653cfb79c94e138093a1e5ccb205366f45df54f3c9221c9f64f4a99ce5d159fd7280281f6af96caea9813abe246b347f3f94728bdfc866c2abdaea7d6784e314d23a013b45f467eb3d0fe48ed566602c2b4fb7ccc71fa2686166dc4146975c5495202d4d686ae6f174c0c6e435a61f508ad038d4263771ca37b830112fb5430899d1b003e98382d4dbafc6b20b989d778053714e7041ada9f6f5c8fd412cc9b6153cfd29cab4551cd95a2ee8500de2a1bcc51c67d4c127cf4eab77d6cae1ae4dcbe321b9934ad1da11b36d944beb84147102f9203e9ea6a0f4631f4d90c86cb3bbcb3df8a20da4ebe04ef789e59e8812e480c82869a47075e15b6ce82a5e8f5a6a2df93000e5dbffdb23b6f4f8b0d9c9d93f5846924e3358be5188e7b81666c487069265575b94f8d34511a29d31e4829349ab4380aa851e920f6608ce478d7613b8d28bdb07227c937371693acd33e221c4edacb8761662675694f76234c69b3697be3956ac94581b57d0ca25f09568d4ab3eb1a2351563aa74abfa21aed60da8301ee5f49ddf1f2752b6a012461492a5cc78f6c297d1109d1489e9674e1327e2766d7603a504803e9d9dbae902cca7987d7f1314d529811cab5594ec9a17e771b5785f02f7abd16eb12b076a27ee69ecdef4a89bd564b23898e3d56a5c0dd20b99b5e33373661b8852d08ceb5e5fa79077c12bedd46c92180b8ebf3610daf11bd86923d298a5d96e83538468e8a35605077e0455e4381250d622a44b1dc90cef0258072b5db1939de8469d7277ded4161694cb0ff24fe004966f2ef9bd649a7df65241fa4fad3729b15c8e14e2854c5f712b8f3d2adfb575815bf83d12e2c03087dabb91677b2e2bee8661776981021c06e4f147a2f56219c27177488bc4a03b1ff5bb94d6c4c00fdbd618e5375aa6d91fc11cd00096d109f11b40299fba72e66ad787284aae1febbb950688318cf06dc8995ab097825d5645d31ae2cbe94f86f79b9418fcd8be81daba0de2746a8265f1243768bd0ffce1b3b327e343b77352dff773ced2d92a2b06033b08ef618524e20498ed5fc794374d3b6e43fb239c53b4a649d82f1b388b88d04c3e08928fa66de539b67985d32c2eccc80fce1420aac53e8e4b010dbdef405a2be3b7bcc6ca82e4ade0259d5309591b87f5ec9504776518989f250e824e227d7579de84272d8d8d185941117e2dd6a47fc61ac44d2b9a8736160bceb35bd01395cf138211ca3506ec469982d22cd552f64fb9563b0c8fda735be250ec0d7268812d721d3809c21a6975c6d4c2d4805c6c8d43f47297f60e9e7af92115d9bff4c9d29391776c7ad8eaa4eff89536d4b9779919c21297ef48cab47b877a050adcaf839f8d869842142aae6312c8c0bcf4fa35996d7c7cfa70e496ab523931589b77c24789c9692dffefbf2201124e422bac5897b914fa2a97582a4d1a619e0f7842567460e4fc4b9ae06105164a1805e829f34e487809511a012b09244f3d00a88cd3fe1de363d60704f52283305e3ae41fd836e3b9ae8534aec5e8b396723106a1fac0f84fc50afd3f39319fe50e6743d1ac2389d31e736a72241c514036fe5b5af7f9371bfb8e6dd35836cfc8d702817e409846f5c6c71976c2aa480787dd8d4fa910edd1f91a17e177b551369bc1853eac25cbba4094fc60a16d492b2a0144f5ba9159cfd32085cf0bdc72c4b003b39f106b91bdf8aafe32b4fdb16c01d45fab5c0db509d784d6bf8d6df3dacea6ea9dbaac839f2292a57dccbf117c394f3e4df9be7307a85ab7c10b4171675a55efc7697241739bcb9f90bd655e4b8d297ee0a1319696fc4b852597c9d0b2634866465f39e2cf517cacc369a716f77c33106876cb5397738324d0b257bef385b1100eae175ffde8b8ab8957aa787e2fbdbe35a2bfef387c5bb67f9005d0eb00d2a91521759b5acea0f88e0294049b4e0c722fc940e6336c0cf0a1a0eb927459d7607193e751714e0c1a0ba34fb2e2fd8c4f86f1d331f637009c10795f0546ed5d3b9eb1e933613ddbbb9e8ddcdce0b443481c7651d2eefcc34cc25ee5225e54d6b2e3b9ddeec8ebd27cab262de228902c575a134a3146d631421bc7913000ed706c53a5dbf291ef6bdc2c169d71378c231d285c54fdf5cafcee4a2cdc6266fd555608afcb5b87a1c6e203b5f06a990cbcef0c6027159fa8e6253db1f96052ba4d6d7c9646eb6f89e9a506029a7e1cc25de66b97ea94ef0e55b3355efef8f8dd8fbc65ecf8d26326928dfe91ad1040d916ce621bd27e9d3269aba069f615585ead034c78dc392672e4ed405fd00c89e00c507df60a1ab3fe8d53f85c8ffcda8c9dba8b1cd3492ae4e81869686a45e824dbfb29d57deab817e4ee7462c55478b2c2e821c11ddb88aa37db55fb9ba5ed4779bb695f654e1a77e91ddb02a3dcba067c200fbb3580b393d0b09ed693a1b4c7ee479f7c010103f0b41cc4c988b9484b8f06f0494ff62f2dada6c728d4593c0fe678fdf5d1e1a1e37f83fb61edd8a7d02900ddddcd1be1886a680a3c2042040ed2644a5cca6d7cc81a9049f38549b350abc95853aeda819de320602e4da81c0bfee1e55b042088a21e2fbcdd514881209bdc5c69915e29c745f7767f8f9646088da25e855116c98f3e0c4811652d82b429ce221968a452ec564fe15543e28da9834503e79f513a8972ea49aeef4db447e986d896558cfb9325d740115123fe50c60770634060d2a6e59cfcf337bc59452cbd5e41400b9014e4c1f73b9d526758bf41aa5ca26d0e3642895b03b96d3600421634ad2a8ce482bfc3fcfabc74f62867ff7695f959523275d72261001732c2315f6777b2d4e7e11505a532441be1e7bf441b3c3a858d3d8dead5b1af827bb9a2af9abf4909c32fda0ec726d2845f49fac5468d228b949348fcfda6bfec5c3459a49e57308841e44e59c326f25e839049b1c501dd49c381fa71b5f5903eb37bb3674c075495e940110ca86eb96a4e6e6c6f655c352a6490f3f3bcc37f43ad03b173c6f4f85a9af634499aa053f6f70e744c1061baf222d49bda00ae3a19ed8a9d6ba81aa748e574a51b0660fbbdf354ec4a7c2b99ee5c3f76ed2291a07cc4720b584d0a1bbdea5ba9130403b2e834f12362f440d7ad3da197a1316847ae507afb5354dae487e1ab7bef4c87cb77d134847b02df76017b2421aba93494e50f5053f8910f1e498ec3765db248b70eb74826f93def98f7460ec7373c27c4e69034de20003a4f0289b212f0376e0f1d287a53681a16c213327ff7164a3317c107215fe809cc53e24dbbb3651d1c9ead8d38b96f7a774326f537179480019aaae6bd9c30722916186f1f93c18951c32ead949843926935c132e9fd0f9235b524487b8f5f378b5e737cd26d33eee8a2496d52842afdfc0486c7b5b367d3023d3becb8bce509ed385208ca1d3e1949f703d263936cf47be3b619d3cbbd7359fea61045879d25caa1f46eef4d49ae521fff222140f7147a7efe41e15bd679a8b537850b8ec0b62aa23d54fa33a00e0c65eacaa611177a129ef2a24e388bfb887f01d1bf34c10581e47505c0877d5c7b90fb71ced527a6a9d4da5a93e3a2dfcb60ad3d1b62bd7accb6bd0f7de9a91b9230857263ebce91349ee65a1f00a42cb545ef0fc14754824432f69ddfd5b460393681fa744486ccdc4cddf1dbb1e0912bf3489e60fc00b7ceda0dfe97aaf4d3628fc7e5c8f384b5d70242a8e68b858de048e0f41831546103af4b6656aa6bed42c8eb6b609fefd8ef14a63327eaa538a1488a181d85d70e180ade3ec273232f52a3227f16bfc50354997e3e584bb3f3db68f3780f6a247c0415eaae9858612068a5a4aad4344a54177cfbf1b1fd0d751f02100f03dcd302916354880d78ce0502c890319dff7316c8a7edc4bd5c5d793e7e68562efda185a2e81b00f95005a7a70b84d69dc14ab00d81eb5187ad251c48f0e2ab325508be24788439cf171987d08e3d1547018f61a4161d302971248147556f01c46894adb54e9e3001ced1f591e583df439bdfaa0f00e29009ecd0d5203ffc346ef008092f2a3868b156ac59799661dc496eaacb4232fca061728af191e5740414fdc357db257acdb1844d173317877120cfe9d45f5b5f21dd075d5b826c6fe0d92030507751af8ed83db5293d42b6642ac9491791e20e0795388df6369f775003bd3f8946f5d473e95d33da5cf0c43884640ccde96aa89b46398bd6e04682cea2e1f03f329b9f981e269867bc06f428872f5ab25f4c3f45bd3d2e34b7d0063da741f73007d720f4fa7380aab5fd60b6f5e0be8ab94d21c122f286a993b3e579e9c5ab6d33080b26645e76c7a06006e5b7a4b2d1e85e8c011e804c473138279ced96782cad780e3c94149b8c2ca835f132bd8aebdb0216f848f774fa47343528c9308f33cea5a6a8ace9256a65f3963d149c7d32fce08c895605beff394bbeb94f4481e43a648ce8f9ac55e616ceee508719066eae3f5f2dececfd99ecb38510672019623ce9e51d7301c9fd64e0f44fe179380ffadc65c919e910174548f50fb213cbf2c52aba9be6d93f9f25b86282c8da2ff53fd80590cd69e75a7d129094fe1f5c67420383a6a138aa30448d65117ef187586ebff7ca82c961cb41519839e9d5d60fdc30ce5e9e02cf67a0a5532ee7381d8d4eb16ae4a472ed96c1258a025303a23e5e63bdc700f57a5adbb81cea0ff785f346b0de80cd7fd6e207c10f727491d6e83fe6e9c3cdabd4f0c1adaf509abcda616b1358d48633412365b89da2199efc8b68e16194052e6bc5f338828109a8338a3f8f12e3bc8133bc8eff1d19c299c8667a0992a73e0983acd57b37ccc188985a1620961360f30168471ada82761aa4b0808bc5526373dc61eb6979fcab1fe34cdbe59817ff0df2f7b1bfc9a88ce2d1858345cc054fa8ac844524909220b55bad65e2fcec449a88ca349297186780a7fe6bc34dff6d34e1b4af36cd61dd047b8ad46228ff9a1db0860d6c8daf9c4571fec96edf5728a735a56a3ef5f849ef3de4ad6173c49ff86405573773595f0809d35bb0a9de169bb4701143690e7c682254d56775c367219a5ac7fc1443fc51800dc342032eb7040125cfa5b50dbfeb3896802584206601e785d099e967da1f0f77b5b1482ba69d2570b5421c0d3f7b581149b4adfb6c95d8d36377d9056744528ae44991bc7524fd15653d53ac7c70f6f3e04c48c309a378f382fbc36368a2c9305c483109472003c25393c7b7d66f559f47dbd0f9020786e39dc6c74cb036ec454d7daf9136b55b3f1edd196b61fb46de5eeac00df69fd43ac3661306887be95c9cc27a702809206974a49b7b51c940bc4ecbc7a611278f9150611ed6002be45d79468fa591aae2de7db095429ed9e84f3f5751ab9d13a822a87ceeb2867bc94b33e5138b0b1d6fc7686f6a91d2a8a351b30526fbf2737cae31be901cf41e03dc215e07a08e9047f8eb9e2ebe1ffdd35f5cc58d6f920cf03ed0e0ba18f0bd708297fc056920be9170c6afd790dba34461a2746420d66a16e3576e0c5a584c938f31a04ec4e933a77727df92a615b088a299fe2441e49610b04c796543b05e766027e97b670e172d33958546a9a6c305b01e8ed0874267dbffbfc9923b3f13166b957c95df7be293d1fb35a935380484b4ae9a35c45a6821f81cb07b75324700b6a95db1b1003a3da9b7c8a3b774b0ff417d892cc7a1774539a65c70eae5e85fbf39c50bcf4a2603ea741f108bc153bc9c5a4612b0570a4d57c6e91c188e963f8d0f899378ef2df749124b1b25184ced4b8cbefd44835f953117dffa4f73f1c8ffeb029f0456b3345978475cc5a9eed6165ed09acf6d1c819e45e1b22cb9ab68844e33b3ccf35394afdde85d186ad2244640e85dcdd7b2356e7299dab3ac2eff526f0ad0dab29cb33a03d06ae22dd6b898032ab0d8cc2628151a309f1caf1b1b2f51ac1693692c39d315fdd56a0ff51a5c25e834f9db1191a46b666be2e53c8cea76cd6a16982a003d693898cfbb4768211d320f14d59b57d5388b365736ee6d890d6e2e52ed1c8fba7e347c5d52e0c5b20ecbc2d8ae9e54bfd9fd3f8b3553a44ac86a9b212e17089283c355b720314337f170440fbe8a5350c9fed51699329b0a862dfe217c7b3ad886d95835041f25510e5c9e77b34a8344bcb173d98120dfc627cf55c22d3da86fda8eb51164ab991de90bdb577d886ed0f97a02dcf6b6d2617a8db0baab372e78768ecc64771471e2eea9d01b7a1a2f1d26dfaf6082cbc911e1ad24a48ed66c123b88b360025b1d6fb50358ea6b7fa9ab1031697520ed1d061a18b5aff1aa9c42cbb65d323e75a113098e18501aa808ca3dd999330c8eca2a27390cfb5db11deba262879a199df1d5b24fece95433a3d129c835b676a20b60dd98b97c76a266f2f678ed329d93946d951cd2ce59460f1c794639588c6d4e2b66800acaf30a01e760a1e18f72a52cb1140b9cdc48a42d583d53428b97d48b1c1ffd86e8386ad5d7969645c2d361492232b23445f124d31091ac9a7a3f1ec13df4913ea3e4f448ddfe3942d011e9ce5629040b88064978d1f7239bb41572d8459d419a9153037c249cb720277abc87d5a31efede2a26aa36d2ff24502ad7ee6285560c190436a89efe9d1a765bceafdbeedcccee7434b0ceac98849a8ed99f2b10d24e3e4490218d4ecc7e6b7d4ea14e75f08b6ad0931900856ec1149a011f00b5cdee689810fed2c8e72446da89bc3aeeef6e920635d1dc97c4fadcb677a3caed50aec8550c8b98e3261ad2cf824b9204f160ea63f9e3d6b9f35a1155943144fdfae07dc7adfd90060e7a0ac59447e02cb207aa0407758e2e5a7668def224b1d9921fb74488c881f52f5f69358025784b5e54d7df13a0c78d686c800ab82a00e2ab541110f66456be22878afe6ac94289143e1c6a9a7816ab03ea1ece79a0d8cf1a2db539bd7ad99f5f13782205b8b03cb1508bfb8b20d1c71bc84e86f190b6f4a02e280cd8795fa65b06761c4faaa4bea00e6e26f25f5eab0cb4e533d0c8c9e5cb46c65e8f66a5ce6644e6382db1839041a98e16b1f3f2055c4ad68f1abc3593c111a9f9f1fb6b2fb0ae812f829ebc4ddf7190e7b2545a46bf634d09a11b1021ab359c7bc2fec07c090d4d4096856bf50c739525faadd5fad84f7f64297f440070cc4d67d23680ddd87fb052874132546d982a65a69e403be2a6dc5346f469a6c4f9516db29e82c6e51907b18784f62e23ed147ceef53df1be3cd488ef563e5a9f875317122a334fe91d7ee033901fb33e7392a68c284e42b745ff64115b029735c114324e8af4fbe27731a3beb6a5a008fa9467bb64788f29432cb0da8e844945896015ed2417c671f80513485b020a4947a99847ca7bdd8a1bda800d10a78f368c0d31ea780f0a40c997f6903517a27e55ea99872c20de4571b8b155037f3833c477c1b307b1a1ce36ecbf5f30e99a6a7e5498bd18ac06a553eb503313040c387a6e7aa7ddb298c66bf9032443481160c29ae31a59a42b0c61ed06f18a53153d21dc43f9e1d70684ab21e0e9e72a3ff2f38bd95a05edc5848f2a50c091b60c7359af215004cf5c97ca2de5fa72751c035979d92bba7effa61023537666a23b9ebbaca5b8da8c5ca32c21f821dc27f718478c864e646ee3c2708844831e2fc23446f138ce2c61f63e1f2a27f11e0fbae26305320ca4700981a32b9f551290205633a77f1d53caf36fe7cffc208ce8c968983832e1ca5c00f360f677ce736be868ff1aae6c437eef8c7e7b8fbb4acc515ab980ad27b5cde517c9c046c5389b690164db0dcb261fcaf280cd67a5857455a00ab15103ea34009ebfb94e724304c3119e4bf88c3254e11908edaa83849dda96e83f92ff6a6cd697f48392127913d5ff5565281fc55f0587f90b9c2b7b151b7ff61546c07e1087c4a18d841dbddbed9b3807480d67a3fe2e020cbcadfb612cd9495eadc358fe403f8c35442dc684d9d3018bc185bf9df0ff9091926c304c10ef6a84f1ce112f73f1e4fffddd3c3a9371ed800a93b53918a1fe858e6af736b160819a6e35ade2070f7e7fbafeec2c3798dca2eff680b78e53651b04a029f956950b151457ddb2c1668b5fe3ab01db4164fa660cfe8558d33d98235fd11162fb914dc5d68ca3c6696bce35e3802060941071f615d3f135bd3c70ae0de0be97b4dbd6c5d7bace67c80d716a8ee48d880f62dd654af933e58b1f59c14cfae09809f35ab7bd5b120b3434017088e02fb5f36b7bf956fc743ddaeca03b65b40af165f7394d5ce77f4495beb92c38c48b09d78178360cc06a92c14e0a772503c1cfb8dc2650d999d0c247b8e3a6226b269969581df80884ae0549e377b3af59fc8bf741106c504810e7a095059b8483915be636cc0f0d6fe1a156b75a5e09b10d3d32439446c3a52367235710b2af7ff9b62bf37fa5db98cf4656e9efd970779b6a6a1b96323e3e2157c8a400fb549bc205fca084cfedb5ff0749b954566c3baa0c3231db4d6d2457e2dd96c64f1e67dc6644e2d838d010d0c827d325bbb35ff80669a4a0b270f2119289f4eed2932ea54cd3458eb1cd8935f208c03acab39d8672ac73b09d9e58283ee505a8408fec2ea52fcb1f284bbffb32602a56fad6b26897bc0c97c3f6b6ade4ace77ce74336c24720925c6f334b2a51f8382d14170b623c4c06652a5f7ca88f3b58eed5cec412568d1e4c4908056e598ffd9cfb4fa880b5b6b9702dc0c284ce834b7379c8373933701d020780fddf06dce54101bcf8bb1a30f5dcf1dc649c05266da46cfb96070b98cebb2780cb0db2199798500a01be6956c74dd3ecf6ff94d355543d4bec34a473cb4a936df9def84bf221fd8215cc507144d2027f08ac45a5fd71d471b134d30df7d01e9687285ba60cd13b438830471d49debccaed31dcf6e595332926d2650ac15d85bd43039a01d0262f721cc47274353fc720c59601ae8248ade29cbef8f4f574df399c909efa0401564334b617e8fab10973c6e57f580f54173de013404c2809e7139fc222ddcfe0b4fd40238b8f07aa68f0e171bd15da4e133dd9c5a457d52beb019958eb4c631b8312e6e05491f443a49127a0540d505080a5f206b8b5b660eeeb9c2c073e2801141b69d61a0f0af4c364c59d7e32b22a135756a005ba786431bf225ecb1637216f041cffae573a41ae44c933073276e76ef034d4041aef7cdd33be279a52fa2032c7ecc94274c76f9f3a357c45a6c343400a24875ee9e4a14f2341521f4d686c50b4c8826c4f42e4d259eda07288076eff2a9dec810fdab5a74e1aace3a7b15162ed021b041a2fdc4e59ead290be11f4060cf8cac3aff0ec4842dc333fa5553c5ab9a90636e17f17628af95241adda31202fcf7ac977123f43aafbcda3506e43cb5b232b38ffe28db158cb32170ff20aab2525f32bb847c953b17d39429a844029ce864118984cfb39a0ba7a283e41223faa78d53e0dde26938be526d9a4c4b6c1676be5b0b08aa02d723fe36ef3bc3c37b685338795829a99ebd3365b4673644481f0ddb227b74db913ef281df81b6151337b94da3b3460a2fbdca8f2c7580d61b210f25f9bf5bb2741ebff571328526279e8ede50012f028c12500dff43f25c7855311336c41870caf0e255074a6166a36491607dd6a5b49f9c4c8c0bb05a81a3dccd521ca56a3adaeb7bd017157b7fc4df5e397594de36a38a5f8de63206562d15b2b33bf84a183816dfb165f95af926b52e37b20662fc29995ca6f3a68365cb00b6d51a1f5664cf35cbf37de43039266fbf4cbaa54710160433ccb193e75040773a389b3166ab7863f440be457106b8c6afb678c0bb19bf9bdc576fee31175207a19667beaadeaab6c5bedaae0139bac2a43284eeb4291b151ae7697dfca9c5236833c6d5f67a3a20fde004ed066dfbabf8a4ebfbde6a167d265a16cfbf3be820518dd41c691cb3736fa7d1a038c940ad4aba2ad12d75e6ce053d57f386c6f220dccf9445b420a0305af81b63655c847444462da2775add1fdfe31ee1e46eb233523fb84441821c88f47633c21f4c5068260361701cc29b6f1c461f55b5a2adfae8b7f2d0c94e28cb4a18950546a36ce79b137257123f863a256be8973716a77e6f6ccd6e8cd7b822baf39ad2006fba6092122d0d0286195b7202caa38593e69c0851989cbf27ed7f99c749f869395064e753ad959acf0ca7f33c5bc921c0f6e2499f41184a2752530275acfe64ea72f26a56834679f041af2463dd53a84a61e57d8357e2fbd642dcb1b72ab558edf9638e0ff7fa8285a3a82a7595ce0628617f8fb4465fb3f006ac25a4ecc8e5dae7c2f09c0efe0a3c6d208c5fa48f0d348900aeefd786beb0c3cb8ba1647d1e3411e9ded7442ba5f9bc792b67a4a543996c9aff447470246ebc5b635e7a6859bb5aaea06ed856912b2b478857863eb57b1425ccc026875a1a3c32155987cb08ebd46b40490064d7be63b56c91f6081a60d612069e8b40021b7d66827d24581e65ccd31d33a2f6d506e36ad4f6da2b12c762a4350dafb405e77eeb35dbb23caa98225a2bb7a61355e5071d6c57eaeb2c322eb7d9d8dd678ea461971f79a07ad771d2cd15f4734560d01ac7643bf96a4f6702f74f1c1cb02dc66771b67f6188c19866dc718256531d567d28d59fa016a66e5407d25ea54351922c0c8a2def66ec9efcdb20aa709354192d49274e60bffc08f80c587b70d9345ef138de2ee8fd4d512d94bdabc473fdf6d083654412b8d33eb23bf0c20b1a4e6881842913e1b965eef19201f2424f824aa4c9b019df3ebaf47070f21b194f0b5b50b9afd8b48234fcbc6c5934d7fc3dc0ea5806d35ea05751b59252ec07a248c75ee6af6f9e21e28cb6aa225d639071d2bca96a8786c741546f8d3f41d76f497c655ee4680606970636458ba558391f92b846e7affbd8f518d23e6e820e1fd3d62f277f92e0b22f53c745ac4857fb35fdf597b9d36039129190f13f96b18ef1e0825c6070a003dea6b08fd4adb090e7c556c1f58b7029fa8f5d6dd2aeec5219dd146e405b64ec77ff7a8757ebda4e06eed44e7b052076f51f1898a6253ab2b6fdb58d71661254ece514e0889efbe2220829e2f8f866cbd1aa745aca113ebb8315a1fbf1d6c28ecfa41723c971f0dce61348f832002a8d0738f511519a720fa6a18a65d7147e7cc7c72faab46321d17d85443c8f8e261ca95045daac6c853f2719d17da026da13fbd6a8112f201e1ad947523bcb84d1fbe5b3c24c70bd62e5e359f86ab4922471c7d05c35cea2d87a199bf7eda12876c4a1235830658358f78acccfede92a5cbf4b1adbc37bc398fce80db2f173ea9333badaef67d5316b59085e656ca665552f83c4bd3946965cce75a9e8482617a6572ef21501b1531879cc8ddba73185969ab036b61760b602b42549188ca1ebff58fb9e47d68a35928927aa329fb4a95d82962b9c220db97b1e9b405d34ba36d51d1b6689cd71fc3fcdfb091344de8e27ec24f8fd41d406206fb66413c87b649b3429e5ef1979a5b3b640fe6b34b0b615ec174cd8229e738222d26210418e8d06c473f75e9baa1080c1475b31ecdc9495ebfa261d1619be8872dd96980176ec85111f7a7aa91af218a26d5e70fbc0d85b1dd5e5f9596935f541229c9f9ebff0a933e0ae824f99622ea8c340123d4e058af189aa1fb449262ca39ec2fa638e988dadfa7cec137a490d8457cb4c7474836835c0de18c4ef5b6ff3da7e26f594ebba87066b42d2fe77fff4036143c0616ce5476fe91f451fa94da8a3ecb210a83d1c7fc9b79fa7e0cd5cf38d630d7c17e2548052a155f901db0a32cbf761af50b4403d76591d6e6bac9c513bf893b730a85185a4d5e2733ee33c846bc1c4e2880dd636ab59da13f07974fcfab8fdaeebace6836d25c680e6d154394a79db3fcb2e038c80e0d1162d8276d2ba147218045129dfcea9b0d55f9c9f35d399ce6eb61e0038678ea39d559c2ffb3a60ceb04dc61a8123134da37d49ad7768c0c6f8b5e55736e85eeda9fc7f3a6e6823a6fd20c50d02505be87fbed6ccd574b933e412fce7ee3cd861376088791c1083eda4e2c591ff46929bf88335f6a0024c01b6697d0155fc2e67fd1d8941b019c88c7965ae187493ebedd0a31d65ccd4b604bfe9bb9eaa59c6ea635a425bc2dd006418d0418b825b9f3c28bbd7bc8897a48d196874463d83885992b3a4a9bd8a1fea53e61956e4ecc3b6d9070cc130c4e78cc75d5b47d3ee04956afaa00b342f8274b8235a37db7d8da22683e0d0bffcaaee4e751b7bc22298bb5d7dba0d0123891ffe110430b7a29ebf1b4712ee283b62b19d48d797375604fc42e04df31b9cf5054cd44fc72d5b0fa7528236cb00d1c696387ca6455279677b340484341b25148c4a99826cc38de8df666a86614d3c2a2b670ba8d918f4ba24bdfe961e52a8fa47e88ae0d8ce605d2d701eb93eab2204e6ca775c09db93979e78d80c14d8bf9174184e580713e2b04043b20c6210ba1a16d1ce167e3321e444f95348de086040f4a8ab73db8b2519f5262714f1e5908c3729ffea115578193a6536a2bd197dcfc117e724902b404686e3919d04bb1a0ee3170991b852b65a09ddce059698ac6f520d3776b41828df8bc65124f96b6cc59adb5928761904c945163d218904621a6ed09e2a6469583e6b0a5079f584ae2b88a14ad6042777f46a0362cf3746f9ff0a80e736b321af54c073f1cc53960a6334422ec21e9c9f70c7aacb6ef6a6d19c9102336397e98d4bca5451f1c7b414d61ef122b3b589788ca3e5b7b4f54a1427fc58afb4328aaa9e7fa36d95f539aaaacdec8095bc36f773eeb36f87fd113b455f8f6589389b4ed161f462dcfed4a44992ac968307e91be21e4297940db16c287d8a84156d7242c6393c8eeca7df85d56d304764fd533f62bfe0382ad13385b856a32e028b474a84c29679f703bd6fd81147c4034cccdcc5b453da22c094040db7887a7ac7eb3f804fbce91013ff640c02d5fe24b2eee20a847e2505e62d8fa6f0824aec1ef4a1ecfd1fe08d5d646d1d311ed64f8fdb310a450e651951131d0c73079fcb459d5abb6909c8aa82282ee1b9d85ee38c350c20e9a8ed9979e2bc57d4c34779e4ac813c2f2a4482308910741169d90ded6cb82a40fae99f6ee958512f55e4d8379d0001211d045c60e20cdb87e3113b0909b87ac2c6ce593fef8e8f8116554f30889882c930e7c80b2455f9e8c7c923c927a74a78e810d2114239181e36baeb0909f4b8d8a4dcedf341cd124ea83d84fc4f14708e5b8eddf14adf8536943b9033e91fe07b72a08ad253e175724c7715406e86910a8018a0943ad83d12d6cf2e6c5f6e618ddc9e09efcc542fc09facf97ec1f412e4ac4668d3c49776b090d36f02d6e8d1177e33c69b1300e76528a3c6345e2fa5e1191f6851baa1910605183e108aa5cde7888f804b80f62d9dca1bd01c064ff38f30b357f9d51d8b7e3bbd2f0e691cec98da58bfd94636b17c927399dbc21d86787c750fbdd4ec130f359f1d301440d638c155b287e74d7641ba6c898762fc257f7408458a3ab4be139b655e700f3fed9ebc6cfa158ed8fb93dc4be874bdf79ea752768f1a85863943af956c0bf319089b3ad58db6ebdbd568c9b5daf29966c3a70ac839ced3d055ee4aa18684b8e7990513665357051b7413dadcf5a319e79556ef44968c0db41021573a1a2de4005bfc7ea308f808173e53a5bb24392cd7a6e57b19a7b4a4e528edf82fda92a20dfdd3dd5178f383986c9d23245613216d647802e65cd7e379be1525e9475ea5fa91bb9c2ca00c533e979ca080d6c0593b55ad2721d86fba3605c9e894357f7064f9029df684911149fbf1dbb82179e9459a550b7e79c2297779ff7126676adee16d1fb0bfd7ef7f9901580c43b85423efb1eda8f27e9ebde99a494301934fa6754b6e27529c46395e9939568510d2be463c93323bc9a8e308ecedf443426007f836a50289166ca0b881908a165310d0e67018d5313c277d31bf8a44f59c7806880e45f5a218a106baf7f25edc953302965b8544ffbd08107743ea03140c2be545142cf1f8c61ebd836423fecdc35003b0984fff0691b02b15a8d7f6336739194dc9f4681142d97adb2b268b34ac950a888cd006665d31f2f35a264f5d7b92f949d20781331621b99a507ba7e0133b2b867df4f334b026ee981d508d030c7fefa498c4794015c3453e78e3017857c074f3671f5254951344961d80ff4f44ff6e7608eacabc8a9108b4f976bcc2f88f0ff85f0d0f0de86db3040cb633a2e70b246484bbecd8f61c8355f1f53db7fab72eaf7d3734b29ec55282b15d5bcd2631d86be95e2e7257f4ef0973e9cb2cdb41af1a9b6070a0792a43cbbd877eac8d6fbffbab7d4b919cccc2605347122d58a0798e2055af0836896d3f1702375465217b99a9b8dfdef4fd03c5832eb0490a4e8362f97284e74851a6b32a3982314463b44ee6e7b07d6184cb24d2a350e698f3c58e1114fea56580e0e541d4b41d8371390d23f6337563280516c497b205d6169214f5dcc87ddb465b526f36da3aa0c3fea23a742b5682217fab008b0de8717f7a851823bbe30fb5968e8d3e82e2487dac505952948c533512702a296817f751015e83001958382b2d4ca0c63efb808d10bf059552367a8649e67e9d2ac8b8f74a34414a73149611c049063ea2d7ddedd923c3daa1e4503e6c4d0d1db6226d32de152657386fc69fb67802e3deae9afdfc460f10f05895f58d2bf6581a580ad7ee31d3217521900c24d29255db1a21759884e847396ddc0f76e0334d50050f7492d78b695c8a6fa3eeccaf50ff41b94763467a97c5f53cbf91ccda3613ed767a60206a733a9f7c13cc93b703076513dc8f53cc7ff8de5f7a27a19e9195db178d551b58268f860fef0138cec1fc7472182814d02773d8ab03df13948251381288dcfb4a1c28f958129023d9218673d7c81d93fa61edea50f9d3ef81ab134e5e2c48a1a9944e2a049b6d09c53ca0c18d41a319f9671b4d2bd08b24c2c6385a9e96ea48e9c0070b71b04f779c6fcf9f514b48e2fe78fde432d8715b60d2cab602358c675352e4031c499498e9176a6b8ed91a601c780f441012214b65f3ef9e1e0128ecfddf47e696ae0ebf8279e430612c40d609520d90f5fbd3f22a5853f76b8ab06cf6c48eea46e5ea60698a0a05506ee8b127d0f7745803a547cd67fc70d12e3b3d5282b3b9719dc9d442fe9293cbc56088abf519acbfdacda20d75f86f2f87c6d7ebe5e492483cc3c8c417c3463b888fc9397105a52402f1bfb86bd6506fc788a8a53bb76e473caa98a71a6359bdbd4ac5dc9e534a9a575a79a58b63c18c2241d30a2cbac157ce9c460aa7a66e3e154022dd6261b79d0636278c4716282ad4e2b801902de31b22b3a17dcfa44f320394985736c8d57d7d90739d7852d5754dedc105cd5e980034b0a1b2ee323d34107d52104202aaba8fc1d094d8e52c097c3661862f4e8e19e13f36a5c47bdf9b30691f697e6a5639a15348676024bc752cac3f354053bdb8fb27bf4d36e307485052bdf40c01e8104e","title":"239. 滑动窗口最大值","link":"https://leetcode-cn.com/problems/sliding-window-maximum/","question_id":239,"issue_number":31},"29":{"day":29,"pres":["图"],"tags":["图"],"whys":null,"difficulty":"- 简单","description":"```\n在一个小镇里,按从 1 到 n 为 n 个人进行编号。传言称,这些人中有一个是小镇上的秘密法官。\n\n如果小镇的法官真的存在,那么:\n\n小镇的法官不相信任何人。\n每个人(除了小镇法官外)都信任小镇的法官。\n只有一个人同时满足条件 1 和条件 2 。\n\n给定数组 trust,该数组由信任对 trust[i] = [a, b] 组成,表示编号为 a 的人信任编号为 b 的人。\n\n如果小镇存在秘密法官并且可以确定他的身份,请返回该法官的编号。否则,返回 -1。\n\n \n\n示例 1:\n\n输入:n = 2, trust = [[1,2]]\n输出:2\n\n\n示例 2:\n\n输入:n = 3, trust = [[1,3],[2,3]]\n输出:3\n\n\n示例 3:\n\n输入:n = 3, trust = [[1,3],[2,3],[3,1]]\n输出:-1\n\n\n示例 4:\n\n输入:n = 3, trust = [[1,2],[2,3]]\n输出:-1\n\n\n示例 5:\n\n输入:n = 4, trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]\n输出:3\n\n \n\n提示:\n\n1 <= n <= 1000\n0 <= trust.length <= 104\ntrust[i].length == 2\ntrust[i] 互不相同\ntrust[i][0] != trust[i][1]\n1 <= trust[i][0], trust[i][1] <= n\n```","content":"096221cf5b628be1e73e8bcfe626c7347c8e248a04fb2cab0a66692577330f1937ff9e4625dd8f5c367421d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad25b7639e030929ca4418a3bae2b83edb6a88a5c6da56322f6dba7ebc9808464572752f6099443514af3c014624e43f731fa24ae99477d52003c5112c541fc14f06bde47175483d6f18333a0f284f368e6ad01dafdb34b36ec8f727f0c7486c05e740115d88bf9285e1f05f303ac3c79934c340dd84e970059b40ef0e22f37dd202838ff07a3374b4bcfbb45289680680718c3aeccb501faa04d83fd2c3af5aec087c63d0a7fd38ac14988a8248e0d303338a8e06488a98a9844a84574640ec7435a47e1d8960cfd258247a1d3cf1e81846fbd5038c38550bf0b4d4596551836f72b5c89ca252a9dfd7dcc9d7febe3428879bb1151be97131d507c85a86bfe278648e7abfd9eb896b2df4abd27f3973400749dd7c59a069fde2ef43113436a145befcc13caca29a3420e330567b96b87a9ae02799b31465e40daed6957c44ac6b0632fd84b3b95c68711e5a32d58d9322d44068fba4241513fb632d5f63e1899e316d06fa5fad1ab48f2007e31ef60ca08c6850bfffefc914f8c111e8b6a0a720715319b06b03f438b9beaf87ecc95543e2c8778bc23265ac2c840d5958d2a2e87bb5a5f2974cd3201a0535bf56ff55f43abbc81221b0722a71aa604ee16d7fd8ad644629ab190f6690eed288b020ee2c2d89e7aef97e2d3ee849e3c5078cc96ede72144ebbd9754f10ccad23d791a2044e35d647950cd839e9ed1371c1a1d66e52c587af65ee04c0e9622c0c54f6284c343009ee90f01a3fda28ff7e8a92aa1f0435df6a7bed7a6b2e2976c2f8b7b1150785f15401991cc0fafdbbc651670fd53c9d2d6741d2dec77a759a449a5c317a8f8cd61f0582cd41e521ab7ace126abcc2a04f0b89de1767b45a3942cb308a604e68cd1197fb64b698c5792e25f60d1a8222512c081f0ca0294e60d58c8f83032ae0714922ee51a021880f6575a3e54972af400dc8e77a2266395ab9bea275a4b6b895a1416bad90883ee10b11625d544eaea1414442f8f0392917b035841f5af13a0a357c19904149312f859cb7ed18d73d7abe9df96460e31470391890ce4a86d765549074b5ce7a713bfeda3286342cc22c9dbc7f58a695f8e2487e1658200936a7f356f38354864c421a787c2b8ec748994b58e82d8123382967bba32e927e46c18fd81a7175f2ed0e26ca1f88a24f3d3582f1c42da8ad534260f75624f0d4f5d65a11477988773f038ed9fb581119aa3dd42d604f50b726e7cfd30d07b2acced62151fbbc4758143541dd0bfa59d8d2f493a4dd383616e2f444f853390960f8c23722366db1b2b5c5c7ef2882b22a97b00ad251c61d68eb53637f3d924781c3f83e7f19e4420d027d0684192864164c046275c5f8804170275d0098e3d56a5958c6ec2c333c1a7006cb88820768ecda1a93114301c121a0e9c21d2f0a6b17f55c00ba8878943788360d88e5a7502da079cd08aea7ca8b5941cf9ff334934b1d1b2c3f1159a9f03431a12c36b970db5a40eff87971d8a8127ffd8ecbe651550a818e3a2d78dfd474c7f448b15541685b38e319462c324163f3e998c6ae1d76feae6b0b3a2818f0874fc0e443ce397e7b1392206c4e215471c590996c5b21b202e80b8fa815b3ba2ead2c78b9b0ece5d241ceb5b7274b3339681ae19d9f22cc2aeac6ef408b0fdd8e2e8a5d0a5da843cb20849cec9f388653b12b63346653f9c761a841741e4cf6408e1e77ed79faa5972e9636d623d57c789f5a27c235308205c06396c875265b22df50c0e83ae3d44746532677323984113e4d274d19be513a6d545bc8dfcfbe6d4f1d9ac16ebafc0ff66d62fb47fdb3faf1e78fd8c85919b866068c77da3b8bb71b5cca94b8ef75061a119bf7f09e3633dd674fc99e61574993776c7bde49a8d07fa55bc0886289e9c3e57b680f6dccc25448fc214f47ee4579a5c720ff28e8a381de53ae8b3c81ae2b1d87bd99843e25dcfb874f2a0f57609f3140c2472b84dd3c60d2bb308981eed20523499634182f7d1a9c1ec240c05a55023a9ea4b6b1410c8c5586fa44be2efd4f71c510002f53a65d2a8981abd0435be9be4f4c2ab45b766edd46c3572d200548a57aa9f5b60e3c005f4794dbc7896e7fec8983a4b4aa0e512bd45c55647249a0f1f2a1182d823003fe732abc4a5769176926ca604a9e68edf9fecc34761369480011d1888795e08ffb61ed8947eaeb2edce38ec6788fe0df3b0559dae5ac79f7c2939dced9480828c284085277ff3ca61f1539373920efa956d21269e69ce0d3fbd23262918d67bd80f90aa8e62b72cb06aad02eb8b5ac88bf6e5f4afe87eb278692549df122febdfdad3eb2bae07aaec809309f5b77d78e48d1510317c9b4bb10a3ca89193cefd349e5511d3af3398e6767b9174215150d7a6593370ea57a6a3aff399730311821ed9e0bc31db32cf0906712ca190365f9e53006a4fa7bc50c023400cbbf1b75c9d853a9bb1d6f44d9d1c5814c6a7a22bbc5258efdcb6e503504172f01faf001751b85df952972404ff4910f83be69310391d0c0bc355350a08fd24d6f027f03c7573ac0302ee19aa4f74b3c8520cf2ea8732b3cb34e57cdbfdcef8c6dc8df023e4f4e8e5600080720b4035777af8414e2d0f2a68b1a8f4aa162373f66f86dcd86e0464ca751748367512ca6024b4dad27075346caad74aedd83d138283cd5fca3db7b6d4e5a3d2f2d255703775f96de2991d0b70b780e99693e3ce04805a61f4f2787e7c65a41aeee21b10204000364999a5b0745cede1fd790ce375b163dac13881ea82ff0519c6c0bd788ff73743f0258a23b77f8478fab5b9541b967801150dee13c0277a52bf72bc92af9752b449777cdf4406c767c35a88c70b24780c90f0d4546589e48e921ed83219581b3febe0dc829ad25d2a7834fd276dfd0f9b0d37f2b9fd66a5c2d5f88f8be0b8d6ca99c92051b0469157a9674d9dba8c14644253541004ec1c45a7cf92ed6573991ecc8a5aa46fce32e03b2aad4602c352ca55978eaf70c185df84765555ec56359c4022f944e45ef62046f4e8947307265b410d511e222c09e508b21acfb7878eb0028b5ba28e80621d0623f0f071cbbfd34ec577c01a86d5476e0942ed3996477eda6bff4a7f3a00a86855a41c0b7a9ace212da903cf177fd3eda5fee2a7c72d3ad6e2b029fa7606ad95f9d99d59ef461745747708b491065d8f487e871220d84482946e9052189cc08c9e87609f02f73b7df4f55580083c175be81a54421500f7a0900aa4887245583c5d3f7e944ec49c03fc54f786d1f2726c9301a0061bce1200043d3e84dd4a84cc0fac292e2a57c5669de0651a7737dc2545e1fde62bfcada181180ea42dc6f2a7ccaae04a3bae9421ccc33753a0031846245dee5cd0efbea31644f1cb9cd20afbe0d863215d677e15922da1eb68c591207baecdc72b5412a575a8a582d9a5c9d96465149f58b4fddabed531310b9bf525cf80035a71a33cac97e1b94a3a22ce5a1de0a2785cad6b75130223495adea0d21744fcfa7d07834571d24df2746b8b99226ed59ccf9ce7a7a5ef9c6da4a46b0b30204152476c04972c61dd3a3e15662591d898b74a9c2adf7703b123332cd98033d296e66357602aa7ccd71d15d2ec219a729f841dcc470271c655870cefc26295ff2024b5fce047b6c73bbe95c9330986be61f2a3b5bf42ff248fb240e2c8ab62c6e053073a22331c1681be4c4bf2096334303880b71fa157dad4a8c4dfb5a9a26381090ccc88e1b965fc07fec334bdeddd757f811c371c055d17435a2ea54dcdd7d074b595764e86912d390e032b5d6f7b8148afdfb56082872f130f73c4a6e8b9c3b18892a943ae1236284e0071f3d42c7810388d79e100a6973f37fd361c9162293b1ad01095f98e916fae29c8b474ddbc6f5126685d9f82de5ed9253f192db08916df1aa22220916b9f99f3ca644a8d3a37a82117fac298659dbd2238c40ecf8db5a32abe86ca85708a82680b1924fc35e46597359da0e95170704bc3934d56cd3df70f3c4a147b52666c8af2c8fbb6c3ecc89e2968f82549e0cb129e5b7d3e84c22ee9ea11788515938f29f313509eb4f0ecc7fe811e2e3124992503f04dc404b22932fe2d20ff850b1375d0c4d6defec09acc682a0e0f7495337905d751690448526ae6b3d29dad01be28d4fb71b13f119d2e2efa889de6779562caf1350a5b490ca018089ab8b2afe714efce1d16be675c2beeb0c737c66ef16ffe57b445ade53972837d6dc395b218882992ab26161a7e16149bf14cc0b8a695e1a7d8c8a9556010c61dfa2ae3debe28cd4910b1feb55779967f1602a312652b645d25191b7156b8f5ad98df762fb6db2a93013a8dfe0e8d887c7bfae7a6ffc1dcb74939b6feea4c422872dbe1bf40680870927f858cd730ad4f7dbe05a1f4786f3c79876288e4983bf5f74ba0eb99e8fcaa5eba2f8671cd07bf6b8855c180b43814112abafb9123f4f3bf8c30a5ab94367d43158017d730f1eaaa953e42b2d5b78a9a105950ef496c39bb14f60e6b7edcbbd1e1c42773e88e40ededee1bc63e1da4ac261213008e595b8f415b844075e9be3139d3c55bfa272af33dd8311b0cf39d311f3768501c9a0114c5f121608679c549cdd8d489f82814248ae87b3100c0ea20d84c582f18a02f1cc57ceb1ab37ab14d22e6378fb84260877017b6803bb92bc5d51ae7746691c13c3208926279228f3c18d2bfbcff9920b0f529a351e8c30cd5d67dcdb895cb9b50cc5d7a1f4de0f4f31b3bf1bdce2a4d8910c65b6c7a6d5e06c69e1a0111a285775f2c5135acce4bd7e88a7bf1919dced59136bbff20f127588fb6260a4f726e3b0c3a06c632355337b9fe1b75b54642cb5d9cbeabded56c39e99104c3d1713f16e4dbdf7574538c1c6bc9c02e69de3a0d301c307c10245364ff997cf38e2613dd040c859d968894b36c95aa6e2a3c3d9e605a6cb46cebe781af28de128e180b8579efb2229d81c0158cb49e5a19552ed674563d547d670947e2780ab93bd6592e104cada385975a7c276d3fc53239609ed20ffa9f30dcee660bb2213d0c4563537b4d7978d195d00ca958aa2057d82dd4ef7a82dad7dcbfc90f1cf5cc86c611547fc2ebf5e52068de83544fff5943528c9308a179be0f38c4cecd02d84a2b6dfb2de1f45faf39d5907c2d8c8a80e7b5dfad031e00ea099ddc9ab6117013baac473f903dc0b3c1e2c0c6d5affd986c4d6f751b8764cd850193080c88c447530dad43dd8ba4adf14b808b873f21519e0fb16667b84f1cffb7a06b93ada07e87356adfb0810a8cd51c5993821ca0c36c465ee1be95712e6077740284ab7d1a991845e84c31eabeab20ed768001bb025b83ecc93a30bc914db1a6b222f171134224f864abceefe305f65f077ba7601211ee712e3a60ecfc2788636c19f1adf281d3a0ef25102f6b19a917d6ff666c6b1bfc32554f2184f57f9568d3c21c5813f0f509abcda616b1359f24633c433808c0806491e6c8abd0591f475cd8e71a24e37c59d5cd43b3858c2e30d51336d9f4db80927bd9cb28f6dc223db5d502cb02f028e403968c9d3f5b047874216bf971a6b52770b1615522bc5526373dc6439c979fcab1af3a8cfa54c765a5dc1b4d2df59ca2c33c0372345cc054fa8ac8445d405b2a4a14f19f117a87d55af881b958633e881c5e76ccbc34dff6d34e1b4aa846d61dd015fdfe136edbf7e09f052e87cec1ead11244a0dcb991368a6e4756aba1529597fade59b3687749e2860b03232459dca2d3c92e910a9da827ef3c7c142ae8b5c69f250313205c2d79198bac74921c628a3c53956e6567c850401276ba1b10f1d4d9fa2e2e45064b337a061d00dec12e9be4fd38710888e84cd14315416293c1e3a5c45fc518cbbd8c7e8d671d1dc017260465ae1fd74e8a104bd17f55e73a9ada5b6f2e04c5ea649e70aa3e62a16a7fee2cc84b91ce52d120003c253333512b27a759e071a71ea83b3c7b398f2438d94d0a87009e95ea39235bffdb93f39ab103f223bea7e344d93c993ab876622f64e3a9d9959f3ae226cfbf0191425ff1e1369f0bd5e5f6796e5e79b05d7c468e244bb64df2dd2efd5903f52aa2d20b1f6ca3848fa0bb2723a3d667f938e39a962467b4c1fd244b6ce1b1c6e233aef8bf3241be60654d4845bf647884b04fe95887419b05ac52a50119941f558ef8acb8bfcbf551a1b701abf22bd429ab4159a18544cb087d56d965d843fa7605708a530dba720948274e0e4832a16f702ab085b0ccc579bf5751f11d9b79703379b724060873c354daed4d1f202e5e4a93ed1d4605bb354c7098e62da42d9e310e36118a114b4b7cb3825c217433bfb2e7b365fca33172931e87008fff67281fef44cd51c50b521f96b31466efd875abe16df60565706825d19e01726ca2ca8a38832877311ced05c3c984055035489b61db3be778a3b2fa957aeca1e02c77e441b846e8157dd7c3a9473b417f9acd485bd4bcdaac6efa95bdf860f58fdf20c371e2e6588495feb8cbefd40070b803093de39acb6f0f8ffbf635f9726b7d00c0843c820ee5a3616eac5682e3ba9849a1105f2ac397b8bc069e4865fc684b1dfd9bc196c3ad3844621984dadb3c234c837ab7817a82afdf0c9ade0dc82fc122ba4f2cf362d8659def46b17abde8688131f348a38bbcb1e9bb4fc56527c0e1e0715fd647aae900b4b545c91fdce3585746ed28eb63118d97f12fd2de27dcdb3af9cdf7d9a9fa76d95f866db3080bce0d03e1fc3a3210cbc1bfcd85a476a284b2e3aa09df8867421f6fbbbc308ae9ff57bec3d3f9a9557b0ae4cbeba512e37995735835503e575b3377525c49e6b3f44817b5ed512adc67e3fc628fda51dabba0826fdbba6a50ff0744b79be02f60d970079e091fc3125dae2b33a715768ac086f5e1af094d0ff0da8c90e8b13f89cfa957eaa070c670472617e4c375aaff72fa8778f7ec1a5b01517cea954df2f5f0e68625a8a81321ff8a281a9c1f05e342d04cb68c226214bb8e35df9148403f3f0037c6ee409af52f8b3ecef4db6ccca091067ffd49e51b8cd6a36e282e836f510a6d7d2ab01a9ec66415e5597821119a733fd4c4ef7453558fad6fd6ce8b3b304350fd1680bcfa9f2bc1460c517ac8e3f5a9ff5a2061f331008024e940a9dbe8284b54ef680c041a604cad00cb6ad612d884a3dbb060e3d073d7ef04065f527089cbc82e78bd2e09fac2edb73ac0c9e918743934021b71049f273c68585515086f664e8ae8e7b4e10dbd0c52be3150108dd3adc932181880a4638b00bfbe79b6cf187433fc15978300d932d423e4c1a517f013f8a05d810dd7e1bb4d653e32ce66fd806bf3bb69bf58c7faef574e92441e047a567abe616811d8cfc4daf339321cef0340a12b0478786fceec080c81ffe793e9b8c3350a6358fc1c8568729d8b090051e410638612ea1ab3647a4ddb02bc69b5221949c3eae8c59cf8a98ef59cda51f4ab534b96d7fd2e50cc8bad0fb48844ddcfc471c042e4100c9c9f64e819b0de17d93db19df97527cfee5edc3ba2c0600dde134204462b6ac9493b8e283073a5ad8404c4f3603033f074c93032b4fb4544a7aea733486dc3ecfc1c2fff68614dbcf5cc6ae6b8e992821ce1eec0deec6aef1a799ff1a3a400967ff9c49f82816abb3ea3ecefba0a8fe2add845a3dcad98fbf31283397e8b39f4d39f657579b3d0e6f4fbe3285a132c1139bee9d8237951d774dd03642b2799314983638fb3f9e6b6cc557c3f3f8e9f5d8b656bd37ba1ad7fb6cfa9002494cfc4885058edfff1eab23b26c14c7a73e1efb5a64c35f034632f8a07f4bdecaec6b94962734370249615a40392c60415d3af7b9e0068a831b3c08cffde1448548173c7334354afce53a088f7f46f97f87e0822ced76f366a12da85ca09297835eae38ad9ab350ae37ec42a2ba8172837b82817a278be2da1745f14fa417f27520e9e24a02fd89d1cdb6b9ff4f543b74f8eebef09734a51c4124e7dbafa54641eb76bdd725a7cb1d9eb78297f3642118624497f1d4916e2b15dbd0d51a29918f9bad81a2becb2489e1b0155b77cd3201fef1d8d57dacf6590fbcac23bf8f34e76ac726ff37d7cbb727e587f1e20d8149aa515a12832926d4c704de40fcbba8498b6bc36bc2a3c8a50e60ddabc6d97e58cf2b30947631e3353391dfe6acae0c4c30cccd3eb34c3c8e4ad7201579591d8547f4f6a130d13ef3dba52812925be8deb2099d0e1288f4216bd2c40d10dbaf46bf8a3269c7a83","title":"997. 找到小镇的法官","link":"https://leetcode-cn.com/problems/find-the-town-judge/","question_id":1039,"issue_number":32},"30":{"day":30,"pres":["图的遍历","DFS"],"tags":["图"],"whys":null,"difficulty":"- 中等","description":"```\n给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组。\n\n每个人都可能不喜欢其他人,那么他们不应该属于同一组。\n\n形式上,如果 dislikes[i] = [a, b],表示不允许将编号为 a 和 b 的人归入同一组。\n\n当可以用这种方法将每个人分进两组时,返回 true;否则返回 false。\n\n \n\n示例 1:\n\n输入:N = 4, dislikes = [[1,2],[1,3],[2,4]]\n输出:true\n解释:group1 [1,4], group2 [2,3]\n示例 2:\n\n输入:N = 3, dislikes = [[1,2],[1,3],[2,3]]\n输出:false\n示例 3:\n\n输入:N = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]]\n输出:false\n \n\n提示:\n\n1 <= N <= 2000\n0 <= dislikes.length <= 10000\ndislikes[i].length == 2\n1 <= dislikes[i][j] <= N\ndislikes[i][0] < dislikes[i][1]\n对于dislikes[i] == dislikes[j] 不存在 i != j\n\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2b9c123385f0604131437a5b7c0854a288274be8fc0a0d03b4520385a146af371c9dda651bd4b838f921b4efb022fe70696a969bd1e10621cea0848e126f38f76e8f96ad09d336b035cff5b7a599502dc1460bdfd86d69b8c5872d2a063b9139ccf6eb2099c07ee7d80ca8109f6e8cd71a4d3a522d145b0c0fb34cc637bd727b08b160252c61ccfa1e5fe833399bc8bfb381a06847e88b0b7794c743742409a8e6e77b063361940cea5e5bf5041c598f58ff525cc862cc917416837f2b739d14cf77542e9b8c08548acb35137091bfa8d13b7a4d31a8956f1abae5fcdb9c2b5234c4c6a9483f4679a56a403142e1f20ee48ae9c448c8197d1e57e5323f789a86846ca31efe19919f982fe8d779f61b24aedb72c1bbc945b656151bf02b7d89cf163d725900958717b0f71ed44cf54966e0d52c6e2a5a1f2f820f41098c0d3c1e5d010c3510ad54e24a518d554ef48febdb74bc8279d959585e0e5863b8952aa5ae28d11820605a64e6fb6960de171221d7800a4fbba74b0ea1755eb06920db473e95c68712e68d2a62e1ddb72d5d8be92b55146ca566a7c37743bbb2916ca9d6d1bbfe40b654436160dd0e53ece3bb4ffccf8e429d101ca67e0a72073106599b79c0dfdbb3838b4f4907b3fbaed340c052071898e13d8691fc600c39ef4e4b3673f3b8dc0264716caed375c652c4c57b2ba3f5c036d3b26816c8c688f75b6a9abd3b59e3ca61be8b074776343511a526536052516414f7deb305426b2faaa3e784859f5fd573626f240947c953577e61c2216a1e24b6792a747f4192755eb563960dd990309f427c9e9130069dc41524ebd60c09741861520263e0e43d07c6116ba29ec05236602aa57128797f4c38e6863809a71d1377a983af01dd023911d3b9910bd06ee44e867e70de0b0304b25b9ba305abe766eca49a813c12751e14d3fb50b37ba8e08a72e93d0d1738dff7897f541d44fa37b2a80c4605e63f3807de8db4d7038dfc121d86f85649c47017e341b2dee7b94942b099d9fd8914a326601ee173c5c4eea85863e00d4b6b895a1414a5d90883e651e04573f3a63e926b81bf9f55877325f6b56116e8d41db1b044bcafd18a32c74fd32ef26b8244fdc5670840cbdbdf141e1250f889d6ede8fa91a2df836b0d4d95b4ea68230bd335cff3da88992561bb72dfba18936681744659635f3b4431f00fc106174e7aa85a26527ef2c92404a83fd564bf24c0ad33923240c440eca01e27d524735fcdf19a0e6a5c3593a3fc700871b0f0d6b2aee22dfa3a37aade3ab03ed9c87d02bf5f400ede06f7b35f0b3f1c47b48e2719a260cf1f3f89ee1649dcfad83f1040417721630d4ec48fa493d0d6815ff43213bc7894541a16d7a581ce8fb95a3a98837fa8aafc3a1011cdf1e40838e3a49fd27366bdbc7c2e86bcaf8f64688911af6b6bd5682542436db2a0289b598455adffc1bf9370c21786547e8ad57f249bb16e0eded0681ab8c3f098f272e47573693cc38576e5324d63d39b6ad47771d6b9fd4bdf0d081355aa1847ec63a9a848c5ec3dd087e91fa73a587e617d64d8c1e975e3f45a426e57ae0d730dd40d7353f1f88c38fb0a1b341645d6c3b8e232dcb7ca196262897dbd70b3e8f6985e16a00b44930e527c2c16032bd1ec12ecacf06505427abc830acce21774345b0d8dcb9410c285217f859e0a8d24214e7e898216cf6835f37ac8b50bac68391c658d56f836fe6bff4a5de62455d6cde5a5d3b637149b798731a4d096ec517c6a96553448bc72e3ba86336be6f16c04ecf07ed79fa9577ce64c5b621d6aceabfda87c23967e072f7a2f09ff4f38e60a914f200d4185d9b12d2f2e1404c6dda02c4e1dad81ac6d8464a9110b3b82cfa081dbe68e6da0cad564e326b951dc3894399747e2e0adf2e7640b9869e6e0b81cd6faf7178fbf0e5ecc63a52f53e5014fd031a69db24c79ce6b669bfbefcee239b40d8d5ddf3fc7e01035d09bab8ecf4e39a58872f6108f69c327634b8da1ed5f1dbb46defd9510b2ccc72e85920b9c55a4e96c90d2d13d42cb7f54122ce340b4832a57c900cb4ffa6a033ce4106dd5b3cee0abc656503dfbc2a3a0e7456b0008c8c5756e9944e3edfffd36450026c13b5ae8a99a16b52238bca0db312a3e872bdb28aa75653bce7c0e940bd78a1b18ffad73ed0a33873ef3dfb0a7a8553852ff55b372f49c254178fe38594d0c213b5c1c6cae07ddbbb83dcc79d111b346fdc3f08cadab92793c7a94cf732661d1730869f2dc47f6d3078aed8de165b376ea8d1a8ec057f3d75ea0e26d5e5cf86578e093e56f78f9796db291400995ff5dd751edc9d7c7e2cc4481512fe059147e64db338725fdf6bb04c91ef600a66a8aba0bb58da6472e698353e50e617a36e84eb22b1a81c68071be6bd4dcf7d613aad05010b6a35f68081cdb67fd6b01fbc0aab88d10d43527b1c9382c0b0a77e60835d79da68bdce7eaa412b6fe2b275de4b1c7394384eed56cd94bae1f412436cd4ce50cc21041e8f5463ab111e0affa361b485798873a9bb1104cfc90136a17db94ab2587d5e48287ad935f70d9f4687aeb3e6c13ae1a816cf196a379b5f96cfa6c55adb8d997a50ad4e49feb346c94ede223d7ac8f3acea01919ad00e1092594f9152f65c23512e8228e7e49467b02452536ae6032193cf4a870ba908efdb8953eac99b9f9c7e54c74e48ad384e933f5001840f4042aca3f4518a9a1c54ec5ac715129cfafae61bacc3d2a7f99c50a1a0eff68179d7e4b5c6a755e53af80a3a60eeb7a39d89c85085c765c277a7488119ee87e75bf9393c11fa53e069ce1fc8bccd7c178013d8d9b7b1b79b3b82dbf60be5627b312395434dbc4d3dda56181ac67cb65a365419d16d849a8e88cdbcf0d3a7c05424cc242d49035d4e532e3c1b22fdb700be3658e9da60af327cace4688a0c5e1f79b0a79d7bbae365ad2300b5a183ccbe2e7ad99c158e7e95f61c22346d3648dd01b395830d3f47b7f4566587b3e4a453ba30d992ecc5fc70a69d3dd865a1c7501382747ba330cfed1fb93422fd1008ce674e132e3789e3a43db64729e4e6816918c9f66d70d116df68b8a54d843d8477cb8449918da4322d16414f17859500fa89389f7ff9d2e9274e8150d73633ef06ccb5157e335dfddc87814a04a290e00cc0a0cca48458da7d5f872a604a2ea0a97348ca7acb772e4f87cca85f91724c2ed02bfce1d57d1c3b9faf68d22bc803a6638ed72dd089198f8dd9e95480e624d091815fdcd39ee42d8d787577245965e532fafcbd5caf3efc28601248d3e91f53e41c955925a507b9e5a55c4da4be5c2ce38c533fe88e8b2b197e7954bc09e32c69a6642168265ed4755a7aa4801462d81eb7582b439baa453b942543b1c5dd694c148cf2305b9b6d3e0e7f0ee062da0b112018d0ac5cbb208745a483d829605c8ce247fad3527858b338841a590a6c55c5b908a84b072f0765cc35c077607468698268c52acf7043deee2abb3b5d5f96bc3fc898bffea9bfce4d23901edf12178ae22506ba8b478d8c29bf1a7385bc4a84771e5445af60568e1ed1c75de014bb38cf692db0b7645fd8e38a44a6c389ee228b772a8941d47e26302facdf58797cf740d6aae9b7a8de2f31717c8a1f815d08565aa6b4a74881a461b7ec1c871d0345ebf476c3a4007c62a2c35b4d392cddeb569f1ff16b50ac7fc384249c32c596975b016a0eefc7b95ea382797c0e17099c0039694d50b00a4ae62f09fbb8c5ef0208fb05bc3cb8a4ac9dd7107243a330f0e4628f94bf20981818af227de7f9d11aac1eaa3ee394434c74488659993abe958816edb9a67a9a9b14b22df03a9c1566d723d777ae167848ce019e8aa2318b7cf55076b7110210359e81481abc357cbe52547505d48454e1704eeb7117fcd25121d5e0785bf3959aa8898cb7fb705f53d5bd65dab6d04d0656abdc57225acd981b674a12f979909978f671c494e50f50a29b21ce8d695f72367fe0c8a70f7a60ce339781b48c4c463e0ed27ede26b1a6ae33822a6ef3c99073b0277ea2e7a250f91166decbdddbc5cb63a8758ef782b2b99e38ab04203b3d62ef43f94d783bc89c996921b545414327528503eeef35ca39b334aff60c1a7cf41649092bc2d34dc5058418b3fa8d55236602a7b5e44ae80f8c851b7ee35ce3fff31c5ac2685cb294f8bdfe66d6f7e7337743e21d28ec994d0539bc887038facd5d59ab7523f2723f907b92ec522fb13153b548cad333f132ff52dec3e2ab4ea8fd2fd6ba6f66f7c231c2283670a80a37bcfd8ed583d05977ae53c9644bc7ec66425b9a164c9c8654d1d8f67ad246fbeb6dde5b290741e89383a20475edfb387955925408d589a7aa699d2299f3744e1adaf5876c6715f52ea51223b2d44642b4c2406b9a1e6a9c64c2681ecef73bffe344aca546cf7e719745a3141027cdeeb6142389e8581e7dbb2ea26275a2392b70b1c12ad188be718c00952edb1cce84aad4e0c3df4695b8e2f725d7200298540b950d1048e1f85528f442c3c38021c2b89d19221eff1918d31b09497174f4a27a916e43efdffa7950b56b1f4a5899e2c9cb43ac0b9ed2f61ce67355290e3e48cba282eb48e2881c48a44d27c5f9ff04a0a767c942326a82237a4282bf5dd470db6a659b57a379265ca59460f6517a9a6e2f3216eb04e73f29e4678ea22e61589d6aeeef5674a09e9bf46515cdd857de224222373318110d477e622b079937321e5338e926463bc431582ae3c861ac7f538eb736193de35febfff3b4f6deb07538f8fde99a572e7de4bd87e8e718b6020a6416c5e1d33954abc92c0c84c7137edaf30374afda818e37beb839412208b1253c7abb06a04ff98ec8eb63c19c421232fb20ffcf286c6942aa4d9239feefd4d20ebd4517bbc9084fd825cf7a8e0f2531c88836e81d347e32b436f4c5fa0cd7355987eb693be9e235f45b3d4c80ec9a30f3cb2aa3498443a5a37e9ffd3c2d46a51df6e4bb6821bbc83431d0f0d7668618e9d68056ff531cc0c14f53ca3222909e17bbf4983af09aa16a824b38e75940f6e1ad1f6faa112efd3f8fcdbeedab9a47046a3301e8ae7998f726f0c369fbda8a2a451f4bfe65b77983e02831875e5cc3280bccde4e487adc4ada25d444ad214faee691cd87f818935d089ac96c2c91201f5dc86875f107fdee1f5b02163928c700bb90a4b15ded258bb30ea1925c6819240fe0a2121d10a938425af19d5987665aaa0aeaedfdcbd131e69a54bce4a3f569788c82947915bba6bea270e0c492730706c0646406ffaea60ac225e8944d773c183c7e0da24ad790033376085681a7ac1f4a676894b8f1fa90611e4e5f13fc0f9349e44a6f87bc181098fd5d8c210459c48af468a91302c4684e691b5e2fa7c6ce8a0ef4711ee03623822164a9d540ac9423a664c617e7a71ead0679bd6eb76ec70121003f272ab90ba8404e6031e6cd92f5e19f37630496ceffc3d95370803dbadf281d3e4aa255f392d42e011c7fc26603919e232514e62cab62ad973d3c4430c53d6f54ae481e944bd35aa077916433808c0806491e68be4df59185a73eac85f75a26b5fd6cc6a89f8f12e3bc8133bc8a9bed29231d98266f68e6373f29049ea5ea4569f51d3c0dc6b124b360f30168771e9e1742de3001022f914657f729256f3c5b5cab1af3a8cfa1d8931a592547b20f5c6f08f7d50237d21bb1e878ad5591b1e13004255a4cb5e7c879e0ca881a3582071dd1b4c7fa5f37890a480355137f371cb1d935ab1b14174f1f7e09f4c6887c68abc811c17e59ff6df728a735a04e6bb0ad6d0f3b856b0447963ff864055732a1f95f0809d35bb0a9da86ea93c3f5b3b8de795e46f7e133d417f2c4d9fb07e925f3cc51600d0222334a64b08301ba81a0093f2b3ca610145105d2550665140939a7dbbebb47d1747d0e42cef0b5d2a2f939aadf0891d804a96bdc2548d6d1d7d905674176dfa11cb55c7344fcf576db647c7da0f3d7b57919221c025982227816d78e506b905c48310d0371b1675766f283424b91cc471b91b903a316835c07730cc5d088258d7b4be39625ba7d7c7e586b11bb268a0def944f63a843d971a683365d6b497dce209ae71c2c053814c49b5b51c940bc4ecf83f271272ea0c2515a4394b8b79b0a026b41623a638edc54f1129ea85c9f2ae3b31b58a00f01ee39a962467f78eb3775c23f5fe89b176f7bf81592cc3714f236245bf2737cae31be947c80e9b01e415a27a41a7043bc7abe0f1b7c1f305dfcc58d6f920cf03ab4159a1c64ccc077965fa59d543e14d780b957900ba253b1a3a46532766a1267037b094abcc8c79a30d03fe56d309397a7db76e517332c35993ba30177e611a2ec796543b05a628513699b420ed3cde7f554e50c4560e4312e8dd2274267dbffbfc9965fca3312ff058871eeab3282809c058e21fd81b4314bcaf4108afd67ad5cb54f21f627e4f2cc6d35c0a07b2c2c67281317a540df24890d388760e751da1218e5fe72389b2fa957abcf4a2603ea741f108ee506fcbdfa32d0844748c802b1580bc94a06eb3dbbbc649dba09174e576e4f77bae8e94f8e1c5b77000b8600f37f2fb9c450c80eefb31a945287f04c4d775bf15d2b8352ce309ffa3ba9849a110096f80c3b1a148c8056fe673627cb490d1cf98ad455f1c4bd1898f636654fd35e59d33ccfbc10ce59d428429dd25a13d7cbb20d16899b017a107a6c22ace7ebf48f3c4efe2a0f903c9493a90f9b23816c74aa2e273ec860ae351d0e30e1205b967b97f47c8dfae23cf9720c6f47d9ad0dd9de0a93a9014c33eba220bce000ef9996f7c44b099c2d6afc376bf84e4a6e95dcdf07b145a2ceff36296e6fe51a0d592f9f44e180af9cbfabe12aa79cf3c4435537d090e606a591615b2a7d84853b5f7516e9534afb529cac01ef0b3e3cd3a95ee1119d92d59aa9bae2f6dd9610e9e5235a46919d53b4ea718769bbd88a5b4fc416008e5cc95d6ac8335decfa457fba96bec70472617e49e5faaff72fa871f8ca83c607c5171ea8430fca5f7f09a0fb8a75067e6d5790ae11f08be79847ddccc62483eb184f05b61a4fd9dfa9ab10346e62308d0cd7bb68d1fea48f69a45ef2a813fe7524526c2af971cbac297aed2879a2089c66430f2594d091cb74cf5697730ee1325a0d1c309015fb0fcc0cff1d10437292879bb71673f77a295d2e79954b0659c394e8920c36af1947ca5c7d42384c4ca99baf82c1bb0e67cb51e633b1e51fc215be11140b6c2c4c40d81839c7a28a77206fdf1ebbd22ccd4fe2630146411413840d7747866105e5c17226a16c9b6aaf8c64ef54913ea3e4f44cc91b09a7d544dd4bf699158b9b534a0c2157333ee3f5f248a1c985ce4502c26eb1582160223f99d384157e4e6f98837896d2faf6f40e26c80021126c0dd5e718fa1aac5bb3aa789eef1c7cfc1eb26330fca0c0ce46e0b11372b8be14b428fbcd79da9a183211c1557fc0db12e2acfc74f83821ac3d63fd46a8d76f4eb8901f729e531afcfbd05133b547f6c753a04223194607eeba62c733884d80a2b0c912b0e1af7e500ea45867cbac90c47e4509e0921d453c44409389fa73232ea7fae7a6686871cc5d497cae8ca6b8cbf09edbee560221dc24977a6dedf60bc2eb98e597c9aa22d2921f5c4ef0b7352dbb446aec9fc320675aa115b694261881a2448271df8258cad35657a079b54e3424441714dbc5ea04865280be205155c4dc11e350d3a3d488646bdc44cb743150cd0b0fc565d252e6c02a7d8c9e58af23a0a6fadbff966b367a7396d62dc652acc27cab362215a5180b1fbf06f0f822380f76933f5a405b8ce8c4f239db1a6b76156cdfff8a0e94b4092152d20aad0eefc1469e87176349a1bf9baa028045219e49a99fcd9729f7d91485da37bcbbf54d70070a028f656307900aaeaca2ff402f190c43636c44e577b6ff75226e3c0bf274395c6f4a010406485fcedff21015c4a0397c649d81c83c93fefe9ab1aa1dd0ed374ba2775681cf9547d26621e9c318d2dd18413df469cfcd243ad676d6167ccf79ddd28ff36047f42c7c3df6def21f6f0e00d1c55e6e293c4c8f40decf2f6c3c9bc2d2dfe77a799327aef7a0e0494f64921bf4a95e88433910ba3a50c87438a5a6dc558223d55954f7886bb36a4d771dd8e35e5b5deb0feac0ac70d34a13cbe9b57e9cbfeb80a9a385f0864250ed71ebcc072de44e36704bb584b1f362e898fabeab7abfaa33fa6130a3602c03549288441065c15d38db4172946def76540513920b421ee4297293fac82b36d85d2a46bc25b13a27101844bbabb2debf7768059a95bbdc9e4995295c160cd7a04bacf0a4d0f9e55a8a76529a0cd85e700c97165b0abc82e07e94e51d843d39909d25f584b3c4421489bd3a0f0cba5e43f231a669d0d004923b802ff509431a5e6679657bb148e709af289259f82493ebebbe3ff617835c8e83f0419c1b0397b2ea1e280a82cc6c673d1af4c1dd893e0829af9f57171f62e887a9d214bd82b0a5232453ba1d90a4f82eb8aaa8320bf5e52181244791bc52856773e254a613665dc37358a098e922886ee2792e6ab513c46bbf50d6f7ef27a39f6f5448c8091bb944cfc3f035faa44c6770a7b5588f4d4c9950d681d3781dcf9510e6b39ffc73774d71c3f98262028fdb280d1b39a7af8d87382d12173d57b9bb12993e37943d8713ba39bf8e868ec82dcd02fc0067e6b7d1f44e40e11c8b12b52fa45185f39a34841125d1bc95a7fca064acf905b8e9a1cb3b65280d16d36fc65e9ffe33ff051e36644bea00ee206bab0f15c3f0d471bf8940cdb7ab2f11467cc67b63f21c58492d6f33363be54cd9f64141027590f20ce190faa33fce49b79c09e25a691f6df521de71d13ac3cfddeb05e7afa69c026998a09cc65228a58e22813d80d97e481935757b2ad4bf4b04e1c1dd9e3c29182faeba7ee9a8bcbca092b873b548c0998c673a2dac3436c876458e9616fb52c153ac7c2db555fb58e127a6fc5087aa1464dca3aaa200dd704c2a6c78168c676afa2714c0fab5fd91b126ac6329bd74edad0c92d1335a2e38a9a1beaa810816e0ab1df28ca67bd21b3db7c1d587a311c3e6e08feb52e11eac751ca3ab8a138bb2f5844470c4e915391309ff5a75f505413b1959703b129cbdfaad09f79decdc73386e81a77359167040427333962bb1d2db689c2b287eaf1e99ab99d8f325847ea678037bb741023bbab602d14d8c5797e442ca0de6d21e4b322aaec14e4798ef90fa0dc3957d3f027c9108da47d5a4743f2e66b3703003f749d77ee290df11ff6f7bd30a7480d11826d329c01913a25c51a8ccab2d7cb98f475ce0c8c8718df49d78624f70c11a6d359d109779857ae9278fea16e21472400cafc47a85c074fc57b630d0e796e689ec3a0ff3981a24686680cabf3f8dff403ce7ace3f3367242581cd623ed85f368b4d043699b531971d54e3d4683849104a61370707c6603c289e6511366ecc4b5d626a0a1d574daef8ac4ac415a7b4c935f93ed93b059454a4f411aab0f35d09f94481f2915a277200989816e850d11fdb9a100a0b32c7bc23222e2cd8c91976e838d440ae06d47a3dfb9e25ac16ae30b3cbdcb8266351c583a4146dae55541d732ed0e25f99b752fae699968e352568c0fe72d4ffa4d6b5d252ade46fee920c4b904dc255fc5dece7416760310358f728ecc1d3be4ca8e3b43fdc3bce11988ee03728a56cc742d888c4841af4e3d5e4ef02b56331a12634058af3c7247045ba784dff90ad92f8a4d1236c9b18f584ad647d10cad60b8bf6f5563656f0f554a8fa1272a2fd0cb8973c51f46217aed3835b941c1db93964c7d781c2513891574e38728e32be838395eddae1998e86fac19e3a9286b8d0d6b04da98382703e4228967168c8c84d51e1666743f1b384d85f24afb864a5e4acf1926812f8759e779f822e734ea4529c9eea6dfd1d871cda737d712726e05955170efda1c39939e024da57ef00693f445ce190dc58d989935fd9abb4c7834292e10c3fd1da1d1b7dc4687af69c022eed28977b98cb2ff76ff38946a10c61727227d2286d878bafe52b8c0490baab14d7fa64886e371b9e8568963af5cc8c0d0673d773fb1e0fe24ee940b7c129710b6b80e88960ffc746009d8a51119c9a765586fe336d61d9392728f2c37d9108728b5c1578a408e11853b0f020dfffb448567df4d749991117aacc78ed0191704ddbf03a577a085fa12da2020becec2d0b48f35ddd65befe37b5ae24a0b3a56a552e9eb7c6e5149178b2b723b64241edaefc90b1b8bb710642f7f019b09fc0c8a0a6149d93967203f16e695f6b6396cbf6719259249688a64a1e1aeb9c385bbac38dae6111d575c4b7746d176fb862428ae5917e52441912d4dfe4748978939689a2a9db0c9be945695093aaf1a4ab19bd158aef2b507e4b79c447de37dd2d2f6c469d917a868d4c22cc0097c083fc2c3895f3a6030ea4eddb7dd6eb701e563215bfb3fc718294dc8c4a609b77ef1fa67efdbd7bf96cc131951ce0b4bd6dfe48c736309bd39ce62ef8013a9364d4f6e88f6fc65657c7a88ecbe4607f2876ebc4e8d7b101a5fb3fbdb51cd256b5fa9c6c4764375299cf3be3a6821f3872addfdff658d3518bda85442d463a154196f0775053ee0f261aa0dfc38d72f5ef7432038dedaf0f1462ced2ae3507c24ebaec324a6e04413d53b3fbdebc93f10e29f74db0ad631886b4f22be96fa3fde7009171a4002cc7200742f89a3d2d50b585c1a1b05c6653c515e4368092a11f18104de03c4f11459ff9c846ba161ea1e3da5eb012583fb76f41962f87e96633ff36a9ccc4ee9c8ffccd0417d89ac1c8a0216c5a683e5d39180bc5e109c4a51dc0d972aa532b8693b93115de1325ac530ff2b37ae295b10abc7bad9a26a1a28dca1561e78f3a96ebbbc117cea4b9fa39357605cdd50c0cd7e6ec3dbf5af48e1dbf337b979f17db2640052485775c9a69dc3986a8a4438e0c1a48241f16561de0b126e573f66d0288413bf313fd667bd057a84b3ab43bd9059bf691109da8b927ff5fe8f562a156debf91d5faa1561e1f7c92b6cfc54636fe97347ccc0362ffce848af8bfb1e3589b933545102a1c60a9831f03ce4d2c5fb8cc88e280d0e5ff5315423a7cb0fe19d5e5416229f3e298629e03872798bccea9eea1ac5d8dd4d2a4ccf366c1066aac23d46bf8a09b6d93dd147873c29787a215e32732694f2a3f3f60d82863fc8eae9df8becd41d90a9361e77755814938d3e3764b706efb47d2b39db4de442fd3a5062558e525f1405304ab9802c81faf932772c0689252a55148f06528bfc6bb136e9cd87fcae9f19a1c2ed6c5af63545d168c1c7fcc2293dc6fe6269e1671912c87a9f6098617abbd10d690f6b67f88df8375d54881945a96870f3b60a01a870a9e879c9695f75714659311e286ce1d8f48d2a966a3fd6ba600866c520057d70009","title":"886. 可能的二分法","link":"https://leetcode-cn.com/problems/possible-bipartition/","question_id":922,"issue_number":33},"31":{"day":31,"pres":["图论","拓扑排序","BFS & DFS"],"tags":["图"],"whys":null,"difficulty":"- 困难","description":"```\n\n公司共有 n 个项目和  m 个小组,每个项目要不无人接手,要不就由 m 个小组之一负责。\n\ngroup[i] 表示第 i 个项目所属的小组,如果这个项目目前无人接手,那么 group[i] 就等于 -1。(项目和小组都是从零开始编号的)小组可能存在没有接手任何项目的情况。\n\n请你帮忙按要求安排这些项目的进度,并返回排序后的项目列表:\n\n同一小组的项目,排序后在列表中彼此相邻。\n项目之间存在一定的依赖关系,我们用一个列表 beforeItems 来表示,其中 beforeItems[i] 表示在进行第 i 个项目前(位于第 i 个项目左侧)应该完成的所有项目。\n如果存在多个解决方案,只需要返回其中任意一个即可。如果没有合适的解决方案,就请返回一个 空列表 。\n\n \n\n示例 1:\n```\n\n![](https://p.ipic.vip/nrmqt5.jpg)\n\n```\n输入:n = 8, m = 2, group = [-1,-1,1,0,0,1,0,-1], beforeItems = [[],[6],[5],[6],[3,6],[],[],[]]\n输出:[6,3,4,1,5,2,0,7]\n示例 2:\n\n输入:n = 8, m = 2, group = [-1,-1,1,0,0,1,0,-1], beforeItems = [[],[6],[5],[6],[3],[],[4],[]]\n输出:[]\n解释:与示例 1 大致相同,但是在排序后的列表中,4 必须放在 6 的前面。\n \n\n提示:\n\n1 <= m <= n <= 3 * 104\ngroup.length == beforeItems.length == n\n-1 <= group[i] <= m - 1\n0 <= beforeItems[i].length <= n - 1\n0 <= beforeItems[i][j] <= n - 1\ni != beforeItems[i][j]\nbeforeItems[i] 不含重复元素\n\n```","content":"096221cf5b628be1e73e8bcfe626c734748523970a3d4cb45609426e2012476b209e2dc8c9066ecde89f32f426e3ac57af2400c3906714dff32ff523fffaef2ef2326f68889bd2fc1b378fac9d98506c7ae664cb93b3038b24aa68dce2b0bc885a36c60766f89f2b3934097bafdfcbb47bc50b435109b080f7254a0c88279c4f99db1d7dd7e3c9b69b48c7f62dd068dd76166abc105c2a14882c663dacbabf525b2a743420a3f944e5266b70ea5f1c5e03abdef978061b68ab33ea7b5ef7133954964bfc7348c54ccb9d730081533071a321cc5d562da288007282c72b367392b6aee10897d3662777ab46a8aba3d1fa4f5455afd0ca2f3a22299c103e1907aed0696b366a0db159d39c98b649331c73999bb66fb424d80254b98046b5c704bf0d66d0c40aac81a211b83d6b27957c49ea971250c4df008ea71492e412d35ffe4d40ecd2176f2f68d8d04599a4ed01ffefa18ee6ca869510bc45858f5c5370db83f3fb51b85fef0ea1cd80e6edede5c02bc4e41da34721151ef16d3888c2d43916e814190a4e91a66338a17843b25701d7540f97e6a811e6872079d532014805bf87434666328f36d4f11b139edcd351c0a7d3d9a85afc0c463a2aff720edaafe747b8a19423c4055df853662d386c7552e12ced8e83bcc8f74bed95420b2eba49b83715b477810bd9cad525721f61cd95c3e61ad2b426ef9d1f8c3cd1a810f0b32d1f1a209511a019db19edfb8ae87a6d99bc90c37805e91e4eda98ede7c89f5bcb95d3e0ef85aa3e7c60ce83deea38472c441956e31fc6c92f75263844e35d527752eb9f9e9ed13932191f51f920656bf662d6461d9c22fdc24f7693c36a389fcd3301a4c5ae95faebb029a1e3655fe095bed69ab3da876b14b49e447d2917390642bca27da687f66d6826f41e83f2b10b3750b77bc632ad37cdf464dddb9b0eda0c7fe47a0b06c3d3c4aa61696160ca32739b7c94c7d3d837ff964f41b10c1fe63cc8c6ba6c70b7a12d79a367aaff9648426c329564239dc0581acb0bfa4d49bd16a686d9e6162a84e8406e4d8156ed9f9028da30000a029cf731b7ed2ff5699851bfd20cb3699135d18d578117158edbb8eb0fae2d70c4c8c7b0f99de32c74b2367a4d13e76cd1069364af00de321d879e96365815c2d5d0b97066326252424a0b6e55c7b4943e696480e18138d2b64d155751d79830b83337a406be05dca8d0e98ba1c7b01fcf4bf9c5cda87bdcc785f12043f1a5089979813ee83821c369a49e1bf90f3da7bc52e293b95a257381b7858b774d42cefa98d5dd8af0968ad70fafe96253c34a80201db4bf0098bee345cd3d3dbccb82e0a372cb177bfb41b24a12c961c88142531dce84ae9997a5d1ad4d0006fbffd5a6d450bb8d55d4551854d29bfd4afdd4d2c76058393f759ab6fc77503581a8cf5946e8ec0d0684f22a2d595485f53a7db94cf55bfc64ec3dbbb18cd049d2fd6f56eb23d26016c15d0ec00777a61e2b9032b8893d6ed69fb9fa781a6e555c1a089b749eedbba0144cfb53f7c3d6060fda11c6ce0e375582428db09bea2cc7a7891befc21c4504e21535714ef64a54c3cda2ae1454be539be12788b5f96a8c812b85b8e0914a4c78811e8017322f45cac7b0c42c6e1648c3ecce46cc13ad38793f2ec1c942984490395f55093d0181dae8080e2eb43d0e0817bfed5fd701d2c79286ba13403da00a1681b878688a44d8e9ccc73616b805ddab3ad05a62bd18a1ada7bd16d42aeb506b74ad986defb876380d2d2e10edae44ca7580105a4724b7e9df1c8fe48919cd68674ed09c2f3ad0b04029c41011a77c5fe5464f6a1a63736873a35b025f1f22542e0b6ea27967aa17f41631a9953e82f0275f4c224bbbf3fc597e7df795e7398039d7304b40b580c78b8bb99304d9c68918e966d9679c7abc5f25e0e5dcad204f1050a62cafe4c761ef938f07156d943fb074cd4263907a7b8a559a289f50fb20364aecbcca9d8a0ac1bb0e83438f1d5bc9f362036f5d5095902d52d067d630fc10b2add07a617ef1f339bc086d47be696948a85a66837588092584183763b78b07f79cf6e866f07140b89f648813ca5ae9c9f974f6aa5a424c391940dfc8903f4b037f7bf5b3afcc491b9af844a773301f6bfbb0bba40fba8c0f394a9c6e859c340373f49d8158b76bf011b7e6f005e6d444992a488ed43615b816b28805e05333780a0482a59b3ae41fb70d47aaacb17dff88cffefb89adf4d26ac43e4058bf1b8152c068c72c2a4d505a63c2785636be8d0d1503885b6009c0bb1dd194910b6b65108b01de2f3b46e0d90ba9e33ddadc3b125a70655f28f6f23832cf24d631561d1be09145a20ccfbca8f9897ce546a8dd54e69bb7b8288534993a6d1604f136f623a8860807ccca92f1cf9fac2ed6eb0b767614fba105a4dfd8d2df24a8304576325897a9dd641d8d8651640e13e9571fe6863e9e81e1fc35945809daa011bee6767b92773092d8aac4677825f03ff9862a7516d8cb86241cfbc0be02dc31c122054518a092039012f5cf3463c7e3469f6f546be6c6d21fa0e94fa3dbbbef3af123247eedcbf718ce95f9e2f9a9e238696b1af3d42e4d7559e737dae679b189ff4f1bfa14c67f87bbda9763aa696b5a254e0e5d76549d09143aa57d69d6aa22cd0bcdf43977d58ff22ece960d88e0beb6d4bcb9cbec8c1ea885f0b73c0ef52e3908657b139e4b17482c4132a5e251021b244af76fa6dde562c0b17cb195e1316e3dcb5c0ab4f0fa7b7102a9156c8784f25d4f96de9573aeb720b6dcd3acd9c4d0656c3a5acc6ec090171154b780d099a9f9c1179c5943f0f066457d73b318efee1b23034a0035429fa7b36140eeeeda782fd675b348d7fb0483ffa3f21f3b0e093eb62f441da66f8a4c84e51abd399cb4e7ccab96b2bb744cee4e9e321ff91b70bc9fafaf54bd7c7c905bfbc39860b103b046e44d415ce1f5bf0848febabd2396764766667068f38882a0eda35661263f72aab8078f43d5a20374fdc1711dd57268739f98f5fecb48fd1aeb6df939b93b208addcb21260e4e127027ba4563c05714ec5f769b30c24ea743da6f78871e42f06773a351adcf580448ae84d28d06898ad90df6389a632ae176eb4de12158c42c46e804014a403669132d1c02e13b7dcf2d0d536d32f558c1536e0c8e7b691d9d9179b2efcbf844ebad4bbca11b794a32d776cf4e3f8a6c851f464b77bb012ba34e5667fbb12061ed0f8e7a7abd9cab808a905be68f808b8e63ad4169d5b7909caa0442d9115b607535989023588d557542eee28d07d65031930e43a393c691db1d8a5aa61a1a86c400da2f5a44459d4469014c2288f4af66c4a529276751233622d576ace83da5fe5f0f4e8f2a6afa5f9abc9f5d6f45145773a2b8399ca953bc7055371b5d90120ead8aa9dd156266b698e48f7231c8ec3347e1239b9790432f5a2944afd758ff80437ac5582ec3e63dd33a8dce3e75545c9889a7ab71d7715dfb48067a004baca82a9c4ba6c42e30cddea88f83d6fa62c8fc9f85dcfa99e9f5d1101defff177db229bfe4faeb639286a29efc19d526758bf41aa5b46e9fad4e2f9cb76891836c1822644a93b4c51e47f03f86ffc647778a32ff7f689c9b352b563951170a7e243c5fea60646258545f0517003e41d25779a027faceb369939dd6e3121cf820bcde62b6feddd1b41b8fc3a22610326ff49fac15268128a40009f2aeda76e3c5d35f9a1be6680fd61910dbac18266be87050de510355bbcf3802a760227303eb37bb363d8675415e92010b848be0d1a4e2edfafa09cd1fd65334333b8072ba329e6e5a6f66469f83af631597eb556f2a3ea34c88001bb1254619ede544a7a9d399a696bd98a227a41f605cb02d0fb0df245496a7c9b9cccd98fe59d278145783176cf090c1fde7a6ebbac37513116ec30f381c250f86ad705df48893c246b70ef43b02af6da46254de2c3af4867c73e589c8bd72ea22819740959d6f47632d13f58dcd569e0e32123ac9d825d31c977744826bfcd6b78f7e60a77a77e8714eae8a9e65f3d22626c018e7c383a521a390cc984390a5750b080efc71a1239773d4eead3b25340c869b1e5ac77bb54006465d614476788cbe97aaf886a58fd66b27aa111db58f57d909387b84df2e92fa6c788f159be129f8131099dfa0bc82b0c5166074228b393efb5a8a7cdd6c32e32d5beff80b4b308cff849bfe90ddb5426a4e4f5ebff7e4dc5fb7e14520345be63f33123dc86ebf1b4f9e0aa1d6278aea61135b42d851b32449d3d6d9bcd320ccfb28241577589f0154b3d029f699b168745b8f03840cf220be34ac5966ffa90495c60e303dcc12af54178fd1b4f1d5f27666ca2b7e51672749304972bcada973d50b9e2d651121ac1edf2d5270d1db50c1aac43193ead1cddbf7ca9a9ca82d0b7c25388eea3b602aad4063c5efc65372fdc00b775f1340367fd8dc51413eae8581e71d7c21acde91b601ca4c3077f82bee7de84cf2bd7e6f2c2c1399186a299f3657e98ac15d732d288a4eb254cbea3cd5018845d880ddb2fdf3bd21041af61e62594cba2404538de985ff40964cdb691b781fc9937f1c74036eb09cbe21c9bbec66ae1b85a8fc13772f612cbdb71c5dd5112746c919a2e04c24dbf1a9b32a92fd00e8b752d1942635d7e80c48c13fbdac36aa56f5d1d3a0d32c125d15bda63ec6b65c3281c218af2fc6190a55266aecf4b13278d7f5d1106bf501a0edbfdf3b8bd57cd16ec357ff6a92a82a975620b3dd4fe0966276f45a874803b77daa8f130099bde175eab0ad34aebd16271c3919b7774fc925b74aad60f687608cedf1d89b3383193f0567cab4b35b22ee97db2f5f9317836c587f450a5294d011313ba285775f681473ac880299ace02eb5d68a83d28128b3f346de670b9ece73591b7b74110c3a06c632351a71fae70768a8121a8f5dc5beabc9c86445f3b004d2d85b3f16e4dbdf757453ca5339c9db673dc1680a7e68367b005d077ed5997cf38e2613dd040cd3d4c5828fa366ba985a572130924a4b46b46cebe781af28de128e5e449436f0fc3fa8cbfc51cde8dd0e7d01559f094c17547d214615e2310af075d60b6f5e0be8e2d29b145d73667b92682b0097c825fa9f30dcee660bb221744a45201c2e032d0398e88254e00d966e5abe7d82963fa8f0d7dcbfc90f1cf5cc86c6115429d9fde8e43762a583034fe25951788c9308f33cea5a6a8acec013a04f38239057d2c161eb52d3dd1337a6a0c0a7f59cfd533443a61a8bdbcf97103c32bcb04d5b9066eae394a08c8fd0fa85982f183d30558336cecc069962099ec651416ee317ddc5a8ada70ec3dfc86d7c43910da66c7bf07d11fefbc363d2a9a26e9a256b8fb9ee03a6d51c5993821ce9852a0158b3a2c66c6e256865189ae67c53cb5b08f54536ddbeba29ed24c555ee501583fd9b5630f2de19b1e2f471ac76550a4abd36ee8a90ae44a6434e35f36c1258a077756e76f1e769a7056c19f1adf281d3a0ef311a293e43a642d0f53346791ef0592bc1d55230c006f5032f88b7941569b381e7ab16ca27d51e6d3c8bb7960708cf596740abfa7f370140f7e10f3bb8271fd6c67df7bbbe6a7ec55075c6acbecd9d2b8b846aba996f6eba960ed105ed3992029088992f47077302795f8b7887a5271ab85b422cbc9da9a9fa4eb57e1617b7b9e76ed8aa4e933eaade117732b6cee68b205b163a1f8f19f5da9a0b59434c67115ae7840b2ed4db01fbc2eb1d642491170576cc9637dcf5d386bbe934ce4fd94ab9fdf313ab5d552402f9af06484f323bdb8c41584c7bb614ce92c3152afa17596045d860a816633604f892c8a4db0d7d481b947d9b3f67bb55f5fd8db0793b0f1ebfc6898f9ae4bd85486d3098d4c33dd2cb35abf5952596ffffe65e92d142390807e1d1a684a09b95b6f2852e25b80d63329aecc00360e8198f829db355172937328549e80d725ef848f48bb908e2b2dea966d20a1b851748cc566df51382975c3771943162ac0bc90fe2993c868864b439c15c23d40cf8998c89fea7efbbcd469f0f892ff470abe293b538b7f11da08764f6125c06ff95a93740626554479f5b802d34528d1bea10d262b2b9cdf90d5e11312eb137de0845f70c9faa300db550926c2a40b0e38a957fd6e19a1e808d5bb166749778b8ff63e40d58d3f4ed3e6d0f1860bcf76945d577aa753a5ea2c6321e1cb084c87c3f7724de5a7066e5945aed8bd5fc831796f3516fd255a14fda3a85678c25eaa72e9fdb4a611370633f689e590af6643cba60c00be3738b00842a83af8f4e846f2f2ec0a91218e5a1d93482828e82da87af20bfb78c3e5b3760ee7966f8fdbf659bbbd8e7b429c2e49dc507ce3dab2cd4c3c3212ec6ed29334df27c0123cce92ff432de611c5f1fdc581b443fb08210643e73f5abbb904fd66bae947d86279b287aaef8e27caa11d85ebf86a326ee6d4c6619ac46708972c29ab491c495991b9dd64d4d51d60de29a785f68c5095d3ff8dae8a30bb23a75a4234c225552e1183b3ecc5fa78870917baeb5581f6cebd2acfc455fc7bb057b1a21ad137920219e4a6b77b23a97771be041547b7d6460109bf57ebbcf73d5e1bb714ca3aeb57ff90e6bf5ed214cd5695afded6c7bac25fff58e982862b0fd00e95363559226cfe9349ef6de411707694116ac83adf2142e1535411760fb2e46c10c6a4eb25e44a3c8248fb32ab8eb75c652bd76c93d68863f05d30ff441e4a3eabc7868228837a5b6510624f6f19340ed69eb0a0fc547dc7c4191f5c529b143a5ba3e5a53dd5811c682aaa62b5c157a34f07c1fe7096dd10806d0006da2be717c257f056e1e301db00b2974782bc114316d48dadf1778a82a6a20aa79503e7047f1fb8b600c4130dd36d54fdda4f0c19183f09dfbe5df854e5f16c99f7175dcef41fb2571e648288f131178c730564eb333a8cfc6135d16a0a862e1ca06c8358112983e84f43cb1b0324f426b5c679ca98e3e21de9de83db40c0832f32d1ad405d0e5ee885d58e72536f04240c3792bdcc8c6ebd8232ffd374529674df13c479ce3723dc68231daa611a10cff3177ec819c324270ccfb35695b541fb14103a01319dae860a1934cf78d304ec120dc17be2ed88b9e057d37d5166b44287c4c07b05b612867e401091962d87041aac688c4ff5f95b5af216d0089aaa6c147fb232b33ed03a2071d3f0febaea8abaa0120c15a81c140a15aad0c5504a8cf54f6610c2a0b6062a3c60d2eb42896eaa484d176b395709f870c66005ab049162abf8d7df3956ea4a5f2a9190465f4ebaefe939a85d11ff3f6a19580d3c5b3e4a14762115d2bd5518d8a41f7f8d00b2b145ee3e985415be9609e2c68afcc8e59e7ed6addf6b64d86079a59d1b8db308951c1c5cc250ce4f1b453723e32ce67f39267fab468865fc5c6fbb9ffd1ac53674d3f2ead3808093700161161d4e0c278a1ca5ce199b98fec306f8cd936790f44215768bcd3c2dc09f30a96b80638a0074be91e548e10f101be53614cd029bc5186202959c6fddc26016d14476b1126956250f883232336cd884368029c485e15bfbf10ba0dcf72f0994b07887a51c2dd5db73bd1c1dc194bf8af34f776cfc00156ed421328254d59ac1f24ce571a23e0bad85deabe061752aa58ba4f0115371377caf4b5490077abb7ca517dc7370e47f585c70ea6879fcab65080de9fa5fe229f3614ecfbd7cf08e42cdfa8c2a4e734a544d9e490c31dc2968fb601abbfc5bc9c8c1eeb7874e070f9b1cb4b143ab99db4f5928a0f2e82a3162b8de9cd2e7b60ce7bf81ea0dfe618fda00bbc6e76a0f5c8af5739470df9c47af03f41ac96663ebc7e1606ada746184b5db399320a96cfb3212a820c4740bfb5ffb30a68f9716f35c918e2bdbf16364906ef8d8ee1f021fa3391555da8150239b258ed802fdb3cc1a1d4d8044656bf50c5267155b8dd50a7b7f4d54e9dc1410713c5d55e2f6537c784f701297c08e8d7b9df9b0e0aec52c43f01a923153a871e11a740bc26bc9ac2943ff495a5cae20be542b930788601af5a485f847191083437b7a78cdd2ef527030245eda28d3fae78fe9ee0051c817f431216207da072246c43262db307f178a7db6733a33e490293e6190bb84098ff8622800b9ce2199a578a691797172e3744c13a46c9fe78f0c635dec1b55e6551552220e4079ba727a020139373657f41f80cd9958ab187b630bfc69521964ca71c15c616027a637ef6c1a9f1b1b3f097298e79301943c5306130de400031669bc6ce52675ffc9a370f472615b727a14c94396bcc8bbb2dd04826fb4489ea28b3ae5ed00e7597522de866bb3ced786c34118d41b933b63951adfe591515f71ae4e837328acd85e40046bfae771805a4ec29ddc20dde3c076c945f1f197d146933db86fc83cc8fff5563304ccd5f4553657eb233d65ac6300e921c9762ae34d587adcc6ec1d00a51eabde1e0e1b6ca760bf499e5586a9fe8e958090879c3075397515e8a880508656374809a6972fa21409971a8af0da6d1af18483b676e8a8b513742367fa76792c7f1cdc3a0d67f93c5afa58783ed83a65e93f37ee91206d9f490ee140722a3cfd20c0bcae5d33efecf7411b711523d354ab969deb7b01bd701caf794f01e326c1415e2a38be10c4d0e818eea953b5ff0a646a0f822c4a8d8647550382e209c3c5bec5463bffe4dc75f47b85473d6cf79d7bb40363506b465620140f42b5154b2f8a2836eb2d7782eedc00bc5f3d8b53fee9984eddf01a4ed28d4c0554cdf466d9e183abf3a75f7ec13f83a1d24f714c109eaa17f17e10dcc321c7af1e5e2c3b33d1ee015a7036291a92fe96ce5a477671a0f2aa4fb60d22667f5d9f2aee3f00a875d0f6fff3d7375af634bda341e1757a2f768c7f876df0adebe483b6eb97bc91730cd54a5ab79d94ddec858dd4071163cfb945e2db03925eab85edfeb4e633b1775362a00255e31f4a172d19374e2d7cd64acc193136a9037d9078eef6cf183c31a96e9111afa8d17225c91cdaf2d808900a879ecb2318843401b09ba08f76705715a256ec379de95c103ab4a4caf3a5c51badbdc6d71084549a9e98f50a29c6b1a816fe60fa63513f39b90fd90d8a5ab802c14e5f806b97b8241d8a961f47b4117411e41af46d86bddffa02319041cfcd2c055e071c595fad0c412a44304d43c519ab3e172f49fe0b1f9d2f377f7b940180435010659585e22114a9dd2c8199548b953ffe1f00324bcaec83917e681c5fe4053bec47136a3376da722d03f3fa11219a3f81c6ccc5cf54b29b6b1c68b2e54fad3b9b5f0f846c463ece672cf544c1d9a4be6bfd418c2f731925495aa06fd7ca1c89cb3dd74a908b01d5b4ffbcc0841eb32e99057278f00a1a32eeddecb2cb6ee203230245a93a80fe71214805982066b016b2e25c7a7a6e478bab015bd4a01aeafb88b9019e47ace3f336424a5652ca49f20d7cc39c6d1ddf6b52c970c0ba6dc27285c6f0533653d14952e7b20dd211d6b0181185162234459120afcbde90f825beafccd32f73ed9664fc130f0b558e4e3981850a00ad3b6971c6b3843dbcd1be14d8a5fd09b04534e2ab5c800082e2cd8c91976e838950efd06c97a46d4f171f944e030f58a90ad2c2a7b8cd7e1596de71b5406623fc8e30bb3e300afa382bc8e3525689dd41192ffea99b18759afe969a9820641a741d75eb164b09e492e2e650316b86ca9cdd3f702fce3f767d221b441ddc0a43f61f129c30df28087cb56bbb1dba7f704a86e3def24456ad3fb896b3400b37167ff90add1adf6d13e6cca16a599b87c6d04d0de41eebaba043811b5a15ce6b55637eab342abd62f1a9b2c53a690d6099d3674f6752b95d9d1970530df180a3b31dc71f9dde0f8a598aecb8ecfb4c1963089c1f8dbd7b61e9c859e38431f50d72120b3860215a41b6e69f1b384d85f6de1fc21e2b6e9fdaf265fb0769066d89e163a4fb9118dcaea7cf414ad1cda737d712726e059551747bba18dd63fa539c141e4477d3b4d74eacebf1f91cbdc0da4b19e95c616c7b3423f8588485e66ee687af69c5f04c739d97ae2b160b3ee7f6ac555e9ecaabbb073a481393ba5ef01a6c13f6e2bc434a85c88eacbe4b4ca685392534d61c0c2b802e414e99f3f8e7df24043c7aec2d9623a17b07629eec6650096e35c0ddaf7eb867138f774af82d635528275809b54958fae39d108c5e74d7de925849b4e4966ddcd7c84116abed175e3013b90b34b17c9d1b1ce802ea8a2464dbf23b1a7cd12a9a261a3fd2db78216adceb8ae84be5b0b4ee550d72bb235f4698a93342709663a4529fcd0f66129fa31684c4f1d1cf822205edb913ef2c59ad0e3500f34b75aa4af5b521ab8d5931d79be8b7d0b1238a49860a85e11b0f5b7a934e38d164954e7c48081a6550204e5418904665f2f563c9078709cf0a2144e2e267dec2dc15161dfdcbad3d902cb5ff84181ead7c65b1cfe40779bb304d3000b7b6aeed314692bda962fc7f512de9d7b7b5f363fe2e174b25d1e3f67c6aa72f415ef26a17b6fe70023fd248417fbb3f2e736c544f3d71e1b4f75de3986f43de43839270bea01e9de0e101b043f9ef5c6a6520022547ddc3e09ee782cb157a45b7343a9d7b5e21cceae77d09ed14370e9753a5402fc9a7cafa3af80b6c5fd95e0526db8c5a82c8effe818001d00a9216499fb96237567cdd3e938332afafd4bbe552deaa3edfe94b78a73751472520ad3bf27e95c10c1dd1c3236b37328f5ddba26e55ae84da82fc0623ab59a507447b286c3e43793acdb0be72eeb7a1c7dd192f9976cf1a5dea746aaca4f9b165ba12460fa779b85a44faed46dd2131b8eb326e43550752640797419cb9d3b5d47044be89da6e9e4b1b0c8c8492ccb0a54d15603d746d19b45331b1b3fdd106324ba976744a661677c973e8ac9b079e097dd970821ee50b8122d0d4cd354087c529ff0cddce2921108fce6ed68fa10f0931a8c216bd68908ed79531022d32d1ffe0cc760c3eeee418f411e592411161a0ba5d44eea3eb73e56cd1334a341b22471da48fb147fe92e9e02c8ab84078f83a178f25cfdf7648805a0fa9f98bea87c34d9c706734b7f8fb44616f5ff4efea26e057a1224650554d7403bc3d0e5db4c77bc94042ac44a3d226b64302a07532164e0d0d889b32c445181b1113133fceedfee5ae415fe323a247726736dd42553efbdd4e67ed41065e066913fbbefdf28931eb4da73427e4632ec31abebbfcdf6c27a31b60431e08fbfb4a829378d5fe96536b0b2fb0f8fba7126d3c7b4f24c827d24581e6582865060aca59d4fe26c93aa917e5c822be32065e0e60bb613b97ac3a31ff2c3677c7cb9e74305f20c0d3142f6a42d2a1cb485dbde71998b0ce32e53a07a8a5b8fe755b4336f4aa043932c31fb2a105702b70f5c4ce9798e283f9c3c2dc992cb66af3ece030454d0b2ab38242ed303b9d6d249d65f8508de6548c363a811a5d0b89477a223d6185f2149694b7fa3ac4dd711746645d43f4dde719b1ea2af4b553cdee9dbda788cbf92fd1e0d5cecae24983bf0c20b1a4e6881d5290ee1fa7af0f29d07e55f7f825ce3cabd0ac529e1862021b7a0ab82939f9d327b412268f473549ac5ad5e1f857f2ff0b1f95ea0161fe6924fec3d9131c743e6d412b421e28fb66f87f5a659a7472744a251730f92b9e761c98f329bc1da99ce3394250f8d2c36458ba5587e4ddded1698fef9d5e91197233fd10a1dd1d835224d92d4b10056ad71d10e04b435faa093a4a87b0546d684f72298b9f9bfb2ce09f7947d817b7a792226376f66711a98a5b1ce377bbfca516d95fca3071eea13674c1c7dae79e36d8e34c1d74e5795c4337b1b7430be495d87a03227adafe88c882c2a4712e5229266416a3e7fd9debd18056dbc215224de70ca113ebb8315a1fbf1d6c2dcdbfe0321d734c5e5c47041d232002a8d0738b35e039a355da0b2da539e4e6335c2c765f8ea2c71ef62830f289ac44952ed580b8fe13ffe6e5c09ac03a9c9558a3e4607d6b48488c700d5bad10244066f747d4a93e15f803955f228e35966ea9d2c15a6c3a5ec9f364b92edc78b683684e2235a556c8a5af0a69de9e7f03a08eb04079ed4179d99eedb17beb90de2d461f5d9fa5bd12c760f04536521dd704233cdbec27002eb068b66afe8507f1dbc7c79bc1c05ae72117584c4c5b209869d9dab1ef0046cb21eb9380702cbdfdff958b5cb0a858635dbc773aa30d0b4be32cc9e7bce6d47fc380ea1405d34f33a9249047bd89a34bd388a6ce9ead32a51bc1bd17816a248e1cbf874898615bae75c99f57760dce416761fed39e1837519962aabec4fe34de370f015a3c9ac1a0fc358c638c2376d8b1407ac91a45f7a4d0807b26993cce72c5b824d7e788ccc654cb1adbfdd06d56ee62e81b4e731545fadc1391919dcc7983aeb7b32185802526ca9666b2aaf108e9eaa80246cf99c8197bc9974ad5149742c2863296cc556154f7237ce69d489e6ce13ce56d3e4b131c4fc4148df66769dda6c16de4041032036c074411ba0fa14bdec551b7aa13e4f891c416db5e7d26ce32d284d26f31d821e5ee4bab0be0f49f13530c1c8e6912dc83a56c152b4c74382ba665c518552b1493c677211594dafb96238e199b4399d5f8e9bd4cb6239e82d8561d8c5debb0ff1072635f0518066195e5a7761022d045745d18c0037395ee3a5828b48be1ac4934d282d49b0ed3dba150bbffca3b196b56b1309431da25a15ff3d5649d07082bffd2799d9cd67f946c16e3cc7f4889d4bbc694d4bdb024cccdfb3401f0c132e87b55d07a8ab90b1f7eeb6c8a5e827c20f1bdbaf1ee8677b0675b039d23382246fb33853d9e0f558c6c19c343c0945152f47ce4f536968fa744bab491db4ac13171284050d822edd33bbb6c297460eae4b20d2b9ed15169ba66c767380387d3b58219006699e9ac8944f11beddde43c94d2aea58868c7e72301b435a04f3ffbfe7c64867af044e7e641e0adc46d36becb0720f0c0f4499d474dd5532747b82e2c301188702da421496f3ae0ebd32ab9fb34fbe2d0026829bade6baaef54e5943358e399efb1634f90c5d6a1d88018de5af304f0033e1aade53","title":"1203. 项目管理","link":"https://leetcode-cn.com/problems/sort-items-by-groups-respecting-dependencies/","question_id":1309,"issue_number":34},"32":{"day":32,"pres":["模拟"],"tags":["模拟"],"whys":null,"difficulty":"- 简单","description":"```\n在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。\n\n移动顺序由字符串表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。如果机器人在完成所有动作后返回原点,则返回 true。否则,返回 false。\n\n注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L” 将始终向左移动等。此外,假设每次移动机器人的移动幅度相同。\n\n \n\n示例 1:\n\n输入: \"UD\"\n输出: true\n解释:机器人向上移动一次,然后向下移动一次。所有动作都具有相同的幅度,因此它最终回到它开始的原点。因此,我们返回 true。\n\n示例 2:\n\n输入: \"LL\"\n输出: false\n解释:机器人向左移动两次。它最终位于原点的左侧,距原点有两次 “移动” 的距离。我们返回 false,因为它在移动结束时没有返回原点。\n```","content":"096221cf5b628be1e73e8bcfe626c7347382248a04fb39af0a7771247d060e0f0dfd94642bd18e5c0372ed5596684b8bf24d65cf813e07c2e763b522b5efe922ff3a6f2898da8ff0062e8db59b925f7332e96ec986ae0e9120f437cbf3b6be831436c0446ea79229203f4815c0928bfdf714bcaec084752f916f6d5b19831aa076394751750d135a1cf979f611cf64cf6c175787197c2f30b4cb4025c8e6ad111c0f294a17ee8f727f007093cd7167012bf74e5eaf91bfb73e9fe96851f60c185eb770fc537fc86df09c650e805e1472be20cf595b228ab90a7481c0313b72a29fadc71498f84ee3a221448cbba3f8dd4c556baef5e92e2c2e27a01f310a1fa8da4384ac839946834657570ef5737f7b560f20a828a13a4799ffc7199e8b70815701c960e6c2a6fc45ac721802ca297c82cb020e9dfe72cf8954e8c0488467b2124ebf902e0a516ba8ac47da0d0d881e2a1e5d010ce0915ed26ad0d6550c15d4cb6a1ab3fe943c8673063e05182e80f27cbff371de554b6d043bc65feedcb2630b89502a453182df1728cd0a6c070339b6323dc291bb7cb2b545ae8c6b352d57bee318731f6b8cd4dcd717189adfd95dc6a5fad16d91bc584d6377d90557cfe48177fce18a4cbc171e826008502b332b559159e4d2caab8098418ffa416857b519d11f7303e18c34e0c6d711723c51cda4c5e714e2b33ce29e269731c0b513e5bfe5d4f1b14a69c93a876ed0b0e5eb1139aacfcaed3b71cbb2cd0242763dbffa425f79bbc1a2d9a1540352b3ffc6b97c67633b0d098908b2811a387c3ed30b385f1c2cd7f9ed97bb4e187b6f6b984c7735a55e900f20f344f170484c80741836e7717e54aab7e1bfb5b48060f9e13f25f7d4c0e5c6e0e2d91805d31b1e3b374b47220ee19114d79fb22f4c4f8a36fb06d36e04eab551c433b421c2fa7addceb90cde1177ff4d0804fad0d28f657d4b62df167287409ef3c8d517d05e839a31cce265d91d4470a4579def5640f1239bb0d648173724f40632c29d7f708ed01ace9c6994744a591be9926d3788c46780f400dc8e77a2266395a84e5cb7b8ff10d24c54a93f14e15da23a6488851ce324a24113427ad729216de9c6ec963648bb6a0cb0790a444eba4d9a73b526f3349e7a1aebf18446083a819cdfda2a6245017e233c0c0b23cad9c5143724a0aae810b40428557916aa8457f32252de32d244cce48cfeffefe7e87cf91a89e0a2ee688b9e999848739cdc31f43aba70b81048bd6ce1fd00b9523ec0e17584f08d367868fbeaa7de1f5024a4e9fbb0f8e4b18ee8ac1dd6bc410cbc43e7550efdd92fdbcbdb218c1649dec3c89ea5008f040a67b9258fc6c24efd63f7205ceffef4aa3773530d670f11d2ffd89406d131e1fa76ddfae083de70fa20500e42b2a07c0472818f1f90baba3738089ea1251dd1964e3bf592e7c11c3aadb36187099a68f326a97a611b65e55d238b997da955bbfe2f083db7587ce67f08edde215387d21f08723efb9db3c5f095cd69e460526102f68756f63e4a5ed18f4b1d1462a3fcc2158a3645554ad382267ced623cf5c7cf2ad688d3f325869c2357173ddb8478e1e0b11bc89dafa90650e245452872ad858d5fa616576b1b1ba8f7f79f0da6c6f96f266ddc1b8d39f2d79af6526afa093dd10d240c00464233b75ef264445689beceb2ff8b6eaad25c1d2d1b7e9cab179707044b30befc6eaea2c3d2c44ddd29ae1737a8eb7c7fb1ce253d6d06a5f311955f6bff5240e7277b35464560ba9e506b920422a6684f3aed69796bb05d3544b371cf8b6881ec2387786d8bdc19a896da255684246e3b4f5bb0d2e2e5131d3a712839770102fd6328e830b54d060941bad35e8a94e8b649a5e7fc464a98413423629c5da9080ed617456a3988838109fee764888421c917ef75f21409a5b4e3c68fdb1361862ab2d3c77dc092a803ddfd353dab6acf516a9d5c5c8d6e9dc4c55f149a562cdec389bccb50d43eec0dd3549fc04c7ccfdaf78994120eeac171a87bb229ab17292297f1836c79fc6b89948177f6cc8f5191e7579e0adad5cb5fa3ea600be338013f72be77de04985de924c95fdb683009e6214ad695c4e6a4e254401cf9f196a8c14d663029cbd57e6e9943e0eec6fe2a7d0337f03a6be5a99f31b50512bdb9da31311b8e37d0228d59662fdc7139a90bd9881b13dfaf58f40b15b43acef3bfbda0563262fc65a571f78d295365fc0e468abbb8fef480a9e51487c7b2769773b58316816279f282a4a48641d1d903060c3d2385576d0ad1971ce9b574bd915509f5639262284cd5d8a6753bbbaac55ff78f95d3fe4b43398cd031e782741995a35334a3578f7b2447236616b81f9ef368a8b7f4900fa54db34a215a9725d87ee02c86220acc0f6d2aa3b5e5789265f48bfadc3ec76aa18c582509e112e3200a74088d6c2bb586242f9bcaa896128979d6a13e573b7f39af129dcf72749a5f21d1df47e6ae5b5a1203dcf6ea2adc6c39e2f2cf3b0349ccdb0d392eec3ced4293c3ebaa6508ac5f8e590aadbc457bbf16b6a5ae63431a9f7629ef07451057e15883c8d05f0e6db70613582b433721d18d417dbf816b88cdc8229f2ecb49bcd139f8a43cb26c55adb8d997a50ad4a3cdaa646dd2f0af17faf9f227d9a0706cec55b3506c9fad5b3e1d837b55ad2ae077346c7b02456c70ae2d7d0936a6b52cb697a8faebdb67e8ddf7b59f842327fea0d384e933f5525d14a15664ca201744e4e9ae0f84ef35400db4f0b36caaf7006a22b3fe4a5b58be6874d23a0e46405f1e54bd8bb2b83483397899deab736e391d723f40c7429ea27e35ffd3b9bb4b9c3b029ea6fbcad3d5c3444775939a6f0f26dffe2ff265ab1717e916394a7c9dce89d8f82686e66ca66c894f842dba1efe776377545396a2bba1c64cd3039ad8688e9f32256904e77bd5cd10ba1b0e41873fcd0f2181de8bdf25225e98a61e7240dd3390b4f19d8df52e7d4c01556796c7e390fd6e23824bde4a65b7fcb4e51f239ae19fdf82e1938ab98b6c9e77c054ff0fa2e516720d9ca3c6c991b58129dec869661428c2e95c844a4ec525a96fbd72a7c3279af3069d2e5d938f867184df90c134421b9856a637c8e57dde2ddf60e7e46de8dd73c09cffdca5d9c092aacd7d92b25381c8c3cbf7509308b4b99a5adeefc73d18a859625e53967703f71b18ddafe5f77df60aebba43d43adaeefcb827adee63d398ec777485e4289508b5e61558353d1f05a86c69554c7cab6a908f46553f44199f45acd9cecceb993a569de448f2da8746728d17d694ab3598d2024063051da5249c349bdf3341c444cfb8d1f359decfced08e104e09a36133ec82e298c9ccb304802558c36643e0c7c136ebeb57c33b1b44ceca9aa6faba1e18ac3055bd61afd2a9b937b55b3eab9aa9833f8e93661f357897fb257b888d70ff46155d85baa3c1c40a4f9d2353c9a13cd4ce022e9603b143116d6c9b9b1e4d3e58f113e0c963f8c29daa82093d9e3fde6958c4b738546767504662860c7d25537b5316647214c3d87e14cbb05ecedb896a38fb554f085a69a3a42635cbb44ab5d86e97e0013d9ca2138cae1356702b1e9992825b01ac44dfd68301398623ad1b2cd9dc6727553559140061262766ec4f37765f635f0773023741822c38dd3af790fc34c4f295b75b53ff35b2926aa8fddd8ab42ffbe9bf3b0d326d989da55438a939c4007f9284cb6dc9c5d35f9a52e627559b1f12dbb2632658e82419861c523d93c63852dc715f7308f637aa2d5ec075523bc601108f9bf0c4b8a7f8faa320884fb6541e233b8674ba62e57f276f7b5b8283bf786ec4b12f7f2f30cd6ea2242efc4f235da8ff6e8de993d9b28ea4fea46bb456195cc36243e58b6d1bd8a79293dfcd88b20d91333007cc4720f799dab9eec6befe843070583c80437d14761a9ab7305ba49599da47ec44a132218547a46254de2c3abdc82873bd8993f230e66c9dde1acdc40a1563645df5c3881f9f09225d60d9ec28d51aea2e26c339fc9bf8d93b60bd7a3aa7270bfd83d7709d976174855d9c8dc6ec66ebd2ca8c3e98e5275d5c24e16ca124e574ddeef61125340c869b1e13817bfb0f5246142f006b34d5e0f8d1b6c3ecc89e2968f86c079fd27dd909387b84df2e92fa6c788f5cdde121b55c17d29eedf1c7f9ed19273130e6717cb4088356f76c32e32d5beff80b192dd5a7cdfffed193e6682a0e0f749533791eb2036945445228e6fa9c9df953a23d80e916fe69549d3333fa8fe8e17e9570ae8e714f1c1b49e5634ae7b8b9b2e705c597161da54d5c2beeb0c737c621a43b8113ac28ffa07c09c2006dc888b209a260d4ab2e5b55285352c9be4c8edce8d2e1aeb386ee106801ca1d942ae8deaf21d76310e8f3b84c53967f1602a3122c6d64146b66021e11eab0e8e3960b2ff6ec2afd01378def0ecc947d2fe0e0bc80dd84ed0b7cf583a3685f287fc0dba56a68082db8229ea69770ed6557b40f647087ecd58e10b60e681a9d3349fbaae1b3c26a748eef33c8b5588c50cc7fd20d2c5a662ea0a36e2110e94bf1aaa73d8bb196176f461ba7fa668239a29cc65270e38ab5e2ee013e32ef0a3923c6aa3dc3b2f9170d7024b82e2db9a31280d88746f7545e9fec40106ebe4597f20980d42b9befa9f6075c94da09b83e6b823b568e463c48159891e3c0006fbc7e70f3804559d89b74c7191b41756de380ed0a3d89b6d7006bb502dae3f8966fc3803edf66c812f26c92b23dd80f65c5e57aa591792beb71c64350e460a794000cdebab864e2aef405c5c3532e1cf1be3db2e505a745f52f8e154c8927ddf11d318845b0bcc2dd6e7123f4af342e49fa981fec49ecb8b343cfea1a1693a3d70a340a57204027fcdb1896a3ac6bf0829b89c29177bebd2edc6415d4b17c1f5e7638444f734083603a5af8661d86a45880df5ce31c526f486fa3db655e9c721eeca9df534f19c1e29662c3ff6138e5d330ffeef6dac48f80c28120ffb3b8680be28b77c19c145b2e441d5aae07678090869446c5c38f17e42e41246aa647d614bec866947f78f123452bd0083058c6b793927fb0cb8893c18a808657fe965cb35a89a7c1a52f302d5df2a3e0d3861cb38385027ec9522ef66047a0bc24e8c3de8c8381ea9f97c700481489149e7ba59d64970b7ec44557631f1f6bc9a76109027cd6dac8563d1475f791165df18a50d687c9095b866cf55dd4ac227f07a9560a07689453e1cb6bea5a535681ff2123043c465967e0fbdf1c009adbca96443349a9ac5c39c524e4a0dbed83ceccf9c4817b5477294dc67284800a92361a83c7475b8743b5dd02132362a76e1a5ffffa9c744cf1395ea45506eafbbea8267f318b76a4e7582e259c484ca39c3c0dd87200a9eb9975784ee38894fd9ef21806f8de03a98009dbef57147f8356e26cd62bfa95465752d3901754d537622fa2618affd4f816f1603d563df16edcf7f04edbd5d92cecbab2e6273daa7cda6c333408614740282ac6d3b9f7a62ded1575cad7fff733b6ab86ab6075aa0990443dc5c9b06132bd230b3eb3778c54c9d8a8848195073ac0596945631bb68296b0661be0a025abd9183bfe034539b9b4078f970d7667440acf1f77813358a5f4127a843fc976fb1c9e4f6c1ac2b98d9ca5f6bf2fb71811e3fc2a83da8479fdadf2b871d6211850561d66b1343ca821f40d059db0de362100e407192349548800aeda9b5e140059240b05ed88502acece03bdcbe5123328d3185a38ef96","title":"657. 机器人能否返回原点","link":"https://leetcode-cn.com/problems/robot-return-to-origin/","question_id":657,"issue_number":35},"33":{"day":33,"pres":["模拟","堆"],"tags":["模拟","堆"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个二维数组 tasks ,用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务。其中 tasks[i] = [enqueueTimei, processingTimei] 意味着第 i​​​​​​​​​​ 项任务将会于 enqueueTimei 时进入任务队列,需要 processingTimei 的时长完成执行。\n\n现有一个单线程 CPU ,同一时间只能执行 最多一项 任务,该 CPU 将会按照下述方式运行:\n\n如果 CPU 空闲,且任务队列中没有需要执行的任务,则 CPU 保持空闲状态。\n如果 CPU 空闲,但任务队列中有需要执行的任务,则 CPU 将会选择 执行时间最短 的任务开始执行。如果多个任务具有同样的最短执行时间,则选择下标最小的任务开始执行。\n一旦某项任务开始执行,CPU 在 执行完整个任务 前都不会停止。\nCPU 可以在完成一项任务后,立即开始执行一项新任务。\n\n返回 CPU 处理任务的顺序。\n\n \n\n示例 1:\n\n输入:tasks = [[1,2],[2,4],[3,2],[4,1]]\n输出:[0,2,3,1]\n解释:事件按下述流程运行:\n- time = 1 ,任务 0 进入任务队列,可执行任务项 = {0}\n- 同样在 time = 1 ,空闲状态的 CPU 开始执行任务 0 ,可执行任务项 = {}\n- time = 2 ,任务 1 进入任务队列,可执行任务项 = {1}\n- time = 3 ,任务 2 进入任务队列,可执行任务项 = {1, 2}\n- 同样在 time = 3 ,CPU 完成任务 0 并开始执行队列中用时最短的任务 2 ,可执行任务项 = {1}\n- time = 4 ,任务 3 进入任务队列,可执行任务项 = {1, 3}\n- time = 5 ,CPU 完成任务 2 并开始执行队列中用时最短的任务 3 ,可执行任务项 = {1}\n- time = 6 ,CPU 完成任务 3 并开始执行任务 1 ,可执行任务项 = {}\n- time = 10 ,CPU 完成任务 1 并进入空闲状态\n\n\n示例 2:\n\n输入:tasks = [[7,10],[7,12],[7,5],[7,4],[7,2]]\n输出:[4,3,2,0,1]\n解释:事件按下述流程运行:\n- time = 7 ,所有任务同时进入任务队列,可执行任务项 = {0,1,2,3,4}\n- 同样在 time = 7 ,空闲状态的 CPU 开始执行任务 4 ,可执行任务项 = {0,1,2,3}\n- time = 9 ,CPU 完成任务 4 并开始执行任务 3 ,可执行任务项 = {0,1,2}\n- time = 13 ,CPU 完成任务 3 并开始执行任务 2 ,可执行任务项 = {0,1}\n- time = 18 ,CPU 完成任务 2 并开始执行任务 0 ,可执行任务项 = {1}\n- time = 28 ,CPU 完成任务 0 并开始执行任务 1 ,可执行任务项 = {}\n- time = 40 ,CPU 完成任务 1 并进入空闲状态\n\n \n\n提示:\n\ntasks.length == n\n1 <= n <= 105\n1 <= enqueueTimei, processingTimei <= 109\n```","content":"096221cf5b628be1e73e8bcfe626c734748f20900a3d40987a09637f20146dacf34851ebc96472cdec9c7be126a0a557be330cc8912f5ad2b362f921bda5ed33ff3c666096c78ee0002dc5a98cd0497725e17c8291a5419d24ac6aa48de0efcdd0e0378e9a7b1dc1c6b9d8afc0bbc8bd7ebcc3f2c2ce2e00fa3f520fab239e7a9ad419793b7c193140c6ed67c90fe621ee1c538111540b3292cc4c3ce0e5b101dafd712f05a4eb43276440ffa8741a6622aceefdbf543e3ef30482f4e1334e1b0d179c3bc5c61ccaadc55d68e873770f9d7f916816418ae06f4cebaa3b532f871b3f30ca1b348c6e47ab9f305a230f04dd8aa42e3d28a6e7cbed08ffa4c2c728239808526a2bb741c6aeaccb8f5f323eef8ceb15986fb60e1d12c222868f6d955601c0886caee3c72bc45a7a41f047248da7743ff3b165a3051badc11ed77dff7f4be0c3286c085cdbf1655c480e961d2a3051084565559f1528fd853805699de2ef9728a3dd17c03d25446a385aefcc16cad514af5b2ef7ceae33b86d3348ecf066e1c980b05663162ec02e5be3051081321cfd988f65bb806e0ac25b5e48621206437440319c08d7d31f189affd36cdaa7d2e2aa7dd8c486d79a720557cae29179fdff884cb53d11896e0846293f1252924cebdfc5ab46f64de99665142f847cb2162e9e99d21f8ba4c96a2b2b27878f7a43c60e7c65defd4ab24399ad7f99a462443b4fc735f95ef44793e9e29a4115ce86f99662705f984ec5ace3c6c05a8305267d95a385cc4c5e019595bebb0d1a70645239ca61b6f762120d46f6445e705a50cf9692b2de362f1c1e42da21655ef663fc4d1aab21f9f1457090c3722f5a12cbb10cb6f9a9b4838963ede4302effd6d3fbc4dad9df08163c710b5e766e3e88e5557cb4d69aa9296771870aebae8c687d71eb04c877fa32baa47aafba90448f2b19b16a6d66f4b6998f21156808952813c76dcaaace9179eb3ac8ac4e432ed3209c46679956abdd595cc22089b11214247756d16d73eece1c4fdf8f03abc150decf15260f81ca5650086f409c7eef9ca12bcf3f00141597d63fb5e701d1576d76bbac50a12ad4378df373c57b1dd681ac8657b3452cea988c865d12bd0c77953175650de856f305b374a229cd321d829ea43b593aeed6f59c7256296368414a1e6e56ebb29a055467a0f48732f15914333010c2e25cb24373b44ddb234ca8d0c38591c2b306ec44cec5cfb248d6f1a8f11369fd9e039756a73ef6202be47b024bf83d520ceb270f8db0de1f1116cb83c9fb4e1a1febb1c0eebae5f73489c01ea0d87e51e74e810c0fb8be1e9989c54eea1cd279283156ff1bc57b2fe228cb52468f4299e16d2340d5f3eb98f3fad2e2e7464ad194b28db016b82653d964f7e290de50cbfcf9cfcb7f5ffdb61acf8d4ff1a6e56f1955e7916167f9f0fe8bf8bde2c130026a578a37a3d728cf65df5024435e82322cefe565c013ba93713a53d360f809333700567f10a7b24434f4ebaa86c6737695c467e46b68693cd515ab0cb181da0a03b166c7ce0d4649f55d90d9eae61591edd434a6d05c0c58cc6802b9ab3ef2ff221443181451cf4dece45695b3c0ae1d7fee596f23768d849957a731496a3029a9c5d4900985c6d1712752e1158008fcea9ff1516415bf8340ead68ea2c2818215bb2e88c0e7387867333a32c3a5d0691f371b728896f8178bcd3507fa9272de14451468c2dd008e183b9a05cde974a22c752a341ac43bcd4c361ce5dee70d51d9ecdfa5c198f0fa76fc4d8c764c2b2803600ed77d683da224bcb0d46d4182867e694c31c9183baa7e4ce5667e632f5ec094f5af471a5312099ba2b165a67b658102f6211d61059283ef3b5241374581f239f4d2e936132ea472b622fa8ee13d5469f6d28ff85af2ade4234db27118cb40f13e38a9b1dbc49ece1c77bc2086c8ce49dd939c00d3d213308b7ccc70559c6d788074a10260d08a1badcf517b1a4e08d37b8c2481435c9cf74068e5dbc592509b8de5de6ba873a4289f032f28b4fd96407ad44580a5a37bdbfb8e4398e84d8b09fbea04ffe5a47a5749adc8e5f977ed6353b89f754dbf7b9c2e0c739d2ed147760160045d92db9df0c6850c0b9cae6a00a09b7d1ac555bcb0f8b980e9c66fda6907d4cdc71bd95e35fdcbff584513f772df5ad56d2e71fe3c579a5ba9b97d68c0e504e66b4c826696d7f9071693404e9620ad3889ab6b2b62945247117602732d083020a414590ca47ede17fd75cf24792b193363c97c5737959d01182f4dcccd04faa31fe0917fbab0e0fa20e26593fe2bfebb5098a855ea9f5a1a34dbe396b3a88c0c7b883f4f3c4bdbeb425bec00974b036d376f1bad46d7bb32e6522b702d866bb3fce0ba04d921f535ad69888bcc1d29aa7c236ab176e736437527fa43ae0516a5d68a45a56af7d1f6ef1faacf7712918f516b2513e762f15710fbfdba7f2aafdd013bb7c615c0884b17d6606ac0c1d7a95d3f6bf5932339f4acc4540e00d6920d3378b46fe1685c5f47c9157dac9a00f5cc0545c7e0699c4a61ae6d5edf0192eb69a7d897f73af1152a51f3caf62cc3b9d92b5237ee0467849f7f11870f18548e5cd957961608f074203cbe460ef092d497f14399e6cdb7643584f02dc400df824fc465f9b52de703cdf70f75f1ae37927b9034bc28e88fa9de8782acac67d7a098d9306e9117bae6d7365fa42c4e41b59c61959dd48a1b1a5af65085d7dc4e506b99334459e4e9c574d2ad605029b896b960abcf3d26198ed8356702847f1b890347277d794c6980eb3b70c66cddae17114208097a422b790598008f847efd7850704cb411ebf1193c1241070f40a9a0b14164e3d7f37a22dc76a145d7fb0d8cf1a8f40139ec83bd21c6ab728c71895884e226b238978de5e8a25224207460cd4fb32b1ecf037dad9eaca162bf4e56935fc8cfba70bb37b8a352240b6aaaa9b8492bccd0d009cb1d5f22355e3e6f2459080777c1fcef82f17d2f9616f44765724c516597f9100b52dfcbb5dec8cb9165892c25c853c82b7fdfc59f5b09500f3114469322c3010d4b280775fc41cde5038c2ea73c83631df00c1c87d47c55115c7cf12b4d4b68b4e69d3d9266860d4ffc17ac4660fae436f8d162cc8ef397f5fed6b8fe8430d7b24e81d1c3046bfcad7884f50c9172602985917c94e2f4cf8b630447858718686f32fa5dcc423d8b55961e75677d8d2cee29d85c6bf1b12a6bee3c8f7d67b99caea687af6ce9bb894c28ed39cdcc011c2d042e92429c978a89b0ae3a478ee4876e76e436078dd258386d9d711b94c08caf9ca5379cf10249f6dd64811539175ade164e621415d6a1a3226121ec4d7e345e2668977bec901aca9a665c149c6c24d6033b1b5995ca8d9da7901318a55345d221f292928b5d09c7f187ae9999d02a7fe0f7cfef2636a18309c737bbc4c9a80974404806a19434e2ce064eac061a89841f4eee159ba2c95e6fbb8b97937cc64c5df87e074c3b4788b4e339f43249dfd267543b62585762d20c723d43afcff3071e618e52a6fd5e16a24f0e55fbda6155160394f9353a90950e33e13a37e9572ce2af426aad6f52135a6df98237222fddc755b8072a2fcebf1df71cb0e558456773136e0c734237373d50e0322a6b566e5fca8bac5d31a757ed2e963c254ce14443501dda53a7737703b12f34231c6ae3416038efa7a0a85e096af4c9f8025b8058a54275c62441499006a18a0d0997030fcdef542a6baf6d4c9b014d4fdfe52902bb7d223d03f72abb2764d55f1e11da1c428f81f4c3b3f2edf5fa10cd1ba7494e6174c337e961d7201d1b2f0bdacaaf7f5999bb15264530a704eb7e5dff2ca9b04022d9296e6c1c395152fecd2af5c3c2dd7686b09ad224911601e3938c9bca38c475ee9799e66d2db5101d7428275490ce75d691c8e9253b1f25877260bb8622f2fc81027bd52cae862c6d8e6157dee99f714fdcda22392835947b46eed3071465bed0f9e29455614c875489ecf1ad2a0fa031d822ccda47c174122d29bbd009b3ca6ab6f40a4e4f987e15d9b725f7590d602fc640f8a9c93d906dcd87dc8b645b8b2e97b56e4c6b8ca51e2685981ed521c63398dd6c3eea8faafb44551a4e0f0a4d7b57abd037f0ab5834c31fa7bdbd0c5ee83945a9d51cd0346eea58b1871f1f3647783b118fe889e40bcae872a606905bc5f546aa926d40cca2fb1e05791d61415640d1ee958cb31592bcd309cbe8e987f28accd05b13599646ce4669da7794ae54ac963d330920d910ed0c0fb7e4a3ded974abcb4b77251ee7c15d43da9b17a1d4aa281b78fe4499619338da51b83a38e4c07ea0a54e29759211ec2203e3b38cba8de4131cc94137491c436c5a264cd5e7980e873ae27767668064aa92093808d2b119ebd99e0f12e9fdf5ddd7c697b2b02f346f26189de83075ef4da93787e5cb4c603271b5744f0540175cddd443460393681fa6594962d1e6c0ff06b92d3d13ab2186c11ecd2755ec86c1eb70ab4c3629fe5f768c1a4f5c4d062aba41b449eb058c3a844cb1461a383a273b2b8bf69a26e7f3899530a69a9c1153af9108d089099ba295ec5e5ac48a98e2ee2e1d31c9253032ff6bee433974b7e0cd82bb3c2cb5be0783ebbc4fd65a5cbefe4922517fae3b24b0223da127c5627b4613b4a47f837831856fff58451b70168d9ae3ec33618e6072c7a94468cf29e0234d8ab99fb27c2964eaee1b4106818b3d9611767a75ba426dc3148730de1e8b1262da50fb860d289e26789de06d8e42b1e373b44505cfde545e34f91f5c61e13351bdb8d8a28272ddce42fc5d82498a6324b6416c401d31b244a39bc1f977721ed5ae38064bde83d04902b3b8f3928b4583d0c791b56432e196df80ba1917c526212fb219137d514249c93b4ea557a4cc1e74e29fa3f4b08db4ffa36ef49eccf3612a8b916080e85def395c6c6b58a3ed4d59a470f271f9967d1d72fbb0cb609a844b4e98cd5295ebb683f4e1d9dbc1d6645de77f4b899c199f894032270c7576e75b65efd8b9f526c88ec92d6cbfa6d2e42818be27dfae41f3265cb361607ba2116029dffbca951ef5fafbfacfe4dcba2191a837c147cff5f0cd46195101f5d6bbdcf854afe6f73117a145598c7529dcaf7ba0ee8fdf8fd3b2afe5a3342152a973e34ae7e07cf45171bf39641164300fa1ae30562903b8f9b82a0a6624f0e3427fb1d3539cf8d24a1e8c3592589ff0250b70bd3691c6ea75914b388f67dc3b13a2a3600a44615b2e38c99b860fe509353e02cabe837250cbd1324cc0263b26490b20714c03a9e7eef5ed6ca1237b8b4fef9f432cc4d7c52ab44000071b61b955167ff9fbbb7b8b5aa4fa38aa9a341078c2233e76b112c9d21b7027ce114adbed1b479c4f43d1cbcf3e5302bebbe090a59f651cb1b228d1d90a89b561790ea129bf5e9044d1d3346b1ba5af7930f7753e2822ef7a05dffc11fe71335616cb63f8cef16bf6d7d806e299a3e60b22a07cda83a9596876251410496955b8c1992ee22376decdfcfe2c790bcfd9443ce72dff21358a8ab81c4bb56f550bd335bf03a8dcfae191cd4026a008590e3912d3ef9acf302e90f40eeeb82b47a32f3d4180f27591ff5455390e00b35e48e76a70e7bb1713ff389010ec5aed5b057dd1d6d39bca978c42cc2867bbcd6fcfd2e732c3e2ae8203b13953044f7407aa4a4d8b4c911c57ef8cae6a26674ab9dee5b19966f93f2b728c84b6c08bf19c26739ddc25b4266123209cb9d918d4a8bb7b09f36b7e17d5988d73cd109551d35641d7f6713f7f0f84f72001021744ad952a0349f5584cdbeb923863983016f38a5eb1523c817e0e87d1e9ef8226352930f201ae5b1fb1268be8dbeb6ee18fd26003d7bbf27f2c4d1b629a5796d85e8aff52daed3ab24208389474cb95464b75219f8991cecbadf4ebede65b23ed765153320f49d1a37f42a2e5cfb33b5d19614d872e8c3e0c06cf01a582c658d7d881b2088237a902c8a14c988459fc471c82b97b07de936450eb646c37f5fab100e914ae0107b453c2fbd9b995f9e6cea371fd61884f9f4cc2be95dc49859158a2e0c4009689ef6ae4895f1d4f200949e83cb8564b5efb55ef7e43c6b384f7f5304e1f351abc28e50042e9e92917f7aff312a9025244fbbc89f012ccbce51be1e347c4325ce002bf893de5673dce97b50f026b232becde3739fa3fcd4c5f068267a3c7fe321fa9263a137dcd2f176a8dc968bfd7ed8cdd35e3ac5126b168c63df85edc48d067d1ce5e92b6396cac77602868804c0ad8413c8f40c730c49c0669ce0ef7ef9a17d162da24d8a8b66adbc820b285ba856c50036664b6d637e4dde6898cbd3ae19416ab5eeedbbff71cb896acb758cf5601ccd2c6e9c2a74f53febbc003ad94d84622bb3ff93db09ca4ae4fb9fc8fe46c0894d8eefc373c7803ad631af5b502da1cc66055e6b3f926d43090019dc6cc3e65cac80b5f85270f9d119084d221799bdbdfc3e8261151b768ffffa3e064ec275e1cfbdad6ab0a8f0eb17f834d2a7053cd2a3d15f4f81be136b731d2813a457296a684941a41a5d2301a5700cc7c47414b82373467fb58a60975ea0a0652190d7e76c7ca1cccdcda9df5b86f8567037de5546f7a33489797750be10a28c9f5ac09ff3c08128d3a8b9a80425e5d6e9c1ccbe93698f7d05b1b0b7d4022978796e9fba38c3623d20ce97e35f4450d4626b0d30d0de6295c90142feea606a21d2a9c8b2dabc2a00ebc3bc0034d083e2f17ee43b7c9b0e1b42410dd102230d7cfbb917fb3b6a20e16897184881361a7b68a35c9c326c6b363e799999cb3d05c991fc63dea5c43814e2488f0233d17e399b199e3f122ebcbfcf9800982a267065a29bbfb75dec0e241fb9992e4b8197406f99fbbed59f963891f5f660f452a09606a221e0eb295a34117b8f351469534b7872bc1c76ac099e3cd3a95ee1119825318f9d0fd2f70d91a06ca136688694dd32733ee1976de81d5be9abe74164ae2c08cdea1f424f78efa1ceae93ec63509735aa1cc1efeba7aaec62bbcbf4e0c2b517cea954df2f5a2f79323b1b51d7fa1c35612953505be688d66f6cc620a7ff2cfbc147b8ee09d81e79b0346e65c4b9f8134b09752b248bddf169165d323ae1c1138caa0d54faad68cd5a0a29a3093c6a2a273909ffa871ec3f9794c2aeed59a13176bb9808a6034165db49f0972727bf457d88b97c76a266f2f30c69a659c3907cf208d25e3db6ce48cd6219f8399b3a7f83c00b0af7ca91e2d201e18f72a529f580df3c2d9c440c0db942e61a3710af5dae9a125d0fdfd122a141f1c21317ad7727e66111a1a442a231ac9f0ebb8a00bf5195cb93e534480d4fe9229151e9fbe25c54ca5bf34b2c20a6b258e451077f7678821e44c6363eb099d1d185dabc87d5a7de4e6f9886aa36d2faf6f02e5668d52046edb90566f8bf4bad8e174e683ebe988cb82a7613547b3475f9f3e1f684a50999c4742dbfdfb95b5969c3c1c136fb822c5271dcf8400cfcd48d8fc3fd46a8d76f4eb8917f728e532fb81f82f5d7e0c2b6c6f3a635972c13247ee8c66732584904f6a5c9b0f465fb6b550a5158e3efb8a4742ed179f5c629b1f8b165a43d1e26a66972bfa2a23c5c34d8ac2b4e0e8ca6b8cbf09edbee560225c8c1a79e7dcca71a738ffc41617d6f168320bf5c4ef5936068ee608ae88b2286a5fe22e580c2444a9493c492600b672a6f068252054b75de9492a072845924bb94e286506fa040c5e5d8d4564704140158612fc9707e4691506d0d0ae414c2429704cfcd0dde49bf2735b12f095f96cbc4de42b093188656d8973a5e174215c04cfffbdf173199371e5b9693ba1b87cae86af0f38f79b8c9e5d18fde4bcb4a6243f9755706ab7bffab33773f2017432861af9acb51c335e1ce0c0c4aea73bd067d00616f815dabf44df0077ba6dfe44697115e0abc24ef802f49bd473299f0f1a2d6fe20977edceb1465889c3e8f0726a6f85ede4d17b0d4f4e119f9b089649f8b810b182f212a8d4569a36f03db096d56cbfa7f2b7a973aa17b44221cf6ed25a1d03d77d904932289ea3d69a25bc6415765fdabc8d7da02baadfb2521c49efaddbded0f957b5eae4f2e3966e62bf2bf3db267df0694b02dcae490f8c15f6bac13c801ae7f1029847da0f47d5434e7207c20f7285b065f883748e8a20ebbdd2adf5b10982403db167c8c757e89aecaf1e8f7e6d1f7a7823fe49e49c2896178d1c15c6515f3a36e731302910413f2a42bc5498b8d7a054f8aea61e84bbf0c11e0d05d2839a3c7ef885b8f6ab42f027be6ebf97064d2782173b3cad2f91977ab0c906ec6c05bb3f5ee2f173a95bbd80e1d6168bc676e37c5fa1e16f1d5f8943ece137348ccdd1a653c46d4ce4e2d82a1ab45614d85cd3d146995f0e6473473d728ad2f293c2f1f658661366c627000065b80abc4b9133b2b501d85bae3ac522fcbbc87bc5d14174fbb6ebe7662a6bb3b71a5e3795ec763235c8adcce77e92ec0b94fb194f999ca606661b79d2ce3c893ffd4ae2c83ee28ca39d80942e1fa3c8032c26665bf436bb8161690a214fef60022666254f24773091643a820a93dd3296ba3592b5ed1d283ebb8b0d7e77fb332db3a9459f9ddaaeae54ee295326a408833910051d88f9d48aad576e1b38d3dcab18567047b68a2f66fd6d1598606f7afdbacc94a4d57dab9173c68b7271d57a9b8b73c0a32104813e22ed92eb8127a0cd8e8354897b2f23255701e75a5f9fe26e06fb0b1f1623e444514f1548d0117fd61941cfdc1ad3d949b88c6880da3f27e963f0bfaa25e641fe7475c9bb24a246fa9a86363b17555e9b80629e6098db54278c2db53b25ae8cc5bda06063cd1b81971a5d5f69590920e4190faa52a1b9dae60550be73215b0a9d9d0ad96bb24780deb44375f975db5799cf458945269410916613dc1999b6d0932319b7bd49e4a75e581bc7fac896dcd8c8bcc49a8b9b9f1f2e833d54c55bd7de77b0dfcd476a99720a812d2ad7650435c6c1d75318aa95497b29c54947e6484dca2a94057fb12e86efc9e70b8d33aeee254277e55f9855413d8360c7af5291b289705351cddecbad08b88a06a96243cf8e0681368a7bcf9a565e143b624f3e5b08e0e07211ebdd51d810a5a129a07f440617580dff01df6fefc1ae3215007ce3d1d251b960858bd1eab6458ed1fd29b0bb0e7720fe3004657561783bd71d30b68185a9b0c0a5a8c9f2ce817e1d4fe261c824d83a4458c6ab256953d4912d41707fadd97564aaba6cb49114ad37da8241ddc71357d3f0609b51ddec4f51577fcae6064a3b562a44982ce03e4aa964a9cfe32bc406596acc10498f7c8a1025c55dde8be29fb09bff60833ed3ae6598088ec23ca9481fe3b449e21b6cfb5ca59b78a58b6e211a0e2acafc47a85c074f8060783500782526e5c498d32994e308ce4c56d1fbf1c4de03ce7ace3f3367242696cb1677c25a31f04a3609cdc82c8a0c1ba2c96c2f77592b07271407ec6b3766d121543f44cc4b5d622f5249230cfdb3ff78cb68d4a7f77aa871df741590498bfc259ff2e5037af10aceb6d45327745bb29952ae03d95194de3454596397e60771617e8cc15c2ebc4c9513e555d87a35e8d733f049fe718e9bedeb6e7839be92d91d768455544f367a85b011e9b149e0f1cbe8d744702dc891449db1f0ad989910b1fc2cf3d00d418b08f349b556f8fd1d775f304643fd70e083878c7fe2ebff77d060a6189883fe3769de7ef304c59d87892da9ccdbb8a00d9a3205ef785f02a8ebf46b2e00f20a758290a092badfc35e658032f5d6e830284284d6018aeeba50715cf0a141e6a54d1dabfd11a5977f4ade2b59fad3c21294015ee66e0195d9d1970530df1843332a8e25fe98b4bffdc1cb998e86fac1d875c0d1f8d0d4a145a68fcb763e4b73d77a0ab3860215a41b6e69f1b384d8086ce6f421adb0e5b8c86854f937de24d2943f4e03f75acf9bbe35896fbc61da6f6071736fad1c5c1755d7a1c3996ba5708f05a1002f7e080fa48ba609d7c6d5199cf9bcd09e42b3f21174d6f31c176de51573edb67504c768d73bb2e125fdaa7724dd36aea4e8f4e27a8eab393ba5ef48e0c96f6d60d9329f5fd8ffdcbf97e96808b853092486c2eb4db64080cb7ac32efa1352c2a58bd9312052a16c09a3956349edfe5b24ade6d1cf146da76eafee9f6606f93ccecf29998ffe28db158bae6f61ff6ad5f7071a32a68432d06c17b7d125d70157d9e01f6c809fe5b39a04e1ec1236c223f3e2d307979472f1af78b7ac51b981e9e2c19d40214ee550d72bb273bb3b8ac366290d70025060be958b3375b434681755724f86593023c0bb3ef2c59ad0e3504672b71df6b4474f24e88cc1577eb88c546d4671df870ca95e11b0f5b7a934e38d4b6354e7c48081a6125019f545a7067a10245d2cdf2f7081f0ef083c0c4b6fe338bb044beb86bab096468e5fe26babaa9786184cae6a7996aa28c752376176c4ce19266ec7cd14bd8d5b88dc2f3e451c3fb2b33bad4b14255f8f945fd852a063b43a3bb55f25ff3ccd54e6b4e9b77ee100b6915f1b5068d437c5cc59ad6b6d626ea446e992415e5c1f52e6eac6b461002f0a129b6c4cab2e74f240a445234fa4d7e2ad15d8f45cc79cd54434eb74304319a6cf64bee9d1cfe4d9b4dbb44c73ee97b32798f7ef6e4e0363ee6926d6a9c523682ec0c8a53a7674aee045a34d70a0b5e2e584f3d72c1657265a469aec73e02055828953602afa3d3bb992a638de5dee41bc6fcc2473cc9a4d7404fdca8fa13d88b1d54dfd6eeb761979d7d0ef9662fbbfdee203f9d708f55f18e4776ebf39dfcaff0cfb941b996b54c4f665b0665068754c646c5dc7902b5d4b0f4be89ba6e8ecaaf495800026d14651db4004d029b5df4d3a171b44db6d2d22a6c3375fe52b6b71973e898eb0708bd99ad2006fe74a92122d0d4c81115c2900d1f099dae3961723cacbc437cd55afc71db63572caa712eb52112273bc6e4b8371c92193bef606d063640b6b5b53595facfe32af7de37104d15a7af75fb26579c601d1442dac2ed74cc8fbd94ddc3c6d9278b3107d884ada224db598bea87c34d9c706231936c0e60f0bea8058f9a86e101d321f497454801878d0cdf8926c6585d84760c65b2c1e250b6236773a487afed08992992c445181b1113133f3e2dfed7ddd1bd202392977cbe0f6119ecdc5bdd48a12d4442cad239122bbffc402931eb4da73052c0968b34e24106b4f2a34fbec678ac2021f41693fc1dc01b60df8f96598f0128fab5b26d3c7fdbc18822d700a1e7882964b4a86a59d4fa53edcffc1475d9562ac2169fbb411cd49eb258df32da28d224f1ab7ad181cbe42121305a4eb787a67e4d7949434dad07eeac1d502bc34e74975d4728fc68f0fcc57b7f171d0d285a91bc8e6e82de215ed951df3b1655570f269904bc698dfd1ac89d59fa016a62a1141d213e41b22972348cb32a654e880eccd7fab2ad643752149691b2dece60894450b2f0b907a0ad87d9320f2e0045238c5b5f2933ed4b383df726155b8ef77d3688b8b455e072bc486525eb5a857dfc6c73faf102acc19aa8df5488a7bb2fd7073aff7a5c3c3cfd87c3f49723abb391ed69161e49343d68f360d509b30f8952f3c9561ef288169855142db03b52424256d98f9a74da5451661ac7a5602b690e556c28c3e82cecc94ce018c250f8d2c36458ba558391f92b811afe6e0d5bc5cc76a6d825351d9d667743295dab01f0dad719f0c02a570e0db8abefa54397381bcff73c4e1d2b1adc455a7b01ec572077522616520332165d1ebf58b7078f4ca103d9eefaf1746c11c714e084ea578f577c45bb8ac1e03c7b94e000a407abe4c568de13630b181e8a78b0466097dec22937b41277f27a699ef57503dc3681d35a424980a14bb8315a1fbf1d6c28e9eaa562eb334be98ee5a41d232002a8d0737fa11983adbc9446e4fa873cdd3da4a70b46312ede72c9313dad21864c79676c3ce256015fe6e5c09ac00a90cda13fbd6e9447b6f4a598d6950278486dafb9cff824514d344cdee598625a1d9787cced83577a5ec9f364b92edc78b683684e227415763cf12b9d99ceeede63a5ba51f7edb985193cdbea444f1eb59ead27de982fa71d236460700537a7aef795439c0e7a61346960a8b36fda71a3a5ee80361fc080fb9285d2ba2c495e046ccd8deff3c946b25f556fb775551c2a7b0ad0de7850ac4c866c0ed73aa7996e9d82a99bc6bdc62279371501b95a5b71bdd5ed383a37070b74d80c7348c9547ce85ee1a9bf9cd6cdd2f1c6da0781fdf6c66bb162cfdc2f6ce1b76d95aaf2834e1dc12876d51bf638330ed22afdcdb8e54438c1f8831c61d608bd38e771640cbb4d4a5915d841c1322b7b8691c542587ef4b669bb3bf1b8b51a736d31d6636b8e08fe3e9d6f3e25a4431f549297f3726795f1bf77b38ff019e647af0d91449324b40d2a5dafe5bb8446a7ce38cc6fd258893d9a1bd7abb56761645c213d56b373cc62961cfc14c85ad463cb3992bb62266633b52869a825b2f857c48936e7fee6163ce474fd61c472faf488f4c6ee773ab447054b9c9a3ef5a62986f34a791e8d24ddb44c92b213c62db4467e79ed31eea3d86adbdb487ccdb6678a3bb09733fe06d95717e1c1b98bb7bd44cab1f000d408b23f8a5cf4e9ffa437d1e65013b2e7c697612a9b97c47231b90a9ebee62ec4fc9c3133c7f14b8bb44976370ae9ddda5d9fe7f716c545d47e4fabf1c1403ff1cd49aa964969e9c54b02ff80d60f898c3a70ac2440326cc6033e6461b9ffc9bd0c30674da0ba4859db9edeca0ffa6ce3dc90e145447e17ea7d4c6e65bb60af91ff9cf37eca710091ed3606143a584d3c1acffe033ccaa94ed02a6c71c1e74b5311030268534008321ef329f9c053ff8a015a6b31e5f2e7001dbde581132be7836020876bc7c2986dd9b800f7b948a835589051d9228b2ee13667b657bedad192d282423c988140b6545693309dd77e06dd6a8780b30838d4d4192649ea598f5581d50d0a30cd22e88e87b783c9b63a13b4f2fce6b82ee63c6b493a1b6bfa1ddaafb3a46d21e77efd07f9599e4d62853c3a2d6724d5a38e3ed12cc283c5c949e43e49a1e4a05f26ce072d318bdd4065cd74dcf0b541fa9509025ca3dd0c7a20f7fa77b9dd9041f397aea0d5c7815c81793c637e9e0a2f3280991241f184c6b7867d5f36987b957c2f7e77c65daaa57a0dfd098896f0c46507a3dbdad2735e9f8585c04c791849d75d01114e595924d344c482310fda04a41a90e7d23b80d0dd9e6327e1724e566c1515ce6085252faaab07efcb1290def28101cf0d3b58d1018f3cf065a601b375a0eae8117b85c58f955905697e9830264583aab7ea1c125c0df0d6c8132b2e1506ce6592a2da9e7b4f3eb34d0a7794e6edaa83adcac1b150ad884f492b10fe1b7f8891ecde0a2a27f3cc5e1e2ebc5c2858e9a607837e10376810ffb6ef653b94a79c0b0a637a5401d63cb26c925bb","title":"1834. 单线程 CPU","link":"https://leetcode-cn.com/problems/single-threaded-cpu/","question_id":1962,"issue_number":36},"34":{"day":34,"pres":["模拟"],"tags":["模拟"],"whys":null,"difficulty":"- 中等","description":"```\n一款新的在线电子游戏在近期发布,在该电子游戏中,以 刻钟 为周期规划若干时长为 15 分钟 的游戏对局。这意味着,在 HH:00、HH:15、HH:30 和 HH:45 ,将会开始一个新的对局,其中 HH 用一个从 00 到 23 的整数表示。游戏中使用 24 小时制的时钟 ,所以一天中最早的时间是 00:00 ,最晚的时间是 23:59 。\n\n给你两个字符串 startTime 和 finishTime ,均符合 \"HH:MM\" 格式,分别表示你 进入 和 退出 游戏的确切时间,请计算在整个游戏会话期间,你完成的 完整对局的对局数 。\n\n例如,如果 startTime = \"05:20\" 且 finishTime = \"05:59\" ,这意味着你仅仅完成从 05:30 到 05:45 这一个完整对局。而你没有完成从 05:15 到 05:30 的完整对局,因为你是在对局开始后进入的游戏;同时,你也没有完成从 05:45 到 06:00 的完整对局,因为你是在对局结束前退出的游戏。\n\n如果 finishTime 早于 startTime ,这表示你玩了个通宵(也就是从 startTime 到午夜,再从午夜到 finishTime)。\n\n假设你是从 startTime 进入游戏,并在 finishTime 退出游戏,请计算并返回你完成的 完整对局的对局数 。\n\n \n\n示例 1:\n\n输入:startTime = \"12:01\", finishTime = \"12:44\"\n输出:1\n解释:你完成了从 12:15 到 12:30 的一个完整对局。\n你没有完成从 12:00 到 12:15 的完整对局,因为你是在对局开始后的 12:01 进入的游戏。\n你没有完成从 12:30 到 12:45 的完整对局,因为你是在对局结束前的 12:44 退出的游戏。\n\n\n示例 2:\n\n输入:startTime = \"20:00\", finishTime = \"06:00\"\n输出:40\n解释:你完成了从 20:00 到 00:00 的 16 个完整的对局,以及从 00:00 到 06:00 的 24 个完整的对局。\n16 + 24 = 40\n\n\n示例 3:\n\n输入:startTime = \"00:00\", finishTime = \"23:59\"\n输出:95\n解释:除最后一个小时你只完成了 3 个完整对局外,其余每个小时均完成了 4 场完整对局。\n\n\n \n\n提示:\n\nstartTime 和 finishTime 的格式为 HH:MM\n00 <= HH <= 23\n00 <= MM <= 59\nstartTime 和 finishTime 不相等\n```","content":"096221cf5b628be1e73e8bcfe626c734748e23900a3d41a84f0b774c2134766b2a9ce16c4f888f0d7d43b13eb80f2fa76b6e65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dbb5049b79b730c3e5a6bec05624820f74b997633b3e1271aec285a471c309213a5cf68d6eebb39276ed55ca1c1081ed344b313160ec2b9c279432e2c4f98f6d96ca476ea8a40823ae94a55c6017763326a1d17722707ef8856f1e5e11a8e6f97a21376fa82eea484ef62402588f71f4546ac876e291642880502570b40bcc6b4b2da38c0b76a3c0313b73919e6bb431cbae45983a6f1aaae4d7c993347039eceda443104a4a8d6a6f1f42dae602f483e9c7640c92f2d10ee15d5449e11feb129c6ea21adbf3af47a2d408af3462cbe8049a98a124a93f6010975146e2901a5ae4fbc5606dc83c4819ec4752bdd034464d08358e7771d84c0d8575e46f0d7c66183d101989428f83565e4ee282f6f376bfb379d954596325565bb09700a7ac3bfe181e575160d03e8df6df3d3321fde8cd32abeb150cc42c74ff083eb0f782415ee27ded29fbd14330274c068db8426f403fa129d4cf251fa2d7d059f7a6e0d2a96dfe00783828c642cb74332110a9c8ee3d946e70a83d774d65402706e65a6cd8d8ab8099518dc8646a73bc19ff1e7306d08f38eec8ff2c703d4bcebdece901efba18c15b9e3ee34f1134dece792c6558af6cd0228564f2b3fac4171292c1edd6fed866a89e5a0ee6d8de70cab2c8c496b79fc163480a91b3bfae0e196779530bd9a85d1ce6e8eef62784dde21e24df3f1d4730b7faf5aca210ace43dad759d3426f768d5b53a443c04b2fe401cd6c60cb4e688b7b3876bf8d23c31cbd4d1e6cafbf0db2c2ed2290dfc784f394d23a00971a3bf332970438d31dd6ad756212cd86ea54c974d84ef17b0d9ce7edf5e07ec195102ba98c8ee285c2e2ae5570b8b30e4fba0883cb10e95c25fec893fef540c4af92e88ae2768a47a8efc8f52487e329669059ee271f88ec713cdb37b96404b593ae596773167611cc54f8addbf7d667b6837937eb203dba425b5264d1ffa9036ff1eacac45629816eacc080a552f8f03ebfa7f15592cfbd4c534042afafa82c3739f2b8a49a76b8359ff913b41199b929a888cf2dd2977440147233d31092edbd9c03f34389eabd93db51224555d27adbf5b359be7029d6b81a3c4d86353335e61ac5c45d0e5cfb173d7c3a3f10165feac3c9470b933e62c27d875a99b21f90a30a5b548e28bbf5b337f8387bf8a417087716041646a4fb39cdc69a37c61f0857f24ff3470f3b364ea908202d37b69ba97d8faff0fca7b2cfd29ea5a45b9619af5552257ecfffba1f2fde9e2ca6c4ad194b58ea714960851ce53f4e6a8dd7fcff5ccf3c64e5fff992cc9907af38df56f1b71e4a96162e5fb112f9ce4feb44f27c434ea57b906b96b67c766e0c8d35d88bd28987bad57aefa2d2004b64d4be64017e5e0145186f61e076e3ef89abae1d398e65ce441746331cf8671ec3c6f65d2aa67d47662da9cdf49f5380b0f72a82a4e05e9088162c5cf13d396cd35cb7e16f18897d6260c865f2640d340544466c9a866ac9198a37a050333ff0617332548ecd5b8dc0cd19dc4174e538e47b97cace1fa9e771bb1274c880b5f521d1a1102d3cc3de09fd2a3ee99f36876b7240297da573626d6a095788eb8422493ff63bc4c727f02e0b36c8d6c7f9e515634f846e4efe3d953947e59c0c2f5487c089738becb80eee3d46d2ef9098748f0e2d8a89fa8e342a086bd58f37bd2dd102486c40255d49411c2f4f34e29b97710190e3b8853102595d2deccc1d6f7b1639a77658917f610026f2c9188e80c5f6421448eeafe676577f2afeb3b923ad4014a61bd83e795888b8c06d3cc4e67c30fb765c03ebb0278fc8a87bb908a5a56c6748eb9b4457195932d3f51767820facf6f549d595249e4f79ec7fafbc26e5699decbc8d92c28c565c017e74916c1f3631e6d0242939d3c43dc6d9068a24dcba2f67c796bffa27cf05e2b15aa607662228193098057afed7b444ea57c4d8017627174c129ec8e571cd94ea7679e343d72ba08d1022d5634114057600d3f4b3b7568f9ae6834a8994d0ac556adb0dc94464c526fcc6607d9cdc13cd0b258e783b8660d6df41eb263bd330b068e2f3f2ddc7d1fcdbf7fad6bcccf990be7426878c0be374a5c9623b7238a8d75267298594026761372201133e42494c4a576916f9f6cb31ba4e896dcbbc3c3675036bea803080a4dcedfd67509da8d8b00e48ea0971b8f1bb4a345e1db0f94cfd0a1c4735b6edb89ee81f6c70a3ce90e12a7f8dba1414dff03caa4a6fd633744f252dfbbe05c397252e230ab27fce18f07e031fe329a69998a0897b3ab7835699559e70d607601e44ebe091886da8950ad6bc6f1f6e1336c69f3ce393b961d08749861af0b319a91a3e7ff07bd5e37d043b02ce648459352055b48dd9f66dcc0a40d8dfc0a3856e2b953d69a12220ce022b2688ec3e9b87512bc4f8c550aebbc4d32a11194a9e33b5e0798063ee31d0d005ed6900c5115f894a22bbc0748018bb0a2516cebff6c6dea155010ac348464e378139f312292a35445b7a8c99760a244a3ddba7e3484f025e208bce32cc464ef932ec11fcfd90077e18bf20ce2903c8a2feb98a8e087808a9c6afb9c5f63b6b221a690095561db2efecafaa58e69b383feb2c7842dab7fc596ec32b1be0dc2b39c76707b9e6562d1e27ea5fbae67bacf542a7f99c0303024d5af9307bad5f76a66918847ebd926eb1abf915d4264c94e2210753f7dc141dbf94935fdc3a9f10ece7547dde0f0cbd5cace7140389ccf364861aea467a430ec35ac23f7b5a3a1521f7c97a85f4761b445cb2380189773a77af8918391bb387b23110ed400c61777be2223f6b8e9c148f11043fa33e1b6c655d89f1c6c0a104400abc3d77b7788f38d57c17830274a103bc3e1e19e98fa742b6c3f39f6a947db718cd221394004d2e07971726f5b66358ddf8ca022b62fda53c91771d3fd945932660a3117ab03ac21e25714ee6d599b00d081599f8345ee7be6d43fbdff4b9168906c6cd072cd8cc4927b5a55dc13fdda7241bb5eb11afc4820f572dd1ba88692e982c4cbb8b6d07dfada539dd5c3d9e47ade18f1e9d41fb3cb812948e71a3e741ddf3656d6685890b1cf32cf5a0aadf30d9d69929ab5f562ad2aa275544cc5b3084d02d548f5cc3f5b363d87ac40e7a79e8b8a68aa52663a3a3259c217c30e7578e69ab039565b64ef3557196c588017101c2af36a6025714a061d6c9e02f10159196bc944560a5c34d477e5e4d38d4da1ac26a8934545523e5c3d767bf866585deedf3b6c6eff6f55912692c3ec4b133b123d00bad76da5c12dbf2a02125ae7589ee16c1a771ad22472e0ffd1ef2405a18f31048519c9cf870549534403b2970df4c1336aac072788b63e8a669f9294c55e57b389a38b71d9575df86605661b4baf942bb163afe5073fe4f4aa86a0daec57c9e49f80c0f1754e6d178e528ddd5d118aa1bfc33eb65af7c0b4d14a89fc0f350d14f73409e1b58788c36835f34916bcc4a9ad9b5e7726979d5cfa480045bdb24f8522f49e751bfcddd588ee9ff8a1aac38960979fa3ddc59784bbc4a6e114dba968bd5e4550861a742372dff771c31455bb4b63076009e6112c0da9d4a9ea31380391f863ed1184b4390919d641eff99a3f8c64baee10edc1566e8ca0b944ffac2ad8cbc35460b7c63ce5e7fc9a2eab1bf3f36bb3b8870fb6d60d7501535e016e34239517e963c8b2f6bd22b622995beafea8d6e0501f15496e94aac0b9cdb659f804c8fe39abc7df5a738d103d1423551b5c72219265c0f6d4b0251fbcce315d96635012462f5e31d87ee0b88408de8870791a3175092c376ab18886aa59a1fda0ad4ed9eb7ed90c7e1310a27aca0aa69729821fe29253a8ff5b09b8e8604c1e54e576cc0159ac1b68b6dcd4f09a4e574eb15c81edd3ac023966975beaa5ce2eaf647b7313c4a53aebb25bdc89233e11aa1f54c1d6af509c4a5777a2774e4676ae5534c8ce9e8f3ac637ea20e71152253b2d25198a880e1a44d474cbc9c3d3b28ef7a744fbc1c175634ee2932966f6622db546eb79c1beda424ca6545ec3bf35b15d59a63d9cd853045eeccfea94122e277bc571bb298647ce6d6c22e3eae14b3094beb25001194952182f46a0acafcae433f6e9ec5eb4ff8ddbe9ec7b575f3d5b79c1bc1b529d0c80d72ab8e74d1c597fc853930b49e0d4d887d522d9ee282415767fa80068b0de2bdf94b47e7f5b9b03a523fe0f8536be5464e78a0580cc0d2521cc0da6510b843c30b8b8d7103be74f056a147d595f2e5fd4f38d029315ed666968ba64a5ad0e3802c1b021ebd3b00fd7b0cda193c0a0e8a2d85d242c7a3dc2983f019059c49f2b26bc7303aff5b5e1a2c1cb566cb7b47d0464bff5353c8bb0eb6aaea3f554c32c49538a68dfcc7b8b0d32829aaf96712c99b8b276bcb94b65460a2d0160c573d10ce87fd305d00ead0e62116a790f61e5ecd07dffbe1050a47f60534b5c1172bc544c9e2c64eefd0802d8c0f2ef8a96b6f4768c331aef67e6453b528a0d57297f6227d6d11ae599ad2b8c410dccdd1b496616ed0450c63941c73279a6cc179f1caa469b7500956ffe65899c355396d781ce5111a80f01c818abc14de6b814ce8891875dc682a187f7503d10e4e80cdd4c411e10a731a5258567c853ad03fd9627c3036f86b532839f6961ee0fad410df77fb2951c0adfde9f1ae4afe51ad7976568506c4dfe3801974af14ae926e1ca6f85b98e95d976d1767977289ffaf70863fbd2c12000da10926971624c4302ccca007845f0897719215a3affc076d0e1a534b5858c948fd477e3f369d17f42f1e473591b7b74110c694eca32661e37e7b1037ab14e16857280c3f8809436039dd34997d6086f5aad8fd7776e51c35a13c9892269943a447e592c2245324a7ec89931b2de2e5a93500085dbdf8592b56ab5986a123263d32c0212bc6ef1e588a602de128e180bc636bab876fbcbad3f87a99e4b33552ed63d103d0735214c15f4210afb7585466f400bade394915a04376634d47e6e509e960ff18230cdc4660bb221744a45205568033d0384e8835cb444d9204bcd26e4c57a82dad7dcbfc90f1cf5ccd58b11497f81bb8bb07226deca7e4fff1c0f1bca9319e63cf65a39c7cedc0ef2197b37fb0782842faf5a9ad43937a6a093eaf581fd402469a648ce8f9ac55e3c03a2ac4e718376eaff94f3c18f8aa8d78c7957453c55d3648bcc4fd76259cc83511644fe17c9d082ada70ec3dfc86d3d429705a32921b1064eabfaf36d8fe4f23dc47b49dfebab0a8cd51c5993821ce9d6214e17b3fbec2520253a2456dda3741a9f1e16ee4c27eabeab03ed24c555ee501583b4941020bc8d50b1e3ff22b83f4d057a9736ee8a90ae44a6434e35f36c5715a038302a09a3a969dc784619f1e8bec895a0fe765f617611ad0f82ac607f29449a7301066ecaf565953c81974f4957dae809bad88c16b135c40e633c437d4489c66482f6c8b78e160f4408bfb54b7db802109a8338a3f8f12e3bc8133b8da2f19d9268c9e128f6dc223db5d541c11bf73a9f45c6c0c076120e7b0f2c169261b7822761aa4b5522bc5526373dc65bfb9782caa5ba108cfa1d8931a592546132f59ca29d651852344ad054f18a9b09310f092a4255a4cb5e39d39e11a8c4eb582a71cb420a74e6f979f5f6d34e1b4af36cd6549615b9fe0e73dbe6fa9f093c87cd97bc930817ef9fe0cf588a735a56a3ef5f84ccb68a42ae593c04bede48457f2a17d0a4809035e85e94a127e0337c0562e89fecdf6543390a5675f9c973388730d4e917d3fb33a8db8ae807711251fa9de74d37041debc9a784b38b95b6db8f023179dee3e63b5f228fe8eb08988eb7bb561e003634bf45d010725eee8902156c99525e6f36ae82149f0ed0b64b83ab5bf356da74f8d1ec5769e751d85da5a54df98212e80893b98b58c0260d453f3633373823a11ae97cac57923e767b35db716ddd160d8b5b9b9fe16d685ab79ecae287a716af2cfad9a20687209825b922682f7fa0a99cc5cf38e6258ad7530ba48c3c05be53bf7b2a508fe4b2979267b0f71fe2e273c51a79e32eb9893ac7660bdb9d862c0f522594b0d36344fd71a5612beb2c2fa3dae3240563b6fd9ea722a9f0be0c5c8035410e0708b072388ca616a554c415dd05ba1ae9b59445cce0373e2c2f391431db69769f5a75e457a36df6cf68719f58f2bfe8298813e6509bbfd412d3857c94e7df92c01c274c65bdf5f3283e6e5c1dbf1bc597038a5dc4dcbdca13ba8980ba60dc560de8d2edf8cf9e6155f499c022af94fe4023af3dfa1ab593a0b84e8cfe8cc04a019bc1e9e1133d701bad630df6b400d82fec624adeb2d21bde03b303aef2c20047c9fb3951821502a42a97b8cacff2351f83f8805d0f0dce69bb8da5982cf0533a26b0a4edd84b9253fb50e51a073f10cd74632da59128856a8d749ba4573a63ebc6b4ff65610179c5f9c0c321f79ee94a9f363a58f755bf0277cb3701480283bb805023a20c4f34feb5fe3a0eceedf72cf62e317f568e936cd44f86f8776ae002baacd3d70de4109c8a61973948da5be98177aba2a7667185c596c62217620a83894a80a5d409d87205fd472149c80361c867e94bed3fd2897da40ea91c028c66bd0207cd0df56fff66242b7249118a2690b5693b25c6df56a96d6fdb0e0dc665db41639de2e529b040a49f3a5a69d95514d04d1dd4435751102372b35dcb45cd1122210ba59d6420e7b9e13c5d5e616a0be1672e0925038a4708e787b5ef74209c4f053ac014705d037593aaaf3f726a79a93ebe30eed18ffff6c9cdfbb6f99fdf5e2d70f7df326e98a864a14341aa181cd8461f2654ac5176a5df3eae9c2e1c6788c21cda9056d5b60c8ef168829861bfdc4c692d335416cd82ca6c00781b4073e1267861c0656fec6ab9cc9ed151369a0268bb783fbb574e6d5b002a01e2dd19a6a5f1b9dd7faae85a7ca7d20c4cd54f0aef23c229b9996c026ef68dda","title":"1904. 你完成的完整对局数","link":"https://leetcode-cn.com/problems/the-number-of-full-rounds-you-have-played/","question_id":2033,"issue_number":37},"35":{"day":35,"pres":["计数","枚举"],"tags":["枚举"],"whys":null,"difficulty":"- 中等","description":"```\n给你两个字符串 a 和 b ,二者均由小写字母组成。一步操作中,你可以将 a 或 b 中的 任一字符 改变为 任一小写字母 。\n\n操作的最终目标是满足下列三个条件 之一 :\n\na 中的 每个字母 在字母表中 严格小于 b 中的 每个字母 。\nb 中的 每个字母 在字母表中 严格小于 a 中的 每个字母 。\na 和 b 都 由 同一个 字母组成。\n返回达成目标所需的 最少 操作数。\n\n \n\n示例 1:\n\n输入:a = \"aba\", b = \"caa\"\n输出:2\n解释:满足每个条件的最佳方案分别是:\n1) 将 b 变为 \"ccc\",2 次操作,满足 a 中的每个字母都小于 b 中的每个字母;\n2) 将 a 变为 \"bbb\" 并将 b 变为 \"aaa\",3 次操作,满足 b 中的每个字母都小于 a 中的每个字母;\n3) 将 a 变为 \"aaa\" 并将 b 变为 \"aaa\",2 次操作,满足 a 和 b 由同一个字母组成。\n最佳的方案只需要 2 次操作(满足条件 1 或者条件 3)。\n示例 2:\n\n输入:a = \"dabadd\", b = \"cda\"\n输出:3\n解释:满足条件 1 的最佳方案是将 b 变为 \"eee\" 。\n \n\n提示:\n\n1 <= a.length, b.length <= 105\na 和 b 只由小写字母组成\n```","content":"096221cf5b628be1e73e8bcfe626c734748020930a3d43ae4e066f7323046f6a2db9e079758aa3327c548832950f2fa662a2e03f12d0f35741cc7ffe416f30d677f2ace36e048899632bd6b1998e073078e8788380a2039a31f426c0a9a0a3801632dd0663b99e233a7e0477abdfcfb833db4d273247e6cd33e4ba8a61e819b47341d1e0a98684a59a36a460ce05a03da096c26290edd7be5a27c1b02b6d7bdf93e7fac0e03544c2cfc7e83dc15d600132e088f9105520371db56cb4b1194c2824d34fbb0c5e890ef2d32e20f0233c33fd2398f392ebce9163ee6c0f620b1bce81c7b939f5a24a80fd1f13f5b1c984f3310a7cdc8fee46651945ce07464e24cfb453e1daa0da38bf2e234c778d631034c2b3e835b86d950dd9c08547bdebcd7f9467c3fccc4721a3188b3d6b2750287db6c82e3f9dfe72cf89542c9e6ed523956d0ebdc98e6c0f7ddbf36b999def02eed6a099cbcaa7bdd6d64ee839da5c61f583f7ef7482bc7bfd545a60075756ae963aa4af0ce81b1476566aef3fb0cbde0d09e50d29096d95a56c15a0737a75083cb5330af15ee849c703c38343330565078288841c5f58e439998e326bc4fabbc1aadcc0b8e042b54b486f6efa0e53eb27e54dbca1a816c73b77fa6063e9e1f77557d922d6b344c1c99f35d1d924235cda53d697743eff63c64ecad028703d4b08ccf58f72e3f665c3ec48a1545fc46ad6c46837656ba262e8108646db7589ca5b63869b90c9510eef1c8b020ee1e0f19d5ad153bbdd85db9d710943befff58eb91d4b5dbdd24b6dbce4a7f8ba4bcd5498256f0773faeba2ba66097940615d2c6945f756f54e1a9422fbc0494c9e2c1209eeb4007ac4ecf8d2da9fef1feab8793eabb8d9a4bedabfa60cb4d0082d392061824e3588cd29add586701343eabc6d8891e4932df45ba668988a14ae4ea2542201d72475dd530232c8565f3ba6dfa8e61390bb03b451726412f536d70f2e3fddfe66f2064c6b85801daf177fa24188f78e684b6b1f9857269fd77a3cd3c379b6872bc85915260f83ed6d513f7d43b647ec9aa228ce1e0d3d3292ce12bffd193df8d8b3fa863239e21069b98e1ddc24b84304536c90cc7546780f8db07812b20174b7007c5026e64cde0b92716bdf593919a39cb6265615e8d4c69f73433563674b45015356ebb299255ea3796f8600fd5b32373318c6e06dbf4e7faf48f42ca9f0f349512f44b029fa8d0e5cce866bd7c3b3348d8b7a5baa513ab960b21c42789561fe22855328f927cb6576579c724fe93c0f88565f41d2d89fe8c380ea988af232a1ed70953de3810838baa506998be849d2343d97ef82d9977de92271f742b3402d01af5f8d456a1fcf9eac8e98a5d1ad884a38a7b5d0de806a199e9f7432a2d8305ad7a595e88c9b64f33b6ffb470ed6f289e36e12682279e061f6ea1039aa225445cafd68fb66eeb1126ae723a9454d1c58fb573184995a885ab6c5ebd490b6707e2393b7edc829518dda1e07543efd90b9d4eb9bd579e655496008df824afdd01466b7c7578e1178bbfdf317891d655245e44b5d66812c0a4812497799a9b78620f3c50414430aa9da429776649c394f2efd0cfc36fe03445cffe0a63ade2b1b370a807e92e3f155b5a26e1764408e43b4b826a4af84e7f4f72c30d1061e043e65c0930874b060453ee2f989b03622816d52d2d8d1daf71127f523b9c12a22f0a67f02a221564484bc03c64c00f05ad7ba279b6b012a69814f3b875cac8c4c189e1d3982ff8ed6e4d67106f9098749fbea3a6acc390da8306a6e15b43e5f07a9e1e0e166e7aed29347fdc0522ba47b1a393cf322045977c181d7b6c4defcf6fe72dba06c837ccdd4eed0764768bd97faa6992a2a392c601e6b7b23618975a80b1f39ade9ac9ff7e6b176afe7e365d607b778e4d174dbfd47004302348a7c62c478a0b8be50b9d995a53f7694308451ce5e5e73caf98f4b82c6e54efb20f3e65cbdcea0821be5bb0e9f4355bee1406be034451053894497df15f7500bc609982e1ab8f3a3569556f14c39ca1bf1bde843d8906ae079f15beb5864a9636e8d28427b76d328d496572cde4fb5739c261a708a191891878b9e8a6ab8cb9e3f9f8ce3be463685a4015d1310a30890f5781283fac66ce3420adfe228b6b60035be9bf432312a8c2ce12989786c2ae6be9be864c2c1452bbbf0499a7209dd66c5b8dd91c11d3114826ac62fefc46c74248232d6807c345e213229e4218ec79b5b926dab6da102a5e58cddbdc5c3456d37968b002a0e89474703f9b413e7977fb883e1cd21ee72a6f23fe9bc4a95a86ac359929d39e8e3524a338d3c7e871354f8cb7677ced929835ba4a1e2a7bdd320c1497e807c58185a8b72a877a1ced25afb55ab08f50c8020e6caa6f6212f01e87f8f7570374ae501e9145ed9f2d92baf2ba7d3a5940bc0be4965e9b41a11075b995db00a358493a3e1ff06b25b2bdbac3589e96f42946c0c9fc197c561772ef705faa10fbdd91f03c41a5687ccdca9a978c7575b616fe8bf6ad02359cf117dc6f6459f6f4d66ffd6de00892e319f98d6dc609d024d14c5a06dd506d7c0a6848d85980dce9f344fa44d5d62e417ef8c537811a331279760e6f76b1068533e861c256c6fc59e534a469d3c2d34824b66c9a32fd72dcfc53476e786f22cf49d0eb727cd906c1a02829f9268dc929af7216dbc01564350f11e8c44d088b54914ade14200161446f678b7decf59cbb662bdb2cf3d71330fa4a1b6faf072510ea93e5a85a7d55f5b8dde9142a0983cbad3d9acf5c2d16d6e3774dba918341f375cb5a1d694a3eccc05bb5876f9fa637a7677b21beedd15283842122e40b6a4b14473edfdf3732bd177954edad41381dfb2fd2123031e12b02f7af221ff4ce00bee1abcd414e9b8d7cc161e7f29608316af4170c9512ebeecd5a42ffd7408f35d8e9dbd07f01e0f0dce4d7c69250d110959e9b99925975473665b4560c1b48284dda1787d270f7ca8820d8442e6a12f5138259fab7d111f7714341d1d0f14ff9e6fa501b15be7b769130d59116ac9d2fad467d28630025ceb624b9a2acf8a5d8e6fd238e03b2aad6107c24fe4904e51159b0b061644f5879b59d751db487db8418e18da4322d35219eb5e555f1f604a6a7c306bbe321079ab0e435332cf6dcc6a760e9f7fbcab1f15a74f77071ac3384aa81c11ddf4cff77df609eb7cfd6efe4270fcd9276a549e1e2f5798f00221a522ce3a4b3f58353d4205ed203a560367ed2bdd895e106d184ad807c0cfcbcca2a5334cb7e448f2da8746728d17d694ab61c1c20f4b63051da5249c349bdf3341c4449192b0f39d46420b540989fea764ec9a28184c98d28920eb76adf13ba0e254025c812a61d153989b90727a490a5b7281a3399ba453b94f540f129b75f6997962c69915a4d3265f7f2bbdad6429ce8877bb4b507782e8b2cccf4d17952c0a87f07e949b662e9e4efe15543e659bc0344d3e14b447b49968f8c2a5f5db4779a6768b0823c88540546f2b151262cf0c60254360505f066ed0161aedc1377a882595873eb75af1c0aaf1a61f56c9b87c73c67a57cd0264f2cb1177c90d4ca883ec9ada034746de803a8c626f1eb60e8632b6312cd9dc676e1335511f0065633e1dec7c3739033018401f49375bf85728a03afa8dfc25dfd895b75b53b673e69a2cfaabdb969a28d2acf05972492589b5ac5468d228b900728f84da76e0c515e120df38b99a6cf4823741ded38c2e9aa15ebac58b0942fdad11a69ed3c67b987c8cd0ea750f11c60142cacfa596f6a7e9cfe05d9552e600503b7ace21b632ca67702f2606b5a967c3e85c259cfbf5de20c84d90c655e8f4932b58c5633245566d72317c5ee17ab182c213ea81101a89e1593b657f27290e65c8178690ce70e7e833775065488c8aba06c7bf110cc3c98c85e1d6523bceb0604076489a35882cdecd0aea6bfef81bb5ac3c08fdb46b3e4b55ba2cdf691a9a61199585acf8f1306c3ed965e6b5cdc75f03fa43e379a8c10da85c747127cfa43cf6b247fe860d1713b43951d5ed43f52c4a7c48a366654545935430c8cebcb539de2be52bdad4fcbb3be2b3a1433491db22e63493fe83afafc6bebb1940461718462a7624edf066a9aa0c4af856ca98d9aef5e81262a9e72cd10062ee78b25bbdb4b0ac87aed834687e39cc387cfd468304b62275a62549f9f1113375d8aad6d5bf9fc0e6752a43463a9d723710940325000a5a49effa979db516a573e2e85bbc3f52d27b60aecdcf9916ee62f98e7c4f5f541cab370fb5c7dbc9ae78cce45d56fe4d7628edb0029255e810b546b16828d5ad7ccd5f9faa7c00769102ed0a21efa385bb8cd4103bd689aaf9db264f3d405b80af9a6ed51aab2e6b3fe54fced42a5b73f7fe5edc8bc42ca6e9deccd1f3ca97b5992f35752c0aa7ea3250ee65b5f23167c6537ff1dc19766903421951dfe57540058886a9d51d4a31ade6a8b53fcaafa6d433ad8be63dc221550000652c1da305653a9b3343c46647382732557ab629803e8e05bf6bb84cd5e2d1b0afa08d6e3310a0611c5043b46e7707c5a6cb91469c0ddc6a64581fd79223067e0132969cf7758cb2fa3aae1f82b2935b662f653cf3f222478e161966c646f6fa1f6adcd886b62afdf900d7aa538cef626583dc5836db15bdac36aa56f58396b09c645c722dc5d95fc6ab5c4991bf4eec7c9d5b65112677ec8fa14f789ebacd0a7afd00f58fbfc23bf0c501d125870fa803d7e67e974b20c8a674af822d65f46cc9012cad05ebc1544591f4b530a7e3a449c7d84369487c4bc81634c232b542a82fa58229caa59fd09c72841042056cd7b4a2716ba8978d660cda43806771367a0a06c7d062313ba285775f681473ac880299aca361e0988c83d4ab1886bc72db231ad2e47e59542930190b7b01cf4f35582afaa0643be1465fcb268cc3ea9a86644ae9d6419cd03a3616efdb93303a5ba85a13c9892269943a447e5a2b7c453e07379b992eb2c06156d5161a8c87bccbdbe622c1d127573c3083600a08e76cf6e7cce666d653c04b07c67affb27e87c2bd1e87e5db053b3727d679567e1b286f1250b04e6b8b3cab0b625e48a7fedacf1f405804449d462a609ed20ffa9f30dcee2044e0213d4a0c6e1c7c426344dde0c11db44ad22940f23ccec57a82dad7dcbfc90f1ca1cc9bc6017e7f90aea1b07226deca7e4fff1f0c008cd908ba72ea082bc489851bbb066b3fc70e98ae2faf5a9ad43937a6a0c0a7f59cfd533417a643d38fd98a0b7212abb77710eb2c97c994a08c8f96b5d7986c4d6f3c139c368b864f9e2c599ec24c1c01eb5ed4df82ada70ec3dfc86d3d07db4ce52935a40606aba2a36dd0b6a765802431a089d040f1ff1c5993821ce9856c4e0ab3eb876b732527241b94ed7c5bd14d49a61825ddbeba29ed24c555ee165ad1fd9b1079f2911ff0e8f567ac2e501072ab3ff4a090ae44a6434e35f36c1258a071302723b38369dc784619f1adf281d3a0ef25102f6b5be80bccb0322d7719f57b480a6ed8e36c8f1681974f0c1adaf509abcda616b135c40e373c48250883cf31dfb28df9ec7431437589b55f68a228109a8338a3f8f168749a1371c8a6bf80c03a978c6dfe952b279fd5418457be7c9f51d3c0dc6b124b360f64168f6cadeb6834e41f1070c3345d7d40ec1eb6979fcab1af3a8cfa1d8970ebc1542f66b8c8ecc66c560b385c945dd08ac8441b0f092a4207e19f0b2ec99e4de6d289720a319d1220552014851b6d5f8a82f536c359d94b90386eb5a8685a2402f0ad1767423f24dabf555a5142b43fe39ce03a2bc11b594378df7b94ffe95d43e5c3b7b2925a6c3ab71fb60adafa62ae6839460881fa95cb2d421f201e763c855f76fd168b73d016970de3a1a267cbdba4997edc944150b3cb2e8ab0e6c895f0e9cdef5838d075764bf4ee9841488eab0f47457ec6dbe18fca52d31e9efcce54cf641db511deb3c1b26bd43f1b8652cb31a828de470f4783f8d7e15558fe51c066a8bf55faa017eb1f830339b452cefdd3b596fac8d0a268e5608d799962cc52160cd66d70d05657c437989ee123013fb39b87f196c814b762b6dee337d53f823da5396f7a1badfdd988db31e17182971da04b47abee75c04e96bff06c625e73b44d1447a4771fa20ea0bf3cbe4519f477a29a515860ed9fd38aef7576f0826ef9638adb963967b4c1ff3b5a2fedf894ac25e4dcb51c1f973e1d45294c952737cae31be901871fd940f515a33544a5413cdab1e3f6af8ac350a0820c93ab28ad0a814159a1c60b9e46292e815b944e25c488b44ffccb3aa8839ea082d8a366e26470f00a306d702cbc33e5970cab5fefc7bcc527552c0873c35493ab4d5326270b4395d3156f40f457123f85b228e77d9b31165e18903b4b4b7ce1c70874267dbffbfcd82bafa32c2fff52c81cf1f7653314fd139635c5064304bcee0f4caf983581c80771ed9eb493f495985a58827a070dc866b88abb9a31eb553a185c1f791dcf289475e72389b2fad335eef4eb6077e941a349f2527e969ce12d7c1331c5ef011580bc94a06eb3dbe9831d8ef2df74d26be4fc0584d3d4a8e1efd40070b8034073b7e1b66f4cc0aeb862f9aafb9545d4c57508c21328f1ca68dd513e2c388c31bf9a8a5f5044579d3ddde42d87f8e1511a1d714021a38285e61514331f2317a97ab7817a82afdf0c9ade0dc866c939e81766ee2bd32188eb73e642ae8b619b1bf348a38bbcb1e9bb4f8c2b73c0b8e06c5f9303edef34f0860ae314c1e31b163dae60b96b089a9cf16cd78214a2a06384d6ddd9a9fa76d95f866db3080bcd00cb32156f3f06b05d5a5b6a20f1661e1c2427a04638c984a3cf7e2c9f4f0f2cc2046f5314609dadb1314a567a8a0abf05f2d086f6fadbfcfca2f191d36e2e7ae7df2a54988d70a05958a5023ad275242c5193bfee1119820759aa9bae2f6dd9610e9e52738c405de42b7ae91524cb8ec1b0e9e6051f58b286c4f4e8f824a3cfa957eaa070c670472617e49e5faaff31b5d236a3ec4c6c01123e91d605a0fdbbb4d27bfaac1a51c491021a9c1f05be688d66f6cc62483eb1c5be083c93fdd0b3d4b94208b5504bdcce61aa8a16dd48a0df06bb65d323ae1c113898a4cf49f8858cef93dbb01a93c6a2a27390cfb5905b98f92c377faf99e5505838edce867338691ebfd8130c3328bf04c2a197c76a266f2f7188c965813908c56f823ebfd967eb899f64fac48399a7f83c00b0af7ca91e6b6f4c18be2a1b851112f78c8381059395956002ee3406f58ea8f26e8386ad5d7969640c1d7603d76f7e2b58541205647016c9ebe6bfe42ffc4918ea720a0ac4f3b99a70540e95966f8d5fe3e223e68859697f88155224c95ee31fac02767aa840db584b7ed6c1575a7de4e6f9886aa36d2faf6f50e87799501b60d29b4415f1a1e990e936a7c0a0f782d8dbf527614ba94204a33c157a636ed99e080ddce8a09da7e1cc300d6718a9189e6b769bc152b08e078ba83797288176b7aa804bb83eb46ca7cd9646122d58232f2e36631a30c83b29c8cc6c3312aed200ee8867c7b3b8327f862fed20ba04790604887a52ede69b5287161443144acca33ff477fffc037dc04d1d3ae089caae3e13cf582e22fb861da049b01c28538176b96d08dc9d74db423f0b337379c2c4c61e30eb68745ebedaf36df2a2226126974954062c4ca87281b0efecf0ce2ac626c7adc19fe737817ed3f59202ce424b0516cc3d35cb81a98d02fc7446f47fc496c97f3f389f9db9f5a18510104e0168709b846fc1fabc32d028e32147ab5edde24ba40e2883a194b71d6341ec690e976bb0f86674bcad67b097a84c2c9094cd875e45b7a7a5fde6797fc45a212fbcaeeefc1e7fbcb286d9c98f0b7629c4cbdede370f561a8d2fc058910609ea47c77aa518909c4b4999c09ceadb276254a078c621625599e653a5bcf5c66997f76d0b1bc6de5b2b6802f485c53e2a500ae9d4b8dcb20f08f251c53a35aa070c3a9d251c8a73b32a9f756c2bf7735f2a481d9f0aaa21dca71bd87e9fd0d440ae7781ddce0973595bc31fa1ece197402142a302be573526acb682464713383d7c98612b707e263ea6e874cf6f4ce8fc3f92c7db6475fcdc34a64b7343c806ee458f61d479a71a0f910c34211d9a486bc7bc35b9943b8b8823eaa2ceaaffa4078c146de66ebe","title":"1737. 满足三条件之一需改变的最少字符数","link":"https://leetcode-cn.com/problems/change-minimum-characters-to-satisfy-one-of-three-conditions/","question_id":1859,"issue_number":38},"36":{"day":36,"pres":["数组","排序"],"tags":["排序"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个整数数组 nums,请你将该数组升序排列。\n\n \n\n示例 1:\n\n输入:nums = [5,2,3,1]\n输出:[1,2,3,5]\n示例 2:\n\n输入:nums = [5,1,1,2,0,0]\n输出:[0,0,1,1,2,5]\n \n\n提示:\n\n1 <= nums.length <= 50000\n-50000 <= nums[i] <= 50000\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347c86218a04fb2b870a545626520c013734310ec8ab1a6ec9ebd627f465eaac46b8280bc2d829199fbe23f761a0f8f223fc3b6776d4c7cee11d6ec3abc49c4f6d36fd32ecfee24fdebd7bdd491c6d2a62b6aa10d90bdf9b2e295b80a45355157dfa0ea4ade3807535aa61475bf51cca27adb7606db39cc4a514fe41fb07cb69ef6e165f8b1e6f0630bdf24326cce7983c1f291c4900d48e4052074b9f22f53a46a34489d22559210c378ee3684b19a17b03a4179e4d099170240ca6fe47f9b0ce2cb718ffc0e71a5ee526b0bc68302dc587d10a885c75fb3436beff1ae6e2db911664f17986fd5188a829961c332801a2ec710f49600cfe11839cc4c758f78cf74c133ca428d5104a83e8c525b7825184efb1675ac0142d768c14f6c4fe7a0e6607267030e8b44192ca4e9672f05de626c8ca6b06c3fb9aaa5a258c084540db556f70046c1c383adb00fe5a03e09ace45472406fe6b63f43cf481e6af85fd3040aa2943f4279da5dd9dff7c3e81cddc3830e62a05057ab949fb99642e59e50b3ebadd9f51988967b8b346e869f49ee806b88b43574edd0aac138d116ec7efb9eb45634b7da44fed017f21c558c7cba2bfac12b4ce02a001a8d8fb5f4820035e767ff222d8866e2d4b3035d1c9271b7bd844d65233249af32089b5dc63190227a8a9bfaf09bdd2128bc121e943fbc854e6c65e0e89ce0ca9695de75293dad578f4a806ceedc6376dd9988643c99ce6b9c0665f5e7d97a7a8cd516ee4233a79237f7e5637001c6182c6d71e7c020daa513826431cb6a1f3cbee4f613a792ce74d2349a51ff60c49904796ff35acfaa86853c0defb03b6d6af96cae8932aa7de5b99a8b4efa999ccb19e1073ad3a496410182a044f869472a99cf55a6726f81d07acbf7c7c70df81ad6a9f429ad81bb9cdc14bf15218c111430eb7baeae1346a2f1ec65d2baf31eafba2be33bf1884c06ac38b0de7591958fc32954d5565fd22ba8cda4d34393fe30837e19f6e768cf31bc2bc719655545a13ca11a0d0e6a7d04d9ee587a6eda1347c5d19f1b039cfa924be2f6d1af8b40dfd38bd69b9b91fe40370cfc9d38f3029c32cc2be8fa77511a404769739747021e955e704bf6cac24fd34389e9ea4145627c6d4c58379522e6d775f49075856f5a39803786a9bc68433f95b06243304dce34f91436dbf49f32aa2f4c5a5fba98dd214940bee9bb18d10b3f929f33362fdb1389960993fd63f2dfa6fa68129fb2026a68770ebabba5b39548d8bbe8b4a4f4ed6ff9cdbef8ad1ae88f315accb4752f84e833e07b8850d988af04bd90b3786f46e9ea50d8e260ba063c01c3b8e2ac7e9197f52b0bec7c5aee109e1e3754afb95ba9fab17a038d6b34d96b88c8113fc8095f8843d539b0490cf8e6ef0abfb6c386aeb825061f1c4121cb1e6cd924d04e5f246eb678a28af3ae5397c7402cb1469b0ff07b11de5f3485204f3064aa91702bab82039f5e07f576b5d650b6c1293c1f61cbe77293e2aabd9479874651f938409bd74c2da94c34bcb2a090f4aaa1a6b00f1256dfd908e2ab1ece9b84a8dfc7e547066f7e10ade793ff6270b51f2535fba387d63aa3a5513b7236f773cdc957d163f970abdc5e875256ac118883ef1c4a0fb6144f60517db3f3208027dab54a9df778c94b43c04041596ed5fc18a6d4054223ad5a58c789a954b168df37c954c737701fa8d60be447fb26c90cf13cd373a6f3580d9549e121524e11998193a91db8ef3c8d3500c159b168cade48bee5e7d64ac5d3a7ba070cc8c8b1c75e6c5690bf1f07cf7bd6f8de46e9fc7ac861eb2b191ec5f47050d47071e742ebd122eb8489f075e3201f6c8c1640f4b7214aba4a545150ec0ff9b2be267c2793673f9dad3393a4f5902c9ca6488880af814cc50f32119a8bad1c78cc010709921b4d1c75ac59ead2cd2c130b8449c47ac80190077fe33abb7b24c7dce6b6099d4e4c2fa0cbf0b8a55ea0ac5d53e35c39fab88c64e378941bf6598282b8a2f2c1180f78e5d955635fba8cb24dab1d179d9975ae253c8b451e4a3d9730be120887666fa2bc49e543cc74d95781a69161f21c9d95d368b9fa0863c7a58a5f5eee1cc2f3d1a4190f11132a10891ec9b85023f7e2584765881da9659f6355ac7a1bb6e0a6fd01ab1559e303b2e83133ee251c3c07229bbf0639a7911d040d1bbc088c136191abc44c426edc459732595181426106d49704d318d7fac8dd867fc16932efa2bccb1b7b5e8ffaa24635ec9a2527632f7195846ad8c43808a13e4af9f9728b1149baf40e9d6e6f0f05ca3e17c5563e386f39bfacb1e3ce90f1098e91337fa92439c0efa8ba5ec939270e60e238c253d15dc8b4a967ba6d7df65dd5ead02f00493cd7887edf5437137a911a51c2e0517bb189a6643b1add74dd529c29a89d4d7a4f6601298bf507a1a11c7697503179293a3dffe28bf5b2ffd295f99aa057fe80a00e99f88ac9c3057e95bb9ba6a1b0abda3a2821ec4f1bd27f933f12c064425a193299a1ee4c22240c4cf7a9c486b69c4fad21f87e866b2dbadd934df112776cccdcd152c395b284037e91f4887a34513b628d0d82250cc4d950919ff5b0bf939e97f877e6e016cbd40664907a299363578deacd3fa74cd67fe8322f827cce83976e68df219fd55c222ad7e34217bc6ddbff01bf0f5c4d76230bc7330503a4b7ffb47662f151266a5843b1b474b759f30bc90886bbde36bcbdedb412c2e9e0319fe0041a4fdbe7cbad740386292d4315acd5fca3db7b8e3edaeeed2d1524b3a52d561fc951d2a5eb699d195bfcbcd1086584cc4f264777c44a81bd7d7150a1a40270d41bfadb36c5feec5d4732bd1768d78dad4138dd1a9fe332502161dbc2e4bf810c04cdf22eb35b13aa68de7cc81531a18765ecc4cb7191dd0057dad9cad9c6dbd605d916eedc38d56bb05bba853250958abaa815f26c8e1d008f617690fd61913f1e3feac94e069284b293bd6acc28c4ac8a02b49393b8da860271f52283b29290e2cf951b04602be43f7a0d2ea9759045c0e3f2546932205eefcf89d52a99f24e864efed36d67baf3042f369708a55a1f473057e924b5e21079b9fd80ada3a86772df35fe878fa237ecb2e74d30620564312701d0d3a08f02577f41b0f6d5b30ea6acc6c580e8250633399936b8ee1ebde48d7a682dab96c30547bb850a72d07c610a27a287039ee0c43ff763538c1d840748e50ad232e8bebf09ad8c045b0ffbddff042ed1e60b23a15587fcc0d9a8aca8dfebe7b04cfa511ffcbfa4e3ad94386c7b13ace8f0112194c5eab72d564948770579517c09c9ba31ed7e5e4d38d4e64c124e2f57f3726023789ea5117f4d352c6e13b6963f377427db0fe99d2077a3e4a5408db825edfba3be47220460acb00f5ef21444350b639159ed0ba831b6bd0a64e67987da2c3f8716d28123ac2d331a3a83527f23246f68a59c049d3c78baa076c3488a78270df545df9490a461f47aab02a994aacc01a3efff5a7aab9d1c26d0ca5bac8a9f3e0a2c0a64b0d8796221ad40b0d0ba1d327f79fc6ede86765a2fc6b1d8c5717a602398bce7a36fc4510b3e9471cd8144846de803a977e6f1886e116947084bc1e47c3abbb9397f1fff3fbf0d406baf2c3e4b1c3a9d3989e8871dfed089c3c3573e3506c95e71205f9277d068f2f360c1c6ac5417d22e98c9baa70186beecc1db415c5dd094042d62a665b9a32bd669fd212c8e9586eac6f75a16f4bcf1c95cb160882a664c08073c543867fadf804eda2d7708c8b6d6260125b6f373877c5029a34eed9bb904fee161859d5ceaaced6563421aac6216dbf9ba7f7438249d59960a5a9894222fe036c5c0234466c1b7b8f30a8d9991fa7c90c76e0cc366351334a3d6939d052eea0a30ae4857070003a7225281a615f39d4f148c996aee2f46c38fe846147754ba026881de1cf1fe961e4f61ab18f3d26d5b54e00466fb42fc96719935d10bcb9a7fcfd3d6b04d779eab8d5c8553fca4fee43abc50ba36142722adda733fab154d88a362310ac1a50ecc242e819425a564cc1df830c8b006ff3afdf985cb436a55fed4d29179fe091af410f9e398c7b3dbac2818f8bc68f9f1b544119285a2b723aeccd5bab931fa55ad9cf8deb43448a5662e1b138815c5b8d3db6e2500a70235b5647b69ff8cc6bb6c83ccf39f231d4bd2bb2e2287fa6d6e9746f52523b5f0523c7a5ca94f150a3c48b17b6adddef97806d3d263936cf42518de19d04afd6068ae740275b5aed51b32447f0d6d9beea22f7cacd92b8c9b44a979a1057f06a1d79bcf19e3ad45cac73d547a151e5af7359cc493d81cbbc5feb799dfe60065c345f5c9ef30b8092c5d3244e074147b7aebc4fd533a0274215219f3744e1adaf5876c128410ce457692637522434187154a1e3e6acc44c20fa9363be4a3adea05c98c931519facf2453e0737b2db371d2ef6f891a7466560cfcbcfe412b93d03118c0d8acd10cc1c76ed90cce9708f4f3932f4695b8300475f471e2b9454ba72d5089116875ba04712113a242d2796e3901fe8f184833ba2829b125042199c19f02ff1e28a96084fb1eb9e80b410586ad34a4e30b431eb0e6566d7bfd0e1e23672c3b941f5fae207c9353ba740a58fd7baef3a70c93070c62776a7fc0053a8d2eb15b0acf004e4301939345d86d4b5ddbdab3e0025d4f4256d8764c448f6c1d69cd32536118ad04b3325c5ea23c44e7611179b271cdc78e92c947b997f2fde358c9a6c61bc5716be91de0f84024d73b46806d4e4bbde7dbe262511d94239a4e28696d62bcd65a7a46ac92ea604499d0a31777954af39195544318bc7f00922f8c3a74c4c9a038c7b093932006589da004b41e3d73612684f3df9c540dcfe9b53e8d69693cb8750fdf920ff791d8fb121171b203a444178439449480e1dfabb4111b7070dcb75c391ffb5873616b09a19d29e0e7155b092903b745b8406749a802232be3a443d532a7d1177443180d728a08e3b13bc565ec4c49edecbf632d1d12d572e3088605a4fba2aa2abcda738d709a4180b8579f4af22e699f84687b49e304e4e04d6741072067d29055aac625ef03b83466f114de8e5c1d6091b27257081757719e5c71fea8f20dce56645e76c094a4e3d1c3f18070398ae9f43b45088650ed875ce8c3482999889f19d5c15f597acc611547fc7e6e8fc3726d689311ab10d1029c5ee05fe35ea01408acec013f20a39688209d2d17ce752d3d43437b3b0d0b7e595e6793443a64893a59ac5031646eeb74d25c534a4e3c6e5df94bce8ccb22c0d2f167f16fb0005ef68a4f77e4698f48b7fadf7ef6c3624c9437e0ed9b2c177ed2ab58fa46c13fde8cd2ec1b0a27ffe4b239fabe159a6934917d0d655a6cb6c1d5df2bbce6b75686928569caf7458961e1e8c4c2cb4f1f47ab9249110a300159efd9c457defea0cccbd9822a471095d33c677938a8dae0af30e1d4eb1110972a0257e6f6ef0d22ba1785b19a5e8bfd1c88ab249753b3e5fab16cbff2e6c711bfc2344546684a028c63081c41b4d488ef909ee83e21fb16eee0e637505380093d425c3b2c8b58e160f474caab50d2df67d42d49812a3f8b261759b473b98a6a7cfc612978f6daedc3f3de68100d603be779f59db85922f1246365c6457d625a4a8397fb44b442ba77f26377e8950e5c39f9af8f975d8fa00897ff0df074936bcd7ed9a44561c7104bd4fd08ac8085e5b09634248a4980a3dd5ca178281a3146525dd180a62e6f97a9bedf94e1b1dbb259a58d01db4fe0f73dbbde99f174287c68abcd6545ea9daf6d73cdf3e092dea925f989ea39741b3433549b68d4b4e592a1f95f0d7d57cf74f9da069ba712f6f3dbfb5d89f754a456f08763c07d3f321b8117391161ad36e6d73e211463816f35b0bf1feb3892e4d0a11596800241315d3d871b1a2fb32110199c22c810247002fda91a6eba31d804a96bdc21e80600657905674457584449946ed520ecb4164cc0295d2416836049dc037c03198382bf57524bb0693058cc65cc4370f1e6b6c71287166bc55a67da71ecb75526156a53632953244ce54b78ae56b6a58f38089f482a012a95898d0e30acf3e8443ec7c210063e8a98cdad174fc3f9a931186517d84f21c9401cbc6ae7e751266f71f213cf6760aa902bddd60eb580ef237edd94f5067f6869aa9ef2e5cf08226bc2f99dfc42c29a2c3e07b1f7cb5b195b73bb9b1b60c1f842f074d4545ae2e2ce0e31bbb44d309c90ee85bb5375bf22e2295d2ecf8bcae8a1cf6cc9e7f70e55eb6816b54a102961e8091a244a8538b4ed3c1eb52beb932f1e38ce3ddf4cbd038e3ec98763a190916d664c4e679952ebafcf9b511ece394cce959936fd097a6ce84c05c1390a69a619cd9b5664ae624ab508bf1db9f3dd7d8feb96e5ec1c7b8b53e733406de34229de917ac42c70a3bfed29527ae50836dc3c783796099890017f11a4ec003dbe1dab0ac3c581b1857f692c4b46cccf381f068f70e5205fe5f79d550935cf44bea031e321adb794724afa20e6bdb0bbf15fd370428bcdbcc807a0d8e8eaa9699a015c28ea0c056fdbd8d209129b1f514c18587fe84bd934535f3503d7bffb5e23f1fdaa1b736ae38657400d2cf268a15ccaa2420e714f1b7c2df46f0451669889aadbc06ca4f2598","title":"912. 排序数组","link":"https://leetcode-cn.com/problems/sort-an-array/","question_id":948,"issue_number":39},"37":{"day":37,"pres":["二分法"],"tags":["二分"],"whys":null,"difficulty":"- 简单","description":"```\n实现 int sqrt(int x) 函数。\n\n计算并返回 x 的平方根,其中 x 是非负整数。\n\n由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。\n\n示例 1:\n\n输入: 4\n输出: 2\n示例 2:\n\n输入: 8\n输出: 2\n说明: 8 的平方根是 2.82842...,\n 由于返回类型是整数,小数部分将被舍去\n```","content":"096221cf5b628be1e73e8bcfe626c734738e3d845c3d428f6b0b6073212a5f6a10a12dc8c9066ecde89f32f426e3ac57af2400c3906714dff32ff523fffaef2ef2326f68889bd2e21b37dacfe3de1e3fb201b80f74488b6ed23ed11f8dc9fdc319a433e9e44a41a8d5fd80854e551251fb3ea2aeea91763e95686e67fb27c824afba4450780c2f4f1dde44f63bda6ed24c1a6dae12792b3e97db4205e7e786111e2b134829cb8e59670b778208165a7e41e9cd9f18317a169d57a35d379b3a762d90f811cbc50d0ceafe2c20d9ce9ab8397f905f1643ad09e5ed2d0f642d29cf81ed5bb35d6730a99a6e2f850b4c4256880673d38eda65642d4ec03066a7ae2d308b6bd9a3e139a213e798851dfbceaa0c4b24e176fc3ada145bc525b08b78ae5701c960e6cdafe647884d141ac6247999c90d21582bc5cfbf76e9c1498a50a3134abc9c1204514389af53d10d18c78ed7eaddc1b2e08469d35bded5450a11f8e54079748c8979db5a55641b55569e972b98ac0acc1b37785849e83d9df0d43912e60e330b4ba3a67e1ea07751b2791cd8420697ebb712c78d2061cb32354e0fa480414a7f319531dae83719aad3d351c9a8caf6a55dde014b3c2cd268e14ce0a54ffdf9838a13b1f21432535a665234d554f146dfdab483976b5353f3842c9846bf091c9e4f53ae64c6d61672226a120a620a7ee5cf65e9c1942eeb75c959cac75d2eb9e417aaae22e61bcfe68be44763869e93e171ca67bc935116316a7254ee79797d52edab943f5660c1a6cee602602c6e0c56f503c8f0287c0f16a87c082d473ab6aff4c8cb6e601e502ef54f21629711da0249984996de11c67c469abc7072b8c4c9dbcbd3efa1ef1be1b6763f473b746dc6e0d4d90012d02738d69ad381884085b47c869c19ca166ecc5fc5d2d45e282cc84ea45e82428bf31681d7ce66f95218e811770a09d2d0bd60747762ee3272ac6599f1fdd70cd35096853fd5de65e81d476ca9558dc3555cf79b2a361cdd83fe911c84f60d0d87bd441df05b4fac5edfc392e60158cd52184a40af66ed9ca72ec61ae2bf7cfbce5af7cc64ad4d1611a6d328b1648a02d08a558d3c0085dfbde92a8c2e71d3cac5863d4ca16828a07a0f654fba7899769425f03a9c4f2d2e0f4dd0d7df13d3feb772562f6d77414a0a7f57e09198107a6a87cf8a1ed15810333235f0e357ac4d588546ea00a3c1dba6eca98ce8229a30d19496a516bfededac150f90a86cca73e561e54b5bfd10db9f448a1979e19f06b89bde01061be583cbd3451933e9b3d3f4b9f2e9fccbea76cfe82035ddc96f573bddda0feac2ed10822f79dec0e492a21f85231829b83a8983c75bcf8e46431de5abacb9b861323741d68373366e1d08dd3d839878af4f7e645a85277f0448c66e62ff96350654d6f0aad16e1b5de48d7962d9cb170192e6cd81423ed2f341cc64a8086bba6f32784201d93362b4f307a123e4cd67959a7907778b152f87b41837f5cf6b586f49a3a4c09cf3d79e4b9c09581f66dad52cea6a1560b3ca6995136ab9314f48f33c082744ab244c03d90c6ed8af8f0485e1d2bd489ffe7d754464c1e806f27332f50b0d4ac4786bef617c28739f86be79a4167463002c7f5171569819124ac8f2c25ecc13aa3a732126d9cc33bc8d1aad9b020142472b9ab33ea2c1cc0b7a7716f98261aafb431e08307fafadf53babcc120cfa817bd51044145fcbde39a6160fa606ecd67e940175092ede419653ccfaf05051ea2249dad7f660771a36129f749f0aa3d2a3ef7658648b753a628670c69b863077e4fb6008ecceb3673bab7b44ef7d6a611b7fceadd6a34338513f255c3c066ca96266a139f816396c009381c90258771a49aed4fc525277d7b1e73e8837e13e49728a8ee6b68bb4b20ef5c4882df966f7729d798c5c06e3e3f9b1f1c16f0b99432e6e11d50d5c4f85157681f8ce4b8d2e68fc0043ed3db78db8475fc3537899d4c1c3de13b40d885be110c4c22c35c691aabcdf4d16a8866ac915814e2eb22e1998f38a697be7774f210f7aecee8c74b4ef508bcda6d97091ffe13d6dda784e1f2dc765711f9e80799b03c356bb95b82fa61e8f978ab68c8636675b97ebe1f0c22009034a94f01d0aa2069ec497a82f3f733a87656487f1ab5adb065ae182b6621f6df536b376873219124af5df7e02f3a91932e0ad5debcfc957ae5303781504562768ff609f72dfad28794dff1b754e2906f2fc46358c7d8dbdd869c515af26fa2bffbf9fb9e1dfaf266072c69057b2ef038ccdb2650ada5909bb392be2ea05ed618cfe07ceb16ca8a266c99d6a2239cade9490bc49acf0871748faea7b75fcc4248d53a6b4c9a5bdd720d0597d9a67592c4a894cba7699f21cc8715ead02fe339bc36ba3eed5417312ac12b9272d231fbb33a0a9c30069572eb20c4576f7f326a8e36d1182a0524f2d12f458f3652bf8eb92b9a22eda0b047228d45521b2df45ccb0465a0a031b4c4eaa2f9efc3f125cde9fcf1e7784efc76cff66ae2b4ceba06fce05c148e5aa686285b36cc0275a0ab8c59b5092bd33ba9cd4c76a9f284615ff9267bdc98ff4e3dc8ee83f67868a54119309144eb45dd25d95040639eba43cbb46913410160b1acf4a0b0b12cae22c6e26c001795db5003bf2da4bed7b96d55230cce8b934bcef09e26fcafbf0d7c5c891f02fc8f7cfe26010beb683cc396b7dfd48722529266b8f85381e6f4d6b8b32bb96887a8dec62c9d3c2752c0ebe0139db85fb022b1bf87f4dd1efcd1610bb9fc94be0d228f84b22160a2014325d5ac45faa79341c167bb49dd77b0d1b50dc44d1b79ba945f993ab5e9e2712f7e5f5c4cfca867646398c9b62072da69d7db129ee5b21fb443d5d48ccd19286ee30c3a03b8c34934fcd63ee17fe3333231d45c2a591b1ca4c8a0387d878d4fb61296948eb7b87cd4bf5590a02df729f5746ce88cec5256f11ceb4053558d75094f5bfe1dff5750e44085c67cdede390fd6e238206970e65aafcf5ef1765d5e5d3df90f3939fe18c659e2cea54ff0fa2e5167244daa38b80d5b58b2386d162633e70d8c35c844a4ec525a96fbd2fa7866bc9b606866848de8d997084cf8dd0192e1c9156fd1dc8e57dde2ddf29a1e420a19973ca96ff96a8c8c6b8f2d75792b25381c8c3cbf750ce08f1f5c91fdee7cf6655fa0f6a170aa17704821c11ddf4cff77df60aebba43d476daf3fcf56ee9ee31d882dd5d7485e4289508b5b4500c606f0c05a46e6e180d7bbe6bf780505015736ede1489115b769a997a16ddae09a49bad053ecc448594d87a8d8a5b12064b1dfe0e9c349bdf63148608dbd1d1ba178acf8389fd1c365dab287db882ba919bd2cd51d26b589b665efd8e973eb5f04a8b322c59ceda818cfaba1e18f11a08c564bbc7d1dd5dd74077e4deec9915a4d32616317fbde1216fdcda35a02b503ecce8e08d810a1bd33106d5ab2fd5d5513a885dea054f14659bc0344d3e14b410a8d02fa0caaaffc85d31fe76bd2e10d6f1317e6f2b151262cf0c6025436053162a3a14c3de6c4cd4fb54df9ec66c39a71d520e1d25e5ab053ad9af60fc9e6e9fad4e6bd9f168c5d35a0d657b57dfedcd1b45e267c6f0a90a248632b6312cd9dc676e133551594f652a3355f12f7a2206734e1e3d003e41d25728a03afa8dfc25829dd9e41e53ff35bad76ea3a1d5908b7adee0f90c10326ff49fac5468d228b900728f84da3aa6838742d752e42c4ccd7a449ee1186f25e839049b1c5012d4836b47fc4a227303eb37bb3674c0750f11c60142ca9de0c2a3f5e681fe14cc4981491e333b8072ba329e6e5a6f3b6c9f83af634499aa05624570e744c1545efc2c3e5cb9b016e9a981d0b696a0cfcd27f5054a019a7025f09f647ebcc4c2b2a5b28abe049122112d8f0b61e6859586a1c0beee8a3a5d1135e95f6d5e69078be4541ca4d8d6c54ceb4dec3078d415f06a1d90783aac8f7c28cf898ef220ea6cc4de4e938b205963795de4cf884dd95b7005649aee2fc255c06d6e826bfcd6b78f2928ee3632e03d4eb297d779becc4b74855d9c8dc6ec66ebd283ca73d9ec68161968fc7aa12bc57e98e7a2293e1e0c869b1e13817bfb0f52461466463b67d1b69b95b6ddec85d76d61f82007828f1a904d387084ce35b8fa6c788f159be129f8134197dbbcbf82fec8582e3933c33c35f0089f56ba2576ea2d09efe50b543c9caadbd5efcab9e6682a0e0f749533794398032c09171728b4bfc8c8ab1deb36c9a5409b3f119d2e2efa889dbb5d952b848e714f1c1b1ba0371fb5f6b9e0fc2fc5ce1d16e34d0130c4f08777ec0bae3144975cc44202b99344c5c56e4e0cb9a823b8812b16dcc9809b6337890d15296643300300218cd205a515d865afa1f728d3491db1393ccdb021ebd3860ed491cfa18eeda9c38e1585b8f9ea9221","title":"69. x 的平方根","link":"https://leetcode-cn.com/problems/sqrtx","question_id":69,"issue_number":40},"38":{"day":38,"pres":["二分法"],"tags":["二分"],"whys":null,"difficulty":"- 简单","description":"```\n你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。\n\n假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。\n\n你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。\n\n示例:\n\n给定 n = 5,并且 version = 4 是第一个错误的版本。\n\n调用 isBadVersion(3) -> false\n调用 isBadVersion(5) -> true\n调用 isBadVersion(4) -> true\n\n所以,4 是第一个错误的版本。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f21931c3385f243423d7847585e26598c9d2a6cc1fd231c0b8153ef1365dd67ce65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dba7058c27ad68cce6a7e19b5c30dc006ebbf1446a7247fa4f14415d9751b4cfbcbe22aa14b6fccbf732f72792854455720d11561ffa67f406fc68df5b17558113482535a8c08478cfb8fd0463772b0567e4f32f5e4a2c87ac1960494df6d492253b7729be5aa87334bd1d75378a15bd530fba44a3db536bfb687821b174965f144f9de67f40ea9232500382dedbd950f0c530a98d6d1185e2c6e392066f34c6fca756274a6e9c6a661c42d5ff0dec9ee9c774cb3969144fce3e136d9a869360be09fe1ea7712a812e4d0bbe3366e6d4e62f2c67449c56142bf6c6cc2e0fb656e2ed009283f80655da8b689a10679079a4ab97e6d6e9739bb6ce01e7c0ad8bec2602509655c48e8e705c6ad783f0d4768bb97ada5b5a4b095f718c97018dac1dca1b02745b40f43eb0e6d22718e50d20096d95a66a16ad5053b05005db582397e8b712c78d2d58c4322e4903988e40427d32b939d4f11b1abafad95dc3a4d5fdaa4fd7007f202ac16b0cdc83e76999a19e1ac50270f846412f31767773fd2cccad8c98e1f865c19a46012d9f7cbd021c5dfdeb43fa9f8c3f194160a7cee2aa71d2d466f2d7478d6499b9599bbe7f44394acb33c25deb7391cfe995770dc0bbd99c626ab01d3a84b481b7e0f626dcf3b9c9afd6b142044186fec0877e7743392b1f8f31a58d17147d38ca0f31421d2adaf8f2a6b84225747b769b516b3b85609f3325f344f15aa0299da11218c4b52644cacecf143c2fec3ceeb95031abadf56d796b741cbab816ba83f2bcd0ccf549b9a5708c93f5434325e10882cd8b0b3676b866f632aa21c0d17cded7a80ff53e77d17e0b12fed2f8bc6f695063e836708f7a95f7c4d42efd5fb9bd3fccc264ef38445e97548beb535cc9cc08fc8f52485f11945a3090f86f30d4ee779ba528e747301ce90a1e8195ebbde7419a5c5e58be2ff7869def1124ce392eed1e0b51759193519623d61193f371c0780ecc80b98754bf652fc5984b6abc8652e5ff64bc757405e567d906b86aae33ec38248d9d99295815f2d4c6987369186c5c5f4f026c56f5a39a116067a3cf8600fa592f0e3322f9e248b04d4d9d48d21fa1e0c4a7db8680ed339539f69484a614a9ffee9d270f84956bf15de46bf7497ecc1feebe48ad0a79c4880c8398d30e0c16cab6c7de791933e9753a05164fb18ee8af3fe8bd5605bc43e7ba9fba9b389b9aec9760943f81e181d880b404bfa967f8b8462fc477c98d4553d8237f38527e2e072750c79b61fcc59edb5dbf490ed433aaf4f9af6ea8b5df8fb95a3490867cba801597b25f814a5e81fc542c591b87c371662041d9ef237bb44ab01bac66bc6fb0a1949602b265b8fc06bd1a201fb8f7d137b4977182fe6532b08134945a92eafa3148291c7695ca77e67a65a6e93c23ab1b8c9788444a8553ded616d9c583519c99c5bf2ba8cb00e00a6fd385862db93c71f335b89f34571b3acf855bd52943e34c4165a12058e0576d2a56bb83a35e49809fecdcaa475e7c5853bcad834d6e1df558d73792411933cd1aa51e46bc055d5817f5ab9016747484b9b43432e798ff875ba8f1791d283abc19c9a711cfac2b7db0a103b8162f6d67888c2fc14e23f17bf2b42a89652a386ba758ff0dcaac8c4c1b8221f715a3d4cc7dd55539fb2cbb4bd7e7fc807d3b18b43c7c66d12fd2d9e209e1e7d96408e3d771e286a9644ee64a59601648ceadd6a4403b9cb24d14297703a4111c8e48a70e52371dfbf5d865187070259ead954e173cd1fc8338e145cb7a1972f8eee2fcdeb2fa79e6afcc32880be117d952f00113a885d7c68eeb104ba7229ed9c776d493951ad6db36f200d0cd6d6c9f79458f4db7c7f24b17a36e23e0db8b90c35ee508ed30c05799f34371eedbc783970424e9db7eaa4da62b9f152c36a3f3b2767ad36187a79679c1d88776b7e543bc0bc9ef07e9c4a8545d812e517b78ea2bc9815426e34f935e9f391d7ebf3f16a69383b9ad8f0e645b80dfefc6e52f02084b82e7100a9d0b8fcc94800f3e7d3e85514780f2b659c9265fdaa154de4a03f973ec61d64e3770e43154a87aa98d5c69c2f706f15c4db67290ddda2d2e908cd2fe7e8170cfa3c6c99361c294c5fdbbe8cea3e960f9445b37ba189244fa3cf12e35634d6e2c48fad1f30e06c4f6eb0bdf8b85374b8e2755ff576e7703e864932468c60532c03423f37f73f39dfc5a4f52283305aafa13becb3c47d7b01d7dec13ca610e6d632601a00f86fe27aa9dabc14ea40499396e16c2719131ae36ac220a81466d6ff8b5a761d629b1baba8e72842fbbf51d694fed12ae6f5c315b976c31a7d4647cf495eca218946685c4705f76367da608b79772699a0621ccdf57ccae5b5a1203dcf5eaaa27a8fe3334b37e030082db407678a96ff76893c3ebaa3708b15fc3104eadf8036ad859e0e0ae7e5e1a98042ef507585c0fb942b8e2d05f0e6db70613582b43372198cb417cf0ca2ec59991229342dd79bc8939f5b93ca34607e8ec8cc5eb0a98898dea240ebe939228b696d87a84e03449bb65bc066ce0f81e2f56f31255e4798236701a3e50166c79e0607b0c73e2ed77ffde89b9f19d71bad0b3fadba02328f1a091cba67ff5494b22b5405c8f2a4410b6a7b6468bf5711611e6bee723f4d45b0048da9861495dff1b58d12b1f15253b5e4fd791a6ac39e0392ef28df8731d3f1f736b4fc15ecdad3674bba5fcb94d973805d5eff7d19cd78f05525fd9cf2b482af2e37dfd34ff1336a00a6b2e3b9d83c6d9f53cc3a33fc070941d8d76901efe3e2d23540b96f6f5e5ca01c3479a94739de73f69600bf560ffcd56f5490602cf7ed6496487dbac846119549cb004335a9a1d91b1aaf5848d6f2444085c67cdede390fd6e719f06970e68a6e7d7a3176ed5b7dadf9fa1b98dcb8c659e2cea54ba43f1a03c720d9ca3c6c991b5812986c32e60736186e24d9f604ec525a9329705a7866bc9e443803d0790c09c2fae9fa79c28045cd116d737a2a42b9f37f54aa7a42da29c2581b6afd1ea9892fbaa8e31d3e10081bb8c87a2048747bff58c478ae3cf7106e779620c1dc2384ae1535f89a680bb7dad20ebba43d46a8facb0f164ada7748c93b11426d6b04ad44cc3a3470b7c720c0da46e6e10023ced39f7c010103f59049f42819093ccfcb327568cff62f2da8746728d17d6dde561c18d0f46494b068f249c349bdf3341c413dadb9db659d683cecc934d3600a33a19ec82e2989b89e751d26b589b2f10a9c79c7fa9ed4a9a770652ced289defab71e54f81a168921fe9b98b95dc65b5de4deec9915a4d32616392bb5e4374bc98353fe53037783a6e8c0c84e5b94655dade2689d814c2e9e4efe15543e659bc0341f3e09b40aa9dd63e8d3fd908e092de324f4695882f86a54322b505e318a0c3b0f4360535f646e148e97285198be128b95823e6de0184f47516ba3ee171fcbb44afc9e6e9fad4e6bd9f135efd3134b6d361e9be7dd782bfc3fcfab830a248660f365798b926722081f51594f373e5e408f72772b685435760d2a1401921762f310acccae258c97d9e20f1af93db28727a1fed69a9b2fc9a7a22e59610db5dbda113a8161f64e7b8fdff076e3cad955b01ba02757d63014dfb3592225b3704acf59170ac392384ca7146d2742a737ed7326933c405f952b42cacfaf9696f5edd5e60fc652f00050677ec737e86f9e1a122a6600d6d1fc3744dbeb413f3935b517881b10d62c6c19e7ea6ea7a981dca58ba69ae761a04b0908f96241b0d76a5d96fce3b98f98cab201862956428a1320a8d684eec48cebbac33956456e91467f54714ed5fe30078ef2d68c02bf1ae92047c047ac2e1198783ae89b7c21accec6a629ea37eede07dddf20152f2109f58ec15bd95b703029ceeb68c002a5223c8a63ae9ff0c72a60ac7a3bad371aa78ad82ba59e7a5eaf5d9c8dc6ec66a29483c277c3ca294f6f61ae22e86cd97b99a7e9322c3457ac9b1e13817bfb0f52145d6848673fc3fb9f98f2c3e1c88f3242f86c079f8f5784097d37d79a2ec9d06c788f159be129f85f04d1caf0f1c7b3c85a2e3a6bdd6a56b4088356f76c6fc92d5beff856335fd8aad6d5ac94c7b33a640e4331d36762699803345e6e0f33ccbadcddd379e1714565f67782b358b4a83f203b20c925218ea45b421cddfe73aafd737d3d1f21b8670b879071fbe62f81b88b78814fad3fab1ef1c5763ab5be56c5e9654e0fab67b31464baac1e111e43dda766","title":"278. 第一个错误的版本","link":"https://leetcode-cn.com/problems/first-bad-version","question_id":278,"issue_number":41},"39":{"day":39,"pres":["二分法"],"tags":["二分"],"whys":null,"difficulty":"- 困难","description":"```\n给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。\n\n你需要返回给定数组中的重要翻转对的数量。\n\n示例 1:\n\n输入: [1,3,2,3,1]\n输出: 2\n示例 2:\n\n输入: [2,4,3,5,1]\n输出: 3\n注意:\n\n给定数组的长度不会超过50000。\n输入数组中的所有数字都在32位整数的表示范围内。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f279d173385f25055317d6b5949355fa48dc8c9066ecde89f32f426e3ac57af2400c3906714dff32ff523fffaef2ef2326f68889bd3f61f26d0b68cd04d7e3ef66eecfee24fdeb15ce047074a2b7dbfa53bd80bdfca6069b8e7852f091039a43ac1c1ddc3101df81f7d0e8c339e7a98d53e443853263341cd289b3f9837de2b7b69e24a4c4a74b0a53f33af99a15d7436741417a2d14e237842f892701d5c26abe6e1773a35609309e96460f4051358ba67f4546ac84cc89f55118e6608728235cc61522c909a0a7ebfc611377f8cbaadd92894fc7bef9d2147a7b0a0fff1416f71a4d5cd233d3b28a91c3f0f3ca8e05a87a4a29c5eaea9cdc3c5493e2f579a879f61ba10fd0dba9cba26ebf27dfa0c01afd246c1b9d44984421922e4294ca5c32a379cef7fcebd5de4c87b8957b81a569a9c1201becc1c68cb9a8de700c5f14f3e710cec8a7ad046ec39da99d1588ed0cd76a29e976bf99d3e1400249ace90296ab767140d4f5947f23d87cfd33a2e0bbfc08db535a44a2da16656b15405da6f1897ebb712e68d0b420da2d0bb22b8e3187615718267adf75d5c4b750ac12582c8b9f5419144abf2a221b1821b273fd52b6d66df4ff8a374872f69655f000bcf69a987d5c2d69613c95ba8a2eb56d599177019cd8d19f2cad005731f65c1add7e830dabb3fd59313a23cd09815fea3cfaa67798f63d5388a58f7bdd2e61b1eb8c0cee03b44cf743ed3c9bedcb8c26db2e9d99b8db2cd7d6d0996a2b2be351b64665029ef6ebbd86e1d1541ce6bb2c81c12e9fbc5a57eefb397f223c35a2157b4c358f2903cf75f6286ff3017a7bc92ef0801abe87c146005ef20feba67326d03634728b2e6af6d1193ae8d87a2dc968495291cb8006e19284e508d31dd7011dd932ce349a4529c902f4b1583c7cd47f35105e811560ab5adfbef13422c3ed4562fae32cdd5ac8613bf09aa11e7535db3963c21ddf70c84a23579ad53b2ff8976496813977b119ff1753ef7e079be962ade781b3f3680ed4586b02a18ad189f8fcc58f67f723171d5fe5af4fb6bbb4a1408abd3329c63b00e3c7699049492424410ea3bae2e77e4c8f4b9315ba7869a27bc775626e57ff905975741b45afe81e8e198473a218183ebda2a664a334d203b34010fd23777bcf3a03ba9e225b80b07b9df51d5a83cb73337aa22be2bddaae1e0435d81dc089a21e85c646f95560929219ec738df1dc138bb52b31469bf6dc5f22d9b522acce246bd4a1ed6e987157c1541d592c22421183a3b0a7b770267f02636ecc52dac07dcf0304cad0c4c128010ebf540100b187db90efab929a47a82d60caa0a00d0ab9b3a7c6552782d1c730488c16e70345052dc77ccd879ae7b737454992737171d4af3b17060fd0b5c977e1d2dfe8f9e7b6fa8eb175f96f83d630c4898a57d2df542a1d705da64c351e0b78301ddff284ad00792e6e37b520bd7064aae160d8eb51832f8ec755a7b6367137c9dc4fd9c54b601710a69ccdc2ce775144bb5ca6abb1358b0feca178826695147ec455b488028138ba0eb9b3feecba1489de37f617b6ae8c205cc5532f50b0a71e35c429d3a5d722c9ee0c540ca6f70235423f09ac5fc965fcfd87c277edc18af16f1f593fb6473f91b1d14ea9b0f3f40440da2b229a5ccea30bdc9fc6f6f901606afda8c9ef846406ec640798db23f28c1de1445176ffcdf3285183c9704f7c876b209793b3cdc61b453cccdf0735fea2b6ed7f3f1a7fabd3613be75931aacf69e2885fc64a56437538f70c69f841748e6e64409d4d87cc0a8aa4d63e341776d1960cf92f4ac5236502b3d5d0527638d4365aa20f635386c1eb883ec3a97efd9844e152be0d671cb9b098e25fc6cbf4a67be81e9986409f85aeaafce038b17fe16f85afb07071d7314497b01c6e52995772b499a3f4533ec5a3fd1e220fa48ab8e099ed30ab979512ed0a245bcb0083201495fbc7b91249207d6465bd6b6285b3d4015f9cc641383658564a04294eae33c2e04ffbf7cf24f390fbe353a1bea0220dc0dcd6071c155646dfb8806e2c8f7e832a3715cd3dc32cd079b1fe093d728afcb393f4c25044092c89d3f5a296f3da6fcafc40c149baa538f69321730c9f2d7a60fba8c400c0b9568b29c7a037ef48cab48b777ed11f5a3b64afdd72dac144ca0af6168a22785f519f7536f620745dddcd231f802a66502ece3e33896dc8ae1eda6b1dbe720f85a5137b914933d833688a4fd9bdf9ac1c37a7d36a6a0020c1e47d5e7e6a1835e455abbe5b3bf9614bb1ab79f4afceb09aeeb39c5fbd9b7f15a89e5befafe323fc5131081f41e2ad59870a9ce0e06231d345fec6cc7bbe06f077e6bda339a1effd3b407eb17fe328ca84d02dd062d45cfb6ac2d12b81d2d1b28bb189a83f51e6a4cedd40ed294a6d4bd46b07e6de48e251d2a6c9b6e840810b293a2c0fc009d590cf7ac35abe47c6e916c1393fab1c07c542fc100f899127539ddcc9c381ecfefbc33c1f726c68eb8aaa190219834fdcc225ac7e352906179ae300b5757988233afacd4c7709e3b7c15f6a3a40a84d6ffb18499b15054e6f74a73eb0c5711b836428206f18945ffb92ea381ef097e6c0766aa7689e76ccc95506b6e9d033336a14168d0932ed822cfd23079fbaff13fd290378525ed9ba9d3b54561f932ccf5fbe563189f732c44fdb5dbfa707a2f14346a938b3b08754749913086ba8469b1ec74dcd2c263e9fa0f0010f38fc80b2830c47d53e0efcf2c1bbcb6cb6ff9d125f18ecccc751041b092f32aed24bfa34a4a63dcd4d7fce2c5af4093393eee913966292e9369b2ee556f1a0d5a2d18c0a1e5d98b2b8cfb3172d022ec4190a71de65a2eff0600010e1cbd0e6ef008f64cdf15eb029131a297097e4bd6ffebe8e0088a1e87a305bff37d776945e7329bcd37ef630602cf7edd463f8bcb9acb6c214281b11974509e5099fc89bc9fe7450e06410f228eb9edd9b33d6cd01fde8cc9103b4707d1d65a73474058481b495120a0368a2cfd61ca0a75d0ddbf5906430e332c4eb52a06fbebfbb8642fe9148ce177e00cea78873740de59719d70accd530f4c98405f1204ad99169b9052af0d40f81b9d71a65274aa7379b75b3138203e1267116f57d298b890216a0b726a976a9e356856d86a2e45aff323958b9be62db8982ed88c42315140bb5f942e12d31295682b593de00f77fd623731eae24c53bc508c1820a8faf0a7c4c175ba3a14233da12d9a8e1914f0c5a85bdf6e187f437707ab92074a8e474a40ddd64aad725302ac077f8894d5a9db0a9659911e1abcdd0ce306556b579f6b5f094b2a84e59066d19d2b05795f212d21e644a2ef0fa3da50016c942877d15ea39c59cab589c2f3bed1845ddfb317e762164533c601e1f922697a50a23016a2f2b9961f68feaf4c5fbfbb053f368296f28485c9f23f4f2cf7bb3cd5ce023d9e2db15111244fb180740d6e4d9e04acd830b6c295f5c25c79aa6bba737282f86a542b6e5312308a5a25771025231e2d3c4786c46d1ddeb212ea9cd41470e05506035160a3bb0c28cbcf37d69e6e9fad4e6bd9f1298b8013566d2634b1e7805201fc3fcfabc545768673b67862d9bd7d44133551594f3763741da532372242635f475e537b0286596ae969bfcea85a8d91d2ff0f5bf27fb2db27edab8ad0e56686e9a22610326ff49fac54299c7bb90b6f8fc89f38eb81da5f971be90d5dd650449ee1186f25e83904d955030ad29b364be9336d2157e373b73635c95f0f11c60142cacfa5c4b3f3fdd3fd5dc91cf86334737bc05890f52aff9ef5c882072966dec65e10a1f8e1c721d77493ed6ae5eeb12859cc63337d5f444e334f43e04fa18cf302e8aa351a94fa5120527c171e0c43c11593bec17bd1e9024256554c49503a05f897d7c672cba390e0e1473ae5996045494bb6378838fac304c660f8f81b83933206cdb5580c4b558f2ffc7516986416839da6ccfb33741ed66ed2bfc1c45e3ef941fa62a8f711a37d577315d2a508d3b168c08b010513b03253fceb40c32b4b695ea34e57457da8591ffccc91b739ff1be62bfbd4eac233697b4bc8921adc1dd78b56060e5b6100f690513f4f4e717764c8ed663aac2943f3c6048d09fec6011aa02c3dc2e8408937e143b94500975b5f63004a091e5a632e891c3de40847cd74aa897ceefb4dd2211a76dbaa124e7d1613474200ca94f752b3d8852c8cafe9e59db45c8ac5c9b11ca568aacb2be86b59d2603dfaebd2a2328f01aece310f4c4263a33105aab8eafdb551808a5e59f0331d62a0f59564c668e96bce41a5028cef2e5d87440181dbe623e165d3f8751669315a0780ea03c7a2c5dbe1f599c2ab5668538f4bd178bb9bdf609e3143b9adf01b3f9a7f770bb9382c6d64146b665f3455eaade890d9597bee8246b4526385e624ccc6387bb5b2f280c4d7a31b61f395891b42356fdbf1a56a684e3fc07fc48c9e7ead2e679405a1f42a2a682cd52c88adb272f5ea4be4e5dba1fdaa49bb029a38875ec14989158baa8cf796a0ee217755ba4b361003f43e6f1ddee98ea6059c09c13120225096c73e65314f28bc9cf7758cf6bf7cae16c5bdb4572f3c2d55a7b7701486455c2ad20fa2ce57248fcd9ae900dfa340aed40b8f2aebd64528b4a75bb97804906ce845899cd9f9f589a268d9a6fa5e2c9a871105d542b53ad28a8ba0b44c2d8b6575dd332fd2e70fc64f691219862910e657e01ba7ba46dfa832d80c6ec1a218edd0eaad6eec30958833822d7cf6800b727aac1de7cb41ca9e120d363a1ab7b2e72ba663d12fb510a50386f4d8d85d933ed1a88a4de0721beaaf331b4bc8891edb6dee9eb3fc91e44e4badedaa3640eec0ae87c868159d5e1868e90f72175a2a12cf55348e38ede34f2df8e1dcc1d0d98bb9c055873513f2521788a97a069c6b848c05036511ffdb2105bf1a59f7fb8e441d53f4b1ce7896a05f4f8cdb51a0ebb180c8ebdce1c2c25d5ce1414bbf85159bab42153d0f436bea4f50e0d98bf923c68edc1baa5e774e338418bf0cdda443fe3541be695fbd554e09388ea9faeb59ed9085dbb8bcf4d07ba7cc5ec71391c099b14c6e3d149e88a0a1965d7be0ea3cf825e49ff55a4ca0b50ee5ece78286a3e8a184c6055a1588229e6a929f42930159d647755818244ccab95d0a3943d5ccd457153975d7b5165fda8949e080f22e93cd759e2ce4d64e5340d4499ead8354c12117e813f15f498bf23f360609475967fcf0d8258f4e2e5559f2f5e46d2191d955f64c242e04481415725739abd6d0f4db5264c8821bd7abfa4446aafd814b97147c2c68379f065a55a9a7a118ec47031f619be06e3028ab3d4b37b17ba4ed612212af484db69d0f38da432faafb9a747062e08883fc8ce6193bf0de0794831ae5e96d11738a65e16df321ccb9455563d4ab3055d51c6334aa63b8ccd5c52bf276105539c263f1e2f05cffddc40ce0ad88e63a3faf72ca83835e6a48251b3f48a4d7d6af8965861e0aa5fc9f9b27f5c4a9fd0e6de15c9f0952e7aadf6a5dcc325b60be01f15caea7a4c9feb46945fe3e21720f5ab5c2cca0057ac3c467a7895e199665775eeaa368d7a3422a660657d44a028b7e198a9b7a49ed42ff0fb804dd16687aaebac0fe81b1d10ac6680db1a80aed90b8139393a7f25ab27133090f0101ff2972d42ab96038d4faf362471f4be888c9f2e44f92523b0cdf97c78f8b84c4060ce4d84e3eaa6d1b0c9e95e11ef2a87f2f1eb71b6f7b8bb3ec36c45dd856b73963a6a84a552818cfad10404f1312d5b46d5a5e79b530d793f6052ac52b58464ed24d95f3d540ac6a9cf59cda30584635847f91116f986af5dda7b25f070306b3c5bd9299e5938a645afc1289b60eb59629e6a1a04cc8eb909963cd9f47527b298288baeacbb0c6e8c5c45a13f777575ef7c1a7445dbc4699e3c6971c5e35504d850a315133629120d8d4ff2891cfcb55a60ccd4f9701148c0b64d902939940793e5ad28e6ad73f876377a7706fec69de56cbce55c635181b76766e2f3822f818f46aa803cd2a3d6f3fdd7068cb510b8a5bde19049b2bd35b6a0f3e762bf057e47e342bd00eb74fc928ee8aa5b52a3b5f2a58fa10b75c6b9c5fb92cd3ef76d45b9dc6d27b625435f508271ae1501cbf0aee886bed0741a630f7da1c4a20b9e1c9a0ef7524b5d16ee463b2e7bc2467f78efa77026cf3b1c6e266c0bffa4951943306010d45f6272bcaaf5ea709c909d613f91ce03b46ad04358ee4acf4b9caa851a0810bc4f03ae503ab4159a1c60b9e0f6f2dcf4d981df0274c0dd7650df4610b495c0c3f174ca1267037b094abcc8c79a34a03fa5595332b2a35f93b2446268e07e8e2301e49610b04c796543b05a62851709fe62bb93c861b551c118a114b4b7ca48b5b313c57bffbfc9965fca3312fb91e870fe0ac693b0aeb54d15bcd481649ef954531a6b23581cb07b75324700b6a95db51584dff8adb58c27e361b08e90ddcdf843f1f651d836dda7da976c4e1eb9c7aa6dea2603ea741f108bc477ecd83ac7d3e40769bcd4f40cdc7dddd6799dbe9831d8ef2df74d824baaf5195e4d4b8cbef834839f4464039b7fdb623098ea6f634b43c7a3a458dae75cc5a9eed6165ac15baab9ed919f155116ecbd9abbe2fd43d25983c3060fdde85d186e7224f2b4bc0a38f352317fb3fe3d428ccaf8d49c9f4278826cf5c90df8c42a435901e31b169810707c93bf649ec661b2d7751348a30a3b7581229d1dd54b94969cb0d0dc775d743449fdfed29b066a48a325474ed542bcf4d3acc42634d1a09585cf34186a92b92cf54a6c8142aabe2db76366d1e3034b93e28744b1bcc1204aec0a7a80032f4122277bf1a04060db4552e0ab3cba9eb51e279dd3b57615b70130d6045102a40f8e8901d5ae6961b57dc1be9fc70400fbb1c077a0b9225ee58199e0713aac8fb6c25d93546df06358d4710fd507ada15688a8ed3b8b2d4436289042d1a47573db4320911d82f30d6c66347e3b7495bf01239da4a43e05729e7dcc2f1deea50cb50331c1f16ed7a21a38a261681de06b9cd21d149fe7c04fdeff9392f3fc7904b5217332611cbc0479ac42b49aa4719a5538e1749c31bdc17ba16d88abdcaf29bd93a5a442f7147069c56633466e82606154fd64048adfe872b7a22d0b7c993ec0aaa9b699b7265cca091ed309d063b3902fda0a0b38abd8baa00955c46bc6f60bdc824af0001c1c4b946363437a0bacba576bb1427ef82b4e257916bb3870253005ea3472b2dbd924af38842483b47a83b096bf1d0aec18b5c430383332c321d1a570d6e5e16c9dceeb8a842f50c5dae434f81600b792de991e572288557ca515ffb7a2f9c9bf63398dbec15a551fb4897c4c7bf0d991c02b333527d49b2784e3c2dfd67f09c6ac08d688c6ecaf5c3574dbcf96d382d0b6af1276165095d43120eaac1a4e0c9a972aac8b6376bc2a184de23fce29ee62b60d486dcbc6cd96ee9a578409d7c04eb50399772a511de317c0f810deb22a2424653a15d6d0ceedec3ffcccab474a2c47928ebc99c84cac5b7a509a1ac1a3e47832edc2e7c7369aacb38ff50c3f25e8f1ad0e2ccd1a2272fd37fbe672fc5c3509bc69e247175ae1c2ecf5531e520311dcf4965a6879a25e961f79c5f3d135cfb72c4696cfcc4effec9bd066b7b507b007db6a1848a1c279a8affa4628009ce491e97a0d18758ee6b879aa9e7c350dd46a0693b0664ceded78566170dc2a6918124c5795de4b75015c9601e35b99ab5e3938b13164f157273bb86a0311331c43ca229de8ec141a0ae4be3501d3076cda470ff343c925a03a10132d99d316595207a1ec9cb6d5410676947612c10f73cfdc6d85f7e60f335311f4e47bcb489e806d40a83fea2fab743afddc7bff03b1faf3990ca2dd3722fd705f7fb53c7b31639bcaf18ea54aa67c4084557add551b5a3337a25cef422521d818a40403625b8ecc642486346b7e6d4a7895875ed03b41a6efe08607c936f5ab514c021e218525288741a707f6dc611df68e7ed79d717f5c6812494e96d21278ca787b827fc25042c5fb4edc16afa31b1d0fa2c1c44efec91c8c2b857a4b5ba8ab0d35d6cb82af4d33476ef78025092e60427eb0eb0f39224be07a9f136dc02d70c478c1630682d95473bc9f565f0d766988d35ebb2d9b7b2f84192743da167949b57e9cbfdaf0dca3d611e58707be445a1c62d961ff35d47925d50787f6a858fa9f6b2f2a8f27bdd02774b0c90601a608c05344068909a9e436c56a4dd784041222fb521e2069c337bb189bb3fdc80d316ab145fed2301994baab22df6e921933ae51ebd80a7ca03dade7af23910a6f60a1a0fc107e4ad797690e785e7008f3e37b0a38b6149ba1a51961bcedf46da0a524a065d1433c49bf2c397e8ec6e69677cb70d000065b80abc1fd87ef7b51cd80fef698e7187bbcc65de8c0e68eebde2f7266433fef51c1919c88724662ee2adcce77ecfc62194fb194f9693a6c3d6e3b0616cf930a239d26f0d9462490618453ba1d90a4fcbe8c6f18575d911004b690a214fb8284b6a232547703663da37349d0a91dc689df47f92aef91d3e5dff8b007e3efb716ba28b11dece91fdd500af7a1875aa44c67757515588f480de9d09330e29d1cde540433e46b2941125803f1598606f7afdbacc94e79a33f8c57392ca213ad567d1df398ee86320d17172e59bf0ab27a0cd8e8303c1323233604b44f5021183fe6f4994034b5770af48511b541b9b1f2b9f54049b935792c718f8cc3dce95373dfd7de8caaa16ab2ea67d6ee3bb24a246fa9adb367e5b061bd2db43836089f154278c2df76960efc7de97a0372b8457c4ca7a5d43745911448a0325aa52aeb6da20acd776f28d9f910658a00c04ff178e9fa75c7ee465d342ccc75ab7421ed36e8b66479d4ad2b68d933e19e6e80cb1e21a1c558baf9ce9b3d0c1a7ee9a8b9b9f4b67ce78128114d7c336aadac341629a7054a3616f996d113ed8c69b080cd0c01a3321910814ad4604846ed15d76aa4ad3a2c7b672d972aeff711c25e222d906123e837f8cfe46f7b2e31a137be7b48afb49b8ad0cab2714a0f60184058f68cdd3324815293d1c6d7c06fee12a58e1dd158a208fa129a02f11445b114eff489172d2bcfd21110647b18b8a03f4678fc5aac5886cdbd7f250fbe807777bd4300465756178769e107eff81c3faf981a3bd9ab29dca7c1c08a52b9e3fe3104458c6ab2569539ddf793a0d32a9c56121c4f570a5ce5ab134ddf50ff388780587fc60d61899e52c1f0304b79d7b4a7e0e7e30d932ee3f0df117a8d8e023c31d40428e6d7fd545913125d451deceacdbb9f7b0328b779dfa65d10893c22cff0d04a4ed41e25521e15baec12cbff33a2d1a43638ef047a819490bcc122c41412b6e759e8da8ed6baea666815719f3b5a4898d0fce6ac23f7f226a6b80ca2f6598116f8b124258dcb52c970c4fe39a753958450432373a598a2d39259f757e7f048c6177a4f982dbf3e26a6006cb1d85683b3dbc26c44e89cedb57b5e71fa190d74a04f1ce563b12fb96b09d145fdd01c555d05d7dc8c39782062bb6e6b68c1c5193b05ea813fa0a06803f70f914ed558c7f89330a072ceae2b272176190c068e8f68aacfc4034965f65a268181a791386e1f233d43698b0e3b82a1bbc2423922769e6c044a245b34ddd31388ca082a0a69e7ee306084c52ca7a4231b973a6689098c3a5656fe01fc1568c804e68cb7e2d7b6f3ef325bad82bedd586656b4ed190cf2fddaf5f3c6b2a776155a4a9158e314f57f98bdf4362c000221ac0a09b7601fe2310c1f3364ed92236bbd275a4a1371718d8539cff33d9b1567973bd2f33dc1b0ab9e50db6373983952941625e0e273c7557b36c277f05229414b38e84242d2f50a77874fbc94c06a478212db4a9aef21f64efe83d8fa7e0f9873b1a8a7e9471c3852474588e119ce0ea38b152ad4e9f253823746390181c455df5f286d52da970c150ec53267e0511a4c2b80cc3a3935fd9abb495c61694f60e798bcb060a66f3686adc9c5f04c768d73bb2a560bbaa3a61d25bebaca6a1af2982ab6a6fe4bd55aac172752a9c61bf5ccca785e3dbad385a8879092486c2eb4db64080cb7ac367f6134c8bf5ce8a786145ad347daf8f6c1a9daa0373d6f7acd43e6da76eafee9f6651b175828a29d08fe276941696a32175f435ffbd07062fa6c17c94763db7d178fd0157d9e01f6c809fe5b39a04e1e44603ea6ee2dcc92ef1c13bf1b236b2b00c9284d8b4e3945b0b4ee550d72bb273bb3b8ac36668432379117df0d3a63d29e426680a451c48876f732592ec37d8c59ad0e3504672b71df6e00e0261e887dc573cfd9600001225b5bf71b27411b0f5b7a934e38d164954e7c4c5cdf5574a61b011f254341065137fc4057081f0ef551651612ff73ddc7e26daa6ea969746c311ad0cd2919dbb5236fe403adaeb7b9452442e3a919a506920c7963eed9512d5807b6a75363fb2b33bf8185d6b188fe435b19b05f120e6ddcd436cb168c154affabda965cb03b659c0f7ca8636b45e23f22dd7a8b2812f8642f40e101b0478ccba93f62d496c4471976c18e1782cb147bf566d52e683b1e4169dab3384f290163cbd31731756f4d332fbfdcdc9fa80fdc1a95271f597aa2f8fbcfd290a581da4693acba9806d2c7da49ca5747669aeb404f00623aee6abbfc1b2983772026b093dcea50ee06a0dc1dd0e323cb33d3aeac19422d069b72eef67822d68e69a4d7404fdca8fa174c7e59445b474e63f512184cf87d325b2f1d6eb0ff99e46b1165ba12460bf3bc887ec2afb8412824154c4f665b066506826033638558ede3c51440c16a597b7afaef9fcd1c5446f92024cd1055cde7dd19b45331b1b3fdd10256be8973716e92b223fc33e97cdb020bcd98bf8006fe74a92122d0d4cd354087f52576f7452177180c300713f8677ce0001f4484c3999dc589629015f68966e4bd439806dd6bee20fd7544e46221f49735facfe64ea3eb73e56cd1334a341b22463d057ab4a6cfc7e92028cf3981791ab8a63c01f92b430f51f8afa9f98bea87c34d9c70673027f84a9464e99ff09aced3b55014276207854811572c8c7aac41c10f1c60e2ec513435f714e302a07532164e0d0d889b32c4405c4fc413f72acbd9a658e439c30dbacfaae9ce9dc119ecdc5bdd4e67ed41065e066913fbba5df238e1ea5f073052c0967bc4ee2a5fb88b1d67026cd0a63e694ef9db9353f8212e67405c5e6b55fdfa2523cf9c7b4f24c827d24581e6582865060aca5d31ae86da7ac9540409362af686ed2b445cd00ae78c6882ddfbb220101b7a61355b742493905f0ae352a69a79bd1d566d2d65bc02e53a07a8a5b8fe755f076294aed06c16b31c436071920f95a111fe579dd7c7ece6821c9d78522a33e9a464a04102918ff9fa016a62a1141d213e41b6b98651b9722fa45a5cea59432ec67cc180d641d3c4963c6e60894450b2f0b907a0a8c34932cb6fd191f71cee9e7882791b48392504955ecb03a982adac20b1a4e6881d5290ee1fa2aeff88505e3784f9e4da2c3a005d977b2ae2432a089a9c38e869c703f1d3777eb303bd991a47435857f2ff0b1f95eed1203f2d721a314b8138916ab871eb46cabc8b6a1224c6fd67bcef8ec6a9a8d8a431c0bca7a499b2a07742b0ba93b0f42c87e710083eb0d744c9eb815b3eefec4b054da777b8e4f51d298257e3295deae0457fc38d1484be635b3a097affa6e017bde93ab6797b4cbabec814cabeb78803c0f3b772c3629332c65c0e7f5f00d20d08f5d6dd2aeec524ec7187650097bec65f472c110a8991a7dd584735131377c7b81b50f15d7b0787c7d5b7fbfd1a25de608b9bfdaa37f69a65d77cd968853af8d9a3dc555d4a43d40b503d1dbdbc248293c9fc40df13a3528e7e317a886e511bd3c9a191fd63d48a1ee8e06da0aa4f5160e953e60fd8c568e748fe75911ffe8e93703c1e83bd44499a317c6008f1da95f1338beebbcf59b1186c5da4401042db436279f9c0489533be8e62db8837863cdca3363c3a9da6208dda982862b788aa13c451573c05fe1d480e9e1ec394da40b5d1404fd5b520762c4662ec97b57af004b26a845e69983f686f8c532f1a4ea5d462dffee27cd3192380d92fcfe49c68574066ac3e4cfb54c5c3f25d65d1e6670a702cde343f13ccdf194677d3c5ad0706daf4008ac1f5dd569d9347176f04718bd59ad947ff6de18ada1b53bca5cf5aea04b63be6f9c0bb224771cfbc675ed5d95e431ae2344229b134ac6350b905653f4a66b72dfc18b249a7c47e9a352b20b288506df09a779a973713da4c84eec059860f1d61fd183571879e8b7c3bd926591111e2bbd8b5cdca0a80168d08506237975b712d4106bb9a4f02b3751a7d71390db242535b325250570040c3f3589a8fad659852a21afcd471275524799b2d6fc10bc13763ff4dc96b178c5c4c1e7be30b247700d42c85753c6d67444d3bb0577b50178c9a8677a7ef67b422d65528285d2d2db57fae131635ce36147d04462d61f4010a873a8a3e1b11f830a1f7fcfb4bd8e0f68d03711d4c8d38021f42a9704e13f6ecb475eef9dd12f5495653c7162104b54ac81453ac59bb72a9f5ea185dac76e33c936846cd6c4cb9d0dee2a233de3bc","title":"493. 翻转对","link":"https://leetcode-cn.com/problems/reverse-pairs","question_id":493,"issue_number":42},"40":{"day":40,"pres":["排序","二分法"],"tags":["二分"],"whys":null,"difficulty":"- 困难","description":"本题和力扣 [475. 供暖器](https://leetcode-cn.com/problems/heaters/) 类似。 **因此大家也可以用 475. 供暖器 来打卡。(因为 binarysearch 现在 down 掉了,可能打不了卡)**\n\n```\nYou are given a list of integers nums representing coordinates of houses on a 1-dimensional line. You have 3 street lights that you can put anywhere on the coordinate line and a light at coordinate x lights up houses in [x - r, x + r], inclusive. Return the smallest r required such that we can place the 3 lights and all the houses are lit up.\n\nConstraints\n\nn ≤ 100,000 where n is the length of nums\nExample 1\nInput\nnums = [3, 4, 5, 6]\nOutput\n0.5\nExplanation\nIf we place the lamps on 3.5, 4.5 and 5.5 then with r = 0.5 we can light up all 4 houses.\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f249d123385588680b0adb2d1c6c0d97f6cb6e33c7bddf1997b34b506c338b3331bd78670589ebf25f42fa2f3ee24f12c696dd5d7cefe4633d0aa8b91587224ab508f9aa8018b39f409c7e0abb8c06b23cb0074a6f1446a7247fa4f14415d9751b4cfbcbe22aa14b6fccbfb0ac7259ca8446e5d0f1c5ddb69edf534fc68e56817558113482531b2c64118f0e78b3013310b4815e861c2e6c7ebfb88781f4b1744645bbf59250bf2378adedb3088b354ad4cfe524027e067592e16d72d0a2b139109f0d322899b0855a0c902387f958b415b5feceb3ea5826e309ce4ccfa93214cf1105d76feac82259614303732a8c9433c14650baa5cd0fddec405bed8af1d5068ed35eb748c5e144d8d7d1f827cd8e42619c34d6426d443a8828c59ec21bc977203c4b065aa05d8269d61cc20b7510fa1d44b26022286d40ef382845ccda8d19c7c183f05d8152ad4a83620649dfee25375859d7be84758562e534d829f26abac0fe719176d9ebe35b5693242f6fb60c7c385f5d8cd4151d860ec3183f250f754fff7e34fdbe6756e8658122063a5ea2d69146f8d6589ed7a7183ba8a68656a62572db533ee9ce8ba728b992327669c6f22668a43ab9477a999e9ecb1b1861ab1295001551530bf1c1eb2aeb9598c29d2e4db131dcd004948e6f8c8bd4c433461e23e2fa0011d8e66b60a52930d01aacea3a50fbb64dc0b93133b1e1b91eb474b5515b78430bc8b3a417078341bb630536e52794b57be899a09753364f18ab8ffc3db0afc0e11e8efbac12f8798b28ec2737e155729b6ecef9deb12a7e4a6799c58cace7fb61739c4ad6843dada133ffec44d3c2214332f64ed2336ad992c45792e4d352a58e1fa57e0c8fce8d0cec1c16d5de7114663e098ac1dc502391187f7ea0b9962fb33d809618a1875089b349bb031988ee227441670e3d3e9d617c6e251b8513b2c55b624db4c48bb061ef755ce83a57ac3622ec2b92fe6716d519a8da4d61195b50e1dd5bb0a07bf5b4aae108ad2c8e30051de95eea7c2488a791b4ba322b889d9f55422d53561eb58bc82f66c16d56be510e05f62d911eeb66b6d7360dc50bdb82b460568aafe2be2b0e81537cc9b30c753d314f26bc911b8d36b5b4282d9c947441650b682c7ebafb2c4a281d57b5308f2a3895e3703d520d0cd93e4bd006aa560dfd856db36d266714818502a4461b55c98435c1d54f97c0e7d64da9d1209a644d545ae27c0a536963572c273bdd925279e613746d2fc90002f5b069fdecb20380b267f0038345f67a6657bf79b6ae304def17d0aac4a0413c50ff0f84d11101e3ae64aa2b477e362dad444ee1c0893e7943c7d2255373419270c8bc3612e7d59538460c8c57add723e7031fd6339508daa5334a4a07db9891eb8b65f818fcee4955261c3fdfeac30e6cca84e14ccf269f78938af68a2ab6c4c1d6de15e3e9d75eb0a9123562d352dbb555d09fb9d00b4272df4d769567642a0aaf79dc5f49c6cae09761f64f2c12ec75a16429dc57f8d1159bb3b0bdb02cf020b46a60c6802d42a6ef48849ca58613f3dc36215ebd2d3ef2e19cb11b5ba098db3eaae365fe24551294c9286b762a43751ac8f80a9c5f59f379acfd87c2655e5198732f3cabcf64b78f80935dc0f380e194b483088b20aab042e6c21617ab4ab07f0cf144b30580ab3c8ad12cdbe29b86df965b3a2c3155ee6dd00a91421b305cedf78a8047a0024df499452c6c536a5976cb5b34a211b697dd74a0afb2ca54bf6c2ff9a6039269730685a15fb3a424ae5b46e12cdcd8be81da9a6c22571ae276d2a436288d1c1f11a13177e3432772e0ff25101ed2d924e151d41b8e5bd003e2e193ac4f19f2c421dafa38da46bb621b7c0a97015603989999805f4c5893fc3a3219f0734a83774cfa984989c867566c64a987f519a22563985d1e3343d846acc73639f484d805591c4d659d147b9ab54351b4a169f7b55b93f840e8e9e016e7414acb3f2a3a7e5de69a477922586202d3891f2ae677ae351889b9676ebcc8e5290e454870be0e606efc0ab5b738e2b5c7860fa28cfa55d0ed94da2449532219c0babd1d4bec2e08afa929a9df8e08dabe3436a3725cbe879659d62efeaebf12755c6f8433878eca99a37b52d30bcbbf1f49cab8c2fdd2aa459650ec5b4dc6c95674b88e22c61c351cfc550b35b332d4a579a4c7298cf0fb78a8d75277996524420773059233c05e420bfcbaa6d9369b36f9522a7c59fdc88ecce4366f356060c2d15855e610adba21edd8a74bd83e1c80cee5ba4ff18e7b15c9ba852f59c771a3ae4f596b0ad863a538e227afad57b76ecd229be60a490c9a7becce81eca7d9f6958075a8b599177a2ebde44d7568a18f00582cc70a6e6f3497d309913990f2f3f02b9138f6d4797ace062d635ea94b7fd50d7ce277d8de92a7d6f6ef9c66dcc4e93c4fed0b66cb23fbd58af098ee7687092643e9df2a3c7477a2cd41cfb85277901dec798081dfcdfbd33c032f23c06431dad9717970ff5cc134fc7e36c967c4c6bc5dedc1580ea6898daa4d438c23e2778f9cbfd26c389ece3ccb2e73b58849860148e2a157aad5cdf53940801fd6f15f90be092171c1f173dcf4b000a08fde1287826c202736e800126d5df55f3b3516c5028f6e7b62fb4c901e342f4f0f5d3c7d58af234ce32077361129570396c3b4d72fb457a2f2b2a67aaba3b3f76434da53198b58875a8e96ada3d733f473bcb5d0ab7fdd173570aa50d5389a8da5c44b1dcb670af8c24bbc5e6aeedfed0654b3643df6ce490d8d537efb1b3f9a3adbf05c93b6f928d7016096ddb71f8835b007e3e2a5f2fa5cfc9700891eca51428b83c992dbfc6976eb89b825826504b33cb4a76a64ad406892c9c7e8572f6a3b190923f7b233c0ce33ac62f48bf2f11382fa1a77abe7f769076e9c09764ba05a3a9662ec4cfeaf3bd084bfcb99a2894415c64467b62c8b982bdcc679da2b0c3b42c6fc74b1bdaf47144726bb4f3101d61191c5c5518604fc53c06c09d79b96740be7807592c5fc9dfe0cc7a860bfdc6f6a96e2ff2368fd46a2fa3a021836f19d20c0a8e11d8fb177d52f018784a75bbebb401955dbfc822d948e86fce237fc32d4af505005f412f7f1d302b0bd62d74e71f0f5e4530f141cb51570cba76633dbd55a95a6a0d359b0a04891c43dd314b53bb42942c27cd10a27a2a6432e00c61f5443f32f8e2404ba75193302e93fef286f405963036105e35e7628fbdd3b09d9eb00e865270c782e5fe69565873da35412880dc3fd253096eaf6e1b95fd8699b16c861ff00277fbde7d800a181652d61b60411415c8ac8f05a6885a474a085c3343977af4912cf29b585114b85328c70bfdbed6ce94d4c1a9bada807cdfb527e76f354603f202c1f32353455d8f0ad3345f0321bdff64ef2167e307a89696532157194e96fe59f8994056e0591be0eb36e838aad1f8cc050599defbbb3b84403ba66a5b2220200963b669a7699d2d6baecae8ecafb6a466aca699eaa7e9fba2c68b4720bc97300fd610190782d028d3a7c4cae7646481f37f2a8d6110a93e2281f77538cf6214a7c3a886b25d671795bb58f9793246968b439f25f483561fc7cc391f99fad2f2c9cfdb2692f1fee9b8df9dd29f9d8549d4ef209b3511460ff598d5f70b0a9c37f7dc27b7e4cb8a8624caacaa62597322b1cbe90661c802b900728fd78e37b191d3429a55f56a0ead4039b4e1186f25ad77409b01501cc58e6a56a76b22374aaa7afe6231925f0f11c60104859da5dff6eee681e11cc615ee41725a5ce806c93b84445a6f66469f83af630dddf205226f32ae1784170a837e255ea5b14ce9fc9ecafddeb19aa32edf054a5cb02d0fb0df6d1296ee8de18f86d7fe2ac8031a07cc4720b5d695f5ee8cebe88621464320c37b6a496064c8fe7e1ca4d8d68c51eb0cf33d0b9847ea37198d5773b0de0159e5898ef220ea6cc49b4999df3d1530301ca7978814d902391c25dff723d464ea6d6e8239b982e2dd3060c13b3bbb3464eeca97019d50d5e541c7324b6e5da2705e4569ad582ec9cdb0ba39d931e50cf21c783efd98b5c81d0dd9a925bd47af97d6bbeaa0aff04257176a3605614c5b86e73fd7935921d21c8c8fbc305724983cd0d84a821d25b354d6e93158786d01431e1424f2cb6e5b56b70b805633f7b124adfac5d2cf82f61f2a77134a5e554ac9e592b504cc67310cd61065452e137ea73500319a239b51aa9102e5775ed33d2e99c7d9a36dbf01c4ce311f45310aa92219b4b8cafdab5091875258a44d5c2beeb083728021f774cd45b40aace5304fce00239dc5e100b80392ab26161a7e16529af601dab6bc94b3a1918fc4106801ca1d942ae8b0af3cd72f55fff6fb0234c5763c02a3122c6d64146b2f19347feaacf5e3851105abc62afd01378def0eccc63829f0e6a7d2cb99e0317cf385a33142356fb798c2021c7b708f7f96a6d730ad4f7dbe05a1f72ae2f7951c8b24692fa43243c367513d2e1660cd54e90def64d909ed0dae016c137a7a1c4ee6ecfd72d482d5b84af792f3456f2472bc548814bc64397a9bc7774f314f28bcd8b2338ca6f02ffd1b89b0b51b63346532e2e335468f5f762a804af69b056a8f8cd4ba2accb741d6aa0198ef212ecec66d72bc15bdac36aa56f58396f3d331126326d3a623c6e50873d3964eed7ccb040e5c6323a9dd8b4f78ddf598442eb8528aedbf9974d9d535d166c91dec6899a13b9f2749afce4693d9370ef42587014db72febc1544591f4b530a7aae011848a1665556a5cf42330df29b602bd2eebda64d6fbdb9dd5778a333f0567cab4b35b6ba8978d660cda43c6616536714e1789ce1d2b7fb8af775f681473ac880299ace02eb5d6d8c686d47afda165cb7e0a95e4070b4e3e5e110c3a06c632355337fab14e3be1465f9872cd91ffd4c86419bcd757a9911f676bcedbdf757453ca5339c9892269943a447e592a6a456a072d81d82ea78e2d13994d4dc8d8c28e89cc22c1d127573c3083604b46b43eaeb3d4fd66de74cf5458831c90fc76e6cbbd1587a9d24733072ecb7446315433740b46993c1b8d75db0b210b46bbd084e6701227663fd43b234ac99a46b6da3090ee7a16b2736e6045201c2e032d0398e8d011b4158d645ac53cc6897a89da85d5bfc6001ce7e686c611547f90aea1b07226de83384faf161001c5d144b634a7132e83d4ea13f20a6b2dd10782842faf5a9ad43937f4a0dda7b8d5b9533943b762ce8f9ac55e3c46eee508719023a6b0d1baa68f96b5d7986c4d6f3c55d3648bcc4fd72e59d1834f1200e31cddd482ada70ec3dfc86d3d559e18b07b7ba44a52a4a9ac47d3b9b201fe0b2289aaab69c3915943b9a85ca9c5260f5cf2c18569617669242592ef214ed6510ba61706f7beba29bd718719a71315c7b287527cf9911efeeae467ac7612441bc036a0dfddfd4da6186435f36c1258a025305b71f1e8308f761556a3f9facf86edbc6a44576b11e84282b0606c7010e47352523c8fb031f979cfd01b441ac7f547fe80f56dff60895d6d7006764f94c8649ce6d9d6931b4a475deee62478df333a9a8338a3f8f12e3b815d6fc8a3bed79266d9db24f6946b7afdd55c8404ea2eda1487ac9925551f7e0f3f169771a6a8367a804b5522bc5526373d9156ffdbdacab9e375dbfa168920a58e547a2fb2c9abce763258345cc054fa8ac8441b0f09630c01a486173887830ce4cef4582b71d51a4338aebc39dfba9c19124afc6cc406fa15fdfe136edbf7e09f4c68878fccbc89554495d0a58c3bc83f1f5eedba12d792f3935eb81b3c5af68f400e592a1f95f0809d35bb0a9da827ef3c7c143f8bf28e9f38035e691864164ddefe3a921173911653956e383aa741087d5ca17150dbfeb3892e4d0a420e29502c5d409ec732e6ebea321641c6f306810247002f939aadf0891d8017bcbdc2548d6d1d7d900b5e4528ae44991bc75247c50420d514b7955c6e3215dd856cda25873f2bf57362f7209316cd8a10cf585d1625393c7b7d66f559a638bb1f963b2a727cc3766f9f1744d630ccf0a4392b15f3dbc7a192c857fb23e58de3449a21923db9246f6079e4ba91889074b515d4f453c30306a4851c940bc4eca86d6e4474ec08751feb6b07b543eedd6fed6602f52debd5031d21ea859ddb927538a5cf3df56380d4c22423becffe324b29ebbddbab38bebfb600168b2f21180507fa753ecab831e901875c9b40e815a9345ce94836c9b0f8dcb5c5ed5aa1890ad6e420c212b06b59a1c60b9e46292dc856814ea2095722923759d67d01527328174066bc26602c9a94abcc8c79a34a51f949c97273333ee37f65086ec34488ab04177f6145518ac55a7740e86f0538cde669af379e310e36118a114b4b7ce1c70874267df6bdfc912ba9ee6254f0638743a5b32e3d12ef75d65e88431741eee70f1785983581cb07b75324700b6a95db1b5846a1df98208730627716e60cc4f4d13b147206e5289475e72389b2fa957abcf4a2603ea70db84ff4415fd7cca0683a406adfd8015bd5f1c7db27cedbe28359c7b39231c561e3a97b84ced4b8cbefd40070b803402e9de1b66f4cc0aeb861f96f6b330cd1847d8f0fccbf242bf82bb6bfd8cc27f45d5f34c3dbb7b41cca2e79ff7e7532f4dedefb86ad2244364bd1898f352317a97ab78128c7fb8a5ed4de4b892adc33a13d2cee629d21daaa3da107a6c235ab31f348a38bbcb1e9e6658c2b73c0b8e06c5fc146b9f929ebc80ab14a99f8725746ed28b6494ca7dcba2cb7a10af8d063e799999cb3d05c991fc62ee358218c4f41eeb3262f34ffca919fede833aad2f7a0fe46d0be2e0c4b71bdbc7edfe2e309be82d4e3fd187b4ef0cba19412aa79893a58615b6d1201616a594a40a8bd931b6ca5904a00dc67e3fc2bc1c7179ffda7cd2795bd4558d05359a19be36629c24b0e9e5235855d0fae237ae94176c3c09bf5f1b409564ab88fcdc5e8b12fa8c6a90cc0a070c670472617e4d711feff3bb4c33dafec5a71114a56ea954df2f5a2a3d227b2af5f69ee994c4fd14c7ef726c923aeb1625423b1c1be1f358eb4d3bedfe9084dfd764b9f8134e4de1ff701e6df0ef22b9766f61c0f25caafce51f9c5dfe787cd92399ac6f0e727c59dfbd44a8cac2c7d00eed59a13176bb9c69666753b09fdcc09686665ec7f8befd382325b740530c69a659c394e89658d2eb7c62ef69bdc3f84c48899eab1781b9aaf7ca91e700a1e18f72a008e4515e48cc4824ccdd0d96102b31e2cb1c1fdb022c686fe12353f21040a7d13833d2c7a58544e5a2c23549ceaf0f8ec15df4913ea3e0602cc99fecf30074387a4768005e2fb28fb834a2976a7500b71d852984cff7a7e63bf4083175023a38628172eeaa4bccf23ed6526a36f4cf86e9f0c102ed7dd1e36c08be990e936ee8ef4a58b8c93a7797a2ce00c0ce4271e6f37798bfc4b0cdaf1fba5a8b88120413d5df31ac42737c28411b2cd45d8b26a9939f66689f0a347b87be56eaec8a5405d76402b70723a3150729a1803e28c2c733884d8436558ca4c475ef7f800a6458d7cb29b0c03a21c9f766d9b0d903c5a43d1e26a66977ffa2166cd8103fac9cdb3a18827c9b747b8f3b66c22508b0d7eaf8cc11ee97cf78e1f3dd6f168320bf596ef16731f92f046a3c9ed606a75a26e18260e2eda145f432e16e958d79a28656a079d52e34300072245be1be51c246142a141590204e2171f0d3a3d488646e0ee4cb7431551fab0fc0418233e6a19f5d088a19df8746223e8b6b566bc67b57f6d3ff6256a8c0de0b93aa18aa914425961a7dc02900c31d783fff305cf113d8b63939b484588901b207b7e57a8df4d90f7ec3a5a0f997037bcb791ed00ff243d68c0a0a6eb60524b7a1181807cc20614e95982bfd51afefa54c1769fbfbd852eeadd4ab34c72493cf2e90dcaa0aea95fc298696377fbb3021d2b6ce6da6f81a1abc527217c6206f2a627cc064008cf780d64d6305902be1acd27767704f86f7827523f9f16b72ccfaf11e44e95d5eee95fad47a5ff56316b02a32bc091c3ff023222fa0ee43d3e42cfa5c0296151491d13c0655530444f5eb29539e71c13e69f67a4a89672018cee5ec14016c1b57ece2128cf13b54cdbf0519de0dfc128e5fe5373a07450f24747b55d7e97e7dded0fce117aef679f9b1ba68cf7ea41ca3c6b0b175812d21d81fc4f9f45a3dfb5647b5d35f1a713465b2c337f1f1ec67fc7edcdc30cdadfcf3ac0dbdfac403858b99bde6e72a2fab6b1e77dbc599217ec9779220c04fa4502d047bddc2a99a55cdb0576b14f2dea4fb606d4795222addb7f00f525b1974003775847894eb4bb2d3d8581c0a254cc7173f5aec82f47f9551c994e88df0399134a5a34522c61d78f3d116e6d20ace59af1589d91c4f902cd30931ce65773ab4ec658fd48c5112a21b8482afeff045c6919a6ecc61263d2d63aeb87e0fdab26356622ee5e00991b3da5c3502501046c0e75cff9308200fc74cac81afb8d9cbe869b031c8ec80e231c674ff6359c848dd5a3e5d20deff7c1e5b6f2bfaacf1cbbb606d0735dfd677c83236251a4bb9c1b4491d2b153cbad0f08d76958584a41c90ce7dce910805ed793c9f54e4b515c6cf2f8f4c746051fc7ebd2d54453afeb47f1b12fa6fccf383f7b5c7015f6574ab7094fe9b44aae2c51f43b59b5b075711ea0dea4c868e4888e4ad631b3f9f5a499f72c85a2012b911bea571b046aa04716520053ce5d25dc1b49c097408eda40bf856095c92a65a77cfef4b728ed40e37dad43192465fd745f729bbbcc94dc0074488a70f3db0773cd7ff7acd569047e3565e4e40895170ea9e29ac6d690914bdcaa39943d3e1c881d10cc56483a1dc2c4179dee2584207432a6806c8858c9330acc6688a07aef4efec159d752733830fa814d2f820624c3a9960916487e2e17402b2710035e1bdfa46eda7e","title":"796. Minimum Light Radius","link":"https://binarysearch.com/problems/Minimum-Light-Radius","question_id":401,"issue_number":43},"41":{"day":41,"pres":["排序","二分法"],"tags":["二分"],"whys":null,"difficulty":"- 困难","description":"本题和 [719. 找出第 K 小的数对距离](https://leetcode.cn/problems/find-k-th-smallest-pair-distance/) 类似。 **因此大家也可以用 719. 找出第 K 小的数对距离 来打卡。(因为 binarysearch 现在 down 掉了,可能打不了卡)**\n\n```\nGiven a list of integers nums and an integer k, return the k-th (0-indexed) smallest abs(x - y) for every pair of elements (x, y) in nums. Note that (x, y) and (y, x) are considered the same pair.\n\nConstraints\n\nn ≤ 100,000 where n is the length of nums\nExample 1\nInput\nnums = [1, 5, 3, 2]\nk = 3\nOutput\n2\nExplanation\nHere are all the pair distances:\n\nabs(1 - 5) = 4\nabs(1 - 3) = 2\nabs(1 - 2) = 1\nabs(5 - 3) = 2\nabs(5 - 2) = 3\nabs(3 - 2) = 1\nSorted in ascending order we have [1, 1, 2, 2, 3, 4].\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2b961633855e9b86f490a6d594a1f47177b6a20079dc775081d103e7bd46ab345588da281edfbc3ee33db5ebef22f870696a969bd1e10621cea0848e125423ec30b695a81ed310b036dae6adaf8833488c4a21307eeba0d1eef85a374f49afbc2e78750a7b23a3625870f52afa26a3b84677510c2150f170e3334dee01b74b450bb660241b45c1e03c7bd48bfd3a6e76190761fae32d564e2fa5821b407540ecf6930e1f703b8850b05ddb1988b09dd1529c0f4b93e04054eb69dd48751d9f9120f0d0ebc299512bb48987bdba0aded0e150eaf9dd0d39a882f9a3de86ee06095ec481fe7b88a827b4233f0f3ca8c26741673a4ee702832178558c5c073cd2932cc3386daa2ddae1a44498dd08b10d69fcf70b83ba1a884eae85d303f6e92240f3da0c308a4c40dc6f16d51cb4759786601edda7d2af512fc61700148f453c285530406d438218be0b5aa2979611143e12fd7b5db248f45a6a345471bc931aa169be6d1834775871f83eace7de2b28e50c3f085a90a74a11a35c6475dbb407f99297f7b910dab32e4ecff7f6e805a883436074319531d6c4261495c8d147f4608ec0e833da77200a6eb16a69a9bb891082e7ec1298ab9a77b48cbbfaa4f48e06a6241783a9d6f54dc153a5e1bc52dcbd391e5ac7ef4bd2a28d0a384f4c95ccd39372e3d164d4fd4b8378909d7f540bcfaae3a44f800ed1149b18750c5292ec55535516b8ca3cfcdf0649602a2f5aae201e2e526b5141fb8d8009703477fc99aead97d847a85c0df3efe8cc6e9dd0a7dbdd7e6b130e76eea4f496af18b1a1b638d90bc4c07ca81623deec7d44899e0271b6c4557b66523d7d28e1323babc06d413824507a375aa8f15af1c0b9fe84d1888e7d05b4481a33a99ee306c30a391fced7a5248462a27bcb5161da407208904097f13692cda62b1b5f7eafdda8f61792f44cb802262055e432d20d50bf064df014d1c6f76fd37e359ed641856d764186dfb1d71e95e673729bf889e03b0b17ff43c3c28cbb450685d0f0ab854ede63480ab92efdc8d9fc1a31c93861ec51e99fe67245be5cf851e1467a9c44af922809407ac629a7bf275c4b21f9af10a0b03fb0b3df8620c522e94fe2769e4ad7ee7b0f5cd7c4b0553a3b4de682c3eba9b2c5ed80b913580ffaf0e2692a42d93cd088c7bdd26974b47cd9f25cc728d527220b26103c6e5ff81ede474d0b24d3065229298fdd1258ea02f731f67a8cf771d77c3b9f17d6f2302fd8243a168cb4d3582f1e649b9cd469605b787f5c7f345169a1433aa1c677f6459db56f16a2420454a70bfcab124b445b3aa643bfa967fc5da9cc53ba1a0dddae96757b3942722f0d6e03808f2e6839544ed164c8963cb6643b3060c66c3a414403ecff393cb6061fda370408a5a88e627bca8e5a51d464998f9199057bd5b132cd05388666a2a958521d5fe8b2a0289b5ba55788f02d062559e8d120d172aada770895be4c3a324df3d5e0f0767759d722ce2b061da7d66575d0175ab1c654b51f62bdfef5268a3645514acf4470648f140a8da0d572b58ab79d3cf2e4301e5f04a8fb679b78449306762efe1738be410d637ef3daa533ff061b310347d9d5bae30cd08efe15607c8f72907ea5c9f4b241de74b24690245c7106192925ddd417e388f0a3f6cd77aa8d04d7eb146f025d16b1c5a204c3a53e71bd8203a9072f40658a9725099bbaf351f9b50bac6a2716689540fe36c0aea1661d821f3985c28ed8f2d55f21fa21ae4ac2ecfc9465390483317c4ed016e7dfd5252489c9026ded9713edfeca672988711021011089839ceb7a450e3547071e7433ac133f934b9c295f2922f9fdd065136c731cafafa173d2f96bfdbb09e350d77c2e5ef5d9d0ffceb4f941cfa1cf348a19d515c46af22332aaa6cc017f4f105fac2294dbc64ecc93bc16d0db083d9d5ecd5e489a675b63dffda7eb155fb4347ce3bee1888222f354b43d8a12969e0455ba81d2d6dd314b84e116d17fe656a05f713ff0bbb73a1fe037d8b7c022d8b3ec7cda9062e251f9b466cf6426fb08c531072244bd51d1cb223cb110af11d62f5e2ab8637689f8f681c1d0030e25b09da5e37ba2ae6a1ea39a6f0ec6559ab0dda145595a6fd47107fdebc13cd0b2b6bfacf1322f178f0dd32ba97a6c2ae67009800ae1841932e0af77d40a3b933ad4d0beb19d551c67f3469f71f8822a7056f13666422c0f31442b830aba17011d3dcf50d0299da84bbdad9ae0e3a7264f7cc8aa657d32f7af94982d57945618bb425b557a8b5b847873cc0767cc5722be2043d9b7bc1a0f0271190aeabb12edd64f1997e5071ea35dd04b0e6d632612ad00cae868aacbf2d41db352f5356e77ce71da38b41cac220acc0f296fe5d4a17e9970e5e0baa47d8b2fa9df1d694fa512b36f27393aec2505e1d92d4eed9da5c520ca3585862f5b727639e95dcf973b69d348219e9e198beb534b1e0390b3a464f23730d297997e030082db407630ec2ea7399d8baeeb3541ea0686110387df037bf259e0e0ae7e0952d1486bf5734f4519e67292e2d05f0e6db70613582b43636ec8c74179fcd76488cdd56add039c02b2c17cb4e96cec165de5b1f397a50ad4a3cdaa642494f0e211eabcbc7590a03c03eb1df65d39c6fe5b7b78d35155ad2ae077346c7b02452536e5603f4273b78231b690ccfdf1db3ee8d0eab5c7e8096dfeabd395e92ff54c5d0efc6523d0785f1cb8b9ef018de4301004e1bee664f2d1402203e29e2b0b73ff6517fc05022166751718fd8bf3e575b8733df2cdb833375c32571b09eb43dabc4e1fd593f9ab5d8e276194e8ed85cfd6ca534c7d8f8a681c2ceeab34ff7df01964f3113d57379dca88dabd3e86e66ca66c894f846ef550ad6a2d6a1a5f96f3feffca518a4dd2952b9be67b7f2c0cee60ffcd56f54956508631cd463897f79f90603a54d2aa03281892069db6f7b38dbb266a101650678abfa6d1a92b719e55c04a34acfcf2ac17ab4518135e0939132be1a6659e2cea12b05da2ed5f3c599ceac6d491a59a29cfc37e7d726d8ce951845b55c56ca264b405a7866bc9ed2cd46855dec0d0348484c293332655df02fd57c8f87d972dd460f6ff6da2dd6fc0d0bacab3d491b3a1c45792b25381c8c3cbf70be408f1f5c91fdea6813555e70f76501ede244c8a5d538efc81a230a571a2c743d93a94bbb1eb5ce79333d188dd5d7485e4289508b5bb3f58353d4258c7203a104c7cab62d58b100e3f080acc0b929bcfc5b0be3a4794e41ab78ed2143c8d07cdbeab35c1df5813004958a52cd73485df2348ee449292d1a873decfced08e4d6409f26f63a3d2ea9180a3e751d26b589b665eb6cadc2dc7ed579a3b5b73ceda818cb3f44a18a35f5b973cefc38dc712965354fff4ec9915a481630b2a79f3ad366cdbdc0fe62b107e8cc2ca8e820a9607c9c32f44ae0e3466049d4dfd15929ed85357bb6714dc2bfe2938d02c405e7c3686e846bc31d7f34542ce9ce1aad3a7f20b96cce0ebc690ffc6443e4619a9972d2ed611390b96d625ea9cc5edec666f9df3733b8c6d3ca913214e20d934ec421c8fe3ab9ea8534725958d703f84ab469a8b49ae1ff6967d1ad2fed095f39ceaa1a5f48560ad94ade2c399a684c686ce14feb665926a4964851b401f71eec3b62b7d068b2336071c51d143790de28a9ca8793668cec6d270b9c7c82b426fe62564439a1f86669bf4d61b445a7992ac854a132e851c94d73c079b9f60dc89b6a471f8279ab27cdccabe49c9e157082822302600452bf04edf298d8693ff18f890185be1c3aafcf25a2b3fabdb2063a48ca6f25f827cd19673b8a9897c23fc286f7a07347664107f87319dc09b2b90ca3f46e1f40a625e378fdc83b8021db5b6c351d8e52b61526e5349642306d58fd4f94dcaa8b3e1d46639f3b56042788c46f60be769cc3fe362c3c41ba9a7323ad573ae894a6aaa29cc66f42d154099d2e4c99a64584da17280c8d2ad2a25a329c12dd9e646f150131f29b6e724bfd17bb6f40a4f72b87e23efb139d558176823fa51f8a90fb8326ed6b7dcb453b53b8d50fe7d2a3795257045c0dd1ed43bdf3dbac280b5bfc5b6a218477bd1e6c3285014e6f442462d8e81578909fdeb2b1bb43cfa27b713b95243aa3c8ae952317f246f5344828df5f36cb4d11ec004d530e5a82a9acfc5ea051925d86f52523a4b3de623e592a3b1259fbfc30fc6c6ca8cfa8523663f5961f32ed62a29dc32f89807e7996ea2b720c015e30a14b4c9bedfd450acd64b7e1103239e4907be8b7bc8d3ef75350f9f6be43898458b51c7520abbb366c8ea4b4f3b936b9e066886b4ddf0b69779168a343d2754753a052a2b80f9c772925ca4611813ab10dc9575660390cc3ab9a18265aeb6a8cb9bafffe7f7b148765f635e85b56e4088399c824b47bf0565a5be1a3d361b005158b6b96f2667a9e2f0c2713205c84222b529c1402447f832f6b41fb6687692e5f48010aa2a6b0c873067e46471372f2346ce75d3c8358950d3410faf256d0543792f77e4d7c97fdcb8d6bf5dfbaad449732bbb4ed08817b3abb7fc5265f48ba8e728f8d5b1338c3003d569f052fc3597a0b9bed9682bdcd01ffa99ba118c4e14cde51b497b35ee0466c82c53c4194caaff04518ccc06b21468ac0456b1cad0b5d3f6a882ae3e06f87a1f99921d01ee44b920e08b888db3753067f7f71a640380b2249d16417a7aac4f48cf14ab00d830bf105ad553d0a30f26932560aae75487ad2b8b0b8f2e71fa803e7e70992e273ce2400f92e384b3d000f9860fd83ed6530c8f82294276551d15894b9ebcc2ee507d04cfaf303d49fea71df66a022e36fd8ced4f6ebce39f2342f9e8ad84dc6812ac5e2149ea2f78d882cf923cfd349a3bede47221decaded4fb3b26fd8a4af6adf3f3623b878c6f8fdd73e910796f4c7ea3e2455cbc5dd84b3fd978771bedde947fffff71062224d5624c3049297d4c770a7e98d032fbc36f5dd4c7ac27b7bc0c576ae65b7de3cfb6f934ee82c40ca3775d4400a71a890bdc9659f10e74b349677bb920602ce3f7cd8e10f8d7f4f5d0e4e8b32ab68935d345c8cffcce6c2c5115ccd788e9fb4fbee6f12017905c57a67d28eb8f749dee8ed99ad995bde89c3e2c48b170c06fe5f574fa6262b33072147c1d0caa8b31513503adc4b00c02abbabba0680fdbe73ad6da943903cf68982cf4d84f546f19f8c5f78116a314419f019e074bfe832e656f3433305a9a86eba602ce4a28695ef9d16823a4d659d442e3dd632c2d5333755ed2f16f72009e37f08632d76f5982d64f083faa6add002c2a63946ddf8c247b4114d049ef9d15c2c9276f0afb54657b2b9d61a4647f6ea21cd5520cded167a3f86c430afdbe8b765b6c47244ac0a33053d9588606eee468077eb167e272c32bf0ac4c617ed6980d55d63d6322b36190d3d8ee3cf1603d5509de62d8cbf267eed7c415257a3ae4381aac4ce681a3556a693c162f76a6ffe1ae866687121fa4f697993ddac59cc0cab12cd37a8150f5a8de427fcf1e5d698a1df15c84a589d3fd985146dc1ee682ab9e1603caa80173f7d966b39c5f2cb7676374eaa657d48f40296a3157d1510ca241198dbe737fe141c039b937f7166857a39ccaf18187d02dd16b148ea610ef5568bc929c93f95e9470220f052d03ff156cd819976037c2f5f27a44084ee58dcff2e145916a1b0efc94c8849e84d40c08fedeadb40fab82a39cbbf21ad2ab55cc78af5c3153efddfe7caa7abc1f89478e4a3a93b8ae8c400bf7b686d6c04a56cfb5868626c23c1445a38c10c0dbe9f43dbc577c19a6ac031932794c9583cfd160ef43d2e63dc53c7c147786f0809f764c5f7619776f0892b83692707f915d5a8f44653ae20d5b385cfa3a5e88b1e1dd264420420e29502c5d409ecf38f7ebb47d0e46d69762ce5638477dd6dbf9b5db15c403d0fbcb4ea76d1d7d9056744528ae44991b8e5213834566cf47dada1f177b5791c0649470ca6c27f53f6bef7e934fc4ca5e94201c58627c346a7166b91ce8308853cb74523c7c8f39389f1844c454d7daa4392b15a4938eed8ae2368069988dee44fb089e14ec68212478ebbbc3a29f74a771cfde53c30306f9af36940bc4ecf83f275b35b350754c8e244bf002a0dd26be164da67ea2974f5868ed98c9abf2753cf08f6eb049c99a962467f78eb3771f6cb9e39eb623b8f1fa081f90514f4d4845bf2737caaf17e95387419b50e415810105f8797f83f8cdc3ecf98a1ff5cc58d6f920cf48ab4a44a1d70b9d467368d357d50ca00f4034d77413ba7b085f2704035e23e50c7037b094abcc8c79f40218f3439b3e7b666db72d362273c35493ab4d1763610b04c7db1d7f05bb28593cd6ed20f635973e5a1c03a0114b4b7ce1c70874267dbffbb5df65bfec6461ed61c912f18020281ffa45da4dcd4b0a40b5ee1151afd32fabcb07b75324700b6a95db1b5846e28aca20c263365616e5449d9a955c1f791dcf289475e72389b2fad036efb1b84a3ea741f108bc153b9e8ded2d6e0538df89010880f1dde46eb8dbf8a91d8ef2df749124b1e014d09b86f6cba3fe4030f8296a10c791b60c0384eba24bd32f2b7306c7d45f8e15d1a16135e314acb1d2d40ca9461a6997d8acef1dd01432b43c7e35b08d89d1cfe376447247d1c0c161235ca050ecab7a82afdf4fd5905e9c66c638ee1742ee7f9d6f8fe76eaf54ef982d8938e862a38bbcb1a5f401cb2b308fedae385f8e03fdb77baac75ea05089ad0c92e962e048fed5112632fa3843f62fb21d97c7d1d96f4fd31eeb0e21fc464c0b8db66711e7bacb04515c75682ce5670237c9aa0982a22e0c4b6ff2bc2d8abfbc05f4cb87b7ed4e180af9cbfae95ae335cc731e7c5b22462e336205570ae6f4de261e9fed512adc3cc9fc628f9317dab3e39a72dca254198a4d59b69bc02f6bdf6140cb1f66b85820ae2633e9403bd9bbcf88e1b3141f0ead8f94d5e3e30ea3cfa957eaa070c633087359b09e54b7ff38fa8a78beec4a71104a56ea954df2f5a2a3d239f1ed0806ee91021ac13505be688d34b398371a70b1c7bf0e72dafd83e79afa186cbb4761d6cf60e48d50bb1ee5d750fe26876cfc0058769eff9d1ce49ec1fdd188d37ec7c6e9ab73cbe5b5d41edeba262879bad5d35d436bd7c6d8327a3c10aedf5a6f696db70dd98b97c76a263c6062929227d97e07c7288d3ffa8827a9cfd82394cccdcceaab3509ab857ca91e2d6b1e13ea2a43d01140b6c2c4c4028e839c6a25a77a42b0d6edb66e8e98ad4c74202a4819601593587e66111a530a7e23568ce1f7f1f14ee54513b877080c9891ad9a330100879642c500ebea49e68e596e23b8462434f707b25ce4507e34f7099c1d027fe78d3b0e7df8e6abc12deb3926856f02ad239728556093d5173fdba1a0debd36e095e5f6948c93a7252440b40c07e46602727063dfe14642c3f9ee8aefedc3735d7514a650cc69628ad753d5cd0591b815d46a8d76f4eb8947f13de531b6ceba56143c406e64216f2e0a7ec17556a7df7f7f38cfd103010cca010e1af7e500ea45867ce8804b46f6508b7625ce5ad8454169d1e26a66977fb36723899b15a0869ee0e8ca6b8cbf09edbee52c675b96496aa6cbcf71ba2ff7851f2ccddb68320bf599c50b7352dbe603fa9cae354039e7284c3d2473f0091f46486fc619daf128062543d848c9694047620fb34db936206556ee180d135589415e036f6901ca48b7df669d00594d83e3fc77573d2e6a05e8d088f2f3b721206ffdeabb2afa24a72d0936dc366580718fbb792a5a7fafffb5f17009cb38e3b93d33bef02fbeffa60f63dd9b8cdd1237fce2fdbca06f399d073962b7afe0e053219671267bc948b0f8ec24284f49e48a9ed8c475d02e9145468115c7bf109e533ce92afd5139385fe787d05df41fbd9bc57b22ed41527e3ce41e18a389e50e1cd6faada57e0e3ac8be9f92525737300b9fcf49c50283a83af5e1be57a8dc439128d86efec28822f49da199c818f21ee91002d444d25a49428436c347616785b98a9225f2373a361bc7bf8d37ef3aadf3a9481c4fefad97dee9f95de8e3f0d8f18d072df178a7db6733a33e0e50dcfa0f74f94d93ef8f24ba00a8f13492509f5313800a6c3c52d81437c9b427a3ba7c99c873f9ec97a8bbe51aa85e3da167949b57e9cbb9ea4bca70244c5e7720c759a2953c960de54f788f15503e363f92a5ecb8f6fbb2d87bdd02774b0ccd605f2cdf407d1742da969e17291bf4dd654012766ee775ee47932952f0dabb33d0c1ea38ec5d1bed2e01885080b22df6e976db73a95bbdc9a78b34da9333b63951e8b2577a25dd1ae4e837328acdd7a254da6c79b0e2c93224f3544abc1b879946c97535197d1469638acfa4cc96e0bf596c54219d4e4f552bec75f2508c01b0e759995baa3b8638c9bbf2558ecc1a75edf4acfa607e66e7e735172195c96d2068ebad97cd7ecfc62194fb194fdadce884d6e9ff3f3fad219539c27427be62490618453ba1d943019fadc6a2dd6fe30a2a4b690a214fb8284b2c6c7747787f2d8e3766d35ec69a34c2f47edff6ea51365afcdf456577a97160baa14af4ce91fdd500af7a1875aa44c6201f1819cdf4dcd585146e342bfc88a60405255eacbc2612fd283fcc213d3db8eea8dda1dc3af89e5992ca213ad5679bdf3293e8720ad17172a990fbb00da0cd8e8354897b7e76600244b4353bceb72b53be034b5770af4851581b4ed54b2b9449049dd617c28542829c7880d13f73a830e69be36ba204a67d6ee3e961f613a8d4db75310e484f80f1489e6098867e7aa66db7294ac5cdd45224cda570b94450b698f7cf9feabac4132580963532da6eac13ee684b2a01c1c30491f42d821a5834ac99800bd60c5f3d9f05bff71fc026a0fa3f8f4830420f84de5279c82b4c9883e55e2e2107037607095c5f113450d7cbcebdef4e805a0ef054020aa4b711b3bc6d908812ffc3be1111559b903c78953325fe005ae10943ca67d5777baac30f755d7ab548b7516dccb5e031d91687a8af698419239c4e0267f6bdc9222e253cf31c2ec077eeee7162d069be608db3f17f1e5b7af7bc83e0e70f9f0c55a45bd600fd2c3be017bbd6feffd4ee638d08ad502403bcf3c9d5091a52ad0eef7e4f6d0c69ff342179ed752da7ebb44898402c3327b7a77e9be24e48692a6959592d001558279490a238f0048036a5f990490ae2e4e75b5ed1fdb7dbecd36f22f175be59028f67be0e58cb3851ffeb7335d035994258c3a4bdc30d397b06b192d7301de70ba8c40ea16a327197058c97bf47c38d5ab401fdbe61994606260618122c8d4dd82d3de14bc70f78ea1af99278248d319fab06df6928dc3819e1e7a6aeef5d7a8332f0c2e763fb8ce36b01abdf254b4c2bfe5347d05eaa89674235584ac661f50aa4b61ce1c65d59f1be57b9d3f60b032688e57f8d0340afdf62284f5f12393a2a52c828782bde745b7901c1070821234c580542a73730af4a8a16730aed70e11af1da61dd7c399c7c435eafc638bd5a7060c5e2dc965e31e369b97d943e5693a6aae77b33570804e8434cddee42fd44d168be5bbc81251dc75e835a94302f1822c0f0be6326619af46acff28c96d84034965c6d966a2c1b7a03b1e3d43410c56138187d2314a52e3180285cc1cc43a6448045df02058e9b97ad8bb677f0050b7b46c4404a31814aa95385512d7df3b41fa816a41c18270de93e76670c65f75fe5f55bb6ffe215401daeb0ba74ffd0390318577d1319b4e35eb77a1273b5e0cc1b1fff4a7c12b5ffab11a130a3f00254e4b954a55efdf216e5946a48309e0eaf916acf63c18d81c41f3fd05f432936db33b9dbe6f2e29bbbd59d9fedd8c060d893a696d4a108b385842e7b05b9778320743d8cd00db6abfe63741f775f30bfd364f6b0edead4adaf7ff278865248ecffcc32d5055f2fd37bd036991fd6eeb7b4ae26f1e4d0b459646615af39c74aaa36c38fd4cda51f4d5fdb1c23139a732b77356dd35f3586a2054dfdfda276c3bd782b999772a04882775c923a2bfbed0a946b207c3742d8a4","title":"822. Kth-Pair-Distance","link":"https://binarysearch.com/problems/Kth-Pair-Distance","question_id":52,"issue_number":44},"42":{"day":42,"pres":[],"tags":["二分"],"whys":null,"difficulty":"- 困难","description":"在一个 N x N 的坐标方格  grid 中,每一个方格的值 grid[i][j] 表示在位置 (i,j) 的平台高度。\n\n现在开始下雨了。当时间为  t  时,此时雨水导致水池中任意位置的水位为  t 。你可以从一个平台游向四周相邻的任意一个平台,但是前提是此时水位必须同时淹没这两个平台。假定你可以瞬间移动无限距离,也就是默认在方格内部游动是不耗时的。当然,在你游泳的时候你必须待在坐标方格里面。\n\n你从坐标方格的左上平台 (0,0) 出发。最少耗时多久你才能到达坐标方格的右下平台  (N-1, N-1)?\n\n示例 1:\n\n输入: [[0,2],[1,3]]\n输出: 3\n解释:\n时间为 0 时,你位于坐标方格的位置为 (0, 0)。\n此时你不能游向任意方向,因为四个相邻方向平台的高度都大于当前时间为 0 时的水位。\n\n等时间到达 3 时,你才可以游向平台 (1, 1). 因为此时的水位是 3,坐标方格中的平台没有比水位 3 更高的,所以你可以游向坐标方格中的任意位置\n示例 2:\n\n输入: [[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]]\n输出: 16\n解释:\n0 1 2 3 4\n24 23 22 21 5\n12 13 14 15 16\n11 17 18 19 20\n10 9 8 7 6\n\n最终的路线用加粗进行了标记。\n我们必须等到时间为 16,此时才能保证平台 (0, 0) 和 (4, 4) 是连通的\n\n提示:\n\n2 <= N <= 50.\ngrid[i][j] 位于区间 [0, ..., N*N - 1] 内。","content":"096221cf5b628be1e73e8bcfe626c7f3f93f24931c3385f35f5a3d7d4a585e065595832559eafc0a2b0ab97bed3764d463ff891446a5cb38d746f23aa4faee7bbf7166609ec0c2fc0d268fa687d35e703aab6d949ba3009b39aa6addf0aaa1c0502c821b68a692202e7c107ebed4dad714950769beaf36499e0e357b956eee711c3993e3fd0033681ef86bf530d3ad3aaf818be24a4c833fa8c0410dc0e794211f1d184733f2884847eef9330817477f4fd6c192273d7b3fbd599a6436892f7707bb17936e0f8f72afe740ad4ae4babf5ddd79f3d8ebcfb9632b86a9a79d7896b7ace00294fb6be0800f4bb299a1fadb4e7358aed7c92e26382e9403300230a8f6698690a15fef1890fed102cb435e5bfcd7b311ff2f974b9fe3c5079a855ab15d02f68f52ade4c42fc9667d4aea7223b78a733aceb64bb6c14b939c42e121b4620fa1d44d0836cc3568c85ccbc0608fe2fb3e560128d44cb92be2b5dab0d15b47a3e92dfd823b6bde90fb6a2b7de9ea242943b764dd4675263bc775eecfb46d21b1bfaa084997a74934a0706675a2a546f7fc51999d71b8945904c3505b5e59feac18da327767f35a0fbf189af8d95dc3a6c7d2a96dd3007d2d29c4530de6bbe66f9da2881602ec8a77beb6a0de8cfbb2542ded9f8383dcf54dc1977c032c81527b9ffe9217408489b4ec602e142aa79ab3ab0ebee6268dfb2c04d398af469bbd6d453f44ca2dc25cda759fcec5964403c5a7f79c6379b3051d8ab9b1bce4c0e097d329b0aa1fc34c5a019595bcae3d185c695e28c36e9edc6235264ac95d5e724f50e2bf9f96f33a32261e4ff22d795ff644d64e3b9422c3e44e7191c2420c5a933b90eef2a5b4d0ebb524a1d1765df694bdf6acbee0bc6c2c9c71146f757f124e1ebdcc04a0d6885b1552c051fcf2d86c222dca65a66da84ca1ce1680decc51c35229eb13623ebd8bf3e23b7b2f1cdd571eae30fedfa2a839b11b89c240d58b33c1581e5afa0d92ae1167ae568efea5444b670796533491c76c3cd3cd7b938c2aca5c17333b86f16f500349408e64ee868a28c9370c0e3c93c811b9d637d06e4a76959e528e20d915a6fe4ef9793eda888c83569a562ffa9e8d84761d9a1478a438767002e661c605847eae38fc3422a69d941a5530cfd6e69a72562f6d48514a155854c1b99e1f5266a6dc853ce653143f302be1e068b54d6a8048e812a1d6eca5f4b081d5009810cf99948c1a92c0ecaa2a0c84916dec4fe676d04a52e111e1a7449a3b79dea50a84953cb4794ec5eb94e01f6337a7f5fcb3c9d6b0b4d0ae09cdbe7413bb7bef552ceeda0dcf044f9d8522540a5144939d2e8f1005a44dd51c3fa12bcff815476fb38dfcc4b3db8dbee80312e1fcd4bcd472ae483ee43face0f5a667a6baf78eb56735b9b27dbca8139883b133290bbba8250bc9523621384c5b1587bc0439eb4b6c8e134188a8727a1c5bec98bc3275ebc10c93934e108a73b9a933dda55770c3853165a7e2de32fba9b9fec6475ac70b066a2569c8ebf0753c654cdeb45ed94e581f2b4548f80a020b46aa1f6102d4076fd2ae8c0ca5eef1924b81c17e5b4365d5e507c24d30c70a0a72fc9af437f2c5fce3f4e0a1d6a5275b6a2b16a9c0ff9c0eb8c8e74d2642d218af09f0f0a8f86971f9041ad1132a043e73442895b02abec1c718795538fd995ba4ed491c240773a3bcf82499c12228f88061d80351145dcbd20a94153eb105ccdc74951e790200dc6ead5febfff2704422adfdd9dbdea7c7b4363eab759521a8ec9802e63b2fb9324562dc01efdfea3b29bddfc4de4c940efbf4f34e28bd61130c2b1ca79a9df059470e204d2b037433a9120fbe8d389996a995374974652c6b72149aadb46d1405fdfe9900e06ffb7b1351fbfee6395deca06dacd5fe64cd04b766cd3db40779f5a787bb908a4c5cc64abeb99354b7ea9a499acf52689e149546ce4ac73ff261f189c5176bae3f79f0bde7a7810dfe55b912863c8f9f1f76b886f7d6e0384890f116ed71e75a9d5e6a1ef1aca33805d836d4a2c91adbb0d547d8bd420d0ae4eb05cbcf6de9d4639a00205bbe48f41492e90e9803c656bc97a52db2ac1f445e31085281c48f2d563b7e77fcd3a3f51d4fd9bb12c236615e2995f5d7bc3ef3b9597c0e8d65948d620f6fed80b958ca7b9600e5afaf46ac9d3ac17978a085b7f67099681203fd426b52cf8310467590ff28a74f13ecf1e32b96c8a0a1bcf2f69aa932ab14100cf941f906bb3c937279270d277213e0eae52417d5b2bf5adfdcd46509c34506ab0b3a3550b82bc52c2c835f5ee6f2d15aa2c25b5a46fe87c5a7f4d3393df5361396d61c22e49f73a802e0a2a9f9809068e10235b7253d15f6885eaf77a2e2d35dd458b035f1218bcf649fefd8737c18b912ba2be8a298b217836f5299aff87bd407c29492c653f3c5295b8cea0f476d7bcdc63ddc873e47327ffc1dbe9d9f66659a1228cc19ef4366c4e4dba3663150c8b914ff000d5efa991aa8f1527664b46f99688fdeebbf75068618dc104ed6bc7e00b824e02433d39a8036c1826fceaa845c87489ee2de510061b76819362b4e3730e5cb849655148e2afaff219b4209fa114ea47b7e83268eda0b92f39aa571b0c5bed76c6cc0a4b20bb6b3fd7d8df43f4ca941f046219bf10163249a6c4cb53ff86222633747007175e124775031eae773b9dd8daea59e6ce784a2fcc0e54069b9f3dce08f40fb4d5c49de092ab1bc8df53c411872cde9251404e7f7a163fd94146237dbda635543f0294dd16d524b736d4b0ce8d7fca230ec2e7797c9bd7c5f3a1e656444c95fcabc063ae6c2b6a95790361984abeac0ddcbc54d07389dc6016260bfb7bb11942688eb976eb49e97582b604802f0494fa949d0014fe75dbada66b3ea99f0cf0e1f7f294089129b4f5fd9502f86e2dd8c21c35a09cc598caea408f32bc9ed664b6e67e0d399067cf4b88c3297496e6a7e6760d4aa8090d1a8514125384caab80e8e40eaa0295c341fb7a653161c4e3d3934170d17e456ba7992428e667e80b5b738657a69543106ec265fa4d588ee7e499914e58b65b96acf1fea2124ad770ace4bd1914660159b32072d5df69cb057eb7cd95373ba648919c85723e64319eb6e594f026c4d70711d59bb09339b175b05775e9554a737554ed0420a479de42394ab9bde1ab2ab0dd88a583d6f4db569ad2e35da128f4e2a6432e22354fe413a32e2cb4d7b935d8919228ff4f095e4c352a5fcb9d2fa71ce1b7d95d696c7c137d20e7676082b3ff3ea3d2cce531d3de2b431b7133437f6617d25718c9bb5639c32f22341fcdd688c0d2b1852ea174d761734e9a38417a7b244445a175f1147954ae19004d899664a168c492ade00f2b1cd01462d4861141e08f1dfa00721a2d3db9b1a941219ed117035d00145e2c7f22bf0ec3c21cf956cff0850f64d6027091b0a15cf2c428726f01046f68a58f25ed0d0b9a03b5cf7ed9c3e9e825b19a5684622222ecdb569e37ac99d2f4dadeecbedb5afaa5883a69dcca4cbffa0f69e4a0fa299170bd12b370bb0ce29eca3c7c9ca6c63a0f04d168c42226ec7ad8af37434c74a1788cea2aab2524503969854fa5f0447908a866ab6f6967d1aceced589f89cefabaad780638ab8afdad39aaa98c4a5c415ed8c6fa65645639c19551671e3dc70cf3e53a55f6c227d08ec272e22b2d59dec373f0e91d748ec23aeb4020015ea4f037bee5e802ce2f25994d90126ace7ed66abc002b594d71c0882a6ad6ae4cfa32ea03df2ee6cb0a7b7cc0b84424e632b696f2f0276fb1b910beb3419ff1cf87ea91da9dace7c6cb5c3ef2314c080417a2970b301920056a4257633ede544a7f992caa2f4a39cae6bb005065cac300fe2c50e5496a7c9f4c6dccae344da651a0ccc1529b5d99af5fca6ebbac3755a576e974a6b482d0381ba721cb4d4d69c0ba567a1690b8547a462548c2c27f4cb3537e5848ee30aea6cc4de42918c650f49645df5c3881fd9463c5d759aee2fc24ee16d7fa839b982e2dd3060eb505da8310e84a01fb40e53f9fe43d51d4b7b73a277684676b65536c0ce9d9e38eb0de63fd5107620ffb8abcb3213ddb323bd74bb97c0b6eaa5abfa6050156b120b6249589cf83dd2ac5b15fb1ca19eb41873eb3762a9c624d22145ec6882872f11386246390fa9eba1c408ebd273852a926dc232bb2d9c555ccda5dc1d2e6c106e605c7ac4edaa99b1259dbfc301c5c4cb83df9c207b345b42c72dcd1027eb0df8851feb8260412a72b43589aea4b7f7b2dcc86ba7d04170260b20a75c0181ba7bced5ef761b0fb167e4058146a955c76f31bab14dc5e3644e1ab9a27dd7f87216dee4b0917401892c2e2a555f3d063f2a88e2c45a8c5292671a378113fb9a77473b9ed92cb8aca6678880aaff80acfbeef29176b0aca5c5c4b30700824cc5ac012b9562c6306bb9a2fb80400550defb58401fb986adcf1f692faef2a4b709eb421166f62dd3b92688674496edfcae1ab0246a09af305fdb665c192e3d5acd74fa0fea4dd03df7008b1f6f366ebca8802c6659d4462719cc6892ebd52f2f3b07c07fc34ba2e1e3ce0502dfdf314746b18dfb1b81e7b6b332fe0d5441d7bcf1ece01372cbaa86110e7fc5856a37c0da09497c03e20057c53f4001e3ae2328c695d3cf52fa1223f50af4300c0f37499dd5bdfc503b8f0036c0f53b664e821afc4d8b898bb04a3067edd11a4f3c819e1497076b7a70b44f4ef916932cd92682114ecf53d28b0d0f9f257694e34e81fcc4dd18ea797a90dd223d3788daebec1dd0c7453d13365efe2307d822ff09a66baace73c9e4c2cf822b96012a136886f1f60f28e7d3c8694e960c84276e776b5e0adbdf546358ecce3e112f477ce5db4ed8e2a420f892d1ecacd779fd37bb1cecd87ace599d80f8b391adfcb249f499f2f8660b3e62b50e1085e9106fc8a4a54e7d99c3509a97153f75ab9f9a6f5e798a137999d0082ad87b172d1c1761092253379ad766d98e2613dd4049c39dc59c92ab4b8fa6660379628b330e0af260eba0d3e66cc412e25158924dd6b525b2b0f45bd3d4e342335830d63d18694e57214615e2310af0759a076f0c0bf5ab84975a5f663e37af76621296844ab996309aa1340be464374a0c6e1c69516447e5e1fa11b458c4205ad83c9d803fccdacadcec8c5b14fce6acc611547f90aea1b0366398ca2a0aac0d4b1fc5d704f364e65a3383d4ea13f20a6b2dd10782842faf5ad392396fa6bec0ebb0d2f514660ae241ce829ad45e7314eebd086d9076eaacc6a0d58f88b59bdd2245286e1c971f9bb146d76f59dd834d0944ba17c1c5b8b78d0ec3dfc86d3d07db4ce52935a40652abfbfb39c6abbc2bb2202f8cae810a8cd51c5993821ce9856c4e43f5eb81776961417c2ba6fa091a811e08ef0836ddbeba29ed24c555ee501583fdd21030bcc308e5f3e06ca4591d5c33f81cee8a90ae44a6434e35f36c1211e62538622fa3f060dc655b19f9e1b7cfdbe7bd2a1b746b1ce8538eb02c297756f721484215da886c95318186461630daf509abcda616b135c40e633c43380892c530c4b486abe7441f4c22a3b55f68a228109a8338a3f8b8683bc04b37c8b6f880db35d9986db3923817b5d5418457be7c9f51d3c0dc6b124b365d7542d123e3a84120e6181008bc5526373dc61eb6979fcab1fc7fc9b413c875e19a5c6a6af5d8abc7071858345cc054fa8ac8441b0f48641155b9cb0a39d4ca04e5c8e7542029dd590a6eeabc6dd6f69c1c1b1eb63f82159d5cb9f21336dbfae08e404287c68abc811c17e59ff6df728a735a56a3ef5f849ef3de17fc173c49ff864055732a1f95f0809d35bb0a9da827ef6575143890b592da76571b6d153b304d86f23acb117891075a9521373ab648086c54b71214d7feeb852e140a4f0e3859065d409e8b7db1ebf7325b0882ba69d557154e2fd2d4feda891d804a96bdc254da255431d556384534b344cb01ed520e8304289c47c7da0f3d7b1ad884648970c22027fe3f7fa92c9c0ac4913a94725d1625393c7b7d66f559ef7ee90e873d2c3431c67d349f0848c444dec08e392b15f3dbc7a1cfe257fb23e58de344c873ca69a13f65603cadecf3889f74a771cfde53c30306f9ea7ac74edec6f83f271235b84d755da4244bf002a0dd6abe0b4deb37e69744583889cbc9a0ef7576f0826ef963c9c9d36129f793b3245a38b1b8f1e276eabffa4951c3290a191d17f1277be0c95ba941ad76f830981583354cac1e55a4b8ecf8bfd4f035b6801985aa20bc4ce7140de889459e1d037dd45a9907a2462f70d7790df87b09562702045e6ee8682437fdddefc08c30ed1e51e70a9b3b352e70ee732c5b369748c3ea04457f284550cb961d7551b836577080af73ed68d275591c47cf521f042efd914d377232ede7b5d731e2bd372ffe4cce19acff3c505abb119f1fc506434dfaee0714af8635c6994ef35d7739512f9dd21b5546f38a962ec22636075fb144ccc6842f1f671d887add319c33f4bca9dc20f9fcab6033a750f154e015629e91ed3d67056a9a915447cebcd2e122e09ef2a91d8ef2df749124b1fb1784c693ea82abaf580dc35a3d73a9e1fb2608c9aeea24ad3a397d45d1c5399f1f85c76165ac47fff8909800e7105772c38ae3f313cc0968bc6f793ab8d68cd18bad3344304dd1d08f283e17ee28fec50192d2d15fd38448c06f8f7bba0625ee30d8758ff873a153f4972d9a1bf348a38bbcb1e9bb06ca2b7b96f1b3250bd647e3ef34f0860aeb4484ef580e1be421eb3154d9c9a8229dcd28c4f3269ffcddd9a9fa76d95f863bfa5b429a454aacfa212f01e2cdca8df7a876fbd9bbf8800982a267421f6fbbfe7fc5e3b057fb989aaafd117459f186b3fa1eaa2189781624573e1f4c3368100409b2ad9a4417f2bf186ed567bfa062cbd544d2feaa893695b61114821655aac2a22f3b903247ca1771cf121afc6277ae152ad6c0c2b3b2a744560ea88f86d2e8a124a8cfb85beaf6399539136353e89e18f8b636f38724abec0337525931a3d141f2adaea38b70f7e60220eec74b49d54b40fa648d21a4852641259b84f05b3c8efd9dfac8f45713b4124bcdc467fff41ff748a0822c9165d323ae555f6ccab2cc55e7a2c2d99cdcdf629b90e7e127df9da9825b9dad263436a79bce0d096db981977b70605da6fb09263328bf04c2a1de893e26232f2dc68a7eb6394e8920c36ab7db67eb9b9d3fd0d983f0c98c436dd9c167831e2d201e18f72a528d5e12b6ca8d8a5981ca9c6728fe2f06bc8eb4f229d1cfe9532a203e4954314bd73b756d181a416e2a231ac9a7a3f1ec4ef54913ac711d44c4d8fece7d1e4dc9ed3cde0da1fb28e6c40b69328e5c222ad955c219ec596563f54bdb510225abd57d173cbceeab846ae43f66eb144bd058867f5c7bb9d5173fdba1e990e96b8dc0a0a5c78c8ea7693243b4105ca52702277e65dfed4b0bc1e8b6c0e6bb8520063a51ed44e62e37cf8400cfcd488fb476982f8d7eb8eb955ab829ec39bdabe9055d7e0c2b6c6f3a635972887c57e2c165373899d8462b07ca095c1afae54ce345897ca8d2260ea2509676629b1f8b165a4398a46a6ed339e06f2b8c8c5c8a9692e0f8c66bdaf65aa4eaa0242e1d851b3ee2859334b256f78e1f3dd6f168320bf5c4ef0b7352dbe646b3c9b1320475af6e093d242eda495f066245ac588cb028386a42d101a6435b2d2245f21bf81c692806a14a59131fc817530d273d05cf02bdcf4ca6583f0cd0b0fc0418717b3e4ca79ed583d9b721206fadbff966b367a7320e3195316f882989ff75255c0cdbe4d1a43d5ac738aaf7696edff92fe5d5a60f63ddc9c9894704e0b0f0fed9616ad2553040a4e187f31a7a965b2c710ccc1d3e51cfa381cf60606b73338bda39bb7f50abd37029d929c7f96dce75b89bbc8732250dbff06db5bbdc7936fb0603fcf34697f87b0a29cb11aa876930e44028d7a4a082ebd490ddb13b09f565c7072fa81d343d8e04d46cd3bf2dbdb085c676b0dc2470019f0a8c2ccfaf11d47d99e9e0ae3bc380e8fd05404a57e01da2eadd9a5d2442a3147c91968e0f188b73401028127c9d6ce391d8270eb72db62aee9f67f4199ac8f04776cdf3349e737961d2ef64e4a64b13ab53d7d670724eb4af2483a04531fc4f129a5205e860350a7c7551c946c49164cf3290358fb8b92df16eb692d5daa9dc6cad6950af3a8a0facda5afd95b1b1eb071928205b3e3450b352b7bfc4b957dcb1af10a457","title":"778. 水位上升的泳池中游泳","link":"https://leetcode-cn.com/problems/swim-in-rising-water","question_id":794,"issue_number":45},"43":{"day":43,"pres":[],"tags":["滑动窗口"],"whys":null,"difficulty":"- 中等","description":"```\n给你字符串 s 和整数 k 。\n\n请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。\n\n英文中的 元音字母 为(a, e, i, o, u)。\n\n\n\n示例 1:\n\n输入:s = \"abciiidef\", k = 3\n输出:3\n解释:子字符串 \"iii\" 包含 3 个元音字母。\n示例 2:\n\n输入:s = \"aeiou\", k = 2\n输出:2\n解释:任意长度为 2 的子字符串都包含 2 个元音字母。\n示例 3:\n\n输入:s = \"leetcode\", k = 3\n输出:2\n解释:\"lee\"、\"eet\" 和 \"ode\" 都包含 2 个元音字母。\n示例 4:\n\n输入:s = \"rhythms\", k = 4\n输出:0\n解释:字符串 s 中不含任何元音字母。\n示例 5:\n\n输入:s = \"tryhard\", k = 4\n输出:1\n\n\n提示:\n\n1 <= s.length <= 10^5\ns 由小写英文字母组成\n1 <= k <= s.length\n\n```","content":"096221cf5b628be1e73e8bcfe626c734748326920a3d40bb75074c7f2211766808aae07a6e8b9f3a7173bb3c930b2fae5ba2cb0013dfc75646e2b344dae2e935e02d302ad4d8c4f61d20cda18cd05e7179e7728bdbb11e9136b520c3f4eca18c412bc21c6cf8953b2433026de7decef068d9532c3759bec970aab3c660fc18b36241cba3bac4c6b0d625a465cd12a03eab9d88799ecaa9f50b624118edeb95321d0315481af761c2f4caebfb936e1d6c01a9c4e17a323c60bb13e86c51fa2a0054956af4546ac470f49c712b837c1d72b70ccf775424978f074e82cb352371b294a2cc2795ff6fe2a2334ab785a1fbf1414d49acf2ef280220cb22acf58d42edd70ccc820775f30c457c600ee3735a71e9da832b128239811d92ba1ce8d74b14beac6b8e5488e6ea292cd0d28050256495cb0d119edc6ac09a4206729a0ca61012519c971328516ba8ac47dac9d855483c65d1cea0eea542d35bda13bb9a11f8e540797bb78f75de40584011556097973685ad2cf5dddcf75a64f1329dffde3f38e50d1acdbe1fa46b30a14559b1542fdb7a2294d39012f1af2d5ad13305650597a34c794d328c04d6fb341bb8d1d07dcfa5ccfaa850d00d5a342aff7d0de98ae760a9a48828288110956b0b5f04332942935fc81781a2e5f94eda966c192d93717b532f0492d52c0f0248e0bb87a6040a352cb62eb33ce7982e8cd3752bfc99857f443d4f0fbba604f8f47cbdd3e11b0083c8c9e3adca68b289024c66313513a430157f5e2a5405e6ccdd23f1e4907c7971300b295882c6cf24731d28a15522275626b6b2ecc9f2786d254aeb5fa0adbb33d99d2524f554d87099ecf89e5053ffd2727b9fb7eba3b4a08567c4dcd35ee98bbdf3a97a6ad3340e3c9e45620315270d49b9b3e7110e33e291a601d912681dcef2ea6dc170dcfb14b6a47582b194735bbd78ff550409d8d8c39c62467262f63d7eb66994f5e2d42eed961f0430f9e966d82c467a8855bbe15464f92f81a5d77e28352edbc1a7599c4d728eec1cc2b97c9642655a24e8926d378829019a1ab4b00afea92472bf939ce82eb5c426d8756be03f0b943bec55e942759600fbba4d475b2f8f03fac0a291f8f95e4ece300a38967b4b09e970f50c985869d21cb883edfbad80d5df13125ed0046282a7a7a2c9a0ce5ad880981355668be4428a705810193032caed4aa64e7faf48f42ca5ccea4984a2deb127f78d5b939793f93993b7874a6cbdd634ebac20eb778eb6308e3573c06e95bc636cc9393702b4754df6eaa8d415423d715f93f2fc86d19e83f509acf65452f3658108277d4ca29b9cca49d2133daad380cda170d70a71c24ebe6510c463e88f524a1bd59840c6b3fb8db9e6c79aaea6c73b3619ad3e53d172fde28a48d77d3a521c51a7bb787cfe0400d67c1068ab96e4eaa55361fec81b3d8a337c2ea17ac5843dc639dd30d18845e7e0c4d847cba3641a8f4ec66856f7889062d2ac36fbe42abb0c05f8e6755a5243adb1ed9feafa9f599608620b67f4e52cf74af8cb171fd71d9dc2032645dd41d088d9ad3acacbec09eaeb622a4ab215edd8984aaad67f645a6ae0e7e975edf72142555ba33074e074722945b43d0bb437fe8fff868f621a360cde40424a93af97459c45f427722427d5cb27a7951befde8ef69cced7507bf0684b3eacf08ce16e6791621b9a93dcd5ff5d4a6eb25948c4fc7a379258c6ad9e904356ed09d27cad7093d839cf270b6e0299db32bc516bf35b76e72551d7edc04a5713f3aef911b544fcc310020a573dd86b4b308d3cb298fa6f7c9f855c578aee35a9a3dc2b6e982659294241a8dcf8d81a1a277d2213753b1dff7823e916934e33024dbcffb1063a2e0624c9cb9b2d4a1fa3a68460bc59a0232235bffeae82c0e48755a1efec64d506b769c438943997472740c491ec1c709020a3c8c75adc908f26d1e1203c925ac777629d5f638d6f9ecbdc4f14af5d23f4ca8a9cc950db0aec14e256a6e284ba381eaaa6fa89de7a08842e9e2129b132221d8cf3a95270e05e8991be7aeff88d4590e457a20ad4f905cdeea848668c28647669f32bcc8b571fcd4fb2779c180272bf3914a3918bbe89862d4d5b96c4efd7f42c1e294b81e51016890d87d778358030441284444c80eba35ae33a5ad2b2ba6f006de129b24a8b330a168c08382d866fcc6830baf245994238dd65c1b9e08ac13c001a9978c71beac75c682482321a36136d76634c0c8370ab91d874e3159804fa37f1b6aab5eec185265342ca9d487b0fe01a636aa1807a8d8a22e78285961d821499a446d3f208acf7fa2e593427589fc2e2ecabdb6262ec7b46ad9164359af65fd67fe70eafc594562efc5e7e8d5d522b708a6eb477a2edd142d0bb1bee76ec684b9a4e033fb0f7e3649522f8a6e78e30ca77df904a2c03be1add3b0e7815d06c2bedd46461c2d4e3dd5d9d1fe68b3e573b367faf1ace976f749a487480935790f25b091c4f99b8ad38db3630afa199350a2a82db407678a96ff73ad697bef82b08bc44a4730aadf50332bc0de0b2eb2d5e07981435df071d105c8f1dc6feb3174f3ff645471d795d3772dd9f412df0996bdfd0bd63cb0abf16e89527fdb067f86c55adb8d997a50ad4e289ee6c23d5f7eb43edf8b632c3e57010f00ef74d6493f95c262cc23f11a52daf703d773a46012d31fb673b4459a6a831b6cd91e6dbf13ee8d0eaf3c1fc092fb7ee8784a033e800085bf44d2ad6784457b5acf04891e9794954b9ede56cb1dd513162d0df2b130ea4423d9d7e4b5c6a755e148e95a1a73bee7a678dcff86e1d255f743e4bdb58ccb01a72f79ab5eb57de7c4b96afa2af9c9986050975d9cf620637bcf432e467ba1f79bd546b2e119d83c68ebd758fe671c33e8947cd63ee1eb43e3023441096f5bbadca1fdf4189943ddbf2666d610dfc7b9fc65dfc630602cf7e9f0f6cce88cec5252657ceeb1e39409c1397bbf7bd96e93c2c175d1e698ea5a2c29c3a2bc842d7434fb7fcfda3176ed5b7dadf9ffc938dcb8c26d179a400f404b9cf3c720d9ca3c6c991b5d36cd5c37f7d536996a152c90b16cd77ec3cb12fe4c93e87e20fcf4255dec0d069aee88dc1332e4ed402a84f86e52f9b7ec44abace2da89d59ea59612c6f6f4f702d6fb20e1e971c6e0573789661b8356f4ddb421c449ae420a1b75e3ae712044686b712686331d547ce7036874d851e7651719d332b95695459cdb10149ee28aa707c939cada7466ae528541041358662d6c001193f5304f44bcc115b60760f939206448c6b7243daca48bb60521dac074cba9ef887d2399b59910d1abdff00dd2d575f6a9f667c08731d88cc996cfd89c6a8ef985e216e9666e39d32cb99616714844122cb36fea9d30a422c44651dd8b040de931be4463f440ffd03e9f1226b7c5e8e001683fcb8bf3dad2d294d4a9d7cbbf4f87467250031ceca0f651689ec219d46f68a5beb5ddcebada01677f2c293d02ccd262cf32a5e4a7211b0eb63b331cff54b59c791c18dd18ac206adcde0eacd94c3c4aba622519dc15f25b64e055ffbdf6f919d8697f1013aabaf0c2ff93a20d29f6fe8d9d934c168148feba884b25d5119948054f0530345b68d439722f9ba5a19c8e1d7aed491e8bdabf5b160bc89acecee9099be2a334117f2be65b4444b54941b431972d5ff73d63a5cb5666d24700af923212487d59cf432210891f348e026b9b6170e1fdf4e024fff5fa90ce1e84697df3a2e84c3e34088c0009097d40509928663f882b79b61f03181b16ff6ca9541c4d2650b3d0cf6eca84609f94ec91a8e9484fe2de17f9d11a1c6c3a0c9304428f8813322c1a7cfb66bc504fbd138b7e9dc7057833d3a17016b11686ecd27f5084a9b3a9aca1f5ce1c3106042364a04533be348ed82a708dfaa705b2232620a24266bb0bb91a77a8bfe91a0815457541ca4d5d644a93a8809e9c23cc360f8f21b89993d39efb64d30467ca12cd9541bbe55d231daffcc9b4e574ea94980fdd8a7060a4c864ee76da908dc3979344ad1f360f1f82ddbce66156ced0a12a5ec259904070361d12c5e0505a2386eff90dc8e7cb72ca658ef7dc4ad3b2834c42d1ed8841abe518f95fcb0ea8d84f8527d14693906496b5796fb3dc4be5701d61fbca8be3d57258335f0d049ae0f279f68d5cc12516c45edf381d6b188ad4ce6b9249946c840a99a73e9c149f8c9bfc7d86c4d643b7b1b21e29dcba0f75db4fa863e90aff3dd94a94ed0b683f99642d6495cd97685b5548da63f203b22ee2aed2b3eb4e78cdfd343a6e34a7f251222b7690181babea3c1ab26135aff4994638621d55199383bcfcd5aa0a9502377bb0eec3b06e18ababba4fe1318d44c1d7c1c5b5151264dd7ca980ca13def5b546bbb6ca789193129e853bc7c15026789afaae4b5414c9baf922d3049252284e90767e561bb47d4bb468388347bdff3a4c189999a6870f3e6d341681f1f82a5ed25260813dd3bc096fd1aed0f3dee5c8bb7666b3b7fd55fc7e1e76fbcb805bac199e8aeef4eaa3bc83c814ee30e9f50cdf996adf9eca82d7706a04b654451f83e65498da0cbef0cd04191392d650481ed774f314f28bc9cf727c9a5bf61ae42e1fcf013277d247fa7e33559d645412a9060f69b056a8f8cd4ba7cd0b445c8ad0198ef3c3ed79d6d658038b1ab73ad5af2ca91ffd47e152a6fc2a143cf9c5c3281c24ee67c8f0b0043263eecc6ef4f2a9cbbdf0126f35b90c7bfdf3b8bd57cd12f871dbe2985a32d97403dc8f549a9ad2d6dba25d14e1af263b8eb544591f4b530a7e3ed0f84c55374012452ad771dc834a418a726eea52985f7dbd89b33834d7a4837caa9b3092efbbd8d660cda43c628237077584fc0d0496511f0c439182d1c38a0c447d7a4b327bcccf2c686d47afdf3209f2b58dbe4271c562b741a113a0e95497c2e37b3ff4e6dae111a877585c3a6d4dd372ca0974fafd8127116b29488303800c37939c9892269943a447e1c642e1732547ec89931b2d62e4798495c89cfd398d2cc22c1d127573c3083604b46b425ade7d3ea7bde0f935311c664ffa823b485bd5eada99e4b33552ed67404780028730815b07459da35964b457461a9fdd59b395d6323f048810960de924fb0de669dc4365ef06d3d094569527a036042c09e9f46f1149728298c6e878b3d8289dbdcf6875b1cbec5869d3b7e7f90aea1f93426d6997e52e2590d07c0df08af60ea0964c68b8e54a6426324d11b82cf26855a9ad43937a6a0c0f5b0c8a8017a43b653e4a59ac55e3c0fa0b10823d535eafe94b097a596b5d7981f083b20369b25d98d0c83270bd283511e10e30add8bedfaa766828c801e7853c752ed206eff2c52aba9be6d93f9f26a90256bd8aaac039794581d9b8559ee8c770f4ef7e3c16c272c21651299ab735598175ee70868ffb9ef2ee43fef55ee5015dea0c93a1abc914db1a9bd22ed7115444abd36ee8ad6e116a64b077ba76c5b58bd25202123eaa975dc335d19b8a6f988f9a0ef635f7d6b11e80bc4b0683f7c0abe304e483a8bbc2bc634d2990c445b88945da384af1fb81fc40e633c433808c0806491e69aeec01d41122289b55f68a2615ece837bf6aaf1333b9a5668d3c5f180927b9f847af6d46b73e1d508844abe6d84519ac0c06b41457a4a7e51d039a5a1276caa005529bc443d3774cd15bf97c4e09baf3a8cfa1d8931a5db12326ea6c4f6c06e5716601d891aa9829b4a584748782301ac825e71878f05a18889582071dd520a7fe6bc34dff6901b4947fe77fc1dd015fdfe136edbbea69f443bc29284ffce5243a4d6b88c7ad97d191ee2bd3ed096bade1cfc5c3c44ff97495c7a001f95f0809d35bb0a9da827ef7f29467cc9aeecb5250313205c7f3c4d8cbb69920c73fc5707dd60287bba05097d0ff65b138eacba92044d0a420e747a065d409e8b2ff4bfa2601508d0ad7f9a281a2a6fd3da87dae36e8029d9f9874ea7475d3dd01c276f7eef169956860a78cc536dd014c7c70f7b2e19d2942ddb3eca6474f93f66a92cc82fc48353db3c0e42257d75382966e859e87dbe5ab12b2c34078d783a9318468156dbdaa6702919f3d988a3c3e255ae219884f86e9a739b2cb876732565ade0d998845ea771899101c30b4abcfb36dd0bd9ece824275b35a44d3e46a46d40fb0ba0860cbe164da637e497471c60e09fc7e8ae267ea3f927846ac09ac46133fc85a85d1f6ce49bf1e276a6faae490586361f4d5545ed6263d1c91be947c80e9b48a450b47a41e9197fc5f4acf2fc99a00feecc11d6e5209c0de70417e69243854660268a14d504ea570c708c530dba34465361464a492fe2727e7ff1c7a39ff730de4358bf52de3f2b717bac552c0873c31dd5ab45532a225f0a8fd7073356dd622c79dfe674e171c73c58073ba0114b4b7cb3825c743b7dd2baa8d16bb1e26927ed5bca0da9ff353f0eb20ab51fc55b692ebcee5d09fbcd67cfcb55f2073f5a5671bf9b5b186cc8e9ba02c21d795f1abb6ebadac4365c294de502d739a670dab289da36e9a0eb2f70a71adb58e95777d7cef7076e0538df8c4f4180f1d5f818fc8caccf4e86a18b26d86af6b20288ce9df69fef9f0970e3294073b7e1b66f198ee1ea25bc3d2e773ac4c121d019d6ac337bac11b0afd5d41aa10d5f71c4d6f9ff5499052bbe3c3729fad285d6c9aa2e44311ed6d4941f2317a97ab78133ccfbdf4fd48a0dd5669f7aba5662bd628021cab117a107a6c2688178bd1ca3c5bcace9e841df622985b0e977759303edac7ba58e11b11fd4aa160346a428f66301969cb36c818b2793a02a8fddd4d9f2d076d95f866db3080b87460eaafa6f6259b0d2cbd6ecea22a289afe3fc46d5e72b11112cf4e97edea7e37ef7cb97b7b6283b11d3cbfabe12aa798973557b0f3e4d5d3368160005aabbd00b58e0a305228f1caa816b94b917dab3e3cd3a95ee5057d10744aad6ef7765982f5d9252768d4654b50133a715768ac0dbdfe1af091f4aa4dd9b8abdaa6aa38ee704f18a70c670477b3db98575eabf32d0ad72fd29c3dcc7ecde2f0fcb375d04656cc0f0ec3906e391c4ad0ad6b22aad09cb3071c08da4374b6ce138e1f5d3f39e7e9feaa85c8f071bf16969db6fda696a997eff5509a31cd6b150282c886f4f2168602a5faa15093e1877ffc7a4dd1af4","title":"1456. 定长子串中元音的最大数目","link":"https://leetcode-cn.com/problems/maximum-number-of-vowels-in-a-substring-of-given-length","question_id":1567,"issue_number":46},"44":{"day":44,"pres":[],"tags":["二分","滑动窗口"],"whys":null,"difficulty":"- 中等","description":"```\n爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下:\n\n爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1, W] 的范围中随机获得一个整数作为分数进行累计,其中 W 是整数。 每次抽取都是独立的,其结果具有相同的概率。\n\n当爱丽丝获得不少于 K 分时,她就停止抽取数字。 爱丽丝的分数不超过 N 的概率是多少?\n\n \n\n示例 1:\n\n输入:N = 10, K = 1, W = 10\n输出:1.00000\n说明:爱丽丝得到一张卡,然后停止。\n示例 2:\n\n输入:N = 6, K = 1, W = 10\n输出:0.60000\n说明:爱丽丝得到一张卡,然后停止。\n在 W = 10 的 6 种可能下,她的得分不超过 N = 6 分。\n示例 3:\n\n输入:N = 21, K = 17, W = 10\n输出:0.73278\n \n\n提示:\n\n0 <= K <= N <= 10000\n1 <= W <= 10000\n如果答案与正确答案的误差不超过 10^-5,则该答案将被视为正确答案通过。\n此问题的判断限制时间已经减少。\n```","content":"096221cf5b628be1e73e8bcfe626c7347d84248a04fb33a5cfdce8e0203e5fa5ba126cb6b71e6983b7c364be6cfbaa5dbf2242c49b6414deb063ea3cbfe8f124fd2d256b9ec38ca1586ec5a48498371574a73d037164857edd3ed52860577de73373814965a5db6569b7dc8e2f3b003ab421c1c6f8cd0924f93c410e8301994094db0c64384d0e3355f42a832e942af128487ee87c68447cbfa72b3eae9aba5e5c1177121ba3f94420617df993691e6c29abd9d1773c0b60a404eb4e55f02b119dd34b900d6fa00cc2e82f34f821172ffd21acf31771a7e667482e04add3f1591ba3ee2097e05aef9b1f479aa9a0e1d2414d49acf2ef243e2e299716310a29a4f27386a7a39a7195477d7f0fd47b5876d8dbb528ff17bf4a92fdc51c858b71975139e58f668ce2c7222cd0d280502a668acb3b017259c808c148809d72eacc37d50cbee24b021c2195dc0ef38e6aed4b6c65ddc692ed8a503fc4471334025f9fcac379993b1bbd8876253c141e2b8fff729cf99e4d9dcfb7b43bd46aecf88661269c502f6f3187cd150cc42c74ff0921993f35c59b984fb9b34705d96f5a416cfeb41c1c78582063b3f7adcdc5d78f03cfdd48b5ea51b66c5c6055d60c53fee1897af6fb844cad0410a16a086f013329649b79d63d6ec0eea135d1ce253656d847fe97a79e98e1228b92e860302c2094a6bfb920bec0288bde17e943fbc448e9c44d266674be6ef33642b556b0e5f4181290c1ffc43b65c3743ed3cba8cfbffa427595d7cfefb0b33d7b58c6a5d6e63c472f64399330b90248d0c7ba45d46d504e7853c8ab9f96f33713121e57c7214a65f447ef4d199020cbfa4c59a8c06f069eec070094e8a3bcd4e99d34ace14251ecbdbef98db2f69d6728ba71286a74480f88f125cf0c9ed586741656d855e7c811083645b64de3309917c0ce64d1dd950ff11877d35a0a25d9d0e58269414561f70470984597d1d8d513e050b1ad30f8d566e530444d9b54b1c55752cc25829a38f8486d2d9769249dc0483cd3f477a5912acd7816040680c17c513840856bdeefb3ac2bd12e07091591f304b5f132d2486d75b29452933dd503a0f06cd47b35f684b08d92c4417bae97d6f86169c61614ef14150a3fb013c76ecc74ce56c65a81405bcb38345cc1b299bb11083a2a2d6236675e22b481e295da41bb45685ff4064c0d5e9778eb698fa1d8d010c844c3e987fff9484468b94d9d435c6029ce134a2534f8c92519b941d5e868c44943e218fd819c3387a07337d90eff990a7b6bebe093f41d7616a5edc6b1e7f2b3aafbac1bf9bf7b35ba7fc55518fcd03ef3c3e31b8f0e56dff9f890b736891f164d2af340479f455f5b127b625f10a29f84a4eca2825b350f3a60110add33e69669f72372306cd77d3a415829366d8aeb1d9cc34a8d007bbd92de322bca6cd6c612199eedcabe4c14fbf062df678a11ae3cd833484801df3868b4df04a413efca475234e507628d141696ba3516fed678b53146ed1a0b59415d4bc421095702a079412dd857177598cb6980125ab4f4d9228a19545050ca477f718c020d8c98e479838db9aa2a3736b8c6dfb46f846bf92357f8ae096efc5e628cfed623768d6a2934fd191a09194ff1e711588b151255dce0b14ac01fa923673349cdc33fa3933e6b057867781b5c89cea22a136fb1aad598d8a2e947897d6a551a2cdc91879720148da4223aae1194f4d1a94d07b409c1aa26d14658a008b1a1abda1ac526964d7b26f8ce08787bbdaaf6dcba9d4468be19cc14c58ab7ab0b7d2cd7794632941ebca0e6636eac84534388ca14a5adca2a7387e1c4b5f8d41ddac5c719292f70071e753c1efc5608eb1d964018224cb9e1b0380d2d3b0fc7eab72e5f06adb88b6d8645a720293f9de443ffc3a7f576e7a1cc1a8a19d515fc7ff22d30a493f0c49cd91378952c99ebc442e391a820d0dc3b3d9a61cb4b6c7387b909df12017ed014a35d22c1f589b8c05ef4370eb84e937b9e2e7bb8becedbd72d4885f3ad659e75b854cbf08d3a7367abf729b0417a40f37b3512a60c39db3ed57569d4436b21be8b1df387faad74af3d41d09d38c95c831ffc94e269ef9f58760262574fd691d37e17602c76b9fce0c95e1c98e74880607b1f7c80fb0300cb3962e9a58538b7302e780a54f98cd08e2cc628bb7d643cfd713eaeb0674d89fb2f3bd953c0cf50a91b283a0947dcc2dd7bbf4ea45615f5fbf62083ca85ffedb7b0cae664fc1b4051b616dc5ae86fd6242b394d6f2a48abb2bd4955cbe1e2049b88c1325194015bec2f666150a3ed469dfe29c1b34683a855e65bfab7d6594c52ee93f46e6dce94fcfafe6a74c8db29b378a6b3cda6b8f62def677d875b55177f816ab2748dffd258df57be01f020a3c36ca6efc46c7215891097212d3e39b5278c6c6489a0ec70d416e05c4a4a9b6c0f9c1bb183534d3e10c572f04a29f8e987baa41cd7343ab7c13cc0945c1ad34b6ac1f41268dc337afd57a2836a1c25b88e824d47ecb3c329a97aec99c92d16c5cd1cf14ac1aa6b798271f89f4a7d6bd1e8dd22a0e84291d8b0e539f0342465cfcaf517c39de2edfbb8e4086485aa5ed74588176f8657de6096251ffd6d0dfa09db90020e1e2d01cc61330827d3249ff027c51f795b97031ad3dc43e975bcfc5c36faeab304bfcf03ed6ddef0f6d5022ee6960c4a1897d30a6e9907545771395d9f2e414872340accb76f666b0be33930a8be864194ef4effd3c3572e33a6013bdf403fb42a14c87242f9eef8221283bfcb59fdd305f38fc4c7b0da93395b5dee1ba9bd8e7c4b7ed1dad8f62d61c614a05b54c7f36452717d8dde1c57c0a6e1858084e805cded540891eca53a15ba1f8e2183c878e1e6c0a310839e8e79ed15239f2aaa3cdf478d18da6781e8b3c5cd2e307d20688a11824f4eeb95de2e38695ce767c8a35632f3a2c46fe55b97e6083d5e0083c2d8776789e791922717690f396427abbcdeccc4c70b61625657f3e62dfd18f6ccb78bfd6490c3101855173c615c116749cd38e942df39b72de56d6301ebde09553d71199d4045c0ba908f0754fb43f1d602a800a021836e25f60d2e9cd47955d1b7139426e8a704b58cda2fea3aa940e5398e56961de72cec601af75a5962376d7d767d026bbb2722971952c382f79774ac37566cda783345adfe28938b99e61ab39c1fd88960337553b85eac2d0fd310a277266a1def32493ab69330e7d043628a52a61225b5fafc9fc1c17488203a6675ad228d993a546f224de242d5de9499fdbb7e06e6ad48f9dacd3b72cb588494e13588910f09084b5ae02c8d389ba8334ac4559b9bd1fc59a9e58e90ce674ecc06f7f6623c27080a4f5fde1ae4cc9b220e868eac36f0ed5fde6b7d10c5cbfc8cf1ba5a488a5303855cef99839d53c85b56e49abce25cafa45b567f24bddaabb5240fba02c4c0af0a506f482b82943dc4ce1a6eaf1a1a8a98078976be979ec7b1eaf3f9afd02ee92631d221596a7d34ade57ea833eec3444ef393e780d2a8c6cf48305e0a1d539bfad3dc1b212815c8c55b8b9ece660d2fc9aac6f4f66767813593b48f6d20aa05034e10c8fd1fb81c8fe7a9afa15e771194b973f7403f45a29542a93af8907914e1cfd7aeff9cff99a6eabd609b9aa2e3d39aabb1cfa2ed1ac89166ba6d4b5588177b0873c4ee7efc135dbc546d266508dc222f2fa5d7b3e1323f2b97c8700293c5dd09415ec02c597f9932aa64bcd11fece45667b9aa8d55fc8330d9fcf991b4530ea72d6b3d0b803ccc3b65cc756118bb018a666c602d62620e2474e72c52ef191ef7a31a72abfd02c292f0df80270c69cbf55d3189f8d5d42fda5893eb50ead198297ed268357f5f4d77304e41e27ba68ec73ceab5141aa9ec531b417613340c57e91a8a87c162cfe51f5e527b594a780fc97fd6bbe605af99162f86574eb992131c4e27c711d66ef5a741dc12a6cf52eb805042e1cf223d0637b07ba96771c16550e78edaa0c5550710951cfaf894e32266f7178a72c7a938cf356d3d48cec363e2d72ce9c468245fee1d2caee8299804030346ef2269090d8e336ef3b1d19461b20181bd59115137ffbf9aca0b1fd18f2dbd53be96dd98eaafbcfb457e17770f064b525ab1c331d1855835f31d92bbbc047eed32584652ff4ccfa966b600415305732b475f4e82941b418c313ce451a915bb2d61b02d28a0b45e4d3c97e4ccfffed193e62c6f480f3ad0646b52ff4224004c016daabc909d9749eb32ceb557b1540b9d6760ae849d916d9562cada784f110549a32f05a6eca398e705c5ce1d16be67187beeadc74cd65ca431811b9a02f4a00b00e8006dc888b209a229d4e47416537e5f1cd4f10dc7ffaad38af999edee1b6876c307be2ae8deaf21d76310b1feb55730d07f5f02bf0f2c037e3e6b665f3411eab0e8e3960b2fabc62afd4567f6a673ccdb386a9f98f2808599f01b7cf3c3ec63427c6f92bfa538294637d777ee8cda30bc437db314adf4273b6136ff2c88adb23bf5f74ba0eb99e8eabf71a600c86cc045c00cc051d1d1d7feb7a0a45c7713f519365a03bd702e01cca7c2fe0dc1408f4e6420508ace7e4f3e4f5f969cf7758cf6bf7cae008ea8a541697d602fdca70d3ec6051c00aa40fc5e81c74931767fb01926a82238bf35e56551a99816a476a9741ba26fd258452b5116ab94e9f42da251cedd2b3b85e843e6bb06d786a6b2b2682267f2da186f1e8bb20256e5e5d4d44c82d156fbe9308b779e4323fa3a8d9d6a63a8661695abf421e80926c026ef0ec8e9556f36f502666dcb3c50ada9db83bd7eceff48c8678c54a76114bf85e7dbc48633e819231867a4b4af466bb9879d761c15df6a39232a250a3889cc1d2b00b295674fa788df6916b55c0470e8154d1f7c221cf47c34ae28edd45a22c6c9defff3d696bcc07ebd355726eacf563f2edaf30ea20b07317ad56046f9e413d617c793d35f5b19f8f09756e9f15f2ce4de02f9e4dc364e3045b39fd31321d23437bbd7459ec81e3d525273209a4ed123462c4e94644b8928d32e4d3a69815dd72498ce6cb67f59fa22570ad0283e59f798968e7cb2ebb891cf8d839165f48466bd77a1a7ffa12e03255de29de2e09d10a6968f3645c67827f7664aa9971ae6f8c681b8b5eb9fb4cc044113b11f72eee9fa62f45162b205781253000ca0ad326216098df8b91f01673cf3268d9f334f39f1f296171fcd5c842ff6dc4d7464d6579caea36fc31921eb34ff5c6cb6f231260508665865d7f0dd218f742b5c70cef3da422190fc59d17e242e044a3719714f35a8d1d5f9fa6ba331688c77c091533ac6c3e926874c031022ad04057779a9a68b13c277edac0dc2ca266e04c9556243ee7ee9a4555c6ea50f1181c65436942c39f688b33ce1cce1b98df5b8e9f789b08320dbd5378a94787635bd22b8699346e1d1187117bfba752ded792013eb269b99b5c875b86f4d1e19832cf48b9a70aba8fc6685abff910f66f570bcdfb2341d5c47683429d5cfbae1a62ded0177dac8ffe926b6a1bfa76968a032934439d4cb906d30a62808098575ab43c6fc9b8584b7073ac0575358640fba8fafa5661fdfac3a82d71034fd0c7b34b9bd0c8dbc0d474b480dc01c65b3316686fb00458414c676fd339549661fcbb083a9b6f79129b6231fe1f21f8cef867ae2b0fe8a52db323a5977136aa00a3ca50631a1fd5c4566fe81c9c7293272375fc09061090fc4ba2523eed9d6634bffba3311ca04206cc49a0184064230a8af38df9ca0421b20b23a97d24cb9fd9d631ef1dda0df0c38deecc9f0c04f44e5ecb99327de3a1518b9c55f849ef39a52ba17720ca894513232675a9da3c5d173b70af3b227a672281877a9afc6d66b571f202b653c0490aa33921c6d91501fda2f3120c80d5b385cfa5b50dbfdb34fb5fccfe886eeda9b98ef1d4fe1092e5b8494942a2d971bc7c9bae8192d685f0ad804cd532d6d9015f71d0a9091cee1ee35f55cb14f958434c1871f885b73253d7b5791c06494708e3c27e83f56b051930fc48b7b94795d612c133c7b7d66f559a638be138c112b69318f24388f3244c454d7daa4392b53bc89c7e8cfab19fb71a4c3a4019218db6987762a6046a4e7f3889f74a771cfde53c30306f9e6709442c4f0e53f49081fb84d755da4244bf002a0dd26be164da63af2ec062529becbd88aef7576f0826ef963c99a962430bec0cc244a21b9bac6e232bac4b3347be97b4f4d4845bf27378cac49e9488715d540ba54ae3d4de16f7f83f8bdb4fc89b113f5c149dfe30acf03ab4159a1c60b9e46292dc548ae079c5c1870803043c56713572749427a4ca1267037b094abcc8c79a34a06f648e4212e3770bc622c4c23b81deeab40172731704dc79d544c788c285170d6e620a43cc574014943c4110f1b07f1ba225e663dffd1d6f316fcc07e6bfc04ad77e5bf2730099147de4dc5480653aeff680de2dd359ccb41e21d67244225dbdb13164ae2c1c6728f3f6e6b0bf24d90c1ae761f3a52817bc075a37389affadb3febf4c3326ce618f943bc1e3bd3ccb55d3a5638d4c5131c8efaddec22bbcbe09837a4f2df38d470b1e518ca8a9befb8ba99006db8135b59b7e1f0201ec0a6f424ad6f22335897cf6ecc139ef1612eac4cffb5d1c039f543442a8a9cf5fa54c56a2cb23c3029bbde8d9886b13f447842d1cddf4e6a6aa967b79061a8afdf0c9a89448622c021c94261ee6980219efa46e87abde868816cd962a38bfafebbbb47c06e27c0f1e0715fd803e0ac6abec817e301c1e3484c46a425e66a11d6b6fa6c9d8b2dd8db2af9d6c0d9feb3389d10d11ee6450bc10043e3eb1f2817abb3c2d6afa421ebcaf6acfd7ad7ef674f026fffec4bc3afbb05f38ac2c7a9064f11d3cbfabe12fd30c7375962286b0b4038235913109da1a3533db5ed0c00f667e3ae27dbc64594b3a79d4185930a33df1c73eadbee0547b32058df52568c5618b40119e75536c081d0b4cbec455e19f78fad91a4ad70ea80e757b18a70c670472647b1dc13e3bc72bec82db5a002714f142bf8842ab3b8e7ab9b3eaee67d20eed84c4e9c7409be21c332f6bb6b48659b84f05b3c8efd9dfad3f7034e8d5c56828124e48243f726a0c11bbb0ed328ae6b183898a4cf49f8858cbfc6a29a3093c6a2a273908bfa815c92bc69227a95a89a0e1725fc91c5767b3c1fb19472483323bf15bfad97c71d753a6230db9a7490391ccc73c377b7cb358fcf9d6dd0c48399a7bc6c7ba0d27cb41e3c3b3418f72a52cb1140b6848b960d89cad22e28a7341bf59fb3f227839ab05d17726407577159d7295466111a1a442a231ac9a7a3f1a81e8e006eea234f339fc4fd9a72543acfc72cc50debfb34e683592076f55c192482559840e43b7763c8138515027cb6c8390a06ad9be2882fef3e6aaf3d47fe23c71f5524c3ae5e42c08be990e936a7c0a0a5c78c8ea7202706e8450ce96e273b29368bf14242f8effd93e6e0d1730b3e6fe05fc12e40b29f2acfcd48d8fc3fd46ad05cf4eb8947b87be539b4c4bd500f300c79293c21495972c1325ec8d1065978c49820016fba710e79b8a145f06fac3cfa894f5ef27ad53a23c84c8b65150f84b62329d97fe84d36908a1cc3c584cae8ca6b8cfb46b8fca9252253871e65b7ebdb79ac74bec04b3db8fd687b45a1c48407731b95e046d9c0fc206a75a26e18260e2eda0019066a2eac4591b0386c6a55d806b6114e07334be200d21c692806a14a5913498d544b4268210cc913ff8809a943515cd8dbfc0f1806722566a79e88a9d9b7212029e2edf96efa29f3640e62c16541d72783b32c790e6ad2f9fda4745adb25aa9c6938f58e2fe8d5b71463949087d41256eae0c7ac8e6177d244637ae2d0adb35a3abc71267b8d18cb93ec60660a34a5d5cda4832bd039911814e51da9bf1d9e383ce263a209390e14b4e59172ef28bdd5903671960f077520b85255a480e54658c79aadc37e4d6f97f6e4cb2f52001a1b84cf00c80f8aa829edd3bb6fa8c902972bce6eb0c9942e89dceecaad1dfa6ca04b23d433d2514953f936ce472537b7bede9964a1195e7f50c7d59615ae78fe9ee0061c44bda981d8d6f605a5b384c89e8d072df178a7864d6eb8144e109c99637efbcb581707cd678b7d238e7da41cacf7cf524e580a95818c5f3cd26412b17007ce47340d657d79fb863135ca6ce39253c3c6b92dc250b993d8dab1de6cad4e50bb10833ba611a9593b3e41278da5","title":"837. 新 21 点","link":"https://leetcode-cn.com/problems/new-21-game","question_id":867,"issue_number":47},"45":{"day":45,"pres":["Sliding Window","哈希表"],"tags":["滑动窗口"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。\n\n字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。\n\n说明:\n\n字母异位词指字母相同,但排列不同的字符串。\n不考虑答案输出的顺序。\n示例 1:\n\n输入:\ns: \"cbaebabacd\" p: \"abc\"\n\n输出:\n[0, 6]\n\n解释:\n起始索引等于 0 的子串是 \"cba\", 它是 \"abc\" 的字母异位词。\n起始索引等于 6 的子串是 \"bac\", 它是 \"abc\" 的字母异位词。\n 示例 2:\n\n输入:\ns: \"abab\" p: \"ab\"\n\n输出:\n[0, 1, 2]\n\n解释:\n起始索引等于 0 的子串是 \"ab\", 它是 \"ab\" 的字母异位词。\n起始索引等于 1 的子串是 \"ba\", 它是 \"ab\" 的字母异位词。\n起始索引等于 2 的子串是 \"ab\", 它是 \"ab\" 的字母异位词。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f27971c3385f366503c4877594b1b57b4a2267bdcfe01350a815bef1340d776d0890878afcb3339f117a67f0772fd1954006d8fc0d1e0536c8da98c98497c38e078cb97af429d3bb46adef5acae815c2fdc4667bc952a64300b73e7d0c6bc79c445242807face33e6ff9867fb13ae711ca8c7feca89337ee72493219b1dd429675e07fcf18df6ccfc397accb4f323557428206bc3d32f5f602da6b91a724e4ee4f993101e703b9b58976c35ac0a770097179a72038366a2c65264e6577937817e90471b648ee64077e8941c521d82dce1c65cffe4309d9e6e0787e9f1ce93346635f1efa57302476fb2684c2943ddd603c69fe9c558cf2345d10de7575b54dfd8932df0279c45a7ffc63e8d8a41b6503ccd8f6191e4e21dc14e5944ea48209b95700cedb65599c36aa3917de123be780382fe4b2c3923b9c602fba08543e5acc5b656262b13d6d36eedd47d04f8724a6a952889dd17c933174c6a3f6e0a7ab900697ddd434a6d18d656f628a4832879ac3caae7f61c631816dc2f57fb0a0ab13f0dc1740d953d69c305d84e58667afcb4241e487de52ca48c335ac6ed84c13c608dcfc131eb64213f65bb7775a1aebb10b4d0ef06846f40acfa9d263f5b7766ca20c487445446f469c495480e2da075bd2f389e0d4943f4aa8d28004160a5cfe68272e6d168c1f649945d9a8c669a99774f3f48c735dd5df9609eeaf496441ec38ae59d6658b2082f8b9bb2bdfbf127e1d1b8ce9fdca559e6e4ccb4cde435582f670556e422cbe4027f0a09ab5937277d2fbb94cac8c8596c306f2dd2442b6e9d1cc11f45a85096fd3d2bb0801e0ec871e8c4c9c0ca14222fef1ec0b74c06a88bffa4a1e7bc84057c8011456317d0909897351977b1b119ca186cdc50ffc4de5203c05a04ef41f505a8a44ebaba956481181dbe7a6a6bffa099a90b1a523c97221bcc6afdabf9b670d924c8ac4087d50e902c2f308536f2ea273be760e6a080112d52b494591891f87630f2f87886b229d2671a021880f65752184a4c8144ef81a52ec61ae2523dceb203db61b20dc3fb7ba1a5519c250a86452cd946fdfa0002526ed042aaae680f1b26f9d640eef328969904149312f8591ec8108e55fd975371264a17198eb7f40f9c0617322d6127655a11be81e8787d0afff5ec98609c4f295152e49431ad1934a0017b83252e09614f2681fb1a9a35c05c096891505929f3356dfd941f97708d33eb2e20e57aa9b420fe371249ef5cb3f291357a47c7ea93fb1d532ea5eff575694fb18ee8ac3ed9bf7b07b95bca90b73f5ee15d084748c41d3ea2d744547bf609bdb4a057d31f0eb628d0e4187b7ab1a7c7c9b8cc8a87efed8fa6bee7d5827a339f8c5eddfae083de72e5207a1b19fef1786cfb440ed6670a75a9c38c2011ca6cc7e11106aa387c7f9bb06a25f642b16f86416ae875297f6f5db265bdc8048e39e7c269500cc6055f8a152d847ca894facc7e5a794aa182ee9fe4d25ad6608cefaaa0aacf4999425dda1542881fd605a59f8003f85a423a2ff220255be46224e5c3e9133fe0e4a248b0f37f4f5d67f3f404d24933c02acefb665d46833b485c2eafd2c544ecaaddeedd82615dbad635d3b8cbd0e29b08df1f7f8ecff6b37a18b01f4688015f560f170e3ed6d4100ecce934784a19fdb641a8d3671d1f377289a33daf0ac3371cfab775d5107b177fc21bab4892b83ac193fc12ce1533abaf5b9b39969bd1922d53957b72b2a9d4c2b98d5d66b01ccb2cc9667a688cd68813f7f231bc1bbc87cc6c5ea6894b6b6678b46d4823aba869af92a5f1904651163cf68c967d3b33772906f2562804a7338b9a6f24838fe32fbdc1a88cc5d9aa2c6021a4a58f629c6baa153535bffea1becde7a35bacf8df66d50eb476ed3fae3d78de828f9d988a6e4fc77db4bab379b7eebb4a91f251479016b4670ac16731ee611228bb6d54cf58439ac5fec3dd36bf098f5ddf3fc9dd3236dbb6a691e84d15a0895ff9108872c1307a826634ea6732ba5befffb317b2ccc7ea4f200b9d69a5fc7693ebc03e52eb74551320f440b6b43657f83fcb4fc861071ae43640dba0f5e0abc55a4720f0c685aaeb786b032bc9ed5e6e9b68e2f3f0fc18520232c73b5ac2a4a531ba1e3dbe9cff322d24872bcdc73bf8a370e32a54855da8895b6acfc00bda6e4e885f94c7dcc289234b4aa82cb7288a986a2a40a5506405b3f8d8e9896dbd0cd09a873cd964d1269147fddbf2848aab894d346fb1c25d0d6bdd4e0b74eade72f4d020adefbdfd648e4ee9a4204924ccfcf243a1c1795964c888e88cfac83c3fdb1119a0fa1e1fd99249800ffeada8ee919067eb0c03a8232d3119e96cd91da9aa8d47b43e9b6b9136e5a45cc893cb23392eeb63b27e741f46e232e82e72d4dec1249016a7dbb29e31ffbe574debae3e103074956eb90a379793a3fbfe28bf520bdead02a6e64b729174219ef29bc4687e2cc221fba3007805e4c6a81412c1ecbd33c038f43f06442ca1900c9809f4cf3d64c5c37d9e54686bcdf6df00a8e6748fdaaaf83aee0b2443eacdcd152c3990b4faf3b8300fd990367db3404154ed04ee0aeb334da1587f842c83e7017e611f608e5d6a6f29a0bc1e3960e069225afd7f38b385778a028ba3080f928db447e2fd649d6ebeb6d4bcb8e1e0933da986d1b63639f70e1f03614bf114e5d02f332c6a9492381e774172a9339ba9877eb300c778d2df5b2d23ba031ae586e2242a04fa7c7de1e5fe3510b9a5cb52fbd21bdc8fc1dfb0d3ac38637bee25a9beac4a4857d9dbcdc5e1dd994f86293cfbb63b4c382dbf515d611414114013004fb287bc5b772b59637929d574a777d9dc0e8beca8fe2603021627b33769fe39f34cd502e801843bb097e7cc9196efbb7670e84c98361dd21d72b892acab64b449619e55e5cfb067bb1096a9482a0a5890aa9c7626eff414c2501c6d3134401eabbccec1ebe9046f5b5f61c2e52afa1ad1e9725372678ceb1d177917264d5439434ae408ea57d1378c072a8adec5031a02511b7300bf4074e0b891a70672d943fec6c537bf6f79b72d43ce6a719254afef7a0665a44359290eaf86d80cea3aa94020d848e851de237dd22e65fc052f5741307813392202e13b76ca3e0d6c4433cb4bcf457d0cac766319999d66870d748729f4c01bb4d775450b6cf13e8d687fe547fc6c773a398f687eab1d0d5f9bcc2b229422cc2f40dac48f176808ede592ad89b246a77176d488b59f9f2e854269edc1b077a2fb5b52c5355d1c83d805df59116e8e5b1a81e18e8faa608b1ffb0773f6d85283261a156bf91a5744d0dc08375da3a49c544b45375d3462995cfb9d06d39b544e15ab5428c93ffeaac0077f2c49770dd99477ddb233e577184526cdec565d21716651930516bbecba82106aee9e4d68a67c8dd6fb7c40280b20ccc33faa9a2b27c50e47e68459c449d0fbbda00c46f2e199dd06ef2401c82342417c1992e849a431c1c84563d992d197dca9c40abcc8e1dbed96f1ffadb42cbd02529bbed6101609bed1ca7fc298d2a7235eca814472e65d51f225c70f3d983ef469b0633ba2aab2ebbed41a4eb22ce581e94b72c732d57e689c13fbd4391f11190f7d22225c8f6262290e371c057b496d15ce3e66f47fbdc8ae3bdf9edcf91f32f832f5c866aaf890aa9b34cfa7e526433e6f87cbfe1d269528e90972d4aef076e3c5d333d348f43b34980401d9a44a7125ba7c579b015001d498386eee2e693647877ee86268de7d060aec0142cacfecd0f6affb81ae40881cfe05523367dc72ea3283735a21330ad383f33f44caa4497a2137b30cc95d5ee02c3c17a1a00ae0fd9b91f8d7ded4e727f5054a5cb07f4ae48a761a96f58cea94b2e0fe44d2295349983c5db595ddf5f38ca5ff94755a5f3ab81d2e613e64c8fe7e1cabd71117bd77c32039cf1dd561efe319a0bc301ef6b55019a4f220ea6c829155ddd7635d22365db6c3921f894824120bd2e234e71cb82c378a62f5fcb78f7e60a77a77e83206d5c9d726b7902073f8569796ecec66ebd28cc5f83a02af81aee153f2678a1eb57c5efdffbda6cb3c3fd7a61ebe61897846142f007a718afb8185f791b8c8832978f46c42d1cb57c4092877848d6bc1ae6c658f4595ad6cb65415df96f9f7edfe811e2e77249e7174af08c618b36c2ee37d55a3bd455e2190a2dfcefe94dda26321070f2fbf33794398036945441160a7a89cc9bc1ebb7b9de108bf7c59dc7c4fae80d8a8339c30ae8e714f1c1b49e56309afc3edf7aa55c5c31d11ff602126e3abed37c621a43b8113f14bb9a0744a8a7b398dc5e209af2995ea216b1a600b52c4aa6689b8efdbe1f59986ee1068019858c77ee5d3b40bd76310b1a39f7d79967f164be512243f21473f66422911fab9c2e3960b2fabc62afd5372dee14f8882306bbca9d8808599f01473361903f4c59eab435163e7edcce832b9080912801c8ad22dc2266fef80e0eb5f9b4d0231f8555561a0eb99e8f9a743a338c8798558d141d415d2a4d2bbf2e7ba697f5cb34b6d3a03f43e2e538de985b40a15db09f1fab2972163b1e4ae8a8f265a4af0486e1fb836d80e6566d59ce9e2c93770da8240e5fd00804af69b056a8f8c97f26bcde354c1b35185f26f288dd65e23935ee9a465fe17a7d79fe8f93112266897a63ec6ff1a328981069d28ca001f112b77ebcea63278c3e898542792528aedbfdf3b8bd57cd12f874ffb7a83ed758c6120c8a632e0d02d24b76dfc5508fa7febcc5442d0f3c83bacf88e49849716271c3919e4230edf34fa41f20ca58f2985f7dbd89b3c8cdc9096af542d74e1cf6e3c12ae9361857bade7ae98ced7031599bdd71911b1e9f8d3d93a4ea23886e02eb5d6d8c686d42eb8be709f365888ea30115a291545047f48823b2e7937fab14e3be1465f886ef797ee9985645ae99d45d5a556320dcedbdf757453ca533980cf2261d7723f2a59297e457a0779949e01f3903b13cd0d26859d96cbdbe622c1d127573c62c6331f4bb977c1e781af28de128e184e8872b1f76dcccbbd1587a99e4b335a21d6b3fcab92dd8083a54af79945b0469aaad3b32d03045cc1a1e1d8831d80858f2e7a25fa9f30dcee660bb268324a4d72597d572d1e85e8c0189e58c4205ad83ccec57a82dad78efa9a015db1888e9545152dc4a7ba9a7226deca2365d55943528cc14da769b8146ad88b9308d857416d9147a8ae4cdf2a9ab77673e3baea8db5dcbd1064138c0b82cec9965e4f09a2b05c38df28eab8bef0d9cddafc9482464d6f3c558521c89800857e1082d71c5b02aa5999a4e6ece05c82929b656e538905ab6e35f70a52f8fdec24ddbef27bdd6138f5ebab0a8cd51c5993d459aad1231c16faa5923b20777f775addeb3549d71657b0402ce7b7b629a565961d941547ccf5c0063cac98569ba6b222a43f5c1060f470e6d99ee201e8041a7dfb651244a0753e7666edee3d94704f10f1ffb7d586f2a1630d38380ac26882b0606c395eb07347493cc2bc2bc13cc897520c0ac1f540abd1a646bf79814024680b3001db802d9aedc1f0b9164a0908a3b55f68a228109acb79f0b08a7e40816e3bc5eff6c19506d2c033dcdc223db5d5418457be7c9f519b818f2369184d464d168971aae9201ca7464e08bc5526373dc61eb6cab5cab1af3a8cfa1d8978e39a1c7335bd81bfd32d50196714ba11a8c5c144494a5a241200f783213ec6dd47a091aa430a5bdd520a7fe6bc34dfb09c1c1303bd38d654d008fdae1d229eb9a7cb04608edd8af5810017b691ba9a3ccd27125eaaf45fcd95f8d74cd6173c49ff864055732a1f95f0c8dc66f371ced36e923c71147083b2bb92281839205c7f3c4ddefe3a921173915e12c6261e6999445b355caa551c9eb0f4dd6645033f0e24502b1c47e38076aac1f7325b0882e82c810247002fdadca5b8c84ec84a8ba0c21ccc3e5507d5043b4c28fc01ca1597075dcb7b6add048cd2463d7657c1ce28d13e8d386ffd362dab2c820cdfa91094725d1625393c26574cf559a638e95ac26e2a7928da6b769f4a01974ffddaa4392b48d986dc8b8fa217d10995d4b70cd53dd7a16bf5e7f38468584e4c02c762d07518c076c48e54698a3dcf5c4c3f9dbed6ad1588c5f16bb8e73690211b9a17d2d039b9161f4f0a6cf09fc96540cdbf572da165cf013a3ae2df784908e3d9c23c747454b1501b3ffaf906e3e385c9cd789d930356842c9b019f3be22db076be906404ba3d506920504c21973276fcd6b26596036df9d6644bbc59caafe21db4830fad09407011c1827dbef1df88c587abc364abc7f03c126e6b16be0dda9733875dc7ebb9d015b7b3b1b543c35636fe1735204751829690a39fa63851b66170ef38905199e4d88a06d6ccd0b55843083f632470675051fa4565b1b87c8334981657a2e2f6739017da4b9f8aa3132a97d6af88fa1d67cf38c7e2c8a5ac3d6adfc3ca242354b76aeef281f965dc305e1cfcdae5bf0bb539bd688e4a1258bf50ccadf62871e952f16bf3517e84a7c76d2e456886ef4259c1efc7a01dfc97bcd754c1bcc55e9124b1b215c188d4fe82a190613ef9441232fab2be3c098ce8b461aa756b6011c588759c409ebe3537a547f2e690f400f24424638dc383e97e9e402cb23c3060fd8ac483c1e876442b4b92c6c3796654fd33f8cf298ccc9059d48a489a6edf7f90172cee629d21daaa7cef54a6df68fa4cd948a38bbcb1e9bb4fca6421c0f1e025119351ace23ce0c012a651d4b0515e5cc728eb63118d9cfa6c9d8b6988e925849fddc7b4fa3a9c118e3dba1221ce000ea2b36f7c44b099c2d6afa476a2d0f3b1ed4cd6d93439566fb6bc7ccfe1b855b7b6e7b7f648321bd3cbfabe12aa79897316355b3e4640333e101140b2a98c0f52e19602519567eefc2ecadd1f8aba9eb03a88f31109982d59aa9bae2f6dd9610e9e5235c3125dae2b33a71532cf8c86a1a0fd4e5a1edfdca597e8f524ef8ae75fbaa90dbb5a472617e49e5faaff72fa8778a3ad1536440507b9ee048f88a2aecf70ebcc132cee91021a9c1f05be688d2fb0cc36096cf6c1a4206ff5b4e0879aac1e46f646619f8134e4de1ff748a0df06bb65d323ae585474cab5da4eed8ed8d58ef3d34deeeca2a27390cfb5d41edef9696663a8d5d6565963ed879775713d54fdcc142623329504c2a197c76a266f2f30c69a659c394ec86e9064f68b7ee081d96599c48e99ebbd7208e0a67ca21e3c293418f72a52cb1140b690819058d3cd9c3b66bd1e46b5ce82d8aa1e0669c4c6accb8398a3d512e2d8a19baddfeba9e68a686f20542ae6458d8b4afad7ce0b002b52e2ef855541ea76a02f66882523fbe8cf68d2fbb24e871b9b64f1baff05866bcccbc23407e1f6b979403f30e566eb8d69d1be69be4cc7c5c6545fa0fa74222e0172f11b6b660d77451516aedab42f90a02dccd3ffae834241d08a110d6c425c2852db88e0b46cf279ed976dae2a0752f1115b9312c23cb05b5b4dd903bf7d99221963052d275863232129639edb69f4bf6e4b96d7328e1d9a8ac449a4c98b6c2d87698315c9b0c3cfae007abc3622db4fd23c190f90b13966f12df63633808613d3e2d7a3bcd0418cbf09a9fba3605d628b073ef2f3e53cba39bbc8133d85f872180bf5c4ef0b735288f10ae8c7b87b5d75e121546a4b6d8e001048314bcf17d9fe7c20380f9478e34300072245f25db74e696b4ee018595a51c84405273a3d488646bdc44cb743155f95fcba0a513f386c09eadbc6fdd1f469613da495d366b367e3210162a3216f805883f54f3e4b569df7a8e1711ccb38e9bf2861fce305e5d5a60f63dd9bc59b1205ebfcfaebb71a299a143f17f9e7b0b34a209671267bc948b0f8ec6d661b0de084cde6c877963dd52e1ee35495c23ab4533ce927f64339304ecbafdc55a05bb586d57a379f152d336fea525dedcee3034592d5e3a8300f3b85bea1ce69425930219fcf498147c5a829f8eba057e5914c8773e662fc84983fb794a298ac438017e94b28d444d2090c0ec238873c222f8da5a39269ad6446555fc7a28d3fae78addbac40123baba999f2cdfe7abba6ad97ebd5656ca3718df16733a37a4b16dcfa0737a34b91ff8f24cd1da2e90dd902995a0697517e580795473bc9f565a392799bcf379eb2dfa2e0984189433db04d949b57e9cbb9ea188f3c6242607136e66fa5d35ecc09f5531d851911673f04a3a5aff4b7a8e1d808924e221f45df2e004a8c057d082d9c96d85e675f95932407403723b47dbd439d3c33b1d1a12e83d4fa67814445ed7055cb42aabf33f6853f8827d212f39ddacc34da9333b63951e8f344030fc01a9f951d188acd85e7008f3e71e2e6da6154ba7c03d34ad2dc08d7067b503e406163d1acd88dc2a5bf15231a20d25f00432df958bc56967ea4ce06944aa161de78faf5a3288e824f38bef8acb32e2a20e1e3365e2084ee762363a7e398ef3d8787739dd1334f9693a6c3d6aaf92c71bf73cd68dc265eeb2704564c1c33a8c3204fcbad8aa2c06ff311004b28447241f9781b2f6d614f603f49f03734ce4fdd9a6698f57992ece4543d14e9ca433932f3362efda941d7c291b1904ea729117cb06ec67757515588f4d49bd0596e1b38d3dca7040e3e57ffda6a3c867f3f9560233fb3b29c9d9a9633abbe3aefe0213ad5679bdf3293e8720a972337b495b9e564f288c3c61add732d22215010e03511ceb72b53be034b5770af0e035e0515df5a68cd11498a984eca8c17ec955280d13f73a830bbb1e36ba24de07d28b1fe75ac0fa9e59e7b2e0f5f1392c1629e6098db54278c2df76960efc7de97e12e30c35ad19a75131b61105407ce554ae45afebfda2bacc67fd8a79f910658a05841e002d48ba5423beb6f8826d9ca49e62269d0810fcb8120e8172c0b5696bf2056bcbbe87a369a0d2b8d9099177b03272f145e05cda356e254808577281cc999c3d59442fea63fe8ae7aa3f8d9500c14ce8a40c4753b6f980c3e874b0443e74b94c13ec1024252708348a97a64edaded12c21ebf84ac6e83181e834e0556f7a7f3232e2c3dfc282ed249e8c54d62ee77be609f5c68d4d8c0d6f99db6e7db0570abe06131d94bb424679c30eb8ec59db0c130d43dff091a68cddf9197365007ac75b1661b362d05ae2b4d23ddfbfa11b8e778f5bfe5b3ecfcfc5eceb755150e2d00064c4b5f231b4baac201a15a882efb3e87f86481","title":"438. 找到字符串中所有字母异位词","link":"https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/","question_id":438,"issue_number":48},"46":{"day":46,"pres":["Sliding Window","哈希表"],"tags":["滑动窗口"],"whys":null,"difficulty":"- 困难","description":"```\n给你一个字符串 S、一个字符串 T 。请你设计一种算法,可以在 O(n) 的时间复杂度内,从字符串 S 里面找出:包含 T 所有字符的最小子串。\n\n\n\n示例:\n\n输入:S = \"ADOBECODEBANC\", T = \"ABC\"\n输出:\"BANC\"\n\n\n提示:\n\n如果 S 中不存这样的子串,则返回空字符串 \"\"。\n如果 S 中存在这样的子串,我们保证它是唯一的答案。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84cd871bf055483c4f5f59422b54a2822750c8f505140a957eee1342d547cc891c64affd193ae60dab5f297adb147e626489d0817acbdb474d5918878a77ec7c9490e18962fc3cd60464434ee733618c49e7757ca9e4ef6d15e7914e668f53aee1bc8004459124d8e130aa5a298c8d47777be3a3fbdba756a341e63358c4d0cc2d1f623b31b3ec4101f8e7883bd2a4a581aea0f748205444f58e791f7d3fabc3e67b052dae1db564a0a563d8a992189e7e8d924e852e1ce6ee09eaf3fa74b45aa19ca9476682bd2142e4d9fe474e267cce1929b3686da6d16563351507c181b6416362e8a24b63b0684d0342c2df03de8c0775be4cc3cd1650f03f007b9a878c6ca022ff0faa9c8c04e9d55f3ee762cbeb089d81a3188c3f5c34976060e994249f2c7306a8a71aa3cf1ed166f25b54eddd0f6c0c46d8ec669b83f701dbdaaa88d0c9879f128e6b8faf789abd500963537482bc7bf662544c3b55698d9607a1ac2ee11829525160d03fb3cede2809e61906096d8d63a294ad4f40bc7127d85e0c94f9bd1ae1932c6ee6322d63c04c2c427370319c08d6c6081b8ef3d17bcba6f4dda865dc0168172bea5808c6850bff134def0e986f469535515389dd7951e720c9928b9bfc43f15453e3cf8f73be1ef4d8fa382be5206d4aa9b7f3ef150a7841d4187e8a86c53deb5ec5ce4ae40387e1cd870d8043b28471e6b2c9c81139bc2d7f9c7868b30c37437d25bce4d724edfeb8df92d79a420a4e9efec0877c535b3b0f018434a28d0f03721dda0c235c1c1fe9fad6b9b9722f7940795debe631917b724c079222edcc8a9f3cc2421b9ffc0301b0faae8bcbe9a833a3c45d5ce0a1bdf590b5e4b06e1ca7701670744f3f400984cc3ab2d58b6f1557c752dfcad6741d2dfd75a4779b49a5c3f8583e48e36394b378136403b58ad1e11958212bf4b89d0ef622232d54ff39d10d73be0d09ec02b68ef7fa219fa20850a367aa1238d18ef058f07c7dced7ffd283c624ce88439b40575529fd9e513964560ac56eacdea55ca11658500bf8b334dda53bb72c553af8ac30f022a86badb81ff8177cdbfcd7be09c77576afbec9f36578c4051dee2413090ea910e567cd40e85ac17749a1cfca11255fe89b9b89140a1f082069216d523fbf86f77a742af3f0fb5ce8164f286151c7a13dba1f37b42bbe31ed6c3c63849ce0b310fc4bf3f5cea464d4d7affb1365febd07975f9d33d21a21f669a78302f90f10a5a75ee38db251217f8c8d8c8a427343f9d59df5e888cc9089d53bacc86950ce618a0c0a5735af5fccd8348c3279dde2e091b0038f1037ae58e81f19872bc6df197f75b081f0c4b9db8dbfd7c7fb61fdc7b5d564ac480cf238aed2f59569a983f58f89493696ad7f828b13a7bfb3130dcee09265d0571e91ef77761e044c06ce1ef7426b8d15ad2eee3e7e6b00e0026a92fb07b11de6ea4b5000dc075f93152fb8b32438f9ef655a646ba3a2f390e9c29f4ea708510665ffee2de55e1757a7c7528f195eb3fefe0e8911495142df467a4a812c0a8f9bdd77bfacb5ad2df3c032db92eb218e5ff3246cd94c4f62a3074fe257682b66b185b354ab2c7e6a0d22aae7db9d1ba5c4dc42296fd518853efbf79ff76c79fa1a13d2180f0c1d524629b1bb2e88c1d41a755209f2a36fabf4461c240e75b3af1797c3b6257db0a3018922206c458aa10dc64c16f069e7b62a8468200b689d72fe3efaad885816ac2f3986c58cf8f0d6590ef73f9a4bd1e8fcb37d3b28a7326755d23ed0ddf80f27a3d90152ef9621c4fde26723bc4d10190e1ca0b39fd56c450f134d321f7e369612068345a41c5e3124f7e6d967194b7321b5ac834d162ee1fdb827e17fce701246176c29790e697d97284219ea04ef34d09154a75323f4edf5ad3453d50ab34de8ecb413ccd7f71483b4084220f921e8ce9c686a816ba1c5c87c17a37920c0fb642e6cc132df60dd1456afc84c6de7d9dabf5b98a7046816d642e75a945f4014f3948f3b20fd34eeb625975d77482f88a604b954a7c46d93d0fb3c52c09ae197bf33a43d4b9255f90eca67f2682f20e63a58d582cde19fd65d54271573004652bee7e1ca430a103d8706b9ec958d2cf2d7806ad6eb61abb908b42e0cbda9e8322c0a8c28f62bb07a89f60af4bb070bc3ac1937d5a05dc50832bd3bdbfcbfaeac571772fc688771c287294b45fe286c452f12d8ce84a9e51687ca83609366bbb5f932c9bfa5ace1de87246065c19a7e7413cc1b565aadbf5082b02de793aa50f3629a646f838dec61fcce67adcf565563fd8adf9ff4c5203ed92c1f89c91e2ad57dec13c761cbc2f0e1dd67468bff6329010d19de50db2e8aabbf6fb41c8669ba2ae7a04cca8cea223f18e879a19be8b3837d4d943d19abf94fb842ea2e0874940bd6bd7c67e8863b1102549863b00b01899294fcfe15b6581ac5ae1680e77450927c285b1753579fbeeaa8099839dbbd5ec4a7c50f6c87fafe60d451a70f6fa6eb314be45f4ac3ac685dbabd49cd26563eb9f48c5ea48f3a9bb5d8c34591354e19e3aea531a7d5cba385938e5f71e5f64858e1147c10a43a8472ef79148a301091a30b14f9fb919762b07066401da3a8123575ca6b275dff401fb3834d802fa5a93c099e80bd45c0c16b9c70b287c4be9ae9edb726a4aad2b41c0cf61c060a5d50139e4414721848159de14830d3c9a867b64818887a85ec7fe8d2e0712622a6efa1714d54717324ab145285bde45e5faf1a4aba2452c93b84c0c6b2e59a3a7b5728cd26bfa445445fdcdaead8e0d4844f86293cfbb63a573e2e8e71bfd543631115551b3ec2b2fb1f738b8df31370c715e168bea22ce6bf98815a0f404b0ddd4952a14bf0008939ac7e8568f9978791a23b79140102eb00c4234ebe2d3af7b8dac14ed6105ac432d2a902823fcb4c24ce4c5463251b110959e9babd3296645c66716860e3a28b94f0a0697b262053aabb2f8d68c7a22b753833b8a95f001f701c330f210c0bfe57956e916889656e99b7802b644a4f5215230386c3627d33280452c842fcdec570f92bfc7be249f773739b67adfc730757af4d7b0906898ad91ce13a914e2dd65be863e8e7906d2d50c40710794d13721f202708d52b7ad5200e785f31e65ecf5b630fbf7f691d99935196e2c2e14ec7a84684bb1e546ddd70f6c2652a864a8d12606c7dba182aa278576ff6b23944ef2a85706ba59cadaf878a74e5a0a48bbf5aa77243d7aa9b9c931987674d0160177a88fe5b52d136441883c223d04d1963aa751ab4e58e9eae639a20f73b7d196b02e83b5574749d4665064f1e88e08e6bc6a7292a445e253921c473acd030a3c04a0279a6286bf55ea3ad9d5559460c5b7582a2db300b9422ef5618109a46fa77ce1a771ad22472e0ebf0ed110cabb532ad64ed409fa2608b90fdab2012dd254cc6b429b7d1196cd207bd15276a37d28e734d735dfa30a9d727aa95eec9da5b64ad63f43a54828b3e062665521236c60c3b0f6960535f640355de8b4b19d9ec53c8c18b6c7ce03c48571427e6ad123586f51afc836ed1e8196bb1b03b8dbe521b71281692fcaa7801fc3fcfe2cd5e24c867fb3131d9886922567b160d073f6a6f378f32376b423810571708770f865761a027fa9de72596d889b71506fb68b2d32ceca2b2d9cf6686e9a226107f2ea491fc013cda7cb7433aced6bb22eb8cda539a56e17753911510f1b37c2a63a96c48cf140441d2877950c6342a3a0ae737ab3f74cd751e18dd2b68cacfa596bfe9fc81ff18c652b649777d6fc535ff6090033b171930feefda064899e7446b2c38e759c14452fc7e294a81a002f3a9ce99e1d2f486a274874c0d14e42d12b0cf3f7ebca7c9b98fd184aa449e6c5c53cc5a20a5da95a7a7cba3eec368130175e925381c254e9fb63750e1d8dede4bf805f569178514aa2e11906b6ebc8e757ae5d2a4d820ea6cc4de07dddf635d22365db68b8802d9157e1e20dbf107d246b82429ca3ff5cd9da57e60a77a77e8714ee7ccd723fad6317ac612d2d987a528b8b9c69336d3e06102197fd65ba1239773d4eead3b25340c86d25047812dba43525b146241633199be86d9f58be5c8952979e346079f8f57d909387b84df2e92b32a788743daad29e40e418797daecc7fe811e2e316bcc717cb4088356f72173b76e13e4f3103375d8aad6d5fed193e6682a0e4235c53d2916cc0b2a0d48527ea7b69586d353eb7b80e15bb13f4cb7042efa889de677952bd3c63803591b41a8221ea4f0b9affa058b9b501fbe3c7601eeb0c737c621a43b8113f102b6e67c0190492a80dcb204a265d7ed7216117e0752c8a300ccf6e6dbbadfb386ee106801ca1d942ae8deaf21d76310fdbbfb5764962d5f45eb462c6064582e200b341aeaa1f3c9960b2fabc62afd01378def0eccc6387be7f7a1ecc0dfa41b61f3c9e677162e45dbf1a56a680870927f858cd730ad4f7dec40f286636d2078d53188fffb7cbda3508aeb99e8aeef0aef7dc871c016c86be21581aa9efebca0ee217755ba087e5151f47d2e4e8dba8bf84d911eee6d6c6715dd937e541b4f28bc9cf7758cf6bf7cae5282baf01b6a3c7471e4f83e40c70c1279eb0faf934663868c8f90009fe30084fe0185ef6f7b83951662c13ff4e262aa00b4cf96eed37c537666d0e36acef555328cc25ffd568f4d4f112677ec8fa14f78ddf598442ef1148ae5e99e778bc97cc126ad1dbe29d7e67e974b20c8a632e0d02d24f425870100f67ba88959488adeb530a7e3a449849716271c3919b7774fc021a144b973f1876a89f78d99d73a98333f0567cab4b35b6ba8978d6651f069c6282336380a4f89d0002b11eec0310b631f6886880299ace02eb5d685ecacd47afdf3209f2b5889ad34114f707f0a263a06c63268791dfab14e3bb3030b9e74c2c3e7919b644af49a6d9c8c1e7853b6d5b2140c2cbc3255bcec22769438467e06647d4b24523c86cd2ebac0611b8f415fe9d8d09fd7e6708482551e7b78d7604046a565f0cddc85689e52a43268b646ba9f39a28ea73fade9de0b70057efc371a7c072e21355aae645eb93a980b34745bbde9d8d219080d663fd43b701ecc9b41bd9f7d95a01142fc653b1d4d73487c4a634498bbdc11e70c9669149f3c9acc7ad9f0fddcbfc90f1cf5cc869054172bdffcbdf93c72c0ca2a1dba1a0c00c89b1ae62ae64a6391e4c013f20a6b2dd107d4c16cfb15c8c87079f2bec0f4a7d9be1c6607ae5adb9996d557276cc4e508719066eae394e6c3dd9efc99cc6c046f2145c864c2d04f836c0a85d947534df81794cea3a48d0ec3dfc86d3d07db17cf2935a40652aba9be6d93f9f27f86242090b9ef71d8ae5524ee8917f2af6c4e0ab3ebc6252078100e56dda3741a9f1e45ef0278f7f2ff6fb924d845f57a1583fdd21030bc9104fff2b270ed78144460a026f5a090ae44a6434e35f3255c0ca0667f6f6df7a974cc636c19f1adf281d3a0ef300b2f225faf42d0f53477135eb07301066ecaf52cdb6881c50a587394b14cf3cdbb16d85bb0710e5d3b2322c0806491e6c8ab9341024044e6bd0d21e5604486d036f0b1ab6b33c11a11c8eff180927bd9cb73dcdc223db5d5418457be7c9f519a8e886b5b05724a68169971fed37528ed03015fbc4e0c373dc61eb6979fcab1af3a8ca94fcc72eac010492fbbc5e7965013532f76c054fa8ac8441b0f092a4255ed8d5628d5db4fe7d3e723693f99175202f8bc24dff0d54e4818b62f994f946eb4b0572b838afc82183ac285c5eec5675eabdbb3870f83595a56a3ef5f849ef3de17fc176763ff864055732a1f95f0809d35bb0a9da864a06932407cc9aeec9f250313205c7f3c4ddefe3acf3b59911653956e653ae20d5b385cf5545088b6fac7654d5d0b406d1f7b77409e8b7db1ebf7325b0882e87bc94b0b4527d0d5f8bedd1d9d5796e9cc07c4375875995f5e4528ae44991bc7520e830428c76dc7da0f3d7b5791c0649470ca6c27f53f64e6249b578dc458c07f1153636d376a747aa71cf251a71e873671167c8f39389f1844c454d7daa4392b15f380eda1cfe257fb23e58de3449a73d769ec76216031adaf9cdcf63ae33497de4ec3514fbee7629406c4a0bd79731924a367755da4244bf002a0dd26be164da67ea2974f5829f18e9da0f27525fed13bbb309dc89e6822b1dabf774d29edd895a633b2b6e16351c37b4f4d4845bf2737cae31be9018701b140e815e07a08e9047f8ef8acb8fc84a056bb98589abc669b6ae5051cf9c6169e155261c45e8133e1472f70d7790dba34461a2746420d66a1267064e2d1e883de3dd80614f952f23c3f3f28ca72211359c35493ab4d1763610b04c796543b05a661177885b465e773c5752e5054cc45220538a49f7568722ffab8b3cb2187ef7469ed77c919e0a71a7370bb119f1fc5064304bcee0f4caf983581902db75324700b6a95db1b5846e28aca72c27e361b5fe20bc5d4d07b126237cf289475e72389b2fa957abcf4a2603efa6bf108bc153b9e8ded2d6e0538dfc50115ccf9d2f465b8c0c3831d8ef2df749124b1b2518493feb8cbefd40070b8034073b7e1e4260b88fab36ae2456b3345978475cc5ac3c74b65ac47fff8909849f3550b7f91d9fea111ca5b06b23c3060a0f4d8caaced62041c61a1d0db7d6c59a919f8c53f9885f54cda9e5d914ccc3afb447fee11d26d8ffe74ee49bce8688131f30ce6cdbcfca0f538c565378fefe83f1adf45e1ac28bfc80db74dd0e30c4d46be7cb96a118082fa3fc9d973a2a06384d6ddd9a9fa3ad55fc522e6465f8b5202a2dd637c07e499dfd6bfa876c1cbe7adfe4cd0aa6e4e1f23fef238d9a6bc05dd84cff9a9106002adc2d0be12aa7989731635103e5b402314595740e6e8de4817e7a80526dc26adaf6292935e94f5efcd3897c41119820759aa9bae69228b615c9e1b7bc3401ce06c76af7b7f90ea86f5e1af091f4aa48fdedee8bb6bf681fd12b8db23bd223a5b17ef835fbbd572fa8778f7ec477101517ceadc0bf2a6d9f1af70b3a81378eed04c5e9c5c4aeb26d923a4b731336cccf9f046218ebec981c9ca513b9b46619f8134e4de1ff748a0df06bb65d323ae571133d7e18a36aacb8caedd889a3093c6a2a224d886f9911e95f9747b2aa290d41b543fb0dcef3234695dfdd109263328bf04c2a197c723606f7d30cb9a299c324e9820df6ae59e7abfe59d6dd0c48399a7f83c00b0af7ca91e2d201e18f76b1c98115db691bf8817d3888d0702ee3406f58ea8f26e8386ad5d7969640c0e7d04d76f7e2b585412162a2e1a85a7a8f1fd42f51b56be376544cc91b09a7d544dd4ed2cc50debfb34a5cc0c6e22b0472477f150e521e45d6363ae6ad0580277abc87d5a7de4e6f9886aa36d66e96f51d66fb1021c2e9381177e95e5e9d3a663e994e5f7bcdff5eb141c06fd110ca73a2b684c67f69c46539596a8dee6edcc734f6e14a95fcc2e37cf8400cfcd4893fc32c96a9c5cf4eb8947b87be539e681e9055d7e0c2b206f317e5963eb3203e28c2c7338848a4f7f59984f0e5bb9b62aaa05c65690c306cb26fd50cbc05e850dd3f2e5175cda6c9d55996a66037fc643310a256c67ad311dcc77382afc9819ad4119a6879a5fe0783812b353d635f0a80b86c42b93e19b6e2b83344f33e7ec1ea2aa80bc0e5ada8dc794abf0339d1636024f67075adb798ab793e7c15fdd45beacb2806ed6e31770c0641609f5a1e443e32b00d43a43660c142866046c71beb3fb60120e606211e485cc6a2b79a22bed61d1d748","title":"76. 最小覆盖子串","link":"https://leetcode-cn.com/problems/minimum-window-substring","question_id":76,"issue_number":49},"47":{"day":47,"pres":["二分法","滑动窗口"],"tags":["滑动窗口"],"whys":null,"difficulty":"- 中等","description":"本题和 [1423. 可获得的最大点数](https://leetcode-cn.com/problems/maximum-points-you-can-obtain-from-cards/) 类似。 **因此大家也可以用 1423. 可获得的最大点数。(因为 binarysearch 现在 down 掉了,可能打不了卡)**\n\nYou are given a list of positive integers nums and an integer target. Consider an operation where we remove a number v from either the front or the back of nums and decrement target by v.\n\nReturn the minimum number of operations required to decrement target to zero. If it's not possible, return -1.\n\nConstraints\n\nn ≤ 100,000 where n is the length of nums Example 1 Input nums = [3, 1, 1, 2, 5, 1, 1] target = 7 Output 3 Explanation We can remove 1, 1 and 5 from the back to decrement target to zero.\n\nExample 2 Input nums = [2, 4] target = 7 Output -1 Explanation There's no way to decrement target = 7 to zero.","content":"096221cf5b628be1e73e8bcfe626c7f3f93f5dd1497fc067cf81bfe088cc83fed16c6dadad1d3acdf7cc4cbe6afdac5fbe291b87a12b05d6b838ba3abfaac724e231e5b972beabfb1d37d2b6d3d2127d3eea7c948db2099f26ba2d80e4aca1c24930c00b6db0963d661f1272a8d4daf071d009062b4fe1c16aeebd8560a40eaf3b77c7aeaf8cc4b39536e047c90eea37bade9b62db9ac6a44748aebe6b22f03e5f7a132669d6ed2f5155c11719d1d80e16d787f70c543d1ff21ba63169ab43343cd3489d075aa10ef1dc230ad4202a1bfc11b1357a68ceb35e2892a6690f17ce83e1b608cba36bbbfd1126f381c40901dc9fa271466ea7e7c7b54be0b2c8892e3ec502536050ae5ecca59d8e04a892b61f4765e56de537d252124ed67e409471c1ac280b82086e25d447b39f8e16bea96001f5de0a3796072fc022581fe34bff657be3f333603445d9c16b999ac7ed626c6614ba8c8fd75b8bc4601ef05c49e982c0db74b2af78ee77b7d1ac93ede9ea24c6f3324df782f75a64f13ca5c9318fbd2295494f4dd8d85f52cb4724ea5c8f34312edd97a56db89b45c238e689fad3362c41755f3f8e36d6d5081bb8d1d07dcfa5ccfaaa57ea025037927a829f327772cf366864cf47ff9b71be88e4e0b9bf8c1ba863471648047cb40400eee3aa449536c2fa930d06cd005a1ba8eec8ba05493b6ebb343ef40f12c023bf0d4e9b5342a4d2e7b700a3695fd34592e9d1917e07060d5f9c454ab33f0f868aa2bdf2cc24ececb8fda5db9e7e0b7a81396b37abcde5ff523cc460a0df62240d45d46d5e5e7b53f7b89cace7381c2d1b4bff26785af462d84d19aae41139c4ad6e5f89d31b23f88c0cb5c884b793a0a42031aed76dd7d7c4c6e0ded33418d31b0234134d442135e19119d58995257d62870aee601be493933f9462b761cf05269b4e3b46c90897fc318599ae3d515f76e98ea0f01bc4f203bf1f3b2157f325c50d4aa20e1ea314d2c7f77edc372edea82ea1676a1286cca2d91595bb593b9ab61800fb4e54ef1281d2d3fb00038cc1eba1cb0089625e58a866ef8d95eb113bd22624a356e99fe67254d16ba046ac50649609befd0813586ac003bda22f0f0d6eb69a55acff78bce784cf20951e804fe224d859b3d463080cc3dede47541b56e48bcfe0a6b28cf68fc13c5809bfb2fa3b394cb25aeecdc7a0c52724a17dcef255c735c82b3905630d730937fc0e8d001a0b668356096860c686764aa803ba71a33edea13cd735748d79d2f33162846179429ee99217684a1ada8ac8612f1e273041765d0a69fa3d7cb09531ac1190e5324cf116460bc846beaa5f0c110474b447aeba4dc71495cd52ba0d0894a98c2610404f37a3e0a34dd69f71366d010cd164c5d326b23230305284606e180d03b2b67769ee4e0c9971103bfecf9d225eb8e5140298e43033566dc5ec3f60fa0cf65fff6bbf6f8df3d4c55694ad3953c11b9e2043e795817fc2c35ed1e36b2effd16976c79fe3fa0a4f280909095ac721abb5f6ec2e0fab0bb39d9417748f1d9583513b17cb02d39bd2ea7f8ee1d749ebe50c005cb1537a3e788d6310fddb9de32c0ac30baff71ec18db823d7b969aac5b8ab650746a863fe90acc6c53f127172bc7058059db0960fdd0db85d25636b99de71e7ce47a386cbd9cd8d930109b270452ee4f899b22722d46d20878ec2cbe213002cbd6f5cddf47e748445c1a69fc73953ec5b95bd65c1183db15fece5abf955d97fd31f3973a59b6ce9fd4b2d1a273844f0b33fa608d8244c606d9eb3ac3adef1f71573d2b785366fe4fe4105c3f49347366f26768c247d03404abd3f546b1a1a277d2213753b1dff782304a71aa299aa84faddd8653f4d701fb54113ead1b16bff8319ee68e095a434a2ffa098fdeabe79aed2ea64e90cb770e93d8c147af693849cb48b4d6fc77da4b9b445b6cd974089d750658a15a7610bf6483dd270ff85e619688e3650ccbcd5a3810eff56af1d8429a49d3163bdbecdd5c12b4b91e115fd79e66b9f515306f3b8af390aec3dd395cb23ebb1d65dd8a757ee74e4b67bf1a2d86b0bc4070d0c44bf75eb0ec6d327cf4a83990e399c0b6079a2fbd7a9c1ef1d0c06ba9f86c2be591f692eb1957509ce528bb0fab84940426ff15306d0f702c833cadb3f577e33360f801cf22888676503da711c9a0ae2ac1934e8ac59f20b17a43ae6c4b0ac81561640ff57ae73d798ecb0b6759ebd83b3a5f2b0c8fb67fc4002da43f015a239ff22c3b1a9a0e1e391294c7dc7847c773edc175040a0b46c818c2121212f96308915b38544d2f909b9dd3cd0c93406589ffdfeecabd3a6a914f3de5d5fdbbd5303ad418d245a6da49cf22efa6a729279583a6c88438e74a2ca1cc8b2319366a915e58d61c69ee12c3717e879ad7573364ae014e81d57dbf2fe28b826a8d6869e38efbe5c51e5a815110e479e6697e6a12057fdecb169b63251d8f45297a0096ff90b14ff93a58d157452aa2f97fb0f0151e1bdc7195682d6c56cca64a1274d2e27d2c730f34bc99b686fb7b37ddc26433dbbf68a5daba13da480d4c0469f266a15f79eab2cb7d6f2a384bd965d64c2f46c6feb246616823a8769c478148a3d1aa167def8651b445011821105606ce4bd525d6c912e0435814a64e8982dee3ccccd2e74c183f10ffa9005ae26c1b9afdba06f0ffe31d9f5d8de63079c73207d3b5166f648732c1f2e6b9ea03b3e7b4171ab3d87b98f68a8e36ac2d2c1612f06800215f984ce1a2821f57c52f4edd83d1293b7ca62d4d305d488fcc85f74d272753668d766e68ef2a7f573d8ded1eed28d4d812e30ef93ffb2b92ca47ab2db4c60010a58063bc2bccc1c429b81d81ab71cb1ee54bbac3cc1b9bf9d5e2364a4b0754a4cb749e32f883e897fb153fb9d92919b0779033e02cb09c6087ebb351732e3e6b022fd77cd2de05a1610c17e5aa5ec0b07680da2ecd4414588f1a355dc5e313b6ea2af277010580f7dc2e2afd5b83a60cd0f9b4726f9f2beec5a6185e5959dd3b9dedec4c92bdd7eb304ab02e3ab527f49d9e09490c1e18c7ad2912b33797bcde05c43f0ea0da22aaa3289600bc20d2d911bf4ef1b6578f114648d857a6d48d819b35c9abc7d1b875fa56842aa7362bb4e1d36061913751faa8b2fd3e39c1d64046f61957ea6396a7dda651881621ab54b355e8b37ff04c44e508cf4084dd93f885a7ccf55ff777d3917a86e4e98f29ef799ef2b2cbd02cf177fd0f0a5fad9ad2a82a3d7f69128cd7005a0a1fac99559fa471a5c62772892913f7d8d5a4a4fd3e54ab54f570b970750bb9ecfa71dde48ff449bcd234fc4810d191853e61b6a421414c91901eb3567bcd1f89794c5a214862817df2353be89df75a2a058ca69491b829fccdff5f75b7bb94e729828ef561b3e9840d3997f70eccd54f694630b7fee1a37a186390fba00c9d1920a485d4521a9913dc72c8ae2ab3d238f8e3c8d5eb77e146698c33489a59773c741b3492159657d0ea8eb57ab32c5f94d64d024367f5d5d2cdcc3fc894303232f4e4464d7c3601ed6ad12e8da8a7b6aca7f46431130fad54f798ae719fced21d3f81a2296bf72efd3134b6d725bdde7d31d4daa7ac7f8c646628a32d73d2c8d9d352956615843653763741da532376b0b385f4b58543e20d21666e43ab4c2a8258b99c7f01e07ac73e0df73b2f9d6d9df4c86e9a22610326ff4cbed062f977cb91d72dcd1977e82ccd3529a4fe1751a93046e9ee1186f25e83904da52034f8ccf7447e968437a03e037aa1c74c0750f11c6014283cfb896a2a7b581a377a252ab491e333b8072fc7dcc6e106f2f089fd1ee2d03dca2497a2178864dc84e74fc2c6c19ede544a7a9d399f18af4dffa27947e00219a2d0fb0df245496a7c9b98f989db60d9e6c1a4ecc5b3db59c95b4a0c8ebeec36b13452f91487d483f64c8fe7e1ca4d8d68c02bf4da1690b8547f06259c32c5b8fcf0159e5898ef220ea6cc4de07dddf2015636414f5c8951fc86c705d689aa366864eea6d6e8222bad6e38f637da72e36ba360bfa90d76af9c461698510d5c3cead28b8de83867bdea009021929fc79eb239a739deea63b343d05ac9b1e13817bfb0f5214517b556171def6c3d1ff85ec89d07a68e57107d3ca19d168317b8fdf3f92bf202bca15daaf7ad25301d7b4da8fb78e817d61752ed65b56f448c315a73c18aa630fefab4455239da28090bd85dcb47463405b6a93333716d55065450d1c7ce6aeddcfbe16bf7280ba71b13f119d2121fa4d324ab1398c4d3cd9651c1b49e52a04b3b8d7b2fa058b9b5045b0341571abb8ce2cec21a43b815abf56ffee395eb6413f8fcde609bf29d3e86543572b5a1380e644c7eda288efb7dcc1a75e6008c61dda7fa58da164992718b8f2b5477096721656e2406b28300f41665f3411a3f6e8ebd84e78df8778ba44638df213ccd6317be7f7a6d5d7d7f07567d985a331427c218ff1e63f3a7b25df7f988cc72b874f7dbe05e8ba7e2a256d8d40cde3b226f5e7508aeb99e8aea644bb7d84348642955cc8059aaa9ef1b3a0a2643101a04bf08bb23194a694075e40148615db09f1fab2972e6b7b4f7855287a0746b0267e78f61997647f35bcb4b5bae66002dc46cf02147eaa4af69b052cc0ded4b263d1b700cdfe1c85ff747bca950a62af24bde53da15fdf8396f3d36a38266897a63ec6b65c71d4903db3318f4652116822a1dcda0605c6df98442eb8528aedbf8873c29939d127c448ec5a82ab7e89562086e36594917f63b17187074bb766ebdf4945ddb1f364aee3ab46845299bcda908773efef49f87b8c5fb662358d4045771c03a9cd5c68712698f3f60fac12334bfdbd1fe94eefa981fda5cc4c7c9ae2a636af775f681473ac8802c286e02eb5d6d8c686d47afdf320d66d58d3a7260b682e39111127068877622776a8f60b6fe84650c426495e18127cfa92410ac3687c9d898623617bb0c6ff0ecba387cc751dd568033b48a394e1b19ccf1033f4340491d67287c929075f7c4f2099551892c8fa87156c4b800ff82d51116a8d48db3b87ce5cb090fc76e6cbbd1587a99e4b33552ed674567015254d035be22c0abd348e03221f5384eeda975a5b276b3f987e651e9ed90feb962bf6c4660bb221744a45201c2e032d40cdbaa344f958c93d5a9669839601ce9f9188c2d20f13facc406fa592d139683a01b78c560df4f83af6c0943033cd64ba2ec4ed4d7464d5479a412dd10782842faf5a9ad43937eae586f3fe97e6793443a648ce8f9ac5031646eee5082cba66eae394f2c9dbc3e79998210c3750109d6496d14fc76246cc8e135b5ee379ddc8a8e0e656af9a8676175af10ca5691f8e0c586e2d13ab2e5b37b152a4cb792d15ba86df3673571998e9cb6c8a92292d73b5e7be9eede34266ee9c5cbee78c6621f7780dbf249351906afdd33e5f178ab6730df7b5c9ba6cad3b761d607abf7443273a8122ee888851a988de6fb98a2b09896cc367beef9a36175644430f2bffe6b9f7852ded0d74fbe9429b15e0c795e60c5dd4e834c9c31b5c49c0fa06e788e342f27a804b6e7f0d364b8fcd6bc4e98eee9e5a1f4a41e5f00d67abe78c364ba71a3e71b9fe5882ff5455360c1ebf416bee414aeb8a2113f5129216ec59f9620766cfd7e1bec990b741c42bf60d4b6ed0d0e624ffe3a7ac00a63951234677199d4b40b94c942d5bf7baa353246740b4dcc2929f60f63f0e4f819599cca5db93294f98c02e5a911d461ff3e6e2689d96d32030b617697d8980f335c467da65ac3576b3a1475b2637fdae3b6f4c0b17d5a071565542b616c99ece032bc724584c5bd040bcf9f24141cde1b08abd534b1458b101cd131fe17c89b991c00a22495a8a8cd7bbd9b7b2d21749b454b9c256acf79502207fb66e147c19fa92d26336340aead6b987949a9fb0e708cadf2de2f1f83d1c41d6a079c30c044f629cdbf7bc9a0497538ea8da419b625138d502370a6ceb445abb6552c9388aed35ea024d9dfae0f891d474ff70993866a73fe815aa50a566469413b7d380e1a083bed2e931c223fd4cc904fdf0fad43efe823bdde148904b6d6196bcd65371020b7424fe78e64f0d26ee1ab077c229eea7a4ac2d386c2b5bec0cb641699550b6ce6616f329bc036d74f6ad9af03cd9b6fd060e","title":"Number of Operations to Decrement Target to Zero","link":"https://binarysearch.com/problems/Number-of-Operations-to-Decrement-Target-to-Zero","question_id":198,"issue_number":50},"48":{"day":48,"pres":[],"tags":["回溯"],"whys":null,"difficulty":"- 简单","description":"```\n二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。\n\n每个 LED 代表一个 0 或 1,最低位在右侧。\n```\n\n![](https://p.ipic.vip/3jkqhl.jpg)\n\n```\n例如,上面的二进制手表读取 “3:25”。\n\n给定一个非负整数 n 代表当前 LED 亮着的数量,返回所有可能的时间。\n\n\n\n示例:\n\n输入: n = 1\n返回: [\"1:00\", \"2:00\", \"4:00\", \"8:00\", \"0:01\", \"0:02\", \"0:04\", \"0:08\", \"0:16\", \"0:32\"]\n\n\n提示:\n\n输出的顺序没有要求。\n小时不会以零开头,比如 “01:00” 是不允许的,应为 “1:00”。\n分钟必须由两位数组成,可能会以零开头,比如 “10:2” 是无效的,应为 “10:02”。\n超过表示范围(小时 0-11,分钟 0-59)的数据将会被舍弃,也就是说不会出现 \"13:00\", \"0:61\" 等时间。\n\n来源:力扣(LeetCode)\n链接:https://leetcode-cn.com/problems/binary-watch\n著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347187228a04f91f99075142254f0a00053bf0a56aea6410d1ec9878a833a0e65ebe221bc49a2e129cbe22b42dbfe7b231e23168699ed9d2bc0b2acca49b84106836f07e8edbcb66dd77f9a02b222a4c64ded2298e9564f144787f47f95a2d4f69bc518bcebcb01749bc1f3570bd6dc27af98f38ed3872373041eded3e965ccf149ddcab4ba52f1f5e6a04f7bdad90999bbed5c08f6afee62d447e2e91921a706046f2e293041d7b3fad5a936e378f077705bd1a985501b9426a3d8dde47230a11f627a6374a54c38052299a87adf5d179d4f7dd5dcad53e87806c3894eefae85547535daeecc92f392c26860f332031aaca6f84a793996483467b710ece505e5bfc1fe92cbf6db414dbc8884489e20a8a0f64d0d409b6a74daa05f9d145d04b21a0929cb5557300b3bb14b6d7f066e539d5039fcd4b3212cc3566cb9b83e002e5da4f3e7f0f28d954ad29f19d36357d90d8fa79997858fd6b300757670f56e5f82cc5c01faf5c073e1f6ab558a0a6a70cbe359544557f1f0fb4f0642c77f6042496f757c1f1e162ebe6756a53fa8cf90fa4854b467c32ba14dae8371bb8d116d76fa4d0f76d9916a0e56374f1024aee27e47d9fae9a35cd37702ef7d8f06c6b180cf447463d8288e9f469c3538dcb8f1c18e0147f1fd58d1ceecad02fb797efcea2cc20a7b4e00c88e72eea64f1c54bf3c45908664b9c6ef71f817ef45f0d129e8f2c062e24f68221e6db10142a772c54a9251a3e5c7c5655f4df844268326fb794bbb89eb961e84e088d7e2429ab4f3a2d473ab7a7f1c7c37c6e077c2fc7452c6d8a1cf01f47994f9bf10224b39d1f39ec717964b0617c0667ed8819a7de5bb347d6e2d4c7f4c2d83014d22c07350d6e4a1c39e3bc20d7a6a3e09ee38c0dc4a290467c77c304cb5b33e66005d2dce4860ef43777c2720b1be2def8896941456ccd2672b84897c6c4d60ade53a28b3fe0d064ef384540a95b80f3535cc9cc08123815096a5ace6a7ac5e2ffd283d70ccea36a49cf9c9cb64540e75d3d5a40bb60301b71ef77a2d885bb58769f627bb307ebddb33d028e29b012a01634c15eaea8434b102d8219f9fb68034b3ee9ce11beb226bcb1dc9030c35dcf04e07b8449e583225b0e928a8b51125215b4de98b6fae4f188e4b9bdb2ed787439f4f3f8b25a5416203030f3e34f914273824be12ea0fec9a5ff8f8cf3189a1ced9fab8bf9d6cb86f2385ffc810595639a32ec092dc341a4a72df81324acbb65e2b8a25b3b7145edaff2cacf9d716599d5c24fb08cc3ad2bc4be4634b76ddd570fd9d03ef3c1dd398e26621a9ae4ea2bae5aaf76c750b47a212b2bf7ef145567b0a5cfc8b6fa8e93dc0317e5fee0bcda64a34a0dd0319aceff877ba595df80a06337a5947e9d891f8c86b037220ba6af2f38f5945b15f5a4f404491cd625ea58b1d00cd6a2a94e6f1e72c75e1880987bad5dbcfa2e0f24b75a48231317966da88e2d64183f4939c5b85691caf8924b86066c2e67ebdb22f359176183cc56b51352b0fdf2184f8cc086fba11e4d03e10c62fabf49a1183d68fa119e9f027f1917ff876ed12567fc405250ae1877ef56682976948f9f50a73360690c11abe5f0901981c4dc7d2446f018b822f3c5a33ecfcf2ca89304a197cba0cf9b850476b2e389d5650a5b7b8db600cdedf8f0542333d5978d7296be481284fc6c92477579ab085efd6a9ffe730ecadb9bc11e226d039f16a72c143f62b88d38b2f253290d343e5fb4eb32f24682280377279caeed52b8b7b946b939530ceab37a4c938c1811f147f3de5528bd5d1318251c95a790e97a473f3b4f060376318611098e4b8c21590926fbf2d2640f517e118ca3a4741a3dfcf18210e16cf47a0044fbf0f0ffe08bfa7ccaa7d20e841ecf15e15df00307a5b7ccc9a9d21d409423bdf7c76ddf939415d0ff303baa7222c18e1987d363f63b02b8797ccd6d6b9bc4cbcfca3051bb2992841fbb9e2972bb8edbd4d706a72041aba86d9f2a9e17978a7d607aafec66fd407e46ea3c210ae45c6f81288c3a3dd24c7374e3db51a5deb1a43ea8254dddd630874d9b15ec94fb60f585566d43714c09dc83d4711d7a6039a8ede4da5e1c96e10f83637c781283fac66fe67307e7f528b67f9855c29cb753208145b7bf488f3d2d3960b991ea74f1c047295565c399423fd157f157520407934972872d95386528287b43ff2a77433110355f076cb028d2ba923dcc73d331b645edc2f3b4a6a696543c7481cf733c67cf670e6cc732f080b928e6b09c943cab19b49b47d1fe0a81fd3fe8eef3d3a91780ce84338f0e4b841159f8cd5e75c3f129b65ca4a6cba58ee62cde4e72846e581f7a8d56bc769cf8d25afc55a90eff0faacf64a9e6f34d71378013a439203d10b913b5a99ed2f5e62a8917aacc9e9d20fab77d78e880101030749465bd09239890a0c6fc07b4520bdaac0a97e774505782fb165a1f039d3976c5509e9baf7b25dec49b2a1cfad2bf32dc31d62f067b3ba3b0235fcf59c20e68cbfa7a9e647a69c4fadc31a4e849aed880f33aef04256afbc7d611c3a3f0eef19b21d69e0c30fdd76f88167c8250e1519b3d01fe7123fb19e290051e1e2d01c36f05081acce32e5425d417795fbb0130c3de6cc070a9cebe9a9c9bbf47e0d66aaa41bfb5e4bc86dfe0a63fa68ad0bc3a121b9cd08cbda18214ebd02c0b346a91b93b307c425ea5df465712f4452a83361709b6baed4687ed343f1ae1a0ec29e8d5092378b3d4201a0efc68d20dd18debfcb2df9a384f492aef0fb5a8744850d5d8e6c0e1d3868842cbb45438ff9a93eb1ede770d92f4b9c79cd0c805593a8a9c620a2ff9c833e464ac5a36b50a25493b90838f82bd01ddb3728576a34f842dba1efe3e2d621a5898fefff5c21fde518f997195be32277306e770d59e02a741440bc12cd55a3f9a80dcc9256801c9ea445654d210f2df65426563f7ba82a1fca17144263f72a6801f8c64ee65bfbdf1a3593b98b7d7dfdef5934a5028a02e842ff96cca0d6ad5d2afb689004909701e8a4258e1babe890d75e6ae600e8565f9369769e8d46b80b64f9a68079f8e97718c8fc48f3b3a109118a850c8ee7dcf24d67acde46de8dd358fceffc5a89d95b8fa822ec1fb11cd8dbc85a21d8c4da3fd8016c48c813555e70f275e4ecd3856825e1194bacfa732a559a2f80f914594bbb1fa62ffe6748ddef75074cce828e15ae0a31c421f3d4205ed203a104c35ed62dd815e43311840db4a9b8a95c4f1ba3a5d9de652f0da8c4621d945ded6a23b93955a081d0d0fa9249b249cd63a6b8404d2b8fbf05ade0b555349cdc523892173acd2bbb2d8c5a602816b2bd42a0ba98e9e78f7c7579a3b061d8b9c81debffb5a7ab85449c57898d3d7d015ce0818a898e0995bf19e3c5f3665e9a4642496c749f25204459fbcb2f09b20529d650687e2689dc509689e1eb146077727d7854b036b59f602b29120aa97a8ee820960aa6aa13d1d9f9e2b183c6e1c0848cf0c60254360535f646e148ede6e51dbf147c5c1ce236de0451c030325f7aa5e7bcbcf5a81b46e9fad4e6bd9f168c5d3134b24701ed6aece0755b925e5ab830a248632b6312cd9dc676e1335510b0a63362653a5747e27163b0d0d5b417303961628e120faccfc39dfce85bb5b1ef723bac972aaa7989a802bc4a0ec67447b20bacca42f79de28ab0c729b88da6eefc5c249961bb33520da5007d1b4563b2ce1302e9b1c504f91cf3802a760227351ae63ee643ac033465d924410c283e4dbb4e3e981f2478813ab551e22298c72f773ce66093a2b4a9fc0e02e06d0e4446b263fa917c92f4ff02c7e15edf148a7b1ae95f19dbb81a973fc0c4376b02d0fb0df245496e687ea8f85caad018621132dcc4720b5d695f5eecaa4e8c33c135820c35d7952620bc0b33752acccda8c4cea00a1620b944ead787ede2c3af4867c73e5898ef220ac2396de46dd966e15332b0ea68aca539c393e0825d8e6348e07e37744826bfcd6b78f7e60a77a77e8714eae8a9164e5972374cc139cdd89bf35a290cf8f41defd25495c76f43ff46e977ed4a7a13b516659c3920439817bfb0f5246142f00333fdefbd2d1b6c3ecc89e6826ab6246dbcb5f8a5d6a73c5d62e99fa6e628d1590e17aac4149d597febe8dabd24a262367cc766cb3018a7cf76c32e32d5beff8595c218df898d5b298c0b2606b405c7dbf733903b229a1daff96b0463c11183ff356b32042942d93d41390e7432d597edd5ab72848d9fed880c52de5eb211127755da1005e8cd006e85c6aee75759bc663a4fc3a8b34a87f67f1a0069ac3c8c6e7446db53e6ebf80dee6a25295a3893b14ef99e130091728a8e7c550b15cb5531b07b71fe298767a2f93e11b7f070264a888a9fc9eadd3cff7b148b02d5816cda22f038572c5ac082a9e6a0f98e07d2c43470b3935b7ca371d39fede8f45f1b1e52a38515ad133c4df8430de0031eb51e8bb6430422cd52c88e9f77df5a50ee1affba1e0ae58b60a8925835e9d128d59c7a69eb0e9edf4213e1bee42361d1df4526700d992d6ef57ad56a539642b509bc7774f630a7ce9ceb975f7a5eb2ea613c2fcfb132567267facb72340d44d1e238e18bcce563e879ed8ba2d8fe40984b84ed7ef2e7bcadb16308071fae93ebb44fc83d0bc8131502621d9a66c87f81b7789d45eef7cc60b4f19643ea287e046739fbcd64c6cb15b84aef08a75dfdd7bc0288e1da334d7a82bda360a88e672cafae8a073e009978838b62d4cd0832d5d71ad122418e24204a3e88095df3bf58712ce36d150e00d3eee304e13503bfc1fb5f9add60c081a9ddc3e5e3af2c579de02b499f2a0aa8b1170c694946539dc9ad3aab4213cc1390e269521135c7c415acd3b60955aaeef1373fc9cb4f4b08a89f28859fb82ddf1520089814546338e63d8a0e49090649e6b22cc555b9fa4a521416cbae8e982076d99da38669b7d0d2a54316c4b344833dad826bf9d3f04c41c199d8880c497a36795926813793040c0e94673d765222802ed49804983a4c625ad9776b59ffc47876c2bcdf0f58cfcb1d2ba91f3b7828c5df4a57fb14d8eaafb982e381c5df2a3e0dc9b119eaf8e0265ca5508f37c44a3a109e7ddc9808a9ceba9adc038431589329c59a09f6d9f0a5dd14554601a2c7cc7834c093b71d6d5f359242975f6b21d6adc65","title":"401. 二进制手表","link":"https://leetcode-cn.com/problems/binary-watch/","question_id":401,"issue_number":51},"49":{"day":49,"pres":["回溯","深度优先遍历"],"tags":["回溯"],"whys":null,"difficulty":"- 困难","description":"```\nn 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。\n\n给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。\n\n\n示例 1:\n```\n\n![](https://p.ipic.vip/e9jfjh.jpg)\n\n```\n输入:n = 4\n输出:2\n解释:如上图所示,4 皇后问题存在两个不同的解法。\n示例 2:\n\n输入:n = 1\n输出:1\n \n\n提示:\n\n1 <= n <= 9\n皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。\n```","content":"096221cf5b628be1e73e8bcfe626c73470853d846a3d428f680b494ee7f5afa5ba126cb6b71e6983b7c364be6cfbaa5dbf2242c49b6414deb063ea3cbfe8f124fd2d256bd6c5d4f60c2dd1e8809412155da73ec61144c917d450a23e0124585c33489e47213060d0afebc8fa7a004c65ba5fa5dab2880b4fa20f3a548a6fe26ff19f0e296765405768ad719a47c001ba716a068c6529014ec1d81a78f2a4f3146e7b2d2c6be2cc2b45662fa0ae1960494cc1c49e393c7a0f9159924434b6167a2a991bb970099166aded7068c279750ea77e9a621773a6e57761e7b533532da1d8cbd3b37a64f427fc2b25f7acf86b7f85cf34d0f7a7712da8cb0bacf6443ef3b551c7360752fec938771871d7d1b7f85d1fe52a806f810cdbf4af4ab2dde714d4e12b6082e7a1a03aa13f612d995b68e48e0e9f9ff371cf8c44ebe27e8a5eb5104c8797131d5176b96b85be8d845fc2a8dfb3b9bc86d6628b29d79d35265a580989e4fd38df07e5321e50682b55e4c810ccf518a24419330648b866b7a7a1027b913b455069d9ee5550fd4325c25861865a5af2c3e06ee5ed73708543062d67a3ef2478fadde73aaa8f225cc6edb605f7ea8ec8f933c654e5e9efbd5667aeb8951082d928c4026c62993f7d476a403f06d65d6cd3dcaa83805d8ee945666c9f19dd047128c48f05e6c9f20171327fc1add5e316d9568a649c0ab43dc1aad64fce793a89a44fea43b243a52b7d05068af5551d5a56aec43ce2c2000073312c55a56c193b1862114fab8bc723133a63f9f423612456ee2dc1d41df4ba9f6eddb22a4525b698c1c1e244bb97106cde204358fe45e24c079220cbda4f57a2c073369df5210b90de7214b5958f61d4d0302ee3d8fbd5c7f7c0d9143cd22c0938285a46102be0b918d6a9972857608e05f2a9b16c932df45ba668988a17ae4ea2542201d72475dd530232c8595f3ba6ccc36ccc2172a46c9ef3de019c9516272e31ecfd64d1064c6b85b81d7690e076e66c380ecf8de9b4977b129ce87b3dd6d57986822bcb621a3f3682ea5551385c43b445efbc9122fa140c0c0691e60cb6d92cdf66457ca3ac50a23bd431a3f241c07a20cb80aa8857b34723c9928fa4541ca23175ae18775624e567f3079c42ad23d83b09a4938d2e533ae6d7c4807e4f2e6340504a147254e18299275a609bcd68d830dca2b9f69469e15c984c6f9649c404aee3ee49692b44b002e24bd5d32124d3d5ccb8f1154ffc8510945a883fd62121d6714b118e3e9775c6ab0c8baf3cb4b0d38c9790877d72ad6c759ccce18aecb26664b3acf6545dd5416fbab67e1f64ffb98f1ac594d2d3dafc91813a8d051067a377c69e01f75f8f72571ff1a0aca986a5d2ab895a10a68ef5d4a76ff51719bc70b1b8a3ae18fc9698e8af366c80ea23aec94698d7cf0f447bb2fd4d2a91fe77648bb6929d3479c5bb3ed926da0cc86ad64727725381380cedf16ace0ea9954b379059e817985171a7f87e3c8cb241133340c1dcdce494cad511b15f2b1e2fabdc75984e5a1c80920f8750068383802be75a7d2b2dfa002863e46f1be0c4d41cddb7c1f203809b18791b3ff08677d7246df64c5151a3326aef7f4d2b6ead86b762a437516b3616abfdde970ab9c5e1462442c7198514fcf488fb6548fb2a1914b29b0f395c49129db02a89c1d32c7b792cfdbf4da2d37eca925a2d90c5bc35cfab027ca4bf03a5162e4c498ebb0b23fa7fb87b92eb18cd0a216d188ad97fd00f6378e4de70f2aa136c0b2f311cf0fe76f4048c250d3328047d2ad77068f45bb6bf82c86c5b8484746383ce15a8bfcb255c86247d35415584150b248b815e39245c08156c8d41658e34ff14366c2c8988e808d4a4fa439cc2f6757e77fcbfe62bbf37e80d4966a289f5911e6a790ef5c1813ee166de439174ad533adfedda9efbd37d81422ab2d6c66fd5908711d2e61a3ea975cd4d5b9a675b63dff09dc41449803651c2bcd3898335de5482078533ae9f1d5bb9aec9dbd70a42b1fe19eb60e449ac98a9cd79fbb253ef35b780a5a3f03574814982e674a809f8d105cdeea96162812f737b40ed2bc49e5d0ed94d81749e3517719b02169fb388bda4840f6558afcbefd7f42e22234a94fd1d2bad099dd1948c1e3e5b248455548ecda353ee345bf68fba6e206fd51ab27d80331b398d381de957c3cd5c03b8d2679a7b16de60ddbad291c2332e1da649c629f2c4606224a90d1a243b6b52464f26947c92a01da91d96176f840d6168260936ac9a4c32518dc25d1a6bdd4e054deddf5edfd12ca7eeaac969ac6feba11c8ece68f2db63a0e9425964f088dea4f7d10632c01219a0fa1c3cdf9257a802e0a2a9fb8b9347c90c0fb921003913d25ad93fb5aa8c6eb9109d69ba20e69265c7a8c3201a20eb62bc76753d4ddd2905831782d0896d8568c7edf5c01ba8e34fd47f60c1d4b5d44dc6f0502bfbd090b69802d73331b7c10ac09d6c1ae7626ac3fada82703976c056b89b690325b891814467e9b3df33a859f85577756df88668c7239d900b32b9df34fa452508eb918634cd8c76c384b85cae1dc1e2db5f1f6d789abf9e97e3f0ba3003de84356c9088829071988761c07926b636199e896c9005311e232dcf52010932cfe0095d2ac71c7b7c8d0105fbdc77e076a6e3502bdee8b923bef91bec53daf0f1c7cdd99f1c846d320773a0a83cee9003614b1ea05f1542254812a9e3630e171944f44fa41851f4c0b149b096d130503ac97901b4f0fa70750ea82770403b625d4b9dddbb46a78b31bbeecaaeeee8d0606c364bfd60d9bc1c1562730d5c5c2733098e0c96a15924f61c2551d846d28266307f393c5d1babcde8740891ec63adb7b92aaa269eec78d4d6c2873d46762079ed2f22aa216c984f418202d8568e2d337e0696e7bbb7ca44821287c46495fb3b256404f6721a51ec30d9a002977e59b3cc07037601b8c2d969708af098921ed8313e51d762dfaf4dcec4c2045675bad7ab86158f43f9a01873393892ab7a15127f3cbc57106644fa2eeb64e3378130218fdb4db689c5ca917024ba4f77ecba9cb1e8c351848ed368ed36df7aa110ac66c9d260a7a7c9760647a541580b05af96d934fe3bad7422e95ce243c9cdce6eebddb75b1f380409fef1b5aa05f21f7adb210e774431fc6fc76d4fa36cf48cc17515ad5c0d5144815d04881c718db59db630f651a5ef0e967f88b3fcf60dade43ab8c1b20921d7aa28ce46e0ab571d67606805e7205a400d67ac2fdd925f473f9c992c876173025d12993a5c9d8418b388c60b72ce589a946e9d76f50f5149654de476dd799b8f7a04c48105141745e5195551fa8e476469f32061adcfe2d6da8922fe41adee27a1c462edd13ce2c714d575550dce8eced8bbf67069a45f4dd972ef8f83d508881809ad91a2991deada2604552bbde1217d889560e8014d3edcf3ca8d81491dd3365287a62ece81512e9600f21506713297c077027218b417a9dc6fe58ca7b38e1433e37fde695882f823126f23475d35cf127d250d6953044e6e148e972851cafb41809ed51470e05506035132e6ab596785af60fc9e6e9ff0646bd9f168cadc138efd90d8324746eea8349c526d3794e31bbcb6402c1e66c3aa8e9896c4c1f0d7e51db532f2c4fab8f7b51711f1dd7e93b325fe641234ba6410141b9ee318b42917e05d0f5c4462af27446788b6186ff49fac5b67d2ec20bfb71f151cce6c004de85fb330e2c06595ed3327b1cfe35490c321b897c60b0ba5af8d60227303a772ef363689215c11db011cc28ceadaf6fba8d1fa18880eab075f3a3b8672b23a8f6e467366089683a2635590b12f3f6f70e713891d12b92c645ba4b117aea988b3f1def4d4e727fa0a4a991f9bc90c7fe0c93863541448226eef6ed2291a07cc476cf08295a5ee91ebf88a21401168c3027a55711dd3d47e1ca4d8d68c0db04d67c3a1f58339cf9343a2fe6c2cbac77b4c2b77e750cb016ea9f7df201563645db78adc4cd95b701f21cef066804ee22f27d638fcdbb79e777b8d7a77e8714eae85d82be5d836748e5d8d8d005cda2c46010ea63b6cf0abd1a550b40eac5fd04929179fe1a9a141069039817bfb0f52461b2000707092fb1d4c0ac3bcc85992e63dc5aa5926f71fb591bd3041e90f74abc228d02b4fee42b7843f29daecc7fe811e2e3e64cc792cfd4d830af73c3be33147efe90bdcc774aade9bbfd1cfe638230e116a952270435c9bc780d3c0ee52645b00779b74dc475bfc748fbf5a948a3e153021ea1b2b4013dc8b86b58d7dc38c5a397f045bc25f51d98e14a0e68f2a2d6af05baf8e3b8113f102ffe43a5aca4e61c8dafd5ea22292ba2a1659315a5288a31c85b8e78ba8b099daee406101d601943be4dea76f96634cb1aebc5767887f070bb8382c6d6414364c5f344cf19ae8e3d24d7ca38826fd113b8dff02ccd6347ba5bbe9aa8599a25e28a6d7ed3110703cc0dbf871424830d255af86dd4f68cbd078b80331b0acad8473ea361dcd31ffdd61adeb5f5f3826bd7bb84cdc06ab378452934e36243908312abbd99312faf28b8f3d828e9b0b484305bf14d411ffcd8b96276eb2eab989860e595fc24a551ab908c704605cd69cfde2f22371c7824ff2c8ef04e73026a7af150a1022b09f8c08caff08afe26fbc0a0fdfd555fa3901f017f43019103c4f8bdb86da523b8c0e26fff5354a8866d448f7ebd4bad7253b0189c052f5d68bb21497316d7952bf4c5ce6189813d83a84115bdc52d1a60c3ea8e0bf256afd0fadc4c930ea655791ca083238b4615f0d8d1922d19bb7ff8a02b8d321a67dc821b90b48b23c3173695c863ad1b7a5a8561875f3da6e2b24a0bb4c8a71bcea95a5ced33314988bd53a25b1e0edd3cf074db9276b6d9a76767a003d40bf7949e7119c9e4851b6dcacb3e39ec9958902a9b09bb96578f9b527eeee0c9c28c3c791903034a6de41d211d987de63581beec79650e0f655336a3dc06a1764136b690c234f2b97973fbcc3295287481f9c8a8fd3cefe37d7de6b127964c02f0f03b4af4b4581689350d727b5ce51a47d67d9e6d8aa7e87faca0a6155eb63f2959df657e4c29227bf9c34ec69cec0d1cf732e513ec9d4b4eef97c8ae4f03a17aa765bac6b2bc99c7181de8fef9bda8780e8a9182d7a9177f86fe5c25ef85345bf37791344140e81ab335f330e8eedba2d196631feef5442bbcb6b9ae3f0a692738e34a20e3eda9dda1cfd5a6564814ec18a79e60a95807873e0b6d6a9bfccba5a1e","title":"52. N 皇后 II","link":"https://leetcode-cn.com/problems/n-queens-ii/","question_id":52,"issue_number":52},"50":{"day":50,"pres":null,"tags":["BFS","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个包含了一些 0 和 1 的非空二维数组 grid 。\n一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,\n这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。\n你可以假设 grid 的四个边缘都被 0(代表水)包围着。\n找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)\n\n示例 1:\n\n[[0,0,1,0,0,0,0,1,0,0,0,0,0],\n [0,0,0,0,0,0,0,1,1,1,0,0,0],\n [0,1,1,0,1,0,0,0,0,0,0,0,0],\n [0,1,0,0,1,1,0,0,1,0,1,0,0],\n [0,1,0,0,1,1,0,0,1,1,1,0,0],\n [0,0,0,0,0,0,0,0,0,0,1,0,0],\n [0,0,0,0,0,0,0,1,1,1,0,0,0],\n [0,0,0,0,0,0,0,1,1,0,0,0,0]]\n对于上面这个给定矩阵应返回 6。注意答案不应该是 11 ,因为岛屿只能包含水平或垂直的四个方向的 1 。\n\n示例 2:\n\n[[0,0,0,0,0,0,0,0]]\n对于上面这个给定的矩阵,返回 0。\n\n \n注意:给定的矩阵 grid 的长度和宽度都不超过 50\n```","content":"096221cf5b628be1e73e8bcfe626c734738e268a04f8178e0a5f66275d38001030fda0652af3b85e3f4321d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad2507e2fa97c9491a0419132f42cddeba2a2891648a54a22f51ecbecb8e7962d212e3a8a072e436a04b3e258d4f20e81055a8450608228794e4c784dab4eae4df322b6755607a263280c43c7fe2879f082fd33567a101268dec421457e2c87acf5f2c58a6e88d6185a32391db521f49355f8999017b65dbbec27c969592217d9212a33139107f3177386e442470425ae94b7c399d3b622dea15888f234121a0b260115a2086ad28cef51661a41cc377c4828c8b57bcad8b7f93a9423234b7049eb9d3eecb32cb9386f8026d4e6be45a4d709a43866f0de0ab0b1a01ba21851c402a5a22dcf163d72b75da8c14aa6ba5a897481105bbab10e6e2c69d8df5a9895e003d2d4a2afe4c58a8b11af4aa893e1785297dbc29728bbd03cc93121446a2c7defcc1303af0ac31b27475946d83cb3c4de1516ee092ce73d80da1833c82f56d10f05b23029c997854ebe89440ac5565b7962fcb4001e487d20b0138e2079cbf48d04d3e88eedf930ea57230f59ba6a6ea1ac971282f3ee3c9b6e688f3e5543644c2906f67eafb7e62d82ad718cfc6e6a709919da307f10c3ab04095c01e1b74055accfc19b72e3f668d0c249b24196a24b96836e80b32b9302ad03c116d7fd8bc24a6a9aae90f55b0fce264cfeaee6d8de7026dccdb8fabad89e420940b3fec0877d4447380c078d1d9e8f3c1e7e1ae30f24421e12f4f8e1aabb6c1278497494546635b6569b2923ff78fbb50c4efab86650c8f07d78a5b7f4afb7beb76bf8d23c31d4d9e6d9c7c1c6d51536d1330238284a829886e6a9161839192754798c08ec6a00d493c00bba72fa2386146dc2146e04d94587bc69dadda2621b4f2ab6d1f9d95eb8b778e65d7f6800ba679a1d08e74f5daf449092fb2e9e276b80f07b9b2e1212a99dfc8f5cd0b94954c4f45b45af0716e343c3c290bb4941c185dfe2af00a53a171be176b4d899a8586791606db31bf8dda333079829ac00d11a1cd93faeb4504b0023820ff8e67b035b30e9d810a0a126adbfdc8630aa53e904997b9249f191224b00929c8a4b005205bade8eb5e4f780b2c283061177bf8bb3377f4e887c8c8483f9876534f92487e3149f77916a7c44733e2a6e75c24c815f501b25c31f4b252483d93408a440f330fa6780f474c71c46a7f81829a7bd67e0afbc5700518db0b68a425440facc9efbc588c9bd85d126ace1575de057802b0b9f9fb49ca4e54bd9363ebef783db8e72cb1770ff40b24037c961da8f6568d8642b6aceabcd8c9ccd0317fbffefaad940ac4839fe3f91e3f5b772a58adb8e936a36a0bd7caeba1389b2b2101609989f251fe2964c2bf694cfc13b0dad8e5e42b2126fcb0045dc275c5f830606284ddb23b85b2dfb99807fd2de33dda7266cb4843166a7e2de3fea83b8c3f299c27ee8736f6e3fd68572d53d4963d28d70da6c66d884cc47f709020b46a61d5503f21449c8108a11b7025bd70d1d9e2b531906c08e5fe5276ce3414050a12058e0414c2552a24044ae2aee3d2c5b3ac994cac7538f8681624c1fc440da22b2a290a30946927a15b16b046ca2ca91b95534f20e2e7fa0bd0817b6e76cf565f8d7925b3ba4c5971fc2931e7d95b2ef3b8bead101eda6619e5f901c04e4deb173bfacbba31a1ca92d99faa92e6bb2c0f557381c302e0affa178f85cc43e0e346b83b1ad51aebee70ca1620257b3f4354e88880906fa227f2aedae6cae97aacb985b411c39d3d1c4f7cad7f7fcf935c5b03e837eddd7ebc16c4a3be69aa2e5c041257dbadcff2f3023628642a7280138a5e6afb9d9eca06d43ade128893bdc18cb5c3489ad7d2a86b9bb89446dc67581ba936eb5ceb949a0eb5b64a61897520ac14d3ff17afe93df1541a53577e7bdf2a78012fc58991084148f94185fb681d6d7c93648bdd016d559e468be5c7222f1aca43a10c43be896c730e4b1d55fdbb86ce355cbb67bf1a0f75008ea150b1e4a51c77075ef9a3ddc5b8709b494b971a89843760f2b5209c2c7d36a03793d35e7e4ffc90577ff629e77eed4e1f102410111cd3b59e5aaa60ab73713be98fb3d2b0c8f03ff28bf4a672be7700ea30bdb9c1a15dbae75c50a14b634f2e2bda2a95b0142ff78b7b7194bbfaab77dd2dc4d090c377829609419d7a2bf3ffc62d332b045dbddf3b89da595553d4b81c35414ae0a8d84881e51a73e5ec6213625406eb771e5872381f26df2fe72a3fd5c5a46fe89eaa7fcd50a3ce90f12a7da1d07d39e50b303c6a3abd5b69378e0cafc75afd9cc95338d54ce397316d37d91f415b668ba90058d91a85e3b69bf57e40d417b11c44fb723179bc8897cb06dcffef4f411a9fc5711ab8d506a1410c046fd5332face93ba9815d52733bae627c9bd601bce736ac7e0d6995b315ed3937c6ce87205d229c60d6f85f0da66f34d42b9d2e1a07402a64e8e5920bce41251d89d784a67c3dcdf3284e967b0daaaf8fc495d7e7c9a88cf71b8af9d97cbfe80350eef96344d884c487fe600e909c43a4c9666709e3883c4087c403c60ba7a6c5106a1b432f0f29730103b9d6966c1892ee00bcfc424b04aec9721b2f72eee79dff1fceac6d99ffe2cebfbf8de632c9c7e1e4d3a7f6cfd48722f332c6a918c313c7f437b84319dab846caeec7ce1d0e35de9af0f0031e084c80e252ce77253c1edec2e11a4a0c873e93db76f5a4d6a757405edcbf9ff7fa3501edb8ef8b786f596a7ca23a2019e31dbb8375b192daa51b1e77c69253fecc0d24d463b1653872b13ccbb7ddb68b85e68bd2e032e11edda92c6f23b8f8578c82946d33e07905ebe7e7d7a7e48dafee8e2ca3fc54fd28c31dafb280f6904e77b918810f504475aae2cda4e0388e19d89642155c6b00830529e509fa7eab8c5a7036d175c270b84beb7ebb42077ff36d74a68a9fcb4ed4374ffb7dadf9ffc938dcbc165832ca611b107e5b75f3604b6a3c6c991b58129868a247d7328dff45c94504e9760fd3aef61a79641c9b606d46855dec09e3499c2c1847d265bc31fb966d89874f42ddf60e7e46de8dd328ecfff99a8c4f1b8aacd7d92b253818c868df714885bf9bcc51f94af9b1f55e70f275e4e8b7704821c1194b2cfbe7dea0afbba0c863a93eee2a527e0ee758a93bd5d6885f428da5ab5ac1546283d0c1fed727f441967a362cdea10103f59049f42c8dec7ccb0fa7c56dab601b6a1ce3b09c76ad689b635d1c50f090c5148f76a9c24b1df3341c4449292d1f359decf8982c7091f40de1a799182ff988ba3e751d26b589b665efdc7d136b9a2079a26061d888989c5fab11e09fd1a429e0bef9283935dc65b5de4deec9957eb877210322ba0ad206fdbcf6cbb0c502fc0e8aa84ab0a529d650687e2689d814c2ed20bb841542365df8667457718b40de09463f4cbccba8e092de324f4695882f86a06266c5d4662d20c246310681a5364241485973958b2be128b95ce3e70e05506035132e6ab596785b45bfc956eccf80363a2a52795df130922624ad4aa8c524db9799ba783586dc17ae24c25f3dc676e133551594f712c261dec327e25422c1e4b5045360cdb4d02a03afa8dfc25dfd895b75b53f03ce09a6de7e2d6d99d27c8aee72e5e3b75de9fac5468d228b900728f84da76e3c5d31ed448a03a5d9b111c96a0563c29e87d42c81419439185310b8d60227303eb37bb362685215a43880103849c8fd6b6e782abd02df852c8065a7621aa58fa72de2d0a3f4c05d3c2fc3044eae5496a3b39a80ac10f74ac792e55a4a644eee78799bc9facb5b562b46a0c35e3614efe9b2c1dd8f3b2c4f4e5cab9169b6d1307976d20b5d695bca0d8ebf7822d130c6ed314121c254ec8b8314ea4d09fc256bf04a1740b955ca42b54c22c7da6cf387da9ccc0b574a277c4970cd6d6204e49645df5c3ce508b46781426cea32c8653ea7d758221fccab7c82c29e30167957f02ebc4907fff8c613e8e56958d9dc666ebd283ca3e90a8254a4124e171cc62c33bdaa3ec632d794dde971e54c42f925c1e075a6b61617a9ff39bddb689e0c8d97b21bc650e84a557d9093826aedf2e92fa3e3ddb40c9af29b552198cb4adc6edaed35778703f897135fa5c8311b2385bb0611aa1bc6a4b3099a29f9baad1daea6863405b74df3f790ad65712383f2f28a1a8d5d9f053b05180e15bb176579d2667fa949df677c97784c77151011b0eb72a0ee9f4fcfca0518dce414abe2d5c37eea0c76b9a21ee3b9f0ef145ade93872d27d6384cdfc4ef66192f77a165d2c5f16afea31f2f292dbfce89996e710332bca1d942ae8deaf21852644e4acfb57698d551602a312714764146b66186658aecba19eed4152abdb2aed1a1d8def0ecc947d2fe0e0bc809499fb1b3bb6d1ca620e74219f90f72f2900399272859ddb30e7437df957e8b0232a632c9269dcc4e177b4b90fc1b9dca9a6a60ae47dd97dc05c99418f47c8ee97feb7a0a964233ce907775e47956c6b1285a089bb4fd0418f28682b17c98e33461b4f28bc9cf7758cf6bf7cae52c0fcb75673147733e6f93475d4001d22c946f6d105618f9dd8ba6dcdaa448de52bd8c54526a9d55622eb15d7ed60eb5696ccd2b6c91b386628d7ec7f90f77671cd831db57cfc020344723ea3c1a11452ddf598447eed10c6a4fcdf72c5817c9c6edf7cec6c968938fe186c89e876e89963708f58fc7c4df07da2855d45cadeb530a7e3a44984975f69483954f62f2edf25b04af426b5940385f7dbd89b338319794a35cabcfa153fa8c58d7b0cca58c67a232a384d1dc0940e6754ecc22317731421a7830b99f7ca2eb5d6d8c686d47afdf3209f6d1789e47b10552f74520c2706d629351037e6b10969a80224db5b828fee9a92301ff29a47d9d3523f4dcedbdf757453ca5339c9892269943a447e55222e4d30553791e22e8ef5656edd0511858d9fcb80cc22c1d127573c3083604b46b46cebe781af28de12c7565fbd4bbabf23b4aaef50c6a9834b7d1079d63d18692f6c5c5d3fe2310af075d60b6f5e0be8ab949b5a1227663fd47f651996955db3db3cdcbc6a0bf12d740910727d7c466c0a83c2d011b458c4205ad83ccec57a82dad7dcbfc90f1cb88ddea743113e90b3a1dd337296c4330ea7510007def25ab67d914a1786ce8d52aa6b3968900e99ae2faf5a9ad43937a6a0c0a7f59cfd53341e8c48ce8f9ac55e3c46eee50871cd4ceae394a08c8f96b58ab26c4d6f3c55d3648b9e0a83370b82834f1a1c82459884b387a70ec3df95471707db4ce57967ed5013ffecbe3bdcb0b62b902730d7a2e55ef7a8672493c54ea0c1604e43fdbfc6667577486b01d1a33d54cb1e06f31e4fb8f2b629a46a912e935056d6afb34275fd984dea8cb222a43f5c1060bd7fa88a98ed11f4310162f3701248a0796c3a60f6fb1b932f4607ecadb5d39ae4e12f1a332c45a042deec602f6c0cd33c4d0672cae565c96081d41a5e7995b909b5d0a651e37c807573414d744d8ec730d9e694f7935118404cd8f60a3ad06747e7f87bf6aa926177b51326d5efe1899220f3cb28f6dc223db5d5418457be2eda0586929270384b360f30168471adf50d61aa4b5522bc55263832c653f7c5d4e0b1af3a8cfa1d8931e2c01d761db6d4f0bc624f254f1f950699c584391b12093a597fa4cb5e7c879e0ca8c2f60a41239813716f9bbc3fc2f6c2553160f36cd61dd015fdfe572888ffa7cd052c8bc6c9e9d36e58b29ffbdf6386731903f18c10c892f39d42ae766e0cbe8f5b7f732a1f95f0809d35ff4ccea060bd7538187781e094ed6a54132b5c6e304d9dab68f15e3f9d1610c03c0468a74c522376fa5b50dbfeb3892e094c11066e0265194c9ec828e399b8655708c1bd7ee24d0b0022938ba1f0ca48d22bc4f8835d96471d7d9056744528ae00df48cf155cca40249c0492887d722c5b918331c613852027fe3f3cac2cd05096e242d133540d0f393c7b7d3bdf048c78a91ae844124f7cec767cdad7d87e7efd9ae4796146d98d86f3cfaf16a342b7c8a22bdc1a8425ad3865602cadbb8cc6dc20ee3e81de5b84514fbda636cf21c4ecb47a73126db850751af66d0f8b12ddd36afb580af236aebd4f5829a392c9bdef3224b9c660b52687ddc26c7cdd8eb33b5a38b9e39eb176f7bfea527bc37b09180606eb6e7884e35faf528f159740a21ce02122e9047f8ef7a3b8b58466a77acc01d6f56acfc513ce59f9ec0b9e462964c718dd07e14218708e7951e6340c1a395b425566fd7a707db088abdc8c25ff4a18bf1a9b627b262cb7387e4137b81deed0076a63601604d69f546940f27d033ed6f63b8e3c9731555b43c3553002019a8d75743b7db2eae7b365fca3317dfc4ad20febff767a51bb55d94ccd4f430fbcff034ce591358acb43f1002c390b6795ca17580ceb8ac1728638651316ad44da9a89760e701dc428d033b42bc0befadf7ab7f4b369258d41f15596153bd8c2bf2d66497d8bc548159dbc84bb6efadbf5834495f2967f9a2db1e97b84ced4b8c4e0d449707ebbcf73eee1ba254c06163761a1456b334597c23a9e5a96a12431ac0dffe5908852a15a5f36c3cfe5f31e954b25b2671a60fdde85d186e464443e0c83c0cb4e6a6ad230ca887ad985df0c9ade0dc8668f24ff442cf362f0608ee233ec46feca3ac462ff48e7cdefb9a0b74fc6227adb92e06c5f9303edf151a5c85ee342f6e3580a6ced28b92645d8ceb46ccfce3a938a3e9ffc9d99e9d05cd35543e91eceb66cc5942476c7da820e29c8dc858e7ba242057563be1667e3efd9d21979aa0c602cbfbaa492faf71b3b0ed3c6fa799b30b03ee7d3b1f6f8fbe2f6a4df98dc5cecb1405abfa3582ef64d2678e54a1d811f3c7a0bb71128adb0469aec6d2705e9fe6cae923294b941dac200eca81ed3de3b07334c2927a9d0d60849766f2e448d65783f9e5d34b965ed83baad2006ff6e67d23c38fd3050ecb4baefbb67218e5257641846b57e5cd4a2595791af599ab276ff02a35943a6d3bb790a6f928b003b354b5d0ba7468a190ecbe27ba09b1f3eca18178138a148906b86a2f7565bd348fe9bdfb4d287dd79c78ef7e07dd380f8db5f84b57a7f3df7cd8f0b027db68a8077602a12b99409e5938abfc3792f526ec7e3f8bdf75d35658f2e258973972be5dbeb10495ecd72ee461d203db2967436c36cb1a2e4859d328fc10d82c8706a7503b7254639f6ec7283c35a196b52c4462c169bd0eaa1a6dcfdfa57b1decdd4829c80b7a3df7c04676947897bfed5798b87db75540d2dbad5c11d67a400897f389444a9585b0bfd5d0b70da4f8253eb00702aef099356543efbc735083fb2bee88620f32a2685","title":"695. 岛屿的最大面积","link":"https://leetcode-cn.com/problems/max-area-of-island/","question_id":695,"issue_number":53},"51":{"day":51,"pres":null,"tags":["BFS"],"whys":null,"difficulty":"- 中等","description":"```\n你现在手里有一份大小为 N x N 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了。\n其中 0 代表海洋,1 代表陆地,请你找出一个海洋单元格,\n这个海洋单元格到离它最近的陆地单元格的距离是最大的。\n\n我们这里说的距离是「曼哈顿距离」( Manhattan Distance):\n(x0, y0) 和 (x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1| 。\n\n如果网格上只有陆地或者海洋,请返回 -1。\n\n \n\n示例 1:\n```\n\n![image](https://p.ipic.vip/mmk1kt.png)\n\n```\n\n\n输入:[[1,0,1],[0,0,0],[1,0,1]]\n输出:2\n解释:\n海洋单元格 (1, 1) 和所有陆地单元格之间的距离都达到最大,最大距离为 2。\n示例 2:\n\n```\n\n![image](https://p.ipic.vip/4qlqlt.png)\n\n```\n\n输入:[[1,0,0],[0,0,0],[0,0,0]]\n输出:4\n解释:\n海洋单元格 (2, 2) 和所有陆地单元格之间的距离都达到最大,最大距离为 4。\n \n\n提示:\n\n1 <= grid.length == grid[0].length <= 100\ngrid[i][j] 不是 0 就是 1\n\n```","content":"096221cf5b628be1e73e8bcfe626c734748625960a3d40895f0b427e2234606a2e882dc8c9066ecde89f32f426e3ac57af2400c3906714dff32ff523fffaef2ef2326f68889bc0e04425c3b7c49b4f703aa971879aa5419f27f435c1f4b0a58f552780630bf6d86eacd4c2f64a384f4d9851b0f85120a28e3e60694cf432d7268b9646755d0028451efa75fb0ff86ac84a157f911174013994ce4201c8e785351e2b374a2aef8d40540070b1cd79750034eb89f42659270af3078c3271a44c09393df838cbc6cb4acd9e66336dcebdb55bdd79d9f9e808230654b0ca37119d20166bb501dda07a8e1081813321afc3ed4f747fade6ce233d12cb22efb6cdaea9ed4b86b2bd9a4284454e7a02ee575b47f7dbb408fc33a74799dcc512828955a47621054a94054f6747bc5ed144cd5d20ad90b6d80a3a81c7997ee8c070855bb8127081950107507e956b0ef1b88562eba9e5887cc58b8d11a166a893e078529df5c6b13329fa3d87743a33210028a5cd7e99cf77c77fa5323b6ab863a5829bb55ca1511b4e3d9eeb1701f32e78de0339b2e670d19abc56b5a8610bfa51585450f7b028125f60e43c938d1642c7d28c05f7c08ce5e733e653233344b7677ea3828213b9fbe716ae8110a1430971293124589271c7d2e9b28395528fd37d6b438c1bfd0c7210fe8f38eec6d714703d4bc1b3dce50aebb90dfb9e2b8d3fdf9d11e4a52d171e238931af20cd18ead588d65962bca396f95ce05f7423f2cabef4b4c559bcf4d19aa58bc24168069e84bda5221853705433e76eb5d46209124bef5650756651f5a498aed33135153a6b30a8aaba708d0cc8cf30801a23dead72459f59c6d87458b6586e4c622328fd7477f95cdfbd9bed0a226910a8ed07bd6f7c784f3b4c1ea1cd2c9bd69e551546eb50c7f6d5571223c755a54c974292dc159ee5ce71c67530248eddae7f170737fadde2a40ecba703fb5136754c54f755ada6dd698825f75a3d4bf80f86a11060af7e88fdbd584b4c379978139ce4453ee3ff77aba329c6581408008acd615d2d794d9f6aefa0b40fe6b5d95619f65cb792e1893d2e5529fb883f39b1df30ac1c9904fe926b466b66df42aeaf17070368ad8452b6bf25ecbd85da699451954db264d314b690650f02d2dedd4e3a7455f68ea88fc22e12110b36fed2c1058bd82a63529461e184e8e59b7928e548878909826b8d771135498bb8f7b01ec642d3e619031b94d8e0932506a4a382976ab730e32721d562a49e2efb172c632fd828370797bd16f783c9e77a183bc8bce2d3baf3e6f1e1dc76ccd82515e327dc3b7cca8b65e5a08f1af7797e8191e7cbf22ad47a1cf72bcb7a46856990d5712164d5ffee86fff6f4e0cb5c4bf9a07d03df7191a751f06df6e09b1bc5afa6ea6229beb379049007779f7a5132eeffc66a6fb4f40a48dbae602c1f54c2ff6462b312ac06fd27f323a2ee888b009187021f8149b80a9e752655d6471dbf6bcc516db4843166a7938fea690a7049215121c42ddee1b6dd126b22c149177d8dcc56a7c2e8d7bcc647e836020b50444474518f3e008dadfc74b08bb7b5113750aad7dfb0664106ed4c31f3240856cf5345813b797c2f9af5c659c06c5f305819c694c8cc51afa48c475d1dcc46d61ba9a3ada00876af743fb4661f4c6d432d55a9d477a083b434000a34a1e65bf74fc619323c9cf18d1797ccab3d7fbba00a8d32c3fbd64d07b40997e87f85583ef446eae8e3ad07c43bd10e227293ce5fb3b15a220f3435f270b222b1199c7b667d7a85b8d9598989be6854fbdeda06279bce264d5cb039a8abfe2454af0355b4acf348551941f68295b84d3e3e7405a2fd8a238df5052d612e9c8fe33352413ea62a683ae91412d6f1b42b0cd5a72037359aeaaf91ffe7a74daef3c965d62eb54dcb3c8013c6a9b2eac889cd1157872c8fccc857c991892bd0fe23309d5f75e3860d93a91aef370d3a998542a5a75238014a4ad721dd378b548a184e9ce66811235615ddce62059562946da34697a7c366606badb02ca0007b43fb392747f80f30c269982d3384076922bdc300e384ffa63fbe7f43d69bba14a312f73d5f2e8c61659b3f1a6c5709c68dd9f0c685a7db45681701c9f36a6fbd5ee3eadcfe3460050ae13876d9a99832ba0725b3a2cd3d0e138e26d5259676640cee7229a20bd3a51530c3af79f8071fa43ad5e6b79ba85b2f7ef272bf70c9992a4b52fc0d504f1c27367f0c6dbd26d3b695f936b564a9fa3fe4bc97a3e4c3a4cad1ed0ece7d2f69e949cd8e234bda83ac34e7ba87961d8b1a93b64bdec90bb2f63ddffd3c01509ed2f4ee8bc66e65f877778f9f590896f27ad644dfcbfdf2e0ee678e4432e14e2c7347c2308f11ffd2b605ce1cf9398b6ba4910ab389aa6132689772e4247f751ad64e821c1ab8ca896d8e61f3f0f4e017aaf56510b68251703e11f249f1570ef9e3b37f7be9419d51cfec5281a20f7ff5e6849cd4a5c54f4325f0291413a2bd5cf19ac4187586f9d76df757ac0b492d3ff2ce38f441c5a66b5db2bf69d5294333bbeeab5dbf9530b695d6f5759d03571fc3a2a8389dd5f1b5858b815054f0f74a73e73176109e088d50ff7a06963335bd65efdc68296c97f65e91f39eaaa18e14f0f39b0c1ed837c465f1bb2df10fcfc50a75f3bff319dd9c148c25cba4a3e7ae838d876afbbe97ec126d8a08909fa9b48b6d2b70489f83aecf8f4f6448082e8951c7a3ce32848d0fe8869f4166b4050308d186e81dedfd38ff8d132aa60159e7a0aa39d4b758facc99cae9541e3e6151c45f6cf48a11345db785dc989ae9ce06bb586ae1f3437a7c75b61bf3f11401144018344e8b88b25778e4d4cf7931df749270dbfc308dc790fc061c0e272fb23542f220f64cf03be226b2fefb9d92918f207912380fdd3fc43d7cbe2223f785d0cb7bd7104bf433f7bac76ae85abee4061657009ed4d556698be98354c4733219581730d2e3c29399f05f2a783f35e0a245c5698fc22d3a4026d3f4737846739f35310e0f15cd58be6b9160aa6a63b7b4a41566577c541d11e03f65a7c1aeeb624b990af4877c806df717ea080ca27516ce52c993774915a531072551f69f9459c864da7241b865961bf86d22f87f1be76b5a7f186d596b7d3a5cb8172f971b6e0c575b500bad673d5ea219201afcec41ca9bce8931d3c23ebcd942450760c0318c707fd345fc6261fca927a6eeff691b3fc3ed405f9351903f2095c4f0b0f2c175adffb8dcfd73fc1479b6d583c9c325e60e626709201cf2c12023ce691927e458a716ade9a37d958b5f08530a12f52ad564d29c3d178d149dc596ab169f86c09ade0a6d2389a8916f467b305e0f45954fde9c07de9b517119a9542ad037f2a1f40b5e2c44743bd99646dfb915ee732da9b9995efb9a63732805ad617f9098c58f7b1bfdec1468e3038e95ae6a2e492d47b6fb54dca0425ef8582bcceb3bcb37adebfbcd2c0fa8e1f6b418837834a55d4d202f19cfb948e754cb913b5eafe8ffef8dbfa47981a68ccaa5c2eaa1c6844802bf970c15dd173908b1df26fc8fc6c0d56767acf347358f6c0f6eccf90b3b8af1ad6f53135aa2aab25c5c1497a96cf9782b459991409b3ff4bd6c18fac3d4a8df96d39ba5c8bd62a99fa3ddca9abea9006d1597077ba0ff571e398a501b3515717971c7235ebd496d30680bfd0a2f1aa9d98bc931233c92c14cee2c97b41b2f15ea4f0068df5c9624e3c67899fd3824a4ffe07499c11cb796e60f0a909260da86b5bf4bf20b98b058d5c99d47c7d75d09313d333739470bd24fdf1f8f9f9bf820d090185bd5c4a7e1c5501f15496e98d178372724b314924e51f37c6250bdac07a9ff9ac9fe8ae79fb070be0b000cf724259a18aaf4530a7c7f321d0271d01db5b6c164f6e42e5a524f4a4b650d05e6a6d4fe52c980932f440c65d0d51d7e13309277d338ae973d8238c2915987fc5a04bbe76746125ee644ee034a851877b0d1fbc995565e4eb15b81e4dfac070ea11bc0e067ad22c9d6fcb48c7ea502e9be5cff890c13fd01ba97a8cd2398201d0349e3226a3c05a23c60c8a7ddbc51b719ac51e643283990e091894f23a139ab78f80f96dd97e8809215f4f6d219394e24403eefdc77aaab3e40cb6379612fcc90605d66c01bff65b1cb69b85311ceb4b3a086add21e5d7e27992535fb46997cf76c32e3691ea9f846582dbce38581bf9fd0a360794b433299333e11d1477345281b7bb281f0d4aa079032ceb526cc361190302eb3c6c9fc5d952b848e714f1c1b07e57e4aabfdf7baa0578c8a143cbe675c2beeb0c7379575e16bd213ec02f2b15609c2006dc888b209f37cd7fe6316077e551d98ef09caeca694afa697c2ab413d44c2669c63e4dee528d7255fe3fefc5730d87f4443ed5569652a1d6b20106611a0b0a1ad96596ee5816ff54f3e8da648cc816a32f1c9bbfdfed38d1b61ee85b24c4b1f6fdbf1a56a680870db3985c0927ea51e28fb50e4fd2a37752cc52cc7ffb277b0b943f1bedcbdebe60af260c83fc01c9f41da0f81f8dbaae9f2a0212401ff1b653a03f43e2e538de985ec4d9900ca39286e1e9396220a640a21bc82f76596dcbf7cae52cbfcf013277d247fe1f82214f94515648018b7d5422f87c091f422ceb645d1bb088cf5457b83951662c13fbdac36aa56f58396f38b3d127f688aa66f93f309778f9201b630ca0b1b19367ec68fa14f78ddf598442eb8528aedbfdf3bcd9a2ed177ce11be709de637d94b5bc0fe32ebd03c28f47c8e0d4dbf77ebcc54549df4ec39abe3ac1188974f27173908be7b4f8538fd4ab026a88f388c8ac1f29b3383193f0567cab4b35b6ba8978d660cda43c661653660434f97cd003b11e3cb335f305d73b0884c99edae6ab58f92c698c97aedf361d16f5882ae73451b357450427e0681607c174ca2f83340b80c22cb3b91c3bbceff6457e99a04d2d85b3f16e4dbdf757453ca5339c9892269946b113b4921200427573b9bdd74fbd66f1fdd5d468c94bccbdbe622c1d127573c3083604b46b46cebe781af28de128e5f598f72c1a43f9bb0e45ffaa9834b3e4404d674563d547d214615e2310aa321935b3c5e00f5ab85b1701227663fd43b234acc975bafcd7edcbd324ee2725e0a05603604605d73988b9f55f142ee0a1a987c8d952aa8999b9dec9a0f6fba80d392581b3190f58bb07226de893101ac0d431bc2c708b764914e178ad3c048e2066b3cdd0792882fa24bc7cf1337a6a0c0e4bad2ae07340ae81ccecbc3be4a4146f3e553609c66faef94ad9d8396a58a836c4d6f3c7f8331c98006947873cc83025b0dad43dd88e9f5c347908b89237e42d31aa06a61eb544efdecfd39dcabee629a357dc1edab4dde9c585093d936e9856c4e0ab3ebc66c6e713a4a56c0a33348d65a4bf50576b2b6b332c724c555ee501583fd834575e9d451e1e7fb70b87612446cbd7fa0de8eb044f7584e3afc6c430de57075ffae1b6ccb54bdfba9372d5544733ce3639ad0f811b803cbe260237f5eeb2b0d063797df65953c81974f0c1a8cb04aff82f40ae770875a2c6e5f7146949e7a91a2c0c59f161c4c4bf7fa0d60cc24108b9328b3f1f8353bc71c3b0c755d4709ef1f7eb831478679cea83af94dbeb411c1165d69ad9de4f297bad004ed68259726f8021159f5285d7d4001a4125f08777629a1495a81a331a592543266f581e4817f18507d129454b38ad5440b1409634249a4a5457cce9507a1aba3582071dd520a7fbd9634dff6d34e1b4af36cd61dd053b2ac136692b9b49f06689ac69aa7815617f99f98c472c078515f89ef5f849ef3de17fc173c49ff86405573635995f8c7cf7cff71d4d55ca5417c096ac2a4cfb5250313205c7f3c4ddefe3a921173911608bf6e653ae20d5b385cfa5b50dbfeb3892e4d0a420e785e7c0813d68330f0a0b24d0b49cbba24c80e474a269a8187f0891d804a96bdc2548d6d1d7d9056744528ae44dd608e2f75c979288147d7c1253d7b5791c0649470ca6c27f53f2da02cce05c4831094725d1625393c7b5766f559a638e95ac233523c7c8f39389f1844931c9e96e1392314a2d582ec9fb60ef32aeca7e3449a73d769ec767a4a31adfdd9889f74a771cfde53825652b6af7dc25bc4f1f86e295467f7032155ad3f61f002a0dd26be164da67ea2971e5679ec9bc1a9f45f76f0826ef963c99a962467f7c8fc251f64f0ff8fe23feaa2fa594ac3324f514851a4277ec1e812c301875c9b40e815e07a08e90424a4f8acb8fc84a01ff5cc58d6f920cf03ab0817f5c645db11512d9c189e18b1524339852a59ba3f465e7f3d0b706aa1683560c994b6ccc72ff34402fa45d43c3f7a7bb73b75733abe4fb9ab4d1763610b04c796543b05a62851709fa020ac72d2662d1c0d8a014b1720e1894d235e7da1e6fcf765a0ff3161fc49fe5db9ff777a06e711d15a927f431aa1ee6145af973a8103911d9491dccff033d71b90d1714255d5e87e361b5fa144909a84761f791dcf289475e72389f1b5db2ef5baf725258d6bf108bc153b9e8ded2d6e0538dfc50115c9fa94a82ac895acd465f3899131c65dccb24f848aaff39dbfda4639ea50140eccaae03f4293ebfb2eb72b16334e97957ccc5594eda4e30e8141445403e76780cbef7c28f636f40284b4282cf7da5918054d4320924dfede414c27a5eaae0fbf0b1172470f43c802441c0fdc2bb03a8be963d294e7721cf93aa96f7bce448d6380361b7919797ddf18eecc7fb4e0a8c727c55b3cbe0d58967d811b59fc93db40ef76edd514373fc5304dfb0968e10f1e5346604df811c02161b3ce864ac6b9347ad3dc8c363807460961d334410f536c892567cdc2daca3e7588356a18b2b2cb5f2e6b93899e3f7d6a768517be0fe8d395c77a464a3c14595740e6e8de4817b5ed512adc67e3fc39a59317dab3e3cd3a95ee1119820759aa9bae2f6dd92575d01762bb6f26e06e64de687697c0c28eaaf959110ceddd8d8a95836ff59fa704afe33f88343a261ce48f44aaf078fa42e54429eedcc7d1e02f18fd354f06674ada3e7eb8e97917c7b50f0bc126e24bd06f09d2f9fa282f34c39c46680d3e0211c5cb639aea0f44b1791a82688d3e68c000f9169006d590a7027626db2c50492c634d30b082c6a8ad5990cfb5d41edef969662aeed59a13176bb9c6c53265670da882412e7e69f441bdf1d68e382e216a67be9665d27c19f029ca719ddb2ea5cf9d6dd0c48399a7f83c00b0af21831e2d201e18f72a52cb1140b69feec40d81839c7a28ee692cf58ea8f26e8386ad14373d645e196b50ca7273770a301a442a231ac9a7a3b7a31cf5415aa46a4f0dcc8cb08a665404d4f12cab16ebb23fed8a732076f5155f248a1cc376e4507e63bf40d0580277abc83b152fe4eeb0c63ea3272fb26f12b62386024960fdce1775d0aae0bae936a7c0a0a5c78c8ea769615dca0c0ce46e503b372b8be14b428fbca8deafabcc7b083c5ded2485534c85f900d2d048c8fc39d26ac90dbd96f20dc57bf924e693f915547e03216ca996d29cd55bfa8d7d459bfdf01b7fcd91a80c919adf485ac477e841e134c1c9ae3e940eec725ca52fd0dadf146fda6f9b7f76fef00253c44c2c1a287773af1604cf6d2220ed92d95ac4bf31315db272b957125bfa6c55ae8eab304068ced3cedbbe4984c9fc7b4075a26e18260e2eda495f066245ac588ce26d366a1a9d1fa21b08556716fe1bbc6720557deb37500835c8171f0d3a3d488646bdc44cea69150cd0b0fc04187126144ca79e88a9d9b721722af9eaab28b335e2375c48dc652acc7ae0ee2b4e4e4492d5d1ae379f43956c4acbf66f7fea4d7360b1d3d791a6f71f5668072a2c44f5af56f8abd75b3f373595a606b692ea0dd21ef8ab3f2f5f4961504072379f16bc3e91c521d26526d622f3f96dd97b87b2bc99102d21a3309a1d131cb7be0aa3c288ef2cdfd92b79278fa653422905b8fdcd40776246b7d61d1e6497a137d70b878260bd6f7b8861639616ff18e10d6051a572137f7062ed3bd373e5ee7cf516c1c58619a904f3e9a35651172adb75cce0b0c36b6a2d9367c0415b48b1dbfe4b256012412283275f5f1d672ceb957e78a3951921a7f192fc142cf0b376a31a1964b563db2200dd108c64d7d7549edcfdc230cfff516f65e1d7f2676573a2a3dea77d79ed47e5bd67ea105cde73020e7e8e4edde2f1bdf0e92cd4740f219223af726bd458541f","title":"1162. 地图分析","link":"https://leetcode-cn.com/problems/as-far-from-land-as-possible/","question_id":1117,"issue_number":54},"52":{"day":52,"pres":["BFS"],"tags":["BFS"],"whys":null,"difficulty":"- 困难","description":"```\n\n给你 n 个盒子,每个盒子的格式为 [status, candies, keys, containedBoxes] ,其中:\n\n状态字 status[i]:整数,如果 box[i] 是开的,那么是 1 ,否则是 0 。\n糖果数 candies[i]: 整数,表示 box[i] 中糖果的数目。\n钥匙 keys[i]:数组,表示你打开 box[i] 后,可以得到一些盒子的钥匙,每个元素分别为该钥匙对应盒子的下标。\n内含的盒子 containedBoxes[i]:整数,表示放在 box[i] 里的盒子所对应的下标。\n给你一个 initialBoxes 数组,表示你现在得到的盒子,你可以获得里面的糖果,也可以用盒子里的钥匙打开新的盒子,还可以继续探索从这个盒子里找到的其他盒子。\n\n请你按照上述规则,返回可以获得糖果的 最大数目 。\n\n \n\n示例 1:\n\n输入:status = [1,0,1,0], candies = [7,5,4,100], keys = [[],[],[1],[]], containedBoxes = [[1,2],[3],[],[]], initialBoxes = [0]\n输出:16\n解释:\n一开始你有盒子 0 。你将获得它里面的 7 个糖果和盒子 1 和 2。\n盒子 1 目前状态是关闭的,而且你还没有对应它的钥匙。所以你将会打开盒子 2 ,并得到里面的 4 个糖果和盒子 1 的钥匙。\n在盒子 1 中,你会获得 5 个糖果和盒子 3 ,但是你没法获得盒子 3 的钥匙所以盒子 3 会保持关闭状态。\n你总共可以获得的糖果数目 = 7 + 4 + 5 = 16 个。\n示例 2:\n\n输入:status = [1,0,0,0,0,0], candies = [1,1,1,1,1,1], keys = [[1,2,3,4,5],[],[],[],[],[]], containedBoxes = [[1,2,3,4,5],[],[],[],[],[]], initialBoxes = [0]\n输出:6\n解释:\n你一开始拥有盒子 0 。打开它你可以找到盒子 1,2,3,4,5 和它们对应的钥匙。\n打开这些盒子,你将获得所有盒子的糖果,所以总糖果数为 6 个。\n示例 3:\n\n输入:status = [1,1,1], candies = [100,1,100], keys = [[],[0,2],[]], containedBoxes = [[],[],[]], initialBoxes = [1]\n输出:1\n示例 4:\n\n输入:status = [1], candies = [100], keys = [[]], containedBoxes = [[]], initialBoxes = []\n输出:0\n示例 5:\n\n输入:status = [1,1,1], candies = [2,3,2], keys = [[],[],[]], containedBoxes = [[],[],[]], initialBoxes = [2,1,0]\n输出:7\n \n\n提示:\n\n1 <= status.length <= 1000\nstatus.length == candies.length == keys.length == containedBoxes.length == n\nstatus[i] 要么是 0 要么是 1 。\n1 <= candies[i] <= 1000\n0 <= keys[i].length <= status.length\n0 <= keys[i][j] < status.length\nkeys[i] 中的值都是互不相同的。\n0 <= containedBoxes[i].length <= status.length\n0 <= containedBoxes[i][j] < status.length\ncontainedBoxes[i] 中的值都是互不相同的。\n每个盒子最多被一个盒子包含。\n0 <= initialBoxes.length <= status.length\n0 <= initialBoxes[i] < status.length\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c0a525fc6e7d3d784a59422654a0842463d9fd231c0a9847ee3b6bdb79df883c5ba5cb3d35d527a9543c78ef08b89cbc122e1f76d3e5445d4618a6afbe1ea309484d8843d23ce10961654e0889f348f2b93046ddadebe9f6500f4c659e51a6f0bcb01744a62a35469a60d858f1a80c2e5d6ba3e4d5622487139b0fee2b5748e858764b718ba7222ea0bd8c5c5d1e743305aede7f23796ef896771d4224a8f3f478271b6eb527eb4f7f19a1b09e1714bb6f0180544073e6ad2582c39f13b809f31a5195e655680425a09772b18ba2cb077a4df4243a620088e6ddcf90345f34d6e9ae770a93f311b7f88d40f0f003e281e9c450cb38551446f9323a5796b1bb6da61ffd38b99dbc22e8c94af90717adf470c394f74f9a53fba918b8b27d5fac90573f804d5191631c9f42a574da9a771ccce4d1ab4c64861d55098a1d2268573d426c599346e3135ca5979119096714f66c15fb13bbd0f6eddfb56503b52943b764dd4675263bc775eecfb46d21b1bfaa8db55f49fb53ff5128e84c479eb970d19abf5fba925b07ce4752746cfea32b1e487de71aa18e326cc5cfb207effc8de1c231eb5e072794219e8a327272d9392469c446e29d6df6cda2e6aee2c354a6235910460f7eb40d31aef6ae4fa199177802f18c21d8cad028781b552220bd8a20bddc018bd639cc790c55970a54b6fbea99c036d35ef74a90c0dd9d4209c381f79f40769732c90c565e3101b860b3ebf297b6bfc24168019595b3813a1a7257512bc4a81faa2775262eab791e27732fb587d40e6e1c297e7849772e7744f767e44f34a006d333cba2784f9fc52138c6de0cb4d380b49ab86bf8d23118e5d6fdf7e0fa3a53f0cf5fc98d38285d451b30e3b708d6a9972665738f2dc9a9b16c9323c244a75a8a68852a97412d738034582cc210783eb58cfbe93a712125da55339932ccefa2b905b20aade6770102fb2ed5fe15bf5787c95f60c7238db7d649083500e7041dc99c4d588fd304ccbd5d9642625b11e1987f1067423ccf4286dd8542a22042501cf7b109f0a40bb12c7938fb8e0ef12f9565a4b31ce8077dceded5b526c45258af82fbfb4370c5341bec3c140f2a82fd9a65a127db159e4725e9e0be471d2aa5901d5af89ac3eca6a3c8c081cb3e4e26f68d6ca7d5842de45a3d033a0bc5ec74bd4c768248cf1fa3d0c081c3640b2dc215f0addcc28e7fd4e18df3347bfd941897568033f81521e263a68129f90f1ba5a76ee797b4b47a48fceb92ce1e4627a5edd197ff06387d1820f22519accd3ab0455600edd839fbcbdb21823f70dddcde92a7348d1124a251ff1f1db62bf7d91a5d7cb281d8c4bad186bbe10312e1ffd29ed84ab64538e332acc9f9bc7ba987d28fb95a34aa987cb8b019abbcb1323d0b8db4243fdc956029f799e4c1060ca393568519b665d927aa5a591e6cf45d3188997799559af22c2e22b64f62ec4d1be2e3005192f91e04713dfe9dbbc2d19bf456e65a6f623bc18975e63e4a50d0b878d85b72d69ce948e602083f7aa9384503ec3c6fd3b68e0aa7edfc854e97fa92f1172df8855edf265bf3436b6da20256ef6155246d9385ab45ac3673640334a8e6c19d399ac4df552874dd18810ff3f885f87362f808271465276b675b0655a0e4759f8a9e237e6d10100821ed65f81d1604728da63dacc598379215f25ba24d4c5408d1a1fa5d91ee6392566fb173bcb0bba10bd52beb506b75a99066f4b84c6c55600607fcbb33a5049d7b5c4724ccb7e749a7f2e915cd00674ed09c2f3ad5b04029c410376fa1a36eb594ecc89c4c77163399d296a588e0c9a0a628aaac559e4d84e1d488453a09ac97a2f8c5542278a5b0fd337c70a43bff14aff3d6f5d8dafce9b9f35dd37958888524f219f351fb070747eed8a1f1d3750a844eeae28113cdfff434a7be19480ac008286efb0364c930a8a4b57e46cf6e5299f5edcee23ab22ca655f937004c8437e694a880e64f33918462c1119a5ec1155a822434eb4d137ce08c99ad94b3cffa2f9290cc36cda7ca4f90cdc03c64df76681f2ec362b4ab015bc205c86dfe61071ae9067dd7a7f8e199c05a5725f9c8a8a9c7406b2017c9c7616f8f6de0cff6f1327c0306fa3c62eaabab3cb60319be9efe311c0d8c2bcd2bb846662aea732a9f08e2b5ddbd7fa75ff00a118f38cdcabdaf945a287ef3588070f5a6ecf7e3fc0e564d201e345a356c9215d3b9af3cd96317b83c45dbddffaba2a6aa593853ac2c010e268a647f09e8a8da54147fb9a6eacc0def40acff1ff3bc62a3a864d259e69d38c2c595bb858f1846840c7afbed6975dee7ec00caae92c1a7bbf02efe457fba665b255d8865ab7b97f9d35cc6568a1cf321920adf0feed5417c1da8138e082e1a2eb910aa6e64afacc25d12bd6f98ade153f3c527788cea33476163d0019f5a4d9ef6f8df9b85d60017b4c901c3845d1af8436ac0dfdaad4b3374db54849d682e2fb8bdbc446ed0b1c3276fea6884c3e0aa7108a75f9b5917ade4157b36c16a230edc74dd1c9eea6bac1d029360e2b8c818c1bda81283dcc491106360cc9e1230edd75599dcc52e884edc5fac852988b53ce0071be9f19cc4a517d4d8dca6752885fcf354bdb0e347c8a03c5cb21cb3146cefcb4a23258f6859b926f50a3817060e3e583ad51d3e240eaad34ccb9cccbebe956aa999a4f0cacc467fbbf3d399e9488e111452f81726de740224f592c303bedc7d3b29b896d360c1a03d2662d09a694e47be2475d2260e0f6a685e6fedbcd926eb1abf93424264c90b5c99a0e8c02fa65165ee1f3b4e392f867eb2d77d633e2e5a3203c3b5dc1e74998dee0cb76db1ea4ebda214f7b5989b580d654a20f54a49b848f70c892db37fb66ef99691918626bfaabdd840990f93d46d95708089ac8a44bf4e41937ad0c3987bb925aba57c0d0b699cacb16cc98bd5a757cc783d3c451b3dd4e3ffba99ea7d227f3c39f3a347db7882cb20396314d1c77571667658472148463ca224882dc749c91c59d9eea15a0a660d0a3047891d04f1cbf8967e2fe9148ed65f25bf6f79b72d45cb6b9cc150f291406bd0274b5e37eb19e682229358980779c78d799e34b2b76df5dd08d190ee88b9a9d7b8e98c33d6fb16d2c8decb8c41de18fde4c50eceb6fc3955ac4a7e0d4e96777ff9611da6e4c3e500fa7196c74fd47995a0a8f96ee3ab7ebadcaf182785f928ee73c8ea6e2539463f78e120735e0561a42391a25f487a0a048242b3cfbae6782d89933a7e876e60966cb5098d120a0035d51093e1632fd53b9759911e10affb9710d3c684a059c3cfb5c1f341644ae22f77a5c7b19886899c40c27b25976615b89e8236f0ed2ce1467b55ce99cec2aefb5756b45e6ad879aac1838e5dbd202099d2ecd05bed876f1e3349f2f5217a88da25c07c7af6525b252a1bc5ce27752c4066f2591fe72e8b8162af7e14ad0573f1e8bbdb28fdb3cd22b197b5ba930956f228e56549fff46a172e65515b279c0c7d2538725f4c687c6982976314c1ed129695b5450dec2e7b0f2a1ddef30c7684fa1ebdd720dae92c2481b43bc5ce1330164b12e09a8c297c8133cfe2cd4370cf73fa53638199346e0e352a4b43266f64608ffaa9d887d9c5ca8bba296b30d7028afc553d3ba14517090d7179a773ae8727b4ffd98d9a3588a5e768576627f483b15479c238a92a21dbc58e23b0cb9f1ad45cf46f5dcb4d44dda0562b6cad6a0ad7591e08c587381fba6069365ab839f7733a87214711db1c428980ebc2b7eee6c4f73fc70aee1a107f7ece35ee7a9e73476f286cccd7ee3711cad14c426fb861e505cdf63a94e3fb6df5a62761553835475c125fa817855b5c738dad9ace24488ba78af8c1dc83bb17a9606707d05a20a4c685e5c49ceba6de75585437907471612b028db03948ecd8ca9102ec19e03d5ed649e8271a997872de967c6ff889c5b779b9178da37c97a22009633709b497dd4cd70a35132fceeb4ccd0bb33e15cb161e567317f3a71ddeb248ed870d1711933853fbc641c5314a7d74a35b7e44709a5308ca210924e06ca160d83d80afe47560706ec9c35b40fa3286011e035a68547b3fc2e6d282e282b89dcd2724bd2240cbc77dc9092466849c61dcae2d31c150df8366a05612ecd78d978d8381022e623f8d2529e706cf13b92b66ab0718a0b65f583c96ef92b7b189d6b5136373edf451abf48422a7ace5d89b8b7b3c24123dc959bf184c9c0aa7d42d82e9402c5e46d5bfed0b21b5d796dcf257a6c7577e051222817f069f9d7afffcef763a008c74e4298b44bf54c74f2bbfa9602a7dc894af09eb67dbff6f57561c590a91f042c5fda19cb5bd7b06f20d68529e5cc07fbbd0e364992444f9d4a557658b7f5f4cea46652c2876243e1a676aa3cde8ff96587bea927fae0f7bc8a149988e123bf5f2d8aa869af0ded55e423ebf858aea137e0340420570f019f6a6fd33ae4fbb1eb86963a50042e46cb14f0924f2774f8c1b65516627299b4d77c2b77cb650c54fd3343a594532aae4eeebf97ed690d5a662fba0ed4b510a7ea87a8817b3a1b2fc5e4ac78c91eded071c33ed163331c267eb6e3868b9efe29db6001bb7ae2283e08a45ce715e95fb49345b73963f2b862536a12627d6ca4b0aafa546927b0f936ff0604c0a49d93bd7bbdb520f930024ddf43d6b895dce4ac0ffd69cd3253d248ad4643a04e8eb08fc43503d19921510d441eb1dbb779b5223d22e8e9066639a6b15b29c30bf21c4eb1aea507f91c1053129906f7c1d8d1c1dd19caefc94077d4545c05d8f7eb4662f8bafdd1d702af71895faaae80e2f369efb0e511fe7ca66ea02b089ff8cab883374c790a36708c79acd91ba1437c7311b258f0fd6baa0f51be65137b934eee8752cece2d3fad8d7a093c163b5fcd18f3d0ac0fd69c79960994f6309feff6957203ba31770cbf8ad561e52c5bbcf6653fc5918e7f932fcd6ffdad88781efadb76138bb492ae1a86fc1813558334e125e9d047990949c92a96d4b8f15cb2e4f11669a5bd722a1c45a9a7f6ce7235b1bd008305bd187929472b3ed8f91f0918e9261f8be51ba4aa3abc1852e1f0d9b094666326a873be5ff0e15945e50ac7521faa777bcc78de1b6d987aeebac282e689e72f075e4c154f95957bd19751175210ca78c315620039ecdba0a1a660ad6e16578bbc24f96dffe440cb135935a9dee100868a23691e7e94c984530a76bc23a10a1bd6015506158123ac8878518ec0b210100d384837977cfea3fa0437d51081c482c111023de88e28c9a4fc84e64f212e5f2092fb49fdc7917948be1f9ee4f8fbd8735785414d049efba0bc0de2a601fca565162ed62f1a4654f6cb13e1091e956128d2c1bcc86950a2f5eafe690aae2fb5364efa959a0e163cd92341e1803c70eef56ed50d0266e1ba4be7b33d49b8cbf2261affad6f23cf052235436ee6ff7eff249c8d5e312e0bd8ae6062ca064c783b14668533bd3c2891075576812e8861933a7ec98749ab79a85a94a54a321b3473bee0c79aa8505aba7e740f039c47e3a680b7746d39a4ebb85b8db893c604948e3f60f388828109a8371edacf1637a90707a86abb8c5c1738f8e6ba2937021fc9b159a51be2fcb1087958f67121d734c6459d66de4e6737fac4b1663f2116f726eca1ee0d2dc9efefd26dabf5edd7ef78e1d7c32eb9fa4ce665d016750c002bfc99c0b49135f6f0101eb994235c9ca12b687a31b6f3f89134331a3f85690ae961d174aa52995499f47e1b75d3ac5f1e0d60221d38fcbf0e3534fa0ccffdf29a0735a56a3ef5f849eba9043fc45791aff9b40457f2a568eda809d35bb0a9da827be69394132defc88cb3b03423b767f3c4ddefe3a921135de44539d272b6ee2445b225cb315198fb7f2c54c0252075d207a2c5d409e8b7db1ebf7325b08cbae2c890a14546ec7cffe8bc06080418bbdd7449d7d147d8e56615538be4db31bc7520e8304289c47c7da0f3d7b5791916ac42599242fbc36368a2c9305c4831094720a5e6c75797b7567a457e375b90e9b6671357cd413389f1844c454d7daa4392b15badbdaa19eec11a96cabd9eb4d96738667bc39716838b6d7d9889f74a771cfde53c30306abea659400d9ecbb7e69567cfd1e0e14d93f61f002a0dd26be164da67ea29709177ba3c380eebb753cf0986eb22690c9ed6d1afea4b3771f6cb9b1dbe276eabffa4951c37b060b484db774638bb74eba7acd219b4bf515f57308f4197f9be8bcadf5aea01ff5cc58d6f920cf03ab4159a1c60b9e46292dd016851bb2140d3ade6227ba34461a2746420d66a1267071ffc6abc4c537f74a1bbf1c9b31343424f636624d37a11bcbee1e6c2a1c022ec796543b05a6285170d6e620a43c97311c5a118219181f3db5925b0f6c00bff0e19970ecb32126b9008748b5ef777370bb119f1fc5064304bcee0f4caf983581cb07b753757e5b3fc69313124ff9a0ca72c27e361b5fa119ba9a84761f791dcf28c630b376dbfcfac73fefef88603ea741ac22fc557bb4a7876c384422f5ef4155c0f6d5f62f99dbe9831ddea79d38d867b1fb1fd0ce99f9938c954e34f146137bfeafe21431c0fdec20ad3a383f45deca21b7279eae202be80ebaab9c9800ef442457b8eafeb811c71320b2757e3486a3feac86ee6d0a620a98c7ca714158f13fe48d7acbe18b77e7de44862fdb3ffb5b4ea13ad872d3aa668b07a6c2688131f348eac5e8b1bbfe1c8c3673d0a3ca6c5f9303edac7ba5b90ba64a99ff311912a86fae310f8dcdfa719dc52cdfa00fcd98969ced963f8a0b9a73bb0110e4000ea2b36f7c44b0df8d84afac3fecd0b2aaaa1382eb290b4b26faf052c5f7f556b7e19ab7fd55320af9cbfabe12aa30cf731e3d086a0714666d221e3de6e3c34802a5fd4123dc79e3e9729f831ef0b3e3cd3a95ee1119820759aa9bae2f6d886f4fda163d8a1b46842b33a715768ac086a2a9e6455a4aacded08da1a261abc6a949eab079c62b6d2617e49e5faaff72fa8778f7a5092501137cf7951cfca7e7ee9d26bfee1a37c491021a9c1f05be688d66f6cc300d6db18fed5b7fcfb3d9b3dfe278049b47619f8134e4de1ff748a0df06bb239c71ae1458769ee1d21cb0cbc7eb84dbe172eecf88a27390cfb5d41edef969662aeed59a135e2db9cecd61602809a882726f4e28b419c2b49ec7773b6f3a20d68f6cb6394e8920c36ab7db2ea5cf9d6dd0c48399a7f83c51beee38ed1664290532f72a52cb1140b6c2c4c40d81c5d32828e67d48a18ee1f27483c5e2132d282d42197c32982a3b356a58674d00231ac9a7a3f1ec4ef54913ea3e4f44ccd8f69a755c1e80ac78905e90b249e688442063e5054f2d8a029849f4406e6a9540d0580277abc87d5a7de4e6f9886aa36d2faf6f53a36288465d299ace3d3fdba1e990e936a79d8aa5c78c8ea7696106b24958b13c1e3b656ed8fa61428fbca883ccad8c33654454e91f9c771dcf8400cf890d9efc729532ee37baafc002eb73b67caac7e5050e2a4d7f393c36631a338f764aa7df207373c18159270c894e404eb6ac4eaf01e433e28c5f02a219d83f36d25ec774151b94b1637cbd7fb36766c5c8508ac4d1b8ad996b91bf5aa8eaed296c54960036eaeed56cac2ffea41f3dd6f168320bf595ef16732992b400e19bfc32403cec6e5a69566b894916406216f819d8e57b1e237ae078e34300072245f21bbe533b284fa10317134ed23d1f0d3a3d488646bdc44cb743534382b0b604513f7b7d03e9cac9e097f2654220f5faaa1dfa1abd4e4762dc652acc27cab330640e04d2fffbe67202826ba4b62d77fdb326cfd5a60f63dd9b8cdd1256aeb0bce5f3612394553e3eb8aef8e02170c16b0c7bc948b0f8ec6d661b49a5c8cdb58d3bd03391550ca55497ef55d01734a36a990539791db4ea9105f402bdd5d679239645077a21ea1918b49dca0f6cddadada87e406f85ede4822f4c1d1a0b9fcf008302d0fc2ce9fda169e2a902ce66b537b083da7bf496e383eb59e858b10e7bce6ed25a49428436c3476167ccf7de9264b064577f5f96accc6ffe3db0dae84c156eefecd58d84b805e1e3ffd8e3962d2df12bf39a3366f045442ddcae4965db0edcbac170c54ee7f70e8157885c47960d297a44d4097f80b0368b9e48dd873cb7f1dee3fbab41d357178b27d4db7dc30f226e4b8470e0d485f2c818d56125e723dc6880b98d5194adace73b0a29144f3d0748b441aeb0ff9d54fab4a603aab9d4e21d2d2cd2a4ab3261c58596ccaa7bcf26845ab2b12e4b0ca0141808ad0d9590718fc422cb6c3fa93f51c91edb1e920856624c981e08b67396fb2d2c8097a152dc6869f1871a04267ac41793ff260643feeeba549236b9adb38120cedb83d3dddbb61d2a4b48700978ae91dfeb2dcbbca0a03cb0749d53b6792ad56f812bf12eb70b6e46b42247f4b87875287599bcaf0432a3c8c9093b81aeb145ad82e775cf8de2345933659c9963477b6c0dc8b463a74d9174a9b32468432c32483b676e9c867c394f266da94eb3c5d1efc5bdf5bc474324232e473b3f67f03a3409c64753d14a7faf3f6359bfb68e3d4491c473947225baa53b","title":"1298. 你能从盒子里获得的最大糖果数","link":"https://leetcode.cn/problems/maximum-candies-you-can-get-from-boxes/","question_id":1424,"issue_number":55},"53":{"day":53,"pres":["BFS","哈希表"],"tags":["哈希表","树","BFS"],"whys":null,"difficulty":"- 中等","description":"本题和 [987. 二叉树的垂序遍历](https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/) 类似。 **因此大家也可以用 987. 二叉树的垂序遍历 来打卡。(因为 binarysearch 现在 down 掉了,可能打不了卡)**\n\nGiven a binary tree root, return the top view of the tree, sorted left-to-right.\n\nConstraints\n\nn ≤ 100,000 where n is the number of nodes in root","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c18f29f07c663c784b585d2955978e2463fffe010b05aa43e00c74d447ce872661affd1932f016ab682478cb39bbaea21e1a1776cdce467c4918ae97b23c910e55698f7ed6d34f8da4e32a4dbea502d70bdfd66eacc2effa723d407cb6bc0969bd8a02aa33a790ad408370e335134b57630c1370f148e0334cc420b5637ae507d5e3833f8ada4306e6e7890b1f0e134032ce3fa7b5c99d744d88d589cf630f5bcbcffae2f80385dedb7bdfe7cd44c834c78444842b0bb2fe02a5e2f671b549bc9ee45b7180ac624ae0c4b87e543b7cef1922a02a75ed8f712c121310cde5db684a6122203a26b32130222ba5ef5b6b36ebe372c5015f1479e5fbe6e2460822a8fc329647b2f2c6029c8a779a511fc98f56aae8c62dc35477fe58a4b2795ce585577c894d40866f179e09e8799bc57501c1ead8a35238c40a481293012c245871437a549347e31e41b1cc970a142b1fbe775eb000f9dfb2e1d1bf795dee512cf168d48f300f67b867b4a3bb07be2b9f457675d9ee5551e06f29fb5a61874857fed1e34ef8ee5d4a43ee85ffce38e81e761558896793fa7866a6b0a863aafae7b4cc58b66a43a729cf4f0dcf94e478b8a48828cd3770fb414d2d3b6db18d1dab2d451d540371a30a1be169458c19c71fb7da121eca4ec8e60c731d49c796d6e519f4b403d39d279d3dc7ac12c4a7202d222b9303639268f4313c1b1790a547071710b08b27eb8b175c603d7c08af3a077152785a51ae9e80096d3266b98aa4af97c502ed5948e8fcbad6268c98b689d336335b5d31acfdf89ceb11aca2a63c8d1784d379a31b2484c6166595d80925e985453c3247580566a4a6d77d997c016961126a681cfffc53e6c8fcfed0cbdb867141f1115d66ad92a61a96082c1180f6ae359262bf7d8a572e9d4c5422ca4a9775d17b0a33fcd0e0a36e524f8e789fb761902245691073c43ec89c5b8bcc2b7fb680f43f5497da586be4cc08f194644855369669049dc3593de3ef79b5b62bcb6f1604008cd37552196046a07c00311be366714a2d7eeff859e8ec648c5016099bd110a3648e07d3af4f822c3987fbb9e70cb02c4df0c9cb8d3d4c8c6a198a7a0f654d9a739769a625c90796612debf483460b1f80acf5d01e5e4a0f4a212e3bce877bd8ef13f06b91cd853ae99c9d93300effe267b44d4eb146f90aaef2fba6e4bc87d51b9928d999a59616a8dbec88070da2b760ce46e46ef3487cf21fcb994a9f0e78e1ac0f88b6d2031217df89ccee781b22f6b1c6c6b9f2f3fcc3fd75d1f42b3fdd24e709b5691f6add8f8f27e8795a83585556fc18cb7b29c829ed7c4c9d4297e37f207aec3a7f01ffe3c2efe76548c3a37d021c179f0c52e958f6e496d877c2104246033b4395e80d90c34a9bd9f7134575acf366059fc376679893929f0774f5803ff91dd516cf6bee6c25426a812022ecc46fcc05a693430555dc51159975748ade7d129fb2472a315bdfdfd4c994c2e310b96e2a0439a0dd5575d017558ec750b3114e93ffdd2e8b04475e5de04b637e8636078ea8f8758ea4b49a02f3c33d135132aadc769b78579e1c652ce93538bf5e017460ffeaa13bc13318163846e5d7bae526d380e31552768d478a7d89dbf5be6a1d9f104692015d751e1b1917d1ec38ecaede641f5474b2a806d0ff145a35590d8bc88d11c59821719db90188202e4b5288a619cf501df351f9b50bac653a0d6aa16ffc0cc9ae8b5818a21a389beb8fdad9d3500cfa2cbb4bcfdaf2b775351eb03c7455d31ecaded92725bede0379c49728cffde36325814c100b201694b991f46547162f4d0b237405b5133bab48be365d0714f9dde1652a5b700ca7a3bf4f1509ddfdb902e55fcd95a4e23d80d59089999804d9c48b2fcb65cd79934d85520ae3e5dcadfcd06c098372eae7ac13c9d9f41580be2948cc50af2e4ade0043ed3dbea4ba6b67cd6a7099c6fec1c531be018b55f937c4c22c3ce2a1aa9dee4034888548c719bd40c2305b46aeb8e75c22b95dc0fd943bb1d5f22fb7b003bb61a5de4b93dce23f55ca77481f2fe04bb9a43056e932c96bf36a0316e60448d49dd5e19ced577831fcfa8ba9f45d6b292cc4db746f8f70e0dbc2ff1a6c0317f33942efa8861bb52238b285d833371d8d27d82aab516c2ae6713ea704d3a51529dead6dc70926b035ccc4b086a8571451fd65a378d3b8a5a5e368d98f8afde7a6e4c0e720fd0e28373cdb4ad3339245edf5f2838ba79e6a324480cf460a61d1730b64d4dc41c9dd0781e3a3f169a54de9a6368ffc46f1d04aa3d9545260f689ee88f4d20e3ced171199d11d38d99251a30ce1a9a9f8889378e90f13b72319301bf452d732a3ab8c6db90f826b9136e7a75fca86e026150d07fce70a687503f943a82a1abbfa865a9c67ede4f6e133aaf87911b28c53682010c768fd421bfbca8eb9b125d50702b7d42ac0a16b1cf76eae9efbb5cb52682ef433faa1257533dcc4a21b1cfad2bd14df31e8340773306500f4538e00036e55a1b36de0266039b6c1a15085823ca6b0d5f25a9f284616e898a817bfd6cfad8b9d835f69d8f56046e8305fd52ac042c153ad8539acb937a3575c622475520a991c096f6dc6bd5160739e1433f2329ca07c19fa43b3506c9fb04a26f423d993059b24ecb8a9d4888c999666e6939adb1b6db61d55604bf18971a784ea711634092feeacc38de9f45196ddf05acd8b67bdb9ff367512c6640cb4eef27c7209ab327684b2ef5c4486dca75faeab34b6e1feadd7c7d347653566ff6ee0a11d3048b59dd195bceecc27a69eaf1579aa96b92daa40b2e34d62212558010cc0badd1c578780e23473e53ce672b3a10eecb59c9755024e4907d18fad72d56c4ff70beb32943b839de5d4ac592317e78b00df46871ec01a7d9887aea67ebe75519969e5c0be6fb904a7a95e2e0b768daa896226ede0d00add1f4f073a6a37a989cacef2d508774c5863dde625d11be7f672537260b7ccff9dc4df5a61204a6f1aa103ac2dcf46ca3563d3dd9e592e76013b17468b1f04fecbfb87552fe40b4a469d28ed37b12ffe8d2f90bf0ad4600dd5848838849b86856a271c55cf42d46b78bb66a21acf6820f66d1ac9645363286d714d7c32407dd6ea53447a6fcbb309cecc696f0d844560259a936a8ce1ebda4dc2944d80bd196c623fe251c27403864dac1c7c7d7e9b042ba57d5b71fcb7254602bf0bb6e6d0fda6f4f68b2a82a33a6638eda75259d8ba9d9ea6068a57650f4d1c75b2dc5a7edd37673780f22ad06c306ca9771aa0cc8699b161bf19f13475fbeb6683300b1441f51b58481521dea18413a9994e4540015c3343964edd9d34f19b585416a5762ef738110b590b4b234a763bd7b95cdfa631e66132463feb01c1c821635c5f9503149cfbba83396bd2a4a2ed26b80194a54f2f602cab209606e6c10743ae290e8a823f4e8e4c00762ad5d32e671454f407b0c049e6c2a5f6cf5a7ee350a62c1d98d269546f2b1512268a4a605a3c291d1630116b86c46d1ddeb212ddd4823270ac1040574c0eecb14939cbe603bbd63a82c301259cf872efd0134b6d361e9be7805252b97389a5d54b68862fb6676d95f6646e133551594f3763744ee07e71650e3b1951171d3e0d97117c8a39fa8dfc25dfd895b75b00f33ff49475aeecd08dcf7b86bbeb61586645b7d3ed073bd25bf64c27dbcd9538f9efd35f9a1be4621bd6030bd2b75d6776ad7542971c0200de9b31188d60227303eb37bb3625c0680f52894d0e8f8cf1dfb9e9fb8ff718d907ee41653b69cf3dee3e9e7e53126f6c9f83af634499aa057b6f6de71f9c7e5efc2c6c19ede544f0e19ad5b4dea5cecd27f5054a5cb02d0fb0df2454d5f29bb58fc885ad44cf294b099c0870f993d3a1e685c1bac37513116ec30f381c254e81b87e4ceb8bd6c24deb4de8270bc15d8e6254de2c3af4867c73e5898ef220ea6c80a557928c5d157e641ea0918649980a5a5d689aa366864eea6d6e826bb590b7cc2b32a93632ae2554848ad72bb7976174855d9c8dc6ec66ebd2d2c47fc0f82d455d2cf432f471993f91a8f937256443d59b13139072f2255246142f00333fdefbd2d1b68aaac8dd7c3af63e4ed8c703c323387b84df2e92fa6c788f159be129f8131099dfa0bc82b0c51626723e9e7f2efd4fcb02fb6c62ac7e5be4f81a107cf2aad6d5fed193e668784b5b21c77d790fd1503d4d091378eeb6ddd0bb17aa7bd8fb03ca2e6c912e7db5dac9a3339d6f8ac7250a514841ec6f01a2e1a4fea648878a5c16e67d5c7395a0ba3ecf288e11ab53b142d58ab892460023c84018ab658b0b6d938630541c581127e14f054d1e7b735c2e48d6d6b1c017be00e5de699641aaa7253b31fabf2bddd39825ddb0d7a2bcdaa2c4b8d5772f2f571ecfb50d00844fc4ad2220926003a1ed712a46462c3936a7d53b2f01f6e0aca9675160eed2cddf18ba012810800b8be51ec32d75e5b6c4e96eac4e2036fd426182177f5c6c0329b74db852f7048e0f41cc7a89e4d2b1fbeee725b4f518613b10c47da4e7e4192c0116c36dee4aa3e2e4cc2102c4e7f4d784741d7fb330567af8149745653789b47d6a7f632ffad123e69bbe00856a37c0d10f4a593eed1679c9336ac40142a9c621508ce405a727ac32c55ebb8a92d9","title":"Top-View-of-a-Tree","link":"https://binarysearch.com/problems/Top-View-of-a-Tree","question_id":416,"issue_number":56},"54":{"day":54,"pres":["动态规划"],"tags":["动态规划"],"whys":null,"difficulty":"- 简单","description":"```\n数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。\n\n每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。\n\n请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。\n\n \n\n示例 1:\n\n输入:cost = [10, 15, 20]\n输出:15\n解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。\n 示例 2:\n\n输入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]\n输出:6\n解释:最低花费方式是从 cost[0] 开始,逐个经过那些 1 ,跳过 cost[3] ,一共花费 6 。\n \n\n提示:\n\ncost 的长度范围是 [2, 1000]。\ncost[i] 将会是一个整型数据,范围为 [0, 999] 。\n```","content":"09613612cfd488c7f63c83d7e527c7f9f538fb2e95f511ac086675266200002e1f120ee1e04ef31b000b9375ec1379d746c7801b7d7d4387f3a827f1371e35a70cdeefb5745c2b2281f71b226151dbbaeb62bf491b7de5f45eb131daf7b0f6c2162eca0c75b6942a2c7c0471e4d2c7b031c656263946f6cd6da8bf827da419af65478faeb180c4b4922caa3edb08ec3bbc80c007fce380f6cee2237ae5bc1fb1d7b3762526a0eb492d434ff8a06df2ec8a6d4e9f05037a3db1b506f9f1f4051358ba6711e2c50ecaaffc6e64e74d77059f7cbe62f9c11a2dcf2886be690c3bc295f9b43ed0ae5694fd030ef6a4fa87d7070b6aee8cce41652a6dce2a6a4b06e2b771e5da80dd39b60d2e53738a5b3ffb9691a56dbc2fff0c8b9da43de8e27afa0c01afd267c0a4d0489175173bdf287d8dc82f377259c60b051baee01df768fc7a65edcc1e82bea65f2be19ab8d000d3cba2aed8caa7bf128d648e8b5b5c52ff83f7ef77a08279d9545963255955b696388ca628cb1a037b9eb57c3fb0ead21d28e7170f087a86a64b20a3554cb15405da6f1898e3991de9962f77d330274c04a59f41706b3f8a30dbdf2619a2e9f4412c2f1b2916bc0e0b790f2bea610de680e54e9767388ac73778fb7d66263f5e726ff6cf46d1cba883ad428dce6169439018e33d7306fd8d1cc4c7f033710560cc97fae915e6b426ef9324bf31cb9813d198201a1723b50ead05f11bfcce88f2426a9aab91c15e0cc2344df781e1e3c49e7ad394c6caef85b13c766acda4c9e613652e5f0b5cd704cad5277f2a13ab6617264013ba9ff2c8d5776c0d692fc543235abd1dc02945a86e9ac81c2abe891c3eecb91b61cbdaead0eaabec3ceeb7410fab93f6aea2d85236603b8170107c76791c4d21bfc12a8fd69b701666d453d6c8d84f2f23d349a54c974cb9c11685d0c063d85f24e1156d0cb7abd7e33a7d2c23f954009539cdc3a08d36b23982c06cc68403fc5a287efb0999a30857ad6685fc8a488de09e9669035949d53ff1ed7aaea528c74f16011781c957500a53408775e3a39c2be4370b351b7e5c7ff04b89d06d4b77a1bd76b9b1df30ac1cf38c200b84e295e00eb9aaa5395b4b21f9af10bcbc2aada6c08a32c722e9cc7cd85bfe674eb2e11d97ba52c09397b21c011e1f2e5a2c66533db3b7cc77643afdd7cd5ceb3288d0bac43d5fe4488b37842ebe06cda3d4cf8482d2b009f245dacccfb157d5d6acf1225afdb6279457b03fcf1a22fa58a8ba1bf20b1ca7bf69e192875617428dbb964ecbcb87a2d5f95f9dcfb1b0d6ad2dc27bf15ae3596fba7de3ac67fa818811f0fdb7490c444b3acf5bb3b476fd67d68310e25f58d1e7c9793a7b11276d493641c79e6d3a6c010cdd339ceb5e3faccdf5bc4dafa6ea5e293674bae71dacc34a8dd6c90b46538cf34a3591c64d6786bb9398247ad2bb3ed90d12ef24f13b8df0a5c582040dedd86ac60e8c9f4b2554eb4815b87e7fb5db7136beb24024f4eb65d5e0f594cac91cbe69ede5ef3c15914c87d2158baf0e857607baaa8d24de54590eea78822266eb8049c82a6377ba98b6b117f8c402f1f5e1201297bd6030e020075ff95f66a136694f2f8cd4c544ecaaa4be90807c4d6f48ebd6a0e6faa395198964f1496bf6ae6b1aa30845ac2c5f53021b1919d3c126e1bad765085d7497ac0cf1e31a76315b0d87c9a527e884f6a8333adc089194d104edb9834990fa1ceb5571b1cd04116c30941e841394e490c2f42fbd38b5e48ec0dcd8770afa19baa6414f3928095404d64a42de3f7ef49f8b2959e6e45208c2ec7cfdaaa95a63e86f47611f70cc8dd4ac740d503d145d303e6d8073658135f5151860068680cf2e58771a4a80f3fc767174cb84eb33a939d7304a649083c6818999980ef5c48b0dc767e97d9c64935d14cdecd1a3f3f45b098342ebd0b913d9e6f715b3719e3fb34bcd65629f6e598f4991c7d24018b26623f5db87bbe55efd30e328e755bcfb4163d1d6c582981d14274bfa47db21298a222e1b9c346aafbfba47dffe941abbe8e4ae4f5b855a08eecb05cccda963548e09537b66d7ed380e5b2ae34da04793160d70880618af9f8a99a48502675595cbe1fbe22632074b81ed1c1d8f07a5cd9da429d3cbaa855f7f80cda153ee225bc398bb7a206ed504b244bc322f3a4afd91e475f9c0723fb6d0559a6628d041f3b5d296cc071614826ac53bc302a5e32a8000192523614a724f3f8871b4b5d964e716bd12374dfdd172495c2a0bf186f34154c4f6fe3696cdc1650aa78a8812eeb7899715ba19b69545e0d40aa5cf3efdc335215c9fdffde7afe5604fe47b79b393450794fd7ad56ac0c6f0efe1d173807c22e06e367344d4398209134412c635c14ae74bb16f4382076d3f9efcaf20d633cce4f7de06c222a9cd606044ae5dfd3b277826936852cbd92de822456c4ef3009d7d4fa5dbf2c39967943c52dbc45e9ea50847ddccea0b5ad4b64c3171c857a394682017b9b9a4477bdcb9e405aa4ce8554e6f6ccdb968c40290b60d3d85da37fc482506c39b9d33c1824307594027ec25922762f30e29e77d02252b8493b75d7beff5567aea154f1296108a51df7b0ea2330fa564cefe6a366e52029011065b6eff9294b4b29b0c1ef27e94db6764eb8a01a56cd0e0203e4a83beda34ef7ac3f3e0f7025425ff16f6f7eddf6124bdb682cc34494df952742c092e6b99883a3d6041438836a0ba6ade0729cabc8cda3e691fc0591b5b6a902f6e69ec1b1bf4a5a43575ef86b4952941dcb1d7f009052e188d98a7a63ae7501ef2e7b9255c7632682f4c9226b4b91475b592efaa349d3b0a8ef5b9f6d3d5d351403a97cf706263bcb77de17cac532dfe44394a6f9dce8fc0de3adcb254c025c40dcd63fd6daa7f64710703dff1efcab74cc94cd48c7195ee180f6904e77bd5cd56f5004002c73dd05c38ce95d3c56b3a5d82e3112014d11f8ba1adb09ae928700c08417acdfdeabafd6e23824bde4a65b7fcfda3452b81e288919fec88a7e18c659e2cea54ff0febab4209709ce796c98cb5cf6cd1c32b336a5381a60fd04402806bee3bf52fac867ab4ad2cd46855dec0d0348486ddba23531c8c56be529bb106ce50c44ae7e46de8dd73c09cbbd4d3c5a6b8b7cd3edde107fad9bed0dd7ace08f1f5c91fdea6c77a07ef46690a4ec27719820e0addbdcfeb60f649a4e917da769fa0bbec6fb6ee73d398fe777485e4289508b5e61558353d0655966947105135802389881e5d76170cdb12b397c7c1b0a2475a9da0188993874b729f6adf94a035c9960f4654055eea77c83ad79a7d06900c928dd1e359c4cf8d9fdd191f40de6828c6a8e2989b89e751d26b0ade320baf89d172bd9614d5685257829fcfcbaef26303db1a089721b2b8deb91d861b77cebd9ce915c79c621a650197872469c88475eb2b13728dbbb38df2451ec8314fc8ac68c6ab1c7bdc02b7564e14659bc034047040b40aa9d700aa91b2d9c24060a16dba2e2bd6b923063c234357219b4332390a2e0741626e57c1c47c5898e5388b95ce3e70e01c4857512ea3e20c7684e71ef2cd27c5e84662c2db68c5d3134b6d605bd8b3cf001db5719bb5834e748e7cb63a2cc8d57c44133551594f37272466b54f3776423a0f7e067d3e5cd247338a3afa8dfc25df9edae5531af827b2d327faab8ac2cf2f86f5bf265e296fbd94a75d33f828b900728f84da76a795a816e71bbd27109f1e4cdab1632625e53915e61c5b4fd2806b56dc29227e03fa4ab73630900e4611cb0150b7cfae96b5e8fbd5c814885fab5b633a20aa72ba329e6e5a324c6c9f83af634499f8406b3a22a944850425b2517733ede544a7f4f9c4eaf4b494a70ddf751308f86241b0bc6b10d3bde393cfd88aae1df86a56469f1420c699d9a0bac5a4f4d95f13116ec34b7d5a250381b01d53f78cb5c04bf20fe8274cf613e52b068d2469b1ca3a7fe5cac1a174f06ca8975489a4695b371954f5ce961f90082447429aa366864eea6d6ec63bfccbb7f46e1da77077e03d0be0829464e4c3687f9454b68dc6ec66ebd283ca7ac0d378761524b821da32ea73c9eeee7476607796e61213c234a85b2957690500333fdefbd2d1b685a39a9e6068b12207cdce199e4c306988df62d7b4643bc046cfe822e91a5bbd9ef0ecc7fe811e2e316bcc7138e473ca2bf77132ae6415e7bc5b623cd5bbabd9fe95c39d21271c727d9538794bdb4c3a113f1b55e6b3da9db053ea6680ad1eff3752d27d7af388d8aa24d02b94875b4f1c1b49e5634ae7eafce6b2578bce5946c56a4d56c4f08777ec0bae3144975cc44202b99344c5c56e4e0cb9a823b881ee9884b18ae8d0cd484000791e4e65503e783a420ccadb23bc21693be453ced60c5c70cdff59e3ac06cc1a4264603e416b5ff39870795f77538f826d7b88389bb14273b4c8a93015bcb6d8aaafb3fa11b46c3e6a89d43f65146d1faff8b5b81dca401c71f724d5b40991647087ecd58e10b60e692e83305bfd654309ecc1e71be679e25bde1653ee78d205305162066473beb0e1328dadaac65eb6e8e61d2e1e1fc14cf44a95d2e4cc3702dadcf6fba0780473b1147c7ad3169b6c53389db7b8b9ca621eddd01ee598b20a8d5c0dc3ca2e496616ef364ec52d53c51d4fabe30952bcf4079f1c6f96087c","title":"746.使用最小花费爬楼梯","link":"https://leetcode-cn.com/problems/min-cost-climbing-stairs/","question_id":747,"issue_number":57},"55":{"day":55,"pres":[],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。\n\n给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。\n\n \n\n示例 1:\n\n输入:[1,2,3,1]\n输出:4\n解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。\n  偷窃到的最高金额 = 1 + 3 = 4 。\n示例 2:\n\n输入:[2,7,9,3,1]\n输出:12\n解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。\n  偷窃到的最高金额 = 2 + 9 + 1 = 12 。\n \n\n提示:\n\n0 <= nums.length <= 100\n0 <= nums[i] <= 400\n\n```","content":"096221cf5b628be1e73e8bcfe626c734748e2b8a04fb2c860a406f254d170e043d310ec8ab1a6ec9ebd627f465eaac46b8280bc2d829199fbe23f761a0f8f223fc3b6776d4dccee61a268fb7869f5f7a25ab17ecd7e24c1bd17cac2e0e245c6bded61e630be4d56eaed9cbf96f0d4e7fb150a9ebbcb03d49bc1f35508a6cde67f39d14285a534d6e7ba675b947c001b75e7d06905425255bcdca3379f0bcf03c5a772b056be2cc2d6b522d81a1196f5040d9da9e18177a30a65a8d4e34923199b714d13b0e46aa0de7c7c1874ae4751fb17daa521b6cafe6675c0425ae94b7c3a1f5b403d64ddd2a3a6f1abde6ebe87fa2ccf26b80e35365396fce0059451bfd5ae1015c6d753a91032169448d633d3fc695e8308b6ca238dae1a447bde2089f036ef7e6048ba0a228b43f7014976645eb9e2957d9c402b2a11484c71fdd4df97568e3dc21612372d9c35499abe50eebf2ada3d3ca94b9128d4e8f9d4a5d68fc80c4c37a9fa972dd5858663e555e8d942783ac15f01a05545946d83e9cefdf3d1ee43d160a6f99a66a14a37c6cb05c34d84f1d96e5bf1cdfb22e78e731357705a9874c5975319c08d4f0271898c7de5ed1a9e8c7aa4fd70d5d3528c97d0cf5bce64e86a8b426c72d7af844712d3b737878c022d78f8da5ddf74bed9549312e8d77be2b3f5bede540d6ae8e1c0d4377a2c2f8ab73ebd365efcc4799769aa453919d4947307fc831d65cde649ed2c797742dc0add091734cb612296924e2e3c59f6ecf97e5f2ee878f3f574dc1b8f2e536712f671d55e337cbd90c7f373aa87d062b7c27babde6c9c45a60006623c9562247a51fed1947857494eb2e23a0aa1218dbb63573c8efe614b6b7856ce3f83c33e5d9f4ebc4d0fdd42b11d129033b0a74442b23e0af21d58b98e01f7fe452dfcad44a052ee96aa7509642a6fc179cc1cd68de503adb13653eb5adfbe01a7d202fea5b10b23fd3d2a7b0145dbcef84dd698a27cf581d5c3f83f8fb2ad6412ebc8bd777083f02eabaa4554ad9eb4758c221ce71e00a750664d9ebd9bf6a6906c97980d49657a3195f5233f7768c70a40c802f792cfa873f39a8d90ba7ff5bf9bea54156192f5d9f452dce998e8c5711a03b77a01fb3df8ae578c805ac7dae0ff2fd89e7fcbd4b1227470d5e06bf0d2207c2040ca2ce937bd8fc28372998aaea08b7262c554937a0af4dfc2c43d10cc6817b6c596348265775a45c994f9fab8bf9d4dfb3f01162380b67cd450adcbf1257bd72e4f41187eca26f30c53d3b0592acae6fe791fd1f791daee9e1646d65beb3cfa014c3b47f2fba42d2573fde1fb35fc1e81a8c1667dfc9ef56327ded0e7de55077c78313e7534918464fb2b0c90124618c88da0127feffecba1cd9fa2a27bd758f7e2d1bce69f5cce4c55076fe931ac3ad41f09ad6ab97cee7947762f1cd11309b225ecd2c0da3b64742be12bd6261cf54ca3a454798ad289a609e55aaf52e3d00b47876e56d17e3f7005d9ac7131d49fa781a6e59575d43d42acefca6bd6f50f85f3972783de14a37fc04b08b820ad553512dc04492e1da54aae51d4d1abf596d3f72d97f58a4c6dfb37f51e94fe0eb478480bf2bc9876e83c5f0f7375413ec49809fecdcaa475e7c5853bcad834d6e1df558d73792411933cda5fa180bd2033a03257b443ba709ba6c5028f3eed7bd35658a390787989cddf95e027ce7461794af2622d0099dffde8b085efd4a9ffe73ce143efe4aa2f1eafe4e9c699908237fa6956bf3ba4c630c393351bde77cbc58de240b686981b1eb5eb3fcb951bf513041a8e1e6e44808e3ca9347366f2b54bf287209acd408ddfcf5140f1992859b750834ff4d260480304d171e4c94e55ead97aaffde42257bc3dfb227706def63bb26f1a4d63e4569ffee9ef456e642646ad21ab768db3fac3b74cc9989bc8a8a4d57c640b6babf7eb5ce87489bdb5155bf17b24f0bf34f3fe954f085d91579b83952d2b2ccbf8a0ad755b934852b8f9e387bb681d6daf7254b85f015f57ae750bf514a38fdab893720c536d7b3cb20dfb1c55ad0bc600d05eef804d1e3a875588c3f517b42f32bd1af5a15d14da7659319157fa31e17af9688bda487305155b1dee1e0dd2a0e0da426994d30c55587b1cb9045514d6ed96505f2c9c736fa5e3cdbcbf9504903fa72d862d56e267fe83755b465aaa36460e3c407c4554c825d97e4d0c19612496e9322b63f4f46bce3258d061b11176d62754f199e7c9ab8d963f210b70b1644eecdf39f85a6ae6b3f6994c17e1669e5530b49f9de58cadd0cafe2a7e8678b73e8a22b8ce45df3d972651fbadfb21b0c1161338f164484306cf8cc7d7fcfe8288b50a595cda7bffe27da757e9b6e5528658751b27591dfd259fd54a13ff011a7cd70a4edf74e760f8ffc0877480e46ea04e73667dbd1c028a002aaf9a79f0cdabf6f74e88223131270986cbd0a2b9f9fbcdbfc07a05420fca018bee5547f914c3994c6bec574472ef71ff88523750df6c798281efcfeb02eec32ce00832e25fccc36f149d586d6bc7e7b36c16a2606e19b9728cbb259c1b5a19867d45448529791d571be9c9cb3eef18b1a08e192b010942c1962ac51c074901c2b13df7c942780e3207f6333638a73666a0ca1b405365ad76a1c69fe5f37b2b9778a0083a80c3a9d94a346ffd262b64c77fdcef8c6dc8df321f9f6c5dd6002b3712a68357e667e2d407b733621ccba4d657a292e8951c6b0df31899a0fd7989d626c78a54766cbe4902f7a6bcc26dd4b2a26c9af691a03ff7a6add5461426a3c5e19fdd0f32aed04b297454b52f1d2eafde2db8f4da4273dc88f37543f2eb16fbfc65b6f0a26b6b34383abb36773efd0ce7a1dff76934ad7eb008beca8fe0d1200363235cbb64cc56c844f9550fa10d41433239c942f761c1d0df62e03c388785010a4e0e7ba22eb440bee7a09c38f7fb72881a54c308ecb0f45d664758bdcb55acd543224671911f6e3cca398fe72297b3d34d4bd47ed670a21e787b4de1773d5da9b8bd7f2decc938421ce57a354f20fb09816790dd2f68b9aeafc812486d11f713e6c92921584474ed458a074fde03b2ead5a3ec948d29d417919932806155bf7b4ba57e064d9567ab550ac18ee502bf14419e8449cbfc0f8afcbc5ea08cf3eb213c598b8da8a1007ab6c3244b61a3c2f354528938b98e72bb39f071c5199a4b4be00b6cf6423864e8e1d54587e9f22ee7a96c6ba0e0fcce425951ac8a6dac49c1768c1758af28fdcfd72c51a48bbd78bd1c124dc0e634204313bfdd20723f2561208fbbd11bb102c24fd5e66c9dbdec2a701eb008eb1f5323ad55d8a9c99bc0c8d8ac382c10f264cf11c3ba4d6b6c8c893e85e826511cb2f1df3919866e2f80ed573471cc090d1cbf39034de59abcc0cad2b093754c66093da461b6326d21e77eed0c2e42101a18c1e02ab05c7f88f08736c482e809b21c5ce0143ac023c84a13f8b57b890a6c55f58be4d7a44cf0ee09463f4bfe67f3ca52da7748f20588ff878296fef8d96a65786a58afba9f4f0a1fe854b12b5950218dd1739e4f8ff549080a197c8123b97b9033acb3b10d95a05de6b90f175c5c5138cd792d82c7145f2b833a3636e2e99ed3a927eb78d1152e6a99d82511d1f4c7509da1f96f1dcd4bbffbcd89c924114ff9964a176444085175e34b71f03cd66cf9627a3fbe3cdb2a91a4566bbb6f4d77b5904e5ac49a493c4ea224d66d62b43725fde4bdb3420da5000ce9a0a1225e6370ab13695f41109b58663fba1b4834af214b9b05bf0c89f66c4ee7c0b3d0c393b12ab991dc812e11a347f7ed472fb32836e4a744c0adad7af214484aa1524455aa10b935456b0693819a4e559a7b9c899b8dee8d4a972b8564410f56348e4973f54dfacc2b08fc3e0fe4491665454984774f09bc5f5f38ca9a1e97513536ede0f555d7106c6b33f44ac99d68702f118ec3a70cc3aa86216d73710f4863d73f889dab76dba77ee832df78d6541363613f581933599063077425f25c442d640aad426af6755700fdfaf3bd6b140c08a350612843853faf140cd3a4a4f76af5c46464e935615cace83a234ee1aeb16df107215fe8982c31a37da882f7b94071c4fdd96adf7a2703e7a41b6ace4d99725423ffd9c5b13cb1eb39cbf1867eb3e4ca9c40715ff912931a4cf5e1c48285f73458683f4d744b4ec05ce36c634cc90c90745ef3da191b3780b1e525a143b54a19d80c6f62df5c1cc51a3db80d9e0e15174551f419554fe4860d37ea3bd548fb13f2d302fd038ee0023b9c19ddcc752acd64b7c221c2fa56906b7b479dbfded59260e8052e20499ab0df1c77902bab77ec6c5794c298567a60b629198d3fcae977e2388123d2a73473327362ba2c4c760805cbb6911338d11dfb974513a9fda0bba999b649bb6a4d380affef5fc8e517470435086aa6f5a9238ad81a7c50dcfc6fdde267b460e423b69d3fb70431d81681f6cd8f161f1ebcff03355af81d7f822c2b536a56740a5ecc48d1ab032c7c1f4695b28abe05674029f53bb35873fea3cff009e54f2e9ccb7ecf4ee423811ff84aaaa29de7e6e13c7baafb40fda668f33644b00da953602311466e9d1b530de8dc221ae1c9eb1a3392777241ff5f22441d40b5c71ce1fbbd94038d2a6d4b025b5b541d6fe53caad6f6683d3432c826bf4e378aa5ebbd6dba0da31490c6897a931c6c21d759bc22a96568f4d0c5e6824b88fe51f78c0f5e3393592528aa9efa42bf6d561d13f9c37be2993b605863620d5a622fbfa0724f463c8534dbf63ae95540c91e9b522bce3ed4998975872516a17fb3201ca34b94ae226b79429ccfcd0d19b68a9193f05678ee4c81216a88a8d0b4d8e0bc865626e304e1ff299002611b0f87754685a26e1db79d0aced2ea7abd4c6c28401b4f32d9f3a25d2ff59591b265e3b0c3a548366600179faf51e40af13129828c086e593812c57e29a15afc371620dce9b9f355e79a95832c9ea6d2dd1f5d8c4364e3045b39fd0d5f33da5cf55508f4d5cd19d52505821a2601692d2fa8c2aa5dcc871f049281d03ec43b449b29d00961b34e9470c3a8e411f078cbbfee86efb92a5f4bba1d1d25895c950d7fc212f1e4b8ba09fb1195e66356cd4486c06cb8646b5d13087c4365ef06d3d095f0a1c2e032d4ad6bcd043fb1acc761f9b68819766cb9483c2b9c94149b89f8fc64a7e7f90aea1b07226de83384ff717161fdf9d4dbe6cbe036283c7c041b75e3e7f9f07929f05af5a9ad43937a6a081f2a1d3fd006e43bb4880dad796506f0fb4a000788b4ceae394a08c8f96b59ede6c453c6655ce798bdd46d7301c98d6501544ad429096d3bdda15e9dfc86d3d07db4ce56860f04952fbfbfb3b93e4f265812c30a4fbd611a6d51c5993821ce9852d1b5efceb8570722527241b9cfb7c4acd5b13aa4c62a2f3e952fc59cc4ec4501583fdd21030bcd702e3a6ba63f16b131029bd2bee988bae0da65f4e66a9771253ab6c393a7889a969dc784619f1adf281d3a0ae360b326b45a51282ad602f6c0cab5901066ecaf565953c81974f0c598fa709b6cdeb57e93d8a5b2e6f387175c08b64c1b48dfd9f16095c5aaaae7568a228109a8338a3f8f12e3b98417e9eefec80c63689d002f6dc223db5d541840a947c9f51d3c0dc6b1219735b6544ca71eefd757a804b5522bc080c6a26ec5ef6d7b5e0c1f66ec4b5538952ead611284cdfc1e28e7d410c7c138e7eb9c68917480f7a650e00f08211329db40ca881a31c6537dd00453deeef7193b0df4e551fbe3fcc1dbc5caeaa682795a39d964c6599c6c3f2d5063de59ff6df728a735a1fe5ef11cbcaf39042b1442663ff864055732a1f95f0809d35e94fc9fd75a13c6c3e5dc2b5c69f25031320103a720a8ab63a8f113fd4585bdb3b2869eb275b385cfa5b50dbfefacf2e014f0c497d182c405d9e9a679bebf7325b0882e82c810247007dd6cef8a2c71dce1fdbeeb944f0471d7d9056744528ae01d5488248248304289c47c7da0f3d7b57919036d126ca7127bb6a60f3578378ee831094725d1625393c7b7d66b60cf438f45a8f2f20342cdd7c6e93180a911984a1b544223ff3dbc7a1cfe257fb23e58de302d521d720ec3f6f6063ecb39ecd9766ab71839b1d84574ef0b51c940bc4ecf83f271235b84d755da4244bb357f2d126ee4408f07ebf97021971ab9b9be5b9757df0cc3bb430b2d3eb2867b4dbe17e136cfae489c876eabffa4951c37b4f4d4845ed62639fb155e942d20eb100a855ca5002e3c1fb233e111a391e26da5d6a9e68492ac529814c5967719d57f1bde805b513f343999ff618e5b7be5b4e742e4268006666afeafe07006e4821bf1ee894258054eec17e1fbf6e250c59e95790ab8aacfba4ae970e14ecfcbe28027b7dd69d33b72b99791a4942cf1c19043ea3825a796f34f686f4d131a8f36235b611c014f1b7323854f85ed210845c0f17a5f91654ba802097c44bf2167033442ed0d4591409a0858733912a734950f116dfd8c833522a12dc3b837baf6cdce1bf9828f3b6e0256caa08b841b2587f97a7c7316f0835dfc6021545190264f505126b3bda357c19da19ec1c027baec3d4c3a6a69a493ded4e4d00e2acbb1c1982fdfd30ac2a257000ea8c3d980ecebe7b6aa305b6b6d1ca10f2551e7880dff0b01bd34f7ce073722cb893d6deebe46c0d7b1e9c84fc606e1ada2ff5d23fd3fa9a42d99b04c86b8268903de96ae558af4c6fb238c12b46ae3d9837d5164c001a2f28fa43b7df063462a4c03dc47615bd0d799956a6146bf898da41ee43d2d731353cdb0b42de1c69c0191241636d62d61dc726ab0c8dcc72abcb190da8f1f0733960101430b3263e756d1dcf1117a2c7a8a72c33f52520749e3b03142834e2bccc517a3d04b6aa15cc364256147a0340fabce19fc7652c45fbd22f5e9eb6662fb7a832dc8918d5f4aa9972c0ac1f5acd4a56ebc1e23c74ce78168b4a20d51d11eb6e67e45a32cfc0455543afcea4c46126731b7f6ae33860a944fdcb709524067417212bd9695fd0d042fc7029c9e7c5c8c32f3ac2366e276677e33c759bea4620c5a038daa032ac11d13363f58b9e1b415ae0fa277e58501a74a9c625fce05a19b220439f32fd031b9e10a25d94688fa4f055585ea11d0c0d22140212f517526102d1bae5b4af63d6b13d327abdcf951c4765f0968c713a3f14adde5a712467ed43ccebc780630c","title":"198. 打家劫舍","link":"https://leetcode-cn.com/problems/house-robber/","question_id":198,"issue_number":58},"56":{"day":56,"pres":["动态规划"],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个未排序的整数数组,找到最长递增子序列的个数。\n\n示例 1:\n\n输入: [1,3,5,4,7]\n输出: 2\n解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。\n示例 2:\n\n输入: [2,2,2,2,2]\n输出: 5\n解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。\n注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347380208a04fb3995067b6629472e032e2efda95226d4955c107bef418d6b71983dd2df8eff401fc5a93ce974ffa5f124f52a696a9fd18cf0076dc1aa84d24d6d38e6718399b2439021b427cbf5eea38b142ec00766b0883a6438097cb8d4c9ae77d84364285ff1d37bf6a78e7dea1fef1c3981eefd0c2c7312c244f438fa6ac67ff9e53cd8e04b69b1a43c326846459b13043d462cde8c52410144bbcc47780211e489cd10581a3ff00eb7314f988bbe9d7bbb48075aa50cd6f92218d820281ffc16ad365e5bceb9602b86b8620b1ec587c7b939fca36c8dff2f0bf8bedf85cd020673d38eda65643a6ec0304f491ce7b758dad985e838b0232e6b558e41393fc7b4e830986b9a201d9e8620ebf371f60b18afd246c1b9ca449a401e1ffc2949a2c82d1a9dd66dcfb979e8c0718a4e8b12708153e2c1e7e6dbf378958ff808d4c7adb3f6c9bf8110a5528fa377554ef184caf199121bbe41321d5c681d730a7ab703ac1eef1b2f56567bd83e80d2318fbd229549776bdaf957be4ee5ecb15428d97a3b7b7424d67de06b7a844c132e6f97e41b4afadd60e153617847bbb0987babf8e8b9f57fb5786f6141c00f51c9e09b71ffd2bc4cb73b1e8b6a0a7207382d63924cf2d2ec97808c5180e67e674bae19f9297213ed8c1ee1cbe012703d4bcc92f0e603ebbf00ec71a4e97dc5c548f501f49a89cec734da5de75b4c753643d2b60a12594df2dd089843ddbde0dfe640e06779b5d5a9d6a251d6cecf85d3e7215a2f671d55f708c7fd38731a30ab4b26275626b6a5f4cbd6496621742ef54f215aba1fe006814bf55f7099e03c12d6964d0cbb01bede1d057e2f3ba8646bf5997a6cbacda050bf983270881f8deeaafaa8401896cc119409339bc2ef5a9a556603c2ab975a09fc45f62d9f7bd20d54c04eca5e17d2cccd68ceb7969339144916971009c67be1aafebf73df21cabe538af83c90060531871d26a80c50ae7fb4fc8a66487d26957d3d4c9c4d728ec40fce9c409667655b11e198780a677403c446b00ac571ca7d73157fd9f255eed266b073c4709fb4beff33986ab299c3a63e7fdafed5a128c4534eacbadbfb6270c8192fef263508128d1fc966cc7dcc9e4bed913e5bc91b065edfa4998e05083c192c7e2c674029bda5d2ace267a6c28424d95b04153038fee240a14d47884ddb234c460823030c6e76ba5c48e6f1ccb45dd4e4acfc006f1233a5513a8a7eb12c45b050c5fe258fbd9a6024c9e1929a5b124b6f05024e1c6425a7c2db5f554c75348ac90ea1ec6cbf552bda297cdcac6bddbc8228dc7b76a49dd4c7fc0cc5b5bea151d713369e2ac7e3184a7fb0b7dac4adce8c8ffa0813c9561462d34d9a879cb34d96bb9fa310e79799cabb3d539beb3ca4ca688bd5fa3282a24b48e060c1ff103b96ead1874c06cef155cd678929ae07c7315c7301df336b80ee059039e5ff465036ca056887152f8abb3733fbc07d587f7a1eddf5c698c5f01ca04d2b1a0da9e95b9a6a431e8fae0293520a909d8113cf58573125f23d277bcc620ae2c8e81bd394d1fc38a89c20711a0fc8844eef256df541665d1b92b473aa95bff0384f4fa920e399e9ce8e3f183157d4594f03dff2ca58cd10a82264212ec2b256c18c14a15c423d1b1939ddf531e2b8d165157c77aab307f5e21a54165639b5c9a03dce9e2b77a38503ac0d21706d85ba03cf6c1aff74c9b629a268110c689769fe0cf3ae9e5fdc2b7261b3a5efccb4ad726baf17c013d28bbd85057e1ad74f7c33af12be9ff56376ac894a5f89cc0ea8a5c724748527501f4243aed6f9c9f6ab5303365e1a2162a56e698f3ef90a226a249c8ef618505038448ee2ff416376f0b5e5358439d31f4749a28fc98b8ba18204e4d88b38e266d9679341905f25e7ecf591fbd37907a349eae7ac13c9d9fa2fafbe0c60cd6aace1c49f7b598040a7cbdd6214884e20d1cb8b9dea53d326e328e75ab5c44169f81465d0f02b8de8fa50ab5ba52aac292c21a6f1866f7be16d888d877bdbf28d6ea9e4548709f8fb04fadca45c61813e587b75cee77bc82e32bc3d901efa1c5e349f635ca3fad68ac1e8250f279b9eb1e5bd5c3ea584c8c2546ca041e2d8c1fd2f76050ae13853d3a99e00b52238bf86c93c1b248e0bdee71b3d01378d3119e47ae1cc5f1775620cc06340864494fad5ceb31d46508222b8138a875b2b74b753600277325c212623e6019bc7b04c93789b6cb13aa4dbbeddbfc3c2787134a49002120f8944480ad2981cd6a17dbaaaedc632ed60adff18dfbb5098a875fc9d693334c5f69b8980802442870353f4d94f7fcffb2abb7ba595e1a6abee2de4427c9d42581a698a6ebe7493f8d062d054a13ff014ad00c6c995cf2c0030e47690746a0d4bf03bea3370d8c1f82aa80aa6e9ae9e0dea72eb178d8d5f762b10c46ef1542bfacfb1b79e25d53901b5d33ec0825f19c47968e3d51809186e47a91e86fc0d355fc2a3c9374489d6ca6ced49ad1e732e30cacd04e849e3ae64409cbe68df2f7c02b6feb65ebca1319cb8d5d1449d306a16e3aea40299daf89986b59f5d46f1f56a78eb206712983c8654d97a3ca9ffb3f90cc991363d1d0e0dc5481c0535dde22c7f26c001795db5003bf2de51eb7c95c0510bdbebaf19715f6b9640be81f3b2a2f7e0b410a5bfefb63c07f41e270b47551fa662165f2584a409ee4410161846f64990defd75c0b15cbeafd63d743ec74300b4e5fc724430a9124d8696c25061bfddb45ba1b72fbbc9e2aff8eed1676e3646c26fd399100c54b0bdd47b0dae8f2ac8034c91b847161b63da46f38f452c7e2f0a5f26a4ccc45b00b7f7a72417b519a528a3cd79dcf4c3bc3045701778e92029ab3646a34284e920b239a5b9e5e19b51241fb18e1cf14afaa368e8b5f5a9e5c07fdb1155dc32e390c46fdf9f4b3cb5c1b3be341211096fc1b88e3e94407f64564961cf856e055c239dfc98d9806ee40ec71ad2c573647764bdf813177bdfdbac81f682f16559a0669065a3667d9cb5a70a656668bb9f45b41904d6f5fb9b482dc40e83ed58e006e079b42249f765718f4ea1e24a055499427f2f04a9a8d808e93ba54721e57eeb5ff7205ec92741df040160431c5c1e0b200afa3f75ef2a0c5e4b3ff744cd66640abf7c6e1e8c9c40a3e1f6ff4fec8846818e1a404730f17ace731a8453971572507dbe3b2aa26c93b30d0fcc99538575b52e94d0f2b9d80529bbbf100260a031a6896d10f8c2b75ad256197d68760f9a9f287b8c6a7042ebd5489a6651319a0477b89cf3a1d410bb59ae1d10afed8014e9dbac8848a3cf0651068ae093a3a5a86982accdd6da9c18af6b9f00d59b6d59168c4924e205fe9cdf0a421b8cbeea65518c6118ea2128282756d0769ec74b1b442ed21e77e2c7f5ed083da7892aed0f7db9fef94d66241727c2d43ca0823d27e52544eea65ad65ed1ccb4a23156f2ed9fd02dec2529cd2a5e4a7c26b8e978a832d4dd4544c190f780d2b8f409acc1e0c5c297c2d1a6890250afca5b1eb0a1bfa25703e092bca795f80337a4b9032bed3b16c55915c1a34648ae4544d4f1c9f98221cdaa1241bc6f9681c54576867bb67862d98e262054705917462d49741da5327124107e15055e4e3e1393196fe532b38df725ced495f952499c73b29a27e7ab98d9862086a7f76b434925899fb254268765ea7b3bf29ef076e3c5d35f9a1ba0275dd650479eef16610fa87944b13698d0280699b16ee29ab79a54f103b9b351eecb8d5acede6606043b33090e441bcd881cfe044d4871fd727d883aa8edf9a3e6264631c3813007cc9ec2b549e207fdfe3a90c5de57414461325251674df49de73bf54f4a9b0a890ff91c84f6bc8dc4b94a1e6838fa6e29545281145bffab95e9f38ca5ef8e266858130c93941c6b1b85ad0556d9d8103b8279de14acb929820dcf9d63aefe6f1db8ee504e3456e570c30176b01b74bcd3cde19b5d73821510e6c298ea2466eb368b70c2ab2adcf6dc9d827ea517fcb240c886211e11931951c9c541c610486963a270574561a25606edc8b98638ec07e52ffc124531fd8bb1c81e35dba307be54b997e087eb9a9df97567147f330775635b99c63cf0bd5b17fa1d9582bd3f4be72765afd82dd01d43ef46af872c0a3959583a1bb8eba1fa0adae07b942f9347eaf74b949f7755cdb2e91b0a74ffd4150b4ca1978cc9cc1a33152aeb03aeffe097b07e321b393ff356b3176e942d93d50585e7470a5b4ec651b0084bdbcfd883e922c1d32e18227a79b4066ebf3c946a5cee681201897ae70fa747bd74c74f0ebbb366c5f7674d1abe649206629389d5e2ba9b7620881010ef9fb18ed3fb95011501d71dd07a9397d25ac61e107e621d9fe62fb8b49b669cb5abdca7aef9c2f3a46f7f744abc062f6e40883bbf8b4b44920a68bdbf2c1937302b5c6ab4b95b3267a9e2f3ef4c3810f5a794dc92b6270f13a9054f39ee7eeb89513b152cde3188e9e240bc8a30b1965a480cc507efb84ed306a82987638947041b3a250b2b91d99015f3f1af8e30a4889c11454013bc14d422fcfe9f981442b1e4ad8986395f57d7a6dcbc7fae976e6f39a7a9ba86e66f30f3d238f576008d4a8d5db9ca46394b7eb23526ad233b8c352af5d4463da1ab76b1742e8ed75ebdd7c2a3802b1d2924c2e57780f30e3cd38700e93ec302081e3467fe9fae5f6ed2e7884b42d12185e495d23bcf85079b52fc0cc329cae63ac73069b5dd239dd0e8aa6de33fb2882897234fc46fbbf7b6306378278e04363c0dd8a29a70f7ee4bd47e8c4587bf8f59dca39397d519a9597f4537939ef0172afbc48d1543961692616c7822204f89d0006f54e485311626501df9c540dcfe8f68d9bfabced59136bbff20d17e1588fe73355228206a457452bb3b355e29faf8006ffb6c5fcb268cc3abd4d52a57f49a489796537143a988d65f7453ca5339c989226a947e1405551955550a0773cb997c9fe75539dd040c859d96cbdbe52285815c1e414b921d4b4baa6c85b2cced6d8c7dc87462b51cbafc76e6cbbd1587edce4b2e5555ad655a3d450021005ab03143f03c980b3d1f45afee9cd5536f0d663fd43b234a9ed24eb4cc30c1ee1d1abe2165376f201c2e032d0398e89c5efa1f81730ed821ced45082dad7dcbfc90f1cb383d4c6585436deaef3f13c619bc23046e57343528c9308f33cea5a6a8ace865ca00a212d984982d66ee11ddfdc7037ada0d1abf5d2f4491e43a648ce8f9ac55e3c46eee508719066a3a594eed9c2c5ce9de56c536f72009e37f08532cd4859cc83025b44e317ddc5a8ada70ec3dfc86d3d07920ae56d65df4f2fd0b9c36d98f9e32bca61278f90e177f7c56143b9821ce9856c4e0ab3ebc62520253a2456dda3741a9f1e45a6087c8cf4c752fd59c548ee1445f8b4af6b20c19146b1b79822a43f5c1060bd36ee8a90ae44a6434e35f36c1258a0253039236731c215c5c4d16e143a007f6474e098fdcad466db4408d3a9a6e678fd91c9f26630ea09f426038aab801341b081cda616b135c40e633c433808c0806491e6c8ab93164a0908e7e52422df5301e78325a3bca15572b5682ab5c5f180927bd9cb28f6dc223db5d5418457be7c9f51d3c0dc6b5e0478487545d071b0a86a20f243196df212636469ca1ef2c7e480ccd42af1f3378931a592543266f581a2ce2d1858345cc054fa8a8d085249096e122eedb6256cfa9e07a890a3453d71990271359bc724a2ecf94e1b4af36cd61dd015fdfe136edbf7e09f4c6887c68abc8158479ed58ba463f773514ba3ab0fffd78ea506813d3c49ff864055732a4dd0a4d5cf7bbb59c8e52fab6c075d0ab9a4bb9f634c4120157f7503deac7bdc563699585a9527233aa65d207121814b2ddbe3ae89620244054b7a0425776adecb3d9bc1fd389e8c2f2e9123c7dd86ea3b3c6b4e39178a60bc7959d08d031db908ccb2f0b869df3dd272cdcb1982eb3ce5edf0023dbde00709d300b54ec1e1489de83aaa5c997e877f9c1c23042c3d16767da17cc36f8f7d9f46c3be81de4aa3be5084fec03bdfb4ad3d013ff0d8c767666b926a96cfa72bdb23ba76da25f499a4a8123876075bef22b5524194778bc16330f01a9e026c49f99a97fd3fceb0fb37ebd75cc7394be226a28b06f96a34d29e92370e4c3d20e9da341ac331fc6e5d22b5a36d2077efb2ab37061d5af92f276281d667b3c8ce8ed60ae8ab6626a069c70ad85fd845d046d7c076bdb62954692949413cbf3a50f4105d9f0aa63f89cf2201b13a8399814495538b4ed3c1eb52bc9d07fcc9afe3dee2c9fe0ae5d0959abe6d702cbc13e497118e53dfcbbee817bbb482b452cf5737d1d0d9c5c2867f51efb5ca3a8498d34b20982bf912869d8b9e4393f384e04d0fa8d8e2e50b3e5316a16726f49d15db2ef06c42e5bde01fd507ac0c84fbc20047c9e50f5094350c942c9cb8dcceee121e95ce834d050ee947b982939a2fe7562701b0b4cddb649c5dfe5f23c1e6aec529a6fbad2777f309a44ab25674d382ac77221621c8dc190098a982af22f69ebdc052cab7d036dd6bf3bd1cc59d80fd99e084523ffa4f053ee4eea47f5cd8a0f520a1262666089ac1349e14d7a32636a101adb7dd951de04816248ed3d4d99225d4e93686f9e2451602524302ad80adce190710fc94996fd20646c026afb349df8a6e8722ca7673959426e51ee54119f83bb4695ed2c965a718f091b3beaef21bc47e31cefbaf2150d259a1bf62b2d146f607c9f5571b03a87ca82c55c89c39cc3f8bae332ea62d7b184e3b3ded765f9278d808589a415ca276dafa87103be8fc6a01e564173a260f85463ed087b0f87e168b4c0633c0144b5f1d7d9aaea63c61707bb811be3dfbd0adfef8ffd0f485cd90f97b2f64ecdf3a6099a27caf7c44a7212cdf5d302a4f82534eacd115889636376bb6fb1df9ba58ee9c0696da678c9c62aee84247053a7d03cfb6e1622574184153e216766dca6a68ff60b5efadd26129973d70bd662bb17c5481c4a994d47d5ccf4a360201f85afb9d6e24a6c5564acf050ab138832fa685214668f8d4ff4a2bdeb484ea94fb5301ef76","title":"673. 最长递增子序列的个数","link":"https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence/","question_id":673,"issue_number":59},"57":{"day":57,"pres":["数组","动态规划"],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"给定两个字符串  text1 和  text2,返回这两个字符串的最长公共子序列的长度。\n\n一个字符串的   子序列   是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。\n例如,\"ace\" 是 \"abcde\" 的子序列,但 \"aec\" 不是 \"abcde\" 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。\n\n若这两个字符串没有公共子序列,则返回 0。\n\n示例 1:\n\n输入:text1 = \"abcde\", text2 = \"ace\"\n输出:3 \n解释:最长公共子序列是 \"ace\",它的长度为 3。\n示例 2:\n\n输入:text1 = \"abc\", text2 = \"abc\"\n输出:3\n解释:最长公共子序列是 \"abc\",它的长度为 3。\n示例 3:\n\n输入:text1 = \"abc\", text2 = \"def\"\n输出:0\n解释:两个字符串没有公共子序列,返回 0。\n\n提示:\n\n1 <= text1.length <= 1000\n1 <= text2.length <= 1000\n输入的字符串只含有小写英文字符。","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2295102e8bf3736e305578596320559db5276efeff031709804ce6334038d12f1bd385394d9ef220ff2ba4e9f225f573696bd5d7cefe4633d0aa8b91587224ab71899aa6098d20f426c1eaaea3831431da0b72b08a3b2c3f047ac0bb8bfe3e53a1ecb2aa1a478e01357fa28370f13813e69dfd0c26701ffa4df710d664d5431b498c1346263386fb4b21d22259f8a97c2f2768daeb21505b2e98841b44714ce3fe9325327a0f8050b05ddb1988b09dde50830f7d830cc5f62332d7ce9a72a202cf7d692f93a70b76a4ca202070869dafe90b508577737ff3d62121a3f3f9882d713f0c39bfb04d7da467693941d6ce03dea5e9c77ac81b6d1446fe3c117d9a87be6f820cfc3ebd92b51de8e841fb3130aec77cc0bbc845ae4d1639f42553b2c92c199bd367222f16b4f81ed46cff587de2df086c0c74d8d16f5cefc0c78de2d5d1e6a3edb861150cca1336225d9eebcd9b2c81de3dd630055b6b0867e6e62ac4d310a2503830127ab863baaf871f7baf3646757ad8d74051ca5729f87b62927156c9cce269f5ed716f8543042d6f80e9096d177ba666a9ef78679ab09958a6e1d2b8f75ab47e41614cd70f6df3e3b97efccfa843bb2f1e814a097318323c789369ead8d8af82a94e8cfc6e6a709918e33a7236dd803dcacad33e731a5acd87cde73afdb33ce79e3e803ec4a510f6b1223a0722b93aac15f519daf389ca4c66a6a57f9d6061b034298c92897a3d19a57753bbeaa51f07ba8e8d4d7c78237e644f3a1a238e32a18d0f0d751ec20d0544db94327a180c7e3a31101e53d2e9e6b3739a1ccc833023e9d44f618cc340399fd90c07acd0a28cf6ebb02ea1f34e5ee197bdf590bdc2b86b14ba7128707575134d0b95cc2ebed69b571343e550ffe5d951002ee845a66eb94f88d61594f8cc51db5119d813683fb7a7f3e00d582f18fb550da733dcdfa18a19b23ebac757e167899d37063fa02bf3ff1438f36ce7b5a51501765ac85373cbd91344e28c1a87c34ac20a5f2c6edffe083d152119ac1b82a2c272d27d732bb944b53dd24b89d06d4b77a1bd9428ba3a86dea86a811b3d8edbaa7bd75bbdfb6a124b3eb89642e8f528b0b398cf78834dc319e269df1ab88304939231553ddddfc2afa5ce828f20610f6b6939b481e7794c03f2dadd5dd5104d366452e49430af2437b039bd39e96c4a22006346ba25f048c1ffcc9377daeeb6f1154ffc813251ece356d5a623fc4da5a5263d85aa490d01ba84d33b381cd9955b0b828a9661685b773e0d35364069e72c23b7877ffe4592f43f5ca075ccd93e8f1962d5c4fe45107ccd3c7dc047b84639c752ff8068781dd0b6afa4a6a4c497885d20a492cad7a45e338fd736b430b1acb712ee9997f2a73746a6eb2080c84ead106668226c08fc643e9dcc7fa123387c2e4322d9f15fc76c8e163fe737a2f1d8d8479aec6a1cc305927413b3c18273dfd22195f26c7e925ca3c51f386e35f9a06c7394dad91d8664223a1aabd96e9b62581f9ab40d91500687a9831cce5a713e2fcb0e2463d86f26f8c5d31ed080c6fa119b90276f1a19d141d39c405570ae0845d65d78bde4efc6fb375c1efc37ef87f88d8e2118311fc25d0058cde0cb5acd0f92256b2f23cd8a7aead706add78eec98d5db1568af24156cb3ade77aa49106c8ca1560365b3ba4cab13bce9c1f7d90b000a1032f6d6e888b06cc7603fe6ac7b407af68311c6a965ff836fe411cebdd227854b2abd5eebaaf7566b01722a6664cfc9d5c3b39b4defff4d01cf3dce20a29a4e50165fe78936e386f246c8726583bacf305159cc154473619401c16740288fd8a2d8e3041203741a4c15e8a9aeb72148dacb440f898683a23628642a72801d6172a0a4a81bf9407d5c88717d266d45c915ea55e30ddefdaaef1e762009f4c2eb8924eb4fe8449bdca515eb318974c0ac17430cb4df79ed1196cb4357dc4b3c181820ddd55be348c0fac9e0074bb90f9d6ff0649b6c415c274e94ca75c7222f1ac853c1fde37f3a9ca03d4bbd450577498779e7a7ece19312eb2880ce2c6ecad35e23342ddd57a9a1fc54aa18ba12eb6c01c532f560b6ab80d008c9d8df9bd550e663b93994d00c46380b0df884563696feb480bffe3cb1eca5e34cbc7e74b4425da7fe84ad56f0579d61854a94aaa8b4b6be7c80bc9584d9d5097e4f8c4a4314a6eaa20bf17809e56abb76cc68f90bca7beb1cae066fc460c4fbc1adc55e573c56e6b260b376c16f6f4e11e09a8dbdd42f5e7cf66181fe0877295a5e2f238e35aaffd3df95ee6396dbe35593606669cc7d3edb6fe6e6dce94fc3f55db74c8d42b936b4b244749e2cd6b814a1ae152127170ef3982094937428a3edffe329acf527ae6255936b1fde063d641feacf69457a16fe99f4d3065ae5eef3c0f3128d8202db59d62618cfea8d45dc67189cd3e1b74317eea41c9f43d24d7496fbf8a159feb0a0f574d9fb3e23fd6727fa3bdf8640353d6894c761ab36fa43cc1caeba77b08e511da4320adf5037bf259e0e0e3725e5498192eb94253183df55492ae9511060fbe2c13582b43372198cb007ea3d73388c0ff229842cc53bc8939b1e93cbe462ed6a8d9d1ea58d4dccde32a24c6b1ac1fe9b4bc3acfa06610964ff5463e94cf5b6679832914e36da57f796c7002542c4b8460325f73a6a831b6d683aff1923ea19eeae7cfe04e62f6b1df84a433fe000949ee2e2aca781759f9e9be0fc5a171061be6ede46cf393407823d79365121ff368599d754b4d636f7414fdc1f3ee75a97a34d88df8731d76516e2d09e977d7f95935eeaeb9f603de153097a6b4858de49c2f0975d9cf2b4863bcb77db129ee1f64bd4470043bd9d3bdc7c00ec59b37916ccd1fff64ba13fe2f50581e0b9bbfaaccca478a12add87895b532256904e77bd5cd56f5490602cf7e9f4e229d88d3c5682e49c6a2032f189214888eea81a4ed122d6e085c67cdede390fd6e23824bde4a65b7b9b1f05274ffb7dadf9ffc938dcb8c659e2cea54ff0fa2e5167249ccd88fb4eafffc299bc32f3c662086b927cd4a43c534d414f752ab862f99cd4fa9131fdecdd025f9cba7c1332e1c9156fd1d9aa0298b7f9160a6aa3ec29d3380b6d5e7d8a4dbdbe589385d2ee9abe2838bb7139e58dbb6855e8df581461aab5a731701c5775fa84c449fb886b467dc0aebba439d748eeeb0f769eaab698cf0b81039caaa5bc04ae6a3440d70730140e5736e42057baa62898548442e5504cc169a97898bb0e77f0ec9f641f281ad46728d17d694ab35979a4c0f065701f361df60d48d2f088a108c8cd1b709d69b8b88da5c6a5aea3b76e48be2939b98eb51842e1bcf290ce18e9f62f3e503df63524bc089c8d6bfb21718fa1a199b21ff9b8a8877c65b5de4deec9915e29c745f7762f3f9646088da25aa1a5077ccf4fd8dd54f0ac97408d4ab32d88945359e07f51e5d3e3eb1c0344d3e14b447e09963e5c2a0f5dc0925aa6aa0691282e56a45742b5f127ed20c34601b34415137274ecb9f214a98f419809cce655ae05506035160a3ff0c35cbb44afc9e6ed6eb4e638db43091c268026d3b1e8a9a804f1cfc6b8af3d7185fcc32bb313da4d56735393551594f3763741da532376b427e5f0517003e41960753e94781c78125c2d8d1e7201ab67eb28b5a9ce198d4cf77fbe9a926012945f49fac5468d228b900728f84da76e3c58e5fdf57f3625d8d7a449ee1186f25e839049b1c504f91cf3802a760223753907ec64d3ebd7512118b401ac28bf5edbfa7a581a220f318d6451e776bfb3bc749d46e576f773b969885634499aa053f6f70e744c1545efc2c6c44c7e544a7a9d399f1def4d4e727a82f4a5cb02d0fb0df2409bca7c9b98f98cafe44806c4e529e0920f186eea1abd4bfabcd265a4b2bcb064567710b90aa6c12f7918cc90ab630ba430b8547a43f7e833710b4c63c59cf838437a447aa797cc24759e5bdc5a2e345c98235f34b709bdf0c6ad1128b6ec0a83fc9394c3140e2daa3157fa57144aec4de2f780bcdb120cb58154bec2beb1731663edea8ada3bfe154fa65bb0d73b5ee688989346e865ca4b781b24e9097dc92eca09115d3fb15582c0a5b5c5badc53ed1a55a15d11695827febd76392f06c368611547d853db6d753067dec8afe44ac823125ccb4d412cd2bdd33f4a8e34c5b2a4aa71917d86d6c71fe182679adb088ccd43719","title":"1143.最长公共子序列","link":"https://leetcode-cn.com/problems/longest-common-subsequence","question_id":1250,"issue_number":60},"58":{"day":58,"pres":[],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n\n一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。\n\n机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。\n\n问总共有多少条不同的路径?\n\n```\n\n![](https://p.ipic.vip/61uj0k.jpg)\n\n```\n例如,上图是一个7 x 3 的网格。有多少可能的路径?\n\n \n\n示例 1:\n\n输入: m = 3, n = 2\n输出: 3\n解释:\n从左上角开始,总共有 3 条路径可以到达右下角。\n1. 向右 -> 向右 -> 向下\n2. 向右 -> 向下 -> 向右\n3. 向下 -> 向右 -> 向右\n示例 2:\n\n输入: m = 7, n = 3\n输出: 28\n \n\n提示:\n\n1 <= m, n <= 100\n题目数据保证答案小于等于 2 * 10 ^ 9\n\n```","content":"096221cf5b628be1e73e8bcfe626c73473853d84c0a528f07f6231776859580899120eaab71a6acaa2c327b76ceabd51b4230a8a962459d2b221b53ea2e5ff2df533792a8edac8e21c268fb58889556c788e17c5d7e1897bf130c52760534a0aadf3a56330fbdbaaf3dd80a47e56154cf81698693f5a99aa3da4f20db30e9d6da839a8e0fd0c237e1dc24cfb0ff868da5cf9e52ed5e04a4c96a71e3b4208389b1e2b3e4823cf61c2e6c7ebf48a671f7d07a8e1f977022f8d1ddf6cb4db194f2b3dd34ab10e7a970fd3d12f37dd202d18fd21a4374b4bcfbb45ee630ff597f90adcf6c05fd0fb309d9e6e15b6e5feeb9d0f7df1a4d5c9233715248f04312f1da8cc438584869a4592477f5c0dc95c5575cedbb432fa0886f1491a52d6efed703e5b3dc2896ca70b4d46ba60143ad8287cb7ca39309eff44cdaa58e4fb4789568b11528e95261e5c46baae7bedc8ef548fe8fed1d684ec8876d363cfd0503814e4ddafea3bfc8227897b283e140e25bece7fabf973fa6c4977023bc65fedcf8861268a5d077f3a83cb1428ec2c74de091e80330adc98a772b5a77906db6d5f487c5e65ca9383bfe201ae842375c1d5b4eb45a9fff3ab55e801403629ce630ee29de44588a1950bc63375fb4a612e19537958db20f2b38b9bf91adb0913a184c11da7069fffca0919d7540147f5b9cebf41497476ff2b73b65f0ec43eb2514b861908cfaae3a44f80ad06e91bd0d782ce72619ead90e2600ccd3d4fdbaee1e0f64de02d536e52eda5a13c517fcfb9e6e0197c2d433e56cf12cbd8167f150da66a05256132bba8d4cbe05a662167c1770b64d81b1edc1345ae4fb1f09bf6162c1208e9b41e4116722b146f2f3ba86430f9846d0353a59cc9bdbb32ae16a7a73437534b2f2c3f23708abdf6775627d03c8feda30b254ab546c939af26c3c149dddb990ff53eb06bd60b13f3dfc8a963434d61fd1d73987394c7f4d828e953a29733dbe66bd22e40579db826699039db57e79781d280ee9e9571049cf746f84657bfceb65e975779b6b94b510825132b2a93de27050a28d6090c0d12547b8370a413a62c7e2015059a3965a01dd2ae7244b3a64182a09e57ac7aea67114bf94965c40323007b37564ebe7cbd4316f841b4916332ebfe899890d7470d5e02bacecca5f5e69f88060dc8d8fa25eaa32977687af0b6a2555a27aea06ffa174832a46a817a71482e4f260a75a5418d5e4c1b031a91e3ee8f010f8d896efc71e469ca446bd910ec8f4bbc3f75f3880dbe99d1131417df810f5cdad48770655b0b7f565c1e0c29f34351e0967f26ec3d72e09165e0818f02ec94d2175882f88871e20873fc49b26a2b2be35f32184d50b39acbc9b0c58c8fffba87296e29414fcb3c82d13da37a2b7215942f775f0959b2e02039a31e19ce22067ae7c78b7678afe01c5d96ed7f605949caef3e71a84df75ae525e926b8a78bca03c1e36912884a9f7004a4d2c2328f9f6a9ff02431fc9d175cd99cf43fc096b9f6c47770d92107553969c8edc052fa1a7f89cb4492fccf1ffcfc108a064bbde76e476c71810009622a4ab215eed18845a0d792f11624d98466f72868e34d6f59af1844e2514a2871b287b774a5046d693437aac6db9d26bdc7fe74285dc91b8c0df2d6b6f64a5df02e2fdd1f3b03247e450bb5b310bdcdf71b79553ffd9867aaf057121d3875b3af17970b7ff0b0776e9141dbf3dec81d15e05999f938971f22be1ff7afbbe009d771c61b621cc21682113580d581c1ced97216f919b948f0c0feb173390d9f306971d202f3dfe8232783e00c4ae89711dffdd26724a7621605241cad839ce5624909014e233d75329a1e019d4895105f172ff9fdd0693749733ca8afa4761506e3fc892ce05fce770958f8eedbf1c9a0f967faaff4068421c917ef75fb0711a8a4e3c486e312678f23abe3c757fe91be26dcd8093d9b6ecc71609c6d718f5599cafa7414a24221c4f688bbe551f531e13ff654baff4d71c6d9d49d9f1521e8fa50ab5ba5289d272d199af1b6677be04887bb8479c0fc8c70b1e971a505efc405cccfa963438a106a94c2b362eacb1c3ebc0ab710e1205f2ba1634182f7efb8c2e3010d35af9f83e7bd490f6709a8987d18c67483bddd854f656a6fd86505c3c6c414f35d22d1c6e762442ccb72d17ed7541370ea0155b560a9bd5266c5f607c6644bb95f96d8eec28a2d497a8b21993b8a9c44266da1506439741459212e33ef25b8c5a9689049b96f8018a4c0beddbdf9c34f713bad9b011d3d8a585609cf901ff7b87fb980e2d73aee77a4f41fe55e098fed3ce8dd34117021065e2879346262cb7856a093560094ed48d56afac8d8f3e3cc5c8e453ee06b347346e08d57b3346e07ce71db4cae3dac5943c00f636fe8a4d2e24a8eb12d080eb913b56e53911206e158d3abc4bb9d17f0bd6c64e9b73611266e9b7eba08109092acf9f1318b5b3fc4a13aa3e554759e712c9cdd89c6767e22f334f8842a7a23dac0a020f16a7703d467bf3cc793b8b06a07fc51c70943eefb5532a256aeb7ea6f175e964e7eb20e373a9463e1567a7d9a9efc71be9c9cb1eff0ba0c0ed8a3396aac4f6a71e530ce0ad6204fbb7a7da50b89c9127d6b3b62a258654836a2a61b354df06a005bfe5f00b380438b2ba4a9241c9e9eb54ce7ea870024ecb7abfba380a1b168e69099cb2967ad0cbae68da88f76a79eead6c1ea4c3dd48a93c4a963ac54500fba2e698639440af99af14390f5380f1aaec7ae6cbadd046f2499816e535faa2d67dc2a030f62261b58bbcdf3a36fa9337a8c81f83d077618693f00880180f91d7babc993eb1ede774bdda6b9c19c84867e7264a4cf21482dbcf132e329911f2df344224575dac6cec3b408a5cc378c6c894f842dba58b16c2d601b4796f6f5b1980dc444c2d06999b57f2c732ee77bd5cd56f5490602cf7e9f49239c889c8a726f5880e31f3d5ad515d0e4affc91ae750e44085c67cdede390fd6e23824bde4a65f387beec5b13aee59588e2fc8e8d8ff726d160ea59ff1edf9e443d5ae1a3cdc9d5cec266cabe192f717fc2e45c953764ef25a96fbd2fa7866b9bf352813a1bde84ab7984cf8dd04e5552915bfd0cb5cf3d9e6df54aedeea86c70b57d3e3a1e2e11731e6c73cd98b879abc5c30d40c607bf65304db2181b23f0cf61c0bbe44ae47f69821611b3fdcbdd70f6cd62208a63ae1f6a517e9a0f2ba05e5c6be770eaec459502b5881c5c1f1785b17ce4a0be4c71bd1994bd6b5a4259c130c80c407a042505fecc3321df741219dfb537b3133108f2555fcae9e5c1850fed21b65c65978461e75506513cc5720a755048c0e0ce2afbfa5b16271c364f5af317f1de5ec9d1395c54fe725693029bc0d44b1e1d343f16a8d76db60853bd57572f25986ecb5d8bd6a2901b8ef927240223f5f93079dbdd2ab4515e779ca1a383d74302923149deb43bd58f067ed947d43f919bf25f5d8789a59773c74151ec7204593f49b58627bf77aed8233dc6ceac8bb738480a91d3e2e7f697c2e4aa8d315287de5c25974f0851f9c4689d889394ff053aa0830214f83903dc5817eaad6f68ad597cd5f6e8fe81202f01fece6093081f12cebe28fb1683e9446ea1f982f0cbdf888dc7b1b31af78ceb8de2f3c3b787f6e24f91a714fe622735985d1f2f139de52fb5212fe270255c4162a316586dbaaa1845ea9f6beffc14863cc6c81b4170cd2a65619a07a9679df91edff95b4e97a78675fd9821d4c6ea5778aec107c2085973b263f3793ad3756c5e824458e0e5e5d6b6f7f1d5fb12c678e8055f60688001f57ecb3a1320285cb5a9af634499ca496d3a0fa405821c1bd62c6c19eda101e1a986d7b88fa1919766a14d1954e36843f6d324198ca780f7db94cab05ed2605453c5472dabd6dcbbba96c1bac37513116ec30f715a2503c8e3631cb5d899de02f14dbc740b945d8e6254de2c3af4867c73e5898ea065be39969007ccf5201563645df5c3884d9c12250f269af023ca08e43820cb3aa993c7ce2a28f4723ae87c4ebf86d765be976a74d618d0cbc8b928a283d68f4ed1fc20581169f071ef239a73c5e7877b657426ac981d1344de68c6e6c8d38d991915d3fb147f0406447f59b2cc3ddcaf5a21e81eb99e5189dfe61c6aa9e729d03757e058a1840a2cdae1c73b3e84e88de709dbf472a8229e70c8f74b9f925876c29bcdf2a7d612774b5a51fcef8aa2b22891bcd91ec6c6ca80c9ad2e65275961f32df60525c709fabd2beb866a88f2ee399c278446eef6d887f323dbc5232019767f8f0d6ebed11cfe7601edb3c7f35da263bb2039dbc66423bb8963c6d9474e1ea8a243d3fd6765592c5f02806cd025c8b68fa9bad795e2100b71ba37be40a988ee52943159e1aab53436d23a0c2889526c2d2e474169551e11e0b088afd50b6efb9637b14472d9ac4188833832f1afe49285d5b1553beecfe26703662c89b8f53e42087ab87f8f8cac26bf327dcb4be8a57f6f685c9478c0fe983bffdd4baaebd1bcfabf59f572c73d8553c1028751c4a4ddb1f1afbe733817f60e7b430ca1706702d8ac88eb448404dc36206e03d8953e1f650667f293dd7586f99573a458e1fcfa13472d652de6fa704fc8101168c518ab9b48408f86d4da7adeb141c9fe5acbba2239c6c74b628f15bda636ca04b0d7c3a19d3149683ddae47b94eb76328bcd64b03ddd4d1a5f6f26b9cad10e2c95a698592efe07c4aeeb9674c5d5749c238753b7298ccc7e97086f86f566e0947d24e925e6531ff676e38f5d4bd7bdf97caff2ad52aebd16275a764bb77f03c834f103e93ba59e3285bedbc49b7e9819760e6cc3b4e8716ba8978d20438843ce64666238404f94d0113011e8856b5f260f73e6830990acbb04b5d6d8c686d43ead886ae22b45dba023225106741a0c7e56bd78355e37ebcc5511e1465fcb7ba6c3ab89ff4e57e9c841868d097116a08ba43b745eca4244d2a37f72be7a043e364e5e1c234f319b8a7c90c16256c72e26c5ddd69b82b26a8e9f0d147071d0334b35fb20beb3c8e066c438a4180bc636feb930e69ef35cd6fcdb3b720166857c0578183b2d4658f83143be21da0b21440ba1e5c0925a1f3966769a6f39609ed20ffa9f30dcee225bb23c7431545d1c2403632998e8d011b458c4201c976eceba7acb94d78efe874859fddd8ac65c5d65baaea1b07226deca7e4fff594314c3c108b93ca3146ad88f8e54b7027a21d1498b9e05af5a9ad43937a6a0c0a7f59cfd533443e218b5c5e7c5552146aab5733b906beaf2e98a8c8f96b5d7986c4d3d79018636c5cc0b871917cc8e024a39c9579d858287c47eb3dfab227942c166cf6975e44502fb83fd21d2aaa12ba72e2f8abfe245c2d54773c3d75ea5cc2f5420b3ebc625696b6e240393ea254fda6e04f2047ffff7f47ded69c955a71e4183b3db106b96914db1a6b222a43f0a5523e979bc96d9e010b8430a65fb221253a0343c3a33aab243dc784619f1adf28197f0942d5f706b0095429fb07177135eb07301066ecaf523da6e819f06424edabc09b6cdeb16bc35d5156375432615c0907f91ebc5e29a16112308a3b55f68a228109a8338a3bebe7c3bc05a759cefbb808f7b97cb25f6cd393dffd55f9957ae679f5cde8ad56b561b4d454d168f6cadec771ae04b5e22ad283d1d3dc61eb6979fcab1f2108cfa1d8931a592546023a1d4f0802d5c084f4cbd4fd08ac8441b522377597fe48b1e56ad94066d050e9e9dd318c88cba4e1af26146d9443160fe6c10aa46dc4a6ad6ea76315d3d89f20109160685731f889ffcdf1c8377705ba328d61e57444ad278bafaf45d43dad3bcb6a5919f88f33cbf20b7ab24effad59db253000f2780cb9cbb7655f8d05e3b951dd5e814d3f22fabcdaa2482ef3c33f23650d1fedd802a8bb1d6cbb6dbe3c1ec5804c9b584ff5c520c4453b846bee6c589365f20484ea7248d180a04c738a984d55fcacb8db7178d3eb701eea7479c8858dc5a129a99bde12805cb1bb454d7e25a9de5008f50a566a93a997226deb09dfacdc41bfd11f26cb909d861777039ca6d7bd05c01ca179897ab787941ba988be49ced02b56ab4d8a649ca328321bf79284a1bb3fd1f272fb323eb0042e9c3cba65a678f25cd717c3db2a1381fbb4e759a1fbc8e5591695f9e79adc38c54af97344f39adcb0e0863b3f36c44ec761ec1d2c27037a494bc785329fce598ad32afb2b9075f803402421817f0657b8fae48e642cb15d602a15ba7775bbd4536dcaba3b1d698a112f8cc55d68236dc0dab85c10c03bb328ebea24486714e88357878d9761ba93a13546e1717486bf167247fe399e2858234e74351b20b8558767ab51dc4eaa1f007cc396cf7b3a0c1a1c05f3b918ba96ebfdeb54842e737a75299e2d59332d6f0c5bf416c227926067c5b4c5fea536586aa7d8627942747a4daebb6118d0fd7164e14a5e31e58af95f01164c212e7e3caafac1670dce3fe9f828226962e650150ae03d9cecc235d775e80659b34bd6f9aabed8c62a9ecb77631eb04b45cff5a7fdb82a47e3d507d8cca150799b5be","title":"62. 不同路径","link":"https://leetcode-cn.com/problems/unique-paths/","question_id":62,"issue_number":61},"59":{"day":59,"pres":["动态规划","数组"],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从 0 开始。即最左上角的格子记为 (0, 0),最右下角的记为 (N-1, N-1)。 \n\n现有一个 “马”(也译作 “骑士”)位于 (r, c) ,并打算进行 K 次移动。 \n\n如下图所示,国际象棋的 “马” 每一步先沿水平或垂直方向移动 2 个格子,然后向与之相垂直的方向再移动 1 个格子,共有 8 个可选的位置。\n\n\n现在 “马” 每一步都从可选的位置(包括棋盘外部的)中独立随机地选择一个进行移动,直到移动了 K 次或跳到了棋盘外面。\n\n求移动结束后,“马” 仍留在棋盘上的概率。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f259c1c3385f76f7230696b5e66115584ac2460e5fd220008b051ee154dd47dc5882972a5cb38d746f23aa4faee7bbf7166609ec0c2fc0d268fa687d35e703aab6d949ba3009b39aa6ac5e9aaab854d6fdf1b6eb79a2c203d0e6bb39cc1b333d54c2c2859f1cf7ff5b6c4198359e336d62768346920316bc42a8719768763e0d30a884e253d5dcfd82079f08ffc3959772a276cc6f6207a7a2ca6851d787a89a9f4f2bfd9ef64973dea7b45f60d119d7bbb48075aa10cc2e82f36cbe4f4e539fd45a19ebe4762cf278d926b2f38cda0f3b906eea04d83f5372ef8bedf85cd020a59d28fd964661a4cc030484a1fe0b771e5df8dfdd42680e4d10dc95c5a76c03506a5386d900adbfba14aaae90896268b4149cf05e8dd1ec36057a97ae1e6e9943b58d5daef2206d12c9158f421815b0c8afc463704cc352b8b1c278550daa8da91b89488d44e9f0cca7da8f430d880d0f776838574f851556a2e566e8b9639a8ae0fdf12135b587fd73c93d8dc1f1ae9142c085a88a66338a1405bb06332d7540f97e6a811e687e9d24332014805bf87477a72328d32d5f71f1995f3d259c5a8cfcfaa4fd702653b2aff7a03e8b7e54da385a88212a7d82ef302750f310d6f914affd3dcac8eb7438ee94566658c18e30d551e5527895f0248cbba96e6cbaad8c236515667e0cb4892509b99769a996f806144b363e014807eebbad1fa1a3cb9cfdae83a57c9b249e3b2ecf2cd9f63fe91ddefe583ac3f5163cda3d4c139d6b9f397d0424a8e873b167f1bf80f31511c18c4f7c4b5b67f055f58805d2f6873f65ec34c2bb827f3d2686c162c1f10f8b5236fc9c9f8d2db8fef20feb16535a8aae4a4bbdfb08d2972951f4a4614d040283aec8038d3b38ee0166ce752dfcad7433c2fd569a464ac4c95f51781edce61ff520eda11763ab4a1c6e3166c2e23c9571d8bf6436fa0883cb11691c17af3823ff95b2761fa2299a2204daf7e8cfc8b794a4b06957f179ee3413ff1ed79bd9f2ae37e173a0682d6565008668511deee83802be6240d18099bea31b5c432d15578b3271650a12ad50399ff79ed7902e5838d82559e6729caad6116d313af3c759634b30e2a9c1ed64fc642d69e9f722eeac3ac441d1f8eb3c3d12d60470a672f2c0b0929dfd9c012373eb5a0de30b5302d555e1bafa75ef2304add0acd48c5e48fd9e7e9d8dc7dc40088f787ee58b892939b4975a2dc14c136805fb1276dbc4fc1ff15b75f2fd8ef4888f091057879cde093e21d6513a4ddcbb2f8d4b39ec4ad29cf9963fe9d63831c34bbb7149793d448e22e3c80fe82d59173f10771e35bbe6701c24efd63f72149d7fded9af2cbc1e0d67449dc85b8a1b21eaf2154d44bfbf7bcd977dd3a94d3ae394680eb068eca559cd7ce13465688fc5a009fd476669e8595a429962a74ba688911af6b67c65b27454b802728e0d06723b82d562e3f18b56273eb5613efd40abe30761c2a643dfebe56735f5e5a1189682b1810456b22d0611754bbca48a5125ba0ffdd238626535245df454f568f12248c98c374bfa0b7952cffdf1c1e7710a6f64d96624f9518622fff0c38bf4a0d7352f1fcaa3bcb2619290046efd2b8e232d09dd5156d6a8541b37d9be1f7a66016a015478f155c7106180608d0de3ae2b2e56621627482ad04fcd416460e5c16afc4b431c2911d7e88bf07b1352e6b638bad30cc4c15f95dfab628b7682c3a6ba256fe0befae9f451abf103a82e28dcff2d46b2bf8059949cedafeb37a39079b306a7ed12bd6dddf2526a4da0167c49a26cafdd2672f8043131e121e93b391cc48442a284014267e3680fd8a238df6202b6d1fb280c02853733c489ac7fe724674dea9e43f8239d23a4b718583cbb187aab009fefb8b0add65fe7f9063be5d3df1efcdb1f3f571098547e9d1a6ff7c56fa09a3be3150c54ca42e52f90361e931a088b94a7dcd6b719acedec0de32bd2ca157ce2bc5f33936f9b5a8b9c64f2d8c8e4cc1138c7fcd1166458f90eb5702b975e4fea528b2d4e92c99820b896aa4e95b5575a267628c155e7a73cd29eca3550ffb41ac4a9e3601b6316571b1154125c2ee170c05949c94eabd411f6b15809b7903c743a2b1ca984675476edb5f04c4ecc427e65e2aeac7e4584b30dc71c27dd66e0770c51b55b547ab987068e2e604e66b4e9f5f94d3dfc8983f497a8b21993b8aad632778bd5f7c307b375521141ae510b9c68054934e996f8107a6c6b3d086d0c278513796a60c2f208b636409d6921edfaf7e9dbbe3e638e44184fe3fc1b24f9faa41dd9c553839eae794bb868e1c5e85237bfbcb557fcffe2ba96ea887e1abb1c52cde6a7dab675818538a6d9b7691fede5cef59be2bf2318fcd5181e6f3497d309410a2262e1b3fb910a36f75b7a1d054d634d4998dcb51dae1266e89e910766f7afac66ddc852f452eb0a507d72617b6f100cebe751bcd776be7cad4b5453065c357a6996b2513b7a09d4467e9b3dd22a870c55a63426cce8164c8019e90323a9fd73bf9492605f79bb208cca170c380bd9b61d65558749988cf70a8b4908cc9f0850e0df9bff0c621901f498b5de84c961419fc680af90aeb92171c1d0a08cd492d0932cee1396327d6007a5a8a021be3df5ddf70a9cebebd5be7b806bdd92cec63dcf3d7c3c4feb1f018f0f7d1df6000817e166d3b5b71f667552c362569b29f3a3d6f4071a93198b2846ca4e257f6d0e35d2e14990301d086d71f2a15d47e46c5eefc0610b8b1c873e9d203f48cf2e5b3e391395c6c29c121501edb8ef8b786f596a7cac614b6b4d35736fcd3d3aa489f5d619de6f9cfddcfc72f4a39989c784810f3fb28e560a15164e66e5a043b9d8396dcf423ceb2728c25c71bff50c163fe7a6471541696e4e0bcdb408a0e95857495ee23296909f526d9cd0de745060fde23930f37dc84ced478631195f2417c06cf5cd8aeaeedd3a77d794808076adfe1e381a06223d946cc4665baeda0fe0c44ffb7dadf9facc6cf87c5269e68a501bd43e7e55d3c44dbeb92b9c3fac368c48a2e346a71caa012d04a20c925e021e92fcc8a6b80f852d43a59de899e60848184c16804369156fd1dc8e57dde699035a5a82893a008bd9cbbd4a8c9dbf6ef9a7dd6fd06c38486b0992db5668ceee31fdea6813555e70f630e35d90a7fc16111c0f4deec57dc0aebba43d43adaeebaf775ade67396c7f70e20c0b4288808a4fd150b61781205f13d3a7b5735be3698901b1b36595fb568c8dec7ccb0b33a569de448f29ec81330c152ade9d048c19b5f2f0c484da5399c7ade8833058b11d0de948837a3b4a0ad95674e09a36133ec82e2989b89e75194240a9b6e17b393d17fedf0578a200610cec681e2e1ba5713fa13229721ef9283935dc65b5de4deec9915a495690d7f23f4e33029c2c738bb114b3e86e8fc8def1152d76e0d8ec8689d814c2e9e4efe15543e659bc0344d3e14b447a6d631e5caaff4da7250e360bd3b1dc1ac231b212b0f1226865e6925184a795f646e148e97285198be128b95ce3e70e05506035160a3ff457b9fb406bdcd3aedad536b90f165c5975a1928754ad2a8ce29118124e5ab830a248632b6312cd9dc676e133551594f3763741da5327e25167e134444545d41cf5762a037fac9b5779a9bc1fe141dcd62cf810de7ab98d9cf6686e9a22610326ff49fac5468d228b900728fcd9c76eb89920cce69a03940d6404498e7182364bb6d769b00502191c93e02eb21712760eb29a63664c07309118a40119eaca58af6c9a1abb35d8852ab491e333b8072ba329e6e5a6f66469f83af634499aa053f2b2093018c0425b551175390e54fbaa997c98a92b587b355887e061de3796ccddf2e5486a9d8ab9a83e0fe44d2291a07cc4720b5d695f5ee8cebbac375134c44e90f381c254ec8fe7e1ca4d8d6c852bf50a12d5bf102e9324ff42c3af4867c73e589d3d80aea6cc4de07dddf20512c311fb986884d9c157040688ab84cac4eea6d6e826bfcd6f1c02c60af3339bc7107ae97d73bac972874995df296c6a56de0dba9ca3e90a8680b1924fc71a123d13c86eea5726b600ccc9b03139160fb45525a14411b3375d5f0dbfbb6c3ecc89e2968f86c079f8f57d9093829c18c2e99e76c3cdf6ed29c52b26e5abdb4f0ecc7fe811e2e3139892529e6468304b23f29c92d5beff8563328f2ea9695d4fb90e56b2acb8bd9538edb860285acede2949656d0b65577cd24e73a27d81af8aa25eab6608cf3be199101ae48c6d9d5acdd20e7e721051b777d830a52a712d16f374590a2ce33ec0b63b21bda46963a24d1cf7fa2a8520e7d95182dfda3486808771278","title":"688. “马”在棋盘上的概率","link":"https://leetcode-cn.com/problems/knight-probability-in-chessboard/","question_id":688,"issue_number":62},"60":{"day":60,"pres":[],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n在 \"100 game\" 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和达到或超过 100 的玩家,即为胜者。\n\n如果我们将游戏规则改为 “玩家不能重复使用整数” 呢?\n\n例如,两个玩家可以轮流从公共整数池中抽取从 1 到 15 的整数(不放回),直到累计整数和 >= 100。\n\n给定一个整数 maxChoosableInteger (整数池中可选择的最大数)和另一个整数 desiredTotal(累计和),判断先出手的玩家是否能稳赢(假设两位玩家游戏时都表现最佳)?\n\n你可以假设 maxChoosableInteger 不会大于 20, desiredTotal 不会大于 300。\n\n示例:\n\n输入:\nmaxChoosableInteger = 10\ndesiredTotal = 11\n\n输出:\nfalse\n\n解释:\n无论第一个玩家选择哪个整数,他都会失败。\n第一个玩家可以选择从 1 到 10 的整数。\n如果第一个玩家选择 1,那么第二个玩家只能选择从 2 到 10 的整数。\n第二个玩家可以通过选择整数 10(那么累积和为 11 >= desiredTotal),从而取得胜利.\n同样地,第一个玩家选择任意其他整数,第二个玩家都会赢。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2792103385f3677f31437a54532e54a18c2d7fe710b3f0987cab7ab5e61db7220ad3962513d4f02ff460b3e5f06ee02c656797d1cce04620c3abc49410683eea32ecfee24fdeb15ce047074a2b7dbfa53bd80bdfca6069b7ef8e2e0a0435b837cce7e9cd09243ec382cbf515fa2586bd46755d0d117c1cf376f636f762ee54d3088740252d5d0806f47ec880355e7f25771418a1f14ce580bbf294771e493dabc8f479282f63aa322cb0a1fc171f5aa343ff5268cb7dfc905c3982412372aa20c56f7f2db1810959b8cb353a7f8489afeb3f9ffb5e0d10a88130e7e6e6920551db4144612e080a27a80e3e0a20a8d8796b362e5cfec539791451cfd1b7f65edbb425ff2593a837580382e4cf75f92f2fade563cdbef7aa2cba91c37a295aa50cb48e4863c54f449f695ada8479831152af951630524eb0af53d1c2dc6b8cf7e1d1cca1efbe5fd060dcdb6d1414cde6a3f31afeb334856f33fbbe902888c0ba1279b4a0672b330567ba5f87a6ae317894054f5159d8f75e5cea692ac05863ab6757e3f2e849d1ec4c6a876a022d5e8feb10551879a167a6df796992b0a46da7fed6b8c565b56c536f79d70254c12730c52967ef30a66c76b73f437f6c6b1d0af976a88fdecfe58c39e9f6220e4936f6be111558e3f542e6bf8c3e3b427faecce2b870d3d368c9ff4b864099b54f9a997f806144b36dc7118750c0b1d5ff16069bcef2f43b4ed87616dcc991f0baef74b3e6ed908aa2053e7d4cc6a5c509931a75545215e96792e463223e46f6435f4c5253fda99ea1f13a32381076d32f7153f542f64c24bc21f6e14c59a8c06f069ce03b0094ffa0beefea8712a0e557997c11bcc5927a6909a873ac104b492416371849b9a17089bef5544e26f32888f6b8012546b77af6339b1ac2f55dd0f0890ffc0376cd46081cde17413ba6ccf9b491321529dc96f4ddd538cd5295a433dbc765e0084542af70b72ad1a408ae6d774193cfbcdb398fe11c1f90aaa9c97097ae29e65b14293b83c04d513a6340af51e3bba32bcd310f2f1d92ca3db5e524d15c417ca3bf518b0cd50390f241e47a20cb81a5bb54b67908ea4b0e6fb08644e8c465e8f28045bc7f98578b2ae51f9c4f2de1c7a54d0c3682b8dad30043470040232b38083ad0dae71b370db2aacc0eb62407564511a18768f20361d01bf94efac48dc2e4eecaeb7dc4098bc1a6ee7d9a9ea7a24951a0df00fe399760be2f79b056e9fc23ad510cc3e354b7f88a37724ffa05258a475e42cefa9feefa8ad79384e72d8bfbaed427800ddffa2e5ee013412ec31efbbf5f0aa6d6fe2ce77b28dd28f35d479b405f5bcd2844d9d8ea45723200750883fb2e6e3c5dfe51f7153bb06b88bbb49c13fa94505b13ee30998c902ccb52add4eb004d529811ca6cc7e11104b5edcabea1f12b6c990aec5dff2ae023b389969102dfe87a5fdc0983307cafd0c33a909767a5f87e3df4942076cb8eded0ad84cf9cfbc795489be4abe7ec3c04c075325559dea460d24a7835fdf20e8712575066e24679668d32218faec0749bbeb89524f1f3311e6c28abd9499955639c315e25fa3638bc480c4f77f3dcb939e73b17381943cdff559f1a99c4dc702442c01ab131f1e5a5fb6251fb2906dd03320d09564508bb74a324c1d433bddca23ae579c989674e542b26d0ad9f97cf822f7e8186029d042d4967898323ce7e33f34fc0bb11a16b1722ad0b16a73a95c9b52c478a7a7193a8d2ccb9887a699138cd02fd8995a2045f3fd9545b32be3fbf81ecabf323846c5d4c43a96dfcd5462a95751310161aa8b773ac500d5222245f2a3b6d945e65a01bf527156d1fbb8ed41a5f741145a0c2ff425b74deade511b6ff7eaf4160958fcbba8aba9406fde78925c266c37c9063ae9bac7c2a5e1c340b909c4ab76b3b759a25177f4089d25b64a614934506f96b3ce643fd9cca1872b6354dd57564c2f53abd11b357ff03cfc72834f292ab8bf04d15a7867ee413af7acd3843449ebdea6424ba56e0fcaa28b0effe2caab40a925dafed6d92e8e13f54e57450342fd564b480045bd615cb4be0660e34e2067339150c65446ab8cb9e3f9f80c2bc7420683189955a0c2be42a7529fd2a71000ae23745eca8aa2e0f90d42e572ea796a447f03eb959a0e1b809fbdc228c3549ceb66871db49d79d0ff21f383d5347dccb9735a74ef80d0da1a2b06cd38e85e7e0bbaac2e06efe470d59a01a925ae07f8f312b795e75224badb2bd490889f6ae4f1a6744a3b87b8d931fe4839752a801d02c4046f2ca0aaee2876d11a7c9ac09555d277400f2b214fcd87f1996bf120da000d3761775763e43fe4986fe62b2def8980bf95cff762c198f30c265eb64a3764285416226abf2fc229463f2a3e7dc3cc864a792596065c711ad6f9994d752c3e0cbfe202f5f6c371dfa6a1fc18b721e75347ceb5bd3bd586a9906e7764b92661593dd91cc405e22fa36f88e397205d7292a81d84376be09d23fff1ce9c163e7b06be4009eb00930a4e634ec702723e09baa35c1a857c385bb9360e2b8c8901f4e3dee2c571d6d437460d6a23679bedf7dcd9c932e980f8d0bdfc176baea7de10a10c4f68dd2e24f86b9cde32a7098f0a61dfff5a07f80d4384daa03a90925dae4522f3a9d7b17e265ac6d1e2c3b426f0ff303f3f5c4ca6235b1720848396951f85d442c001eae4466a6c39bcba660b44254059d4a7e8f3f520bf92c0ca3c5e534131de6a8ea18f5890166ad0578e894873bf59755e1ff99d1cb9a8c5d056b64b031d9f148393dd381b5f18541238b0f9dfa54f167577e6cb319ded21b2813433f3c43a39c5ff306adfea6191fb5118a26a6d579dcf4c3bc30446f177bfb25209429a92fda4bb116db4e90e49ed6cd3f1f7d0d638b30a74f5ffb532687edf6bd23e3510ad1588eaf9b09f035c9cf6b4d6850eccc8c0743efbba01a9f445966475f61e2a08090f1a26b402b0545a6bc12887ee84f9df1fd6691cc130966dfdbb9c0c499c921ea63be15b30f645d99b79d33675c67563828ed1c6d62307f70a1a113cb190f8769ec06f37be2c12e9bb6c16ecc9a426c178f10042344fbb1a854ed431dbcb7289be243cc2f7bd42c45de092661431872133f290edd30985e810d456931ee72088ae4c51f93e7d9561da840741f0cc7326dcc48549ab19d8a7d33af6373e05cfc6f7e3935906977911d215b98e42a20b23b08f1a3461167780671a2747b5c83a941aa4d61d9b3a29fb31f845b6b0f59327ca6fa557bfc3761394614cc5b85d1689563f525584a061ea5e004945377bf8767e1573444d973166f6d1837fca1870fa5a94a454b015d074d9771ce9d3df391616b179e5c29cc16fc9dde09410c4a5a07d6b852de9037e9471e4530f803fdc8277e4eb33f6d55909ada837b05d5ed134be3068497b06c2d4c3b4592f259fdad4e55e65403f4e102e2fed0d29ca3257cf2f8aed139f02536ec2159637334a6e97dbb3dc9f14749e89bf394dd8ddb0b94eaecf4ee9adddcab841f50a6f15d13a74e1174faea469a9aaf94d20f38a4b90d31d63a1ce1593fcfae6c74ad6949d6e3e6f5be392f1febc85b93070b20c29d37f40ca5e97367a1ffb1fdd6da80abcfb0803af583e3421a3976170b3e875ad6ee0b853d3758e36941502bf4950bf67a1da4220d0b1a6fc4acc364b598f4cb5b5a04c4ae5d877f8cf34a2b55bf436c14e53edd15b7985be78d3d7cdcf7882d96bc5480fc863252feba286059620feb7afa6e17883a404287430e8fa6ebc2b3e0edd3ce5d47ce078ca5b3fd0df67c851ea7e6cfafe6254b30c4813608c38affb47bc408f4ec3f8ccedf45538c070c17047118574723bb75cceaee7797ab7850999b0a0b0f13255d564b8366a1df996c83b81e1209752a15547c7bfad6bee10794bddb9fea0b5edc368ec6d6449d068406c5cc3fe3a41945d22c77b5de1f3baac6ddb362a629ad9053989865471e649b59644fa57d80c8d2ac0203a21ec42ffae847c46f1f0002bbd00fbdcd4cb4e2344360bf7437c35eaf9904170276c02d641a0ea00f6dec8cdcaa6ab611855ff457213197e39cbd412f85d71bdd3f97f2828ca5c993a41665631736722354240342f9177a97c7038d596b618bd07e9cb33c31cc1bcda879f70617ded5b9b5c9b4d159271b410adff9709028904ae9fd7f819d4749cf82f91d0c6f1165525466c9e3afa2b13b95b1dc21c5ead082d29923570f5856dc28db22cb71bb35d432a1e75d255862da5c8b2d847b88a6bf8f5ff78f4d037f327fc05a6dd98d3da0dc8a2b3665f35e8a6ba73b39db42bfe02c50e8432189dbe109d166defe725f55300c78d4a34c89fcaa9de1b6d8c88767214fc24ed166aed2af6c963b73f9b1fa0438d433536bed46692a21467166167a45e6b0aca6c5427dee825eb25576c1f50e85886c72b5bfec80c7d6bf5766d985a33142356fdbf1a66a294b3392b7040410b4378ae00dc00859edbee7e45bad4f1716fd40678e2d5c5c5a02c50aef7dc871c01695058d5381eed8adb4e1ad627e4f904b361003f43e2e538de985bb4c964cce7a272b4e86c7330a62067af9d8833ad8b7f3668452cbfcf013277d247fa7b7701486455c78c51ea3c94b6ae9cd98e96fb5e30084fe0185ef6f7b839516248e6dbde236e318f5d1d7bd94741a376497eb7f9ed5147dce910fa430ca2401456330a9dda14478ccfc826e2eb8528aedbfdf3b8bd57cd12f871dbe2ad723f10e8d9651608e4914b58433a22ac7ee12ea4d549cd013302d9d63790286183bd08fadfc8926beef24a86ef32dbe2f499c1532566f5ea312d19c98af5f3677c1cd670b21ae936e867d9623626a5f0a464cacef8a214df6d7adbbfc681387513962ed1574f2c686d47afdf3209f2b58dbe473591b7b3d570c74499232711564f2f00d78e14d5f852f96e9abd4d56457e99a04d2d85b3f16e4dbdf757453ca017c9ddc7027944e162b594e2e4577077ed5997cf38e26138f4158d0cfd8cbbda76e92940d7d3c3083604b46b46ce8e74407951b9525dda770ff015ab3566372892b6e2ac3f7cf8012ebebf8d9c5e4dba62798a735e244ccf4f1c248025230d3dab8c1f86e9fe5ff0e11af58b530dcee660bb22174180074497c4d2d47debbd801bd7284601af2160a5dd04b675518244ac89c54091154d6cfd055300976ea831873ee8b65ff8cce20569165f872eeaf204e048954ccf8a518a0284bb3039c3265fca73764580a3018479bb3c06fef644b00639d9ce4284db9b50bea2d78136717025008525fd0e6aba4fed96e4e4aed11dce50a36929ec954d345686d0806c64d4701ca90c25fe12c899cae0c526f3504ab335736b27ca7e3482437b5a6ffd8c13346846342d7dac23449019f84e39a999e4a2cb2a210dad8398b987fbee96cb9240ddb7e958836384582f7273e85332d778d12f8e6b4a608a62b07276de40486d3863accbb9e15b5f5b7946413cd1acfd0dc51143d1d7f6569c199c3d7d750cd470ce86c6a1be473c59ee30f5ddc51a42c52e0badf7766cc044265b613f2709fa7a6edfda74f49c438207d3b569bfdccb42bbf55ad08a0d63a22fd0c4034828dc219f8684d35192dbe495aee4e53eab22111d92e9e03fe58eb77097cf0dad587c9b0a74dd2256d8fc765d7f9e433fae2afb7009e075f3568760da34b40b94c9e2a5bf49ba0401167439ad1fba99a78db3e126581aba3ce90e696046974564e3c8f6e210d9cb9d918f8b4ba573efb434916d0b38d7dcc13b065da6152dace613f7f3889c725003f2c4580972c3f441ac33db0faf46b4ff3400647118b463d1644ff4ec6f4b7b3b795a3c5c9357db2126d8773f8e094be6207090389cb8c999affab894653fe0eabb42a8e970fdca0a773c8e8959f5af97ad6fe7b0f8f8993eac8a6ffead1c1572bcf747645fac4bc47539246b8e3c6971c5c1a664cbd398e0e2607fe05a8a6c356ccfb8282388239ba04f2ac83c18d0f835d74c7a2c2922c77a00cdd0dca98339d84679637ca582fd53bfd998da0fe80d0b9fe5e9f0e892dc369abd191b92980f000bf837ef0ac1f1f87ed8f7c1f5f120660ef862badd9b714c969d866ab3f752864eff39ac7d27be62b83cd4ad41a1eecb723820488a9bd6b645d71fd423711eb6644bd43f38963ec1919ee37ecdc06166ef0c48be1ac3e22a2c32db26d84de9626a24c3075ed90a821021260cee8b639e9f3e9518acbea83019bf3577cdc5d8942fc0784749529daba2698d34b77357d663066a77a04c76f3fa058c411e5963d7c21b44752508950811ab10f1f7fd82903f3640f5929100b5d69ea626667e381a586dc3eaa607b7a8039b4c5c6b50bf7ea87dc05d81262eda5a6fcb9cc58229180bb6192f5b66e69e613aa5291ecd88911d4e1c3b95a79ceeea9ba156d3a39c4333f9dea368742c71139dff59224a8599f52c1f9a07372b56685994efcc34fe307742311659a8b151116abc9c4248b2e395309b212d1c88a3c4f3e14e50252e66fe52d1d3f2ee4786c08a784038942b574bca9593749ebd895fd5d7bc6af247b0e3fa12f772d18ab4a6953bc10ac7636cb4d6e667d565d1c9fc47db8feb40d457ef0eb072613a259cdad9bf4531ff905e63e25e7c469fb77300f2c8c1aae9890675f61549316eb26b8fa82e4346a25182604e4efbf41db4a2f97e5981dbf3123bc2a1e16ac331a976ea03ae67d8c88ee7052bd76aaf401b5635fda49ae478d18357b0b4d7df81aeed3797d46c19939a92b19eb6045e9e30ddc27c3f946be6dbf63d515113deb0642d00c63c326fcf71e275ab374ea43e22ace847ac4960977f7f883373404603662e51747124180238fa2a3df80a80f3430d9eae40579713e725dc9f69679025a0cdd36d54ffcb9f1c3b48fe081fbc4e586665919f2b37d47f3ed7efe2a5fff4b0fad1f3e5b09a2352a89934789f56c2e3ae8d77d615ddb06fa5fbe9a27b1fa1081b30e4740734369b1904aae8516744a3f863a0813f32c15e001cbc92c1de4e65fa0f521bfd3783374cab7b4c1b96722896a7f6416427af0298f802b2a82dc119bc237f244d16209e6e5f80c2635c1ba4b791a3c1c13c5fe695c4ff089269a935eaf2be89049e824916feb755f6c8fa6de4eaac18ce39cd0f978dc89f1e331dc8adc9a4a9bbe2c3423ea1a06bf17a3267f01aabeaed46718beb2f5a826c27e2d535fc7e3c0a0f66509ad0db881158c06ee3d1eaa220b07cb136421b38df53cc42d30bb1d96eb9c92df5dbc946bb0850d7c025e82463938bc9e77f19a5a4d0850a9371769c7d7afeba39ab4d11ed1e3ae97bbdedf8423498cf3a33574c332ce882387cb8260367514c792f84428a172c27757f251159097e23091f2e237be5dc66296c6ecbf44bf504f36f3ab351532b7a7bbc42fca237bea2847ff23b4029dca3112b5a61d147999edf93b6c683a7e4a0e30acc0bc26bb9a2dd9c4feb3864d5ce987153a6d714e2848f986e5ac6dc56aed976dae2a0752f1115b9312c23cb140634ddd1ebc69b5221b45c2dad3ca9df5aaa6cc597fc1f5a9744a8cd2fd3f66ccb18309a1acdf4549c472ef4fc1380d978d65d037b0f01ad937bf9fc75b27eee150c517a2ca5f0df80149024c2d65e14a0786281465a4b8bb06d1d762141034ba39a38ed79d7a34ffa0c469682abffc9643148f126934fde1b331e6de82a1e960ed99beed8c10f8443689a0d68f58e95d859a88eada55dc70b7af898464cef4d4b55ed1bfacf5a1e0d60ffe8f09f34d47499dffaa41103f72f1d00e5d280bf39d22236cad7b62e574e7064e6da647e6ed4c860c07bfa2a2a51d6341d4640e8f77e4e4431985a07bad9ae81c63bed4c898087c84f0fca5a3384091192c39aafadefc166fe8386935d362b0f8ec6d225e0fa58b8cfbe44c997d990618e753cbbf5ddf0b5fa12cfc56783b51f183df51b145f8878a3638d85b0b332baf0114bf8bf5325e93c6e1b27e0921d1e4e48f314c5f5544d3d563c50283a86dbda8f25beed4469628fc75f586e070a09dafcab944aa5aa8134b9c0b9d090800c873aa0935228bb28c884eb064577f5fc7a28d3fae78fecca5524916a1eca1dfd1fd2fe1e3ffd8e3962d2db83ea788327eab6c4f1e9bf64139b056bff28e3f960fa5e90ebc4c8e5700800a647907844e32c9e965b49266949336a185d8b7f3a95ba85e3da167949b57e9cbb9ea4b983570194d7b73cc51a0c664bc4ca71c15c6515035352ed9c6aff3b3bfb21fcf55c6ede5c80fdddfed34c0e0ffad733b5b80bbdc6f72ace0bbb0c56ebd71a116c09b77372bed7022826b81145fed23019948aaf36eb5e9be5afb6edf270c3a65db733ef422b6996633cdeaab1baf742dba854f7f29cd008f3e37b0a38b610dff5c51d45ac4d212c61e5c527544207093c3b681c2e4fc562a004c9d0d000065b80abc1fd87ef7fc5ad84eac2a8e6f9aefcd6dddcb1d7dfa8ce3e76f667c99a6675064c1ad24662ee2adcce77ecfc673d1af4c1dd893c0829af9f54071f9218839d26f0d9462490651033bed9c44479be4c9e9852bfa111d5669476017db6004257064053c730a946371890a8f804cdeba2b92a5e41d7314bb8b0d7e77fb7a68b3699e4a08295310a527b3bbfd63e75bbfd5da9c285d10017696a1e3bf13096e9afcb9b35603f0c932aa9350ffdbbf4604ccf2a6d660bd0aef3ecae5a156af1a57fa0d5bb69077b2d247b1f0ab27a0cd8e8354897b7e76600244e94d549ae2791dbe650a1b23ea62511b541b9b1f2b9f5404cfd65c8d9b59e69c31ced16d32e677feb9f267a249e7250dabf46bf107b8d69e5f300f435cde8948956089d24e0d8c2df76960efc7de97a06063cd1b81ca791b5f27591a459a1946e452feff996be9936cd88d9f910658a05841b24780def70c3baa21db0c99da408f43269e4aca22039504db9c8d933e19e6e80cb1e2501c5e96af8dc399d0c1a7ed9a4e14068dd157bee867824f2af1643905b08611918463b8a813fde8bf0f305d9dba3c68abf6b100c1b4048e9b3daa49d7b01f9443622308b11cfb5f36b982a76fc57fd48ec60ead6840b434989d62463e2828263fd23b21c865e2f66a60dd44be55b85a7bde37587a311c3e2847acb52658a49351833aa5a129a0665744155e1aff0ad078dfe8fc34131f1be1dcd448f46dc7dfebd48e388585f273e1c207777bd43004657561783bd7547ee281cba9adc0f1e99ab9cdc6711344e13bd27abf75121dcee52c43539ddf793a0d7fec972664b7ba22f1c614e4798ef90fa0dc6b1287a532d551a9be535a2904b79d7b4a7e0e7e30d97fab6d4ab464e78ab42bdd014e5ac7293cce44dc757380559082c89fb0ddb0328b779dfa65d108c18778e71a18e3ce08e05329987dae9278fea16e211a0d2a0f54fa6ddbac8a698ee5fae7eededd5111496f8d61278f60c1d2463e7c7c1b9e7dbf6792f6f0b6a45530ab9638d7c902cbd4d51b0f8851b9df203a85560c10567c37691cc639723284731a3f068d081636384b5e1c45fdbdf80b8b19afa58350f531cb1f6cd819f072f2722538b9955fa1092a5d532c74c3232794348cf37b97dd5606cd82737d9ead04061e75b0b1529c11f002c359fcf80654b95ad924ac4f432765ace4d7c5473c8ea935f590d69ebe1d1dd5047cc71b2b4a321ef0bace5878ee1d5f16137835df7d12e4716985844bcd2c9438822f72f587e8d0abd31fc36c5d623ea2672b69871ae055d6222a289d8a62ce17c26d104857fa7f2a75610ceb2797e828efd8844b5040d299c51be1a27b2a641361614d8cab019f36764af8b7fb4d71e403001ec196ae701adc2309def3315311f6d22b4a18da986a4b2e9e3b93994de1ed3b5c140daaf577afcfd1c849cb135735132861615f03023e5975b06f0977220c22e3620346d2fba7f21289b07b099ad022b9abda59761c7497a52770fb1c222c2f13d2be3f8448e23a42aca1f162af38234adede3e65bc76b6fbd3e1985c9dc897c65a2b060efa60d636c03bafead6bfca083d39c4754f1ceb1c2d16537ab60021f5f816318fe4c22bf8dcf6cf1a50c7a04ab7744ca73932ede10dab69286e307ae848038ff3054ac40362f8b9d855ec42d12809420b3528fdc454ee8ce1294d23cc1a8f1c6729867afad5be04e8818b686545bc7c7d257c8cd50a06d7e256312150fbeb05a8115259c5953fb14d08a8174a64c451f368228d8272ee473ebbbafa2025f47eded22d7ebb5da3924453d8c8165b78335fab2765f2c57bbb116318d9f19274b5f72aa2b917a89dedfd8cc09497e221c87ae32dd47d8e2204c8cf87bdc4d68d235a6e9ead31ebe2d8add2a26de785ca1307bd357f3e154cdf82e932da7654c98bf72c1f7c93a4561ca0a9250f6113d376ecba754e2966a84f498ecd907f4e80d2e346508e2aa53adbb1d4fdb3b94492bf1d5c2bc8b097d9a06ad93ceb863d3100771e99789946fd486b4d03c1b33befb51248e650cae9eb8a3d55ccc5e54134f85363d64630bdd5edf3a51d76ab69ddf2e4d02c79f00dfb74d75db3fd6880cc1342eb55d487b5e1319f50e58b5041532fd3208ce33bfb3f3d2166b949bbcf401e51543fc590b93e8adaaa9dbc54f0e062cfbf789653d085a22f266f64e613658c0f1e2c9af8259bbaa3f7315d883f321f461f5b383d7096f548537fecc1b679c8c19cd26bacbc796c6d94adcb38583dc0b3e7377da35fc3a729232f38045c71f2ace6e1e0e25c59e326db9e0646aff488177965612f6ab317ac6bbc60a31a80ae5e1588e49538650069f56b210ee37bbc101570fa17566b778a775946eb05f3d307e97513ee6b33bb35d7879f4eafc155c713b644f6a128cb94f49cc6b2bf9114706f06184012e6117c16635c735814a0ab0788dd049f9162c53e31fef4a1bff972a0e2ef725497b42e9fb3fb5990c395a02b6761151698cf23d218d6b5a08957d3cce6fc9fe3df9b7767e09e36267aaa079a2f6b4932ddb95f51dc5eb6b896c925a7c93bb45789550202ca64c686a8f69ee1f5980668a24a9f7290fd0a8fbd65fd1be19206d567e8eb239a12ca6a3c62cadcecf1ee259c7d39873db5283f12207b0af4f37351c0d3eabc2f1683f50839a02f2a80cdc4e7e5e7c2f01fdf834339244683b42a7ae2a419a4accfc081ac86079684f3244d6b4c37ab81df1774bebef6534f178b698d64c250430a235b4431aa0608602e1d64c613abeb23c63315912977995785381fdc8ae892e279de4462511e77309ebc52f8ab2e762a6153bce44ed5369d8f502d37a6076fc68b157a3134c403bb8fe7ddc52043dede651c388b3d9418625ec6a64fa50efee10f159d63ff2ca91f36d60e55baabc80a24195f71e2f4f1922b2fe0daa16c56500c941c5fe62598ff65d5009d376855d543064a64db3ee8ec17bfd5da22bdc8c1ce2de328eb9f3e16070c336ca3299c08abb69082bff6620067a22eedabe51a8c5ddfba54a2fc4ba51594614b3b52cc3d23855d0b218ed3bfeb5976cd19f2ce9fa657fd9a48ac4465a2b447543cd97e067859bbb28387574e17a9ea245fb77c0693ba8af52c1da886267eb0640847872bbc00dd196d37518c17e47549f8b551786065560c78de1544726af27a5a9cd5a4b3b909bbb55c7564f368d6d97216c82af37cde4af4e6c612739b46482b35e5e9eb109d257946ff0d68653918219a330ad06f4374ec8725ff97a649b19b8d0a2d9fbd85540dd622221b90af5450849b46d2ce5062e9b491645e45c19d769afb454b259511637a486b89e622bb0770db1c67243e4830983c67f16dc8c1dc8fa6d1a8f7bbc31850534ec0813513f1aa662629fade52e786cce0932986193ec64ea2d788eb3c0bafc131177bbe4c56c96ec6d82667043455ffa08efb298a17bdf7aabbbf065d77dd968853ad9b8932c845d48e3d46a929324a70073e366ecefeb339bed9aa1e499c3b00ef2a9afe40819e06de0f285302e84da4a6ec2a03ba0a61e1ab5686468fd75f1bc6d728f09b465a993bdef423a100e549941bf21934bde894c49b17bcc5dd4f032925064824c9ea3fc62f379c1fa235478319b4199eef49442ef2d01e28621dadb83a27e399dd9247dd39740a012763f78930afeb1e16ef54632e6cdb482fc14357ab308ceb74c87efcd5d0d7acf062adb6bf384c75b6c051912df35228df95fc20a39334f0f12e9af0f8177d526fe1055a6637e63d4128f52d32cad7994d403c7be0b5db1b8b9624d5c7b602fd533a48b20f21ec10a4cb01f49f6e97cdc529bb03e9051bd09e25a7609e24a9b0c41c55a601d93316b95695cdf077cfcf7deabb3488fa4b6f90a153225ca27da48c3c4ac57feebf12b20aa422bcdc65364e95ba0ada7e38d226639b0509ed1a5fdbb4deb2926d911e0522be9c5cdd8bab0c52c088290dbdd42cff6db768d6e170f9f6d85d2ed6d7e75b432230a0faf2b5580c5d6dae5c611eb6fc1ae63f33cadeb7c39d3a38232fdc5deb3aea627f4a2fcf1b79662074d4319bb284ad3257c02f373fc62c3b819a5ccca152a06079bb4de1e1ab97c35371d24727927204d7a61fe828c908803ff1402802e22cb5fc4433d9d512481fffdfc48a6809c54c48f39cbaaf6d9c0fc6ae4bf90fc90a33ebc2be131ffc755f2c547c124ce4fb7a524d30b825a05fb6aad6c07a33c809804df8276b14b317b6a8c915c666c5ded9aab6b4fea2efe8d52475c9cbf5d842650f269f2ac1777dff4c744ed79f0a35d871bc8fd090e1ff51676c5377dd537dbc000a0ff806d6848fa824d4f567f872cb6f39eaf9839f45b1434e6dc6035ed81740bc9ec0faa87f509b5f88d0f8945e002771a4ef39ca143a5b64fa7fbad60370dd5ac63b973638da661ecabdaf55ff98cb6d0e369bac9e8f38aed085a4b5210e6c3019d236786403fa6908d171ce7ce79d5846f6ed6a85c7567c6b172486658dd4729912772962e5cc163ff69297cb536bddf69715f12745eb391602baacc1d797b9950c3b664863ddc35d92aebeafe2c349e307b81553a0dc8481895e18eb549ba083bccae6a85630f39769ad8361746fd22d92625a6bdb3fa7e266c3cafa285e5d66a4ae9f820e69d1b283cf160249238b08fc132a1db683a3b012701fe615377d9a9d6fd5970f6c06e564e267f81bbde20547e048fc219272800fe206ae5fe6a7f90c32ce7febbf165593802c616d11bf0ad2fce3628dd3eaaf366dc83c5068721c2664a2bb66ce2ab14f2d107a78cf6d1eb3af9c90db2e081435779853f30763b2d8da9365d1f9dd8a2c758c17fabe937f134c500f10e4884045a9035621ba133edac81c7b2f232319de2222f46d2453873a3ef6337cb1dc65b3cae17b7d174587d92a5dae8cd0b6efe7c06100bb6d87de2ddd34803b516cc4e38c9d4bf90a4ffd574cd3e007de480fd3884cc39e862e52c887d87b8484df8b951428f16ba01400c5546a2d0919d9440f2c0bda412754618383ef89e3550864024662302b7eab49688f8233bdb54dad1339dfe1e17ee220072dc15ca4e40ee924b5c72ff8070f626f4ba815dfc1559cdad20b928577183451477b096312353f8bc55790e738b764d7d235567f371b3792e89d494a552733c403b4708a6e05fa3de83f309c3c6e565a44083cff4bd32635ce1223fdfd9b8b1b9752bc6f9d5fe40df23e276756da134a5109cb41d602ba9a1d360d74c9b0b8342fd2d7d684239cf50c5460640b10c2e7a4f25d9bb9c37a6d802a9160d1299c67ebdd79d2de030d0ad53efc14f65a93c31ce3a27e3c84ab5c8e498fc35317dfeb6e338769e845cb121598c80af4acd39a77f7446113f8429d80c04a88495d290582229852516d35c8542f93e0a5ffbbef1d06d48e89dfa74aefdec893eff8c0fc3e4db743cc27d84093ec82216eb52152fcc9a6360f23eaa861518f5d5ce25003aabe573ccf30362acb7fc936c39d9bb6518e349dd554ce464d5bbf4f97c994e14270f027a4c89287c1e28f62cd1f0571d8b0f0f93ba5361b6ebfbc316f0f07a99d87d41910625dc9199121614de2ad8b9e688b79c9a3d84ad9709287969290ff492ea9c47c5a55ed8cb9b01a9356076f9b207596d523ce170f0e1bd82f1136cd3053a50af358f472b18a17c370bdf3e0b3c6a0ad2e328b43eb336f8857d6f89b8f7afdd6efa60f405ad50758bde2ce9fa0ff7ee2f9407360c3ae4f6352bb124a70d38d676795432fae021d84cb31ecf26294374364e7bf771facc9376231a42f32f9a402f88f686c7c48dc3175e67b5aec7291c8877958ff22c04012953a747f2dcdd2d6c32c0c11b5740c9eb440b416ae611563d04efbd8b1d9625003c880d93485bab66afc32cb53b24154e0b2dc066683ad0cf9346a615f3f8476fed210e27116393e3f2b321bab40b1486074939d4b70ec11f7dca794f920de1d26fdde46199ec37e88fc15fd3c1b4204401ed04732761f23c2043cb90e876a1070f7eec67f1e44764653bffca1ecdfd288dfc86243fce2586c7481a6069b49e322dfb9cb83829020d6847795574cf01811309e555c61bad5273236b8d43e587a60a72963aa1f0c15cb0c5e18dfc2371e35aa25fe611246bbbcdcfff43a47ece3bd24b3bb63b87423356554308465556db97b6142051c1fb6deb238d291cf65805ed1427c846b6ea4d622c42e660e4be6cb4e730322b6530bc70e550446b034bd7741da7017496bdecbb382191f4309b2068591912af4667a91ae90e3c311e5a7a300de73409726ae73033946788258398922691cb445a392feba287941efe7a729985d728adfb6d17d8b6f994cd23991c3ee9bce5976728bf51266e691e99d92b6603ba66b13bd89090d76c71b8d5c97601966ea439a33029d25ecce1e6ec3dd878915db93c8c669a8f7e7243b8815b98229e83f2c4b9ddf2d09ac7c8d787bd6e6231900b59bc05059c5ad2a9eae5b3c8662b370826d1b4efc95885c661c904a3ac951154d14e9fb15a538d2683e78c1843adf0ce30909269f56f7d213b206d3922c796286c3fc0f56ebc4f293ed5684bfcd10e4e4b407f23fc5f6f2f65db3ac16d53e7bbfaf50949593102a337273c47c30ff55443d64c97093b4c6da07fb57d7807ce01a7ba4a9c60b37120a3891278f6b1273aea1c54de7327867f3dc8956a5ac09038a2a6306cb5bb0b7cd92647ecfcb665c84778444d50f90a66defa349c17a0bf2acc02eb0d0aa7e41c2948e9225764c086051b066ddedd228ccad0ca890bdc6aafaa1bbd5d0a2f98ff3e9ff1fed8b11fc117e00c727ff7992e7c3ae4c7fe69d4298cbbb19c8334b38fb900c05d208ee1297db4d6531263e273a9d0b3474ca1f5ad07fcdfb979439b2c4a591bdc8751b77aa5cdf2eb43d5a69b84be05b436fba0bbc2e4f2ebc3b703d3d843b7dab48d341ff5d657b921166e4f22eb5878e49a32f27eed069f7f6973a1753751cf4d7eae8f63c9ae8f56d98b990b987e9d72301be5a463dae7a8b6ed3f9c0a77ea62ff77a9192a703770a0f37148b0c97095e72fbcb8ce5d52cdfb9a0ab126d7c745125df673966994e69577875fd96bf780fe3cf84dabdbc6c25d468f25c1901bf228b919ded4b798c3c9acb21c45e7197929d5a92e6b802496ec6ecdd7ac0ea4c3388e08398997f444ba69a50a033642ec53a1dcc278195d0ac0a5a3eb2e0d6f2a9702bad167b185f610243972953ecf3c4056e180687d27d820ef5b42249df6d4d460730db97095140630c72f168d2f2041a18bdb0cba1ea35a6a51060d32b8e7155c1dd94052914ccc1d731a7f85acb32a75282405eef1c16a6a4c52dd28663664282d6c5ef2dacc0d75d6472b21253ff5dc8c7c518a266ad596f30216817fd3a034e6efbcdcf3b8cee514e7dfe2b57f930dfe92e4a3bb2c105b5f259a57f023adeaee33d5ad3561d06c16a7644d6f0e94e3967dd9f030a42434c213da1cfd5cbf3ee8d33c4f8097d6726b6b4f2822a47d933b1b3efd633d69fc17e6630232cbcd7d119bf0b449d3d17506fc80461b49b04d1ecdc8b4034d4177d99aa9244bf47ac6df607c7bc959f0a415ef35e5d549b33006c6146b1396c24e463e4ccac26cef527acae1fad8dec82918f3569c3a8b52c8cab8f6a0d42fcf941c61c748aadd301ef3901d9c1d2888e5ad7cf3d8b80a7357cb42b194ccff672d9e65215513ac8bdff09236a2fde4949b4a631c5f8daf8c1c92869550fa203e162ac8fe98650d07e756109aa9eb044418464d3cc89b33181a76b0b27d0bd4c6cc3d57e61dd43a24161a82d03b9d9739415915f5bcea2bdea3d73201d18404a4d0fb0adcad09385d9f96e36763767dd7412d917e9597fe18d35c8c3256c186e317f143bac4e4064352af37601d276bdf095366a59ae63a09136d7c0b79b3802edab06e62152cfa06a27dcdf58ef3db126d25d0179ee004cb6ca59c935f44c8ea2a34c00882afa063c2703c9b95a4d18de9b6713d6fc1f571de0b9bcb9fc19eef9958af9239e4a7ff3c8f93f796e46cb4e96bc7697a199d9ea8add8320b32bc5fc4f0aa481bf257f143422a19ac1203ccf00ce48c80dd33f34c578ebeb53264fda0efe4a6e265273212202533acc829f7329b53f04db11cef90c857f0352715ef582eb68a40a8700c687460f0e9e72e1e67a49714bbcd91baf4beeac6b70b1056d7f8302fca2dc19960ab607683aa813fe18aabdff4ff2ae890a7ff34101c2eab0c4027b1014986fa16e8861529bce5c7c2962506c0631c3c6fe00666c9ac830d340b1c96244ac90cc415d2c4d5f31a083573eb12799c492d369b9d6190c0fc672ba2301a950f755602f63d0bf040327a1d3f456586eab171941b1c83a05940a560480c94159f9defbcf15a923d6c8098e23dd84ec416c3fda53ec45326bf51c3ce983325dd799458239e87d17f3139d69d0ab06b9d21dd26b053fd9178bddd55d92e8ba2446196a15c8f0929721d04a5603c76a5d9aafe02acf47dc06ea8193c285a4b2137f68661f5c19c3532fb114c52cfac0a64674284f1eae70efb26994de3eacd66667469b3e1a997e8551b75e567d722b3a8e6e4efe6411aae99157cf10cc43e6d9d065a04942500dfe0d71547c8d3feb92debda6c6e170a9d53cd2eed8ad8512775a189c3d2ab03fa402e979eda342198fbd05ec230e8de7b56540cabb5c67223f1e6d385022338e1b5e9aead750cdaa7beef072fd5b4d9ecd973308a1beb3c18dab6ed913e1d10b70657894c9a7b24f2f35ade8bd67667d1ca051d433927621986bc75ac54cea343158ccffaeb0b0e6f577046b2e7d25806cb32b62f42998b931aef54a73ffe6393b7ac7fb46e082421b9f8f7f90acb82e7859ad6411bbf23e383f2c959fedd13f5c18a79243dd322eed0935f641f2c54fa3fc7fa7ec691b21689df2d70ec297290b6fedc24bdffd8fb2ed6999f0e8993d564059b028d66115d0420abd5cb8b524738d1a543caa3a6b7dd46e6b2f66beeebd21d47362b5793ccc17bca3647426bf9a73fa5bac61cee08dc8726172405417787762bb3831f7a4f29b77a468c340f77a4fffdccbcbf6a7b2da7ae8e1fc4f9037ae31b6f0bc8c8edf2067ce51c99931cbf57866279d48ed54c9b7c9fcbc116b9ad40974ef9b1af44c3b2452db8a121d77586ef009147767f35b1567432164bf70ec7ef2ac9670c2f8cafbff529c9e321986357f569eebef45fa2982dfe0c2752641e02d24f7551cd47324ece6c1693a214dd9192b67aed49499ed8465ce0f2caaf4b53aec9ce6a1b51861eaa53c9e74ab5ce9369f61bf0be555f4d1a9ca7c752d367fe6a75e004849b81770954ad0dd5d397e8330bfdd3c6dc16e558e8dbfffdaea918fdaadc44fc37e2386551e7c098ab200b6d0be871ca9f1cde1145bf92d2392b997dbf97252482e09a4f65591a7e2ab4377a300356b781d9b2bd30fc43c809a275c0af298e80a1f1752a1fd504091c148f09629381126118e5d9c6a55a29af6eca43ac18362bd33b337eec35b1d57afeb75122d3a9b4e9462f5a768c445199180b9d53daf8b8b35adc59688ee37b88247719e74b199beff7c02ead7dec398cde4c47a6743cc4fc7445bae06b0872fc8418b10a9d30327d9804e6f8e4f10237172ca01e1c3ccf9239e04b6e836a25a7a714f67cd51191978d21d75ed58a1969ef784908b1cad1c4b3d1fdfc949c56bfc9d629f7162356ba17ee04548fae71a08b1534df362f80caac5706d888534c264e619e60ffc0823cca7e6374429e895b7e690503548754743047df6ac7b62f57b62501508287be91aaa4c98c14441ba92ee86eb23be24870055ba5a93c4c23a52de0d8c95d32a90532500b12b6e50ac1f3f75680d052ff881a9c4ddf6ba653e0cff8dc1f7c3eeaef31aceaa334e36d888dddee387eb0ec4d7c10fdcdf84834df8bc9e5e5c4c251d4fe5901f3f2c3eeb19d904be5443fe562ec19b43196e743ff9906a10bb91c2d183fedcc5a78bd9f27964dc769e66cf75aae36b69419e8badb80efdba42a6e436b53d61c5a3fd8371055baa9ce6b40b60aa4419fe6ccff3a4a49a3c2a36143543a1955af8ccad71bee343aa459f643b53c276cf1eec6e4514fb6ddbcc15d88c6e99eae7fd357dacd064e61394461e20570aee162b5dd8504d6aafef7a3f1a693bf6f0988a9102300c0fcee1ca537af6ccf4b4fcf12c4cdc1d577519d23a31cfbd2e42cf7f325adaae29a4e2a0c81b0ba35155749206e1e6ac8cd9c9b5ab96b1f1fd0e9c6e832a048d2b4d50731d957dab6cff0aec132b51a7e498c55f1f67dbefbc369578d0b517b7aed9fb6dc31a8ab17380d52eebbe9eaf4a91fa14c40e3d7b43e0ff597df4d0b8200dcc469d4faded2f33ed359079b6f25ac06a731d2796186a321a3ede89435b71805adaa5298b716f9de5e5d9b532f61b68140c07591af1a4dcbffcdfe9ef45ab25af2b8dfe934119cfa077620ed105b9f3ce005e1a26ce342c3b313f59e5762ee54447221ec3d1ec9383ce748934c34318aad6e556ebec85316e30884f24f92af32193e50f3902b2c124db99004f4fed59dfc52e82a63219fc8022b988532feb2f70a09a8a6062d5ce9910c0b01efb858589730c958d4aa8832b4405b6fa4e8dd059efacb3ed0abe625d793b7969fa5ba906c08c2e0b3eb07ffcb866d7ad31e616d6ee54b948053f08c8535aa831f2b12715c750ae27455558a80d355f71013dbd618e820640372c67175c8a261127825ae9a268937da804836217668f2659b3fff476a3ed9cb115e27d32eb7ecde51e83e569bfdf114367166cd350250b12eb3cf7578c1443954300cfc64f908a1a691c51ea5100110b680734ebdcfe9c970f8679a2ce6553cd5fab280f0be79a6d27b37d43c7b56ebc4a57325a6f76d71ec3c209b731952468ae2c3f9f1624964b1bbb5307b8c4eeceb2a2dc0d2f635aec935a6cb57ac5d289b8bbd445b50e488aee4d04195bd0c69c890ecb7de48cb8c54340f89acbd8b207d63a2b8fbbb36bdd16b09f645c006b31a354279ef2cbc45b5f0972a1506e7fcfe3ed4f21cf7a7a5ad1899456d9c4ad6299786a978e2ff64b628f873cbfbf1bccf8317d7b03ff2ea40d06ecdbfb8aa3f973692d73688bb7e0253ecc2ac79b3cd6d3457e4057948e4c99f5922e584ce80c6de3048ab34135637801cf1837f5d42de5d019ab05d1c6fb860fe801c57a3df980ebcbf78986bac54f4ad5de1f9d0afee6606cdef1058ac060d8cf8e50801117d60ea10d969a907dc1d8cf6eef04a0273029bc5d4304b814e370896f7d586a0b89a36e88e578261a03ea1216c213c2bfe120abac6ec9dbd7cc1c86658477ca22a3e737fdb0597901ff6969749054c76c0d0e898323706b7b47eb66dcab5c126fe1e1ba2b8d1f0fdfe4c6f20276f342864fe50778919f0ca3ba6c80086663fedd09aa33155b4cdf895b58712f293b7f9fa442140ee45651cba81bc8833f0721363bfa7b4b99fe16a680bfaed596a91629be21045d80851f8e2b9d9b3c5d95d9ad2e6f0c894205f9a12389a7e653b42b49fefc910c6a1f1cb9d6bb4e2c56ddb6079472ae1aa563ce2cfe7f3e1fb4bed3cc7e93950030986f18ce859269c6dbedf008a18c80b87137eda657ede48088d75fbb33390eae4aad256e3e77b7eb6e503e28cffd69d9b0e8f181e9570ef925300a8f79fb6c9983245c69831cdc73e2efc7389b5e80957e7120352e4302146069ff2deb3b7d32ba2c4516eee07da95051604bfa95be3549ef64fc7946f295d6f5a7c362c4344bf1502ab54b57366120018eab9d6ba57911381572855362d8157ac85efd79616fcf8125b9f9084e9ea8ca01a8496ef1fdde098e4f75513cb19ef4fff6502d3b6a2b782551c8848cc53c8bdcb8ebccdf6456279adc6fcf64d2708ef132aa2f24a79035ee3bffde132729db753505b2449c3bd6b2c8491a293fec0a352da20d1be9fa258dc03c41941c86df6bc27c13700667cbd49cf5091c8c1b44b69cadbad134a520b2c6d42f7482db3c630a1026fa3aacd20c34389716b5703ac9124ee6f0603b2e5c171d1362b9aa059e87983a97ac294a34452493548dd0bdacc8cb9a7d9cef7c3c7b0128c3eac4ccb16fff9e511672dbfd278159b4da08fa8778e9f1fb3b6f4ae1e4be3c3deaf22babe8ad1bf8ad2ffa0c10f1e197724669951d6f4bb0f9693450fa556e0546917b7c46c2883adefa5863938e338c069ad81848317610c56c609032ff3eadd8832e9989a641f0d3e4397dadfd7f75e5f45c6d5c8e288f33fdc06d1de13f7ee15ba9a8764ea85c1c619349f9e330c77e62e2288754ba317cd62950e4bec35f8d68b206be92a5ebb963a06b12cd00f6f813556c2853d2c0f6dd690ec7f8d0c5941c058467bffb8af37325d16dae6d58105714009c182953b6d9ab016f2677891f266077c35842fbaac43232d404bb1067965459dc8cf56ddcfc3bf8877eb9e8e3dc40a29232ba4d600aab467ec1f5e66fe61ac1916b680d5a71b0081d90e92c7076645c9c6b64af23f6b51119177e7ca83a0f73f37804bf74d982239684107d79a0e55571a5e9d3e4278893eb45cdaa2174302c05c81684ad7498533398f37d06487b0db001d214aab78c3f0e145f46a74717973017bb078ce5555bbac045f9109a3833c1f2891bf1a4c13b5c1494f1f657059bc5d2d8e5c9419d771d825b832d000fcc1575a1f37cb726511a91dfab48d50d095a2fc880c8308f5d361be31e1daa5816c07c6c866bd90573cfb82df2275b8beb7dcea70493c458127fa5a91577c0b61e831e7417c5c891159bb6190681a8223ca914d5bcdf8f9dde0181ea20662800caec778e7ebc3088b69e63b59fba5455005259db3c9e7f713b5dfffe92c89b19f43534a4efa4edf007175ab85f6a392c13106b0d1f0a999ac2515722d625ceb8f8c7182e701db17efc6c9b6f9288bdb42961eb7c7b2ee1c3dac1b1d895ecdbdebcff2ea8917d05e5bd3d818e2cef004742ca92e544ef44646721fe31a040cf03c63e540568c86e2af53e0370e85735806ac48873b9ea327d79d36986ee0712fb6afd64925cc41847b0b97746b044d9a63e28884390952ee0af9bbc8b29c6ac74cf071c845823e638c4ca9cc9cc70a77babc39ff4d847b6e4c78bf8e2cca1ed20b5eccb9d75a723e2c25caedc3e1472ae6f94249f1fa6b4480758d7bb41d95b8ae550d25c2ef1018d291089719699f97670e4d907c9d349d7e3c9ad0fcf1ed24ef020e30479d5b98dc8f4bf907dfdcc458f17a34ec6daf889566e1f244275328e0bdcaddee98f8e63967696c23f408a453d3d438c7abcc6177c68c51f7ff4b542255fd368220cf443ee55d083b316a25fcd7cda5d37d47556d4d86876636e4ee9cfcdab7e6817b9f7d43e25a74ca9bb5d681b001da3529545f4d4531a09d9896d455a635b3aeba53624805944e0ff77fb6cacfdb5162aaf555a1e13e1fbefeadd4c2e131e494c4a1dd4faf0b1650e95165bf27a6dd45d373148439801a0c43cb62c6c110f36d715dde49efc81c48403a841b746bbc7ed9facd196153d244c00e67dbb503687e10a90451e1e52cc67c912f3f4a82c3c8984b4c201ecfb6b997da764085713f5c736d9484e45c2bbb9ac1fda3df20dce0f568b33384143e5d3a5494623a9c5dff512346ab7159fdf016ec996d5b9e31742c1c940f86997ad80ce64f4ad307354ff72ad2580663cc77164edddf032f54bfc29e9a730a0840a0da49655b9850c019cc9a8e6b0c74ef473864607f941717b7437cb9747514fa03e8ee9b4015c79c137dadad1abded259c81f08094446f6ccb76986e7619cf9f016d8433d71dc99d48e12573f0ee3c115913547c3c25b560cbc00474e9c4561b22ff2cc6d21d5424ceab3b13f56c088b0b2b67d53e4c7b459a75222f4c8559c49cf16586d3383d2444cd06be8a3e373fe3748c1cfc7e11a1e037f745cda4c9cbd39","title":"464. 我能赢么","link":"https://leetcode-cn.com/problems/can-i-win/","question_id":464,"issue_number":63},"61":{"day":61,"pres":null,"tags":["动态规划","DFS"],"whys":null,"difficulty":"- 中等","description":"给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。\n\n```\n给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。\n\n注意:\n\n每个数组中的元素不会超过 100\n数组的大小不会超过 200\n示例 1:\n\n输入: [1, 5, 11, 5]\n\n输出: true\n\n解释: 数组可以分割成 [1, 5, 5] 和 [11].\n \n\n示例 2:\n\n输入: [1, 2, 3, 5]\n\n输出: false\n\n解释: 数组不能分割成两个元素和相等的子集.\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347186258a04f82d930a676b276a35031e3cfda9522af59c9092e660af7dffba08f46803c2903e14deb929b72dbea4fe2efd717a7794d6cdf604308db5888f497623ed7288d9a41d8b35b568ddf2a1bf884d6fdc1c6cfaf1446a7247fa4f14415d9751b4cfbcbe22aa14b6fccbfb0af6259ab644407f0e337812e055fc14f064c675146db11364043386f44217f5eaa41a12102e4a04dd61c2e6c7ebfb88781f4b1744645bbf58152ff13f8d3c76974e1b2f3ddf3baca07ee0405ae8ad8e5e2e70a33d20d9deebcfbb4229a3a687bdb4091ba2f32197dc79e195044aafb14c6b92137634e5f3a573024679826a590741c1d50ef197ebd27dca3673177ed93c275f97a2926fb132fc378d9c9b26eeed6ff82c2eaefa4ac08ee8449d7f1413f6247994c82e159ec655cf9e76e9f07c894fa813629597162c507e95ae46ecc4fb6187f3c9d0e193ed8e61d176ced7681017d5f7a3e815ffa21984513e3c3b102892fc7db8f173ea744c573cd656bb682031622598500e773187c3150cee2d43ff0909bb3222da98aa56bb9c7d04f6675a5264f1913a1d596de614838c2478c1d5b407d7ef8dcdeb30dc4b213c6ab75a6daeb89811a1edee3f926c439a3f654f665e2309fc55a88fc0c3deba34c4e328154dd340d7532a0198d7338a96cc612f0d2a85bab39b10bcc6048bfe2de96ddfc464f2c65e186469a669c93a68f490e6c5947a0a1c2d7f9f7165b12a0185bbb5bfe7fe24eddebae88edaa0580b5a89fde28e7d42513701368337a948b6aaaaa8a87c08254032b485ffcbfa796c2d772fc544206e8b11ce2c49af4353629afc16c15e0c9eef10c41d684c3ebab19b61c1fbe3991600756d1776780db9b816a1f0d69a181c3b438293ae114761b595c9625ec0e9d86913f07007d766f411a1a47d97ba934c8c3f16bd7f5f68daa75f5db7d1e9b15e92a27ef694ddc810cd6687700adda1cd897f5b076dfb0c9c8510ee71cc08f08c6148551b4ac1ce4854d5ea4749ac0706fa2ee5f85435f6946a0fb8eec34192795e20c7ae3f4b5c1efe6c9db6d433d0727577a7bb5c9a3dd504b0f370d67810f18388ab569b632fcfac8ca87911b300779124744123e76dfb068952a225fff3ab041b4cc2bab044135ed316734a3267cca66a512abd91dc79482cf3ccee5ddc394f295150e5a831ad2b368004b203deabf3ed8cbae8b311ed49d4d0c3a741dbd4aff3146ffc8108965db939eb2020e17ca48b23f80721a49c5de299935812638c88a289784743fef49dd4f08cd69689ef11afc55f51e2638d0f0dbba72d9996c64bed1c3786f481cda07cc43171dc53b25e17c448f28e614c10fba8ae989ea7e19185672aa9a5c4d69376fa0f2ebc70b1bd90b9fd4afcfad5cb6f72f18d27c3a66df388d86c0c4fe4836f61e5da1136b5e5deaf4323d2f242cd649c1bad31da3278550ce4056885df07a41ce7eb4b520bce075dba181087b43e35facc7e5b6957a287f29afcff9c5b950b6b0464f7eb23dd421472a6c75191136d90ffde0b8936505f7bef46795c863611622a43bbd2b3c8f0038d9c207b1b3ae5887ee1277ec0427b7aa10158e8626929589b86bb7363f98ae1531cc195dcc553a58682797e1fe24dd7278dadb3a90a649b761bb4670341675231568fdb778cb3b33f11092fa5e766fb8a607656062c135e68f0051687b2151003b9392d4a4b88ba13c14f1df25bfab40498680e07628675ff0ef5ad83781b90113283c048a5c6ab361baf74ba20a4d096ef705767b8643a6bac71fcb7853a7ae7dd580af6f670ef83ab7e56e47978611a63c0bdeba27c235220285c102865a67b668e30f81f156f3faa82e8005e53024898cbfe4b4b71cb9b098eee5fce7a2164fbfaf3fdd5affb7dc2ade632853efd15f84df12b13aa90e4c8b6f71a53af21b2c5c65eda9fba03d3d8073da240c048629c6b5c8042b6cbff681e965c2dc3c287a0e952e72be23df3579ee08ef9b889fed6ca0f49b1f915c87ee75cb85f7e003f3eeb4d1376f8879aa37bd8d142e0dbb848e04acdb946d6a2fe4e0de912e294eb78edb7990357ef0ecb4be26b3e1ee8077cd691ea0f2e863a7959a4d6ecc9d62f132a49b0f61132aa07a5cd95830e3f69058b605287f1aecf27d59cbcbfd730142f8f30da2bb2506610df7b0d81e74514d3afbaee619a713419ae0630780204818fcf27f802a64302294b5af034534f3d1234530961a73adb9eb13cef53d331a682322c7b163563c27861369ea902073e82436104c5b41cf0847cba8fe0f529ec69bdfd36ddb279a4ab44c19f5b2d33c6e397a5838f136a862572f9e47774cbfa29bc45a9adf0a7becc2dd6657d92765e177e64e410b3fce8b404cf2d31fd63e1220fcc1d2972f8a8af3dda2278541346fb2ae90041d8c1df28a002abc4ab5bc43935eec62de82c706d59ed0f8e6a489ef51155f01dba5818eb6988c9bd6019ff7d6ac0d6da857d3356e493706ce2ee99b7a4ac4472deb3d039a96ce95b55786cd88968c4189eb009308ecb3be246e0fd2b1c74cd497d36a7bf109463e1567a5a9791ca708eb89d84ccf3ba1d0cd0ab36589a4c484fe724ca08cb1c4da17f7cb82481da237d54276cad786a7028a2983df08c58682478fd7403b88547893ca6a80c3a9c9f9447e0d665ab68b3acc1beb2e9e28c0aa687cfb62b1ffe2a3c0a55401fa564175e3d4a36a9e26e0f140b67f678b0ddee6fc28079bdb8ef3e591dc0590db5ddcb717319aa11428582f25e6e84ddbe5caea20dbbc6ebafc7f2d0655bf3bd20e475261b2d5ababff595bec3cc16a4565edef25b457e51ba1aefeb193e33433f0a4096bcb0495eedf0ec732bd174a677dae03a83ff8afe10330f2911bc3264f036c84fc02be922be3aa6a7e4e4a85923177762fd4e980b10d8367d8b94acab51be5b6e905dffcea26aba07a2a9613e0b4b86a08d6226cbded22cec1e5d1238442ba7b2d7cdd8d8054d535562cdec1ee718f6c5724c536bb5e1103960173c6154045c48fd00ea43f439b30b22acd6cb3f06036f047a1d85436be6bb88a50451d341fac8039900a73aac6426c9e39cce4bd193664f14ac24050a6c3924db18c139855622c77aeb65f4224ed62e7dce07076b8ea2177b1a80e7b90a189b1e58056b4a97559c397441d7413645adcf2393ad9ad508b08423d9977f30575cb26ab0c19003947af02a673c27f9af689fd6a35d6985b77dd808bae6075435731748be20fe88d6fd73d1186595d68ac9c304e6c4de8499e2b3fece0721d5411f2eebb710a4133d06fd477ec6fbe0c3b62ce326905d6aa38449f355287534cd5c0a5265a4033144f061f774182a06284c42d414dec85cfdfa325b7d62acbf10df6fc2c1541f1c3f3f13b3de60b8cd258d28290d55dd6194c1489db9cbd13c49e3c2ccee1400a1810c019336c6ea9a0a5d70a7c75f1cde314fc8ac68d9c71f26d01bb346583e31da9273086a18b404b5cb6acfc2e67f08abeb5d98a0280ac5bd3e54732b0512a467baa885e660100a366e0a8ed97d1ccbb05ecedb896a38ca5506035132e6ab596785b40cbdd23dda874e6b1c41ee007baa616d361e9b2206f0c74283cfffc25863c366b62c2cc9d067a69ca197e1e1f1caead80da2f0e6f6b8deadd39a988e4efbe03f8e3f3642718d8dd09d5b53b673772aa1220321f3cf6686e9a226d59dd931021f91c17fee0c90b4273212d646014bf25fb416e8c17a98db2524bdeaec488bc106ae500bd79c304cf22d717f03bf76e971319475021188540f99b4e6c3a4daa481f008da52a0490f3a3bdc2eba76d83d5221330bcc8faf3705cbed406b6370a411935455fc3d6533ada5048d831622711a6c4e22a86cc3c5f374b585766ab49d353a01192c50734f817d9fde9f61828f0319095928254b7e58f0db8ed70aa894da92d80149ead920751031a07ad727afb30a47cb6a46de523aba8f7073202c1836b8676c8adec16550205b36290ef5053d8f1eddd494dd0566fc008176c144a875fc13121cbafa09bcc07eb8f93a4f5386712ac3b11fdb59094129e87d172c45fa0b2dad9ba4ec73c466971fb074446ab592f29f3352bea944de68cbcbeddcb88ff09f753f4a5c717948013e9bad65dec11f3e914abcfed332178e373cd4f74ab01724b557d5d222584d69004e27d6a9b241e6727fb708c917a12d61a07f12bfac0bdcfb666d7845d4fbd3a628604f5935c6702b0ac8574313050028a5bbd2edb801bf32d4a814ff3f0c9d687bb4cbc9af38db2b8cc024024f1249be494ae7f4fce6e75690831d0bbe290966bdbe95728274e77e891bb041bcac7c47974d64c895ac09e36ad1ab2d16542b5b5ed4b3459292efdba8b3998ebd452501cf1d8623e8858521d76310e3bbe1022bd87f5043ef4169764e146b3b753411b9e5a5e38b0b7cfe8b2af2012596c50ecc947d2fe0e0bc80c1dfa31332a6c8f03d42663a96fda57a61135acf64afa69165e30c29f74aeff46e6c3b249b79c5febe3ba1b619e7aecde4aeac5fbd74c82aea1695088e1589fedfacfbe5ba216b55aa4b6a4c03b76b7c5393e9cbee488342c37c2a6c04d3ce77141b4f28bc9ca530d8a3ed32ae148ab0a3563c57247ffa9d7014d400087fd204f6932f6a8f8cd4ee6bcda445d0fe1c98f26f6b83c94a48c13fbdac72ec05fdcdc3be803d127229c5e17b92b65132cf9703b507cc181d6c2a77afdaf34f73dde4914472e4788aedbfdf7fcd86749f7aca4eb22983a72cd00e74c4a671b5822d2ff4348e2b4db726f0eb096fd1b4f51a8d273ce441308ce1b599df01ce8011cc39d550ef0223ef3d78134e3ef5348ffb9fc105281f9dc3195316eacb66e8019488f084a3891b51c4b7a96729c198e18eba1b1cc1390eca047d49610f2178bc5542e404a79c467bb4ed93bed391c8a28c039bbf9589477ed29724e3cc0fbc2206025e13daea2f32b51643d7f7895c1f43cfb1ef42968967409feb5380e0b683dfe7fde1c0f17251f26146a1901ea4aeafb787c5db23a4631799eb3c7ed62d184670f466213d0fed5a954bb897c628baaf23abc4af1987603cc8f7cc861ed6d9f8dac7e7f1952ab689da67d80baae2832e1b285cce90eff99813b3888e065fc06633f6745fa2903ee4fbd383afb3ea9ba7c52d7819b2299e7caf9f778a086dcc4a7a72182764cab343031a6ad4cde954361576c7b61951da8b67d485fb2c55b45af56bc3a32953048b68cce6ae17b212478f0d9c3265fdac2a684e3930334b948ee760fd5e4a28699aa4dceea55838d32dafa7e7f5c1cf59297b5cf4e0a686cb16fa3ccc1f9e211289c7710e09e30bc0c5fbf8ea01d11054c13dc26be0239ea36c80f36d381ca90b7b37b777a6d97b2d1e9a484d8659d3c655bac62d1c4ec0be8b65e385980e7c1b0bc5de04928016e0ea40287fb558e160d026cfac476556d4a83656d737600f9d6282ddd4fb2bf3440a5532de63eac4f34dd1ddc41a0f1afebf1b6cc56abdf6b736175645482328e3feb8edb32cda299a4a2c791efa3257473d89a72cc568abc10e5e1a99b447db8cf442f8618d412d3c5e384e95ce27c5af87e5931e045c45f0bc5f33882810d6c66ca3aba4633bd513759da2a28ec03e9d9e6bb3d42a7cf6964d8419eb319651cededc2a510836043058d13ca1a83768b1615522f513263f6e9353b6929fd8b8af61a6fa1d8931f7d7006734bb81e48f614b1d2f76c054a7a0c844485a442a5f55f79e137c889e1eb3aba3586e2490010a62e6f26192a5dd1d5418a764de5cdc15bff71373c5f7a29f4168c6cf9196811c5ea39ffe8c27c7734656edba12d7e5e3a31efc4c1649ff864007367e4ac7be80db74f759d8b30def3c213e77c2e783cb70515d2018396f4590ab77c11d73c2431e996e366faf015b2855e1710dc0d499cf7b03491647661e2c1906cd8333e4a6a43e5b58cbab67f3470a4166dd96adb4c04ec30bc4f9b011c02c54339c5637107aa744c231c75247c50420cc0e84917d783616d88e64896dd76c37f56371a068da5687c242d000185b6470727b607be859b631e901e86e783c7cdd7c6cca4a0ac400858fe1220115f386ed8bcfe21ebd23edddaa07d1019224ad3f6f602dadedd9d4c374e3389c9d12914774bce277dd45c4f0f82f274e69b80e200fa43a4bbe57ed8e28f25303e12aea9e4f0303a3cbc9a0bd3022a5d020f92588d6c5617cdd8eb32a3546b9b189a722bfedb44959e97b4f4d4801f9743f84b656ba0d870cd203a367a53749a04a7f83f8e2edb1d7db5ca09e25daf9648650e8000be5b44ed30760638d18961bb35c0e70c6700de6686c1a2746424920f22e3e62fdc7a7ccdc30e00123fa4bda3b357670f3367f4b329110e1ee00562a2f0b09c7d8017656dd6b0422abea20e769c5315e1c00833b4b4b75faed555e663dffd1d6d520b9f77260fd5b879b1d70671b39bbd505b90a9aebc0274bcbd70a5ea02a03880297bed60b00e61487f483471c0ee974b6b9969729e4560805b0a3d0db5a835cfa52ec151b3509d6786904a6862887469e75a2af5b0940ebd3a7fd4543017a88ae94de6efdd2e583da004519e724e2062498335a113c662969a2b5228585ed1f2421e1835c027ec948abf0bf822b2fb270f15851c8a33ec63943045dcc3cd7e58e00375cd97e9d432cd64c30a87a5d4342338708818ac3163d07354771da7a7139f5441849c93a67c254ca49de0bd3b762a425ae1e329064a23507f722f45cfe653e2c76531f870b8fb65e1327d6fb5c9f4169d42f00d842db435e90d8e72b866ea789265a47e9550dc84d0fd5436c791f1c6ab365d742f418cda263c69c2375d3d58c32120779196ce905411f706fa60d61c7e0d6cd3879b628690eb978632b7366d9f4b650037d1ad734d24cdd8df0d59780ee81fbf6e186537819c5a17258d4ed66c3254bf44a33ae1e2f590b9a3b2a88b14487ce6f2a2ce0f175a7812a97b361d5d122efab07d3fa0b052943271a99dac40d49706c2d44ac644325937200b45bdd88babb2312d36e65de3e1ad53243f1b7b4c1b9643c8b5c47671f5ab7766ad7b642559fb75383a97bd405a35e48a4feb376087c5b758e3900575c098c8349ea8d2a11f35e7ad940de657fbf74f97fe506add5a3462723936f5c1e6946275d8f160f0311b63962b59d13cff9adfea028600ad598c47f4a44f48ce6984d57cc8985ef05a004083701d68fa8b494032acd53a5e241ae53a30c7deb15679d1ed0001b036f6785c42825b924aee49bb8df4d8e9779bd831660eeeec8272e5bc68329b88af5c7a836f32e4302ebbfdcf4cbe69c9674d7bbc084161a82968ade51236476418856ecd64cab8aeb7a57182cb5f4e810758100a25d34a85ca9733178f5d0f0924da63c9a47f5bbc52a8f4cf4c7f1090ec3e67db0a7abcf2ff76061fa2251d66ab1c7e9e85a6eb1fa6b09e9e3e9f301656f396b49261ea1feb225b7b2e43a026e72e4174d83cd1b7a107023446173066ed031d50a9ba707279d0964d61d54af11d821b26c718913f929a27cb2812ebff9bb9684a9c78d494b7cc1f69b4f4983c5ff3e7ccc88a90fa79bd56b49c56ce740c206c9584ff017d322625ea303dfe1e51452c266e47f76c1c30a54fc4f2e2728777eae370109b9ecb025ed816e8cc72049328d21e3434ba483d6b7297e58b0eec5cfeaed1e24d7687173b3cfe16df2b4e3a783da005fc2facf6aed1c788bf8afb71b945de7c6af928040b73c84f32852e0181e564bc8d0a5a9ffb0f84ffd1b01e30186b39f142866c1b1dc7b7741b69e4e1c49709b84a90e1a3cc026a407c66d4814ebbacc41b1fa3c645a4580b8bef0405a03a030f72766b8aa2f236036c8f8795e2a78d7ff03b0f5e537f9e014e0fda25a676803dcfc02d5e0d3798d025428f5fc1b1de49a8af0d93b17893590d01bd05d10d536e4fb53c776aab6b1be29250da931aa04123aa0b736aecfaee32dd5c62b782881996c433532546a2fe396ad8e2f185c484cda9b34c51f83ce16f4a8ff12b9d802873ae760f596e93fa880e3acde10aa1ae95a24d41093080e07d036ce472f3281a4a5db19cd247d55986d344b9f0fb0631227818782597512052f7da27b25425d270c8be26dd46340e4f4239fcbc04d76d7dc348b417f67c901d4416ad77966bc6147ce580002075ce4a60c5aea344cb01546f02a6d3b250e4c851af3fb39c25222c72e711d2fe445b4bfc9da9ad162b04f51b93d4caa1c6e03fbd8f3968f4108487d5e49cfd03389562718169f6f5d29d84d280e6699d9d3186841b8ce7c570b6e7bff60f8099d3f7ae5c1f46a958fea27ce5650a06252cd0ef8bd79bea038903ae71ceec6e38f509bde7af53401bafd4d024e9057ada6703cc7898c289c23f6a8096a2ccd8c15909739ab4307fd943b6f19b593eaf54b33d8a7c1a6bc15e786ec599683c7e519c23d971ffa6d9f36984faf39d75bc9ef9428c0d7026bb0b4e9fd697e2e99f226022384f924a2b678ad82b2339cc6e4245fdffa06573f6813181c40b47f834e876e3b4cc6250c52dcdd96697a97874926986475fb3aa88447430a2187279c8ed19d63063c6526f01df055cb99caa246206592afe4493246fcce597eb041deaf290dd6455a56425cc917ef14756fdd50b2ffec900f5f10034a1f7c032ac4a262a5e6b5bd59d77021f1367bc81b260786aab194fa9a67aa90369202a0b212e3011a9b3ea1b6925bb7c7755c6b0fe1087d4b31f84de3e466a7b8e02cb09e0614b67994caeafab501ee510b54de338f2bd17e04cf1fbb6f0cf70e9c68801497e3a864fae3a42ef62ea67d6ee3f262a28367291e9fd39ea687d11ecc19a402751a72c17e8c201dc5c7de97a06063894bfa8330565f78242f40b31912aa16fecd935dd79d7bbcd8d2c27d11dd2541ee1b809aa77772d75a9171b38a09cc08269617ce4c479d4ad2b68dd76e62afe31dcc991a615e8bafc993e299bcdca4e7a1dbdf0b4de4bfda7980443ff054020aa4b711b3bc6d908812ffc37bfa9edc7d1cb7c91633e61892dd1ad2c100c317e0d46f9e00effbc56ff139b1a27d1768ab9b41811239937fd4cb5ac7cbc0301c7bf59ea0f84abbe903ac7118b6e7148826943a5c55c2daf6ea1b367e6807e6e60c0ee5c151c07bebd168f27b5810125e00ff55917dc1f2ed21191b5db19dd956fc7ac2dff1bdcd38c2c0e87aa8bd4a7766d47e5128266f2a7e93013da789c3e8ee83fde9d4ecd08632451fa574c37cf231441693e629694394c4533a0d36aa972e37e2f722f4c606ed79d5d30fa0dc390596a435c91fddaa47535041acb77b4a230e3b7c8a3aab3660b464e78ae77ec0481011d1387f9c0e91283eef5dded6c8b5b0ddf37dc524c9fa2181088ec24de01a17baa60ffe4f21ba19fbdf2bf7af23604a0622c3fc5ab676074fc5384d13136a377bd8dfaae531b2e3598b4b0aafb3ebc48d56837ac53f2267796ac0d92b7add1924ca4f1837d59f2c970554c9b0277c4a5f047c3f2559926b7e66cc21442444854b4162245f500443e2bde244d65db4b5c371be788b6e6cdb1af0b51cb498d1652be177ceabd40775214383b352ae5ef37b94de13495922c6f94c762e65d8d41966f3389d40b206902a33e59e3fbe10a830f88a81f0633170ce8aa44f47ae55544f7035d7b019d5a654afe982a18e253e68d7d444d4bbf4adf5fa1eade862a9840b1fdc428810f519f19e492e2e650316fc3cd284d3fc02ed9e8c7ca160f93b988ee03728a56c8e4ed88d878503f6e2a0eedd4cff3f78ff75404097abf222497bf90c67a3ccadd6a8df985e17d118f8d6a6656511ff9f35b9baa0047c41cee8219dff2b2c81fd11a5972260de624a84f9835bc6590aa32765959d81ec4b65924b04313bc036e3d0a9b2edcb9ce2ddd3b7bcc35f9d9d9ad9d8a467cd036dc7f9b9d1109d8b753aabd3369aa8d5587718609a88197fed3f2d1b2c1bf4b63e8d73e33d5aad9ae36c8c10276de732a234db52d87d31415da95555434fafe686cd16a56d8f63da492f73081ea88ba2198bced60ba4abe8c9c670bcfa42328599445e32af3a3db3c85f09c7268276e19a6c80d73724479022a4a6f42afb226c839f62459760619ef9c11aa564af403e3373044eafdf1e53472997c223cc1a873a6fbd69b83cb3a74474621db59fd269a9bb5a49e095026cbae8126c201191e263f52a2835ccc263900954bd5e0664a223cf1a498af326f8395fb7deaa0643a944463d734df2399ad41e60be46aadfa5f3ca5d826be7e07a8d17a790533475b6f1fc52e7fd96486360006f94110b8a7efed77ff321fc7edec3a3c0d323693b29b59ef67a2eb4b3b0f7c4bdab1782bc141e15b9365f349eb61d1509fe60dce00e0261e887980747b7a200160f61f4ee3bbf3a44fda6cce0499e8d4a1554a394fbcbdb38504bb011b71867554f137fc4057081b4bf2e5c2c6132a33cc15562e6dcfa939928e1994fd7485d4303dfb138fd981f71fd94562b26749bd7596d2cc751b77716a54a58ffd6998b9d7729bdf81c32635686e01c9b18fc35a52831b50a3ce5a75dee85d0fde92581539cc71e1c0362db3eb5e167f93f39676ea401f4de484555472c85f5ddf62507395d6b926c17817831fd51bf176c53a783e1ad1cc8ed609b8ad55269fe747b1f17b7903efbe4d0cdbfc5e08be0132eab97ec6685e9f16b4e4840f54326d6e083236034dbd1a571767ba7b45fda0623aee6f9fa95ae8c793c11671615dff759e0764debdd1c6163fe7372a7c1ba3b9a1bad16f44d822d2ba9d41e2004b99a8fbc74a6b7c604ed2ee96d15718c85ad9f60fcb682a315f9cd13fc1650a13560a77e9584bf4cb78c54c30d0781ff7e9a66502c767826455593de3b465d0f03ccf3e3afe3abae9c844c2acb0251981857ce77fbd2452f1b556a90432b27add97042a1302276c835ca87eb01a1d99ad24620b54a9a5e68594c9954157c01cabdd69bfadd5a5893adbf6dbd58bac712dd663999dc58966d512422eb6e568335995ad9c3ab53974946416b5653170ae1ad1fa343b7204bcd0334a547b26067ee50fb492de27b9a1fb3b2ab3fd5e3db2abd16b8e91af51fd7d0b598befa39608c9548730f2ff4e71312cee423f1f6111541025c0a080d821574ca4d36343626ac860b30d823431c3d0f637907206e28b58491c6fd366e5181b1117576baed9c6a843b9337c2b6d5adaeaefe42db8183b1d4a82b99437fe00ad86cef949666c763bdda7e1b2c4b28f302f88ffb88b1903f74cd4337ee88a88aac7b65c749ff7c4383e7bd4186ab5429d3d59ef24c827d24581e65cbc05034edf7da0af13ed7ff9540408027f06826b2b40b9819e37bc3be37ab8b080101b7a61355b742493905a4b93d2e32b69994f275968c34c00453a07a8a5b8fe711e433724adb25d26027f204554728bf5b1d1eae3cda28349c2d24e392cb66af3ece030710494822829fbd16d2784404f839e41b22de6548c363ee5ef7d0f1943eec23845911660c610a21ecaa4dda4d457a46c3730a8734cf6ce8d7041f799dbda6da7391bf83d758420eece424d175f0904a54092d8981685ca6bf7eaebdc74ea60611c503808df5488a7bb2fd7073f2dda5c3c3cfd8357949366ac0736cd9def6743dcf7f22f0ffac13f32c18b59f52fd3bec05c74ef7d453fa65e2c8e6d1685d6ed670d5f1b31187c8ca13045cb77353b12a07742b0ba93b0f0f8d2c36458ba558391f92b802b7d4e6edbc49974a6dd70a7b97d6617232c19be3061b826d83064ba265c8adcb9782690448bbeb3aca4f240846281ee56e4a870cf0bfb090cd655b7f642085a8bacf3529ef9e4510dae6b8061ec6472d0a1770a962f271c35be6940059d68b7e744b6f39fc495d84fb7a36adb3f6fe9a312e5c10a92fda324e2e7fe11e1629fad2fa79e6dfbc4cbf56bdfb3520d13a7738755f4b312592e81cf1232a2bcbff16a8aee22eabfd59b4982dfcc66d5fa006d40963b42f6be70600b0961efa54f257f5dd605225fba74a4d9a37d9d2c02eb86fa375db6446823be99ce55fe312c4ee5d0236210a4023c9e83bc50d339d03af3559b5fa397ff8f415ece9368c28490f28c4f32847b0a8b8e07b87617c497b2e297f41f6c0cf4d5ff81a080d058c515c917e0af4002862b018b98dcd87a8be72c57edfe0342b238e833e9a4c8c596381ad9b489ff64ad7409e6997902a0204428e4b5b1b6fc77bf2af31cc40b0fcd807465431db100eaf004e967702df0fbc393b36ea1d52b00be7ad25bdfa45d4badd60c33b8c81e11b76d3d91a059d0a7a2ff0c859da52bfed31a13e4b03a21a76ed351bae5f73f1a6534bd1f1b22a906846c6b859b6072ab517dd2dae77b645712995cb58dd0f986bf1c602d2b373195fe9b9f0ad93788b1f3d3abb8471dca0a9c9803405bdade9a0ce54e673ef4f241cd25457e35688cf9e356477834078022b5b1a756c9b706b0c901f9781641294466b07c22d555112b338e59feb576f4803fb1b71762b52d7dd39faf0ae48d809a2ecde4bf7a5087db40143fea06079189922252d607b0b565ad0ea4bf1e20e6346d36161d64647c91f6b18a873baa3e4be168c2e1075fdb79e820d67ca352dc2c5e19b25d31b9418c33e4fe3466cf57251efd775e49f92add8d6821434fbfe107128ff4ee37b3d0354d7a0098d438b21444c04c46ae8edfe08eb35d4d1a1b3e5d7eeabeccca9a4976e45200e54255a3edb7a43d6f110217b169d82478d7e729989d1b4f7f04069606363d6527c1dfcd8cb67e06ccd8206e9bbcc2e9c488b1a2c86a5afc7129a2f0a6bad416cad7672051358b4f94936e85ee2b0c5f1ef8eebd3d0b726a1573909fb1cb8f3dbadbf58ff4ed84aa9fd5cb0b440670fb51d4507eaa3879bb6a08f0aa1d2a5b19f1a4eebca9770d79da09c17d1a05ab9298f6914d38f5333d31828cfeb8babea1074c0d4e009dcf1c8e4a549f9861bd0aaa20f6fa5868777840f169d22b9ef077c784774968d192d280423c98814d7f6e5dcbcc24db803fb5614b8dbcf8e8d5a5e853b9ce991b24f1a489dfd1dd221cbec6c6720c13bf16d5774933cc3e5638ea999e1fbf6a1dba4e6f303d15534e4b922a921095387944c0b78fca4cae11c2867d567427effd97aa4e5341b40e716bd7c996e8a955b598013d645322cd1309b488d259fa39c7d1cb129f9e36b7d0e07993419003a805cb8817afe8ec8e46a5689617d1c2907500ab2e617e69b2b88d599037caaec5ae98efbd7d74f5d35581ea207ab2204eaca77512fd593978574e72616c8839d593540601e12ed84425c890e4f08bb1b1fd8e53a713631e747db5547d0e5c10aa596d113f6f442298a4c2a6295c0cce60454a6e1d8e789aaa9b081a99c33ba4154fa79ac5582ed46cfe3561aa97c9bd328dffd0a53b031befb506bce562437a6d0b0f1c324dcb0458b9051aa05cfa3173e00f480fbac9906c8b3fa8b1fc2c2bba94212284c78560e530a5265f4b3b7ee4c40f40fa727e320ef1e29a98ab862e206473bfc76852cf72bab3841e550e0c791b7f347b03159d358659359b0f1f7f81ebe9f965f6061b3ca5852adcfb31d3a8a0d34b6bc9c619ff9627d708f1e3e28f65285b4388acace3eaa06d8f562e4ff80aec5c7e136b63ea1e6218192423f156a8c6ca43b970dc127ef7ad3e8fd8e3a89fe9a821aaf41b51753bdf45ff4387d2fc4844e23270fd9566ed3c6a7d58aff3b2c3f4ebe1b7e2cf8a53837833084a347b9671f801459ef8fd92cb90a9b3280744eca106fe6edaee212990ec1831517d9f23a2787c02c844fcfa41a00e37a042a9afe34a8e0f90c9e254e48a978c1a2a5cb06b45da9e1acef2dd1c118353c755757924291e7563e0b572a5f427053584e35cd85189c4ce3690986e382733ce1abf242e3cf7a456ebaa6e89263de951f8e8d5d72f2a5cf22522a0dcc64b411735c329b04fc22b57e15faf58425a3534d2328bebf78c84e553a1d4e570fae5dd5e8ff78755d4cff7bc0a384607aa3db8ed1701f7c75d498ebd162ab912c2e4de2fea09e56c022906068e80fd2551242525874e8a84e09f4bfa3a4a18df34bd6020eb30b84b21a597eaa17cbce9c1e97cc738965c974b271b00033edc5871db50869662a472c2eced064","title":"416. 分割等和子集","link":"https://leetcode-cn.com/problems/partition-equal-subset-sum/","question_id":416,"issue_number":64},"62":{"day":62,"pres":["背包","数学"],"tags":null,"whys":null,"difficulty":null,"description":"给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,target。现在你有两个符号  +  和  -。对于数组中的任意一个整数,你都可以从  +  或  -中选择一个符号添加在前面。\n\n返回可以使最终数组和为目标数 target 的所有添加符号的方法数。\n\n```\n示例:\n\n输入:nums: [1, 1, 1, 1, 1], target: 3\n输出:5\n解释:\n\n-1+1+1+1+1 = 3\n+1-1+1+1+1 = 3\n+1+1-1+1+1 = 3\n+1+1+1-1+1 = 3\n+1+1+1+1-1 = 3\n\n一共有5种方法让最终目标和为3。\n```","content":"0961351fcdd44c9dd275f1df845ed5904fbd308704f820b0066e5027573a011801120ef3ed4eff2b140a9073ec2b60db79df883c5bafc93938cf15a16c0679fc30b6b59d1f083b77d0cb4d7976f7373c74a4f4446c26f750b145f54b1a432351b176965d2ff51cd5e7b7c7982f232432a23f2e43335ee7d06dbdfdc47fec1fb4755cc6a8f08ac7f8982da03cd80ee230a296827ed9b4c2a44f27d0b03b777894f099b08caeafc950227f65fba77010591944649124247a298d5bb45435ab017a20a91aaf7700b85eacec7b6bf274772e9d74965f92fa07238efc220fa399b9061b2a3f9550a2458bfe3322f4b9ec86ee060971cc8fd47b6d1e4d5ceea4cac139b36be3db83cf3bb00b234c4b8f47343fc69be830b26fb604d8f49782cfcdc6dc14a1aef86005c3e78dc55a7346df7522b7a2702ac8b45eacc14aa19f60e822a14e0c81fc4a30342287e10de9998672d8a0f9b8b891a8d975882be59c3401579cdcc45351b8135fc1f45b5319900fa05d7e9be47dc774495c1738e45becf8916232a7502f5a3388f8143ee42d50fd090cb33e2fd39d87775703215df73226560597a340415533bd3ed5f71f1b99ddd074ffa7d3d9a847df007d3d28c9440de680e760a9677ccb50ec9d6afa0a530731186f9259c5d1d39c839a718edf676b448b1bc1337128c48f17fbc8fd3574274d22203a60f651bb24d49f108536c3bbfc74c97b3366418a65f5220c8b1b265752a5b40a074455fedb79b29a4f0e3405705ab434013a177e0505e8e606978abf842311774582b9832f8d810010751ed4e3b2efca9d62344a056ff5b8bdc5eb4ec3efe33cc853988a21ef427097ec2f2cd1875160b6d507636d05723228b74e75e8927c1a68601371691cb5b4059e86edbbc189998d3404a5110e33f3fac98c0ee7afb45f7f56d9d4a5719e4cb3f8148bcbc047c0510cd8115606b5acd1e0267a2c16fe562f99e592cfc63af637d6272ef4404ea390352e30a21cf0d81534e44008121fd2455332956d107355d53efed97a8680c579ccd19fab80f96b531c5eaf2a17a8a3cd56e87047017dced05bc5f1648c4d14169cd100b969b331d08e568d030689d3afe828a72676c6c8efaa3c64af6a189b7828404f81709a4dbee86158e55d46b5f3c522395cec9999af120837352f7d2866561e711792234a669ee78415f35905233322f9e36e914e40b448c30e663c07300a720d23fc9311e399aea11b87e4ecb93f0f8d896fca5be544db4a5cf7d72f7eca7cc3f9356206b89bd02b2d14de8bcaeb791913e1b2c0c8bac0eff1ecf575c9e02627d325fd1fb52950f61e488811e67943949ec4f1fc01da790ce8ed239bd146ab0b86414b10debfaca2a4a6c5a1887727a8b8c5d6a75ffb0b37b26690b1acb712c88395d7a63957afe82187c440a4d5f309465689fc6d0d9cce7b6eac987c2e8fb83a7ba90bf75bfa2ea264f6ae9d8206cce47e1ac114927417b9d2d527c6d609fbb32e2cf7c7742293c9b1fa681a321c1b1c0e9d778bedbba03b0ebe1eb6d6de3d290fb56f07b0b48115ca5a631f2fc9182e5af380814c0419fe4661257cdb7258a5dba3e43d008004e8a31bd689af329af727aa8ab8ab7b495ea771f7dba8b6aaa4fffc9c0fbdc6ec612441c61ba23df1f793fb4a75f9181edc321a043e65abb9047ab2e2b1ec64266975808606c8ec154e125b2682cb8532c2a7217d939f02ab2c2e784e89861a23c2b43604f3d1769c2d792f2adf499453ccfaf05051e51474dbf1fba9dabd3909907e9420a2d782e04278a201f4366c8f70d2ba841748e6e4670ad8d27df6acaa4270e341778f95d708d0f5ce1905117d183477213bfc6f2fea159a4005394290cfb1070d2c0c28003b76ba9be6226f668e32f16f790153f9dee3fceb80fb55e9ade1288500ec17e073f0031daba6c12b1e874a76c675bfb9b95a7146228fddd8383da675c777629e7c778f759fc4c55f179b5220fbe188a6d553fe0cec11e6559bda4c50d2dbc3b6973329ebe870ab6a882ab2012c039df29b6f78c77c80a5a37bdbfb8c719ae553ba0ad5f405cef3a85b52862c647a70d624cb905734cc4da84d9f283972b90d1588bc8ba5a583326a5483fae1e9da2f3d2748a8f21210a5089ffa96a0203d5c1143ba860f2802df33cbd9b59fd231293c8c2ac428be576b16e97009860bd99c1934fcaf43fd0014b5b8173a3d0747d2dc973a20bf108abe642778bb515c2b7a29642d2a21e826afca9c559049b16cb826a6c990da87c12ccaf8f00d0600292d8a5f6ce64fdc41c6d33b80ed91df67877ce3a73923359a75a266c929aac9b415014124593a8cd02bff807d56b8ff1712f639e0214e2d296700a96c9aee65aad4f4dc07b84ab37f27588605d063e973f8515f81786836b6bde6638259cce8fddb30d823a996533d4fb953fc28196552973752cbd42d2f969de6805d9560818b23572b6413af129d973426c80629859103cce00e171219dcb8bf21c03713afbd997e030082db132335a964ea68dd96a6b14f22ac5f8e5943ebf50b28a714e0fcae131f4ed00a6fb75415441dae1fd7b6d956246db70613582b433773dd9f1462bed73e93faff229842cc1afa8931fdb16ff60b55a6b88dd6f74d91f7c4aa622485f9e245b1bce333eea07719eb4fb3096cc6f50f7a65cd7b45b600ca77346c7b51106836b3603a0c26eba83ab6c48dafb69e6ae1d0e5b59cb52327fea0d3cda7678e7d1804a40437ca36520ef9a0f05bbef2240d54bfedbf11a1f7402a62999070611e82680a9d6f507640755e14fd87bcbc75a1337a8c8db1730076413c6b4088109eb70178acddf5ae50992303c6a6f08e9790ac050975d9cf2b4863faf82fb121a75130bd0e70193bced68b95bd3f8ff82a8c22dc02d756f363e53e672e5902bcbfbbb1ca4c8a0387d87895b57675124e9a7bc8cd12a5324c7fcf759f4b3cb5c2cec825214483b0363569ef4bf2dfa3fcdfa73d61105d0e29cda9b3ebae3b6eff50f4174ff7bcbd893d1e8ce39290d1ef93ee84c82051b0507ed54fe2a5462b27dfef879ac2b5f266ca9636347166d8c35c844a4e8160ef6ffb66e9c21f88e441913c268b8da775dd91859276625a9d56b34885b671de799e32a0a139e1dd7ede9cbdcbe798c192aacd7d92b25381c897cbea509d5dbcfd874a93f588355ee75b660c09ce232e821c11ddf4cff77dbf4cebee43d13ac8f4d6b827adee3ad893f75d7485e47ad05ce0b45b5825174205ed203a104c35b962c0c044103056048d68e2dec7ccb0b33a569da018f2c7873d62f017dc94a361c1d40f4a402f1da5249c349bdf3305943f82efd1ee59cfe5e4d08e4d6409a36133aacdb098d289ae1fd23919d5211bf58b9478e5a302d7680f50d4f0818cfaba1e18f11a089721efd4ccc15d8c5b14aadebed85be3962e0b732bf3f8297af38e58bb0c502fc0e8ed9c8810789d650687e2689d814c2e9e4efe15543e21cbbb7e303e1fa947a4c918afc2ebbac05c60b05fbd1425a8f86a546f2b1512629d493470112e531b3415199fea0211d8fe38a1ffbd3e13af1143197b4ae3bf4c7f989e1cbdcc6ed9e4002fadb03a82964738387b69dabed3521cfc799ae5c05e6dc97cb639628c913467136e7b594f742c3a4ef132643e0f7e420559557312dc056de46fb9c8f42d9ed495f55253ab6db2db27ecabdad5cf768ff28826107e2aa09ff85475d27bec4d7284848e37b182960b8131a0271490504ccae11d6f37e13956de48051ddfcf28198d60222703f637d67720887b495d894e10c29ba599f6b5a19a995d8811e4074d673bc422ba2f9e0f083d271f97d7af684488a30b79263cab4cd15d45d62c6c5dbd9e54daa9ce99e0c5ded4e761ba574a54f36241e38b241a96e88fb9c1cd87ad4dd2723007cc4720f399c7f5e6c0aeeec33c130c6e971438552550d5fe3007a491db810bbf168b690b8547a462108e57738986776ee5cdde8969ea61c4907ac6f52015636400dfc38842f346700f2dcef634c84eae3d15d616e7fcea945420e73a5dc27b446b0e7aed0a35a4ee0398342b0052d6e1d8a9e0fa0b2c685f5670bd3da1e70fe9114b0efcb1b4ca2600dba12db467a31c03536e547a699bfb16492c06496b59bde83cf48d593ac7f323357b4268b85b4df8bd0bb85d5c8b3d89c758024ae8a8f6fd587c7028973f39f349d71fa12938eb7914bbb947197ed8fe9787b994c7ef35711c527d9119534e98c4e0df8de5bc237e315b44f12ee1062ec70b3b7e955268a8c9debd23da7fc5c271441c4f08b7240fb3e5e2a0ba0cc1e43715bd679a8267755682ec0b60a32ada4c803918f3cd58acaa531cb24df229551182d3bbc4d0c1616cd02570564626510f4276bdaeaf42d5399a274203e54ac5d6097170f8f652e493c73b9ce9c7edd3d7cd9bacbc2c174a270ea1e61644ec66bbf22767c87956ffe011766e38403546d3fb70433084858fcb135213afc7a3b722d94d0b54ff31f5579445e1b47a73426f996ddbfeb248babb1ef4a2d6a6b4c50aef7dc835855095128759d7ef96adf9eca82d771bef06651c03a07f7c14c8bd8ca12fd04c8f39642b509b8e314f391c7df194b920c1a5b67ca5529fbda25462292d7fa2b762149b585c3b9a4aa4de513fddc2d4aa009fe30084fe0185ef3b7b9e951e319472b5e263e705fc839df3877040612dc3af3ec9b95c20abc24ee67c8f4d4f116227ec92a13403cd88984e2eb01ecfa3b7916ec68675d124870cb72991a92c97342081e832b2916363b12dd30146b73ee2bc7e4591f4b530a7e3a40dd4ec065a672964b76a4f9c4af14ae926a58f2985b1948a9b7a83507105358bfaf41e63fc9786661dd359ec282336380a4f89d0002b11a2c3380d685e73e5c602cbedae69f0dec9ca86983fb3fb6eca660bd2e478590a726e3b0c3a06c632355337fab14e3be1465fcb62dcb8e2a9ae2e2ae98704968820766b9f91d2640979ca5339c9892269943a447e1c642e45774e38d5d07cfe8e6846905777cf9087b6dbf83fc1c13d577860f829363dfe11ebec9caf6c8e69c71806c678efb1259d81b004fad4e5013e4453fc74563d547d214615b0745ea527980b2b0e70e5bae9e057035a4c7f947b09605b7d893f1b861877d9ce1daeb0d7dae7a8a6ca8db15d7562d709dd0186e317a06202f4221f7a6978729bda5b494566b37e55d0eee1e02b0c9d863f1cac59301dc0c65cba73a440408acec057b74c6b7e9e4bd4c127fc1fd6923537e8f58df4f99ca9126604e31cc795b0c55e3c46eee50811dc34bf9cd7e1cfc7d3bdb9d72208661655d3648bcc4fd7261c8a8344530def179e90fad2f45b8ed6d2473d07db4ce52935a40652abe0f86ddaf9ef36d42d2691e3e55fc1861543b9821ce9856c4e0ab3ebc62520253a241f9ba3205bcd5900f24c31eabef97cbf5b9600a34a3f83fdd21030bc914db1a6b222a43f5c1060bd36bccfc4fb16e8435f1ff36c1258a025303a23a3a969dc78464bb4f9a7d39da0ff49757d6b11e84282b0606c395ee23655533c84f5239d75819c4f1d16dab65cf9b2f543fc35cf0e2d690e6b7389fd6d91edc8ed9b5f4a0208b2b95f2bf77a6fc9d675a3f5f1606e8540408192f8aab87bd9cb28f6dc226ff08114d619be3a9741dfc0cc62380b764f1a","title":"494. 目标和","link":"https://leetcode-cn.com/problems/target-sum/","question_id":494,"issue_number":65},"63":{"day":63,"pres":null,"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回  -1。\n\n你可以认为每种硬币的数量是无限的。\n\n```\n示例 1:\n\n输入:coins = [1, 2, 5], amount = 11\n输出:3\n解释:11 = 5 + 5 + 1\n示例 2:\n\n输入:coins = [2], amount = 3\n输出:-1\n示例 3:\n\n输入:coins = [1], amount = 0\n输出:0\n示例 4:\n\n输入:coins = [1], amount = 1\n输出:1\n示例 5:\n\n输入:coins = [1], amount = 2\n输出:2\n \n\n提示:\n\n1 <= coins.length <= 12\n1 <= coins[i] <= 231 - 1\n0 <= amount <= 104\n```","content":"09613214cbd44c93d26dfeedb25ec28da33ab1ae2e3e8635064c41275c12031000fd9942eb5d288bb6cce140bf665b833ec2fe4178e85ebbd724ee3aa0f9a76ebf326f608fd7cef70c6ec1abc79e527278f46f8996ad099327f626c1eeade18e5123c10e64faf1446a7247f96a364f70a0bc2e647bcf1908f8075303b40d9f488439a8eefec9404c45a777b5a276a0722a4b42ea5b49a9dc0b618474ea9af22054751c2066f9dbc2cf037084cd51620211c38be613540225fe1d91334b974c3211d24a9ac8854283240aeb68f548742d997f9279154b90ea685fe78d1097f647543e3fcd93c755e0a61d479698a2d9f54c577baeeefc2d171227b52a3e0305aafe7c84b3a29b65894640600de14b5b5bc5d68b19f12a8744b4fbc93e8d8a779a521dcb8f5cb4e6dd24c17b5d46c84d22b586702ac8b065aac0548e9e64f020a8540c99fa4a330f2282de0fc4ad8740e5a8e498b99489d74db12bfabb38394f9fdcce951b88de1dda3d3a4a661250efcc16cbf600a26631f77c7c71eaebc0b98f94e50800085a90a74a11ac6668b1543fd8783d96d98a12fca52c5ae230274c068dbc4d7d7f31982ed5fc3f15bbc5d17bcba3e8df47df3384a58d28f6500ff88cc35528a8b430288110a049084c26382d7517aa255917075b308a585fe1bce71cc9069bb7df1006d1005a48b8b796fe22c2e49373dce66fd2e19d0431d8821ff9ab2a1c19f51eaa749857de5d755852d5a5172d92dd640eeb198b51c1b9c2567028ebe0b8f7afd099418f8140772923a4de90edea9f4be94307f2f4ee8273c98bc81308c0fafc94b16213b0c9c19a6d7e36af72589a4eac5e795a42728fc37f1395ed0187433b2847723228df7503f5992c5c36384c2e7801a8a43c7c134f757718471a9f199ed697a9244e48488288f6abe49322ee72a753b64599db915737469a498ab003c7b0a272561269f393bda44f92a6293ecfdca1b72cb80ab715dd84c939910228f72a5dabddbad6a37891fdb757426c24138efc170bd5e54b32ae760aef12829dc9e51151d095b0c44d9e6defbc9022fa02dabf5bd45cb7b6ce13d06d4b7ca3acbe13b110b00b369a0bf7f612495c6adc44bda26a13563ce8c62bbdb036a1b38fc569990cb84d9f6b8244fd933d4a0c8f908b6d005e09abcec3e8a7b3c2f6ce8f661d4cafe4897b2f02b25a9f8b933337d4ec62baa1d8d135ed48d4fd8ff0d8e3ecc27fe4028ac2a3ee48bc9e8cac48739cd10bfd3a8c53be3b6ab155d9fc3799521fdbe254a6f88a32755cdee68df61f7108a5eedeb0d0feb19adca62fc5bd6c3ab864e85734f1da3afec2ff028c2c79dce4ed908f2483181bae54c71f2b9729e5ed127b74b2bbe6c4afc08cb7dc0137eefdd498d96292420ad8b67f3165558360ffc0d9c5467cf18d16c3a073f0aad16e0649e7ab4f6bc5fe111ab0e4db804333effd78fa65b831a333ee33474203fa1d68b8ce07b11de4ce619f9ab64c7ee6743fe2df145191d313287a33e7a2765393c1f6118e44293e0da7de4d9b62611395bb029344068692823ac75b77332cd60d2968de6f35ffc7f315d394d1f009b09c234c1a02f38e5ff32878df4d4c52a02273e16f672a5697859353a73148693c1ca2c1d39e3fb5c8d463ead0827eb37d98cef7a640198516478f345e6b3e1a1102d3cc3dec87d9643c4177a28304d7eb16421858038307377eaaa6a792f68665d90e481754c5dd0da617009207eefd76bc3c783103de41885fded3ff5f50eb3f45dae2f2a4e4b93436a577b42caec8bdec576b67b0683d68b973c09a842665230594cd89fa04a8bcc4274096254d3f86c9cbb5fba37c2d5e370d52300963867766bf2ff6343a6c149183ef37524b2a439cc7fc525274e6bd23e076ffaa173339baedac95f8e7a45b69250ffa32f5309c01be345f25d92a04514f5fa8cf1ee53e552b13ddfff42a92bf0c52c24f982d6ee40f6ec63090a4bb6e6101347defb2ccbf820dc25483088429a49d0c72b8a3f0dccc254882ce14f653e472ac507719f389b03a03ec37e980ca19eeb1ce48dbb867e267e8b761f4acea5f0be1020c256bbc6dd0cd32305fa20cd459ae5f2da26151b21566e19fc355483cf9eea6a9d7486133340c3794fc4001bbd92261d4b189e450305ee40e72ec58b2f63b553ff4efe40cf2b871abdf89f60af4db6c9b2e2f8dfa3d248a1fcfc157a9533e374e4af0c79374a247bf064cb8989e38d593c3fdfbfee4c0e774b9554f52ac1a871ea967a84b793619272a40e0f3b0414f8ae1ae50c2cd823054964548e721686a19ef78d3607ecd0e20843470e76549f3c1a05a0e1f676607f2fa5da3d62c5ff1b05357ec13ca610e3f267203ba08caab3cccb7b7dc4ef657fd6d156bc235c131b336e2675dcc46673b9ef4e262836ce5e8b88e6cf63483f537694fed12cf3d0e7002c4623ea8986127d284a4d41c8b7a99c56a57307f28a609b79772699a4271b7cf2accb35b4a0929f6f6ea6c937876fdbd91374d5482980f3f36a975f72bdc8aa5f96c08f775a4590aadf5037bf259a6affc7e5653d6502ebc0700101fb311dcf9d0160e71aa0652156416797583cb083bfbde2ed3faff229842cc53bc8939f5b93ca30205d6f1a497b80ab9e299e26a69ddbeea1cfcc7bb47c8a06619e04ff75917ddb0562f74cc321bd023fb5d346c7b02452536ae3d185f73a6a86c9cbaccfdf1db6cad84bfe7c0ae4d7785e19ecbbc7da17d185de9046b87374217ade9b50fd4a16e4059a5edb46cfe8d3b6b2fd6816e4e73e4424ab73e0b1c405f2e4da989bca066a9197b9cc837efa75c7b672b49d855b4ba1874ac80b9985192221f94e9f78dd3dbcc404a21d0d5014863bcb739f46fee5c2bf40a134c7ad3c48386ee30c3a03b8c2fc606ca7eb61ebf7362761a5f9fa591b1ca4c8a0387d878d1e53238697fa6369a9818a1490d02de039f056cc6c9838a702145c5f24456149250d8f5a3fcdfe33f5f54755c7acdfdc990fd6e23824bde4a23f8aefdea17279bb7889ed1bbd685da8065df61a501b15ba9f41f68279ca3c6c991b5812986c3627d786790e91fcb0300c56ce76ffe60eec838d39c06d46855dec0d03484c28dc1332e1c911fbb1d81e563c32d9c2faeaa77c2dd73c09cff84a8d4dbb8aacd7d92b25381c8c3cbb300b5418cf5d41f93efcf3d11b7746e23428b3354f9551c9ebb86b900fd1be29043d43adaeefcb827ffab6e8dc1b95d7994e461d308f1b66e197872174bb95d3a0d5135ac2f92955e443f52048e428d929489b0f76a2ddca907a794d33b58cd5796be8156b1af0f38064158a5eb008eb1f573018407c2c2fbb0159f9c9dd0fd02285cf7287ca282b9b2cbdca51d9b2842b1665efdc79878b9ed14d572483a869bcfcbbfb2485db24e47c53da6dcd78d5bc61812ad90bf9515ed9d725f3e66f2f82a7d81c77e9101503ecce8e08d815c17de3149d5fe21d3d5522eda1ef654197130d59434463e05b847a1d42cb08cb2b19f0036c924f4695882f86a542b7b6e021fcf116035584a535f646e148e972817d7ec1283dc806a70a9551b03407ba3b60c29d6b40bb1d13bd1f9556b90fa63ccd31c416df39f102225f701b86fb4bafe0a7a8676e64a6d9493322047485153401d63741da532376b4225750517003e41d25728a03afa8dba6a8dd89df60e07f975b2d968aee598c3cf25c9a0ec7519186ff49fac5468d228b900728fdff076e3c5d35f9a1ba0275dd650449ee1182663e8314d9b00500cde86760ba7236d3d57a279ee736fc07a0011039cf10f66085f4b256d212f980cd56fd3b0fbbd21b71d8359d4fea9c6dd560112494499aa053f6f70e744c1545efc2c6c19a9b53feed4d384f193bd9aef63a57e0321bc2d4be0a46d549ba78af6c6d6b7fe4fd238131ce64720b5d695f5ee8cebbac3754e3b6ec30f381c254ec8a3541ca4d8d68c02bf4df32c5fd015ea62108e577bb9c9293db1f48eef3dea2d899152938b2b04637b5df8d28805d902202629d7ec33c81a977644826bfcd6eaa5237b8d3a37a85b64a48012af1a51dcd640c71a486e4aa0556289c014ba6cf38f194afcb539b950da5d2b1e9ae1ac86402e8ed62ce83c8ede838c8ec7b492196a491e2a6fec89d3663db638075b17cd1fa9a3b2236ee71047a8e130d03672e15bbf843b3b3568403b11b1ed91c9e65b71b4ce34c03edba626a9f62945a9dcef5e654a6ffabe9b8868200e4e39da6637179107436f4952ef6f60552a6d966fd6465cf974a59752b294fee795a73ada7ecada784b36","title":"322. 零钱兑换","link":"https://leetcode-cn.com/problems/coin-change/","question_id":322,"issue_number":66},"64":{"day":64,"pres":null,"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。\n\n示例 1:\n\n```\n输入: amount = 5, coins = [1, 2, 5]\n输出: 4\n解释: 有四种方式可以凑成总金额:\n5=5\n5=2+2+1\n5=2+1+1+1\n5=1+1+1+1+1\n示例 2:\n\n输入: amount = 3, coins = [2]\n输出: 0\n解释: 只用面额2的硬币不能凑成总金额3。\n示例 3:\n\n输入: amount = 10, coins = [10]\n输出: 1\n \n\n注意:\n\n你可以假设:\n\n0 <= amount (总金额) <= 5000\n1 <= coin (硬币面额) <= 5000\n硬币种类不超过 500 种\n结果符合 32 位符号整数\n```","content":"09613417c1d44c93d26dfeedb25ec28da33ab1846d54af1fcccdf92542190f0c39ff944424faabb392dd26fbef1761d77fee86056dadec1f3ad61ea9633178c907b7a89d1c2f0f70e9c1467d691588a8b20587006f75895be93ed5286f646f05bace4ae5843261caacdefff86d3ca2d73d9504a0f9b2743bb0624e5bf614fae823029ae3fd00326012d07cf62ded6bdf6cd3a644dfcaa9be5c36d4ee722d3ad79ff6e7cce1220ee5a68ae57e4792d796db210c1afad0eca874d065bafc70c3f2d3509736818f02e0405ae8ad8e6608728235cc5c7c2394b3e5c4e994145239b0dff3dc5ce0cb3e9ab862008de6dce592094334f3e8a4590e4679a86b6e0742cdeb02e6ade4dd43cf2345146df03e3a619bb8b16e8d38fc3f98938e03eac37afb3b2eafd149c086d646ae4a1723cb25419cc534229fc961cf845ee9c07b8b7d9e107a8d953b385746bdae6afbc5ce598ee0cad0e4acef977bdc53c8da722715e2e3add23ffd801c8748343d18102499e07e9be377c77fa5dd5978e63fb6cb1bb4a40bbfc08db535ab4f27a14d696fcce453b8c71f0a27c87d3ce5c200b8d4a693383184a1c1fb20b31f4baaa128bd8872aac7d2676de1590c622426d560d166e19d7cfcdc934d85061e886308750c321e40907ee9d2e3b68098418ff37a674cad15f92aadb4485491641b55b7bc95e419206f3da4706dab5f509f04ec4210dd4f0af48bb2ef1e80ae1cd81ac8de4d40c48f2ccfcbea3b6ff0a88b02436a2d320ee068536e5e2a5c4ab2829d09247a58aba3c13709208e0f9452a7aa904ae94a5145718c73faf484b94a21746569946b59e0f663fc4e00bc21cbd14e7491ce790b9fd60a02a4c2a0b4e9e68f15adfc448aaeb1db47c5fee2d8361f16a797d69a181c3b43808cae11527eaf85ad1c965a6a00deb5ea338e2bb8608a1861a9096e75e3810903bd7157b4720675c426f7c362c11a71a7594b454ed42bf753a28b33d8c866f43b4b79a15dabddbad67be63e251293c0bfcb1e95b5519e756382ee0ec284525acfce81ab5041dd8588ff851cc32a5845a428b8c05238d8b305d1a81e9520530e36f41425bd10b90626c96e7939cd82888e5584442dfb948fa4541c970978b51bb3d99a30d79844a9c8ac05ea3b3f929c8004552aef104d07b60a1f082f6a0a676104bda8c9794533112f02d85ab68b90f551e98332b815d832837b44cce48ec3e2eec3d17cf43f6576082ad3dae1b7f1154f1233a5513bb87bb0014d52fd62388dfb370dabb0460e1dd3100717dc86c8e44c1827c0751b312f343f493723ce297b270de527d80f72c99767f6a947c44a7a60909fc5daff2ceb782fc32bdf6a4aa65f96cb60e79275fdd0a5f0faede2fd6f49d4aabeb1befb19483ecd318ed7f7b141a69af1809e7234beb57cb09511bfbbb1331801be81ca8e1d02afe84d591c798ba16a70aa39ea1fbd16d9258be0d3c503c8d661228b099f2015a4dcde20b99b5eac9d00b91d02f9ee579fb0aa1e537148212610a9210a753c64f7ec23ff5314719e0389529f8c4c400cf34f5b77332df5262476e16c1ed8cfd51d156c214ec44a12b8d6dfe120088d0c9bbe27f9ce2efe0035875703476337034cb52df9a4e5e1806d9ac5fc518ea48160481cff4ddc18964119f9794ffb282d14e7cbb0eba2fad9687476bfa1b83818092c87ea56db4f968ae9d7bb027046b3040af0b8fa8145d7056d155ad2dc1d8116218c04fcfa77bd3d7b3009df76b452c7eefe7765ea3c51d8e5d2a9ca8434328774a43aa8ec98ec504467bc423744bb71c1be8a366de4c65f0bfacb7ee590ab7a76ef7d6f8fac9d586e1016dc9c96fcd8e0fbccaa31d7e47ef6798897a9c7710e3af3eca1cbf12a413aead276f0bae42487d5457b157ffac6c8fffaacfa6dc8a7d2183dfa25981bb5fb071107598f9d982ca5bf29cf5e26559d3e1833ec5a3fd1e220fa48ab8e099ed30ab979512ed0a245bcb0083201495fbc7b91249207d6465bc7bb3f50285658dac86107dc6d976ca351d6be98357d60abb37cb1007041ed6e7424a34c74b76e83340cc8556973fb8707e4d294e87bed710e929275cc5fd747aee0a65ca6db13370d684b15dc9c9d345a386651e9aeaf8e0c5dd5aa459e5c652f389df9d78069ffc2486d029c7298da35517ebe8ce206b725ac5fb2e6be06f1df258e204c93fc7661d976cf8819fd537d780704938fd27caa50b70602a5ade36ad792cdf6a0e3e889e86df6414c49f95fd306a026a861793619276306e0fbf30e06c4b2ae4d968bcc2c18c45814f86e626b03da61a03611834974cc346dfa6559f39dfc5a4f52283349a6fa05eead752bdbbb4e57a843b1280e60636519a10899c06d9be09df64ef61eb3396e16c223d465fb64e2224e9c74247e989f856d96629bc2d9fd7de860ed9ad2f5f5c738ee2f1c7b08bd3a39b3d46e67d79aef915ddb358ade70146f3676e11295d63f26cf4875c0df1483e715091b0387dcea6cd07177fce9993a53009fdb21242ae836f92ec18ca6a23e08e01ac01e5ee5ef033abf16b5aefa7e551a890473fc095b5910b05082ebcb750e6df356684856432a2189d06b30f09161dad0dd6edd16cc10f3c077f5f67aa3051ae4f68a9ea551fea3cdaa6462dba2e250e0f9a63a8da06a19a800fa477794f95b332a833a18e27fae232f6c32094e2c36f54a325f73a6a831f2c0b7b48cdb35f5d0aee5f5e7092afee39ccda74eee2a1840f40477e0781704d3e9be5d80f524121ab4a9fe17fb900f7f2ccda93b3053e44257dd3e617609052e149e8eb7abba35c01ef2cdb8335e26010d2845c95fcdf9277ab386eda251907710f7f6ecc7d0d0c51f2375d9cf2b012de8b73ef968a05821b50d3e503bdcce89dbf32183e661c92fdd00d631f350aa202b231744dff1e8b8ca17a00387d87895b532253f41a42f9a9f4abc07521ccf3acf072d83c79b8b716f1acef24467149d5fd8b1f38796da752481afeda1655d2a374ca7a13f4b974aa20d583a38b3ab651f1c6906390f220c36c1588c71924a9f6b42b9580d9ca3c6c991b5816dd6b872003e35c2f847844541c5e006e079b42242f65671b25caccd7e0448bed087d992336d5dc2133b88632df26be878fa2159e8c2dd73c09cff84a8d49df7f8cd75dbfc0787c88084be1ece12f1b6865690f5881f55e70f275e4e8b775fa81c11ddf4cff77df60aebba43927588eef4f169f9ee73d88ef71e3bccaa339541b5fa085874700d50a3742110053ee66bf7c010103f59049f42c8dec7cceb993a569de448f2da8746728d17d694ab35858f7412340500a560cc4fd2df3e41870bdbdcacf352de8b9eabc7307f09ac6b33291f515d32242eec50aef807a1e4590050ba2875f6963bc3df6c1c3f30331ab7dd7fb9ce39a42b0a2855e0439ed940195c3fd30448eff8cee23f10646085846af24f5c3e096e424b3fb69605c8cf274bad13228bb51989659891bac15c70928b9e8f7de05150e1588be6b081232de324f4695882f86a546f2b483862cf0c6025436053024e6e148e97285198be40cec19b6c3ee0115678102decaa4261b6af4afc9e6e9fad4e6bf3f168c5d34e61302d34dba7c0780bf6fa4b0645b78643a830f4847f1ad9de193f7b738bace73adb1dbd74240b300cc2ada4f8f4429e8f0f36fac03a9d5099d8f80e1de259989727211c0e1078f2436d0fe0ad90aa6e19b6546cbd20f40a3c8680f07be3025ac553ac34e2d97b96f93c2482e93fe83d6b9351594bbb","title":"518. 零钱兑换 II","link":"https://leetcode-cn.com/problems/coin-change-ii/","question_id":518,"issue_number":67},"65":{"day":65,"pres":[],"tags":["贪心"],"whys":null,"difficulty":"- 简单","description":"```\n假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。\n\n注意:\n\n你可以假设胃口值为正。\n一个小朋友最多只能拥有一块饼干。\n\n示例 1:\n\n输入: [1,2,3], [1,1]\n\n输出: 1\n\n解释:\n\n你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。\n虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。\n所以你应该输出1。\n\n示例 2:\n\n输入: [1,2], [1,2,3]\n\n输出: 2\n\n解释:\n\n你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。\n你拥有的饼干数量和尺寸都足以让所有孩子满足。\n所以你应该输出2.\n```","content":"096221cf5b628be1e73e8bcfe626c7347182268a04f82d930a6148296200033502310ec8ab1a6ec9ebd627f465eaac46b8280bc2d829199fbe23f761a0f8f223fc3b6776d4d5d2e00024cce88a9252743ee16ec9fecb4fdd743cc00b6e43450aa9c448fdb0dff17f67718fab6054175efb3381a0cc827a0286604945198359e336d5024a3a4417dcf16fedfb1cd668ed4df9e52ed5e04a4c96a71e3b4208389b1d3d134a03d361c2e6c7ebf48a671f7d07a8e1f977022f8d1ddf6cb4dbf62a1455994cff5546cb72e59d730d83791d70a713cc70612cb1870a60b8c618087896b7add20a98e156e0a11246ada1a1fbf14d4278aec4d12f390e25900f32173fa8e0648899b19a679e4047730fd45d5b43d1d0b004fe27954685d1c50fa488408e521dcb8f48bfe4c80ace594c44cb5522b5ac7322efba4094c04bbe9b7aee23b54c0caafc4a301e2392e20ed1bd408e48a0f9b8b5afb5d66abc2ad2b334025890e4c9961cbbdd1ddd161dbce69022bcfc729cd072df5247540334f272eded92603391511b413384e21902f7204fd6090a9d3028f597a249b8b07b05f9535b5460fdbc2b1f406de52e8b842367c7ec8005f7d48ef2c230ce732c2273b75359666d211aa5cbe1299f6d64973e5549676f3b0ac47fa998dc07157a13c990410c2e9a7ebd290b9e0e0384501348e2fe656fc796d6e61ecab83bc29e21a13dc48413cea72d1f1a209720a01dde1bcfe74d18de60aea19cfc530dee0b4ece87e0f5cc5aa9759ce1fee280bc3f5444ccb4f3e6346e2f632d56d51fcbe0377c2103a65f0b217b34b7a2dbc9c45a6e06562ddd4e224abe1cc814449f6b9bd3172aa7871200c9b92d6ec9f6dcd2c7bfe103cbb9433da89cf0a88fcab78004718f224562031525124ebab0708999f55c7026cc1181df810b1976b361c0dc194c96e914bcd1c755f3bd9abc4b4d6bdd989bbd231848039a1c29cb55f2aacb9373d70ac99c6d85c020963c21ddfb0a97a30876ae768dfeae79485f35967d159cdc6f3de4c377a89b29f84a14200281c96d501f594c8542ef82982ec61ae2bf7ed0ec59eeca4197f8cb9915de0a8a65b5290c36a255b2aa4d546d239278f8e67b726116314ab26917b0a6b3dda00a1fd840cd45c18473d745b3dbca3e395edfb99a8d3c0b0f2c2d6b3c677c3fbf85d97a4d14feffed51f5004d0a6758f588e6f11378dd03f244ebdc8fd9e7eee7d67cf30e8afc97ec7bb59e81bf4971b7d634ebee2ce47b9f27d8754bf334a05014f5e354a4f1aa37794bc1eab2f91f4e28a8f0c7b0e6ddb9a8e0ae07f8bf793bbb78f3542ef1d818fbc1d7178f3160d3fbd990823b5b7028cb29ea5a46ae6497ea402f56fcf2c9a2f2cecae2ed5b49d9b56cd6a675f6001fb17a82b8ab9a1ff6a993e8a1d435908e7e9d8912aa90b0313606adbe283aea97733b21e1f6a6a196adb060863db94eebb075dcca105bf45d08ad45c172832c4496999008d3de31dda45756925ca3c51f386ee06508567394dad91d8664f78c8aabdc6a99467b1e8f870e855c0792b28003ff597f3b2ef62b247bfe6f3be7c9cc2dd0b1e3fa119b4a7c435567e2c806d25030e0200649c55f53a43b65702f9fe6c654e86c67238d8c7f9edffabcd19dc4164b5f8c61b67f8ecffabb511ba62045a133526c0d1a333fd0e428e18be46a1e507aacb107f6ca1a541b581fb3cb8114cf89047db28a038a092147548ebb0b2316139605cdf775952d793119d256be5ec2d8f34f4430b3d75f2c084a5713f3aefa18a54bf6c2fd9749342db6ded8f915cdb38ec86e7e80864a7a8ac10c103327b6b870b2cfaa899e4141113e9e8fd5f7c594f3ebe629ceb7379525908fbf8b720231f4d4a4f2c90f2975a690bd267870f063ad60ebc6b5730d2077097033863b2d0be614ad3c945dd1399b78c28686ad9386676729cf2d7c0110d4daf6208d51bef50a19b07407fe6bd344f5f0a7e3185f85dae85cbec3b08d3cd9bb0e914093c6fb393be9914539963501e4c368a879ae2bb0102216bff1b15c79ed5087be8c7dd4d68f71a6e4548709f8fb04d8eda8767e8e0a6c776de728e89c5708c14d92649f3e067f860914839089bc92840a7c559cc7eff4fa21383c4b81d41027b101bbd997bc073e7c0e844a7b8ed0875ae91954ec90b6572f6ee734b269963219128f3918e840dfc67d0dbad343985712d15ef0b8d784c10320158041c73ac6c7615325843619042a6e4a574c37977cbc92db62d51b813af31ecdbf9fb9e3f88324674bcba36c7435cc175b5fadbb7980bb38e4bb8a971b8f18a1b246c4c40588cd3cf4fb303d5e9ce3fbef96ce6261ef7b469393732096d36bd470c5c7ecf9e3cc47825724e052157e59d2338721fcfeab0afe24f716b969928c09a0a6a97e3467bb45e40e587716f74ea2201a90d98c4db084459bbfec51ffcd2e489705bcd9a811cd60fc702bf8c699ba822fd71027722e9ac39360df04cc6bf3fcd7ab573271c256ae966a1509bb87874a44fbbef905a959da56594480680868c2119ebe253d97f137c643260ec398b90bcbb259ceb8bd994cf0567a549b96e771aab49199ebf8bd340dce9f344fa4415549e701d009fc364ca94871b31682cd0d7e55166a967865651aa18e2b354ae16a1170fe5c0bb3814b8b2b83a919399ea28745c6d068ba5dbfbbd9b49ee9e1ae03a69aefb60c17f41e290a50731fa6431472154a3683ee7b3c161d7b3325bfb5caf4c2974fbd87e431660bcc65035b6a57b7ed6bc92914f4a4a53b4d0a3003ffadb235b8e5eeafeff1d15b6c3b7aff6ce597f2a7fb701db2caa4ac892926b431dbb8375b192daa51b1e77c69253ff6ea4999a51f98996a4400ccc771c170ba572bf36e5a2e51ee83a5c1f93095cc1dcc2cc905d707b514f4142d29546bc6fee9f0874cd14dd2953ad0e749583404a051d5c756951947508e339f54229bc58c8077146c93e31e56149850b8a7e6a88af521241f46092a8fa8b1cdd76e298d619d052be4a8fde55e2091d49591cbb9ddd9a8c42cd268b811b10fbfe5502743dff78f86dfb5896e8ac331743e73e8e95cc34a53c562a73cf27df38e6388ba06966155c3ded07584cf8d833a35369156ae1dd5e52ed07e9032b3ec65a9d1738295ff99b6d49ab8a7cd3f9ba97981c88f8ea3508941f1e8c90fc5a68e3a552fac849be108b2a41e3611ddb88aa37da540eba743c421dae1f3b8ee2872ff410132cdee406bb0bf08b5aa500c356f0756ed3d3a00571fed628a88595c7a590cd80bc8c2c78bbeff7f18dab000f2dc814621c717ca94f83b8d9a411c1d4d14a57fb6349bdf334ecb44570f623adc420a57428e1e2e09bd7c332421415d340ae7169b6b9e2cf091616b18b37128ce08fd9dd8064c12445919dbb772d5943be754064525cd00c0dc2c487f5eaf0016abd6baa60d6bd1b94d5eb37c86cbfb6660262126c3e0354f0687e268d4c74c26cd35ad5f293e7b86c07336795dc94ee0c249e5c2e6ba8e096aaa2fff727282f86a546f2b465869c4174a254360535f643c51dd9c234ab2be128b95933e35ac0643030a4aa3ff0c35cbb445f39eab021e87ee4534f157d340016d2a1e53442397ae7f3f88e283cc9310fd2a9de55c40a2f781f1c9f48794feb28624faa1f88addfcc0b883f1dd7e9e9400f27c2c3a885d1d11309ce91259b29a27e7ab988a856d8df2882610326fa9b5ac5435f828b95237dbd18838e397960c8131fd3c77961004b4cb722e73a93967d4581555bbe57842e72a632542c174f7772793757c5e8a54168380eb96ad8da881b35dd807e90557703bc93cee32d827142b0509d1d7ea2d10fae24c732b22a20ac91d10a8571119aae944eee787e28cdea7dde77cdf054a5cb02d0fb0df6d1ac2a79bfcdc98d7fe54c9031a07cc4720b5d69594bcdeaae3907b405e3c97077f153e64c8fe7e1ca4d8d68c63ed1fe030588b14eb3000d67f33efac7c73e5898ef220ea258a8a0794df3d1573685dbfc3951fc95d5a5d689aa366864eea3a26cb27b9d6bfc67e7ca73d79a43400e9de9f2bb191613e85419cdec8a023a595d7823790f3420b1924fc71a1239773d4eead72633404c1e0576e8167e60f013d5e52093364f4fbd2d1b6c3ecc89e2968f86c079f8f578b4c6b708fc40492fa6c788f159be129f81341979ef0ec8ef58a0504316bcc717cb4088356f76c32e32d5befb200126ef2aad6d5fed193e6682a0e0f74c8333c0fcb46690c025220a181d5e0f94deb28fbab26b83f4ab72e2efa889de677952b848e714f1c1b49af6841fc92b9b2e705c5ce1d16be675c2bb39ac737c621a43b8113ac28ffa07c09c2006dc8daf75df77bdcab745349653c78d4a34c89e5c586cbb5d9c6c43a0b71ba1df765ac9b60bd6d493af1bef51429c655554ee2417f6d175b27330b7d5ea4b0b3c9c65e6de78f69e72b378def0e85886c7bf3fbbcc4e6d6be4f39bdd1c0790b792b89b4eb623e4d33c630d7909e7ef9517bbe42adf47c6f2b789a7e94e4fc6febf14bf3e299b384ef0aef7dc871c016bf41c81581aa9efebcf3a173235dfd45745544bd70265a81e9c2b5409e0887306d3050b1c7774f314f28bc9ca43adea2b72fa0108ebbb95d2f74287ff4b9355ac24d55239b4adc9b056a8f8cd4ba2ab5e30084fe0185ef6f32cdc116258d7afbf836b746ee83bcf3d33112266897a67788e25c61cd8708b27c925d54110c77ec8fa14f78ddf5b2442eb8528aedbfdf72c5817c9260d253ea29caf665976120c8a632e0d02d24a36dce4d08bf68a78412118df4f23ef4aafe0c8c9e16211a394afb3209d97cf119e775ecd56c8dfed2f29b3383193f0567caef995b6ba8978d660cda43c628231c380a4f89d0002b11a285775f21527bebf345d5e9a67ac8cac595fd8736b8b574e22272dbe473591b7b74110c3a06c6691f5337fab14e3be1465fcb268cc3abd4d52718bcd450d9d3403f3ce4dbdf757453ca5339c9892269943a4439502168117c0c65d5b37cf38e2613dd040c859d96cbdbe622c1826b127a64886b50469e6cebe781af28de128e180bc66b90fc76e6cbbd1587a99e4b33556b9a271317547d214615e2310af075d60b6f5e0be8f8d8de1c462c6d24fe3b234a9ed20ffa9f6df6ee660bb221744a450a1c2e032d0398e8d043f10c917214d87f819034d6c1d7f6bfc90f1cf5cc86c63b547f90aefc9a2f3df48a3e0fd5736922d5c740bc72ea3925ce8bda39d84a2b6d815ea8c763ee09c9d44a78eaf594eebad2e7793443a6488acadcc5187508aa86473fc423a4b7f7e8c5c3d2e792d6641e2a7013df64ccd64fbb2b0a98f84b15109e1bdd96b2adcb47908bb3247353a645e5242ba44f1cffb3946d93f9f22bd461638ce5f845de81140bd6d459bbd629537ee1be832c0a253a2456dda3741ad81016e91e78ffecff7fa8769610f32447d6b8db3a30bc914db1a6b222e376501033f436f38a80a244b6694e35f36c1258a025737576edfd69c1785633f1adf281d3a0ef630835225dad42c5f960703912f53d094167cab42bd13cd2de4f101a96b047a39eaf0c9b35c40e633c433808c0806491af8eabc06d194075a3ab4268e55357d3fe2289f8f12e3bc8133bc8eff180927bd9cb28b5937773e1d54a9957af569f51d3c0dc6b124b360f30168471ada87428aa404822ad7f26373dc61eb6979fcab1af3acbb31d822ca5837e3266f581a2ce2d180a71089506b48a8b0b4e415d000215e4e15476421aa16e3c019dbaf718faacb9580c3ed5dcf98a80cef322d6d9488f3b4b83a94053292ad3ad1d40a0968c1cd152093f68e64ff7f7901e4d9a1e183c42ad3ba3ad8d652884c8ecedab1d341a3bf315b858328820a0d0d1cc42734b1be3b485e9ebebf9c973388730d4e917d3d712a9ffbc2695c13833f2151c94b9fd8004400a8587b3999bc9851a26bb0c4932a8ddc71e52e92eb482a6bc570003352c8a44d7257a78f04bc3afb80af9b2f3b168d72cd45bfecb0783ee1ae50162803d145f80c96451d85a6c48fd7362e7629a2f","title":"455. 分发饼干","link":"https://leetcode-cn.com/problems/assign-cookies/","question_id":455,"issue_number":68},"66":{"day":66,"pres":null,"tags":["贪心"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。\n\n注意:\n\n可以认为区间的终点总是大于它的起点。\n区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。\n示例 1:\n\n输入: [ [1,2], [2,3], [3,4], [1,3] ]\n\n输出: 1\n\n解释: 移除 [1,3] 后,剩下的区间没有重叠。\n示例 2:\n\n输入: [ [1,2], [1,2], [1,2] ]\n\n输出: 2\n\n解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。\n示例 3:\n\n输入: [ [1,2], [2,3] ]\n\n输出: 0\n\n解释: 你不需要移除任何区间,因为它们已经是无重叠的了。\n\n```","content":"09613515ccd44c9cde7bfef88e5ec8bca03ba94db3a9af1fcccdf929652401171efd987226f39a5624643ce83ca1e9d44ce7862078aff81138c020a7473e72fd1954006d8fc0d1e0536c8da98c98497c38e078cb97af429d3bb46adef5acae815c2fdc466fba95632627026da6d0d8ad77d843643244e7c56cf1b38760a670ca35108228584c405672a55d954fe83c58c4c2c12d1e74093397c14307cceaaa20130b254614f88e7263074b9f08174c4c4cf1ed91053976258f58977a3890167512a31aa56b01814cafe9436fe759752da17385551659a7e4747ae688045517b6d4f7dd5dc8ca32a2a76e1f82e6fcd291134a34c4e3a964034459a66c562f41d6f00dcc98e8db79c90d711464c6323d599b829f6fa30bfe1b9d949c2eebe57cfa0f2daeda5dc086fd449e7e151bf925479ec53427583e90222fd12f5813ce5efd6e44e3fc21600b7635418b1c4d6a00d3d6a09ac6c8b0b0128d648fbf6a5365cc80d0f77a83be78f15c5267035644be951293a008c7150956597be73291e4de0924e822140a4fbba56d34a17843b37935d7503d9ec28b11e0b62c6bca3300510594b64d6d4433ba13d7d31215a5d8d36eefa3e8df47dfb5576d614bddd0e14ce28e5afdfcad428c2f1ca6600845393e065b935fc8d0dfaf8192688ff37a68539319ff107304f38c0aedc9f2017f1278cfa8e3e316d95665e2c147996d5f7ac7521398806656a3aa128a4ecd2b758ae87a6d989e92ec520dce2a4fd9bce7d8c09c4ef09bfad4e8bfb8345062cda4dce52b5f2d433e54f030cad215731d2fab6618217b3459f8df94ba6002bdc9f177c32c6c821cfd0c9b309f530b9be02e7bd6962163b7d7717e666f61233cd9687e82886102046d7f5052d43607d31317e6b0c1a8a24ea28a7db6b929e01764d35ffeee11b5a8e663bc62338324cafd7eddd7810dd13c77c2720802e8dee8b2604f6862ee3b7ea45b94c0e4d316d5bcca806d87d308558e99dd155aa9d45559eefc224312a99cfc8c2dcdb52249d9ea3645bf7017e341b2d2e1816f99532667491f1ade38312025e13b0132134e7659ede16aab4919359ed113a269a928d2ae5d802632413c0123807ee92cd78a8fa16611a82574b21774762ee57bc50ab376ad0cd83b3d8792ab2f5535c7d3feb79c09063f2c7827a2dd895137952143669eea58980b9cf382f9851428f54e99fe0bf37bfc4c4680fdf0e3e3efa35c9d6576c3ae50dafc832e8f0da5996cc952e94ad74462d910e6a044841374f8bc0db982d332271af2bbc0d2761b3ce1b1c3efbac1d5f0d7e576fee9240ed025fd1f73ca9f6bf8a98222ca7942be9cdef0f914e8959e27ad37f0a902ed5f8f5d401ff8a4402b3a6181b3c70210c21057121fd1fa3708b16db4541a16d7a4a2dd8f8e57d9132db906c97cbfd6d50a4a4986fe48167378d7a2332290a43674fdbbd06865ba1daf39e333457003fa1d6a94f4059139e6ea4b520bdbc8d8e6783eeee4139e37b1603b3156ffd3cbcd9ffdf813955f293c0eaae8639b62791dada70fb14c0ba8af8c2dd25a75182ef62f2861e46f04c8c7f315dab4ddf036b79e355f1a0be6855bf4274dfe8ec42ddd02358565004070fef7973bd90e1a1c3244f5fdbbc01cd0acde19574e8d67bb7da8cbf6b9661888244aa3375f53021a0f29d3cc3de09cd1662d6276a08c06c4e21642325a2e99c89127c3b3197f859e028a3b2f6c788bac3fc0672ef17bf278bbcb0d1eab6b956dfe10fead9e591ab93138b6e58cf8d6d74a0afa1d9245dcd8fc9043bcd9108fe3f807cb771a39b9ed303cc8cd3741b579466f9face34177601648ceadd6ac500d5220285f2a3b6f964d699919f7323ea9963e82e40f5371184b8dc2fd737cb2acb5af60bc53ab27043991dca08edae48665697a813ee164fd5c9061985f25e7efec9bfdf84108b9412e6c0110e1f9f715bbbc1951ce4aa62c42d50361e031a088b87c4bc347719bc1ea075655db330eb8870bad923e6dbbb1ded4fe1948abe316d36ae744b55c710ef0a488bf7ad55f86848d7bd8ee815d8be776830afbc207e8db2d3e7ce5f00d0e46b250f3cb3e08bc3f9b10e00a5e2a816356b87f8bbeb785226055aacdefd2fe2e12044190f1100f970bb7e494800f3d5e0a8767484267cb21cc5c04ffc5fe68450bfa72f553d46f0c73e2039b270ecfa7150fd3ae6bed0b13953ae9d9bfbc8a550f75ff759371f78d294b63f12f5842182d377d1b6c8c23ddb58936c87fd332924ac1d53c13e2ca8f246358c8ba647b1bd2187768aca564818c3ee7abb999019918ae8546c4c409aec23fcdeef9973ffaed9ab78a8d3e57842e47faee5474cbfd25ae48a6b4c9aaa4ee2cdf6274bb595818568a6eb37ba6c9d25adb588c2cf014adce548aefef797c0f9f13a00f272f22b514966d47b0a0e840da28ce93adf752fce9276ca2e9224d6c4cd701b94a4e91c0fcc59d6b883651d1cc59a683cc1bcf6667e6d8d5b9783f68d457a3b96a1216ba98854567ebb0d019a94fe7566b6b63dc8c68c52891a128309ae934ec702523c9918634c38a63c2adbe56f69d3b6b14c7a5ab0ba6daedb4848d855c53c4f6704be7286210a0268741e379139630118ba94c960d1ad99dafc24b1a083af5e22c7f24f2317463bb031ad3dc41f47aaec35b2cf7e7a83abec53cec58f8f1e9cccad2aaf50ec23855598c6db7145672413454a72d7c707c393acf8b5767760321a662c7bad932ac9c02d8b29e624179ad5c69eefb9c354168c20818da85ad0578e9b88d3bf1bf58eeda94f7f99bb84b056b74b131d0fd650f3fc9b9b0ed87a2bc17c53e4b91b74116345bdb44d88e75117032125004bdcdef7f0c8beaa60e1bb9298327a2e674f3fecdb925475e2378c523218d28aa31c04bb116d94aafe9b9facd2e307f296a8812894274e25c02a6e6c9a622c0550bdb718c88bc06c73acbf464475269e3c7a00a78c1baac1d9964556b7a7e61c4bb4e0299d763245e123ad48747d77e8fe21c3a4a35ded941bdd01a2d5099870e25c85791689345ab657ea5b4b02365715f580215238c0bfdc6f6a96e2fd33082d066e609cd9705a6fd16c1fe52803806c4cfdf648a8bdd8870204ad806f20a9cf434c839d12ab7a364c2f7bb60303830391041166551c7b8985e8101417330eb40ce60570ea57a6039ba9c5bafefd8ef4cf09f4ba5951a4e6b32d16cc35c2e8c48961f557c7eaa292886785647f374d7a17cc05afbe6d2e291fbf593288083d9f09525e47c05b1aafbc1a45bda42165a40751f8c953d4662ffda4ec4ca4aac5850339807678093cfa4db348658ac1e19b3dd0de42057534d9642630670228bdc8666cebc2819675f201120dc7ba4c437a3e57d015cb22b45e65ea08a9e747e44247e7ca89537a78953ba795a0532986cdb997c742b14bc617cb19cdf899787672a8803be38c6d09fe6c2a0cdc15a0bb7264ac6b13b9df20362cb1ab75a1a244f9bc0344d7a51f247a5cb22b68789eccb5b61a2749d270cc7aa3c1523781d4127834a6c250a2e071a363855c2c43251f4f741dfeea27723b42e4f4d051ddef60c38d5b403b2ca74b5ad4e6bd9f168c5d35d4b703652dea9881b4fa87a9dfdc246778f18b6312cd9dc676e137c175901377e691db5283739072a0a5759002e6bd25728a03afa8dfc618fd888b72042cb73b89a69cdab98d9cf6686e9a2675e616fe99fbd7e68d228b900728f849338b7808109db57f3290e99021096aa5d3638a47849d958114fd0d53843dc705f7a29c137bb3674c0750f11804e10ca86a5dfb8a7fac0fd1acd5ae70c503b72ce26ff60c82f163c6f4f85a9af634499aa053f6f70e744c11211ae2c2619a4ab44f5e89ddeb4d6bdd4ea27e4094a51a1210fbdce2d4ebca7c9b98f98cafe44d2291a07cc4720b59fd3f5a7c2bfff9123525d3db84645673533c8e0631ced9682c950e90ced3a70cf3adf7329c4063af4867c73e5898ef220ea6cc4de07dddf201563200d8e8af51fc4463d1c3092e736fd0797616ec63b879cca8f7560b6735de8714eae8ad72bb7976174855d9c8dc6ec66ebd2c1987bd1e3680819e348e065b939b56c616b978cf3a9015e82b344fc50c9e5d0dd9894f5916c3e487e717948c49eecd378aa8a1b4af856cda3fe4176a45444d152a5159be129f8134197ccb5b892accf1e603166cc3c3dec00c706fe4672a36d71c5f201dcf1756c6b773b4b1523c08cc8b1c49f3953699503aff2d29b9f723f18303fee49be1a67942d8515f22660faf69df47e9101898eb6c686d2fe71a6ce4a7e0410229f430181acba085465e7b4ed1dc522a4f31599349d5c8a560ac1036d0e280fc135a6b881ee89a3b7b7e11d21f44127571d5d5c5d1e4ed7efac02891eef777d689b73ab97323826e2b60ad3d3a735d499c5a3baccaed995d765042d491ecd8f0a0ead59c49f3f29b55803bde6761250aaaff599687c371c1cf4edbaab407462dee0087a98b7110612af0e4f76bec13b58ef82ce26df2c40332cfe5d678f3846505c1728b04bbb7dd907b8328268b7ab809dfdbfa02abaf4923aea1c3a43b47e7e0aa7aac9fa56834cfc76287e04d28839551b4f28bc9cb330caf6f339e0159fb49f554b145777f4f23c528a453d308026bfc85111c6c280c7239fee1e84b74fd1f5457b83951662c13fbde836b7568efebcf3d33112266897a67889e45c618dc20be635c14d2e0b0c77ec8fa14f78ddf598442eb81b8af0bf9d72d8903f8521c554ed6c94b201db0e669cae76ecd0682dde2587014db72febc1544591f4fc76a7aaa45584db5369147d10ad5d4f8d60f14ae926a58f2985f7dbd89b33c762767867d7b4f6716ba8978d660cda43c62823367d4606cfd04e6445a2c177103a1437d78513e4acfc33b585c2ec86d47afdf3209f2b58dbe473591b7b7455027b5696777b173fbfb8643be1465fcb268cc3f991813105a79a489796537b1fcedbdf7574178f15398cdb633ad155123b4e286f151e492a90cb2ab2c2751b8e4140c391968295b2679387661b6f2a830c0215e01787aed2fb53975cda6576cf36b7e276af85e90fada99e4b33552ed674183d497d6d035bea7844a430845d2e1258e181949b5a1227663fd472654ad0d212e79f20c6ee344ee67426044530362e032d0398e8d011f516972047d82de4c57a82dad7dcbfc94652a189d49050182c9efdeee2262e958f2752b3180e10c8d208b226ea1b119ab3c939f20a6b2dd10782847dea0ecf867737e8a0cda7a6d9b1153a0fe30689dbd2aa18502f9ded413fc423b8b5d5ecdf86bcf597d8466765369057c94d71ed12f8df092ba49dfa531dd7ef82a0a7c8744901daa9c25fe1239497619cd464350469fcf1bc679b262dd6ef81078c1295c35a35882c01c188b7112e5ca3efb9802039d5ed7d1eb53446a54cea5e377fb8580eef9d71e9dc224e1b92887915c7763d1de701a7988ac672aa428a5435c16ee4ddf169c2d7c608e0b480ea2111a07fe580a558687c22141a4ba6c2ecae9c5881221260aab6ea75f5a3c2f66a33e914f9301f8799a11d4fadabb9b216ca23d61d753243fc906d49c33c23672b56adf4cfbe0470d2d867a5a75d0fbe676063e9816cd587682a750754ce490c9378a12a75e18111d74db173d31496949f24560e384c7e19c73ee3fc6232fe440267f91e6a6e308551f8c3da99e5a2299de312d963ead018772ba68eef8f7551156111cd1aafc78a014902466c4f1beb855333d1db5ee4c0f308693f9a5f5a3eaaf57a9ba49c035e47a039944e8447b4b0543dd4fecab58ac036021130448c862030791be90fbafaec6b70f840067e1b885fd195c03a17f593dab4da3d604634957db6346f9d4bf9ccbcb1510003249bc5a58798e7ae824252fd3687b621b89605c8a09f74c8ccbe9955c895664e7509898bbedccb81c0e8c5e05a13f7775e67f5c0ac4670a142a2e5c98d105e345840aa0e8314050ac901a8b1cb54ceee83b90c8c06a203ca844680af5af2571d9499bced3504fc39b96dc1e25abfe80cb65ab25047881eb4e886e6999e515765f65963974b9262cd521610e64a3856afca0dd66f1307a4eeba7c1f5c240856df33b76f487ce75dc973ae61c0e6d5b46b405c4018f762d75c11cf6fc6a36a6bac3a0ba8858b3feea5bb71cfcd980bab8e5fa0687d85718af78c54af97349fa03c0f510a27f4f5363ec33fcb785f06b5a36f237bf99ba436171f7ff62e255c86cd7cbdf2c880e415ef966025a749c832c35fd842d04dddcd64b4ba145769104bf9a857a1980885e32fc04fee040de2894fdb4b6a638f5b9a03ee0c573f953548f767495468084f4230e4743c76e0c4e282cb74ea0405fa54cd3337297fe430605d278a1bdda40e5f3620450994de157542ab71187d90b32df3739a7b1c491cc844461939afca5b3c6f70f1b2f1d52cbdec3c63f8578a4faaf64d","title":"435. 无重叠区间","link":"https://leetcode-cn.com/problems/non-overlapping-intervals/","question_id":435,"issue_number":69},"67":{"day":67,"pres":["贪心"],"tags":["贪心"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个非负整数数组,你最初位于数组的第一个位置。\n\n数组中的每个元素代表你在该位置可以跳跃的最大长度。\n\n判断你是否能够到达最后一个位置。\n\n示例 1:\n\n输入: [2,3,1,1,4]\n输出: true\n解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。\n示例 2:\n\n输入: [3,2,1,0,4]\n输出: false\n解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。\n\n```","content":"096221cf5b628be1e73e8bcfe626c73470823d84ccaa16fd586d3f787f5a6e0399120eaab71a6acaa2c327b76ceabd51b4230a8a962459d2b221b53ea2e5ff2df533792a91c1cce34424c3a88cd2371574a73d037164857edd3ed52860577de733738149e44777abc0dc8e8268563259fb3a9ea0cc9e771893624267fc35f628a9aa4455720c26701ee65bf710fc6af5431b5ba7137f2031b2c6432cf3e78b301913114835df8e6c620165abcf63730135c58ace12580f0bf025883d738b4e0d36171b815603974caec0546bff6b742db47c875af9c10820cf28aea86a1a292031667151c4ed32b89981a833226688ef160a6bed634be6a2467985687b24ae6e73cb889e9598458245487e03d66bb7d11e5f6c82ff33834793e1c41a8d8955b45d1cd58258bae7d214c04f4145e57c21b6a87903f4b75888c36e8c9d72f122a7780ebffd481d042184cf0ce6a9874bc4abfdb4b894a2d44bb829d79d333a70726dace623ff8319856c103c15342bafff7e9be371c27e48631e38e778e0e1936123a1503c453d90e61509c92f71fb090a913309d496b046b5be4a05f9535b5460fda803136568e53b95881f7e285fd369eba6fef0a968f3025d282ac24c03c5bae45186a2801aca3546f8466d2c13597557f421f49d809aebf76cc790410cc1361bff0d7300f6ab045f14628f7f195ccdafff3ab6006eac5d579f22e85315ab74c97b33664395b069cc108b135f85d55d6ca1ad4f593862c47610cfcb8af7b8c165b0f6d59abd8c05eacc0884bcb5bf151a7051530ee66f93c6a7aaba47c659507c4596b7a2f6c9e370a9acd4eb9a4d723781779d2f2cf47ffdb41741fb9b54964b7173539f727514b4a2ad61ccee3107f3d7c5cdc7cad6d83014d22c07382d7d451508e6a9163bd4b77a147de374c7780be49322ee72a753b690051ac1146c04d84587bc6cabe766eca49a813cc7e9e213dee446dc99e8e7d911dd8c0dc240c3852dcf5a2359f912a0a80c50af7ba2feb249496c2495692591c64b3fdfcb7a97b32bcb55d28fab82eb69513f43429d50e9bba829fb1e001a3c90eb30b7fc2dd053757583b651bd27d83b85fe4ee7770dde828aa954bb66ea7a0f84a055d4c70510ee27360817a011cf5bcc7dd75ac1504481d4c4210d5fef80968b28083e052d5622665633bf85d77b6d0efcf2cc5bd03ea2b9b5d7290edf3688f2dd27d646fbe28fdcc6eecbd39376804f949fa3168cf8031e8cca38dc0ddd3a8f6e5da6e9781ed9a4449a3b9a6e270181a9de1032f9482fc8f7441b1de75f5675bac2c1fce6cb994378e095b943f85822f235889a8bde49d0103d87eb81ff9770d71273fa63b8462fc468fd8f635b1edd8bae9abba4e6a8895c0aa9adeed4b441fc113ab15f8bbaa8bb12ee8098cea23b63a4eb1589c475aad5f1114772b2f377379dcb7c6eac9d91893f7aeb9c3cfa2cd71ced67e14c27626184380f28994c8a55a1d82e342ab55167e64b03e2f33d5285f91f237c33c5b3baf2d59bf265e55561630fe08571da324549d2ab5ada6c66dba6e849d212090f67ac225d03d9376ee78f811288e0ee894a8dfc7a7b6261cfe305d05432dc260b77d55f558a39516e2fabf5c544ecaaceac5919fb99e7ec965b5509839b9337ddd900bb6b21f151723f742ba567004766472c55adfb759f90ba0d380525a9e76bfd4fc3da999ef846406ec643798d7dbb9e0a8d2421716b8ba326ce6c11fe56c5b719986a282968866c3b845cae8444dee5297fdaf0fd606e10351db5759006adf7aee0534061b056d8ded00dfbdccf2f29bcf80d6cff9b3bd5fcd46c2a986e113d2610a9a69cce444428134f2116f162ae5d65b12e704f0b324180ecbd222f2c0d02c3cb9b2c7725afa49061b66ea907013b89ceada1eee7a44bacc7f66bea0cb95ec43ea92e78f09985a899877652c66191baa945b9c8ad48afdf5244aa158c6c09e3633edd77fd9ec81f4da6357ccab2eeb7810ef158853f863da69d3163b985cbd7c8044a97e515c875e678845d4419f38fba3909ec3ad080cb26feb3dc68dabc79e851ccb860f8a1c35d0bc71c0e1658be45f5c8241fbd17b613c2245c22a3634da6f9f4aac1f0140d19b89eb3c13b2f1b3f4997f91c1f9e0bbdf3523580e8866fee6c07e7e2c13cd0b2b6bcabcf313023337fe367d46a00cb42fcc5799d3c1fd2a0382197149aca17be1c3077465edf9ccb2dfc1aa25717faecaf7dd388c9fcecb7ebcbe56ffb1b4f5caa009645a668ca28377d50692455efbca14b4380eba0009bc40bdfbc1edda772a393e1c82ce44180f30ddbb164a4a960c3916c2435fbfc9baa8b8e1c5e841371fbcc5c77faff238f66a48aeaa6a8c02de9457fbc63581947894ab577a1ced25ada52910c1c862109ccca8cfc2c0121ea74bb796f3048c33b0583d21da1c17dd733da9983f751d7ec2762bdea0b676d7df002a8614ca3d9f3dca46a962252daf95298bf0b65f30a12fb9f96841b4c4eab07bcfc3308b3540003821fdbf5bf29cedd429ec32325e8c024ff48ed856b59a261f233a1b6ef2d1d48d1547af964161b509619c4a3dc2f5739ff495d4b01695d60ce8a1273a29e7edcd0b66ddc07d67996c979b5f36f89495fa792d99da56a84e29feb2924cfbeb715eef9a041b9fd7757be02e0236c9eb03b7d72d72e07e32abb357b233747046b6b8460385059f0e963b6d38db39b8e73b8d0f7b5c8fb4764aae99ccae93bbb555513fd0471e0781715bcbdbe4284f9715d54a4f6ae63b5dd8889ff5c509fd29b6fadbf0db9f1f8acc0ced366653776de6ffa93f2a7f8735b3903276345cd589eb05428ffc3a2eb57de6b4b93f3f4d692d5c34b4e2191d42b0168b7be7dea03ee1f64bd0d360433d0c29e8ea175c6ef37de29dd1ad663ba58bf727e664f0b99b0bb7457ff4faa2a10e72c71aa85af8962b276509e60d9c29a62bb379fa352240b758ba6ac4c25f6e8dc07c01c6d0e397737abbee2225c67cdedaed1a56e3e82269f1e2db9b1bcfb1f2080fa89a4d6819386cbc5699e61ab0cf61488e5162f27b6a3c69bd4e1d47bc8c32f3c6628dcf45cca1f03962be52af368f3ce6bc4b617cf4208c5ea9074c4e8a7a238251cf219b958d2cf579e6d9f23ecef47ab913293cffff7e7988eece3823392e979d19d8187be13d422f1f5c91f9ce9ce7955a44e69341bc6270cd4595289bb9deb34b85ef5bc439a6f97bdf5b87c87ee3ad893f75d7485ad66c108fbfb5b0d786e4c56a47a7f18452ec762ddc010103f5904d60c9cde8cd1a0a810569de448f2da874634c245dedde561c196124b524c01eb3fd53f90d61941c4449292d1f35985e5ced08e4d6409a36133ec82e2d1dd81ae4f996203b1665efdc7d136eded579a3b0659ceda81debfee4b4abf1a4ed66dbcd798b95dc65b5de4deec9915a4d32602552bbdad642988c725bb01503ec3e7e04522979a0af6c32f72ae2121899e308a66b590a6ef5f5d998aa39a9e47e09963e5c2e6ba8e092de36db261139ce524597e224e3862cf0c60254360535f646e148e972851cafb46dec7803e24b20043187b60a3ff0c35cbb44afc9e6e9ff0646bd9f168c5d3134b6d361e9be88f52c567910a3630cf8d2bf62b9ceb4452afcd8efdc6ca888dc7b2a105faa8d785c4fbc18aadf9dc5c7d28a03afa8dfc25dfd895b75b18b66eb2d766bfa3d3d5cf2f8da7f76b4349268996b77e68d228b900728f84875ce3c5d35f9a1ba0270f930411ccaf182425f62404d5114154bbcf3802a73d082e18c177fb765eea1f4e47870121858be08cdc8de8c1f317c904ea635d7f7ad321ba41d1220f3b2f09d183f4494499aa056f3a32ab0d82541cb363205cacab44e4e89df3a493a4dcae69a17e375cfe7842e3d6240fbca7c9b98f98cafe449b674e07825a6ee09bc6fba2c9a5fd973d083b6ec30f381c254ec8b73048a493cb9c19954da1690b8547a46212917e32bdc82873ac949ee969f622df970cd6d60a1563645df5c3881f826c705d689aa366864eea6d6e8222badefe913569fc5077e8714eae8ad72bb7976174855d9c8d94a932be80cdca78d1e43b4e020efc71a1239773d4eead3b253451ac9b1e13817bfb0f5246142f003c30de33714c7e547f0d36b9ae44ccc22f219341a9fce30e1bb33f3df1f6a5159be129f81341979ef0ecc7b7c716652f76827c6dbd53a956f76c32e32d5beff80b1975d8aad6d5ac94c7b33a640e5b26c076626998036945445228e6fa9c9df90ec17b80e15bb13f119d2e2efa8892e97751b02a4becfcd9b2e421fee72025377a44980d598ed104c39a974e78588b019b00ff1cbe369f718a7c09c2006dc888b209a22992e0260b1a1357069cad01c8e0e790edf5d08da0452552b154e923f3f4af21d76310b1feb50a53967f1602a3122c6d36513f330d7a11a1b0f6fe964522badd00fd01378db22491ec783bf598d8f0dccdb85432e085c07e067075f1dbe52a287829c637cac2fd73e10e2eed05d2bb667f3c659a629287b23bf5f70fe5ad99abefa160ba3098799353d907c415cfffd3ada6a082682401c10278447efd3e234d8dabcaf449ca668f39642b509bc7774d334dee1c213fe203330fd06aca61fef2110d7d247fa7b77014863a116bd84aeb9b15408f8cd4ba2a9fe300fbb244cbef727bcfd0586a8f6af0ff3f8056f58396f3d331126027c5a677c6ff1232d38300a13987320354687afd86bb6578ddf598442eb8528aedbfdf72cdd5039c6edf1da2299efc54974b20c8a632e0d02d24f42587014db77dae950117dff4d371ebb0e163849716271c3919b7774f8d608e07a87ea59229c8b683d0e47ec2413305299ff9e02022d597866645d369c6282336380a4f89d0002b11a185b3c7c3ddce2e409d206878a4707e5c003059bf527ce623829d746bb5ee9bb4e8bdc8a7a0009d8597ad7e76f49f27f1c90e8635051e4413c9d92d06be175dc6f8aa4f1c7dec5e53ca5339c9892269943a447e55222e3a3a4626d58761f3f16a56930401858c8ce1dbe622c1d127573c3083604b46b46cebb5c4fb7d8c5c8e6c59937390fc76e6cbbd1587a9cc0e67007c987429701525215808e24e46b53bd6066f4f21a8ebd4b170182d19fa5096e5f73c17957c5a987a28d8bbcd2b7e606f2d1ce8b4bbca2f7c1595199e79829f42ba0159c086b5dfb2b6cd2511f50b0f5cd8e3eb552a0c76cf841b50f88063e3473d848201f716c09fee0d0b4e853785f2eb5c834438866bc72f13859c6033756869303bdfb68b39e609142303f68d815b5cc0f930a9764f52083d492a1c112ffa84d8a89c70f94f50f513faf9081ba29dfb66d0616e6d1619c94e6b0bcd9fc160d820ad8f6388e56d3a0ba8164e3abc5ba4cc502f308f445b8390240cda4134abf4aeb38783607446756013dd6af6a25799c662d79f322409e6719e8d01ba004699f2dd5779e8d918f3a8f16de9301d4a2cae2ff99388bb5cb3554179b629461bef61753ae0030b691bc3c8dc58003716416774cc5f6e7c7ae811d6f1326cfceb36b0a1a4440f71e250b21753d6b3df757acd304863b322f35786a594f2ffb26445c11d22541c56b9ddcaa80970f5d36481935f29b8665271ed9b63d6a34e2b6c0057ce7a0fb05d1bac8a7346f44cc807b922e6144150a298c3f38ba4d524d387a95c1ca2030176ec063c38329610ffc7d689bff973dcf504c721e8874d3c2ca5c6abe4","title":"55. 跳跃游戏","link":"https://leetcode-cn.com/problems/jump-game/","question_id":55,"issue_number":70},"68":{"day":68,"pres":["二叉搜索树","分治"],"tags":["分治"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?\n\n示例:\n\n输入: 3\n输出: 5\n解释:\n给定 n = 3, 一共有 5 种不同结构的二叉搜索树:\n\n 1 3 3 2 1\n \\ / / / \\ \\\n 3 2 1 1 3 2\n / / \\ \\\n 2 1 2 3\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c0a729f060673f505b5b522e56b895245bc1fc25180a945be00f4bd74bcf881c76aece1138c41ca862317adb14b89fb51d390f74d2d0445b6df7373c74a4fb467326c1405ed3688e624b4a0b8bf9a56322f6dba7d3ef82a56cbba2f03e529ce4bc871aaa14a4f1cbfa2be2278d9d47516d0c345614fe452a9e52adb6767e0a9d7a273952ccf82878c78bf32b6674270d68e6fa27796dc117408b8c96da744159f3d8faf374d068b1fc70c5bdde589f3498944288261ca6fe48b1fefc68ee4ffe91a245629db7235ce8d6e549536625cb1522a4281081813321afc3ed4f747fade6ce233d12cb22efb6cdaeaaeb728492979b66ac477f5b0dfc6f5b4ece1f6267a404fc13bf9f9b07cfcddc3e9aaf65a84c4bc3e7449e601929f22b44b4cb2d3b9edb75cfbf76e8c276894993137a99941a2a5266aead77f5c8c47d8dffd4d3fba1e78c693fc48d976a5e4cf35d40797ba6ab78e47187fbbcba25bee37fa4f3ae67c8a53f197fb55c827a31622598500e77f55163cc9477e4ecb15405db520397e28ed568292e45ee330545058880434163319e05d4f11b1898d9d36ec6a6f8c1aa61f1026516f558e0cb662730d53967288a02abd83ee9cde9a3f7b1dc54e56c1744075430f14953e1aefa36dc7b97b7e25d49844e0e48a5b887ef080a7a2fb67b7ca04e5b812e855f01d65e01e5fc89e40faa699851de56754d52cca506075559efca75b28b430e34787c5af375537d522a1f17d1ccce09397523b9deebff98934ba80e48a7bac6826ec998e2db96733f5b0e7efea9bdd8eb21c3e4f231cb58898130e442708aec3c06da965a71a9c40c726614722f28a4647ef9996d11796d1150525ce8f43c9e8effb0152b2541b88773ae96fb6f76c9629b47ae8b627c45d907d24af41e87a752a95405c98c3f16be44568458145c2663786561fd0a9d29fb51a6dc8f7fd03a2709f78be83d9d120cdd3292f0de0e39f16008351217004756fa639f735bd6f88edb08cf9b429750535a0aca7be798a226209e16a494c571ce7d510a7cc3c852ecc8ae172c5f1afabb2739ad106b92a81fef05b84c47d4b73bca54684025483ff912a11178bd3399e642bf6e997b8b26f33e9d650be9c0a347350280aafad12b514511602324040801e0dbfd023834b4a8f83cb91e30544e19aa84571fa1379717bf1bc8aafdf386abf375f75c42d3f0cd8162d7c0a5f12046fc822d51ee2df6398c2ce76ea7bb1afa2d14a4a152e28295580847839a9f8b727841c9c59ee2f98ad9a788f137a0d86b50d745863017bbb7139b9fcb49d2133d9cd08cd8a471ef2971cf4bb27208c576c549bce71dc7966a63f4c1ebeeef444bf892b4a69218b1355ee97bf7d286df4ffa3a3148c64c5f394cbac0a576ffb3e86c196ae4935063e3f6d4c3435656c33118ac816a8b04bd6bd106a87a5b1d68c65d3d9c9846865180f423353cb64d4be74b192a1db8518fdadafdf43efe9fb9f6f698f46be879636f22d78853db3e487cdf846edb5e43d0a7e948dd1d0b2b43aa1a4c03f90664d4ac812eacece99848a7c97e635067c7e705cd7b31fa39067de95e658f3159532290d3c766cd6c5228531cc19bd7e9528e8c817f6a13f67dd73e95a3939d05678e7a1d8d642e6767721256bafb7db8a8b43d240a0796e75dc5885c7a573303d69dac7bb28b8df63fff55be4c737f00c0b26d937eba27c191c815ce1a2a6e0da316a73a9ac3872c45ae7562aba9f3de7d01330e9d9b2249cedbfeb57f3a1f953c7d60da2ac13068a6e1e4f57b0be4e27df59bab7a665bf0cfeb86d20804246b1b3b327e3d0b752a0e10daa0e825814c01254d9feab10e312f2e2cc6e7b82f6722aca2876bba53aa301738a7e8afb6e1e7a461adf0c464f833b64bf032b50272f18686a9858b4e43c54ca9b78079b5cdb64b8dd05d589118965ae454c73cc66cfc98d3165ea5347dfcb2cf9e8a0ad7578c2387088c92276ebbbfc8dbde174888d716d559e75a895f481bf6948c3909f135eda0ca29f2b0d66dd89a68e175ef71a09af8c13d78c4776a272dd47eb5901555cf2cc96fd5aef9758104fb1e3f858787840b609d5e5aecffea2f16208e455dd8aa10cee3edd8fe35690936efff0beaeec605da98fe7ac6ee654a13c7b739ed1cf5eab68e2c1beb78ff2fd0afb9c072985404d05de1b8e5b5cb0f2317a373c727e9028de3268a3adce8b36f48404e32937faabeda42cc178e11f92ff2bc9996e4c3a4cad1ed0ec361246bc3610b64d4dc41c9d11490ec8bc06eb771e5b93b8ecf42f3d75ea2d4475b7df28afda2f6fb0afa0fbe1080ff1e15c09870bf0fd3a2a8c6b19275f5caf52722053d1afb66d9099dabb355b50c8269ad08e4a27cc0b5c3201a25e5508377503c48c122ea3370dbdcdf2a890aaaf1a29e38e3bb417607055f561013e648f35e0af8eb92b98101d51c1972279ac19b681af87a6bfbc6daaf7f3351f85ca295691528ba988c4a54f5b2e009ab6fc355797f6fcfb365ff3c9c971f36a3d9d873247b2db9debb579886855e495813b24b5d7e799092d79d2c53186b136e75d0840f1ab39b6fdb83d551d70e9907f5c677ef933ca34655e9fd9f97eb5f99d79fef21779ca3a714eab0f274dea03e57bf46b3047294f9157b2da97b55ad2ae077346c3244456b36b27d324e698ca831b690ccfdf1db3ee8d0eae7cbfa5c75b0a0c2aee933f5001840f404788f2b1744f9f9940fc5a1714054b4ede823e8dd092a2bd7d4725b40b82d1f8c724b126a7e5e05f4dbd9ee75a97a34d88df8731d7651752e5a880783f90770b395b7a54b93031998e3ea8dd5998b05187cd9c52b1b26f0f173ff7ca36b36f801230c759d8ec6c7b45f8fe6378c6c894f847fff4aab6c6323064ec595fbf18a66a0c71f72b12837f59fcdc07cf8124df731d5bcca59db59b8fa01146200bcf9d75c628bc0bd54d07033397e1a00f5ebd8a499dc4d2b6e143bc69246d05282c514344412d3f34a706e579fb4d2de83c124ce2c2ce97acb3e5dd3debb533f6a0d0a3646a9270be5dcfab0692fea1d8ed546e229ce78833d45cb6b9c2cd76b551b6543fd304c4a63aae69b129043ade2cf70dee877c62176f62e4ec6ea91ff43246f1e152b08ed2675d40ee2cecb3fde5ecd6e530cb3686f2187907abd0d744d8877c0199fd65d55e5ddb579872332e3128e55285019e831544a81c7bf123a96e828f678c5cc3f286c690a4aa3333a730371a878f7ea50507f295dcb0a8790ed8ffcf269059d9707be8fd30f3dc30dfc94ab35c1894608005158e1248134df967015cc4db8b8d1f359de8b8b968e033144d73376a9d1eacbdec5a15dd225429b2f10a9ced13bf3ed1ed46f1c73ceda818cfaba1e18b85c08d921a6dc83c0188a1d53b297bfd041e1973c757f2bbdad642988c725bb01506c89bcb5dfcf0a01d8294089b421cec8186bda40b95000362b92ea344d3e14b447e0992aa3c2a8ba92142df23ede695882f86a546f2b151262cf5e257116321d5f7544148e97285198be12d9d09d3e6de0452c035160a3ff0c35cbf205ae9e279fe4006b8bb02682961b5a6136509bec804308e615cfab830a248632b6312cd9dc352b40355a444f6426385bab7c6226362c1a4044087741df5739a93af08daf60939e9bf90e1ec221f7df74efe598d4cf2f8fc3a22610326ff49fac072d9e6eb7563bdccd8e33a7be9d229a06a07518857a449ee1186f25e83956de48051ddfcf6a47f44a623343c11dd84604c0164055831b68e08fe5d6b5f7f8abf011c901f8496d7c77d526f37dd06e014566469f83f92607cde55723263eb35ac10217af65385ca9fe6ea7a9d399b890a0d4a377fd4c0408b06306b0840e5496a7c9b98f98cab702d2214c4e9f0e74f092eebb9385ebe88621464320c359714f6c1a8dba0552d9c3fc8c02bf4da1690b850eea36549f6269f49b7c63fea38ef220ea6cc4de079b9072156b2d13a1c3c11fc446604668d3a37a8600f16d658922f5d6f6c12d60ac6777ac2146e783d721b7d3317ccb5d918d8fec6bebc38ad11490a8680b1924fc71f366c32686a0ad6d6c6745d2de5a68cf06fb1252075a7c1b193fdefbd28c9c93b98ad2602be246079f8f5790476c7bca8a63e6a8293ddc1dd2af7df85d4897c5daecc7fe811e2e316b9a382ffd5cc612f92d61b0641ca1f045197ed8bbdad5eed888cc682a0e0f7495337915d1502011011653f6879c80f942f05180e15bb13f119d2e7cbfdcc8b439956fd4863f46073149e5634aba92e4a9cd45858e373cb46d99af43767a9503bb22fe29b537bc4faa7623e80d6d0e3f24c015bd572f8bd0a7dcd3c8526cd0337c777b24643b43709aafaf45db2ca5e8b060bd7ba6bf373b31e1b036cdd39f11d4bbfca18eeda0e7bb11847f744f53b0af6d4bae3ba1ac4a55aa0a71aeb202263704285f4db9b969036589cd356bb4f9cb147a0174b872854b5eaa64f8e97b810c329788adb653e314177b9b4732d6122c234c686fa229ea59b45a9050f36415d7e3cdb7e8e5aa21b0ef1e8eb297c66491e7f0102f3d3405be831395a190d05d4af38991d4ef063830fc163f08e86bd6663a4db1e2e7a2bb3f2d7010e94d32238460dc98066a48374c7f8f0c2a823c39ba0bc5457683ee0f77cf6af3e567ff13f8c1dfbd92634b2b3bd2e76c85fe5166d3870bb571c60432196e23b8dff25577d2b2d11066ed1084aef09234ca8f30c2369004a63ccff3689807658df271af94682bb669c84342fa6eb89511179ea4e77fe5afe104d7980f32126c57fe261ac86db303a767f7d624d6b29a8ad87b8e4d6d402299b9fa1265e5d3844c261cf852eda78cf188f7415783eebe2d41ecdaa09aec653f8c5f0451e90f72d8aac3912e9ebc64da2b91595cbbde98bfefa2c9a0b509ae8f1b63aee11d21ee49188272c496e9da962b1ae6db5e9ecb42280ffccec760625c86167c9dca6d2dd13a87debe64e9fef9c2d7785ceb6149bdbcdd171cee9dc59f9ab4220464a1949c92a94a8ee327aa786f440aa41a8e39dda451f31047b04f4878bf076c34cbfcc98213dedcf8fec6e6f29d24a9af36cc46ccd4cacc51365321fedaa8ebf75c9bebd52617a14557b75f27e4b37481c982d2afd3b2afe89a0e2c48a572e46de5de5ff5696abf39441f5b3c0693b033652d00bbfeb939056705cbe2434ab6c0599cebd94916bf3bab6595f626074bab34bfc3e879904b06976cfa38fe","title":"96. 不同的二叉搜索树","link":"https://leetcode-cn.com/problems/unique-binary-search-trees/","question_id":96,"issue_number":71},"69":{"day":69,"pres":["链表","归并排序"],"tags":["分治"],"whys":null,"difficulty":"- 中等","description":"```\n\n合并  k  个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。\n\n示例:\n\n输入:\n[\n  1->4->5,\n  1->3->4,\n  2->6\n]\n输出: 1->1->2->3->4->4->5->6\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a3341b49540ac59ceb2e023044c6a2c91e1784c888f097f578c3c92372d8d7aa2cb0010e4c1585ef17ef24a6521cd79dca9e146144934e0a61c520142a4f9cf2bf86e7227de45b060cd413b5c257e87aa0ec1e5685baaf5cb83a6425e144214bc076a7bcc3327f92a6ce119a45a259eb5447f66e3a3f5d8622489169937f4c4f9c22d12780e3185cbae976b213552580b743420a3f77820794bf29477cad5876e8be61758263137f42c3069b94d1d2fd2489401759302ebd12431eece9afd6def5aa0c9e4046f8aab7a4ce2d3f20758257fda1f2af87768e4c07c642b125ac58aa32c0c6ca0afd1ae5afbb3c989213998154f2275d40f80e71849f13c267598b08360a73810a85d1b40a807887d965138fd4a2e856a8500063e4909964254e8961956ebed0d898d1db0f412d352ff6e74e0e3266d0d70dadb659bb7e401e6dda08ed3c59b8e1e946689b352525dcf82c2f57586a878f3585b54005872b09734b4af27d21a35535b78d13d95c2de3f38e23522e7dfd8e74b50fa43f65fe66d804457f4db3dff06030b4243e690f6d4353291d6fa15a0a10246a1cf0f6b02cd4582c87d7ff86dd2cfdac5ba5478a380bbcf3976259413a6c62cf7d3faaee9a5c24af16109510a5826db6313a1eec136df78977237f08e19c0c9f7207f0849222077207fc8e268cfd3a423f99a9c649b9873460d56ca30c6b268dd557588f75260a99f7f73f3cabc0a148aa98952715a27cccdb8c8ac3508fb046b97f1f4ac93d3eb3a1a248302ac628db9b982a869252a4c1959159391c737080e1169e52e5f7cf761d74c319821cae68aa73cc2421c9fe62902a2c0a38edde89200adcd6751ec99b6f1aebfd78b6f3386b4c1b9f584c1c7c2600973aa9df6497da38e2ae7a3ab50f92dca65ab45ad4284e91b9ac6cb69eb9775ca7a0937d9d2f68b60755860c91e7f847594c9f7d70cd3ed151cf90e08f112d98ea470c06322d4f12ab470794baf85b8ca0491e64357dabf021df75e44e110809f93ea1f1dde8cb5f79d15c63f0d05a123fd9cd6f6103392322dec55e69cf26c42d16baf40fe59749501f3eb4e5f0821df46bbad2f021873ab8044e8bd6beee18dd32e9a1bcac17cc35bfa52428ef926460b2c838bd2d30a67463d6c212e3b0b3fe1d8f5343f3f814568897e9c400c4c5ec8973cb73335a22abd34f6aae5ed84bdf7b307f84bf7d3c29a4ddbdaa1fb1365f1bb2b985e9330cf0322cd47a6a029fe3712abb870e0af9c5b184580a1b18a427342e5d89dc8dd80ea988ae606aef05c5cdc7e83283aba853d99a4c04af01a3eafc882fbb473d10c72d949b47a212bc44d47dd2f47ccf3cbb2fee3f1eef16747e79bb8a1b414aa1b963ff7f6e6bade72c3fdc4c8cc625ff08c39cfad65f2b8cc6e2d44eb87406cdff3111198e7cf924f24eef062c860b20ea33dd632785203ff1769b0db088b2ae7ec4f5035e00b66ad1420a4b9101ff2ea765b6d45a3a2f391c3e4937592076f1e69d5df2fc57c16428d43825c84865ffcff2a8a32725251ee41416463806ef3808f3c91eed98449acd47d745066f4c404e34b32fd1e0176ca52639e37645f23b5f8c447ed6c6723dc987553321dc452454983af881e985bb57539617f949ef80827dc3c20021a49463abdb20ea8c7dc01786824ffac7dabef6f120511728ab2fb01a3c32f21fa996ade1445176ffcdf32851607b304f3e575951e79030bdc678b52c4c0f16452e62751d9d1c9a3ddb2da6bb913ce32d788a7a80b5a1dd6565b31a51ebe83d46d4f91845e628be81da5b4d22d708c2548254245b2d0f6da1b2f067d063877213bfc6f2f6e4880205f3012f8e9c6650d447136a4afa1491b11e3fc8b02663ccf1da4d6f8e3fefdd390fa69d8acd52e880cfe14cf7ef22638aa96ebc5acef1157892084f7c661ea7c198e6e6987f647955aac8b548cf41aba6a563894dc46b9b60828330f0dc22fc177884c9c5055cda3375d614519d9826a1b9b3dc634e243d1ac8b1f1ee16317b958c7febb25b2c9cd22b8aacc6f993421924f6b62a1861cf186f2a935e32b46dbda20864c9817a1cbb937b7c60a295c3715405d543415702a6c7b2c0b3c47b8d312089806a0f6948630d3eca7433a6aeeab900758959cbf9ecc31153d8e19c5288b5aabfb0fe6d668cd3c4a8ffb7642e95fcc88dd66d0baf8a62eb94b49b922821689b663254f9996b6cbe5e981a7dbe070eddb9eb1f9248a43e173cc7275367a57132cca91b25847b7f1fc048f99cc06579e00db279b010f10e16b977f118c435ecc3e6d9a291af3dcac0a521e6d761de5b505fbd67512c6a24057a05284261327227017bb0598f277b2b7b7d664f614b3427c05bf71fc74fc71e92241cc7c663db1f0eb2dba6be2bce0a47d8105a9d51d211bb942fd75533e17d2292ca29b696a9897e79952966783c97212762c36e257cfd03764d10b72838d0389ea56165b5088a5e528d66d7afdf4c92a4a4fccd46a7672836ffd67b985bee4265ce510c05947e8a7443e860eaf8ce72d0a4990483ff907510255fc03b8e2d01c4123e452131c7e0e7a78f08e0074f0ca2ed38dce0898428016e8897aa0eb6ee60801ada5d9d3f04799faa5ef25608fdae258a3b3f276d5ba7708eb42ad097f94bd452f22a97b55a225e03b26767b10452828ae7432526da6be1bb6909bb5b8977be8d8a6a48eaf143afeee86c8a533f306180ce6042bd7651717aca5f206c5fa5b4054b4ede72abad50c3b6ccf956c1a12ff240593280a106375053efdc1f3ee75a939618adfbd3d49781f62335d88119eb5452effdcb6ebd874dd8e4d097e3f385f119eccdf590a83d8a42704bb0f9527acfa75c5f82e3b9d83c68ebd36dab465c922dd4f992df94bac6c686d0005d8fae3e5d14c850c871fff0e7098adae9f54bd6b719f46d7ce8347b925abaa622f07778d4511cee34d7c14de41d8e8a3b0cea921611c5c4767c2e2e3577af5e628c31bdaca7046596ab5ed112f50162c625b0c434bdf3aea46f336bd0acf16720d9cfec68cdde6c429dde9627d3e28c2e91fd1181c806bfd61f36affd26bd4b64ac6737fdec0d03484c2ce94617c59df02fd00c8a6288c7f9a2eb3ea23ad8527dbb6ff84a8d4dbb8e6df7d8fb21f93c68d8eaf04d522f1f5c91f838c813508cd25275e07cd770cce0d11c0e9d2f733a346a7b3438f10daeefcb864f8bc689ddda3533ac0bc7c9515b5aa07431f3d4258ed6576430935b648ddc010107c0c56cd07868ac982f5eb6e5680e404e3c1ad4672d03dd694f970958a5d15494148e869c55cde9e774f8a01cac6cad904f4c0c4daa44d6e09c72475a5ccabccd2c6a95194240a9b3517b3809d6fe0a11ed470431dce96c8dfaeb43418fb1a4ec26facc6cadc13c63714b78a82d651e1db701e3322bdf64e2982c725bb01506a84a1b383d74b1e9d7806d1a32486ab4c249e4efe15546a2dd2933a037b4ce047fd992db08eaaa1a40927e379de69528dd2655e6501151862af5c2177022d5304082747daf96715ddc56fd695827723b4062c035b60c3ad49619ee604fcc502d6fe1a0596b52d98f91341621c48dab5801f44ae788ac0ef4377d261b62c2c9f89292d477c1e174f3f2f3d4ef1613e6b19545f05180f3e8469c9ed0f98322d5fea436295ff0f07e620a89528bde3cd98812ac7a7ac7c587b27a191ef1b25dd78b61663989dcc66f1d4f95f9a52e627559a1917cab2162360a67e50d31c4d528ccf280ba732672756b979bb78218c39143bc6010b8ccfaddabff4fcd2bd11cd1cec1d5633269d6fba23976e082a3213cdcdaf2f0dcafe56447f0dfc6ec15417ba2c6455a4b610f4a79fdcbf99a09ce73ae8184a4eb92d549adf245496f58ceddaca84fe09977b5d42b8106fd99fc6a1bd84a7f39021406a7ebe0338506c1d9cad050dd9d1cda602bf108b430b8504eb2c078a2c77bdc27c6ee5c5c7a174b962889b499a8b68157d7a5de4d8a21fd9053f133bcea32a974ef76d15ff70d6d6b7c93132a7723bad254ee78aca2ba78c613d85419cc08fa87deb9b88c13790f3420b1924fc3db058de0ed4f3ad776c6758d5e0576e9a51fb0f0f6c3e2f00707090a886d1fad1ecd59e5215e346079fc9188b093037c18b2edbfa7178c25cdfed29b2135c978eebec8efe9d1e627838982272f84dcd11a32429e36450e4f40b537ed3a3d68ed4d193e668661c743ee8336443d44a3a111729619be1b69df90ec15180e109f46b44cf602eb7cdcfa132e17ccbe2381c484841a82618a0fdd2deae56919d155aaf6e502ba3f59570834ac872d247a20ab3b27500d92a30d3a2f249e203b8db7f4252315841d4c003cdfd20475bdfb3c6ae5038589e55db64c2ddaf45922559ffb7e11e36d87f504df1127f242a53273f527858a4fbada7964766f89224d70237cea34f9f953817fce1a6eecaddb50156f085a33142352b9eb7a51517413edb2bfaf3df63e8033bb205f9fd30006b2cd52c88adb23bf5f718e5a7dfe6f8ae46ef60c829ea159541c81581aa9efebcf3ab6d315bf40e6e4403e93e401cc3acaf91469c0ddc6a64581fd79223067e0132969cf7758cb2fa3aae1f8eaeb7564c116d2cf3e47847c3091a268006bfc85139958cb8f379cb986ccdad55eba02b3efe9c166fdf3fd1e565fe38bac7d3e9f93112266897a63ec6f85c2f818e0ba874c3041c45757ec6a5a14f78ddf598442ebb52c8acec96788b963d826ad437be29d7e67e974b2081e032ac956370bc259a1c4da735eb931111c4a6fb30c9acea0cae9716271c3919b77706cb60bd0fa772ed8f3498f7cac29b61c64d6a5729caf8fa083ffbec9d1b26da43c6282336380a06cfd04c6e5ff6cd7742751461b68850dcf8b57cfbd68b83ca9274b0b672d86e2c8cab1f10482f271940735592614e434af6b10272b2120cb037f1ca81fed56457e99a04d2d8583f52ad8d963131538b1d7dc9ca6d27c56f163b1c2d684539482ad5db3da0c765139e455fc0cebccbdbe622c1d127577179c7605646fa6ce4e881bd02de128e180bc636baae33b29eef5b87fadb07755b6393261178202a6e2a5cb16559f8269347295046adf9d3de317e6e356b87336f03cd865c81857d95aa1b02be21270f09661263467f44dd83bc58e70c972816916f9a9601cf9393c6f1b40615dfe6acc611547fd4ebe7b03f638c8d3b3ba8162f1bdfc75bfb6faf162c86ce8c02e80a07648253eccb6bea569a982b2da6cc89f4a1f2b217714aa645d08ff68c0d6828a1a14d6bba66eae394a08c8f96e792cb6c506f501c8030e5830b926a49c5a9025b44e317ddc5a8eeb602c39cda613d44c84cf82979b50a52e7bbb26dc1bca101d46163dfebab0a8c825410dfc71caa946c0158b3a8d43f0a253a2456dda3741a9f1e45a6056af7fdab29ac6a8155ad420fa9fdd21030bc914db1a6b222a43f5c1060f470eec981a012e70f4e29f32f0056f6647c2009a3a969dc784619f1adf281d3a0ef635f7d6b11e80191be2e29610ab06e016a2799a10bda78c49f0c1d148cb445a2e7a616b135c40e633c433808c0806491e6c8ab9316091808beb51c79ac6655c2d712a3f8f12e3bc8133bc8eff180927bd9cb6dba8f67279fd5418457be7c9f51d3c0dc6b124b360f30168471eebb292fef130122a1554a7e6e9270f9d3dac2f2bd34dabb51801ba592543266f581a2ce2d1858345cc054fa8ac844581d09374216b6c51039dfca26a881a3582071dd520a7fe6bc34dff6d30d084aee6c950ede5bb8a64744dbf7e09f4c6887c68abc811c52a9d6b0df319b697056a3ef5f849ef3de17fc173c49ff864016602451d0a8d49d28bb498c8227ef3c7c1477c2b5c69f250313205c7f7e1f9bbf71b81173911653956e653ae20d5b7d10a91e4af1feb3892e4d0a420e29502c5d409e8b7df2f8f97c1e50d6e8318141552a2f939aadf0891d804a96bdc2548d6d1d3fc213350e028444991bc7520e83047ad9139288413d2912c2ce2ad1289e4667b57f078a4fe375c4e05fd037473c0f797c3b3e36a573e574a809916e0b7330da6d71d056449f7e8788ed6f6a41b6c1eda1cfe257976ab6d98d0bde36dd69a133732774d9aa96e4d627f322c7b21a905768b6eb739e0b85e0f8536e4161d6023118ae2409f902fbf726be164da67ea29723117af7a586e4aa753eb5c32af173c096962e33b6c7ff77026cbff99ea332f195fa4951c37b4f4d4812f76e7b8fe313a801815a9b02e115bb5008e9047f8ef8acb8fc84a01fbc8a58deb82dd155ea0d59bdc64993587f6ccd11d515e10844399b7413f4711e4e275b424c7da167702ab0d5a6d2c23cfb1e4abf5bb1727b7a70b77f2c0873c35493ee01442661500493d71d7708b866142882e63da47e8c31171c0c8a53465532a49f5c6f262095fbfc9965fca3312fb91e875df1be2e365aa611cb5e8c4a4e1af2ab5718b4b23581cb07b7532470564095db1b5846e28aca2683377a1641ef01c8ce846b1f381dd028d575fd23cba9d0957abcf4a2603ea713b45ce947759ec5a86c2a0b769a9d550eaabc94a06eeef1b9d65fc2bb9c6ebb24b1b251e88787eca5a090457ab84e0521f0a4dd030593faeb69af2a28670ac598198509ca832e21e94de1fe90d400f2440c23c3ccd4f3549e402cb23c3029bbde8d9dcffe7617380e9cd9db6c2b1ea07ae5c42ed7fd910cf4ab61a47da576ba172cee629d219ce56fa10fef8c3c815ff355a3c7f5e2bde841df622985b0e9775ffd03f3ac6abec830e302dceb36574ded39e2631e8d8ef36cc6a16988a06384d6ddd9a9fa76d919c93fb3004280540eebb3727c54ab998bd6b3a418a28bb2f1b10989a92e4b1f3491bc308aafb005becb9ab7fd55320af9cbb6f741fe2af23a6b35463e0b0561791c2317a984971b43e6e51d638f33b0872bf29f1796fab09969ee801114821659a79be75264c24b0e9e5235c3125dae2b33a7152ba0c086f5e1af091f4af9a5dedee8f824a3cfa905aff425943e476a5eb7ca0cd1ef0fe1ad78f7ec472c2b0c67c0d50db2df88a9d8b57e4bd5914c54989c59b7a378d63d6cfce648453e773366928b1a3819575c0ca1837cda84033b308bd654b942ec9041f06cd709a31cd6b150282c886f4f2168602a5faa15093e1877ffc7f99b5995f06d4c00edd69ad4acf37c6356fbb6d19a465f230c3e28c41cdaafda8238612a226389c831d97d43c872912beea626ed9bc93d83de8c96e0b16848e5ed72ea51602f5f42bb394bdc0858a3dad1d202cdc6d92e6ba17043facce4bd2c8ccbec0e2d2c36030c6a1f953e3b2b4215025c246e5f9be0e6fcbf01a71d56ae330e169ed0e994301044fec72fc60d2d52bd2312ec0a5c3d8ae6ed2baf51de5c95dbf57ace6e9dadf86f53f89dc96c23792eac1ee8ea0ed5cd318f0aa6eaa53641dfa9586653342c860b052d23021c336fe6d4c278acc87cc5958bb0e82b4361684a382f1b687b09fcd6a8992d997087f35231c773668e4b49f048c64bfa762316e97fe05cff4e302eb0e4b6848ba3f396a5f1c3078eaa243bbaba8f1011a9b6c856bbca825721984a8339f97d75a7cb19ee51fbd658bf29d0e1d71466d0a119c875f4d3004de7421111254745af173ac163212cd7acdb6af8b01c289a58ac39a3ed507993f1a1b0b33d436ccfe8e11e2ef5615546331421f23d02290169931d1753204bef17c1bf693f26148445fa5b151f3753fd57bd593d6b49e50f59d0bf6a17d8b6b4f8e12b832a568b2cec151fc7dbfc574c30293e8912184b097b9de4a4e868316fa22ad862cbc8a647e0ef69b40c20b8a2a6b515455f6198d603a41d32c6a4365985207f1dc9ca5e5e265dd7fc2e731c4e36f9ec16c8edaf4c59692bf1fd32c6e0e87c802f4129d0d1dcc82901473d48bf44f031f777aa6ebab758ca076cba79bc0a697754e4a3d20ba24beddaca793f8f1b153d25ba1554c7","title":"23. 合并 K 个排序链表","link":"https://leetcode-cn.com/problems/merge-k-sorted-lists/","question_id":23,"issue_number":72},"70":{"day":70,"pres":["分治"],"tags":["分治"],"whys":null,"difficulty":"- 中等","description":"```\n对于某些固定的 N,如果数组 A 是整数 1, 2, ..., N 组成的排列,使得:\n\n对于每个 i < j,都不存在 k 满足 i < k < j 使得 A[k] * 2 = A[i] + A[j]。\n\n那么数组 A 是漂亮数组。\n\n \n\n给定 N,返回任意漂亮数组 A(保证存在一个)。\n\n \n\n示例 1:\n\n输入:4\n输出:[2,1,4,3]\n\n\n示例 2:\n\n输入:5\n输出:[3,1,2,5,4]\n\n \n\n提示:\n\n1 <= N <= 1000\n\n \n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a33409c9d41ad4507437e220640680895e1724c89803d7d648e3dbb342ab259aef3271decf65565cc7dcc696d1ff876cbbae05612460cccab0d430a7dbf155da73ec61261eb19f9674fa4aae32965bfa41dd20bdfd86d69b8fda12f0b0ed7149b04ade387740d978dd8c830a993628ed439633875193366c2e52a9b4ea372284f6de94c6e454398a51f1961081fd38ee7e3dcb46944a4a081bf7e479b9dcbca204015f0d0b0f765d06eb8b47ed8bcdf52936e9c8f4b9f2654aaff15a5e9ba139109f0d322899b0855a0c902387f958b415bd91027dde2b53246aa8fa0fee54c554aaef2fb2e2c3826b20b140deaa2ec67849a8f9940b04552410cd25f7f7b3ffdac6e8027fc37899db512cfcddc3294b3674ac20b2f6b8068185144cb482085bc7125fcb56bbac07a9b9746e022a74a0fbbe441342ecc35ae44c5c9da698ee0cad0e486ca909f15f24a593f067e91e4f7972b95dd30f93121734d10a620962182a122f43f0fbe9ee07cb0287c1bef5ca1511d523081d433140593a708ccaf1ee5924c5e46ae3454e9c94396e6a2bdfb8c26f0fa3e8222d7d2171ab7e5d15acb60299fed33cb4b233b4db65045a092b112a2c3eb2aa081f2dc7ae7c3646c080ada5f8e972ac8da9c39d6e7241555d847e05113319bd5268a94c66302172893ae98a0d7b4e0088ac433e676fec45be6c45908677caf6ef1128d42ffb6edf0f48fe4877f73394eef7615e80e34b7e0e0ca5f9be3e1efba803450741d13b2bd0a1b4c65580ff1d31c44b6b6ae8e7db4b2c8f151f7a59f90d5febb72445177c32c6c821cfd0c4eac5e465a42728fc37d0c95ed01bf1f7e771860233da87003d3b38f915347c4d5c8db2c2ed92837d69ac182949b2567b40d0e33f1c0f358bc6d8891e4f9aa30eb48f5308ac0c87fdfe3860ef61278f770e7847f179a8e001b7b3f78b8b400f694cae8d519efbc2709f785f701932b03dd15913467565cd62eb5b738f84a440f9674259cd5623ff1ed7a8ea12af25915353283f14a5a3e4240af51eda48f22fa02c29f7cd1d15bc5f1a31ce91412a9d021a9a00dacd3b37e820b284b4d10ec32a1c3c0afb4cbfa7450c42a12ec020f040c8113c25cc17cdc51c5478b249e831b5400e9d6d1ba725608a50a66c5a2d29331d2c1133900a6abda35b5113056491f69c6757e8b34830fb317f56caae30a265875f25c914f16e9a9d3d7c6b6f1117e38fb2830846b8b7786e46ad77c3bec46decd632cc9454c5ce3b7d945e9a7fe1d552ca2d5f9b2cbdeb2aee269d212309e9575e3579071e5bf67d1be8315d07b598c9ef1c6f528e67a0fe72bfa5e45a95f9bd2512277fafef184f3facd272cbcc61c3ab8a3b0d152f6dc09f7f6e690df4feafec8d2c67b54ff9b2ac9907af2bff36f1a6ee6a36a60c1c81100a6e4e3944e11f9f155cd60b20e4188aa59661d41f15e318a9b5b875495c62c0e34bb5d6ae56d1eeee43c50a5fc13224a3ffd82b5fef195dc75e674496000e8897ed7354e76d39a75db6e4dd987c947cd240a2d4ea9084001c93e6ee7838a11b7025b388df1f83f134b2a6f500cc35a32dc260854da5c49b7395e48ea5640c544ecaa19303e44f7d3b9ed06d29be01f7c76837f9c7cadc3f6ae6bde5eb2478c2e5c7106190e3cd1ec12e09cf665085db262220bf2f41a5b3e9efd4b0d36bd48044a029bfc7d914d797508d1b76cac467ead6c91d627cc35266d31b81da1189adea62f45867e5dbda9edf6b9887dae74b1cc14f188a2850b710bd46e5cf405b6bca0e66d54b787715d83ce156d796f2674ba276031406c98d6f9c9f68c967e281c7a25223ac56fb237f50e386f3a8281c1305070128c616bfc5b7eb20939e60c803ac7344844b24c63fdd68ef971c5adcb058802e716f47c3e917ad78e869d968b4f41c550beb89a71beca9f46b7f85061a215984dce38c73cfb5938607d167a96364bd9b3db90832bfe55bf3f870b9a9d1851ba84e1d5e5194ab6e513cd740bc6c0007446adbeea6114b97ffffaaf1cb2dcf92e84ac04a16ca6e0639cd1f23e54cf745024e815edb6b43654e92acb4dd4682e26e63d75dca3e0eca6c3565135fbc289aaf5536813270c33d5a501dc27b1cab24558506cf66fc28ddfae9c1c98917a6d7efb8cb94873ef67d4700470ff24528d6f452fc3afb7f77a956824de47f7b4c183c2003a16a27fc70bdfc4517c2a81121f2a1182d821280ee8378acba8669149916da4186117361627710625495f0e68c4bfae23d0dfcca2a27e838819e5b1ab9614bb1ab79f4bcbff04baec3debee363a669cf2d7eca9ef655ae37774bf92421895ff5dd751edcbc2e9efea488e4c1ae269047e69d1338435fdf68cc21f9e23aef11686cc50adedf56b731abd11b915211334b514886f7f9aa1db6512bf6f999ee351c1fa277c9dea335c6177d502ad564e9fc1fdcaa968a83951eecb5e9caf0a6ac70b35ff958eaf196f7ca90398f01a225ce485c41a41401878a46f996781c32c10c1ce30fd4ac3846b4093bc69fd247911b7fea0509b8933a79ad8c8745883e215f0b6ab1a84d5f09b8692a95168c9f4684deb0d771397088576f77a159b3123b265f3c56a237d5405a8120d486efc8f524d679d0435358e4c66d79e23db3b097e9475cb89f226ed9d329128f698aad09e838bb36bcda19adc296daf0155646d35439e2c486073120ccdbd706666142ea851c3b8e2de2eef62c2d1f0542f16be013afd4a5e714c09a43443899ffd5c4ea6de966568799d714b4e6ab0ecb8fdaff3e375c77526d84a42d7dbeaf3e3f1874eb90e3ecf9137513223905fb0c56a631e1f5a2403c193d3d3c5e4d4cf7939c378904bdbfc1782d8b5ff060f03172bb31d67f130c541c105ea34a93b99b7e5e98e5923177868cf4e9a2f1ddd0370bc9bacab68bf4e489141c1c3b263b81f98ab742c0873bca9827b25f0f9dc1cd11f7b143f7f05aa81d2cdd2d9087d725645e1e62aed18d8fe7860516687c81c0054161d445b0a6f4aed1feb76dd3a9f0d218cd4c2000f0f7e1f7c0391407feeb5aaa00671f141e5f606850ba61d9d621bd90e0ca213f3fd196249fc23484a65a5e8a41e56931dd5f87dcfe243cc2169e92e6ae50533704313401d162f05e22677e83fc8b8da8a936eaadbdfca1cde6324a69c5381e0fcd7a15d0982d9b954337b7fbb439a2e37c5118540284034e10d69f24c1bfd57b10043ee2098b5ed159d94ab84b07d20271089b04aa468501a1a1554045acd511770427931829e025f80737642eed44590555b37990477a993ce86d93dbe54b33f19bbc003ff0a57615f9e646b0b60228ae9a06ad6bd25005ab2968923ca4daec83fa3f145017cb4c7c754993bc2c24d1d012dd09013183995855fa94f54371c9b6afa9278649cc041ec9c684cb0b711ce1459475b89d1729fa26082a1dbc02078ed3c52cfad268e812f61da0be43f7e7e25db906d19765bfa6dcada2fa491b5bafd4661b670bd261698d26a546f2b515724cf4e256416341a19312275dcc5690890ed57c7d3c23e1efa554f4d0569a3f21235a7fd19a8e527d1f93371f3f168c5d3134b6d367ed7b5d52d42bd7c87ee8b646bc877bf1b2cd9dc676e1335511d0a7163304dad7c3e71687e5f0517003e41d25728a03ab3cbfc6bdfc588b74a499c73b29a27e7ab98d9cf6686e9a22610323db1cbf90626d253a87d588f84da76e3c5d35f9a1ba0271c98034483e163120fe839049b1c504f91cf3802a763220812e779c636b058f8ca9461c7f75a092a2233063e4706cd4dd61158d89b8d44ea1af41ef9706f66469f83af634499aa053f293fb544805417b22c2849e5ab44aaa99d99fed1f4c6ee3ddf054a5cb02d0fb0df245496a7c9b98f988bb017d2220707b70620bfd687f5e38cfac7e97513116ec30f381c254ec8fe3853f6d8948c4bf14de53903cb47ab6d54cc2520de867c73e5898ef220ea6cc4de07dddf20542d375dfede88649b467a5d7ae78966864eea6d6e826bfcd6b78f2c25f32f25a6710fe0d9fd01b7976174855d9c8d94a932be80cdca7ac0a00602330ebc31e109bd10a49ead586a70499cb13453c13bb85f026c576341606cde889d9de397a587d02933d23c52ddc31e9a13127b84df2ec4bf2f2cc04787a867ac0d41d5dbb1b993b7c74b6250399e3025bc41cd02f7223be37671eff80b1975d8aad69cb8d19ba86837130f659c332b06cc563b0b440939bbe1b69df953eb7b80e15be77a52c9617ce6c1d3b2699579c1dd6a651c1b49e5634ae7b8f8e7b34ac5825850ea060e79eeadc7758360f16fc855a44e9ef22e489b08658683a300ad3b9bb00c161a7e1652d4a34cc8edbb94e1a7d0c1a6440953981d892aaa9bee74832a56e4b2d4052bd7261e4cac0025764e146b665f3411eab0aeacc40b27ea937eb20737d5ef14cc8a7d3de1d3a0d28cb3f01b7cf385a33142356fdbf1f72f3b0620c72ccdf39571ee0475ac0ff9f4272a7925ce0688adb23bf5f74ba0add6baaee74bba298777c04e955bc847c8edd6aaddf2bc285d55ba4b361003f43e2e538de9d7fe56de1cda6a2c5412da843c47234570b587dd5f8cf6bf7cae52cbfca25673287631a7e535479d6f5c2a804aabb15871a5cc94fa00b58973849d4ec1aa7551a9d556228b6c97ef79e405a183d4b69264466f2ec2ea5f94e41d6b81df4ea029c10e1b586939ec87ef467886df984462fd068aaced8d3b96d507ac34ad1dbe6885b470c71e7380ae23e9cb0724f472cf4801f22fe38006179fb8f07ee0b7ec499897582e1c6233b7774f8d2cb41ee972e8df2998f7a0a5801983193f052185e6b35328e7d9de320c9343896e23776a58468999462b19eb857d5f7a147eac990285b1e060bcd68c8bd6da2aa8a068976258d1e46159167b6518171006c632351578a8b14678ae080c9f26c5c3e492d52505bb93049b9e5b375fe4d1df67744fd75377c0897624c434142b4f2c260c770d7ec79067d98e2613dd455ed79d8bcb8fab72dafb2757611aa9604b14f138beb5cfaf698c40953256dd1cfabc36cce1d754d1e89e287c116bcc5e7c7d143d6b0743a31b49bc3485586f2d44a4fec0d2155c273d15d43b234af3935fe6f67e88ab214ee02d74030b7467531d2d4edda59f11a9588a650dd8548f9632ef9b87d4b6d2251cf5cc8696441633d9eda1f93c72a5b77e0dba181606c5d55dbf5db8082bd3c6895da60a2524d15ca8842faf5a9ad43937ebe58de8fbcca8073c52aa4880cacdc517721295985360cd6ff1c994a08c8f96b5d7983e083b69079d64cf9c47996b42e683025b44be3dddc5a8adf75c8a89893978079202b15248a44202a3e0f03993b7fb2b8f4b63dfebab0a8cd51c10d58214a4c0210104f4ae922d6e2c3a254bdded2156d31745fd662cf7beba29ed24c555ee5015d1b8864562f29100f4ebfd2ce37a08182eb42dc48a90ae44a6434e35ae461258a025303a23a3e02788033b19a3e8a181cea0a126087d225fbc39cccd7b46395eb07301066ecabc2bc13cc897520c0ac1df09abcda616b135c4482c6e4330418ed464c9e6d2abd746420146a3be5f79ab281f9a9131aaf8aa043bc8133bc8eff180927bd9cb7ab38f5974bede3c844abe6e9f5bd398dc66125a2d2530168471ada82761f7615522bc5526373dc658f9c59fc2f8e16e8ca21d9331e1c25c7c66fa81b0c72418031e5cc054fa8ac8441b0f092a4207e19825358c9571a89ca34a207bdd0a1155e6bc34dff6d34e1b17d96cd61dd015fdfe13239ebaaf911c3dd3cec4b0814e52b696edf5728a735a56a3ef5fd6dba78b45b2176e0cac9d6a55732a1fc8daddb775fb4ab7822de5f9f8b9b17f170305a3c6bb869ac18c47d4d410568af791585351f6fffc579d9ca3f833eecf1e64354a8eef20680329969bcb89291fb83546318ff9cd186ee31db8436f27ddd6e2b7c71484609bbd05dd17a4aae955d2d983950c81039d08ceb4876b20d247ccda43723c1998c44ebeb56fffe36f91e8248155b866468a12b7d991e0b7aabed2e931c223fd41d305daf0f5dc3dff9617dde148914b756297a3d05441011c4a2dcb57eb7a342ae336b462d02bed98a5b52a38571e57d32db4584f956d8bc37633fe1bbe0c634dfc87b01f9253759b29a08272ba685aa579a2dca605673df49e80200e613726f7ce362ddc3df85fe79e6c33a3dee06d1063f5f49eb635a5fbbf4401937508041c0dea653983ac14a544c208d80fac50ed3940ac452b81e7f8f9be99f350b9990c9fb66ec257ee0c09ed875fdb4f29e5269210e4699bb1cf11d1bd7994e4300d83e8b6a008a5b78d14513b6348e51a8ecd2bc334fdbfe1f5ccba899bb550dc5503fc6a6b295f5097c54e340aea6d142495a964e131d47f5b5f5ec71e1e443aa4ca44216534f9beae966c333f9de726a741dd323af7eb9e27ab589349c2dba47a599985180cf3355dc21fc3e2d8baad2f7fdef2ce242a6bb777f868317565df155e1cdcdae98c09901bb35baf4f045d52c0183107e8f704c934ae19d0b50749778bada59a1a4186d00e2a512ff775566d45a1273642c156981a74c2310148140d6356c8ef16c4dbca714907a8f9796630c136f3c7f5ed2642c9659c297ba8d2388e5c655404f36588ffee5b37384cd159fc8777878ea7706a4671246b99d0f3cf6b4e0182e5841cbf3236b215201aa3151a964dae01e973a0a228ca2ce6600e3dcd42e3960bce75b6486a0904796e388b1798b65a0b2ff0e5db57b9fc28bfc751a45688ab0d1548ae67a66c50d7d0e9758a92719db87692d9919cecae35961bc36d70a8a9cec7b52c76c6d181270b054d00a462b7efb2b0fe48d0a2a2f799ac1b1ef50e28758b280f030838fabdce624e3f1b816cea01b5be849c84e28596b29dcbf72347498bb71f28fb911ace6039c80f56bd5a704366ff0d68d58402c2ec095f3684aa57d6c80de7fd5cab98139cf42699bf00484371756ca9bd608e4a7b4d2e6bac666a25937617b569e7828cac2237dc6f55f23f2df83870ebb4abdbb9402e8a467d643b77b64376d4977a56bb875ba5a176e700ae7e6caad786742a4f93bb0d341f425c11be8e71d384032df17d48db6ffc6663af7ee154ea09b3d48354291c9f6557206874235c9a39000b09b5257671499e1676cfa38265101fa4dffc3609599efde2e53b64a1e39bbf76867a623765400c6e544dced231c8691d932fcc3ab9927eec8c933b99948ccbf5be6d17e1a136f959240a","title":"932. 漂亮数组","link":"https://leetcode-cn.com/problems/beautiful-array/","question_id":968,"issue_number":73},"71":{"day":71,"pres":["位运算","数组","哈希表"],"tags":["位运算"],"whys":null,"difficulty":"- 中等","description":"```java\n给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。\n\n示例 :\n\n输入: [1,2,1,3,2,5]\n输出: [3,5]\n注意:\n\n结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。\n你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?\n```","content":"09613310c9d44c9fc671f2f8b95cc9aca10f934288bc428f6b084c70221171acf9514dc8c94d3999714e903c92212cae6ba2f2271af6ff83eb7cb46e350537a417e4ed8b4b5019138fef03227379db8ae761b071d48825b7bb65cca48dabb899493195462eb99e2b3d32087baf9ccbb330d54b24745ae1cf7cebb78660a609a97854cea8f087dcbb9927bf3ec115e47dc4f9cc2ed6260351cfef1a97422f355f471e7b101ea1c55fcfeee83e081662584cf4c87c9590bf63af12eb795819a1b09e17179e4d0fad63ade94d6af3759a9f28b50a374e46c3bc7f29a0b868282dcca7e7b721dfa36fa3f20b27f9a3de84eb230c51c949a573024566a5694e0243d6e40def99e5ff5dc90c581556e433024b99919b6d8732fd03bd9cbf07e5c26bfb260daef556c2a0c78047aa9883965f4be9910a50c4df00a78316b4f81dcb4bfc6d45e0dd30612d43daf17f9bb9c808d4c3ad8bc5c58fbc11af4a8f89445d66d082c5fb77a39d7aeb6258550455438b97268aad2cfd19176c5d5cde3e93e0dd283ae6190c096dbfaa7027a1787db3742ada6f3295c6ad11e084215df330135f07828841654a319c2ddac9071bb9fbd95dc3a5e7fba871c5024d1629d2510cfd94e54f9fa2ad17c70c58f75b7e2c1c6d764ef421f1ba8c98f6f77ffe9a63162ca752b40b1b9e9be70c86a3f86033002a869cbda717bee6158ac325e75ac2c66af5c6592b6044ad6cd136875adfb3e5e31a3e8ac1edd63a52d57613c9c98feebafa41b0fdd695b696c0617809bdb1b3a1011d4b5dbdb948ab0e8125027d39e00f374d1309e315714e3ebee3fc8eaa772e7f4bf457e24d199020cbfa4c59a8c06f069cc42b0397d684943c7a65f7abe2555cc887bdf58fbcd98c6d318b7231557448064c1eafcc11b2d4a760154cc253e0f0d660292ee861a47ab24599cd17bde8cc54f05119d8107107b7b2fce1325d2c19f557109931ffffa08832b11a8cc757e14d65fc024650a55798ed555bf1218ca8d64a2d3612d1060ffd91777b8fd13bcf9e65966a715b3fc5926d3788c4428444ee85a1ed7c92e25d27e7b338f57ba36cf8dda13307982aac02a0034bf38c200b84e08a359278fae67f7261fa6a5cc7081fe52009e6a0e74cec05ba5ea300ea3826b49cb626591bddd5c4ba73571461704b4505635bfdbc92235c66b4f68602de5810393c2aebe34f914f6cb34bf631a9f0e481c35d5179b94ff0addccfb06cd5e3a6f2024aff982696729430f62427d8754bff10bd500ac7e04793f1852b7849f1e780cb1f7b10a7c9f2b2e5d0b094cbaf04ffb25401ba67e85608dfda38d9c7e72f8e2378d2fbd9938a328e2411a370e81d37892bc7d11b5248b2b3f0c880f58ca3e00132c3ffe797da6cb64818ca309ceeff87684a7a100829d4f03a2e7fafa111aa9eb2140706ad9dca8e5452103c9deac9b44c32dd1ef74265a73cac39cbdcedd800f43068b0f309881a0a7ce89690b66a74e56f070056700b84b242153d78dddfd3d698c6df11bf662a1d34a7c6489840761da38b0fae7e0787978d0fc75a70122fcf382e5ae5630ae5c5e717d1b0d1fc2c9a9e0d4b1839cb844ee72552df417d42a30250ef7f4d23769b85a551aa0b72693226a9c5df9137b8000f95b915d671d911aaae9baecd887efed651a35f5338df9093d2ce16eda6ff67254976a2a805d8df174a03580e9ccb811dcfb4237fb28e039020264d6b85942cc15739f367c5b407916b3d036aa07dfd21caa2817c1ba6103ba2ce8dfafbd64821f82b974acbcbf5b460383fb6324a7bd23fe1d3f53f24a7ec0270ee9723ebfdd76de84fe99ee0df8a011196f770450e154f1734741a921e22964b9427590926146db105012e3832c5ca83214d15a3b6a663b564aa17393b87e2ac90e3e7a445a0c9fd6bcf1bb66af03eae2f75e2af89a2a9886a4aca449db09d79b7eabf4697c351578514936e0bce403efd7dfc9fd0184eba376bebbcf4a38320e254b83d852e859e0a4db9b0ff173f819c244517e44ce85b905d6e2ff3898c3a25fa3dd395ca18d9b1ed7ddbbd7fe170e5b94ec1a0f06409fd380d1678bf77d7cb0e30b320b9df02e1c9bfe61c75d59fcbed90c89a0002869eb1e5b36f0f6a0ab6987410c84c9fb3f2a347627565df530ae8c1c604df5e24f5c4f2784833e870cb71d6490873e22458af75aa954c67dcf505ff5c4dbe6795c0fdc0b01b4b4f972d9d07888c5bea209834f6a07a2e44212c01e60491c7bb549157ba6da502a5e196ddbfc806b8b4a10ec17e166ad544054ac4de7ac2dc2fa9010f10e16b8d756fcb063ae6246da22a0bf38cfc474f43283349a6ea41e6996e56cbb04e57fc39db615622312647e85bcaab27e69db7cd4eae51e1397e16df71801b6aaf13e79a5dc991e02d3a3be84b9177670746e328e8137bd9f1cb298a242d15659f0fc1bd5178eb98001b34780589670b319a90a0ccff11ae5b3edfad029c30e6f516ccf614081241dcebea2e936676fdbdd87e03c6195a88e0eb6df573ae3e412e34ce22ed5fd61658adb40366f249e0e0ae7e5e1a9804ea6da9d5b7d634c219274cfdc8c501c28bc23b697761d8e16bf46968eb1841139a178a43c7731595303f9e65f8e969205d533d8012165d6ddfbc51404e910e3f36a36c65e8bc2ec1090934dbe25be9a502bfcf0be57cdbfcccd7cacaa0ff2cd8fad0e76307bb702c6539695ffa705a2c001e6baebd390e43407193338c998f68a8ef6feed3c24f201d920319fe84cc302b22ed7541ecefc434118893c94be0178d7e131338754f14e0c1e2eebd36c3f2650c37efb1b3fea8ae973fc9185b90ad541b3e68d84dc284411c93af91994395af75979a661b63782ff077804ed9d81482c594fe012100260bbd1a71f131e94cd133e8128e388bbd230cc40a13e3b10fd32fc60962bc0d18f6bdf304f7b44961934ec9c29a55b92497a97e24097f81ab894a27d5f6d227c011563e3b4521a98aedccc6c102714f5746f6e61ff81ad0cb7e5e7e678fea112f501a3076562a514bcb0ee870f23b9702239af3ca2607007c017d1e924e42ce7d6667902afc266043c5ec13c079b13840c257729e74accd54c08834437829c171674891926587c8f47d19977ba47a49aa7553bc5c303b1c32d4cab86f5dec5629d049494b0368e90a90753151951b011bf2fb77cbbffe8807f6c338b8d768640a4bf53e856e7ede79fd47603b0283adac738c9333c5d940548456a817cc1858fda2fbc36db7ff80ddf042ed195b95d6bfc0c232cc00417e082839fece07e459f21d3de272cf5e82946fa86c19b2de8c95bb608a23fd2c51fac37c813a341974da1a57541416c9a09129a4be5c4b5516520b5f9e4ec79d16d6974a4918b4552aed3efe88e30a43284a4235d1844bdd932ee46128470bfd02c3d7226b7c5e8e001cbaf3b7a4386bd1b94f5c817eaedaf87041241521ceca17a3b31727cf0746e2be5ad65ed3d8bfaa076cf1e8a8d02ff1262cf32c617b7f2993ea4db430f1dc4474eb97cf893f1f620793d9e3c3f796cff5a689025185d35c26884e2a54f8cc6c92bca797c93d3aabaf0e1bc03939f45803deaf4151ae4952d5fefdf1a43f2e37dcc87e870b3125c5b82af50da5ea7759a2feb5fdcee08bafe9b2a835f5accf84d7ffc3aba9fbe47190bc203aa2c2ae25174d0271e6d673ed055f8f776c227d0af6172f1aa9d7bfdb321e0497c87002b400b6171e1cc07a014dc05c8a02efda559fd83227a4e3ec6a81c0068397fb190882a661d8adb79e45f3269bb27cd5c9a64fc4e550080b06f6b6a84609f94ccf068e83bdf820d090189d6d5aabfdc558030e496e5d3186f8efd121f04e92f25de3f0a387a412e6a5a3c0a596bb9aeb4d8609292cc00725da9e721596c486fdca5756446ef8695a47860676f4fcd6b9afdfb8bab03a5f443a8a40761c7e64c8fe7e1cf48d94c04bfc4de8275ffe3aa4311d906b76b1e8293ea7ccdcfa69a438bfa307938a6d466a6406dfe9881fd946705d689aea28d24eb2223c8276fcc6aca57e60a77a77e8714ee8c5852bbfde2f2085149c97c6a233a6818ae03e90a8680b1924fc71a123972b9bbcad453834459db13413817bfb0f524614664e673f93ba819ab6deecd9850368f86c079f8f57d95e7032c89a2e9af22139dc5e9be729a05c139e9eedf1c7ee88342e316bcc717cb4088356f76c7fa27e10efe4170475c9b1fcfffed193e6682a0e0f3ddb67023e98512c16444f28a8bfcb9db01dbf00929c409b3f119d2e2efa889da038c72b8cc73f1b1c5249ff6304b2f5eabbe75eefe41d16be675c2beeb0c737c621ed7d811bf94bffa67c44835326c188af14a2399b8126161a7e1652d4a34c89b8efdbe1f599d4ab431311b71dea37e897b40bd76310b1feb55779967f1602e65e7f284e146b665f3411eab0e8e3960b2fabc62aaf4464f6fe73ccb8257bfca9d8808599f01b7cf385fe1b42356fdbf1a56a685a35c62ad7c2d762e81c669405a1f42a774271ff6cc8ed981185ae1fe8a4d7e8cda04eaab254cbea3cd5018845d880ddb2fdf3bd21041af61e62594cba2404538de985ff40964cdc702a6c1cdea92202730a7ab4cfb239cafabf32fb1f98e6f07f6e2e7004eef924698f4551348026bfc85111c6c280c730b5e30084fe0185ef6f23ccc7167fc17ebdb136e856e88386d9d33112266897a63e94ff1b7ad5bd0caf288f504f000c77ec8fa14f78ddf5d40160ff06c2eda2df77ce9b749f7aca4eb703d7e67e974b20c8a674af822d6df46cc90103e262b8db7e4591f4b530a7e3a4498497167f536b19c96a4fc44af14ae926a58f2985a09391d776834b76422f9ecbf1123fa8918d3e438843db35232622204f89d0002b11a285775f681421e5cf4acdd3a267e1d6c4da9bd46bd7f3209f2b58dbe4731f542974580c7348c67c601e64e09b4e3be1465fcb268cc3abd4d52d11e9c84d95900f4054ad8fdf73741ad07939c9892269943a447e1c642e4577077e949902ee8e6f39dd040c859d96cbdbe622c1d1621b6f75994a4b46b46cebe781af28de128e180bc636f8fc08fbcbf43f87a99e4b33552ed6261369012f6f466ea33d0ab208fc4b2f1e21c2c1e79b395d632325fe11630ade985cd0c9718eee3542fc66380f2b75516c467f0385e89644fa1b906915963cc68b2fcf89dedce4e30f1cb989d2c6531d2bddeff2fb723bdeda6565d5594314c3c108fb70af0e6ac4ce8f55f2443e60820e82df05af5a9ad47b7ef2ed81f4be9c834e340dbd62ce8fc7ef743c46acac5c3cd135a1e392bd8c82d4fc83d52d1e24277ff9648b8f0099310dccd1470f44fe17a6d5a4adb773d8f5e26d3d41941ee52179e15252e5a9f12b93b7a76687686384c1ab0a8cd5551f938a14a7856a4e48fabf8b64736e33244bc0a364139f4c00f2373c8abec434ed6ade7fee501583b89e4375bcc308e5dda35fa44141102ea61cee8acd846ea6431c70a7394016a077756e3889f472f6380659db8791f1a3a08c2c1b38713bc202c2f0233c6974f33f40553dca862ad969d5de00421a81df59fe8fea5ff22fee0e633c436e4d83d42bc3fa81e5c7084a5a41edf2132dcc7d5dd8c66aabaeb46d6f87412781a1a59e947b979e65a5d522669fd5418457be7c9f519a8e886b400e620f2d16946a87a82761aa4b5522bc1369653dce57f8c39f84b1b53ac2af50da388f92543266f581a2ce2d1858340e8500faf4d5445514232a4255a4cb5e7c87d742fc81e7117671c0521b64ccbc34dff6d34e1b4aa4249f519515f5f657278df7e69f1e2dd3cf8aa19c1c07ecb5f6df728a735a56a3ef5f849eb79741fc0b2054ff975b7f732a1f95f0809d35f244c9a866ef217c047bc2f7c6822513080a5c7f3c4ddefe3a92573cc3165bdc20313aac0d413812af1603d2d4b3892e4d0a420e29502c5d40d7cd7db9afbe645b0e82a625ab0247002f939aadf0891d804a96bdc254cc6d636090186f6f28ae44991bc7520e8304289c028b894a177b5791c0649470ca6c27f53f2da02c9347c4fd0d943c463c25393c7b7d66f559f47dbd0f9020786a39cc6d77cd040d8a00c981e5352b57aec0eda1cfe257a609b896c96eda339743c6752263316879744e22d662eb491bfb65c5b849851c5c855a236485237c317cd5ff9b11b461dac4174bef09828822d3642aed9db32504551aeb1a7e9e8b6ad3490e130cedd0634b37dad9d11b744164b97605fe2659d2724b67","title":"260. 只出现一次的数字 III","link":"https://leetcode-cn.com/problems/single-number-iii/","question_id":260,"issue_number":74},"72":{"day":72,"pres":["位运算","回溯"],"tags":["回溯","位运算"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。\n\n解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。\n\n \n\n示例 1:\n\n输入:nums = [1,2,3]\n输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]\n示例 2:\n\n输入:nums = [0]\n输出:[[],[0]]\n \n\n提示:\n\n1 <= nums.length <= 10\n-10 <= nums[i] <= 10\nnums 中的所有元素 互不相同\n```","content":"0961361ed7da89d7d9328cf909b1643f65529601cd9d2cf27f683e5476b6ecbd9e38e25a6b8bbe107d7e843ead282c9c6da1e6341df5f0587fc873d662630fc974e48cea47384528e3a6066c0c4d8cf9cf2bf95e7425d454b064c84638532b43aea715fde64153a7ebc9849f48914d66a45e8ae7beb81f4696163a45a16dc349ffb42e24404b4e4c7fab4fb041fd1eb54445098d77252d5dcffe0d79f082fd0e4d7a303069d2c32b4566c1170bdcd80009c989db21b795aa375a974a37a90499901716a6650e927aadd75c876de7b3b5f0019436496d2109c2eeea9720503aa33141729a50ae759ffd100cf59df684e828006dc35e79e5a2476cb8664d2b4bf1d9e16b54790bae5f99e8de870cbec9b8115b69a57be634c152160fd27f028f72d1ec38459f506334c552a9dea97aefe52dc534279fc84bceaa7de4c74a66cc7a958a0f941511507b9faf53fcc9d84d8edaf1d2c99ceea546d275eef170d48715146a9c2f94de08d133065f6b0860e7ea1ec6cc17a0490ff75a66ce3fb0cddc1e26e4252ccd36bfc1190bd02d57cb042a9b3127c199bc71bb804904ff5e58474ff08f191d6a53e52ca382047acde9be04f6c281c6cb3aef6d26074d58e003e1a4e86e9f67ec12af637ba3fa0845063201449d42c1d2c0aa818a558cde516750ba1fdb357303dd8c2bc1cad320712b4608cee1bb70dfd369cfc14bb4565fc949eac45e3e6b638c63d23e817ef45f67b05e8f2cc0d1c33a54deb29a8c929f5256927ec696d8d7e583bfb599835a396723c2cfe7ed9b803682c6d6147f1d18a1552299a0eb7f444a737285bbc0d4904ce5f68f3da24bf48d4bf55f63f7e04714d685277dc0d500606a070f520263e0e43d07c6116ba29ec05236602aa57128797f4c38c6d3685ab40c1348f0adc98008f4afb6547676caba198b3ff1151caf329c88e363511fc8114934bd8be50c8ccce9b84f92f956bb02612855f830c24504eb5e4db245b68ee62f922b7a90b23eab71435baf8dec8350d0a5731680b518497b938b28e96b14350b83ed6450074d42945e2adf905fa220655202ccb32ddc4be357a9fb993c1594fc09bd6b8bb81efb3b70cee13a059f032d77c7c7d48c3e5ab686bd2a7908724cba5875e907e16b5bf15b4790eb26a85805fed9ffa67f4c3a62646a483a6e54c7819b077f6694e08603f55b3c1b3327d5e361b78437a330bd1be9aaf5e68687feb203f842d3f0cda67cdbc492fc0e65fc81089773a130c73023ec55a4ab1cfb3d1aa6ba7ae19ebb5926608391b38b576642c4f09ceecc89c88885d215aadb415de05a821718bb8e009a89f744f1183fa0fc83c7a171f4147de555b27f15c460e181425f1ec993afaeb1a5d1878a4022a49bc7d78f64fc112c5eddf4f19fdf4feafff5ebc46a73ff9213c29452f097d86c2858e49b416bc5fe120aafe4feb2431ccff062ef65b933a43ec33f425b01de3068aefd07b72ee4ce4b5035e2046e8ad5d92eb8201efbc34a506856acb8ff9ccccc9e4c810b483766d3e8ee4d84bcded39b47d8794dd798d841d330090e55ab127000f1256df4a9812eacece89d48b3e27c435567e2f10ae44638c62c0b67d65347813b69492c9cccc659eb63640a5932c19af6c25faea68b4c4919ea7fd90fb6ac97a80b5190761bb4670341646a1156bafe7498adb83b390a3597e569fb89727b5d021adaafbe7993ac4b108efe5e9d4c717c02cb936ebd587eae6192ea3b08eff5ffaddc64be5edde3f16c44e11d5fd7f3f1a6fd87392c87759001acf69e53ddf0b01ce78f3b891abdb2f36f7aaf846b4288c93caa87c4244490254d05424182d1c1c218191c7e072f751833fd6d04e916944d2a014ba2fd5e8a5164024986c939f9d2a26b292361b66eab240d34bcceaeb0d4ea8767a6f4e2b34db271c1543ea40a79f6a98880bc8a7047ca5e88b09d797147339f156b943d9a41cc704d91467132e4450275157e853668dfbee1888039d698e732e15b9fe24273e9d8c7a2941201e8d141a879ae289f1d221d8efcaf537be15f898aa27ae9c88776b324dc27c06063bf1b6460fbdf4d77721a2ece7db6b43656ef24c748e16b3320e71341d7a2e1e19cda92d99df8e08dabe644693200c3c1796f915fe1dff8fd0f600330f73878eca8a73fb50c1cbf82f531292e810cd128a15d672ec777318fe7450fd7df0c72c956cf8011ec536164074d9386d43ab64bf0010bece2fe3886dc4d090c3440266f8004d2ba923ee05bd025b0822879f2848aa5be6ffbe20ec04b0669e4460954cbdd47f6d1128c2b7619e665ddeb801b8dec62fbf156adf2765a67e989ec94f7d10b3ed924d62c561e20c293779002e086aaefaa56a1460e268a2012031af6791ea213441cc8b90e8a678e3a3800c60feedb6d70149310b83e20340dbb189a61589eace97eda21ea9586d55eeec0cbfe2e2c961033579a4694e6a1faccb8b8b90ed42918b4c53b064b8d89160332f72a4b5794b9a460f04e49a3d7ea54296ac38d01761be62bb272b9e9abea2542ed09cf7349e1b45028f22aafacfb2a1755d60475df2d1d105cfc08c7a09c164d6ddb4f400c372f7e72ccd7287ea49269cd82cb3c98119911efcc6da6b175ed122ed0b897c2e859dda396804e2494f0e258acbcf2568df323058706e05d70fdfe0f6a70c6294bb32ab232676c66020b6061ae0c7b1138e3ec5dffc398e1efd337f3fac0b58eae0927fea0d3cda767f5534c01a6502ad7780755f9acf04bc5bc715154a8f1ae22ef9013242edc9a674e46e4423d9d7e4b5c6a755e14bb8ea1ee7de03460d8deb13453764c27385dc95ecae25466b694f7eb02de320599bdb9d6d5dec80e027cd994016263bcb77db129ee1f64bd44706872ced7dae7f321caa172de728903cd7eee1ee33e6366030bfaf6f5fa8f08e64ad48c648bbd3b3e432ee77bd5cd56f5490602cf7e9f49239c88c68c6b3b1187e3507c04895091f5bffc91f222774a4419298ab9ab8bfd27288942f44a65b7fcfda3176ed5b7dadf9ffc938d82ca659624e245ff13bee55f7b0d9aa39580d6fb882987de626d3702c2e95c844a4ec525a96fbd2fa7866bc9b606d468199793843ac586c9c97d7b51c22db460c1fe57f42ddf60e7e46de8dd73c09cffd6ed87d5f9ee8975defb00d5c1d8e1f750ce08f1f5c91f838cab3555e70f275e4e8b2541d6494393f49db22eed20ebba43d467f0b3d6f867edc410a8caa3153bcbe44bda4cf0fc3f72757d0255b474725f021fae2e9c9343104c1648ca16819189d69ab33a569da00db4dad41330de5282c7a36684934957494b48e877952eb1df3341c4449292d1f15bdce5ced08e4d6409a36129b8dbb2dd9bc7b21c817158f72f0da9bc9878b9907d9a3b0659ceda818ce0e84a41a15f12974da6c1d7e8318f08099f97a2cd68d9f9265f7f2bbdad64298ac5279101503ecce8e08d815817ce6906c2ac2c9d9c4c55e342fe045422799b8c7103365ae10ab39049e5c2e6ba8e092de362bb3b58d1b12d1a6f625b12308e4227604b251d1b6d743e8e97285198be128b95ce3e70b30044501434a3e20c4eb69e4afc9e6e9fad4e6bd9f168c5955c196d7f1ed2a9800040b2788aa3cf4f6a8e7ce37c7fd0d57d44133551594f3763741da532376b427e5f4c51003649c35734bc3ab384fc23df8bdcf0155ab672af9a37fd8198d9cf6686e9a22610326ff49fac5468d228b90021dac68933b7cb920fca5eee6355980509cd9a51122cc239049b1c504f91cf3802a760703650e576eb66318e3107429343118f9bacbcf6a7a881b35d8852f90c4a6669ce72e877cd441a2f266cb5e0df1344fae5417a755acd0481141dac7c465aa1a417f4a9a0d6bd8ba09da869f55e600ce56f43f99c3e7e96a7c9b9d9dd89aa0b80354c428f136fe7cadcbbba92f5ba902051422b975c304a600d9cb12c00ed96829204bf03f424588c47ff4854de2c3af4867c73acc7daf26eea71c49052908c2e462a3e18fdca9335d946705d689aa366d00ba93921d077b598e3917e34bc5077e8714eae8ad72be1d22220ca0f80db83af32a4809f8370c4b6760b4b61af6a8b239773d4eead3b257243d49b165acf2ffb46525b143f1b3376dee7d2d9a7c3f0d49e6761e36c0c94c65ed952127b84df2e92fa6c788f159be17df6500dd2dfa2e4cee5ab1e2e316bcc717cb4088356f72a7db12d53a6b65f193fd8b7d6c5e5d1d9e6742a4014749e38334a98584345445228e6fa9c9df953eb7b80e15bb176579d2667fa8e9dee669537988e3b46151b12cf634ae7b8b9b2e705c5ce1d16be675c2beeb0c737922ff46ed25b8e40bee337018c55209bf3f874ab32b8ab26161a7e1652d4a34c89b8efdbe1f5c4acee106801ca1d942ae8deaf218a4910b1feb55779967f1602a3127e28371a3b330c7c6ea8f1aba89e5f26b0ec2afd01378def0ecc9b127bb5b2f2808599f04939a7d0f17f42672a88ea8f6a680870cf55d897fd70ed0f57946fd2f449652c69cf06a2edf27bbfa461f6aacbe8fdba48bc389c22c00b95079d5bc2fed7b1f2a0e66f2218e942364b29f43e6d1cc3bad1bb449e1f8f2464502d80ed774f720066efc8f73b8cebbf32fb1f98f2bc56693a7037bc9d7014c00a0e2a8806b3cf0527cedf9fba379ff31b84b340d6a46f678384167edd3ff3b736a15db8c2c5b8da31490c6897a63e85f91261d5c21ae6618f36320a0c77ec8fa109378ff590086bec52c3eda2df2b90d535d1338753a529dced379e4b7be2a632e0d02d24bd63870900f67ca0c1524599e5b52cbbe3ed408d974d0d1c3919b7774f8d60a544b973f6c721cba2968be07afe10242f67cab4b35b6bf5bd8d660cda1eec282336384b01dade507e42ea8d2356733e73acd52899acb26be1838a88869534aee80ac230729ba4337331717ed48897c07b90f0c9b13f19e8fd5ff655c10ca6073050d50a572d029e146dcbf88d40126aeab1c94c7913c489e4de02f3f3ead9e08383caa5bb4f1fb36f34227cd56a0697e3f8c2dfcc08ccd1e0dea6f934f48ec219aa56454435ae118e341c64ce58b3f8b97a677ba927602bd4f6d89e1fcff0f9cce7e7f38126a98036c046ccf4fac25d345b07f6d6bfcbf77498ebf32f1a904e5a8b6229fdb8749fc889e58236","title":"78. 子集","link":"https://leetcode-cn.com/problems/subsets/","question_id":78,"issue_number":75},"73":{"day":73,"pres":["树","Trie"],"tags":["前缀树"],"whys":null,"difficulty":"- 中等","description":"实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。\n\n示例:\n\nTrie trie = new Trie();\n\ntrie.insert(\"apple\");\ntrie.search(\"apple\"); // 返回 true\ntrie.search(\"app\"); // 返回 false\ntrie.startsWith(\"app\"); // 返回 true1\ntrie.insert(\"app\");\ntrie.search(\"app\"); // 返回 true\n说明:\n\n你可以假设所有的输入都是由小写字母 a-z 构成的。\n保证所有输入均为非空字符串。","content":"09613316c1d44c9fe745f0f1b39b136e2cd2338cc19428f2536e3f605695ec86933b242746cbf339110b985dee1b7838d176418710e7d15564ec7fe05c6233f374e783e141324e2fe5aa20660d44b5fae735f86c5c27e575b24bfd4a3f43285593a73fcee25579abd9df8e8268563259f714bca0d897761ba4607960f615d2269fb8445f650c205b1cfe4df508ed6ac84a166680104f333290c8410eee7c1fb1d9b0b3492ec18c657beec130081a716b4ef2ee903f2c958d349c2c3d4bad4e291b3df836c8029547add442876de7b3b5f039b2346865ce9f5f2b93af620b1fcf95d5b637c067837573ee8238e4cfec92146f37ebf868c188cab55cffa5978b623c8e04486e10ba498ea49fc50ab4d0f40e4d63ea74ed77d112124dd26108807bdaf5661e9e4c646ad054bf97ca08e1b27f49f3b57270c608cc50949f61c220957a02bac3a4825168a1ac65ccc9d8678cf7ef14085e6155d61d2be3be3706729ec7db5a7ca4b478ed51584b2490a46e03ff513db8678ecab6ccbf34f728a5a909be72c1c19fa14c1498c02ce824ea7561865e56c9d4e166d0ed747e80573fc2eaffa81e1e4e5c3a8b393fed9547754293262548606dbb3693e5d3bd3b8fc36f3c0bff6d3561cf0ce2966dbf9fbdabf5f09f04a929154d1c6c64a30016effdae5d8e38dfbf9c1c19d4024b4aacac87e0070ab2bf02bec71e4e0fdc7bbc7555841744ebd3e6a55de92190409f06254f5bc5a509085591617eb00935434864342f1fca21013417244c51ba9e9a5a4e3377f1d6e9bec7c349a11548a8b5ba4af17d5d596596276d0e4b6fd4fdef91ae53a0aaa1748b0c818371b4037283f7165288df1f7fe8814d20255c7a2d69f4347cf0826d1e766dcae5ccd9130a16e0dfa9f5fa4a0712e3b11a0b3919244d638d39c8ae8a4b7c4bd709ec68f523a5a76eb1b9b26d810903bd734867d18a999e291a5d35970218c650e8aae9a770f83b0d45fa194d65eb38455f8f558dc3535cc9cce6a7af1a025158f96173e5f11d66f88c1a8ec352f40b4a0662f8ef0a1c382b08b719a69dce75f47b6837937e759e70a40aba2e4c3df8a911f12fb6863c3bd9823e096b4a105bc04aacc0400c483c3f74bc6427a59699090ea712d155c25ae45be97b4692f0c90c3c5eddb6969b240a1b0c2d570e6d523fbca1f67a7e0ffff5e45efd1f4d345352ed833d9201378f1fbe2beeaae1c886a8fab217cc4af5f8c3a66edcc785fc1070fc8122987d9830fa0f21c87fa89b2ff20b1ca49358e0adb856226a81b78587586642f6e79ceed087f9a084e73aafd35251e46f801e0bbab1329b9ce749d234f86e0a0d13f528e6791cd629ec564798519ad94c2270fefcc992f2d4cce2e8514bfa8cbba2b115ae3152ee51fde29cd377c1f2f0e9c6704dfca004c38268f0bee56f1a6ee6a36aa42d009de430e7c6954e39f7fb66ee65bd1eae07ea33527403f81d6b81c104a638e5f37d5327e50b65b7143387ba0536f8ec5c5a5c5ca3a4cc9ff4ec9f68a906633464f6e823f856177caec552b81047a5fef0088000615156c74754438d32068e98ec779092b68f29f2f7371f4427aafa7d977f509f005a2dda3138bf550d6278f3d9aa33ff0617332549caf1b9f027dd94d01478508c75ae7093e1f6a95c1bb10c44ba335c7106dfebd24335b2e1b6d0a3cd94e6726d8d658b4a5e570722d6a49078acbd4a029bf559bd4f524501e39e6e9b6872a96690cf34087d031309131e923e9ad7ba2f648679669cabc8c1b8a0778415b20b8cafd7b9ef4c5d883a306977d236dadcf624278fe00b51f638f83b7aa07e4050b881edc997223f332a8ac096dbc7dff7ab801097e06ec771dedb83c7720627f3979fe4c5456b62c3f8b26b3923d074b62ad1c1b878463b76017727eb43684ea24df3249218b2779bc93f6305093d4f8ee529e52e7f01d5715633dd5a34c0f817d046ae9959b3ab00b0564d3995d903ebcf5c7b4e0718bc5191249243c35519c8ba3d1e395c19cd8d640f83288475e477ccb8cb7b732ea8f02eb6463954945e7448ea1f20cc27cd142388100a22bf8b49fe87faad7bf0715cdddd219325fd5aae9bb621a6d1137903770448db86c93f1329727bf9b5afc70c41d5fd4e9c637b1e7dcebe92e24bf6d9482409977b98c750297ef48cab48b777ed11f5a3b603f2912583204198a13c208a108bda5cb3282a3755409dcc9a7bb763e3474be5e3ee38919d8dcea8eff989e775f5580b37f954d317a93c8261793619276306e0fbbd414281bced05968188375d943e43f4736f2b13e96a8f4d6f8b007dcc396dfd245e8e9de15a01177f333df4b304d0997813d3b9487dc613ca610e6d632656e846cabb69a9d9f2dc53f650fc7d2b188139d87dea64e96c719b407b2bebf6e76c8443e5e0fa877d862fae9e1a1454c712ae6f5c315b976c78e1d42d61d990edda0d9470afc46b196f7432b4389d9772699a0621cc827de6ae5b5a1203dcf6ea22dc7a7ca1fed62b4d5489d05b5c78a96ff735b9e9ebaa6508fc0acc1543eef54134bd15a5a1e07e0d5fd9566dbd0f6e440eb516d5e287105c29be0648720143372198cb4130f0a37cc195bb6ddc07cc1df3cd7cf5a43cf1091af9a3f3bda50ad4a3cdaa6424d2bfb058a4f5bc6ec4e97704eb5fa8092594ac5b7878d13f5be16fae306024730b5e257fa56b3b5f288c8231b690ccfdf1db3ee8d0eab5c7e8092fb0ef97c1e770bd495404a64164b12f580bbde7fd4784f310145cfde4ae61bada012d1f99c93d1a40aa245b94544b5c6a755e14fdc1f3ee75a97a34d88daa36492303696b4fc940cdbc4f1fd5d3b9eb1ede774bdda6b9859cd7c9414c75c4cf650727f9b93ef960a25b36f80a0b5374cfc7c8cdf534dd87638425804f892dbd5ff9433609540b96bfbbb1ca4cd729add87895b532256904b53e819804bb49484d8b3b914c239bc69ac53b6f01d5c94d7c14920df2dfa3fcdfa73f7106441524cdafacdfb12b62cc4b8d1e24e5a8aed45e3a9dbfa98bcdb5ddcacbdc37db6aa30cf60ff9cf3c720d9ca3c6c991b5f57bcf860c327a6dc2a713c00f4ed825fb20f27bbcac41c9b606d46855dec0967bd6c285887d7a1cd856e01dd8fe7d972dc360b7b628ae942bced0bacaef8093b0a3d67ddbb95888c898e1dd50ce08f1f5c91fdea6813555ae49275600c433418c5f5994b88ba538b871bbe806927382e0bff066ff8f6ed0dafe5d7985e3699275b5fb08587b680e49e40a3a104c35ed62ddc010103f59049f42c88c8298e5e17456dba504a19f9c6c728d17d694ab35c1df0f5b494b52e1619c299b917c05814ad1da98bf1d8c8a80abde1f214fea393dafcaa3cafaddef18db6b559b611ffabaca1ceded579a3b0659ce87aba6faba1e18f11a089773aac6d6c113c61512a09be2c947e1b0690a317fbdb3643993ed25bb015063e6c2e08d810a02cf2c50c6b62d9dc2006fcd1dfe61067720f58f70083e4f9e6de09963e5c2e6ba8e4063b724b7260dccac71546024dd93ea0888fae1d8e59bd0e1ab902a5f82f35f1c8b4d2b6af8d85092bca795f83138b6910f2cc03a2bfeb5ad4e6bd9f168c5d35a0539364ec9a2e31d54b26bd4ab8c05ec07ba71b5b61d47e2a69cb094ddebffc9d6da07abf1d5e6b8f7b5d0ba9a847bfaef3c9a3d3758e0526f512fc9940cd77602ad211e08f3cf6686e9a22610321ba6d6e93a27966dc27d72cccc933aa797961181318a275dd650449ee1181b77a17c6ad458154798cf63288d60227303eb37bb3674c0750f528e480e8e9de0d8f6baa8cff60a8826f9005b5d74c437c1208813414566469f83af634499aa053f6f33a8118f005ee12c7c02c7e544a7a9d399f1def4d4e727a5570f3fff7841e4df395486bce3b98f98cafe44d229472dcc4720b58bbfa8c4ccabfae95f63483a8b40761c46018cbb64368ec6d6449d068406c5cd2df6a4211c97607ea6c33273223d06359a4ea94969c27847ef89cfa1e6750710851feec199f03766e20c8b5cd1a80ee9fc86eedb362fe97abe4fdd89142ed764e5d3aee8291ed4df0970ca2c660b02ab076ed58edcaf50b538b258ef782b29bce0ba9a433491d71afe3cbbda465b7d443f7c96a9d2170b46294620eec6686c44d7c61b9d5b7d35aef56ed2ba3c21db5dd4af03bb5f00c4cdf09895b7c47061752ed65b7cb4088312b22a329c5212a1b15f660ad0f99399b8d889cc682a0e0f7495337910dd4f2f4b071d7da8ae9c80f943c17b80e15bb13f119d7d6bb6ce93b625d048cbdb3f1b1c0649f5494ae7b8b9b2e705c59d585af8691f63a7fc8365836fa4268148ac28d5e3304891536dbcdafb4cb803b8ab26161a3a5314d4dc33c0f6a68f9e8a91d5ab5c2e08d037942ae8deaf21d76312b3fc9f5779967f1602a31245232d402227137d4bafb0b1acc3592fef877ebc0164d9bd5b8f926d29f0b2bac5d7dcfe317cf385a33142356fd9f3a740680870927f858cd763e8033bb057eebb7e2a752ca17ec1e8dc74b1b243a9c1b3e8aeef0aab388e718958c6049a4189f9dbb2faacee763807fe422c3a03f43e2e538de985b907d2668f39642b509bc777267f1c6deec8a475cdf6e833fc16cbb5be47687d7037e2b72446cf005200804af69b056a8f8cceee73cfa600d3b153c1f56f28d7c73c62c13fbdac36aa56efd1c2aa837408263ed8ef7aecb65c3281c24ee67c8d4f4d3b2677ec8fa14f78ddbbd7006bb84f8abefa937d8587339e7bad1dbe29d7e67e974b6687f432a3982d6dba25d04e1ff335c1c1544591f4b530a7e3a44984de50275f7119f9381b8d29bf4aa769e1ca27c6bf9294df61c657252f67cab4b35b6ba8978d660cda43c6282378774e0a879348625de6d7321113573bd1881f99d8b267f0b89782c3dc73d7f3209f2b58dbe473591b7b745f437e43c62f351d78bef44078a90f138f74c98dd0979d197de99a04d2d85b3f16e4dbdf753a1c8e163799db670adb6f0a2a1c6f3345662d7ed5997cf38e2613934b48c093d5848ea876c1da3a572d1aa9604b46b428aea181fc6d9f40cd50039573f6ba7ae69cf247c3a0846133552ed674563d547f23443fe2310af075d60b6f2c4ebcfec6d509126e203f8073664ac99d5dbe9f798fee2f45b2753c0f45744e6746232998e8d011b458c420408c659e807ad5958598a5c95c48a7e686c611547f90aea1aa2072879a3b55ff1b0c1dc0b908f33cea5a6a8acec211f0206b2dd10782842faf14d5907c37bba093e2b9daf3017b0cf262ce8f9ac55e3c46eea347239025a2e3ddee8cd8d9e79382464d6f3c55d3648bcc4fd7625985c502180ce3599291a8e4e90e8d908c2833449305a96d67e1484881a9be6d93f9f22bd46163dfebab0a8cd54e1cc7d74ea7850a0f46e0aeec2520253a2456dda3741a9f1e0be90869f7a3ba67a260805bad185ccfb980557ec7d205cc8cb222a43f5c1060bd64abdec5fc0aa60d0171b6625117f56b643a3da3b943f6784619f1e9b7c7d3f3bb220d293866a116cab833297518bc7351542b8cbc3d9c26ab974f0c1adaf509abcfa4149b35c40e633c433808b2c530c4b486f8935f0c095cebf00d2da261439ac276faf8a661698c137286efa5c8d77b8d9961b3dc7675f48141d703ff2ecb02d397953f5a4b62477516c338fbed6961fa191064f50d281d3dc61eb6979fcab1b56ed5aa588961f7d7127b3eef81f19a7f3258345cc054fa8ac85e495b507a074fa4891133cbb40ca881a3582071dd50087dccbc34dff6d34e1b4abd239258d008fdad56229df9b2d0033cadc68abc811c17e59fb090208a301256eaa15fd4ccb6985ea40d1649ff864055732a1f95f0809d7cfd0adee027a17328143e8cb588d061461d63143670098cbb74883b73911653956e653ae20d5b385cfa5b5089bbe7dc7c030a244f65036977409e8b7db1ebf7325b0882e862ce4602003293d4e2b4cc13c302dff18606c823663ed82b5e4528ae44991bc7525cc6507dce09c79440793e59c19221f73f9f2273f5212db006d34584a93afe015d756a7d79b4e1dcdf73e678a91091442e7d2e8f4d6ad65d44d954918fea7a7f5cbc95c7a9c6e20cd123e5d9ab0dc97d8526a322217d31f6a0c2a2c26f8d5bc0d459e9030cf9c678c74e96b8ab3f661262f71f315ded6a1fbf02f49563be421fef3bacbd4f5229c39b88f2ae3876abd13aab2a87ddcb2430b8dcf75d1f66b9d189a722bfedb4490a95340609156fbf2d38e09749a044890cc90fbc5ab42358ac0a36c0abe9eaa884bd1fb3991695ad69804dab490eee944f974672078118990bb55c4b3f933c0da73412526e154c5f29ee726b1db094ed83de79ab091ef155cf72387a3ff17f7b4721875d93f0671763610b4d81965c3a4be96c140b959b29a472d875106752f711564b27bcdc2274267dbfb5b3dd20fcbe3161f65ac226e6827c505abb4cb51fc5480c40f9e0461fcad67181d607e30171351040c8c0317249e880e072c87e445e0bf416dec9843f597949876d9422a871cdb2b3c67af5baa23476e241a55af55035b48de72d0e55798d844c15dbefc0f227fd9cb4834ac1a09b5e912eb1d203c19a81ea85ef8f423ff74f0532f9bc9c6f46cf84cc33b02a656317d8d03a9803cea86f36e906adbbd89854a1560a6480c3b7bc1a9e487bfd6e746cfd90ca95c3ad3f44620398da81676c58fd73b7da5082af9943c8de058b29c125ee176fee2ddb218de56fe50ea699428131f348eacdbcb9e8f500c86e0883c5e96c0dd657b8fe35a58e1faf4c99f8725746ed28a52c55c89ce76cd3c42dcddb20f9cdf7d9a9a75cf35f863ff65c5e9c4e0eecfc2b394af9caa798eba46bbf99b2b7f85cc7b94d1f044591b33a8085b00fbeb9dfe3a8077c59f982bcbe46e23cdb36167c083e070e6a3e0e1812a2e8970617e1a5142a8835aab962dbdb568eb3b0997bc7ba4219d54e0de29bfa6728d92647c8177bc3420feb6d7aff1b5c8aca8695b1ee5b5e07a4d48d8abab16ae492a907b8e5368f286d261de4fe0defab27a8c978acae083e4d143da4c867f2ffad89a622b3a31d7cbcde5655c84655fb66de32b79e361b49f8d0b85b218ebbc8b4d9e54a09a85c43cfd371a29747fb48ee9042fe65ce23fa54586bc4b3d453fec28cf5f7889a76dc94a2aa30df81e6801e9df926202abe87df555e33b0c69e1834695dfd984f263b29f14b86e4ec84172f6f7d7592cf37d23908c86c902facf12ea5cf9d239f80c699baf8724ff4ea07ea63360a1e18aa0052cb4305e297968a0dd5d1c93f33c4691ddfcee8b244a9e5dd2d790a2b4819227afd323e26524a4a6e696f5b9af4a385be07b0275cae7b4f1fe691b0ca2816019dae36ef0debfb3492d1106518ba511a24805fd015a8140571a93dcb720277abc83f1532a8e6b0db1dec3f6bb44502ad23cc0d5a60567daafa5c0a2c3c5f1ca7c0a0a5b3dec7e2072e42a50405fe6e19684064d9a54304cef0fb9befb6e6734f6e14a95fcc2e7180d600c78c1d8cb33fd2299776b7a3c00bfc72e57ae69ce94b0832407b383d21495972c1325ec8d1375912ae9b466a5f99017a48bea000b16fd62ef39f4d5ae74abc76629b1fff441306bfad2e239d7fe1282991d37aa0d6cba2a48328969509edbee56f2817c22039efd8d375a535adcb1f6499a43a324fb490ae0b200689e105fa9cae3e403de73c5d280e24d5635f066245d80ac5f5206c6a5cb752e34300072245f249b7533d281ba1041c441fbc45564854720cc34eb4df66b743150c8d9ad60418717b3146ad9ee1e78af273743cadfef931fc35e3640e2c882a2a986f8fb364364741dcfff1ab175ac738aaa1267ab1f966ab86e35d37d5c8d88f5b18e9b0ebaaa12563d20e476af9faadb35a3abc0574328c26ffbca96d6c4b49b8c89ffac26fcb19bb555dab15c7bf109e1573bb63bb446c2d52b4ab8b05a34def9199362abc0f07336fea525dedceb146118ec9f9a8370e2bc0b5e49f2f0d1d170b988e4ede2883a86dbda8f212a8d402d37bfc61b0ca956ff9c2a082ec15ee6ca0056c911caf5349128928800f282b888c97dc20f53c2a7f42c7ecc868ae0cacd7a5685300aae4dc96aeb805e1e3ffd8e3962d2df178f7db7a33f333101394fa05308a4792fe8428b855cda54bd502da1247c5054e720795473bc9f565a0da2b949204aaa3d3e3afe515d00b78ba4d949b57e99693c04bca702443153f73d855b8c073d81fa75553c60518703679c6dda8b8bfa8b29135dd563f0e0cc43253258205774342da969e176b54bb91651357373ca43de655852876ffc5bb799fd2ec62814f75ed2301994baab22d82bb3f9e1de61ff8c9ad861ec79361f97605f39820500fdd1ae4e83732cc82d7e708ce6b63ffa3ca7b49ed5503d21287c26c945f1f197d146933d886f28d8bebeb156a5422d855001d65f90ab11fdf3ff0ae36d80fef698e7187ef89288e82067ebef0ade3233425fbef2b141f88e36023769fa4ccb53b9b9373dafb5f0edac0e3d8fcaab06a71f9218839d26f0d9432491b181536bf9a420687e9f1eb8e2bb6497d50430a214fb8284b6a23786d703663da3734ce4f8fdf328be86592f5e9033a47ccc45f3a6cd17a6bb3a14cf4e491fdd500a0701275d8019222051f0688bd929b8411781d3c81c1f8040a3e4aff90253db93676d6603b32b8ba98c6aedf33ac8d32c6ca726e9435cf8c32c4a12642d1253aa09bb7e271e5838ed306cc3d372e6e024ee63511ceb72b11f14c075723fb09034f076cd24b639707509d9f5485c909fad93ec9893673f31abbb1e36ba204a67d1ab1f261cc09bedfdb3c2e5b1b1bc99407ca7bb2db54278c2df76960a9888c97a821369954818b30475f390b114c874106aa0984b6da20acd776f28d9f910658e91615b20ece9ab2543bb7219a0c948a0e8d0f78f0448b66479d4ad2b68d933e19afae0cb9e3001140d5e7c48fddab88e9aadfd3e6964b358b2c019c08d7cc77afc7860809d43711ab2d2ad765457b9596c2010bfa90172d62d94158e93d4dca2a94050bb12e86ef94cd218d33fcf65b1725ab5fd91b126a947788d05dc4989d62463efc9e8afb49b8b463b03c73cfe406815cea30931ef8b09ec793d9a4ae820413e0e614995ba910613aada0611180c38b8b61ed5788397833c997eeb7741820c43daf0f473850779c473023bf616ec4d7d9fe1a0965b3d6eef260c0bb662c0d140f056b6f5525274a9ae3c43eaf804ba0730142c2c42d785a99d379ffa8e9280a9fa20417e66c7ad07ce38efd60a89230531050c2b15cdd2b8f85cab32358ffe7b8b3dcf543f964f1f072d8474f09844beba8d424f8f604aa57a8a403e1774f7904744005f722da5a66c51e943f04a1368ee1756fc036c9db26922a3fbe4303abbb9ccab2503aee089abbe6038b8185dc97a9cf3a48481df1664ed367a588567b367e7ac447e00788a7a8b8cf0b3af5f20ca2a4368683fd4870bc06caf76c9a231304d5dbcbf0e59a0fd091a355a691afebc68ef0d7a285b091ed353d21b4459929733feabc754895e41f825d7dc7432a22b7974caa0b1f7994bbd4c12301971eaf1eeb301bf8b3c3ad63708b9ceba8620685da2e8d7c8700a110e6876c74c93cc17df355285f77cbbce27a463485ab16da9cc0a2bf0312d7275fc52214453008f1bdfa594cd5134500115e1fd55101e9477d84987cce0caf34870971cd94e1f9afd310d56f6d543fa161276b8e19cc52d72020268fb66af0272ef2441f619f06331c1d048a59adbe47c49ad84b3c3de3f3ba17b7da6055202237387de4d70fde5b532e9bb78439538e70247faca8d92a18987e3f9fb51339890f50cbc21bf2866b7c0c9f0f999a6cd3e409751724a8f442a4cee4c147d22a5e05252a61755109243d7b7cba5c2a753c0e20d56a0171ce3e562e967374e0f14b41ec1ba8da5c771964998c1e7dd82d2c222a10f1b3309674e1377ead82cd62831d254cc53b8801d847d5bbc9a8e364de9099983a1d685df305b417ae6e9c832d5c4ef6dfa52f90dddb5f1e11105375bb032efef6251380c0d728d0f53204f2c27fe712891ee176b8eb2567c81c6b0368307bd44910a1fe1543c206631516649aa95d984d3c14723468aefa3996879a416c7b8833dd436bdb07b242d6aa3d2d4b44eb9ab3f94c2fab8328de0917d7d46e322949fbf014aa32525bfd833c8c6008933d8f8a39dd1edf219cab7ffc4f3295b8f63e29f468e3d0297fbe66aa91424bd0f02c5b7d1e529b0f64eefc77bc086318d73459af3608dc2e7fe72c4a226b47029394f623e858ef29dd7ebf1e0bc1e286b4e8d79c275b46b4a728daeac9a8d09d57e790f01e37933451011757d880cf28d87b50cda2c3e28df6","title":"实现 Trie (前缀树","link":"https://leetcode-cn.com/problems/implement-trie-prefix-tree","question_id":208,"issue_number":76},"74":{"day":74,"pres":["哈希表","Trie","DFS"],"tags":["前缀树"],"whys":null,"difficulty":"- 中等","description":"实现一个 MapSum 类里的两个方法,insert 和 sum。\n\n对于方法 insert,你将得到一对(字符串,整数)的键值对。字符串表示键,整数表示值。如果键已经存在,那么原来的键值对将被替代成新的键值对。\n\n对于方法 sum,你将得到一个表示前缀的字符串,你需要返回所有以该前缀开头的键的值的总和。\n\n示例 1:\n\n输入: insert(\"apple\", 3), 输出: Null\n输入: sum(\"ap\"), 输出: 3\n输入: insert(\"app\", 2), 输出: Null\n输入: sum(\"ap\"), 输出: 5","content":"096221c37c5f85fac03c87f9e42ff6164f863d84cd9d3ffd50693f586f594225578280276ec8fe003803b457ee1471d664e68a0352afd90738fb28a96b0579fd0ab8838e1d261976e0ce4579691b9d8eb33e9b09484d857cf73dfc2660576408b0cf48d581335bdfacdec8fb7114407abd53a2fabf911344a70f344ba46ee044ff913a2a46474c4759ad718c4cc707b76a5a09856724187acdf2157bd5a7f22771740f24f04c61ebe6c42dbdaf185558a34443567a341260ab3fea744019a1b09e171b815603974c4073e6ad837c3d72b41220d9d0e80bea4d56e9b423520b9aded6d1914670e0293a6236bee4c6dd93304f34fbed68c188cab55cffa5978b623c8e04486e10ba498ea49fc50ab4d0f40e4d63ea74ed77d1121641d2201e987399f12a039e560b4d8305fa1801e82b5da3ca193090ec55222f17a2e61de276fe4d6ae1cb04a8f9a74f189e110d8756d3a6c2b8bbb68cd44e912ad299362c4b9ed4df9c2f9451f312b1cfafaf555f8c50e9562477c77fa5dd5b73e53fb2cedd1327e70635cdbc513094c6302770d908389e3202f79bb962b8817906db57586759f7b02c1f5d40e72d958f274ecde9ba07daf48ec8fd3aef6d221d4bbb7e45a387bd10b6feeb2aa06e55893d416f676f2307d56dab93decef2be3ed5ff271b7fda69eb5f36169acd1e8baed46617252a8ea8bc9e0ab2c82e8bcc1ce962f0c45be6c459086c78a363cb1b8647feb0e3ed181883c0effd377efb772bdfcbaae1b9ca46bdd1f6949180c1604f08a189bc952919515b5e27c56daed462352341ce6bb2c81e19eafbc1a0b848307b4b5e5dbab1bffe45f44d1cb021c3d64f728bc372069ee91b0094f8ae95fae8ac3ea1d7545ef1b1bed7a6bff5ab6f389070156e7f4c2e4c1ba5c008b1dbb541187cfc53fcd4d767192ccc68a66db6428ae417b1d3cf55e9522cd813493ab5adfbef12532e1ef657179f31ebcba2b02db224a1c757e1678992181933a13937768ad6412ebc8bd77708ea9e198fe61c0a81f04908ef5b4aaa51c3d28fa24951050b112b229ac42a755fa12a92000b0a91d3186a61f042a4d9b17e469630ac106488851ce324a241543ae70cb02c4fef154b75b78744fee422bef29cda22db5fd10dee6b56c74e4489c11682fecf0b5c74dd287d47006dfc8cf19bde731f1ceff2aa376f8a06c3592f09ef977c0edf3688f2dd27d646fbe28fdcc6eecbd39376804f99b881168bf7e1b507e33519dc03b665dc7a8c801ea44b118e3e9775d08f0cbc9bde1f35f96f2c0c4dda1827dcbdccfa5565bfb6f4ae08e7b36c01b859e1573bddda0feac0de328c0656dde1d999a6188f2f25a155f8120d8828f7f8197c54b0b4d4c699f18dbfc90317ebfccb88da42864e36d6dd18b8868211f38f94d0a3316f83e738becb6db9d6c229456ab4f2433991dd40649fa994a43775deba3fe23fd414eb67ff5222787883020be7c36dcf3a9192701958d4481587477f8ad07f30abb34a0e3155eadee7dc9afec911895eedeee13c09a71eaa1d46bbc56498125ab4fdf80b8a346b5154de4459498c1a2d8dafc6799484bea9371d72b5db1a2df68559f1e0be14d78bb8329a3a9167037f5ff8dcaf34fd191a091946d5d2b6ec18d0a0d8156f438e45ab7180e5fa99601bbb1f4b92055c70141a210fdae81e6c452febf08ce23ae74dc1884c74571b07d6bd957eaaa6a7b53fff4a884c737fc71e4ee409160caf07c5c77e9401742d0cdc489950e4e4f04140e7156dd9c5e8a6c1b93435ba769335aec280ed414b659c72366c8772e38087024ce4dd640af6f670d9b5a85848e54149623c7dce84fbae6e2d5924245210326c926664b501f929376c2a9883ec005e4a1b45b4e5fd717f77fba8e41ba336ce0c4a669b85c99b64093fc26a688a39ce64f1717ed1f0003eaaaae1c780c01363a22ab2c5718c251e7cc1dae738924b8649c1e41987b919ac6c4a329efb49bca40f284e6a04c608c4698869b9005b84f33a5b29132ff6c463088412a929bf41d4ac8b2f1e2effbf7cf24f390fed31380ee45220d127963d5bc155646dbf8b0fb081f0bb3ebf2506c1d739ce03d711ebc2ba21f0905f36560f044092c89d3f5a293c3ea5e8a1c3771690f37cce3a750479ccd3ecaa43ffc20c28449c21cdd172503bb8caa748e725a857bcfbbf509e912dcd6f05ddaf7f2b8c0981dc19e0536d520704938fd23ae502f10050eca8a6619695c4b3fbb7a8cfa76da33e021df954d317a93c826179365061634da5a2fd5d5285e0fa1e8884982d108a1751fd68732c4a8b2bdd2c3b834974cc346dfa6559f39dfc190007666749ade741ed937010d5fd281ca94ab74b0e6d632656e846cae962b2c8e5924eb551e6773a3c8231d11b8476ec62408d596845a6f9ee7e8522dca9e3fd28c62ff2f537694fed12c32e0c2d28c33e31af93212fff9afc911a8367d28b73166b641385129d977239cf446d859c57a1ef0b29474ed4ffea37b91439afbd997e03008296012678b46fb92dc4c383eb3640c11ede4514a5fc1851f259e0e0f354741a98042ea5525f5c15bf58c4ad991b0e24f955560a7f4b4475ca820f77f09c6bd1dcd56bd616cc05fdc530f5e216894655adb8d997a50a99e29da43471c0f8a91df5b0f26c85ec7e02c14fb3096cc99a712f37837b05f868ac3e776c324c112565fb2d3a2c27f4e17ff1909cafb49d77b0d9eaeea4840927fea0d384e933bc4e4c40b74b7f842c1744f9f9a525efa1714054b4edae6cfc92122a6aea80725340b8685cd827515c27340e1ab684aa9d30fd723dd1a7f8731d7651276b09880c9ef91d73f798fcb2108d230a8ff2eaf2d5cdce0d59279c8962106ab59d7db129ee1f64bd4470043b9d83c68ebd36c0b379d86c82528460fb4ef07968775c40d3e6b2aae0668a0387d87895b532772c50b2299bcd15ba1c4856d4549f0f6cced5e4980f2f518ec967761e57d475331e5e1a3de9e1ecae9ad97de7e9bad7632345c24483d22339790ed1d37772405950602989a4840b972825c853ca0773d2ea809ccdc60f293a45b12b0ac5d0fbac6f2ee6204a05807ca9a8078b631ee10f0396fe4258de0667a24d751904b783da2cf438874e2ae164eb70d22241e82e65fcc4f3f795a1d01424060bec3077e12d0e706633cd72ce497acd70d6c8813f5594062391d227b2a114d88950f4a1f7bb4e852c01cd1193772a6422e1206c3a93d6ae5db33f40ec0d8273538597a99131052b98b5d5e5982afe7d09a58ffac3825ce26af4edcfb3b3ffff3023d4521c07f758a714d597abf36162c7ccc62f37638c2df00053f4da4383091f1953fa16767f1f12e1ac961aa5ab6682b1cdd68921e74badcb2ea0e6720178a82b44f75c87af9d555f81d4a2e21edc6980cd3e8c280e2354e7629ed05319601fd13c41e9c3d3e21f2ea0b02002b52ac7f3ad094070491bac52e9374fc2eaad3812859a108671b89ba2df5e4d838ab29270df725cca48057a1a87c6b14fed56ea9c1b50acfcdeef8e9ea767aaa69bf3a4cbffa0f6bf482fa7942838d7241a06bfdc2fc9bc297b6da33a83ac0f2ee4fcd720cce81c3fd937de5c1580fea2aab252530e97a160f9772b469a804ead0ff5b67219c3f1134103100a37a7eda2609db8afd9fb97a6abc4a5da1dcb8465817a4964bf19702473c0df71c9169a49a8efddd907cc242e00bfd69ade30042092cb41ee19aeb6162c12f87d005de55f8b31e1fd7894dd362996f1e06683c73bbe7a42910ab79b63fa8c7350be7abbf0c259b39ca4099dee02501c526c0c6d11229507d76fd39af4a03972ce60d72b5aa9dbc35a2911acd8356caca1aad877826df39b7296a9b04022d8076e693d3645471177b933acea993fb4ca2a6b2420c4ee8cb948226efe2a9d6d5fc850ebe70e42535b6b4a411005dcb3d7d26aca90bae0e1613bdb946d7b4b45a312880fcfcf1de76dc3f91ab4973116edb66b254a688b2ef662119b711681b2a6cccd337b07d66dc8b7e7cc5e38c843c173a8f436a35674702de7a900d6b247c788063b13b03b50dbd040fd0048567da3445d4751bb5432cec8b986d65ba220947310752efca595c31a21343945e078c8d2e7d29b8ff5937f344e6bc69ab880d167a764c06dded916f323783bc4956fc4bb463bc354c8b229955211e4cbbdec9cd4ab1e2e316bb82335f166cc12b26c60ac620ff4d2211975d8aa8680bc9ddaa568474f5f07c07e714a9858436f445228e6fa9c9df901a434d4e146b17154ca2e5aa8c1d88838d16e8c876a651c1b49e53e60cdb8b9b2e755908c515ffd670a64a7f4c77e8872e169d51b8256ade9324ec24b289184b240ec7d92fd675a137e4d78fea34c89b8efdbe1f5edd4a755064e8e58947ead93ff21ca6342feb1e14c53967f1602a3122c6d225b3966577d5fbeb0a1e38b0b3fb0c663fd1d37c6aa57c28a7d35f2e6ba888c82f05277f88ca36a681f6fdbf1a56a680870927f858c9e76ad4729fb48f1fa69622160917ecde3c970b0ae45e3a3d8bacfbb02a674c87cc011d446b5159cb79eb0e9eca2285d55ba4b361003f43e2e538de985bb05d018ca74342513d38e3b0b630a66c7d7b22c82b5f73dfc339ff4b91a27702478e6b00d149b45126fd74a82c94c2fe1c390ff2296f82aaefe0185ef6f7b83951662c13fe9e97bfa56e883c2b69e611c6520deea7a94f31249ca8717e83fc70c1d70727fa586a14278dab49f393592788aedbfdf3b8bd57c8c05871dbe29d7e67e971f6585f63ca39f786aa0259a011bf663f0eb544591f4e81a8de3a44984c7436550705ab73e01d960a21fa42ed6db7bccb99cd8cb61c65f765d6ecaef99716ba8978d660cda43b27a6a7356450bccd0546e5cf2856a5f3a5b3cf89328b3ace02eb5d6d8c6869235aff328d6650cdbad73441b6b6f11453a1ac662671671b3e94077a408189f6e84cab0d49c6f5ce09a5ff8f25b3f16e4dbdf757453ca533980cf2261c07f092e1227660c3b432c90d707a3dc6355945c02c6d5d799bab22a88d8275a3c37c2673646a971eba9d4e364d7388e180bc636bafc76e6cbbd1587a99e4b61107a8326183d44660b6c15e2310af075d60b6f5e0be8ffd1d60a123a666b91767344dd9a46b6db6299a01d5be06432031d2e5f66427f62cce09918b455c4271bdf41d5ef7a82dad7dcbfc90f41dfe686c611547f90aea1e237728b98304fbb1f105ad8d645a335f1706a8acec04ed8206b2dd107d2d16de313d9d47079f2a084e1a69489017d06c8078aca9a8b117803e7e5535bba66eae394a08c8f96fc99cc6c1e3a7155ce649bd765fd6259cc83025b44e3519297a8a5d35c8a9aa6227942db18e53335ea4916eea7fd25dab5b679912f6af5ebab0a8cd51c5993821ce98525080abbbfc6243d2574711a91aa5e1a9f1e45a64c2cf7beba29ed24c555ee0340cefdd90d30f8d71eb9f2bb398e155c1060bd36ee8a90fc01f2161c7bf33f4715a02e30746ce7ec679f371357a5b6d881d3a0ef3e75576b11e842d2e2293a780af573424a2f99a665e16ec8d221435e9ff55281e7a616b135c40e633c0a765cc0c32bc4a89cb0931945c1892b72dbf266b395520cbd667c55e6916ad49951294f2454d3690c925218baaf714ddb41fe13bb03f1147a78af8ac1f0baa03c8471ada82761aa4b2170f5104878798365cb97dc82f8e37edebf53921b8f92543266f581a2ce594a1171328f10bf82c1444025232a4255a4cb5e7c879e0ca881e017753f8952177ff6a71edff6d34e1b4af36cd61dd015beb65a229fa5a5d14c758788cfeb816845acda989036cf084840def475849ef3de17fc173c14d5864055737735c8dac0dd75912097a2e26b91baa9d5072f405a8da5d59eec753667f4f33a5598e958a1c750eac8fc5faf9ea2da35c7ea1e5111418eeec2cc9cedc9855d34ccc238b12e739f9db5202db607c7efa6e92d2a87da841d46fd007475c048e9b0bb2df4b1dfae61d823dd68e0cb2681ee2fea0347b3fbc3d8565afb52d04da9a358f99002e909830b1fbcc7271016e38a91bfe0da33e506fd54f504cdddf9da1aff80101c2bcc19a981ea6422113c476f64606d9360a6223d458c1df011c15cb2bacef72d641e132cb305e8067ffe06ada03d359052a2642a4496efb8977fefec923888837f87695f9e7bb9c262e52752dffe29f09e84a029c6db341fd23ed96d5c21b2ae401a77eba7a915071d4ac62d25658ff144b4d3e181e420e29267e35faf52879404f92f924dbcb855c3eb0c3e1f1538191cd069609d527ee541956eeed6655d8e56c99ce50ead1ad248762fb848c0c41d988e859f80fa82a13a9fb5902a50377449d5158fe111c121d6bfe1f370ff8dcced7891172c8899f5a4a4a60f36f7f4991c027b3096a66ae56ad61b165050d9424b263db1b45d39262695d1fc9965fcd76366fc70c819e0ff353515ef0ab535c5064304ecbb4d00e6db35ec8a57c4066978026acef1315846e28aca72c27e645410f5448d9aca334879699d61d11ba867ccbaf38e50bcf4a260638d6bf108bc156bcbcfa1642d056e908c4515c9f2c7e53ce7d39ad74fc7bc9874da61e8be51cd8080b89dae980970e3296a73b7e1b66f4cc0aecc33b02a057c01d284218917ceed7c65fe08b0ac8bb263a1105f2ac397fef31dd0142cfd707416bc9285cc86fe6705640899ffce797652a131f2d8739985f50c9ade0dc8668f76fc587eee6ad46f8eaa74a11aa6d2738178f354a3c0f9e8e7f70ac26c2788b0e9775fda08e6a57bfee274e31fdce3585746ed28eb6311c4dafa64c9ce24d8ae20cc9f919dfbbf38a214c334bd4b438f526ff6bb267544bd99c597a8d976bf99b2adff45ceab4d421f6fbbbc308aafb005becb9ab7fd55664fb49bf4fd5ae335cd21537b207503193d7d11161287bcd6011eb5e0512d9d609efc7f8fdd528db3979f73d0805e5dc70f50b1b1842f6dd9610e9e5235c3125dae7f76ea457697c0d2b0acff075c02edc39a8cadb65fe88af059a9e8319411132e5eed9e52aaf833fdfa63ddc6477101517cea954df2f5a2a3dd7ffab34368afc5471aca5e4994688d66f6cc62483eb184f05b68cbb0cdf4d9fe5608b25c569fd571a98e11b407f59152bb68d36ce258677986e1901cfc8ac0b5f7889a3093c6a2a273cde59fd41edef969662aee81df5e4765ef87893229690bbc9d120c3328bf04c2a197c73e63227f3e8fc912d36b0a893dc33ee58e6bbee59d6dd0c4deb38df83c00b0ff29eb5264631e51b97e52985401e4818cb24ccdd6d9725bba664fbbc9a8b92bda8fad065343640c5c3850d7727e1243535f2a65675fc9f3e6bcbc4ee84941a5711b5fe691b09a7d544dd4ed6a8a5febf37da8d7596976e8154f3f8a559840e41b3b3ab10c95164523e3c074417dadedf2816af84705af6f02ad23cc02556093d517769da1e1c4ac7bf7cee3ed8ec0caf52c2f7dab4955ea2d187a654adfe9024b8fb1a8d9a7eab173527314e70a80623ee58400cfcd48d8fc3fd46a8d76f4eb8947ea3eb16cb4cfe9154654262b6c6f3a635972c13203e28c783675d4d8172b588f4c5e14b4ad49a601d439f4b2474bfb5ed53e23c97edf1e134ad1ef6a61d678ce7c4cc5c8508a869ee0e89741a6bf09edbee560221d900c23f3ded434bd39bade1174858627604ff5dbef5f361f8bba10ef85fc614065b94418260e2e876375066245ac08d9f2642c2907d41cb74353526f4d814faa55276f06f1181c5556901e1f561017488646bdc44cb743615e99f5924b5c347b6a09eace88b4d9e56e6f3bb695d366b367a7644762dc23659e27c2fa7e300e4dd2e2fbb4265a8e38b6f73961b0bf66bddbea4a2d9acfc4d51b4daef9b7eefa6131f87f6d6af9faadb35a3abc71267b800eb0f0b8282b4b47e68084f9c969957dea050fee538ee71edd1b7dbb02e70d70701db9ea9644f37fbdc88d363fc3434b3a45ea525dedceb14611c787ada87e406f85bfa1d67a1e531a1b84e563c50283a86dbda8f212a8d402873ef877b0df946bb191b3c4e611e35bad196d9a3f82080c04cd6ecd0429269e968a9a2db9645a7f5886a5f0248478fe9ee0061c44efb1ffa784b805e1e3ffd8e3c46879a42ae9db3376ee6e001393e60720ea24dcbac1709864cda54bd5028a400e9319303707d60b7a9aa66584857c98af3ca1b497b898cf41825e3da167949b1ea79fb9a9049f3e70571f3a7c62916452a50c883c99dd49d495b192e6232d2b1a6f3d0c7cbd75b2b0f1a854f888a4149fb8e5c51d0a3ed093bf3045ef86a7e644e775ee06d17a3fb1cbf57ad0d6e9279a3e5fed2301994baab259a4a033b53ced1ec6b4a7955693df77e47c1ff3980a500fdd1ae4e83770c582c9a241c13e7ee3d4c4330da1307b961b879946945f1f6d2f5d2c5d97c2b785cba5e43f091a669d0d000065b80abc1fd83db8e0528c0ff2699e6aadef89288e824f38bef8acb32e692efaea2302218fad396660a7facc932c86834fdbbf5c348485dbd8fcaab06a71f9218839d26f0d942b1a7157177fa1c40a098ae1d9e7db45f311004b690a214fb8284b6a75640b702b63ca2c1ece4fdd9a66deba2bcf8fe41d7314e6a1505437bb3a41","title":"677. 键值映射","link":"https://leetcode-cn.com/problems/map-sum-pairs","question_id":677,"issue_number":77},"75":{"day":75,"pres":["字符串匹配","Trie"],"tags":["前缀树"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个较长字符串 big 和一个包含较短字符串的数组 smalls,设计一个方法,根据 smalls 中的每一个较短字符串,对 big 进行搜索。输出 smalls 中的字符串在 big 里出现的所有位置 positions,其中 positions[i]为 smalls[i]出现的所有位置。\n\n示例:\n\n输入:\nbig = \"mississippi\"\nsmalls = [\"is\",\"ppi\",\"hi\",\"sis\",\"i\",\"ssippi\"]\n输出: [[1,4],[8],[],[3],[1,4,7,10],[5]]\n提示:\n\n0 <= len(big) <= 1000\n0 <= len(smalls[i]) <= 1000\nsmalls 的总字符数不会超过 100000。\n你可以认为 smalls 中没有重复字符串。\n所有出现的字符均为英文小写字母。\n```","content":"0961e8bb5b12c3efa0798f5f328c692d7297f600befb09b4097e4527731eec86933b242b61f6fd223609946bec12491a32dacd4f5adf9e13456cab79febbaa6175fa90e357154703f5a41667c0f7377723f06d95ceee439231bc31cde8a7a9c05a2c810a6eb8d43e3b3e0573afdcdbf273c3483d3207e0c57ff5b1833ee519a37f39a8eefec94f767ca560ada276a0722b7a62ea4a404576b948aebe6b22fc2144762909844c46e8215c66fa8576f2ec8a6d4e9f3d25781cb959835b39ac1b99b757927be2019673afd75169df44742db37394501a5e94e64259e9832b532f981b2938de50a2458bfe3322f4b9ec84f92d0a41e081ff48653d6ccd22414a08ebb453d3db97fb38b913204a6f49a8d0ba12537f67a404f20c83938e03e9d56dfa0c2badfc55c3b2d24f9a561703c92a4ba30ce5d2193f895b0516b4d51df642fc5a65e1cb2e6c0c6cd7f5689bb2cd02c5d8a298fac8b0821989428f9c699a9011006a9b2c83d03ced322d4768046fe3f018cbf707a27a15f7cdb13db764331b6126ac523a693092d41618e22c74e7091996f7d01819271cda852c65d9303378078288427370319c08d7d6121b9ffb16912033012924ba3d972a3b43b76f5da2bfacd569287bc356e29770a9b6a0de33295554b62156084b154bb8349646342cb24cbc2d1358f4e942f2a78c381a407286c9da829c51bb24d49f108536c3bbfc74c97b3366418a65f522689c1f324d4fdea74b4e060ab79926fbdb134727522f17a1391f2e52371f7ef9859d0b357873e997e9f395db02aa024af4f3e98062cbd1e0d794206c125e2eb7abc0f223c35a2155ab16c433814b9f427c9e91307dc2eb560ac6c877611b18093e24b06869f5887d6c7516170705366e1ba67309667f4c38a2ac3509a80c137fa59eeb0adf006311d2a4ea61d172e6199a057dcf18324d8741c4fd399a81fd095e222fa6c1f4a44382a713dc0222255cfa2496cabe5385ed3890113430b314f1d20038f34be6a4a81a1b5556cf66b54848c5e85b597caba4c59752525904ca9556106a6001c446b01b59a027f484c6b990ee10b6f322d155787a98bb51bd0dd521a1f155c27a20d384b08db8c5404aacb3e2f95e4ec60220ed061709079710d345c15fcc5ac1674985caca34375fd7bf9bb30f0b0f122e6921616e31515d1dffda89386c425dd9314f0e7b50d6a13dba2dd832837b44ebdb8fefc5e2dce77cf01486f9a603de132f7b7dcae3121aab5139804bbf1b6b52fda7872dfb0f15a59e59e38c82563a718295ab886c4742fdda9ee5ee89cebb8bd227afd56653c577803a0eb2831899a8cf49d2343d97e880cea872c91f73f36f771825b3ee99f3492272cef2ed82f1f2fce8d16f4bf997b88a8619bd0359e85efde29cdf4fcdfff1f2cb6154fcaa00ce8342f1a8db68226c0811282bdc9b5619f8bdefc01336ac975f841a9d6ac313ab6d6c1e69dd5d35b09746a8559af224093cb56a63e74a3becd50b52a5ee1c375b3ddfbebaeeca98fa6de772446017f9844ae63d6665d1937ed45c60dba1df4be02d083070ab2c7a01f30e6ee5948f099ae0f3be4885f4704b6f64c1e807c54638c6280675df5f6cb6387d632f8cc0c764f96c771d581be198d0e95fb5a1836a441cfc7ad904b8afabb308729a77339f652e64647b3e5b9ad97db8a8b839130b0ab5e469c7896775543a09db82907bb19b4b15bdfc6da14c7377bb4767a375da75aa6d9ed21d08d9eee2e81a1e813299cea02c46af7965bfabcfcdb98d4c698b39cd1cfa8a82a70a7f02d6615932a019bdbefd636e8e8e58618afc3ca9a3c42451a5277d14424284d0f8d118191c7d203d740f1af54b1a04a73d885c021bfadcd4640e4373179aadb9581d2ed41323a42bffa60a113992c3a6a5f4e5966ba0ddd167e226b779f43d88327ad78e858c848b4d5dca4483baaf73b5ce9346b4d6526f9115a26b0bf157f93da771477d1449873f79f0bed791810ecf548528870b8a9f1c58b89ec8d4ea2d45a3d115f063ee70a850753bf3b4b93917cd36d4b5ca02fcbde947da8e6ae142cfb559dfa2d85408ed0f003145b471ddc82d17b234a41fc5175f2eab6064bcf9e89acccf3f0e25b09f99e9be64166a3284994f0401ba753c173844614b65df530ad7d5ca12e25d02cdc5d6454830c47ff97fd56c0a7ec5205697696f718fe63a6806c7554e994c94c7dcc08d094665ae20861a89bf4e2679be536c0d7c345e201016e52985c4a5769253a661aa28a7eea7d6bbcfc3645635b3a401282888416509ca9712e68973b781ecdb19e44180ff1be9b054bea44ffa9c5c183ae6ef9b9dac8e1c5e843366f8ce4975c3c62aab45a480cea59ada20dc4174bb4a580c5c887b9a7bb6ebd145dc578737f03f97cf6380e1cc78713397d643b12c2928b514966d4797a0cd55dd32c398acfd51d4f7244dbbeb0e796d4fc70ebb424fa3c8fccbb16cb23fbd72699706e7797091681193d5bfcc404c2cc639f8900f7b25d7c4ba261df5d9be0dd03fe73e0a4837a39f379a24d9cf0565030fa010a5e06ae6d3d504a8e94196d98af23aed3d2474e0c6e21ac3acc2edffbbe5006188856f12b40e1976bf5ecd789b222afe4a34f33fea93220d1e1c1acc6c2c0932eeec1b5d2dc4007969a00208c7de51eb7589dd5219fbe9a12bb3f51aed5ad3f3e5e1cbf2b1f11ec6fad1e962309b7e0f70386174fa727e2d010667bcb83b0f564172a93380a9874ea0ed43e2deee6d2e04ab0601d384cc2e2934ca7c6bd9eefc061190b4c742ead134e08ef4fab0d18d385b4728c006bc90674577dedbdff1e2e4904d962a3eee913b4b122d9e79b8d77160113458020ac0a6fa1d54ae8ddf34b713fe6dab1fa025c9b6b2ab5801784a25d54b7ebd8c05ed4f41bc04d85eb9ee83f621bc7d1d03ca8b3e8b416dd753118dede6a922e04f0bd644632c0fcfbb19ada8533dce866d2a5285e388cd965dcc67dfa3fcd2a7aabfdecfd7cc08687e5465ceea00fc19fef471495265b3d11d387719215855257b4bdf3a2c9e06b64a6145b4580d9caec60030184487200ad7e2fb87472dc4098ce765e315c67a950343e679729e46a7c972097193416a1d06bfa8d921fe3aa76c2ae172ea64f4214ae82e77d9080968412f7f1f200105fc1a74c41a0d694b32f85ecd7e6c0c856a60349a9343b0efd1e34ccda04587a21b4a733ec650ce7337867aa115725070a10c28a9505553f2bb1948ee3db9717d999d89b58ba440e594b688ad4da6454ad48bba9fbb2f86507e02410774b6d0597cd23a4f1083f526d25b236cb94718b5ff8facbd639835f1166ff7d9568225041e6ff51b7346190fd7a1930ca89241474c3e531640965ac09c03eb975c60149e7d29cd3cfdb9e90a420b49770ada8063de903ae4622a462fd502c1f3e4aabed0506b4f8a96dda87934ccec1856e3298095a16920662c4691d55afe8b4e43c5582feaea04e83189f8fbde1b04acd73e60e60ea599a77d4f232318cfbf62e248c09c197da2dbeaee98a2a6579ea4bdd960030d21285dd697efeb3c78a724536a81b86ff8c5a3f34a893daa87bfe603b99ea6182e8bcd4a37de5c1592e3471c1d98e744c9823bbf6e81a9cda80af62e91eb5e71a1d88af3c2ec898fec7469f77b726b85c4fbcd9083fbe741919e39fc693833b973101a3292d10ebb3d0ee05e365c4369a21f56649e9ff7e2435820d2ac4aba7caceb462177bf544b1add22d43c8b985be7831267dcf7b72d959d52b9fd8b0870fd9c0fa5aceac553847d95e705dd9f11ad6c32055309534d276e0c379a04de6fd3b2f4bc2db40cab58fdefa9dec99fe8c213445f1c9cf9fcc528d86d92f64de8f7bc2571d0620e495f4c5b304a5ce271828fd226ebb035169cf1593b657c33100f4eea15b29707a72a50b5120d46270e537d58c6d5acd106bf96d9a1c90d70e8d90b571217877af61fa194228220f69263a9ff6420b4fc60400c4ae75ee4c4b56aaddfe6a3faa2ce400b0f9c1ce0e399f03a6ac72b8176c1a83ecb3966194be6c060fdda2ec7d7681962ed0f18a7ce11983636034ddc2d4136099e328242061950ae38e409bd3394aee77a737526c5d75f40d27b88401e1340664f7d3f85d1f8d1b6c3ec98cc603eb938429fe1189d4c3829cb907a92e76c36ca429b8f66bc56499e85dac6c7fe811e7e642980383fb441cd028c11499e2d16bab45f50069deb8496b6d9e0b23a63404874d77a3e4f98703d170d1c6f9d879cceb412a737d3e85bea153b9d2e2efa889de677dc65d08e3f4f011b1aa82206abebb7fea24b829a550d94675c2beeb0c737c62eab3b44bb4cc7780bb9a574c7f67b4e0cb56b92348126161a7e1652d4a320c0ebbbc788bbcdc3a9553a1fb1609478ad8daf3cd72d55e6fed91e2ac204587fb8382c6d64146b665f3457a5e2e0aad85f2fe2c637fd113796ef47ccda3835b5a9f2c98e92f9317cf385a33142356fdbf1a56a3a4d23e936f88cca30e30a2abe64f3a66b730465867894b3ba32eedd4ba0eb99e8aeef0ae072c8b45b8c53c1793f81aa9efebca0ee21311ae8437f5e57f4772e4e8df985a005994c9339376611d78b24417d0a66fbc8bf6e8cbfb477a778cbfcf013277d247fa7b77014cf0b0f6fd21efec8482bc3c087c163e2ef00cdf71aafc56f7b83951662c13ffbe364a21fbbd796bad32c1236688ca677c6aa5c70c88540aa39c10a1b592e7ef78fe84473d4aeb26e2eb8528aedbfdf3b8bd57cd141c859fb2983ab2e9756209ae97db4cb070ef42587014db72febc1544591b2fa62afaaea1d84dd163a1c7019ac77058d7cf108a061abc36ccbb08f90933a9819750e6cc3ef995b6ba8978d660cda43c6282336380a4f86dfc4b3bc6708cf9ad49cb7370dca162924b62712405cd6863fbbba785891fc1d51dc9fbfc4bc9ea11006c632355337fab14e3be1465fcb268c8aeddc812907e7d94c9b941f6d53aaa09d3c335d891b789be87661de3344731c636f420a0763c89932a6c26a1af7040c859d96cbdbe622c1d127573c3083604b46b42eb9a2c0e433f4388e180bc636bafc76e6cbbd1587a99e4b67187ed6695669192d2f055dab7d4ea23098702d174ce6e8dcda0873736e75dd3b2e4a99930887841af6ee660bb221744a45201c2e032d0398e89957bc0c897054916fb98a28c6d3fddcbfc90f1cf5cc86c611547f90aea1b07226deca2c0aac22171fdc9d41b741e41b2ecec6891ae9206b2dd10782842faf5a9ad4396a8ca0c0a7f59cfd53341e8c48ce8f9ac55e3c46e1ea08b90fd22f582a641623512e435ed9dda8a7f1f9648bcc4fd76259ccca4c0f3f9e6ca0c5fae8f30ededf86286a079202b1527bd97d2fb083946d93f9f22bd4616399a4f902c59b4859da8201e9956c550afaebda256e2521241fd6a87d41b53445a64c2cf7beba29ed24c555bc1541f8b4af102dbcdf08e6a6fb6cf0440e5533c67f9384c3e71ee34b4748e8463858a025303a23a3a969dc78465fbefffac89df4ef295f606b01e85982fa6070390cf5277a4f13c4b920db7bd5df540c50d1fe0081cda616b135c40e633c433808c0806491b48dffe85f377242deb54268f06d43e1ca45adbfb47a33821a20e2eff180927bd9cb28abf6083db5d5418457be7ccd1487958e251219735b2b3c8471ada87a4b804b5522bc05747e6b874af397c985f8eb3ac5b44ecc63f19a276634bccfe5ce7a570a7050c01db4dec80d5f0652006855a4cb5e7c879e0cc6cee71d202590020a62e6ee7b90a2c864314af36cd61dd015fdb85c3cd3beaecb4c2187db8aac9a1c5ee583f6883dd837541ae6a118d0d6fbd70cfc5e3742f6dd6a7f732a1f95f0809d35bb0a9da86ea934285927ccf68ed66947416512046b028cba34d15932c377079d276c3aef0d5c795b875b4dc6fefddc620103680e29502c5d409e8b7db1ebf7325b0882bc61d10c044866dfdeffb5c766d705c4f9cc17c52c4f1cc45e3d4c28a3449e5ac02f0e9e0466d910c7b440793e5f98db4ebe70ca6c27f53f2da02c9305c4d75dc472401671746c753e2ebc15e26aac14b939376e38817a70de4a25905c9ed3a4342b12b2dcbabae5e257fb23e58de344c759fd69ec76216031adfd8dc5cf7aee22b8910187031bf9fb64c14edfc6f83f271235b84d7509e97445b946a0c026f752568c7ea2974f050389cbc9a0ef363ab1d13df90d86ded3243cdda4b3771f6cb9b1dbe218a5fbbf322cc33807040401ed6279d1c91be901875c9b40e857af3544ac45318eb1ffcfb3d6e404dfcc58d6f920cf03ab0817f5c642da5d03078118d54ee15c0570872c4ff67d051a490906486ea8262b1d9a94abcc8c79a34a51bf069b72383239fb3b7e4d3dc34993e50840630f444082ed462d78bd025170d6e620a43c9731551c11c3423c042ea5c71574603cf3a8b9824ffca3312fb91e875da5ff677a13ff11821fd51d6904bcee0f4caf9835dce107b753242d2137bf9b5b186cc887ca19af0e1c311fe104dadbd237353a518e7bc775946cc5e7aedc35f2f4f94a14a741f108ec4079d2c4ae2d274b6ca4b87a6880f1c1ec3afaa8acc24fcdbad707c576f8fc16848c9dffc7efa75422f14d0708cae1e5220d8ce2eb68f934411945978475cc5a9eed282bf83c8283ed981be4435f37c3d9bba454d70e78c96f7d21b192d6dfcae86c036203acf2f22e093da97ab7817a82afdf60d38d59d40fc122ff5069bc7c9d628ff83dbc07e8873f8150a11ae2d2d0f8baef5392237adb92ca6c5f9303edac7ba58e11b11fd4aa160346a428f66301969cb36c818b3ac5e12fc885d395ecb4318d179d6dfa0300c7005588996f7c44b099c2d6afa476a284c1b7f840cce56711522ef7f03097afe348ff87d6e4861c4f11d3e1fabe12aa79897316355b3e4609753e51040da7a492465bf0a3167e946feafc7f929307d3b3b8e71095ee1119820759aa9bae2f6dd9610e9e0070906914d32b2ea75b33ddc0cfbbb5d4744417bfa5dedee8f824a3cfa957eaa070c670472654abd00be3b127bf9c52f7ec477101517cea954df2f5ff89d270fae6132cee91021a9c1f0ab168c62ba6e662483eb184f05b3c8efd9dfad3ff573d9b5c05dad960e4c31fb00df4b143e331db70e35d5d74c3fab136aacb8caedd889a3093c6a2a23ade9bb58c1ec3f9796a2ab7d58713077093ecc53234695dfdd109263328bf538ae8db826a2e372f2cc6d82cdb3702cc6e843effd327a5c99b6d89c49f99f4b57d4cfca130ec506a745610fe2352903b6ab6c2c4c40d81839c7a28ee3406f58ea8bb28838eef143e6727441d6a31837a266f11070744796e5b85ebadb2a40fa72847e267464dccca9ab07d544dd4ed2cc50debfb34e683592076f5155f24d2179347ce507e63bf40d0580277abc87d5a7de4e6f9886aa33424a47428ad23cc02556093d5173fdba1e990e936fac0e5e994c98efc434b06e00c0ce46e503b372b8be14b428fbca8dee6ed85354f664da941cc3e3ee58400cfcd48d8fc3fd46a8d76f4eb8947b87be539e681e905047e112b222a6237222bc13f03f3f137593884d80a2b0cca010e1af7e500ea45867cbac90c4bee03d35c629b1f8b165a43d1e26a66977fb36766c5c8508a869ee0e8926087a423edbee560221dc24977a68c9a34e97cf7d33517d6f168320bf5c4ef0b7352dbb446aec9b53d407dfb6e053b0e7d9708134a6c09e916cbe4606d630e9d09c96900072245f21bf81c692806a14a59131fc8171f0d633d558608f89c18cc1a1501d0a1811f32717b3e4ca79e88a9d9b721206fadbff966b367a7271230d2246e882f92b33d645d4993b3b7aa711f897ffebf613afce205e5d5a60f63dd9b8cdd1256aeb0bce5f33c40d2556d6af9faadb35a3abc717b51e348b0f8ec6d661b49a5c8cdb5df7e8348d8285db61589fa479e1a72bd18f0506b774efdb0d40dfd7fa6ff903671960f07336fea525ded88fe1411cfcee3fc7e0a6f98edf4992f061d060bcd8a1abe4bfea621f8e6b546e0cf029970be2e9ac2943ff4dce3caa559aa17e94b28d444801f1a39cd4bb80d1c67d1f79dc736be23122b578dab96158478fe9ee0061c44efecd58d84fb50b3edbc94a6d77f25f8638ddb6733a33e0e50dcee635ef10edcbac170c54eb5e01f8050941215800b7f580795473b94df4ff0d735dd9126a7bddea0b2ac0fd62540a120d1cf39ac93ede2389e226d02583523eb44b8d073d845a7473fec515035362e898fecf1b8afb2927bc00267502690601a608c057d4c2194c2e56a2955b18531400f7620a222ee4f9f2e44e1c3ef7a95d2e665cd5111aa77499142d7a907dce976db73a95bbdc9e1994cda9b7af86d51a1b217501ec61aade82b32da8cd1b345dd7039fce6c5261df212588d1bce924d9d5f443357146933d886f28dc2a5bf152353209d05504131ec4fee51d63dbff44eb95be72087719af28978cfd61b7decb6a2f0666b34d2f26f1a6dc8ad7f4c04e2adcce77ecfc62194fb194f9693a6c398efe83e0ab05c8824d2250d9f62581d32453ba1d90a4fcbad8aa2c06ff311004b23012a5492284b6a232547703663da3734934f98d6359bba70b88fe41d7314bb8b0d7e77fb7a6bb3a111de99d9b49945af725275b444d677515755d8b580cf950b73413ac9c9f9651f7859f6c76b72fd667ecc342a28b3b48fdca6c852accd3a9bc30b3ad5679bdf3293e8720ad17172e59bf0ab27a0cdc4834989353b2e34790ee91211dfca307994034b5770af48511b541b9b1f2b9f540486901aca9918fcc83dd29f3130e071e9d0b763e80da66073e3eb65f612bfc895383d134749fa8f40d76991db0f0da62df76960efc7de97a06063cd1b81ca305d5f69591a4f964d74e32faeabda6aacdc76e396b5910658a05841b24780def70c3baa21db0c998a09860368c16e8b66479d4ad2b68d933e19e6e80cb1e20d365e96af8dc399d0c1a7ee9a8bc6b54b67ce7854ce46d7d71cc994c31323d43711ab7f6f8330173595d8d75942e1ea1a332191553ef06c44c42efb777baa6ec7b9d5cde737a73901cad8b903986d93d7f075f74c14ca04340daab8bf7d124567e092c309ad6713a4f207eb269578d5923f1d1134656743533aacf87314f0da22c67bf7e261a85c4516125f09ff0ad87c98bcdd21021d5df6eeea03e2648a93e6c4c438d5af967afbe8073e35804b791e08612a7e845463e2cf8efead89bfbde1ead0ce7e1452ab79c571b56e0c25bdd63e43799ddf793a6136bfc33a0df9ee67b68346fa79cdac5da0c1391996a760fa038fad5f734a57e38165427715541ad97fab6d0cfb36e782fd65d94844119f6d228701d83a39c50e93caaed3e3d3fc77c530c9b27ed14198c925b2137cc9a849ac006cb257aee12cace820661a5d678bb00ba841071c8879600d1250270885a7cfa839e9e315ce054db2bdf1cc8d4e8f3682317f226a249ad76a3f910c7f8b134272879f06970c4fe39a277c0c10567c373b5995107e1bd13c5471019b4b142c3e71600c10b5d2ac038215afb58a7ab5718b35059454a4fc16b1a6833250f10aceb6d45327292cb29952ae03d95194de1c485f229de148707a459c91196be828cf6aae06d47a3da9db71ae0ca97cb08a98bf312d3ecc83ff3e47ae55544f367a85b01199e300e6edd6bcc7717d6880d41a9db8aa9fabc355b9c26ae6830e4590448f1baf4debe61d476a3d0a0d926ca9cdd3f702fce3f736dc60ad579886a97370a5719304d5918ee156bbb1dba7a04ce12278ef755f40d3fbcb397141f86a4dd590ad92f8a4d1236c9b18f5d6ab657a4cc5920cccf3fe5c310a9fa15ce6b55637abfd11a5977f198a2345fabac70394015ebf317395d2d1861e1adf180a7d7e8e71b7c58395eddae1998e86fac18a3093fdf9e498f94da9839c6a774b2eac6275e188515cfe5e66608ca8aed85f24afb864a5e4eaf7866812b07f8c24ddcc763a52bf11d6e0f67ca651fe67930e733d6268a70d1d0c0eb7aac89041a5708f05a1002f7e080fa48ba41d8af2da22a2e1c995db1684e61031c2cd1c562ce77350dc9c5f04c768d73bb2a270afa43468c55dfcace1efc87a8eab39668fc501a6c13f6e2bc434a85c88f9c0e485ca3579d213490eacc8e18832ed4676d806b47cd6ae2d2e7069262a3dd3357d2471bed3213ed7dd7b311176fbf721a133549b090e9736a5c62d561352ae31cd1b7fac34d171394f88dc870942966fa4981a15e070c7eb7929aaf34532507b15a96117d98825a57e3b2c3df11b9e7e7bcd7838f06c091f0a0021c4ced4639377899859b63b4d4afca1f4b7bc9584732354f6f232b9b1fe057b0ea12b2452dbe23e365d00164af080ce1ed85a79c7a7cc2e2f6c92964218baafcbb80952ec3cb3ab14312f23f2561d3c63925b48460d27122419f954f290aca3ac91c7039ec3474d50918cf7aeb30fbf2ab6ec04777f575ec745c93dce18eaa3941259fe8686732fe13297e18bff393c98e7a40f19982243be1b05d7bde38dfa3609fe52989af0bb4b7db67ece11a77ffeb757edaa25f306e0273f3834ad54b97116f288b5b85eee5a678f09b0d8bee7478f2e45bdd6a5a0b750165b66af81fc92fd1feb8925eefe2db5c1","title":"面试题 17.17 多次搜索","link":"https://leetcode-cn.com/problems/multi-search-lcci","question_id":1000024,"issue_number":78},"76":{"day":76,"pres":null,"tags":["并查集"],"whys":null,"difficulty":"- 中等","description":"```\n有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。\n\n省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。\n\n给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。\n\n返回矩阵中 省份 的数量。\n\n示例 1:\n```\n\n![](https://p.ipic.vip/0aybb1.jpg)\n\n```\n\n输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]\n输出:2\n示例 2:\n```\n\n![](https://p.ipic.vip/94y5lf.jpg)\n\n```\n输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]\n输出:3\n \n\n提示:\n\n1 <= n <= 200\nn == isConnected.length\nn == isConnected[i].length\nisConnected[i][j] 为 1 或 0\nisConnected[i][i] == 1\nisConnected[i][j] == isConnected[j][i]\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a33419dab438a4a074246202662680898e16664879d34704a893c930b2c884fa0fb0f10fac65745e3ba12fad6b71dba02202514082975c4e747616d1aa8bab20aa6024c428846fe3ce839687f450285ce47e98d3d44d7a0d0f4f668294d6daf50bce60700cf8a42ad8ec1fc35f226bb974769590e3c731ecc76f710ff69ea6416429a197c2a35a8c0ae976b21355d5a147402304c61e5e50172abce605d0f32c8647cbc9ebf6e8d01e96e7719a1be9dd34ab60f4ba4e0405ae8ad8e6608728235cf4f432eb683c7fb3a18a39770b6baafea0496d267ee9d048b1a0b2e1501d89ceb64462daee7d6a247ebb380c7237e880e51220fac43c1ab94861af4d3ae135d69fa35e77c8f4d094fd464038e7bc7ae4160cf0621ae02be3d6a0d964349e59326b5723385482f1490f1da02e6fe4d40e0ec206d0c44d0f76799a8d603d0e2a18cdcc8b2ab1388728c9e745d69c08ff5ed7ca4b478ee7259630f54779b962882af08ce1a346f5663c23888c2de231ce72b3c084ab1a6493664a9ecb1540bdb483c94c685d53f292e79d731336d0783b44c456e38bc0dd7d30b19bddbd359cd600a7da96ddd015a092aea68cb2527e66eada1860fc51040f66573263f5b786dd721f5bf81b8e8f569eb53a0ae2f8472be28195bc5eb840d0e81122341418dcdc1b87ee4c263eef9a4043ee3a012c59ce5461b6bcb32c95fd97a91ced9947020c0afe390495eb31c0e84b5bdb0e3e427cff7b8ed84da9d590352a5fee1877c784e3b0f3e8e18858d022c7e19d80f0a631d2adaf8e096b661177a624f98564a37a97b9b29231ace94eb3328a1861e0efab5234e0c3c664c72612863deda3e26e4d8c1f802332b7fe7fa58f1cea8f59482471a89cc1187d7ab6dd0aa1bf508245f8bfabe358519bf4ef14f1cd2057e19c9811638bf525769fe9b5f6fa619712e972d19c66ef3aad6bc71fb1a0d4ef787d52990232d32a730f0dc043ac563e5838a1a124e51cc6d7df9f4d5b1182af04548aa109b97d8d00c2cb6dfdfee9800ce2ad38b65a13c525123f8be3dd5a53bba2e6a27f9b811fe1b886489881ae41c926b8f8f9b57b8572dd58682846c109921b0ed00120811bdd79879a024de0e905a2eedfbaea8ba5dc38a9a8b1dce936a745ca6e28ed351375cc48dab733b16c82386879ca5992074bc7685a451de749127350a2152280e25fe55a7651c4b69f93993b7874a6cbdd634ebb6739538c2aa3d94357ec93d8ab0185cd828261a8ec0df3e3e035fd6cefa6d0e4b796f43674931437bf7c82632e52cd92aa757d826c5c0d9264aac3786e26e167af46095b51c907f92d755be0c53d2e8887b733a48746f1f6e1dc8967563685d5adf79ddd17ddd183e705bfda8a4e38da67b3ca594f3556f99795e30e8d68b663bfda42229c5ad202e467987c77a38eb4eb36fa010b263e6ecc9b83ab265b6ec04ae08efca5186ba9142f80917189abb3c0ef2ea60b5deeb65066159125d46c921dcfdb68a2141f742fa9b89744c845393814b7e018003d983d0be26a8afc654b7ab01532afe5b663476d9721cc392a2ac23048d18b4bf70cd9d8929d4b262bd91a9ae4c097e8729d7df68041a6d4c7f9e3ea30054faa989299251f67128677b89a576cff85dde9bd6bfdf90b95c27d16b4a32e6fe99f77e598a103498a79283ab13446ede454ac3fd7c6e8055f3a3acbc0466832390fa76eb7c71b208c9dad88730da38955cad965516b532d735aac7cfb9887a6bb237cf38d48b868308611ed54f6c308d3bbca0e66f7983855c4784f81baa99f62d708c2877264240a0dceee515032e7d180a7a2c26ff7b16ea15aa4e0b0b4185d9b31a332e2a16c8f487207208ae91856d8150ac1f2c34a2ffa09ee2e59371adf6f566d50ab657f933b3187bfe9f8f9d98874a76c77d87b88678b7e0aa4986ce51448216994906de4431e841f1a2c71579ac3942f3bfd68d8323eb569e368524969e244ab7bdf2d6ff0649b6c414f049e6588c5b4a201f1ee77909b957e7f1891fbcfada2da5840a9f426015a726abf15706d6090e0667bf75d1c9153fb2339712d5375c0db5607f96fac2bcc2f8210e3eac9f81ffbf711a6b158f9a550bc95084b1caa249597c6edc4804f0dec43bd05f26decbf9774a38fd74d74f3bdf6438fd7202980bfaa41a27d4a75fe6e5a214fd9addd1c28a294b4a9a219a3d87a84e2441a1594026763452210e02e62e85c7877f904faf6c992aa7c98adeb3e1c97c57369ea00d130388716b09cd881dffb0738b89e2f238ed5d8bf30dd9b054ae6dac2c0abac9b91e80ce84f4f2323fe92e108bd61d23e69077940dfa83a4c28b9346e005278b2e020915ee4cdb08a7a8a352b62abf6b9c2ce6926c25246f2c1506e879947570184ae52beb3155176389519867cef1f4f5316672266e89e73c766f76c409a9604299fafefb946b8a375fedf95299860b57fc0332f79da997195e7aaa3a9eff131451d4a1c7204289d5e561ed7ca1326e2e04c322865c8d5a0a696e80bc72f8caca6ae5dddd18a5e84188dbbcfd33c42888a353642ce147dcc487336e75d0840f1ada976ec89a86089748e653b68959b9fa3ce21605b0f49cd2f1499be788a4276a94b9a645b9a8e53a88e1395ef605f25f2dc7f3096667d75155a700e07d34176e1652583668dc999adc0d6d8d1ebaccf7fef114e7dfead5c2ed0964b1e49699ba67b4524c6afb0e20e0781d599d8fcd25c5ab712004f5bfef21ba860e7f2fdb9172617384154a9d13615c60753e46b895a6bc3ba9217a8dc0ba364f2b7b276106a25adfab5473b69dfd88578c340798c8ecc89c8486435c3b9a9b62072dbcbf10b829b53564bd073f4a68c98390c7ee3cdba3738c71892ed67ffb47f0787f6c1903cdbff7f4840bde4b9dd8159bf9776b2e50af7b88c458b3004a4ec76e961446ce888280716f438bb04d6114824bf2f5a3ba90f56f2c084d086784edfe90ed7523cb4bc24a33feafb4f7522adbfb9f91d8a8db96cbc56e9525ea0fd50fa2e5163b4b9cabc79fd8e6c87dc38719344321c2b276844a4ec525a939f47ceed22e8dcd4fa96848ded1cb1e84c28dc1332e58d705f554c1fe57de2ddf60e7e43fad8e78cb87d584a8d4dbe580cd7dcf9853819a869fa2028008a3b09a04f48c813513b241640a07c43904c65a42d5bdc6f726dc0aebba43927588eef4f462f9ee70d88ef74d6f85ae288908d8e8591d7b7a164df620701b473ced39f7c010103f5904d604c8d68eccb1ae2756d7e44ef4da86103bde5e82d1ef4e8ba20f5d4f0570de6de14fd1a23a419f6e9292d1f359decfce86c71e2d5de62548a6ffe2859b98fc7bd26b589b665efdc79570bee51d93202c59ceda818cfae73418f11a08ca0bef92deb900dd711da49ec6b37fe585675f1c64f9e84e03c88765f140067fe6abacccd25952ee2a4ad2b621d2cf4c75b44efe15546e30d98c7d0e3e5dfa13e0df2aab8685f3dc4a61a64aa12450cbb63e2f125068122b9c6f2f6b0d25100b212a1d8ecc025198be128b95ce3e7fef90b9ad94f80139b9a50213e5d69e6e9fad4e6bd9f1218b8713056d2b1ed2b4e31d4fb27a8cffc64e2aca77f8767891c74d6e133551594f37637b126db3bfacc6e49ab69dc4a4fa17e88665a258457eae17560a7eecdd7eec15b027e7ab98d9cf6686abed695c772ebae4d1543e9b7bf05437cb84c776ad80845fd854ef6b18971e3fd09c034525e839049b1c504fd8816c02e42f773d57eb2abb266fea750f11c60142cacfaa993f0605441dfb4efb0b8fa29afc3ad67f8d30abc2cd4c469f83af634499aa43703d78ae0a955417fc316c09f6e50da7b5d3d7eadebddfec2eae2f4a5cb02d0fb0df245b99624f1b4926763bd961ecb3aa09f88e704e37337c0d2d066abd919aa64d90f1abab865759b18008105918c407e367d18441df04a6cc54ea8c6441c6d722352f36bb77a358722ddddf201563645df5cc875c96133e09a01c02a32ccefba2f22eae65407317caa515d6bf77c88a360012941952f9d642e604455952a151764a69a35628cfc397b438e93be600e11c6032f292bac4193cd18f2d51fb0f5246142f003330d13f4b6e73537d0e26a6ad48c0c3072f9065a8fce019189436d06c788f159be129f81341979eb9aacfffd7577d783f893507fd758a0ddd6c32e32d5beff80b1975d8aad6d5fed1d7a03b22475c17da7d3706db572c0148527eafa9d5c9bc17e77bc9e8409b3f119d2e2efa889de677952b848e714f5f541cab3741eca393b2e705c5ce1d16be675c2beeeded37c621a43b8113f15fd5a07c09c2006dc888e04cf67cc0e52655552b5806cf894c89b8ef86cbdf9986ee1038548851dd69e888e068936354f7adbd1e37c2046b79de12653e075b25281a7745aff4e4e3d44460e7836bb37a4a8db9479f8f6c3ef1bef2c9cbcdf05275a8afa33142356fdbf1a52c275a78db31d18c9d30b04f6da505ebf4362a217fb663c6e3f778a1b20faea7dca6e9bb42f47d827acb1fce6bc81581aa9efebca0ee217755f30d3e59509771601dc8aad1fe41ab05f2422e565086da775e31492ebc9da13cdfbfeb39ea298181f9480d7d247fa7b7701486455c2a804af69b056580495218ec215fc7087248405dc3bc0f195ca659b57813986fce57442d6b1baeace9f43b6eb15270e49c4559f822e7038bf79ee3c7404b39efbc457f5ff88f7cc9172a057bf41779ba7b8542931def5741b619dbe4503cf77742e5aa6bec308f852888c1c1544591f4b530a7e3a449849716271c6f50e43e1bc8248a009426b88f7dd7a29ec3b13383193f0567cab4b35b6ba8978d660cd54c018cb5f388a4881257c7b09c643af299c18ab61e24c51520aaea2d5c1d792811e25f349b07e3c76523c9fddec4dad494982cc632355337fab14e3be1465fcb268cc3ef92866c1ebaf94b9c961e7c42a19fd375221a991a6d8ccd2e69de335f541c642e4577077ed5997cf38e7b39dd040c859d96cbdbbb08c1d12757611ade4a0b06f446c197d8fb60915c8e7b4482737560cccce1fd55c7f9c76170196f8527564e1b3174125cad7f10da75d60b6f1a4eaeabd2d21456442f6d97776624cb9f07a9da7c9ae26642e1423b040b655f7a46691998849942e023a869098c47878b2effa7dedcb2d70f55bb989cec11547f90aea1b0720cdeca7e4fff594352c8d64ef378ac0962c3c7da39f20a6b2dd10782842faf5a9a827064eff485e3fbddb9173c0aaf62ce8f9ac55e3c46eee508719020a5b194ea8cc6d8b585d9220a2a3419962a83851cb42d1782c6410f01a76c94b8a1a4bd24c3dfc86d3d07db4ce52935a40652aba9f72b93b3f2659b356396a5ab5cc586550dd6c61ca8cb284e43e088896b6e6079701399d83d67e45438bb513ded94ba29ed24c555ee501583fdd21030bc914db1a6b266e26c545a699736ee8a90ae44a6434e35f36c1258a025303a23a38369dc784619f1adf2d79af3a6371a396b0ce811c7e46865135eb07301066ecaf535c773d7de014f5f89f514abdd8c16b135c40e633c437e4792802d91af86abc157044e4dabf91a26aa6143f9cc76edbdb27a7e8c1a32d2c5f180927bd9cb28f6dc223db59c07841ebe32d005d389926b440265466453c06b87a82761aa4b5522bc5526373dc61eb697db8ce2a77385d01d8931a592543266f581a2ce2d1858340c921bacc386075e5c09215f448ecb5e7c879e0ca881a3582071f7520a7fe6bc34dff6810b4f1fa122d64d825aabb75d2d9ea4cadf0c28adec80b64498ba2322541ae80cb6f2f06551ef8e94d91a8c781772493b1eda92cca3d62d6580f0357cb0396da368f9ecbbb46217ecb52803d597cab68bd91b7a9754acd1548cd55af2df3e8d05153158d056501c77294099d9cfc6a3efed8e98da1844e10bef983a150186c2068201476249e0b087f38a1e808c36000ac3024737b822fab0dd8267f91bdd67efc6148bef0ddc034693fedbf55558c95cef6daa9749f8b922eb29a102358951c2ecd2bd94f9ddd0a04dd660af789f58e8bca0c44a9c905084e80cf47b1c1cb6ee8c6c1e5d270b7eef3e864d4e43e65dc746ad76d8e7c8806966554d06e263e9621acf79c5a9496a9f39cc5f443eb2a5dda91488cedd62a9cf349f3f1a9236160fe02da250c1efef307e0f1547b2d85747f76fa55b1b5098ce312103b2b2cb7a1179c85ce9bcf9499558f888cde96f95e3ac49249b48c733d35dec49da7cc0629a2e55ceb8ecf2afaef65ea7cc1e9fb764ac4af90215e4a85ed346342dc74d9b0db5154a3ed77160b3341d302746014228f2727061f9c7e298c93da35751de54c93322721db933694634971c9aa50b5e2f2d0314ce8d7e3b05ea6d057084a373a42197214e36118a5204052fb5c759216328fafbe1991e81b81b2fb958c80fa5f72b3f0ebb589f02c5165804f5ee134cc29679c48540e31b3f7042619ed21b036ce28aca728b3836135ef70dc3d3d0335b0254b221942ecd2389b2fa957aeabdf1296ae2058a41c115269e9cf6076e0538dfc50147c5ef9fab7599dbe9831d8ef28e21d471f4bc01d19d9cb082e6cf2a70b803402e9dcbb66f4cc0f9f028b52a6b3b14c2c1208954d2a82f22f80ff6f8cbb249a1105f2ac3d4b1bd07ca406fe76e307dfd8fd094d3e82c177e0297dd873c383da97ab7817a82e9905e9ad6418d328f3cba0a2cfe799d6bdab63dcc09ea8726c665bb53a3c1b7bae0bb14a62b73c0b8e06c5f934aabac73e69d0ce31ec1fe581d46eb2eeb0e6acec9a811e6c11488a66584d78b90fab3229c1bfd27ce010b952a0ea2b36f7c44b099c2d6fef133f7c1bcb3ff5acaaa2d4b0445bbbc308aafb005becb9ae1b4067b5ebc8f81f46faa6489620d1f5b3e4640333e59571dcce8de4817b5ed0c00dc67e3fc3fa593178799e3cd68d0ba444bcc070befc8b50530c24b4ede121fe9d6c62a2b7da7d1ee1007397c28179c1f27a448647a2d7ca3665f06944a025aec7d47e0a07257e83e3af65741c55529ddf7cecdc6eefa45bcfca689df703d6f89e55905c79e31d9b81cad17e03950d84c51b9caf95f16a4fe9efa5f28958059d98224271ecedd1cf448667fbb73f25c0984d88ca70d5513d9335d4a11584121965557006ad22406156edb765fa0c1852a4d10d5a2fb7c6068f784c1945d73cdbe9ee020a3063b3104ca84a987810201e95996c4409c63a2317aeb194758dd78011a0f604298c82f08bb21b5e9b893d079ba9756a4842e62005ca6492228b38854f1ae53470f5da9392269c5f3afd19c9995c312ddf1a5b1b8306eef868d0d3a103751cb3dc68725a2e38264207401f191e56928ab6ec8474d34a8839db8fc3db4ebed2aa65df44299d9cc70dc7c9d84d56d76c19ee560226102ae39f7e917e0c4118809adfeaf0f79de9d586570382ca601050533023c2662f0f7c540aec962cc96858bee3b498edb19783175234461b7d4d8d032d309b9a5081faf0a71c01c649f10f207b048404ce813be5991221b4fcac1d2c589efaba3cb91d375fba3584984d5f12377ceb3860cb49ede6f48c476ff43d3020ca0b86dcc3ab3d21dda23af92e2652bcadc52d715aec16a0cc800402b702c56d14918a6edaf26c08037e88ef9114a098126e04da43530d634c08fce726f29bce59d471883325334e4febc02d4dd8ea8e77de69b9ef845ef17d9fe7c657707f05caf064e40760dd816f871084363ac393c6713c8d28fabfcb2e742de370ce61584b795170a58044830297b02f39e4e057e729191aa08293fda3faf3def6d6fdc0343a243c6b3f5fd98c26d7a321f9b9f5fa06270cdf54545e871576993cf1b0c1718b8d6662733206dc5af7cfeaaf670d0a0b32f54d51e48739144b0a1e547661b44a50d4b174b856c3bc9595df21c022eae5ac9922cd31fc1a1d9d92c60548844cb06735faadd5e90b3f6d454785dedc3b183976541131476186385b4ed47bef2d980a55b57e400b22f6de00d6149b46748ae16eb13e3284650a77e196e7a6ce20cd259e3ed4dd21dc6e501cb638d136c6ae6fade54d810a3ccd797581648841078bdd1b548486ec5efd68e847c9e62247f79c9bce9b672bf277aa1872cf8a2f1132ff3749b7d13266d009c1aafea05d9689b4406ef720e0107f6087f8c3af94afd1f9d8133afa2bdb5f3b741c41773e504ddc914a58ed7bf06ca6d240a4a7b30fe59a3db219e21ae1c4eec515079737a89cca3edb8afb2c57bb00c3b0e42d734527ba6057d002d8e96ce567b5eba8936400f760fb527af5fdf3c6dfecfb343d98ee52ad11c57a47744d447aafb63b2ac2ed273b445bd80e9925b829a289c3951aee744135b9455aae8717bc4898dbf098f651db0a38b6100fc1a59c65ad5dc08c00c64410014742ec586aa84c2fe9515231a669d0d524531ed58f21f8065ddb51cd80fb2438e7187efdb6ddad71d76bef0fcf27c6f28e7f51c0819c1b0242067ace9c4b73f9d836fc0a86217eb9aafd8fcaab0375bd321887f87214ec02b0648181075e896444793a18afbc96fa83b004b690a6809b8200d236d614f283f63c72a29ce0994d422d6e3229ba5bf377314bb8b0d7e25be2e3ee1ef0af4ce91fdd55d857a1875aa148725121f01db8f84da821c731b2afad0d6794b6d13af86382ab3626ce3391261d7bacc94e7953cf801eb160eb9b01cdc3d1a823b2dc2a214e8e42a075c629c06083e2b923ceb7e7b712844e91f118df87e1dea0e464c5aaf480c317e1b9b5964cd540c83934ec28059b59c689bd17673b430d6bfaf2eec43f23575e3f22fa94ffac1f1367e5b065dd48948962cdd8f546d8c30f72060e4c7cf8ca02a63d11becb1792051251c1a4d9a5114aa18a5bdd320f7fd76f28d9f910611e65849df3cc9a38c4646a3218026998a09cc0863da4484694758cc7070332ffa81622c943b26ca86982a06455d001f5d0b2b0a365310fea27ed09157d0fd8a36e394c31323d4625fe26264df2c497bdf9f892b16fac01a3321cc2214ad4604d944d15d2b802e86efc68875d861b2ab325870e50bc2314f71ec729cc525a0e890645b34a9b4e9b40dfd26d5570d73a5e406912fea79d59a2f4e580f5706142847acb5621de2932efc73ebe87ddf5019171e5d08f348df3294b1b0753e1b5df48fbd03b129cbdfaa97cd6bcbc9fa74aba9553235803019652e28623b9e5438add3cbe0ad89bfe9c8f8d3c877504fac68aa3ff23a4458c6ab253a16d19977694425a9973b64f99008f1c614e43dcbbf0fe6957713dba325d717d1ec4f16192eb79d7b4a7e0e7e309039ab3e0ff822e9daf579c806596acb10329d1c91733fef5dde8be29fb0ddb0328b779da9209d4e9d926de00d18b7d300d10071b204ebde3ef0e7276f5e06798fb001a60c461d8076783a0856675f9e8de5a839e9e3159c4019aea9bfc48d46823cc06f7235612d9ae42b4bbb3b628b034b3699f32cd44301addf64280443133071651c8f67372cd83b7e3f44cc4b5d626a0a4f1802fa87e50f8247e0fade05ff719635159e56b6bb1eadaddc1019f806cee5911f617a40d1d716a649d07b94de55060b22ceb540642e7e97864d09a138d55dae549b3569d6916bd344e030f58a90eb63787bc583f75121e85b07066c3f85bd0c99f22aafa382bc8e3525689dd458d4ace19aa38940a0ff69a08438569347d764b564aaa9497c612a5769f24683e790bb43afb0f745932cb145d1c1ae2d02a56c8e049cc5c1cb10f2ff9fc4e91ea26e3d8120124880bec52d3800fa2204b0dee3d7bbf09467769b74bc85bc4b440bd782338df4ee794518b5ac42e6fc1863b1d711a5977f4ade6217e0d39e5bd85910fe3c78f6969fd940738b5d4e74548e71b798a9bfeddab4df8e9bfab4be7d8e8f9a9998e44de7c6cb6a784a28d76820fac80247e555292cf9fd8dc27524afb864a5e4acb8d4681af977977697866b730ca443ddaead39fc5aa406f0597d712726e05955170efda1c3996ba570c643a1497c1d4741eaceb50c9ccde816a4d0fee8dc3cc7b3423f8588485e66ee687af69c5f04c768d73be7a72bbee5396ac55ffaaca1f8e2308781393ba5ef01a6c13f6e2bc434a85c88fec3b9cda93216b8134964ace8810ce00180a835876be0392ccba88e936d7656d37b31a3957b1ae5e55e0c82bee39a3e368d6eafee9f3653bb70878c29d0c1aa6bd21291a3427de832b3b2694f7faecd7c84176accac78b4523496ae5129c3cba0f79304f388464dbf23b1a78053b89372f1fc78fafd16baadeae087d1185f0ba15e9b6efc34ef7391e966684323791129b5eb90333df27630444f5151d2574656959825d8c59ad0e3504672b75bb9b20e0a28a6d3dc1e3ce0df10100f6ca48971fc6f11f9febca034b8a7164954e7c48081a612504bb057bd0634182c5d2bc44f709cf0ff4e161b6133a3368a2e6290fdb3d38228cb5ff84181ead7c65b1cfe403adaeb7bdd14442673c2f91f276e82d56aa89b6997e00031223622afb32af1180641188fe436b152bd63e47b72e7436cb168c154affae8ef6b9e4effde11464a2d9a3accbb1fad766d2e21ea01e9de0e101b0478ccbacedc2d496c10389b6c4cab7831b149c1173f06ea83fcad52c08a3395d890163cbd31215202a1817cfbffc38ee58ca7d0fb786de897e73be1bcbc674e081ba73f6782ecc5703c26dad5e6743525efe757f07345aebd81bfc1fbde373c57261308ce970ee02651939852662d99736fa792ef769a14e44abb67d16432a381677404fdca8fa174c7b5c107f869ec3f2f5a8c97e38725fcf8d6b025f99e46b1165ba12460fa779b92b752beca46825c548ab332b02f1e3c5d4d4b237f8ede6f14084a18e6d9e3afa5b7b5c6c900729f4c03b20557de6cfb9b45331b1b3fdd566a39e89f7e58bd2b6b3fde3ed39cb062a1c59a9c1b6fae41991b2d5666d354087c529ff0cd9bb0dd445883b6bf77f107f6891d8c2f4499c158df322b5f68966e4b8371c92193beab52e1494e0b6b5b53595ff1d464ea3eb73e56cd1364f603fe6d749553b5102dea679908c0b29816dca0f82ae63cb8b430f51f8afa9f98bea87c63918e4a364b77dff5141afdab72f4903b541c422e29780ffc5d3b8482aa8e1c0cecc64b608109695f294e2d2a57127321ae84a3d1ce376e5181b1113133fceddf2bca4b8f4f96ff81e4e1e0f6119ecdc5bd86a32a81422be03e8a15bbefdf28931eb4da2e2f2c0967bc4ee2a5fbd8e4d2733d8e4335e093abcfad35318854a2780599b2a81e8fe21572d39ebdf217a87d24581e6582865060aca59d06e33ed4b9884f56cf3aad6826b2b41e841aaf3dcffa6da2ca080101b7a61355b742493905a4eb787a67b496c6d17a8ea437a34a17a82283268ffa55f27a210ea81a9a375eb779554d28b70f5c4ce9798e283f9c3c7e80c88e6ba225e4030754193332ff9fa016a62a4c6bd213e41b22de65489e49a811a5d0e5be2a88639658750b4363dea94120b5368091a9ce38dccc3284d46fd8d7c084fd9df3a61eeb0b783c5ed7b5c9ecc3245f8154078f9d8bf82e1689accbd027a27b60d46fbc94099d074b48ea4fe13432ecc93569340759611ce79a8defa57c8d991d0b02b0ad25b8a85d7565e665fbe77a0efa24d163de59e7237ab973bd6b432a03edc1cf1385007a6dee087f51daa2b50ffee45d97a5b1b18d6da3950f89433e0bc7ea1f7716967be64585a1907bdd0df788168ad53a10dcd0f75b1d2cc8e4d257d90642e2f61302f0","title":"547. 省份数量","link":"https://leetcode-cn.com/problems/number-of-provinces/","question_id":547,"issue_number":79},"77":{"day":77,"pres":null,"tags":["并查集","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n在节点网络中,只有当 graph[i][j] = 1 时,每个节点 i 能够直接连接到另一个节点 j。\n\n一些节点 initial 最初被恶意软件感染。只要两个节点直接连接,且其中至少一个节点受到恶意软件的感染,那么两个节点都将被恶意软件感染。这种恶意软件的传播将继续,直到没有更多的节点可以被这种方式感染。\n\n假设 M(initial) 是在恶意软件停止传播之后,整个网络中感染恶意软件的最终节点数。\n\n我们可以从初始列表中删除一个节点。如果移除这一节点将最小化 M(initial), 则返回该节点。如果有多个节点满足条件,就返回索引最小的节点。\n\n请注意,如果某个节点已从受感染节点的列表 initial 中删除,它以后可能仍然因恶意软件传播而受到感染。\n\n\n示例 1:\n\n输入:graph = [[1,1,0],[1,1,0],[0,0,1]], initial = [0,1]\n输出:0\n示例 2:\n\n输入:graph = [[1,0,0],[0,1,0],[0,0,1]], initial = [0,2]\n输出:0\n示例 3:\n\n输入:graph = [[1,1,1],[1,1,1],[1,1,1]], initial = [1,2]\n输出:1\n\n\n提示:\n\n1 < graph.length = graph[0].length <= 300\n0 <= graph[i][j] == graph[j][i] <= 1\ngraph[i][i] == 1\n1 <= initial.length < graph.length\n0 <= initial[i] < graph.length\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a3341b691438d470b7d69202662651280e3596d89ab027c50b434b5032d8f5da1f70810c5ff5565c173cc736e24c977c5bee375114e2ff6a50d500e56a2f9cf2bf87d4428f640bb65c94621422b6f80ab32cbe4786baaf1dc8187655e144214bc076a7bcc3327f92a6ce119a45a25af85445278003250f16fed57ee2f8758edd0cfe46c7e466c8e48aeb068e6ad161d3e1aa5846548e82c4653fab3511d7a19abf3f6700117be258b22f434a3167a3ab8179c67039d7bacf87d6be34b7828b67f91651451afe7536ee8bd20582ba3314139cd0437a43d35a4ce756432021acc8afc28076fa8edcfee58fdb9cfc8283d984e516411b741cabd94c604bad1ac1f4d69a56bf868c75c1f2aa82e4ecdf71619acf142c38ec848996afba910aca607c90a1790d967cfa74bebc56b8b7d861152a89c1204514995ad77f5c8dd74482837552c445359ab6ea43713ed9ac35881ddc57ca4b47bce5b59632558478297189a69fd67152c6a5b78c33c93f4dd0b3be90a3e0b5b9aa67904a1476ab15405da6f1899f48512dfb0e98880573fc2eafcb4241e4a4ce80bb18c1d45023c58883b2909316d33cf64200f52ba4840a086b7139dc8e0178d6f43a83c69566548020cf447a9b8cecfc09135d1d7253661d476d95015079af21088a0cd6d283929a68fb5bc1abfe4148bfe18ea61d2c971cdc47531677caf6ef1128a74f4b2efcb1b0ab1c2fdc9386be3742fecc6b8f7b8c176b2e9d9948ea0c3447f019595b3813a1a7257530bcf6c96c26f101845cc5051414653e399938cf538082b1e4ff221797df542ce4f258f22ecc3494c9ece452f9df61602ade4a0b0dde7b52ba0e56f5ed7b5bdf182bcca916d24b073167b774b0f471a89ce0f85d69b701671c950fbc3d7752d2ff47ba54c9742afc315bae7cd66c6532bfd1e4f25ba88e6e121702f12cb572bac30f5d0a2af05b436af2edd86ec049d121df7529a7e29d9a822a76e311214357f5bec4973f8ce135ce4812284c274c50a73206dc8d309092228378d1ab3b0cf5dc87754397fe1e259e8eb648a58162883d20cb466b413d0896a821f2e87e3bfe70f8c2d71fcc8f1983f68a16b2b8274196e4d824e99769421cb3c73d74786eac8191c5fe89f9a8e330a190b2d4e31674938beb5ea77712bfff7cf5dd81c412a7153f18431ad013ab22cbc23ffafe8c186a0e6b307e04ac8c7c29057dbc490f01769f0b30a965db933e72a22c477a4ab22f83b06634ac16d795fcaf4920926c0d276de42c9cc93eacb8acd8a84e636a1d14152dd7a863017b8990099bafb4bf6173d9ee280ceb07ce01d73c574b14102c978cc8f60661ceeaca59d9ba4d9b685583ba481c3d68853f61123b24b92bba0b410da9e98e2a13951a0ed1aa426fcff9fe26d1146e49f4f6bc5fe112792e4e8b84d03daf062c86bb80eac00f633774a01dc366887e807ad2de6e9585d3ad10570ba160d8eb91023f5f7529fbdb42c4e3518105d9e4cac0b452669d6c525c3561754b4c751981372b1feea01873f505371c34545508c112b8ea1df77b187b9a802f3c32e1f4322a9f34e97405b9f2b792fce0a3a8341035359f4e0a1d6498018280644f3f67f495989ba6efa2844f918ba3dfbf789799f9f6ffa8309a3e0b0b3d3909f0509be5f1570b2b1ddcf3659d3615fdecbefe3ba134473f45e4dccf43f27c56a98e5c0ba67d337ba151dac0ecac8a1226a38316984723b8493f78cc2f4ea234edac9cdafe1aab7fc7ee1408c764c4153ddf0b21ce48ff86ea6770b4ebb9c2f3ad4c15c5ea8104663e2a56ea881ecc79508085910cc8d84c5a2532c026f9d4d6fb23720a25d2d1efad9dfa084242a362a41f1776177cebcec389cb83dfedeb43d5b6942353230d0657933ae36b27dc158ea4997c67c26510d2532a8c303ac6036559c301a3392150085f418ad222350ea025ed33aa4b86cfafb20364aecbcca9d8a0ac1bb0e83438f001cd6b22e56615f15c7ca7909d070d666be45c8a2f9254920b3fa32b51b710fa269745bfa0f0adc27d17d718607253db3b500cdb3f4957bf06c0ed5c034d847ac10d3e0ff5ca6cd0e3f5d0f4312d398d5441354143294aeb2930c4cffbb01d23a751b76c9ad8feb0ff18e0d2345c83a98807a442cb5dce346fb32a356a1eb9c5ab48d30cd264b94fb36298f2786f519e1533a2a4654db819e7fab45e30728aca3a312bcdf89b36e5259413eaf933eca82409d72a460be3aa7d3abd1b6e2c2785b3796ad01223f8b674209d9901cd4b673809fecf01bee758af224e65ee62563faa3d96a5b51d44f1b667a1defbb0dbe1e96f41c12ca9242880cf0aca5c2929f48fc0f13812f3a18f65cf81e76bfccd07ccd55a92af234a80a8541603bb1fcee61d6ea1b4a742ce44e93211aadc58b75b26af7d6f9fa23a5d85b1185895f73071bc16afd5332facfbfbba125da3735b5cb03ce83431ad9766ac3f7d4bb533167d855bf91602135bbb8804643dab2e004a879e9556d5963dc8c69ec049d92273a9fd73ac6592436f496bb2ccd8e4fc2b5b6955bf755587497a4cf70a48a9188def3bd2203c3bb3673914e6f66088b4ccc942736f17b38f90ccc901d331f2b0cce4c030932eee13c4d27df077458980302eede51eb7ba8d85d10e1ea9f25b2f202e57cdbf2c5e5c7edb5fe0fd4fbffc96300977f3763396956f642722d171768bcb7381c73416d8932babc855997ef65f7d8c5552c38ad031fcd86e81d282ad67e45cae2c32d1d80a0cb57cede3ad183f6c8b2fc8d3b746328c909bfb0624264dfd5e9e5e2d0b74dbc153fe89c396f192e8e71b3d37660392259313bc08ede1165898fc1259d5775b144d7fb2d8cefa3fc1528031e2cb33769f125f241ee30e41aa43b968beaf3a45e201c7642e7459f2b1de103738da0a0bf41be51449151dfcfa26dbb2fa7aa6716066491a6b17426e5dadd35ff1b5501d6f5a46c248093dfa04d4cc9ba39f5a045cb7f8cd1383a5102d8f26fdda9100350e3d49fc42ad02089248f03c8a4403327b6c9b5c9f2fac56c495fd857146882a916d760188477a922f461cac7279ef754911b058c85917084df8d8766605fc51fb253c8ed3a8c6c8f28ebe424a6942789ddb38da88ff1b8aa8e32dce107818e829fbf159c08ecf5a84d8ce7d83b13b5406a5609d93654ca1011d5a2c3f734ff0af6a4439d33c1c4fcb861f8a0798cdab81374c3ad66d100e3ef15031f3d4205ed697c104463ed7fc0dd10567e0d4cda10b388bac5b0e810569de448f2dad50326d8459894fd2eebdf0f5b495837a5249c34dd9e67098116e9c4acf344de89879eca452248f72976bef9b4e59292cd51d26b58c9230aa8959f36abac03d27e542298a79aa6faba4332f11a4ec26facc6cadc13c60e13ad91a2914da8d37f567f7097ad6429888e63bb09167782ace8d5880a53807806c1ab26d9891527974ea53f543e659bc0340b7f40fc02b2e23b98c2fbbac84063a72cad6043a8f86a546f763f126292264a2543261c0d646658cbc3281898a3129b8ece7770fc5541511030ebf1407085f31eb4856ed6a64562d9aa42c5d3134b2b794c9befcc1755fc75cfb6831a3f8678b62d2c9e8e263e5b4e4124417b263a5af17a2c6b0875540c175b1441d25728a03ab3cbfc2d988ad4e71328ff0ec9d05aeeabc3f3cf6686e9a22610323abad6e31a609b24b94a7b94aeda76e3c5d35fc731a0275dd60d6e9ee145450fe8394dd5550406d0833651e832767b0baa3bbb747dc068111187014fca8dac8ddc8da881ff18dc52e8064b7d6fd372a732d93c1b3f2e48cdc6eb3607dca20d7e2c33eb4482010cf02c2557a9a01caea9ce87f185ded4e727f5490f08b07f40ff8b244996e180f7cb9083b0009771131ce64720b5d6dcb3ee84eafb80366843218c5b45152515e2fe7e1ca4d8d6cd41fc36f32644d13aa47f54ce3710f4867c73b8a38ef220ea2d879d7c8f906f411e6f56eee9881fd94622183ccff128860fa92e75a86bfc8bbb8f253dae615dc2714ee2cf832be5d23274985dd5c38fb82faa9ef8da438b82680b5561a871e26cc23d80eeb03b285d42c0d2505ad522e025784614664e7a6b97ba9efbb6c3ecc8906429a8640fc98657c417383dcd916a9aac6571a5159be129f6550ec5fbb1af8ff689577a7426c07135fa4cc60efb6c73b17f52efe515192ef2aad6d5fed193af2e2a064e26c73d300ddc46312a025a61b2bfd194f94ef66680a009e3315ddc7d7a93c6d9a32ffa6d8cc7250a511240e53860e7b8b9b2e705c5ce5450be6f1f64bbfe9337db3cb93b8c7abf44b6ee355d9b00319488f146f767c6f85d5f4e3b5b2fd4bd4ccaf7ba95b5fc99ddc4106801ca1d942ae8deaf73923010acfefc1930c236574ed85b6229214c167d753411eab0e8e3960b2fab8565a84f638df20e8f896d35e1e189c9d1dcbd6667d985a33142356fdbf1f840680870927f85d1fd30ad4f7de30cbade002a687e9078ddfffc3ba7b218bbc1c4f384af4aaf57e2019942dd0e8615e2e5dabb733c540b5d15fa0b664929b7726f00dee9f0f54c9f02e9702a6f4ab1c7774f310b6dfa9c880ac5b8f628d12dc3afb55f61743e55a7b7701486455c2ad30fbadd0b2cced89cff789ffe00dfa32b85ef6f7b83951662927af1ea38f91fafc696eed36a4f0c4297a63ec6f21974818407a838871e0a5d607becd7a85552ddf598442eb8528abefa937d85933d8567c24fb07a92b23ad20d619dea66e8882124ac2cad014db72febc15445d8b2b568a7e2b949d7d25a61127f58e33f0adf1ba937f30ca58f2985f7dbd89b3383193f562286f2bd1d2afcdfc83477823ec63523657d46098796496555aad632132e1a35eddc4adcfe9b76c8dff2c686d47afdf3209f791d8fb121171b28315d4a344087667d166581e93311cb465fcb26c886edd4802a1ea6d40c819d17791ae483d3752d5ad07939c9892269943a443844682e032e0763d5ca39bfc82855944a488dc59fc7dbb5678d972911757ec768124f9e6cebe781af28de12c75e0b9573f6ba78b582e75089fadb1f77106897211a695c3b794a15f3380aec75854e231805bbe2cede544162327b917d621fd28607bcc63cdcff6f119821744a45201c2e032d0398e88354f81eca661b8c748b9701c482aadca2c94945dfcc86c611547f90aea1b072268d8f3209f10a0a08c9e84eaa41ea51778a9d855fb40438648b42f9c277d2709ad43937a6a0c0a7b0d0b4153405fe48cf929a8307266ceee508719066eae394a08c8fc5f09bde620b2e681d9636f08a16aa6244ccc55a7144e317ddc5a8ada70ec3dfc83e784b9d42b6606fe17d14f3d4be668ef9a16e98276d8ca2f14ff7934524b9a85fa5c43f1d0ac0a48a70746c756a4cf7a3741a9f5a00e04c61bef0d768a1738407ab2345d1b8935438efd401f7aab265f67e0c587abd5aa7d9c4d528ef101a4eba224625dd2930736deafd209d345c199de4a1d5a8e9a13722746b1cf642cbfe3476135eb07301066ecaf530d33c9c973a425395bb6fe283e21eb81fee0e633c433808c08022deb4c8e2935f04095ae2fb182daa6455d48b7ff1b9a16632c10911c8eff180927bd9cb28f6dc227bfa8741ce57f7329f03928e9b2e1a023a0f7c53ca79eafa6631e2425c38965526373dc61eb6979fcab1af3a8cfa1dc077a5d5067336bdfaebb35652252e76c054fa8ac8441b0f092a4255a4cb5e7c879e0ca8d4e556753f941d4477afb03495fff9641b4af36cd61dd015b4b05a3a92b6ac911f27d59282b5ab1c17e59ff6df728a3e1b0edcbc16dedbffde5eb2537911f386061c73371f85fc809024b70ae6d50def3c7c1477c2b5c6dc6b57133d5c3c730192bb79c6583cdf455dd12b237bb7410f7c15b90f5892b0e780044d0a420e29502c5d06d1d97df8a5be665b41cce865cf4b13496edf8087f0891d804a96bdc2548d6d1d3bd958351578eb0add13921400c54d66d84f8e944669725ebbc0649470ca6c27f53f2da02cd04b90f856dd09500758443c706066e473a638e95ac26e783c3ac06b38d6180d8a54859bea7e6e1dbf9e89a986ac1eaf6aa4c1ea4d8059d769ec76216031adfdd9889f3de1718c9007b8454f82e64be90bdaece9250d1235b84d755da4244bf002a0dd26be160ee930f6de010d6c89cbc9a0ef7576f0826ef963c9d3d02432b180e03e4529c2f792993f97c2fa57518e3a17321b0ce5622de0e31be901875c9b40e815e07a08e9047fc3b9f4c7afcdfa5af5d15883bf2e9c4af10422e78f70d73b54078118d54ee15c0570d7790dba34461a270f0c4923f9266d37f9dae298c538ef3118c22cb1727b7a70b77f2c08218600c6f903172a2f4f419f961d7d05ef6615358ee621b93c9a2055595dd9544b0232a89341356a06af86d6d925bc891b4cc96e873eeabb2260709151df5f8656132effa24e1ffc9840e7e15c9d0561335f25c7c7521612fc8a9a33903b784f44a16ec6dfc722502b018666c06be774ccfbbddd2ea7f4882970f341b247e95b6f858dc77d3b477496861b15aabc94a06ec6bde1ca53daf2917dbb24b1b251dfe4d4b8cbefd40070b8450f21bfa8f83b4c89b3a87af92677330b8c843cc75197c76165ac47fff89098128b105f2ac397fef3549e402cb26c7132b890d1dfd6f8710c490990cac43d6a1eb27a9d817a82afdf0c9ade0dc8668f21ff5e6ba63693718ff975de45e781238920fa53a3a1bcb1e9bb4f8c2b739d92e06c5f9303edac7be6870bad4bdcfe58195ded02eb63118dc1d06c9d8b69a2a06384d68b96e0be768c11cf22fd004280540eebbf6f350ae49988df85a476a284e9c9aa0982a267421f6ff2f2648afff157fb85cedefd48324cb085beb65ba362895916355b3e4640333e101914e6b89f1a52fbb93b2ac167a5b52ccb9b5dd3a8e3e73a95ee1119820759e3dda67f2c8b2440ca3b35c20f5dfe6a61e25b22e0c9acf5e1af091f4aa48f85f4e8f824a3cfa957eaa070c6700e601fb3db16edb72681d739a5a90925682c7cf6951ab7bce5eb860baaa74169a0c56867953505be688d66f6cc62483eb184ab713c8efd9dfa9ab10346e65c4b9f8134e48e5ea50dee8b7deb248166e0487845cafc9b4ceb99c9e089e28130b9c6a2a27390cfb5d41edef969662aeed5cd565e2cf192be62753b18b385635b3323a20495e4de802272147f7194df2bc850339220e96ab7db2ea5cf9d6dd0c48399a7f83c00e7ea35ee56795b4e59a56f1c9f783dabd2c4df0dab839c7a28ee3406f58ea8f26e8386ad5d3a26314208385dda697e4c111a1a442a231ac9a7a3f1ec13df4913ea3e4f44cc91b09a7d540898be69ef0debfb34e683592076f5155f7fa01c985ce4507e63bf40d0580277abc87d0a3cb6a3b7dc11f32c7dea2156c75ecc1f5530d28752718fc8f290c336a7c0a0a5c78c8ea7696106e00c0ce43915727063df9a1b03ddf9e68a8f90cc78526e43ec168b6663b4d4419d88068c9642cf6aa776f4eb8947b87be539e681e9055d7e0c7c29267d2b0d09917351a7c278194599c8112b26ca010e1af7e500ea45867cbac90c0ea213d9232ccf12860d5a69d1e26a66977fb36766c5c850d7ac9ee0e8ca6b8cbf09b094e560221d9f6377a68c9a7da728f7c8567392f9217c5ff58de6217352dbb41d84c9fc7b4075a26e18714667960c57562317e916d8cb61186b1ad45bc94300072245f21bf847432806a14a59131fc8171f0d3a6d09d403f39037fe3e1511d0e0bd565d3f2f451ce6cccde78dcc685d12b6bfd366b367a7644762dc652acc2783b32d645e4580bab5f04613ba23aadd6933f5f92fe5d5a65249dd9b8cdd1256aeb0eea0a734389c552471f9d0adb35a3ae15b267bc948f9b6b86d215e1dd28d84f2c56fd87adf015de21cedbf109e5367c363b30539791db4eac340a057ef9b906134df484f6714a32f46ede4b14611c7da87a87e406fafb0ff82050f515b58cccf3a8a4ed6fc24f2e6f2498284579137fc64aae8943ff4dcaa84f159e75ea72669981393080c31d4648606256f9ab29dc62be278013a1c93eddf23e736aa80fe001c03bdad85c588b853a4a0ab97b18a6463a566a1db2e7dea6a471190ba492fdb0edcbac170c54ee78f4bd502da1247c558111407c001338ea724a09f3b8e8829a0f99eeaa9e56b825e3da167949b57af84ebe20284242405022568aa59f09566c40df7541b95180a703e27928fa5b3fdf298d87bdd02774b0c903b30608c057d4c68da969e17291bb29237485b383ae73ff34fda6b24b1c8a72e97d2e93bc96f16902d52d011efba24ede93cd078a071bdc9a7d61eda9333b63951e8e920500fdd1ae4e837328acd85e7008f3e37f9e583261bfb4a19ed52fae20ce95635197d146933d886f28dc2a5bf15231a669d0d55466bed44f5509676beb91c9206f4438e7187ef89288e824f38bef8f1992e2a66b3a66750649c8724662ee2adcce77ee5c62194fb194f9693f38d99f8f42f23bc65f774933f11dd2c1d0a180c75f5c70a1d8eeec5f08474d911004b690a214fb87b0438772d0e3e7f37937678c00d98dd2f90b2229ea5ad533a40f2ca417032b53e63baa80adee491fdd500af7a1875e30a9277031e01c9b8b1dd961c7e1b17ceccee04566008ffed6a6ffd363f98606f3cb2e8c4dda9ce33b1d86389ca6826d52ed59666daa93e04823828a093f9b027e9c6858a7e897b7e76600244e9443bceb72b53be034b5770af4851521a4f9b4d64d0006a80925fc2d40cee923ec99f7b7be17ef2e5aa2aee7fef0067f8bb248846fa9adb367e5b061b9bdb48cc25db940663f77fb8263481889ad2dd6b68d63181ca305d5f6959540ace190fe314a6e49f63e3853289dfd0de5236ef1c04cf5a9dcffe263baa21db0c998a09cc0863da1fa166479d4ad2b68d933e19e6e80cb1e2504811c2eec1a6df9684e4baf4c4dfda4b6cd37801884890cf6294d18a546b803f43e4627eb92a013e9c8d922b16fac01a3321910814ad4604d944d15d76aa0486ef94900b8d33fcab711725ab16974f12278f7cb2d0428a85a05e67048ad5f2e063b8e949ed2759e5a40f8f22c068dc8f7c00556b2a1c142847acb52658a49317cc68ade867f42f58594b0a4eb6549172daf5fa3c11181de2dccd46b920d0dfe39cc631a485bc7afbe807777b8f1a04657561783bd7547ee281cbe0e394f1bbd5f6c9e17d1c44a528806ab434021188ef2d201dd48b307b4104a5ea2f7fb79022f1c614e4798ef90fa0dc391e95f832de1292be4264514bf8c915053a4b032dc46ea2474ab464e78ab42b8d480d118236189c01913a25c55dde8be29fb0ddb0328b3ed3ae65944ed5876fe62619a7ed49b10038fd03efde1db8e72b624e60658eb947a55c5209cb7f6915366e2732d6d9edfa76a6b77b814108f2e0f1eede03ce7ace3f33672463ce9f623691112bcd0b0e349af06fc36200a7df3b31455e38297a6036c66b3766d121543f44cc4b5d626a0a1d0c67aef8ac038215afb58a7ab5718b3546db1af0b558a9aad67605bc0ad3b69115613145ccf71dea46c2518fde7f060b22ceb509222e2cd8c91976e838d440ae06d42878fddb6cf90dae79a1c3d1a7183106de838e146dae55544f367a85b01199e300afa3df968e3525689dd458d4ffa4d6e5da3ae1ad2ceed04304dc08831bfc5ce6e70c042e650316b86ca9cdd3f702fcb8dd36dc60e411988ee03728a56c8e04d880ce8d5eeffe8fe6ec29a7643dac21310f97be8977344dfa3f09aadda4b8f8a4d1236c9b18f5d6e830284284d6489f90ba043811b5a15ce6b55637abfd11a5977f4ade625ae79ded0ed91c43f62164c1989df243769a5b5e1331ca34ac9883bfeddae1998e86fac1d875c086b09998e44de7c6992f6a05679e6f69e7cf4359df521372f19984d85f24afb864a5e4acb8d4681af931850e97cc6b3a42a4119ce0ea7cf449871cda737d712726e0047f170efda1c3996ba522ca51f452617e5a4af090f672d989935f8481e98eec5687f36815efc91e1f660dcf35b2d9452eed28977bf8a073bc803468c14ffda49bbbae2fdae27675a5b42ba6c13f3c449061fa12d8fec7fbd7a3681adc070969cf8c860cfa17c1993fb07ea85647cfe08797785b6a82457da594694adea6121098a3d7a93e24e927fba7de2a0ff967e4cf29998ffe6b945b96a97534f471e2f7404873f6cc3c9c2959f08530e62b57d9e01f6c809fe5c6fc04fde44650bf6df4f0802697d568f8a952e7fd5fe9cea5aec9d2145946ac1e832bfb6eab20c3df28730a28721829eeb4f63368b4762d44011406d2226611899977bc919a9afe194d63ac57eaae15486ae38edc0c16fddf000b0f25a49571b27411b0f5b7a97da585511b15b78cfbc8db691a36ad0ce35d344b4f137fc4057081f0ef551651612fa378912e289bf6ef95d7578516b70f89a3db8c5207d4403adaeb7b9452442e3a919a506920c7cb14eddf12de9d7b7b5f363fb2b366d2185d6b188fe436b10f9763e47b72e7436cb1218f00d487bdea2a9e4ee291424e4d64cd708cee61d63810350bea01e9de0e101b043e83e89bbf631d6c5e77df2956ab317ff840a256730fead8d6ad529da03395d890163cbd31305803ba8749aeec8bc6ff8bb99dae1d29ad9e9a6dc0a796674e5849ee6926d6f4ef2368678e9ca5747620e0e004b14870b3ebbab3c1ba90644f1e7c1f5b97fd68ca7610c1dd1c3236b33520f59aa638ce14e34bab22982d21a8d3193d45b1c38ffa5ec7e59445b420af3f5a3c84dee49d71b2a399a45bf98346e45055e76d2ebe7fd58db245f29f38824154c4f665b066506826037f7e5dcd913a5a5c314aa996b7d2b8f9ed958c5b459f0218980557de6cfb9b45331b1b3fdd596b3fe8d46244bb586b65863ede87e56daf9edf867326bd0f9a40624218da4f227c529ff0cd9bb0dd445883b6bf27b055fa8141b4336bcbaf11cc6c1f1e26c51d02d934c021c894ab0fcb494e0b6b5b53595facfe64ea3eb73e56cd527af032fb7e728859ae167fdf678d09d3d1d642dcf8f12abd16b8b430f51f8afa9f98bea87c7597941b3d043bcaaf6c5fb3ff09aced3b55014276207854d65d66ae82aa8e1c0cecc64b608109695f714e306f4b006464a996d0cae67e1622c8eb54312ee1ed9e6599389b3fd3ff87e2e1aeb955dbcdd9bd95a82ddd103eca66913fbbefdf28931eb4da73052c0967bc4ee2a5bac6e28d713b89067885daefcff87b78c71aaa314bcdb2f0128ff67126d3c7b4f24c827d24581e65dfac5060aca59d4fa53e81d5c10112c762a46827e6f2508c1ab8288bfe75ab91792b01b7a61355b742493905a4eb393434f9999f852ff0df71ea0453a07a8a5b8fe755f27c3d42e90dc72c3af83d105728fe411518a038c2213fc7162dc992cb66af3ece030754193332ff9fe158f52a0c41bf52b0532c932c06cb2de755e0dcf9da24ab38fc185f2149691b2dece608944556050b907a0a8c34de65afd7041f799dbda6da73c3fad7824c435cade0778311f0c20b1a4e6881d5030ee1fa2aff97d742a60b438058f9def53dec7be9d77073f2dda5c3c3cf91326b320f3aeb78439cdff06f1f857f2ff0b1f95ea01e1fe1e92fec15a5418258ccd412b421e28cb6aa085d63d63e80bce06a9e9d855f5c62ca0f2f936349202b45a03b54258d2c36458ba558391f92b846b7eefed5f20097233fcc0a06979f2f26498fe6f87e5ed638d1484be635b3a0daeafb601e4d91dcff219cb686b1aed527e9962fef72077522616520332165d1ebb3c42221b3c1096d9bb3fc49078913394c503ee536ea14871eebd74e5795c4337b1b3d76be051899e92730acaec3baa46426097dec22937b41277f27a699ef57503dc3684577ae35b15843a6920e8bfbf1d6c28e9eaa56739934bec5c45a41d232002a8d0765df11519a720fefe78a7c82482f35cfc76be4f17967d97d924234918a630ae45850a5e13ffe6e5c09ac00a90cda13ac9ee15d6a281c1edf574e21b09de2a9d2ab8b0c01bd019593599b25f0d72c339ed03c6c8feccf7719d7a393f0304b99b2325a5f689b62f4989ef9ecf104508b794ff1985193cdbea444f1eb59ea9333ba8caa7c9c2e7817045e6509fe4a0b5698eebd3946960a8b36fda71a6774e80330f25840e920543088c4c7a512998a90ff31ff1360bb02802f284ae8f5f5f958b5cb0a85db1fdbc773aa7996b4f227d7d467d5610df0350ede564d25d536c10c0d2f968271ab39cd658cbf835501ee549b3d55f61b9adeef6f898424f3f068caaa262695aa527e47e444faa97519962aabec1da6449c22be15d8b4861a0f930d84748b746ddd5b4ea9dfa211381f465fa9688d89fc74249a566f2d90ef4f179badbfdd06d56eb46bd5e1b57f1d50b7924b0b16d3b9b22de1f8fffbdab7a8a028caae8209d6302ea08a0e463d074cd9a599e84db2066e2cf0cbc9e02399d98ee1e95ff7133342068d5790667474832173c8864a8ba00f6ee18c2cad247d24365de9d7d2176ed1394193a6d864a4c94680fb209ce7cc25b2681d1c70965fd6a4c92d3a5d6fb1940ebcc237707517b97e8052ae5af9c74882f46f587baf9735cef9e9e4d486953b71a8aa266922eb67cc4f2d4a0a98b9209a69ed5a0d4115c86abee09d419635dfd1d6fab8fdaeb8e5bcc6167d94cfe0c3293a567b9c20c3050e87c7a6856d30a83fd2b71439180f5138dfd0a9e1db19ce8d518791c767b6110a38a22e115ae83ce94eefeb11790659a80be78be36ac5f668dfdf055a587061c3f05dce2a431964316479003820db42c7dc8ea218f77b351250f770867bd76661f0771ed6a1af14d5d88b2d241c0e49630df953447264e14d05b6d9f44ce9aff4ce0ee3f43aa265f42019c2835365ae187493ebedd0a31d38e6d4b604bfb8b5cee509b9ac3148260fcad41b4e18d0418b825b9f1628bbd7bcdfdfedc101427c476c8dcd14c2e7d7a1b48a19b179f5665bf7d7a0e1d313d445d357177d7996d3c03a0b8923d38da30b1eeb19f0b8675af343e74a1daf4a5845ee9ffa66a4ae9cbe06ac001d85dd1828212e4d41e4417b0ae6db8ad4775075bc347933aae100d7ce54466faf4eba1ae854e2cb6531d304991d3672b63ced1d865deeaff81413cf6bd7bc1e725658ba6b43117af352ffcb708ffcf1a21959c920776b520d255694b946db2ae6656012f69f6520359b77164004aa90cbf9d11e93a71e0a616b14013b8ee5b0ef29e9416bebe8d865713c726c49fb20c8ddc1534d6fc22270b7cc7d022b47af5e972377bd534707a2a9dd11df3c80c91fa8cea4f3c58545f6d87108ecd181e8ff0826fcdb0eed0274990b9b20efd8cc434c3c58a326dcea7d6d51c237a46ed2fd0203c832453bcd9797b1b928a22cb0838258697ccbc6a6b0c64728597f7ae37e1c3e2289c2c2a7a94811c5e1251d3b0f4b780aa980e847a1e026e663a8219273afe16c6c36db7bcfdefb47c90be52af62b95ea2cc82e0e6b4146a407dcee589dd5eb05a7b4b8c59cf693a409e7ba4650b1a7f96449d4df3ce4b75654f71d1a37bee88d574a70418f58680e964c0a23b76fc8537a8d62346e29180d74b153bc721faa4529848d9ace478330f575c902e37d9508681f7a827e761d55f3279e1ed1e901539933af88dfa0ae166e71425f88bf496c06f5af11f6eeaace5c958bed794c99e51fccbb9ecb718220974019e18cbc539d2d97518c7f424bdfdccc9cc4a2529012a58600459def7374eae032814fc4ef2f02fe724d359aaf71a0f2e307d06c404be625c8a4e4904ea95dbda6ebfd2ddcc119256e447d57d1498fcf1243654a374e1e0812084074d3c05e975dff726a86fecb2d6eb5abb312eddf7a5e74e1a0e5db2ddbc85788931438f9a1cf3b713127cc64be1b755c79980de770ac7e15fa85cd77a80a5f787ab0bf3fc6004d645343084cbd5de0c2a2717b1b05b37398c8c70650bedb86c45f5542208dfbacd72df491726115b787dbd724cf3c4afbc120b166d8e283ddf0df214cae863a4b10444edaf351905d55a829c8f74e596a800acb83ad1ede9e2add5e803afb3eeb7272fba0d253e1753b0a77544521c2df1c9632bcac348c736a9b8f73350c4d618bda9e4daad94739c686e5bc76f2ef23f8b40133d8c49e269a8cce6f4b82c29552724ca9954303ee7d4ea9db324473fffa2e1f0903e8e0c808434a715d82a985e28184c717c9a8688fca0cbd1a1965ecdf39e351b69c57c17665e179771258ef86dd1db9c74c37bf109c66cd9a8529d22d203948e8c295684648960555410e826bba16fdcba81f253af423cdc25bc47f212a2c15c52bd2f852c87d132d1458acc7fe29fa088ea38688f64bb518f2a59eaf1c39cb5f85c97f43a29e740aff560bd47ccbf5daaa888129c6bcc99bd6338df359b37a819f9f07bd78a9c9c8b49ae905457b455705126a55f0ccfca358a9c660e71dd9c948e44e720e4f547fa00b07aa07d84cbd591f515df5a34b584a9eb7f97a5ffa9ab18961a1b427ca9bb9278af9dd1737a1839020d825614b466e2374224cfc47e1e317a51531c8117de5e1fb91b626aa8a98c61f75513e0f09d0dca138e2d8af189b17da786c9426559efc63886d324358f0d34e731e2fb648e9489adff9bcb038fcea9e1de2d591af59677a0eaffaf5a176db64070c8c7d8bbe586b67681ab86c592c4d8e0043d229ae65686a0d789f0c7f992ae2dc75cd4f6f85b867f0b2357350eb13839b333f1b00e16eea5a8159f171524f0b5cf8cebd175cd4de24d0a1d49da36e458c7510fdc55c86a436a453a61ea1f5f23f9dd53b02ae72dd21bbf80653394ce814084e7aa0460867f9aaa257f0d629739a988e4f6cc89500f04ddab53a1fb584ae6d2f6d5d0a85f9717216d43c9730338b3bb895a27b74509792ddde4934d690c0af9b011291599f01dd8abd2710d8518d77f9cdb67490303af224bd657d81eae17c027cfbbd8ea03a4812c31e6d5fed1f790f8978f2317a005d95482ad35b80b24545d8436d0ff7d5a19b90549abc27fa8db78d15e7173d0f61a13ea13017f86f93ae5f6f3784efa29ce41cc74bedbc1df8e0d425a474376f989ec513cce25d0f8b6f398239b824660904a0ae5b2794e165bb41f642d73524a876064388f2cb31fede14a1cee22c138cd5dcd76044285c2516f534dd294fc14e65812433174178182a7372cbc5b8d790a1b050e3e053b0541713b962b861eaba1f3ea8fb3b1aae501d2ae101b8eed37d77c1d940adae43dd81d7efd04055bcf624bdeba958c5b35a9c62150d32f62e2c267f0c41a7d9df449a41d346b0af982f9e071f5a3c3ad07ce5c8f2ee37612d52cc3d7cb15dd84cf63d3105d75623b6f225b596cac87882a60e2ea4195048be8c53641c317a792d59b3594819e6445c0b366a6908a88f37d1808d10bf05d41c657a8d54e629f878c8f2f7037a4118325ad1549f4d0a3cef90deacc825fc9395ed542417361d60b6296d23de0b3b577375ec9fb63144e399fcdbadb43d466d8b12e8a4c235fd081c1d02ccb238b06f756fdf486181887fdb1a213c988ff5472847dc0f76e0334d50055d3182c48a2f16c20bf0c48cef10d56bb415591a2282ddb2723f47215cf4a435d09ce8d682f0c56bf0d8380605dd879ada4d599d4e832b4decb813fa82cccd8b17d20e1c5d2d838605e10974ea82b27b224a67569c2471d9a400d10f98cf4d3b1f95c6e45c1c3efc5e1ad425df22852e9eef4adaae29a4a45dbb86abc6ee090e1369de0e1851ace79806dfe47f98674d018418a230c6a884ed2e17b0204cceb35f2353814873ce89c976efca54f8091fe98ac33e1bed7d75f52b9bdda8374e6a93ec09cacf871282f6b646124ad3f1e84959bba486decce4b2380b4834b2677cec88fc173c29ad6a5c662de88138cf246133519b3a150181a88180e8255714be3fc2b76bacd293e949fae46076b000014235b5b326d7b24c60479108ca72f360dc2f32325a8fb3a834828fde0fe6899f91c672cda2b52aec384a43a843f52d97ac3aa280f0a59d932a67e2bf7a9520df61db8a41bbf940fb157a81aadd1be3fcc47fc0d69c61f45d0a689ff1fd03b69ee281136537fa3013d3d3b9ffa9ba4ac1b92b46e82dc33f6e9fa888d0b85c77eeeefbc9db3aa73faae15f1653ff6c767b06a8b7a04559ad6fd5d0255cd50531a7b4cb7008aeb84d17b4b47f9b14f1e40bd0f5305fb11de6428cc670266530773633107d575a0b80594c023373c4ceec3d45f0d8ba4c95fb588b1eb4cb7049af3650e88f95b5bbfaf9ed25bab6e2bbf67b8fe66383533d58c2fac143e47473b104232161fa8825468e05f2dc3d66a2bf0f91088071b00b89064017974fdf7e1c997efa1be223641eeec512ac35d3c0e1a3353c99a2940c4bf3e61c74c09853f7b3b7b3fc4af0212762bc33984d74e3ef79f794e7f44bda5e6ce44c75503a2c1a1c35cc0e890066c9ce3c1bf6671014783aa55261cf57","title":"924. 尽量减少恶意软件的传播","link":"https://leetcode-cn.com/problems/minimize-malware-spread","question_id":960,"issue_number":80},"78":{"day":78,"pres":null,"tags":["并查集"],"whys":null,"difficulty":"- 中等","description":"```\n用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。\n\n网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。\n\n给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计算机。请你计算并返回使所有计算机都连通所需的最少操作次数。如果不可能,则返回 -1 。\n\n\n\n示例 1:\n\n\n\n输入:n = 4, connections = [[0,1],[0,2],[1,2]]\n输出:1\n解释:拔下计算机 1 和 2 之间的线缆,并将它插到计算机 1 和 3 上。\n示例 2:\n\n\n\n输入:n = 6, connections = [[0,1],[0,2],[0,3],[1,2],[1,3]]\n输出:2\n示例 3:\n\n输入:n = 6, connections = [[0,1],[0,2],[0,3],[1,2]]\n输出:-1\n解释:线缆数量不足。\n示例 4:\n\n输入:n = 5, connections = [[0,1],[0,2],[3,4],[2,3]]\n输出:0\n\n\n提示:\n\n1 <= n <= 10^5\n1 <= connections.length <= min(n*(n-1)/2, 10^5)\nconnections[i].length == 2\n0 <= connections[i][0], connections[i][1] < n\nconnections[i][0] != connections[i][1]\n没有重复的连接。\n两台计算机不会通过多条线缆连接。\n```","content":"096221c0597d8bd7f7d11d52235efeaaa328b64dbf9baf1fcccdf9295d02033616120eefe38aa2147f4181d103acea1232e5f7406ee4922d6da907ce3f361570a36f332bdb5c1e0d80c33822546cdaa4cb6387621252e11ae945a3022625595dd6fe26630bbd8f3a39225d30e5ddcdb86ad54b2d3e07f0ce30e4bd863cf908af745fc7a0aec6c7a39620a8618513eb7fa1838a7f97b4cab9463189e9272f78da91f6bec1eb321ca7b78fe67e47919683ca3a0b12b0b795a4349fe57649f4303d5bb87df3575627e02a19ab8780503871a23ecf77592c96920874b1c83131729abd6b3f9995c867efb42a45be96a0fdcf40504fade7e42d0a3225900f32150eaaed7a8687919062a04b69500cc74c5b47c4d8960cff348c47b2ccc419834ddd3e5109fb4a820830a420a43d4b1c977040eab83e9f1b3c8b46409178119502b53a1d4bad940a325b7ab3ae6ecac9d84a482c2a5a32496b449f5aa01968b9e7d245471112bf385ac0413c0245693e68e4ca1ccbe735a053383122667cba28a5a909be6356206fdf35a44c25a37350b15428d94d3695c5bc11e09c2d5ae332327808b6ad435467319c3bdae82219adfad25aeaa9e8c7a56ad403781628e9760cddb3e77bbca1803cca0b7df74d592f0d727941cb2cdb9981b7eaf469e99779242c816dbc0c0b5ac5c441eb988c3e01437493ccde8f72e3dc65e1cb46a078988f6198bd7f4303462580ae03fb1acbf585cd67619e8d9dd77f0dfb054dff94e2e5cd9d7bc994c7f6efb7b83e4b65cca1d9e42341ebbcd8dd05ed4d1ceef5f4d1a15534264616b690d4cae57b6f166c2ec1492069aa1ffc2645a86096df1a2b87921209e4b93545cbfcd1d2ceb5ec3dcfb74e0daaabddaa98e5bf800e7b8a1848652617360043abaa7c8eadf54e5527d03682e588080560b77af63eac34c2db76d0f0890ec72076c44c0e0ed0dfd0b16240696cdc13708d4194f6f2d829c353b6ba33ded265fc3c454b965ab9e65772dc209ea2db71103801ee0815e39e7c5882f51fccbc4b957372593bf4977e38667339c652abddbf7da5186a503ff6b023cca53bba2c7e3cf7b509f63cbc69be8f11db0a7dfaf9102283032a4ac8256116d313853674b417b3dd45bc6d75e92ec8a300ea3824ab949038de9a5a104a19b68dcdeba6a3cff687dc354e5da2f0d8407f4e890d90f383f98514288e2487e065f35149f8df8dc4d9e9d8cfa87645c8dfc28e79dcc793f2247dfc81039971a131f93b22c44d612a8df8251c6335c9e0aebd570a478295ab89404140fdd394e9d38aefa289f915acf54053d051803825b59123988af04bf624f80b5881e496b459bf70ff47b47a212b29dbd31979737528a59d8d4b630d670f11d2ffd894d34d89c39669f724723058982e74150b57b7bc777dba1b0cad4c0079baffc2592becb6245eafb13c312b08f0ad6626874ed803a078df12dc284676823f37e7c37b1bb8e7d271510ed8c2c1ec4d0d0056700a8eb37f1a3b66df547c445c4b56d46281a3e8e52c15a310b481da0a03b166c6ce0e4649f55f90dfeae61592edd534a6d0590c5bcc6802b9ab3ef2ff221443186250e997677493236425fa203bbd6102704cf1f59335c4051b343148fbcebcf8343fc7c04a2444e1dd0b77a8d1191405408c7726916c0771ecdf9c930078b2674b32edf88ee6736d8d3e4fcfdae9e5a61f1c40b1711481aa4236be0284fdaccb3609a51aadc71c09c8c174af377337170af311bc9ac4862f5ab87261a54662717d0cedae71b114916b5d2a56d9d6b310e8eff456f9355407e8b56a0e8a9e421efc237c3baaec3cfcd5e8cf97005b5363928c87b18789beb1bb2aa9b527a773c7d4e7c17d133defd9b8cdc57d6575ac9cf53f7123b93bff7d959efc215b697a016d72842a3c07ed03f00a99298024e6b16d690f4f7a0a969b4aaa602c7a9c0c2d22f2156794b6209347a5801c84ad00ba76510699ac71e0985c7a530706d935df61d117da4f15d788376314022da34bbfc016d17fe84ba95d6e2ff28e8a3720c234e1bccc1ed65e8c729be563b705eef006dbd3ab47548d28657a74c124d1b45a0dd24d8b6d9c131a71bb39168f9984baba863c4d5e9ff8032f3ba984858d0f5d130abc06b0fa781248667f63c14705c0c0c702fc5126e4c7e6544b09d170cd49d4493370fc2d549145ab9f7366c8e60ade774eb3609becf9c8983f4b4a97228c3689a242277a90505c1d7c345e231418e722a8c4bd62904fad6f802ba8dabedc8fc5ce4a5934ac9f0c2d108b714809f89a1ceda47eac9be2cd10e44180fe2cc3bc4a95ab52d49d68113af3d19780a38e3b4b86256af8ce5677e9f3299e7aa693dca593c62ffd4474bb4a592a438b68a9758cfad25afb56ac1ff1379ec253b1e0cf5f72158910911c2c2e32bb07ae6f6a8dacea7bd720d199a1ca51d4f724448be93f746e68f403b87c4ca3e63baf861ba59d50c8cd5c8aa00a6ac70f0ef99c83a1197b5aab0e8fff1a2d50d9acc5274d85f8c66cff66ae2b4c2d3bc7cd17c14ac1876554b7b252e3254808b7f9b55fbe8a33b28dd9fb53970e4e16ceaca516b2daf891869f87516ceef55f58ea135512961042a835cf89ff5d0ff403e390342e1f2820c36f050236c8ec0b492bff007a5d8a003eccdc72d975b6e95d0bfde7b000bdc618e940d51e46780145e1ad2da7b2fe598c6caa35574c5c376fb12e7c4b7a12146354313c7ff4b067bd4f56533b9886a03941183675120fa6d1016a7ede9eae0ff59905e5fe23fe0a5a4ebf2244b7714156407554149d91b2bc34e47a6f96d8b53158240c27252388069e990474ad92f4eb459022069fe3ebfee1e2fb5809369681650d20e8fe32ff7ac41f6ebd2422416fc8d1888ee63bdaab75c93ed4658427b534a87f7f23194addfad8fe8402cf40d39d3c95a832633c4aa42f9c8218f541480ecf3dd041228bcb9a8c6a2142c7e3165614925fd7f56b636161c1a144465ca2627d242468a687338379d9a0274d341fb7a65316da919ff1939ccb4ae507eb70cb389304cf167244daa3ce8adefbcf6cc5972b32707bcca519ca0d1a8d25b56ff32faa867ac0b65dfe6855dec08271d097df8f33230d8a7cfd1d95cf7dde22d0602f6aec2f53c4083d4b4d086e1e100c04da3d7dcf2d0e7f6b32c061ce42580d8262600db493529fe2cedf4dcf8b478cb715557b3edd4ccf431c8a7395135d627e892829807c557bdcb23074029508f9a34158737c164da8723a0d4c54bf309c991e566d16499719c8928282f7e7724c9daa48afd6874e2481179f9dab28dfdf4652522f1da568d9609b9c7c148a10928fd1bd42f4cfce96c11f6401e02e7da2c7a1ccd2c6a9519d2d58d82910b3829262a4a219c9320602e4da818cfaef5051be5400992fe1d1ccdd13831809ad91a2900e8ed326025501bdad366cdc9277f501137199a6b48d8c0a43864f2c87e22ec8cf0f7ad701b01512772bdfc862443e4f9e47e09963ac84e6b2c84879ab61a6120efff86b49722b431b62942660254360535f222f40c6d27a2acec312969588773ea45d40420528e6ad7763b6bd51d69e6e9fad1341d9f168c581561f3864509ba1c10649b96db4fdfe110e8632eb1b06d9dc213b5d7605100079632153ec7d79631a725f5c1e00656bd25728a073bc8df4639696d1bf035ab672af8727a1e2d69dc73f8fe0a27d3a326ff49fac542b9d7df7547f829ff076e3c5d35f9a5de1731593023fd8a8562b2db030799b015009d8817c0afe69395903eb37bb3674cf7a0fd967b58b6a75603e506e0f2e75e818970ce6daab9baa72ba329e33706f661bb5deb44904d9ea2f151f29b30c8e1a5e9f63285cf7cf6ee7e993c9a8f4b798a674a6053913fc785bf9906a4ebca7c9b98fdc8fb8449f685142af086efb93d6a1abc8e3e98639551d6e8d1538556b1ac4fe3d53ea9693cf56f602ef3a11852bed3100a54073a7d2073aabddf38f29ea61dade4e938b3a3f63645df5c3881fd9143f123c9abe66fd07ea2b21d06bb5d6fec17e32e63430ad7900a7f7fd01b7976174855d9c8d82a920eb94ca847a98f861113324fc71a1239773d4eead3b256344cfd75b13d17bfa1252145b6054486fa3e1f8d1b6c3ecc89e2968f86c079f8f57d9096a34cb8b55c2876c658f47d4ae7d83410ed8ca8bbcba83ab1e2e316bcc717cb4088356f76c32e32d0befe50b4b3a97fead8583fbb9e6682a0e0f749533794398033b0010077aa8faccb7d353eb7b80e15bb13f55d8682eafc6d4a9399d7b888e2046063149e5634ae7b8b9b2e705c5ce4f59f133276da7fe833f9628d93b9c13b74bb1e47458cb2a47c888b209a22992ab6e574c3b164fd4b36689b8efdbe1f59986a85f3a018952da64ad9daf68996353feb0fb123ac236594cf008066d64146b665f3411eab0e8e3d7072fe9c637fd4278c3a14b8fec387bb5b2f2808599f01b7cf3cce531047c219ff9e46368096d9239ccc29338ef46679405a1f42a2a682cd52c88adb23bf5f74bf5a5d0a7e0e74be37d8a78ea169541c81581aa9efebca0ee643b06ff511c1003f43e2e538de985bb05d04c8f39646311cd8277442c4f3996b6f7758cf6bf7cae528fb5b655582f6b30f3b76d14d50008228960f69b056a8f8cd4ba6cd0b100cdfe48cbef3d3acdd2536a8f36a78636aa56f58396f3d331122668d3ef7880c90e7dce9640a738cb4509586833e4c6a84652f7f598442eb8528aeded9a6fde8732d163c253b66d9ea038e8196f87f23be0dd2d35f46cc10105f679aec14a5891b8f07eafa7ed0fc2e84468536d10b77a4f9c60b406ba63a58238afdd9b98db19a9737e5326cad7fc1f2eb2bda7264c9a09877e621c7b460eda8300585eeed02316275a73f7a20299ace07ee094948fc5d433b3a720d26a139e873c17553e3745497e0e8f7c615379f6b10775b53d22b05b8c80e49a9b2114bdd34b9c8b523f4dcedbdf757453ca533980cf2261da3a497e0d6430453448309bdc3fa7c7695d8e0a40c0d3d19f93ef229afb27573c3083604b46b46cebe7d3ea7c8b40c01806d72d90fc76e6cbbd1587a9c36133552ed674563d54086f0f5aac5743be31d65e211744a6cdddd51e123a6671916c233fd09b40b4f97992aa6e45bb3a5e4a45201c2e032d03dea78211bc118a7421a53c8d8a34cc9f9488f686411cefccc5895f1a3ad3fae8ff3c75d7ca2565ff5943528c9308f33cea5a6adf80895cbc6c22639509d7ca66e01492977679e8e583f3bcd3b328243eaa488dc0d48b1b7f12a7aa460a811be3f8bea08c8f96b5d7986c10453c55d3648bcc4fd7301c98d6501544b659948ae6cbee4087d18b236907d64cf4321fa40652abf4944793f9f22b972d228cb8ab7fc29c5317f5cb52ad8537640ab3ebc62520253a74039fef3d599f570bf24c6fb9eaa103ed24c555ee501583ad87527cf5d24df8e8e659d93f0c5132f878bad98b846ea6434e35f36c1258f07072766ae0a91c9231095797e4bcc5dbe9a1375f336211b36882b0606c395eb07301066ecaa12ddc6f8fd401581ac7f547b0e7a616b135c40e633c433808c0d42cd8b5c6fbd2440f475cf0b54268ec6d479aca76f783bf5320e2133bc8eff180927bd9cb28f69a6d6fb5dd08ca03be359f4cd3d0c76b5b4b2a0f7e0d8438a6a32e61f1615522bc5526373dc61eb6979fcab1af3adcbb4fcc7ff1c12f7b1bf59ca287363258345cc054fa8ac8441b0f09776855a4cb5e7c879e0cf5ab89582071dd520a7fe6ec619dba9a0d1b1cbc25921d855bb4b15d6692b9b49f1464878fc4e881451ee5c4dcdf728a735a56a3ef5f849ef39759a8176436adc90f0173371fd3b9ced93de303868227ef3c7c1477c2b5c69f25035a6e087f65328cb175c6116e91501adb2a6d63eb1671385cfa5b50dbfeb3892e4d0a0b482958742212d1c429b1eaea320277d0a763d50b475b05939aadf0891d804a96bdc2548d6d1d7dd318204825b56e991bc7520e8304289c47c7da52177b5791c0649470ca6c27f53f7de17ed64b90d06bcc0d0f596a6d417b6066ac26f477a60ed944783c7c8f39389f1819ee7ed7daa4392b15f3db97f48dae1eb823acc3b744dc3a992de43f6f3431f5f4d9d3b574a771cfde53c30306f9af36dd4dc4e4a03f3a0f35e80c2718ea70188b5addd426e53c4da67ea2974f5829a3cbc9a0ef7576f0d02bad369bd4967c7cdd8eb3771f6cb9b1dbe276eabfa76351c37b4f4d4845bf2737cae34ba853c212cf13934d9d7a15e94236c0bca4e8bdd6e551a19f238e8429d429ab4159a1c60b9e46292d8118870bb509573ed7294ce871084e743d1a707d8b267037b094abcc8c24894a51bf06c65826505af73f6c2259a024e3ab2e582724112eedd6147b46f6787b2382b475e7689744331c4aa0114b4b7cb19541226729fae1d69965fca3676afa4ac80fb9b6292e44bb41de4d8048171fbcc40f4caf987ccf9f07f41c713e5f71bfdb1b5846b2df883e8b3d2c1b75a144909a84761f7937cf289475e72389b28ff372f5baf66070ae6bf108bc153b9e8ded76440538dfc5011580bc94a06eb39da6d115c7bc8b74d839a1a951cdd2d4f6d0ef9d0b7bb1294073b7e1b66f4cc0aeb861f96f6b3345c7c5278914cae33130ff0f80bad1db02a9595631c3bdfef3549e402cb23c3060fddec69ed3e376442b4b9f928f1f2317a97ab7817a82f2f50c9ade0dc8668f76ec5865aa62c86f93e573a94ee89668c83df301eddfbcfbe0914f8c2b73c0b8e06c04b903edac7ba5c85ee31fdce3581e08b928bb2243c8d2ae059d9669cee92dc0de94d0b2d076d95f866db3080bce000ea2fa212844e0d89093e1f01ca299b2a5e347c6aa2d4b046f91bc308aafb005becb9ab7fd557b4cf19bbbec57e42de07317285b6e071276700d3d49cce8de4817b5ed512adc67e3fc39a59317dab3e3cd3a95ee1119825718f8dee07b1689205cdb1c61aa6f5db32b63e64733c494eceee185091f4aa48fdedee8f824a3cfa957eaa033892509721ae9855f80ff72fa8778f7ec477101517cb7bf4df2f5a2a3d270fabb392cee91021a9c1f0594688d66f6cc62483ef8caa45b7ac7b3d9f2d3ff5746af55619f8134e4de1ff748fbf506bb65d323ae1c1138cae19b4be282c0ebd5d8db62d688f6d93aedcfb4c91e97f043662aeed59a13176bb9c6c5326f435dfdd109263328bf04c2a197c76a266f7f7194df2bc84207f420de6ae79a7ce081c9168085d1dce9ac4749cdd267a9342d201e18f72a52cb1140b6c2c4c40d81ca9c6728be7554b0c0fc8927fe9dad777969640c5c3850d7727e66114730442a231ac9a7a3f1ec4ef54941af6a1a168291f9817d7e4dd4ed2cc50debfb69cc83592076f5155f24c352cc5cb7192426b749fa580277abc87d5a7dbfccf9886aa36d2faf6f02ad23cc501034c687593f98eebcdebd2da7eaa0a5c78c8ea769615bca0c0ce46e503b372ba1bc5042a5ffe49fb5becc00002241fd1683603794ae509a8f0491bf25fe6a8d76f4a2c713b836a472a3e2a64b133b4f7f292b322a1726c17c0fe2da69306ccb8a167d4989554148ebac4ebe5b987aba8a4340ec15d5222bd451d81f5a18fbe26a66977fb36766efc8508a869ee0e8ca6483bf09aafbab25705c960c77f2dedf71e77cb6c05b3d82a32d770bdfc4ef0b7352dbb446a1c6fc7b033aec205d655a6795070c062c10e11ac9e2282c3907d35ff258002d2245f21bf81c69284fe7421a5c5186525c59737206d548ee8d16f24b1c109ebded0d187e743e05f49ec1e489f8727326eff3bc68b34da7644762dc652acc27cab330364b5087adb5a4304bdc3880f76933f5f92fe5d58c0f63dd9b8cdd1256dbd6bcb0b56924db4e6d40f9faadb35a3abc7160349b40f9b6b86d2f0659bec884a98d789f7ddf101eff5c88f143900075b326bb0c227954bfe1982ff402bdd590367196542d336fea525dedceb14611c787f8ee701521cca2aa8a6c0353544edc9b008a4cd0d324c0d3e26fa4d4419c35fb62f396dd70ba8f9883d822bb6ae05028fe44d25a49428436c31a4b67ccf7de9264b0647d7f5fc7a28d3fae78acdbb4534e0aefb99383d7f15fa4ebf6d5f28d2d07f178a7db6733a33e2450dcb34929db53c79081308564cdaf41108677d4fa679dfef4c23de1fd77456ffafd1f195af7e5a79726097b8638fafa03fe5321f32d53332cfe5abfb8e0dbaccc6f807d53991984299dd248e69689ace9332b28207c3d0748b87da05d610190a6adf645b2e989ec775023b5ec817212f9fad5c2ff23ef40c24adffb2a277fb34f471ce3458ef925b48e5cd50e77835d2eea52bc35f778722710935e56831efcc87e7692fec9629f2241a9f43d5b4c50944aba9a761e29a4d33cdec90c1be8910adb184710b8a6c533b78ebec285fcb6dabfb63e9dc8b2ac65e10a79b77ebb5f3ed840952ad926b41e794db02044f0bd78513274948ea03f27a1e5f4020d864c23e26a457db77852e41056dff234563c4519360a6e1ef177813d11cfafbe","title":"1319. 连通网络的操作次数","link":"https://leetcode-cn.com/problems/number-of-operations-to-make-network-connected/","question_id":1442,"issue_number":81},"79":{"day":79,"pres":["二叉树","递归"],"tags":["剪枝"],"whys":null,"difficulty":"- 中等","description":"```\n给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。\n\n返回移除了所有不包含 1 的子树的原二叉树。\n\n( 节点 X 的子树为 X 本身,以及所有 X 的后代。)\n\n示例1:\n输入: [1,null,0,0,1]\n输出: [1,null,0,null,1]\n\n示例2:\n输入: [1,0,1,0,0,0,1]\n输出: [1,null,1,null,1]\n\n示例3:\n输入: [1,1,0,1,1,0,1,0]\n输出: [1,1,0,1,1,null,1]\n\n说明:\n\n给定的二叉树最多有 100 个节点。\n每个节点的值只会为 0 或 1\n```","content":"096221c0597d8bd7f7d11d52235eceb6a3298eae2e3e8635067467257d1aec869d38e07a6e89b73092e62bf8296a4c9732c7e64065cc90256c46907ffeaa78c83ab8949812343b76d1fb4b46541ba5b0b22ba40f74538943c63fe53f624a660285ce49f581307ef6accfecf850354d6daf50bce6beb10d46a428316b9161fa4cfe8c3b245c7a407463a77da24ee422b46e6200b17a280d7fccff0478f5a0fd0a5b761f3966e8cf206a622e948219667ba3444d55bf543d1ff024a2314da34e0e3dd84e93d0d719caaec34768e84d7635887ea3791555b6ec53470425e5c3e35a48717e961c22b27379e4c6752c250f5bcb80bc641933a4e0cea445fcf9cfcd2331991811790dbb498eb7839e07b2d3bc74352fab3861b83adae08e4482e205a1048b410a8c450ba01bbf3f5f3994764ae8a31f59d8c203889c15b7eb1dee7f3a87856a078e67084ad9e64f9989f601c8dea2aed8caa7bf128d648d88435d70c180d0f776988475c7555962075655af50aaccf518af5b2e330754ba43a7600a661e83bfaa056aaba66a2aa36f77bc7521da6d3497f78713c1802d5aee32314d0588a784cbd0309a05d6c60f1a82c4d17bcba5e6c2a96fdf014a0e29f27b08c6850bff3167e020a06c7aa7fab5e9644d150ad955aa97f5c3deaaf13153271267d446f0582b3299d2018ba1e2631e2729b4a37a58b6bcc6048beb20ea62dcc276fc08cfaa6460956ef73353c47cbdd3e11b00831d5522efc63be7c70f0235746c56f10879b5cc99daa261d6ce7228766dec92a7f3879f05fd4204ababc7a8440e1c781f08d82d4124b6601a787d6e47e99fe33dc954988d20e8437c9ae02d7bf05ec4c27e639668666f632366f12832f588615f2c214e766961829ed13017382e7b9192aced9707d4b6b6fad098599a566601c2a8e661cd72fa2286151cf8d0e0bb0cee0daa78addca2631b4f2ab7d1f8a81cc7fb4ffa40124e3a7ef802cbbc5959678992073a32b128f0dd3438f14ae797bb140d4158ec6170dde21344e249ae1b16ef9757585401e7966f0c614e272a18a5b4ce75ec7062377ef6ef5acac566b775141cb5d208836488361626d982160e41563a6fd243c3c0690c4bf95079c6313eed0336040586fd75ce0426f1329c5228e8dbbda89d9a8eb0ecd02b7ca88febe58c646e2eb38ad295da6ba4d68600fa550a2b3038e6e24dba4c7caf49c73ea0e1cba5e78980ec109b37eb9eab9516bad1ef8a320b98a46ccb59ef6adb4943e21ffe8249a51d79e19f0e9e93d206261bc38ecae0651b3ce1b3e3fab9ece5fcc2e076edfc261be924f5367dfa9c6dc3a88228dc7b76a49eece7fe2fc67903e228ef42479c7198fd552062d1ffdaa5f0e6e4e1fd7b48f5b8ba9fab17a03853d161f7f08ede65ccf2cff1ca7c44fdb416c3a37ff190c46e1c66e7984f6bc5fe1c3e89e6ce8e423ed2fd5dee6b9c25ad0ade327b5400ee126b86f604ac1a2046eb522ad7075f9317379bb32438f5e9635a646ba0a8d09ff4ec9e4fad0b442c66c1e823f857175ebacb4d9e106aa9f3e52b8b04605245e14a606a812d2881bdf7748db0b6a416f3c42414430eaafa43996d73921b772efe1035a546025862f1fd8638f90c172b1f46dde1b8cc14d289de19574e8f6fb37d9de1f580701ba11a46a40b526b001c21313f5e7aab90b8391b081f90e747e4886e715a010fdaac8e7488bc4808b8f559bd4c71710fe5976f89617d8c659ff009ce1533633aab1da33b98f190217e907860adabf2c4b28c5c689700c003ff88a288086409d65c4331b40cbd9af3637e9a86436085d001aa81cb27449d25483a4f79bad0c4d91b3b327028387a081bf24807e9059b470613ae144a7469115d7329a8ae96631a12c8f19a15e350e5793255f9dec9fdd6a9fa41f0afd5118a01e817ee5ff21b0cababc9cea8f513778ce53e7fc94ac59388311535c1b446d0cc73639f7f7649e538cae26414b14e2dc3c28a9fcf5ed133e330dab90d5b4155d3d6cfb098303ce8ee5aab6a88289c382e1abff2ae6678e741889b967bc6d88d7d99e563b409f8f505cdeea854588c3d787642d92ad3975528d14e8f6695322173840e14bda48b99af85054e5890ccece2cb21040d49aec413128e0b97f394800ff9d665df5304f0e2c735f85e32d3cce258491bce72df54d6401a72d21f579048a099716ad0fb06f3594d944d9bd7dac0a60a4a629622b211809e40e326be341a340f6d65624c06b371bea0da5bcd1ab434f92bebbf98b0e3f9a0256b62cba96c7715f31a655ca1827c829837e5b3859726861b8f9e46efe10f94cfd06859350e479fe3e4ecabe36e65d176499b91531b9ccb56da4cd7cbc8cbe0fe59825137e248067253d7309e2afef5a505d308f6149269b58c098299a965046bb258e718627c12d14e89041a92f08a42816be2ecf7db26a8e76f1184a559480411db64f37237fbc0bdba963cd71027b4e92bcf825117d5476bf2d0d4915d3270ca5ca295661f1abb93914773c4b0ce24a977f15458586dc7916ae7019d920033bbf436c05f2828df969813c1877fc1b3b99f5cfab8c814c7a4a52896d6f08d8589915054e6f7787ceb167810ac018474e07a23a43d28bd66e1cf683e7b533da11d037f6ff996534a469c373f35ba6563d7bbc165b00a6c502bd8e8b722517f69b163b0b4cdbdb6cae39a0fafaee519e7fe70790c608da88f76a79e252922c47a0dd4ca92d2a833964f5c053b9890e0525719b9a3ff59848b211516f8a4ed6cce8f056f0cd690651a5ead3d59d80a19192f7d2a46b8849da131ec7a6697c2ac7a1d2d7b0d6b09880cd7bf543dad9cf6bf1ec36a4b93f3f5c995b386050975d9cf2b4831f9e328e367ee5131f1086b2e119d83c68eef3ac0b239c029cf1b8430ba4eac6b63662059d3fab3e38503de0dcb9d3ec1bc290f6904e77b878219a147544b8836cb0f71ced89c906b2a659ca6087446dd1f8cfbf1b598ef3b2d5f227667cdede3c2b83a76d005de182af8a8f3f55622d5aac7df8ffc958bcbde2ad178e418ba49f6e50b6f0dd2f68a8591b38729d48c2d29307a8bae14d04a53d825e73af163a7996b87e34a98684fde929f7bd0d9a79c196e5cd17cd76d91b1359163df03a8a0282741c9eab6bfc4e8848292e9813cc1e153f2878f9ea3198146f9ba8b559be5d53c4fcd0f275e4ecf3242824c4388ba8a832fb34fe3e906987cd6eeaef768f9e720f293f75d7485e428954cf0a0151b7a731644a46e697f0270e52c928455192573049f42c8dec7ccb0b33a569dad0ef294c81272c35892d1b135939a5b0e1b4b1dc365d067def53341c4449292d1f359decfce9ccb0b3009be6170a3ccb6d9d2c7b43e9c2e50d5291ab8c99d73abb95eb03b0659ceda818cfaba1e18f14841d069bb929e931e891509a597a2ca7aea962e11306ff8a33660cf8f71b22b503ecce8e08d810a529d6506cea468d3ce182ed20bb8414e3e2bd48471437251f213e084638b8da8ffa4092de324f4695882f86a546f6253122c805860770a271b0b7e6e5ac1d36d5fcaf755c3c1ce23708e1a48467b60a3ff0c35cbb44afc9e6e9fff0b3f8ca326c59d5c0f283848daab804f1cfc2ecfe4d10a68c374e231638bdc3527547d0573653763741da532376b103b0b50454e3e139d187ca073bc8dbf6a918cd4fe1500d93df79275a8e4ccd0cf23cabae7267e7d21b1b5ec1428f802d37372eccb9e332c596975b05be06717857a4b94eb326f2fe85d41dd551e06c586774ca7266d2103aa37f97f3a812756119253078fcfebd9b2e2a6abb3578814fe075d6772cf3cba46cc2b1f012902da8bf9220895aa497a2924eb44931d19b4786519b6cf44ada9d399f1dea09cae74fb530b10b0300fb88965188bbad4ecc1dc8fb80d9c6c5e07d34730b5cc95a3afc0e290c37f13116ec30f6c546c1dc6b23b5af0d8cb8c0af308e73d16985af12c109b6a73bac33873fa89c0a76ca66cdede4b9899741c496457f5c3881fd91238143b94f12fc106be6d738263ae9ff0c72a7dba6722a6350be8c3996ef3977e74cb08d0c1c6f666b99bc4826a998268011979d671ab2cbd7cdee4873b2f346cd6da4c52cc7ba07b000351414f777a83fb809ef997c6c8942908aa2953cadd19d9524c29c19a40ddbe2925a51591ee03f71c41ec8efca292b2cd123e3d7bc061019e5ec204f73c60b6631e9baa4e5c75c5aa9080b092c7af27640e0726da7c2d4a9858434544147da8b9c8d4b61deb3fc6b253e3705ec9272ea1a29de6779562c28e794e4e5406b16a4ab5fdede7b54bc5de063cbe675c2badff89649221e83b9c13b544aca82e468d546384cdf45dab32b8ab26161a3d591c87f74cdbb8f2dba5b3ca8ebc5f2755c44fdd6da08aa63afd6310b1fefc11799e33161fbe123c64644624290b3a5daff6bce38b0b61fe8a66e62b378def0e85803873e7b2ef9d8589f91b2ebccaf73f107c2893a5a577684625de339ea6d730ad4f2ffb51f4a6642a3a639a7886fbf377f5fc4beceb92e8fcf420ef7d955bc016d40f9b159caad0bbeba09a733210d40472550bf92f2748a7e985fa4b8342c37c227f5086c725007e1b33969cf731caa5b73de001c2e7da13272f612bf2e53e14c70b0f24cc0fb0cf1e40d297fefa6adfc92a8ef4c40142a9c621508ce404971b6a881a5cffa9bcfed3f69bbca12032fb421b9a8f2307d460b313f78983a7b1502668cdc518712e83a7229b3d797b42a44c61f41eb32bd805a9116bfa50c2ba0111a6255480e24987429bcb72bf7a07ecca585407f53a5162c92c50ac83da85b972f3c84bf7608f73a0a1e021edfedf17079f46bca9c1ff47b4db5bad10184be6bd13c87eeb83941220428916b7bdd81511b2dbc5d2ce0e4d981f637c94736a78033b7bbc5e56e539be9d4b75b5e194bdddb1ca86af0e989794956378eda624efd50d88250731721af8fb2c21841455dff9a1721268e1b1d76795846b4cb8ef5282cb7a736c404c73c8e2795cd9654abe9edd6a0c4325190d5b57ea6b73e0f5a5f739c48fde3eaa5e77420f8af4","title":"814 二叉树剪枝","link":"https://leetcode-cn.com/problems/binary-tree-pruning","question_id":832,"issue_number":82},"80":{"day":80,"pres":["剪枝","回溯"],"tags":["剪枝","回溯"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。\n\ncandidates 中的数字可以无限制重复被选取。\n\n说明:\n\n所有数字(包括 target)都是正整数。\n解集不能包含重复的组合。\n示例 1:\n\n输入:candidates = [2,3,6,7], target = 7,\n所求解集为:\n[\n[7],\n[2,2,3]\n]\n示例 2:\n\n输入:candidates = [2,3,5], target = 8,\n所求解集为:\n[\n [2,2,2,2],\n [2,3,3],\n [3,5]\n]\n\n\n提示:\n\n1 <= candidates.length <= 30\n1 <= candidates[i] <= 200\ncandidate 中的每个元素都是独一无二的。\n1 <= target <= 500\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c39b3af36d673d7a41596f265686992559eaff043a04b97aec035fdd67cb892950aecf3a3bd13fab6c0a78e61bb9969a1d190274f3c7474c431ba3825db633c6115af218ee76a234032a6e75ded9018c9e6f1dd2e5b8e4a2232d2835b837c1c0f1cc0d3df13b5e03ac109c58b9d639533b53063161c629ab289835f826736cea7479a9dc0b61847be885f21644999982aea3e262237a561705df1d7d37a8d4d995b7bca43756966a34a90d99b71ad2ff504bca47c373c1ae44e47937817cb17d16579be6724ee1930584ae0adcf0d55ce0cf3187a16e309ceefae87fa287a53f1932f1ad8dad4deaa2cecb2935c60252231cb1418cb783840bb7d8b60d106fe775ea73cc5c0f49cd63409e6bd9ae4160cf0621ae02be3d6a0d964349e59326b5723385482f15b7e11fc25cfe4d6ae1cb046e2366d6cc669989ed02edcca280fccb92b410a07e8d88549a9119092e1af7794cf812f4584903547580942289ae0fe91b0f505849ecfb7c2149e2fb75954f5159d9ca4f51c372ec368deb5abed6100a62867ded714f855e3d2e7c91e92b55146ca5658ed4796992b09b76aad2e4b9f56f7390a4f5a8379ecba19d8512a2c3ed3aaa68789cd0e7aae2b9f58610a43852170782a87c8ee945685e8c19f6207231d28d1fcbc8ff257e3e5fcda2ece911d6b924e3930ca530ffa813f1b7262001ce2562e60c8466f8bad1e8f48fc0aef59f4263b3071b868392b7e0f225d9f6bbf9a61f51ba9e894c6db5bf10174862512bc46e83cb610f2e44db595b4279bcbbb8d8c7c5586d257523fe74215e941ce80248974996f4272b86a21d0dfeb40b6ccfd2c43eb5abb260fad5f988a28dc34728b2e6af6d11937b1146f391cccccf6148e0544033fdd0985a9a546607c2ae977cc136b761cd4035d2057e1fc5635119d8105c0cba90dcef1d7b2d3cc85d2bb9dc2a451f07cb7bbc7616fb5141b028b6feddf816ada30e576bf4eda4a8f8a73800e30410dc9749420808f14f4fab129b97cfab5851b687aefd8915a3261b5eac34ff8dc1b94976857c4b65be4917229dde13ba69ab0ad2ae438b22026b3c3a2f9278fbe678035930eba90d86b02ac7a1c0992cc422cf2ee26be54af194537171a8bab081bfeed232544d3952cca6b3ce8f661d1efebee7722b03cc35cf86dfb0d92e70bd3597ef189d6bab776c547e4365053bfd15c90e084e7aa85a26292892c92a09b87bbc61b833c5a03983243b49a51a77d9830fab98d2063716e08cc8da5a1724fcb3e3fab8e4faf0d4c975defb270fd324ff3476ddbd884e045b904aeab9481f01023aa857bfa177fd5df0c341ae7563dee4d8b093c7c6aaef8e98c80f00c710571c1c149a0750ca4a187330de6cdefccac729d4f03a2e7ca6b11ea09f5f814a41b9fe6e0890d06c6eac8e9f823d79cf9c32e529d508fd6acf5528617481240dedd158cf2a9390480655db521599757fadff7d32aeb06c06327bcdd5e0f595fcf7118f682b1330a8da4e9066731e8aa50ca55907b08a8220df54522e2fde2e255ee96e33c2c5ec12d2bcf1fd2eaa9f0c531915ef887aef267bdb4b5246ae0545e2514a29589c89a251a604796f3c224777b9ca17dcb4fd1f7c76837cb87d9cfb3378828c3f771d9e6435446a580256b3e776bca9b8391b0a089eed5fc1897a6b56053adbaab77aae924a029bff55804c756b01ee886ca1407c867d91e633c731146e16a41fa11995cb842d4390757a9ca9eef3b28c59688928ce1fde8f9a8a086402d46c7832a50abc8ec06c6c95867148479709c5f2cf402b9a45100c0c1fb6a89cc453450d3d4d1f35742ebd110f9e44bb305d2733f8d4c16622437122a7ae8a6f1112c91309639d67ab200f3986f8afa3c1e58a58affbfb67c924b45ec23fad2474ceb7849999866c63c45191bb9b73beca9f48aeef52568f1490410ac14d3cf24bfe98f2144a893765fdb4d2bd6fbc3bd164d802c54171d4a63c52265050e5c47e15cc019f72b818f1a4d670736bada162f20c7642fc3d3a09be566f8254982d79881b301686ce0af186faa13fac254bc19e75c141835afadae466e3851a3f170f2e4092c89d53137a3b6785e7fcda10349bfe448962274c2680ab83f943e2c20628559c13cace3b5a12bddfff54a97fe40adfa3b64ab4fd649e3b19b4e12b2d84199d9619b11a2e2c071993c1976de56efe0149a9a78f71c58896ada0fbffa3a920b914405cba1f8745e87fc9692b734a2b634aa9a8a7020687f3e00996898d315d894914ef60796215f522c6063b8349749e7139af3717f3cfb9095478751963f6af03f29f7f568dff1a13ec518b224539316715a34ea6f274b281db951da202da773a538534c32fb036fe6759c00f4526b6e1b3449876f4aff6dc638b63e08c49654fa45cfa14213118d6223ca8906c7bd387a4d4148861ccc86b05327f6285389d977269d34021c49c029eae475a020af6f6ea6c933e39afbdcb3b5755d0955b5c52a96ff768da85eba2265dfe5f93440abdfc0320d873e0e0ae7e5e1a98047cb054135118b850dca7875f6224f94d561c470a647584d5497cb9847a81d9ce089842cc53bc8939f5eb79f71307e3a3f397a50ad4fee780642494f0a417febcfa738af47750eb52b3197794f95b3337c03a1be963a4366029280c096078e9347a4473efa33abf9097d7dbdb3ee8d0eab58eae456eadf4ddc5ad77fd43590eb04d6e8b2c520a82a0c306de8b714054b4edae6cba9f016929cd86615945f73a52ce724b1023260a18fd82b2a031e03e758cc8ab7f1d3504756b04884fdfb7107cbb92edae4da53e36d4bd93859c9986050975d983621b37b2e538fc66b85a6cf10d235035ceca9ccbb57c8feb379d659265842dba1ea3147009144bd695917456ec4f9f271de73670ad86afab57bf4f499969e5c1997cb821b3a96139096bb5a9834f2bd2dbd13ccb17690f394f33aab4c8c7c0cb045a6d597fd6e71bf41bd4cd7047696b90cc1a2b761a0f6d5535444acd2fe871d8399d2323aadbc832380f6e3c7a1d85404cd6b8b88ac2fb9318e65c0ab9057cbdea152a6bdb799a787b9a426cc2344c5d3406b483d532cb39817220f066e863e8237ec32f46c00622434d13721f202702e13e7bf1020c5a6331f060cc685d0cb5606330b79a7bb0e1f6ff4fec8845a7851b5a4a32f26fcd7009856a8613555a7d8936279d75564fe6bb195bed309e7068ab9dab9585be79e8bdb2899a5ca57350df8c939c8b0685536d01720c7a81f0584ad33b7d2a83f620d16b366eaf471aa0d48d9db061b932f12e75fcdd688d3011156af118677f1415c1a1a62ca5ab41474d175f1262946ee39e2bda99694519a94a2adf31ff9ed40b4a104a5010d7bf5cdf8c3ae655364b14de03f2d72270455ca4261cbae055017830d7ee2c51e0148e94a549c2ca8081ccfa2ca19d0b27c71245d7ab5be14fd2faaea3146ff2c1bfdd14f52504d12377767d15ade440b932d1d74663c491ebbfdcb3cf0aa2c6e2f9c49cc3c8ab8d1851bad05e02bb4e1a57f7f17a909cac99ff18378d990f2fd13803db5614feae7167a7597fdae9eef287332128e3c567b30b332ecfa20ef726a0e5606ca2c685f1c9f98bafc8bd9c3ff7adc48de2f3c398b4fbc770573b6fa65699fce04f495018d19b15ee7422a8e7b857456372862d3a8bd891f2322723547c1db41513b12f26f07be30c71dc5cb311e3c65a99e42c2485dde2529dc22c8a95ef2809b7ad61eca3b6ac61ff18abb17cfdca8c75c4eb67081f32323a05462ed34dcc0b8cae9dfd2bed75ae32aac2c2a3d60e4a0efc813c07c1a5c9b878fd06d3f33a9becdc774a8128351b3e65194e702e8058c0cef1768eaa7579b1900c010c01345b6a5c6edf29dcaf7d83bb3913297d2b23497c76e5d789e306a995d8b9ce0d5bfbd83c78121488bf1dee3ac419eb62dfd116a2aa311bc9b6783a4b5b8d2ef169199a531c80b749695d335000d97de9bfc1d25f18e642d670a9f622af645c722adda733fab247fe8a350f1e8c1a52e5d940d9264b4a6da9777e4671be5625eccdb19538ea2d23c73c87ee6ba9a4f193235398b247f454c9dec7dd8fb2f6a26cf0c31e2a6f296714e0d148a9af094bcf74cc97cd4046855753c1bf35b15e448a3f87c1520e6129426342be8c1b41cf727c7093009177cd18c9e9c06c3f8bb8b36c2510795f1e0f5c68404f59355aafd533c157210a0a9db44a90efb7d313ab3bcaa00df01541c86c62b3cb9d8a3ec67f98e2381c480720ab370fa0fdebacf90586815054f7291d7fa7ff8944936cac72cf478a7fffe33d4786492989dcf75aae29dbe572164e3f441591f74589e3c5f1e1f5998682593b55d671dd79bcc2c66f832657f4acab4979c43a4502be12622833140a340d754886f9bbb78a1527a2dd00fd01378d83479f922412fbe6b7c7c0cbee1b30bad6f7315f35219ea6a50621463bd73be9c58464b15175b71e8bf42a2a686e946fc3f9e07ab6bc43f2aecae4aea343bc29c4718357db058151c0fedbadb0a0ba602512ff1f3a1013fd2504538de985e9408419dd77647915c8dc5d121b6578e9debb3ccff6e933e716cbbeb1506c29763ee4fc7878cf160836ec03a5cf1903c1d891fd6fcdfd1e84ac44d6e36f17cac6427ea871e9e971ef04eb83daba80651e2621d9f245bbb61f73cf8607a23ddb081c1d263ea2dba10c2d8ff9980d60ec52daa2ecd63bd0ff56d12f871df76fd7ee3dc21920d4a622e9fa2d24f42587014db77dae950117dfef9f1aa7e3a449cdd1162f5f6c4bb76a528d70f84ab20c8f8f2985f7dbd89b33d15c6c0b268ef0bb152eff97e12f42910682446a656c1651819c497845ab8c6c75681473ac880299acb26be1838a889dfe7afdf320c20172dbe473595d34261104734892327c532afae10168fa4616cb3a8c80ea9a912d13a8ce4181d6177a58a38f976e741ac15830c9d20843943a447e1c642e453b4e2d81973db7ca2e509c4a48ccd9d79f9eb55988ac2e4c163083604b46b46ceba5c0ec638a40cf5b40ce64ffaf7ae687f446d3a59e08721b6a9f301769112e2d4656b7630afd75954a211a42aceac0de09696e1b33d4722a51b4d20ffa9f30dcee6647fb7220441765516155680bd4a18345ba0b8d7a1fd035cec87a93d3ccf6bfc90f1ca8e6dbec51143fba84d1e9266e91847e2cb01d069d102922d97caa1a3ad3e4835fb359382da248ced17be615d4ce1337a6a0c0e3b0dafd107b0ee40180cece8c117235bba80022d52aacef94e3cdc1d2fc93d938083c2655bf2dd898349e2c0db18f020f05b1509891b2adee4097d6c8602307b705b67d4ec84f01ffd2f723c7848f31fe6163dfebab0a8cd5581cd5825ea8c6271a58f2a88d2d616b69280298ee2476d64d11aa4c6fb6f0fe60a9659110bd5c15d1b89f5179f29d4de2f2f370f036463a60bd36ee8a90ae44a6434e35ba2a120ae56871736da3b569cc62464bb4f9a7d39d8aef635f7d6b11e84282b0606c7c12f93501542b87b42cdb3c9c8a4f1c00daa74cff98f458b1748a5d6d7d13684d8ec46cc5a385fbff5f195d06e0fa0f31aa21199a8038666857e79840d6936e27760355f243029f62199295704cd741ff2eba3fca175d6faca8effe88b3d10deb641fb34baa4b5522bc5526373dc61eb6949f0c0f15fe1464db2091632efdf6fd7081ebcee980c2f1c060917d210ffebfc6aaa287fd0203d9ff401796613637722071dd520a7fe6bc34dff6d3085418f325d6549e15afbf5d299effb3cb0d3ad3ca8af0c4521fa6deb89b3bce320e13f0e6569eb4f3de17fc173c49ff864055732a1f95f0d4d878eb66d4fb73e17d2c44328cf1cedc644d5769183e68088d8573ef1859911653956e653ae20d5b385cfa5b50dbbcf2ca651958034d62586d1313928b29f4a6a75e125bd6e42cc243094466d7dbf9b5da118018d3f0831dc36d107dd3173a0161ea05cd5e942947fe0828d54ec4da0ffbcec7544dd351df45a8bc70f68a0de917a8001e8f53c6d53c25393c7b7d66f559a638e95ac26e783c28ca7468f35117905a8795f431223fd9dbc7a1cfe257fb23a4c3b0448773ac14f75c216031adfdd9889f36e632848a0182404df1ee78c707c4978533275174f6093c19e5700ea30ea08967ec5108f272a287464303a3cbc9a0ef7576f0d02bad369bd4966529a49599375f2c939bb1917689f0be0c4be9510f0d080fec0d719fad58bd48c8129b02a956ab2e5aa8473486b4e5eba888a04bb08108bab0739b0fab0f0cec95079e146c60c0519b42e10f5131852d04ba6f6c1a270f040d6ef3633d76f9daabd08c69aa4a03fa52ce2035615ab77f6944208654daed4d1f312446458ed8542618bb284179d6b465f069c57f555058d945451b29b28f000f2873b1afb9d43590ea627bc4179c77a5ff213508bb19d35a91060a04a1ee5c18eeca619acb4eb74f243e5e27c6d5571d08a5de8269c2373d1056a11fba9a84761f2d588278f83cb47787e2afc632b4baf72d6ddc088c01a73f3b9e8ded6f2f46738b974056cbb4d8e93de7d7e9d758c3a2b33dc270bdb21fd18387b4cbbd914d31f14d407eb7afe3221fbbe7c56df926622845988b750aef0e28ecd269e8703c0b1d8006bd9aae6e53636c932ac806b23c3060a99bc881eae47110381b9ed9873c383da97aeaab27a8a0d506b0de07c806df37e85661ee39d37497e878f37cdb9f68c270bd0ceacffde5ace8658c2173a0e8a13e1ede03b6e22ee88a1bb142dcb7190501a87cc1631b8dfca829c9de3bc6a038ca83909beca80da424fb30990801c12a58e3e16f3f0bfddb8b98eef03fedcac1b6e7099fa22117512ceff57fc4afb846ff85defeb914664faac7faea53f83ecc271f35001446407071170414e6a4971b43b5f05151a17cc9fc62cdd25491e7b18c79dee63b19820759e6d2fd7b61f3610e9e524ebe1e77ae2b33a75637c484cfb1a0fb4c4c44f7c08c8ae0f065afcfeb5eeabd6ec631472b17a6975380ff72fa872cb6be0034555d56ea954df2e588a3d279e1cc132cbcd4564fce5105f221de32ede63f5314f1c4b0711648552c3e013dc7dd4398d03a48b6591b9b418d0856c10fed17b908d889980e79111cfa84dfae182738f626566d3edf555f241190723ef7c8ed54715fba9dad176f01a892a0fa50148d8bfbaf3cc76203bdedafbbdce8945055f930fdd623e85cfa7f5cad60690eab665d45180f3d938f780ce16cb1a7e6a6973180f802b6ed73466903b7254b1bf9ed47bec05b276c68c84c1a019bc1e6a1bcdaf0cf6fb7d1e9d5819f83b1a4dd522a6658668169e5d5658a8ac26e571f2ab8fde01376840380693d845a44cda2b969aa989133db03e521d4f9a631d616f8bfbf0b6bb8effb27465ba240a967ea2bc2c410810998d3a53b73d1816babe3bac33ba70617330e3b1a62edccc05daec97ee89fa78de3046482c037783073205543b6d1c6d12cc2098691093ab00051e41e548e10f207b26e714cef1ebd5b89203966c3e1dec996c3a999c69cd454fd9f4e48b5ccfd1449cc93830c938fdc4b4cc471de42e10f0ca58464ee2bb0d50d1be41e343d8ab62b34d03ae7686688811ed78f9aec2d6ffd482784edd0e5a6958b07e9ce6f2c33f25cec3015bbfa6c55a18794305e69c4effe96fd08ae0f4bed86c032a98382cb8b798ecb86a4f90c9d1c1fedc5f6c801feb70252406711fd56b15269ec9f1e8fc982d97098d6ad88f8d534803d6c8b0de7d3b070757883dee6eafbd6215d280bf39d2c20a8242530d127a223c981df7ea0b04ae85609f9c4bcc14f4d33349e9d73b06c77c1f44f5de6504a6395e51903211896d16a2a12e1a7203895103965b4b3e3b795a610b496d70fff263f58e5a281e76d465d70108e18a41e90c30fd1583ed63fdcfb53c7b349702a49b423249a31983b110989b50ea2c2b7e82ec8f3edcae5074380c2f9a73309218122782eeaf79ddc861b08c05fcb343ca8390534af0a119855bf2dbdb0c6fb37a09db18de00da55aa00521d06e","title":"39 组合总和","link":"https://leetcode-cn.com/problems/combination-sum/","question_id":39},"81":{"day":81,"pres":["剪枝","数组","回溯"],"tags":["剪枝","回溯"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。\n\ncandidates 中的每个数字在每个组合中只能使用一次。\n\n说明:\n\n所有数字(包括目标数)都是正整数。\n解集不能包含重复的组合。\n示例 1:\n\n输入: candidates = [10,1,2,7,6,1,5], target = 8,\n所求解集为:\n[\n[1, 7],\n[1, 2, 5],\n[2, 6],\n[1, 1, 6]\n]\n示例 2:\n\n输入: candidates = [2,5,2,1,2], target = 5,\n所求解集为:\n[\n [1,2,2],\n [5]\n]\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d409c9741ad6f077b58202662640f83ed5a758993317750843eaf0d2fac47a3d33d11f0f15565c67ef650633fd97fe286e25339442dc7a529560c4ca8fbef04f95e7f25d15eb065df4a3e4b2351a648a54a22f51deeceb6caa1c0bb85fdfb3f8eafc5b7998d3e624975f533d5ca1c1081ed3473173341e4c719855c69ea63144284fcca80f508ab0605af99bb5e662376320ea9d740f1d4ebfa937b1d7621a8eecd79282fa75ef6e3685819a1fbc9438268d2c902862f1cbfee08a0f5b87af504b09ca604739da16c43e8dae40558243cdb1929b67373e4cc3d72330c58c186fe416362e8a24b63b0684d0342c2df03de8c0775be4cc3cd1650f03e13419a878c6ca022fc378d9c9b262d0e8c70d0e82f0b9840726745b456151bf0287ea7cb0d119ef362ceb0422c0c9b1ea17f81caeacf226e3d78dacc515c4e01890c26215528497b10128d638cba505c6ef182c5dc77a39d79dc6b5b4e3f5560979508afad2cfddddbb6ccbb39af28a7a10179ba31457d5ddcc373be4eabad3b88ec5ab6c6140d2711e5a42e78e731124704a0a6426f4032ad16d6f7371a8ddad259e5a7d3d9a845db007d2a2add4003c5bae548a6a09c02c63378f8764c2a03559be59c6af8d1fca989ac4b637927074bda60d251020e98c4338192e0601b2229a386bd9b38bdfc0788ee1ee165f6c875c3c75d0f65698c6cdc0c846bc6b6edf0f46d81849ce2580eed1f43e093e0d4d99f50fe9adaffef9ba83c766acea2dee60976285f35b98c2c948c3911ba9374e3b22a4525b69ade147ebde8f39ca219a8b0b762d94589fa21f45f6186fe3011d6805660b7d1717e6640337d6fe1307ee499751d53ababdabe8d0a7c9137444716141a129c0f729e6a023fe0c79e44bc3c7b1dceabe670d41ffa19f1176dd20e0304e33286bc78c7c1ae646a755b8c1a6d3e960c1c03e44b454ed828c453a881ed430ee21bd8cab37ec6723490e16b9d303407de9ffc8f5cd3c8555881b9190efa5f06f253dadeb66decf10b04002602831791bdce75fca2e2ee935476e6616db11bfbacbf15169442b56d866b1c9904fe926b44132f57aa442df7818c837c1c8e0a9a00b1b30923aa11e17e2eef6b58ec6d46b5ff268f905ffcae988f39e4a8a6ebe64a02735bec92779535268caaca3bb91e305c693baf9377f22f64dd0afc44e8fa81c0dee3e5cf71c32a8bc6ad29c00a94b598475681dd30db36a24eb3155bbc4fccf237a35000c5ef4ea7f88a327571caea81f41c6608a9f3fab2cbc7b084f0ae27ebbf7933b07fe95917fedb3bf7c3fb268e2658dec0ef93962e8f173fa25df0151fbbc47544ddf4c175fef28cf1d4d9e0d66349d6bab4b6b114b72053d154f5eab0d44bcc2e4048c54b63feb51ec2945bf2bffa632153e487496dfeff11259de7f3a74c28eaf75ae0891fac78bb6f32787801df12688dfc069d12e5f964510bf60566ab1700aaba0d04fbfa5b506856710a7c9dc4fd9e4cab0b480567fbc12ff0701a798ac47e95125abffdc90f65b604115cab274900e11b6fd38c8c3592e0d6a14a8dfc7e6b6365fbc30bc04730d22f0b4ff05f72993b77402eafeac764c36e47265502d59bedd950a9a98165651fce57da3cb3aea4b00549827d1fb865316166472b578dd476bc8eb52105080da0e542cd8b4a70573436d795b774b3b44810a9f559bd4d794001f5946f867f7cba4090c20dcf393e6d01bd10893e99db982f59b97965bfa8d5cdb28c5c66a008ce0cfc88a595047303d46c52308d3cbebfe16c75a3846b478be631a9a1c92674802759244945a4d2e5c0181a157f083a989bea7a97ea6fdb71a2cafcc6720e37a0fba2e5d81c0770ba86ae027777e161ba3da190fc7e09247b076d7d95202700d118ee79991aaf4fe6bd2e6b0e457d0b949b46b6227f489b255667ce473cd1ac03d053c1e459c7f94999715129ccbd43a3b14012005300d13ec33a8c43c1450884ee7e502a4450e8df7f0089019f72b81886e28b2e1e2effbf7c9e066a5ba21d3a1caf58659e39cd2c3892016470fb800ce7c8d2a135a6344afedb26dc13c952a7809c21a6d1137709695405c0c0cf7a09256f37a0fdfb820c1e94e445876334067dd3f5c6fe02ad850d390e9c62918750037ef48cf90de322bf5ff5f1f319afbb70e7455588ed3321805c99c750b953353d4b54d6ddda56ac51e3536ea5b0b724ff92def6efb7b697b720eb515111f9389a44fd20eb2f2d735e623118e0b7ba5d52c8b2e7038bb6b1655b9b0b50f2656a7115f227dd6575d74937996661fa2c17a79dac151c5b2868638cfa41bed67510dbb81002be13d6611e64492656e846cabb27e6cff2881ba450a8134416c2719178e836a4615f9e0f3472e5a5a62d8d089be8b38e7d8b2fa9df4f2c1ce353ea2b547f1ec06c14a89a666ad2b8e18709da2bc4c777046f7630b4389d9772699a0621cc8d1298fb09140929dcf6ea6cce1413afbd997e454fd0db483f36fd6fbe688ec3bbe53613ac168e450aeeb44d3fbb1da1b4eb2d5056dd4a69a14f061015f7539be28b75246db70613582b43376dd198153eb1936a8093946cdc0b8812e8cc6a8ef041aa5d7f8491f0beaa05d4666212a18822355ed0682459f37922bf86528732a5a92532712f37837b55ad2ae03f71202b47172d64eb333e5f3feffb65ba908fbcbf9f77ac91bef0dda20964abf2d389e970b44e5c09b0457e8f2b6c1084e5be46c5aa71515dafc7ae6cbadd402a62999869495af13a52d0311d1962391747a9cfa0a72fec723dd880f862146d7b276b098851b4a47e75bf9393c1d84cf6826a28700724561aa9cfda690bb1ccac201bb81e9829b1f478ebd8cd8f24475c287ed52d25972eaf29ed478d18dd5e9cee83f6cc0d0c7d0f768812a34064d35a299ee3c9aa23e27d05c94d8fbaab06d932cae8634f7461eaf3bd084bfcb88c3f96607a6a5f426ed69481a0ca679da2b09039f48546d27685f90dd6d7ae17a87d061e4413352a3d0e24f359964e54af40f1e5d3dd875a1b4900280544811007f8dbfb8d612ec8048fe95fe207ff7a950343ce6173b67aa1d444054a9b4b5e210687bfd80bf8fd0ed1e5bb69ad16c74a21e94518d6635b6b046748777d114dbb1f36962e470b4a5b936eaadbf8c9da622e4689fee71b3791d227b28220daaf6132735eb451a72e3eee119f79296838e83142f37a103ee4c4404cbe50ad162181d8f09ad8c243b0f391d6f077cd185081d4a7f4cc3cdf0d4e6105171effd2302ccf711f2eccb7148513330bf6617d255649c1850eed21b65d7693894bd055287535ef47095d6548f5ebcf13ddf478002600164c7fc915dfd05cdcfa38694aff4a4090178dc1ec4b151d36d0901e18fc1acd32892a022555e8529fc56e185909d23f77e0f1cdee3830a1b327ed25bb0c50fb7060263d3dcdc61faa9a2fa62ece4ed08756d159d2dc95a1034dfbd192dc1fc22816e62067457d1a89e8518831c0f54660ca90f7a1d0b7c10898e0e2f8f894d2cda188225e8ad25c27ba4e2e4efae87a90afae95f8033b94bf0e11e93b0aee5904fdae5d65af7f77dbcceeffbd062217c0c66790091b3fcc8d26f7389dea5669a3f4b5facdf58a8ce3b29021f4a5ea87e1facd91a1fbfd5a91981cf2653438bd551d30149cc736b7283ce87b075e6c6a66d6a8f1753a182fb4dfe6153e9302f0467287cdda68e396871ec84fa0215bd61305d0a5512b64bc7c57e0552d4f8cd23841e62e663a47aa63fe650f89750211d77c4be0cfa596f6e4e7cfe714c607ee5234737bc05890fa01d79ceff18037326bf8c85c3a94f9c5da2ee36c91da51ebd6bd2562c760326a5c5854314d75e252a58ec616eeaf12f50e5795a70d220c5f4a5f6ef8ed81840bc78173621a33422d2426791f52472f0c93946c7c1a80b130d33874bcff289527e03f4a8524eb2611c40610b4c63c39a4dfcfd870bf2e889744ddb36946377831bc90dc03b00824182fdff178984ea92223c022b297e3c6312ed42f3afa7907e0deac56b7d4203ac114d8cc92a935e7d2ca846a90fc29595e61a878a178bd59d4eead3b44665ec7c24d1dd234a95b5a055561447a7b9faf9782bfd8c6c89e2968942554cb933b905a6c67ed917ad7bd292a910b9bb36cab135c97d0b5bbc79fd34c6f6807852228a8168b5fec4632e32d5b83b1584d69b1e48290b994c1f86866475c20952e790ddd5469290d1c63a3bef0d4aa07f76588e8409b3f119d2e66bfc4cda3259d79c1dd7d4f50521ab16f4ab3f9ebf5a251c9ce5e57f023156fafe48264ca21b4329a39f102ffa02e4c96553f8688e04cf132b8f60c3c4a2b541e9de04cdff7a69fe1bddccabe553a09a654c77ef4b2e672837f79ffaaf0103cc4610802f1577f61647822350b2878a4e4ada4d35931ab8a63ae553b8da64098c66c3ae7f5b7d48999b9552888f8a372037b2b92b5e43e2d5b7c9236cbd8d763f90e2fea0ca1af0000682cd52cc1ebb233a1b619e7aecde8b3f20aff74c82aea169541c81581aa9eacf9f3e0603311b20573470398776018c8ade9f25684509131286203cfce7e541b4f28bc9cf7758cf6ed39fa0799b2eb39277d247ffa9d5a1486455c6ccf18f6934c24db8c9dba379fb054c5ac559eef267b9f9555238f7bf4e877fe13a68ddab69d76466e7397ef35cdbf5c69abe84ee67c8f4d4f11263eaa8fa91b398fb2dd102eb552c9acf19b72cf9428947cfc54c329c9fb7e874220938c18e0d02d24f42587014db72feb88124599bdb52ea7b0f008d6c316211a395af6390bc424b01eac75dec65485eac6d8d872cd5d7641269ef1e02022a89a8d7771d369c6282336380a4f89d0002b11a285775f2b5b3df8c14ccce9fb049fd6d8c686d47afdf3209f2b5897ad200d153a305504794788767c1776aef41d40a83b56d00c8cc3abd4d56457e99a04d2d8137a5ab49e8d7d2616995f3985c0713d983a103f4e236b11770a7e96d832b7c7625289415ffed4ebc7dba5638f956e137d64c6334746fd6ce0e790a633f4128e180bc636bafc76e6cbbd59cefaca4561106399221335183472121bb17850b57ddf0b625e1ae1b0be9b5a1227663fd43b7e609ed20ffac21a81c4264bf20b5e3a1c7454614d2d60d7ac95de28e2ee0a1a987c9e9c50c196968fecc97c53b999d28f5e1a65baaea1b072629b8c7e0cb014011bc2d25cba73a4293fc7dcc840b7462d21d144c3ca6be61edb807c64aaa094e6a7dbb8073d598c48ce8f9ac55e3c46a2a04612d128eafe94ecc9c19ef696d628042b7d01963782e64fd76259cc83025b0da5179180e6cee640c3c2d56d2d1df14ce52935a40652aba9be6d93abb77f81332ddf90d6208cd51c5993821ce9c62d004efaaf877165763477198ff77c13b51e45a64c2cf7beba79ac708d55f3506efed7d21030bc914db1a6e067f73f41101bc01cee8a90ae44a6434e66b6205456e264737177f1e82a97700558bfe9bbc592f4aa30537d3f50ba05c7e46c6c751bfe10404862cae569952c8d971f4d4e92f909f988f51f9b35c40e633c43380892c530c4b486abc153192322a3b55f68e66d569ac179e0b3a57c7a8b58339baabdc69e7b9a9e7a959d6c79fc9100d012ed709f0592929b2e464736437558e730e3a42722ff192677f159267e73827cf3d0d684bdaf6acdae558531f7d7073b7cdf81a2ce2d1858345cc054fa8acb44dc94a1eccfd76276dfb81c0826a881a3582071dd520a7fe6bc7d99f6901b4939a621d600cd15a9bf41299ea3fab54c6887c68abc811c17e59ff6df728a730813f0e11ed4ceb69053f4477d1db788031a2373179cf9aa9d35bb0a9da827ef3c7c147784fa949f6c4d5765047f7503deac7bdc5636995f1dd10c207dab43573810bf15339ab0ba93044d0a420e29502c5d409e8b7db1ebf732154ddabc5fd44f471d2fd0cfff83dc50804196fe9706ee2c5339d91235116dfd3fd055831756fe2e289c47c7da0f3d7b5791c0649470ca6c24f5fa8a0fea2db80230bd50efe13c25393c7b7d66f559a638e95ac26e783c35c93976da4010b7019adaba397f54a19c82f5d5c857fb23e58de3449a73d769ec76216031adfdd988dd26e23084f453c30306f9af36940bc4ecf83f271235bb4dbcfd1eecd457c70772e000ab8407e16732e2918e0e0e4d0d27f2f53738ca3cc4535d38b44df78eb3771f6cb9b1dbe276eabffa49518a3d4f040601fa7f37d4e352a745e519dc09a615a1344ce9472adc9bedf6b8cde45ea1890badb06e8b46f34c48dcc61683466a78d37b9400a5154131833c5ec17d085e621e3f174ca1267037b094abcc8c79a34a51bf069b727b7a70f430625c3a8d01d6814d1763610b04c796543b05a6285170d6b661f0749970054c54c455430829b3a4493a6234fbbaa8dc3687ea7f6bfc46fa548fff677a5abb119f1fc5064304bcee0f4cac98f2355ac32dfde1d5a8ad015bdef7cc2a2957b576f6f283ff67c8115518dad9d0bd0bb3113ca967ebf7bddc34bce9a22970e304a903ad3f3b9e8ded2d6e0538dfc5011580bc94a03df697af8d5fcfb19420c365f2f959c79b86db8aa1904934f9570520bbe1e22e1e87ebec6df9232e7d26d6ca79cc14dbb53516f90af3f8d9d60de448543bcf97aeb200d64c2ce0796369d7de85d186ad2244364bd1898f352317a92af6d5328cff905c92d727e226cf36903d469d62fe6e9eef278b2de68228cb62d90ef6c5ffe5a0f4018c693283f3b43e1ed048e5e032f69c52e34b99ae083b0fbe7ce7635fd8d1a9609dd92cc5e12acadadd8afdbb248d56863699080b87460eaae12a3105f9d7c2caafb47fa2d6f7b7ff5bccb94d421f2af7ef758ae6f605b699dffabc1c7c0ae4d6e7be02a379db3642600970460c7a6d0d5910b3bb96406cbbe35f7e992ab3902bdcc76ad3a8c9cd3ad3a143198a4b1cfe9be72f70d9325adf0061d81214ae3733e9403bd9cecab0afe85d5751a4c6d5d5e1f87f89cfa957eae936c6780e2609e4cd0bebad26fa817ef7a2123c522a35979550eff5ecf69f2381af1321ee807f139c5c4af03cc428a389794831be84a31075defdd9afcafd4a05a7080eccab34e4de1fa30ded8f6af236872dfe494270c2afce51f9b0c5d3d493b03093c6a2e032d384e1865f9db2612a63bd819613432ef496a97b673d51fd9f5c6b6024bf5687ecd68e2426622f7e93d736e7703385208a6abcdb3facd49d62dfc4ca99acf82dc42b2cb42896e9b8b3dd58a596509489116f0140a0442b15bd9c66fb9a598ee1f2aa180565dcf1afd19c99b5e712ddf1a28a9fd3e387e69e64633e6e2bfa7d6313ea3e4f1089dce0f6340719dabd639505e2e01ee683040a2bdf1a552ea01c925c84003f31fe0dd0034c22e68a38080699bbf9cb2bed2966eb2e56e870e6025f60f385566d9aece9cba763ea82e5f79a8cdae63b2643b4260cee6e3069727fdeb30542d4f2fd93a4a89e08321569f475cc2438e5d2419dcd0b97b17d9d24cc22bda4c734ed36f739fb81af50133d586223213a6b1a338f764aa6cd78366b88d85e6a5e8d445a13f7be2aea45c533f49a580eee19c52262861ff06b4169d1e22827d434e73527868358a0869ee0e88622dfeb05c7bee5602266bf455da68c9a34aa3db9ca567997a52d6105a68bbd5f7b5a9ab846ecc0fc665e75e36e15264c27d6635f066245f819def76d31662d9d52e343102d2245fb00d21c697a43f51f0b5d1f845e4c592117159d6cfd840c9d69d0a35f785f99ded9caf9f6035a132a1e3780e5c6277843c276fe31a0dfcf1adda50a9b6a77acdcc1987e3a7f23f8d451fd0578ada87031886f1d27a3a571324b7895900e0d74727ca5f55c93d9f33a5a0f997030b6b4a2d60ff5123d76eba3b3ef63767dbf8711fa3e9193ea3ddc702bd51afefa54c1769fbfb6810e2f2d8d32be1d102d99b62cabc190ca2ff4c829561a898d6b411838b9dbcb4175694595e8db95a45b57c303b71361ce206c6abf6f6f9a16cb19e82c6e528a641b786e61c127d140ebee68ed14efd9853e9206f5cda3545a1604c178fbf07f0b86f0ca7afab7623229a49f80764413022b7c9d6b265a7b2402adeb4dd16e7bcef61192cac8717ae9dd3596587d46dd00e1686de848cd46be835df8a1d79650d7aa0f49ccf0d327a38f7722763a2a124c8729d7f23dcb5134ff2c70392ed350b68cfddbaeff6c9f4351b936883f96dc66f8969ebfe11523e6b23047121dff67087d82b030a89cc18c6a750261da5124b3efac6214d2d412263bb43deec379eaf82a317d906c4430e642b4fd2898815fc62e76b5562dee51b43bec7a7c2211a47e558420f0e67c778efdc960b82172b1f612674252ac4ba6adb0a7e46927b0082ff8128356da389aba8fb98ce433b68634354d630a85e481c254b89fc5ff3ec91cbd1ec56370b658cb77ec48f11b28338c4b06e2fe035a6929a8ecc21c62fef9a05900e1e2a92d316023e6620387393eb1e9502d160076089a407cf9e601a31bd89951e6e4c0a5e7fe3b5fc5d371642a1005f241d990e8aebea98938808cd087ecf2eff3f95cf3ac638a591da244142fc6e4b65a3640b4c644307334e6c77611bd1879073a61886be0b6bd24d403eae299c207314a3f14c6bc89d80e4f11a04b3c5aac936aa648a9fa02e6abe3427e5439221eb43c5fdd92ce757b8720de8b3ddea13c0e1eedde2020706daa240a07199d3eefbbf2cdc4f94bda8b4873b3c9be07245f24ee1a165e0014d6566596502e","title":"40 组合总数 II","link":"https://leetcode-cn.com/problems/combination-sum-ii/","question_id":40},"82":{"day":82,"pres":["回溯","数组","剪枝"],"tags":["回溯","剪枝"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个可包含重复数字的序列,返回所有不重复的全排列。\n\n示例:\n\n输入: [1,1,2]\n输出:\n[\n[1,1,2],\n[1,2,1],\n[2,1,1]\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d42bcb540b146077b582027486b2a9cec7d5887820f7750843e86172d885da1f20611f1c15560ec72f1486e21db74e782ea472bab994a608223497adab2e98e17cbd424f760b263eaa4aae3296493a431f40bdfd86d69b8fda12f0b0ed7149b04ade387740d978dd8c830a993628ed439633875193366c222af2048ba722b7647eb7852465ebf62edd4a7be9cb1f0fbe7dbfe3551e7ea88ae785c9c9782cc630d18b1def0ea38cf7ebbb37fcefece18827e9a8b589e2b0da2e209b7bdfc70b420d9d0e80bea4d56e9b4235118a5d3f4e1b37a27b767106c1989e4e8fb91106f35f3c3a4442d474dad6a46064dcadd0ec5b1ebea6ec90e501671ed3e07549bb79b67a404f21da99ebb3cebe46df82808afd261cc86ca4582571639f42943a5ca182d9ddb72cba57006721dc87cfe4b613f79a4600a55dace4e460d3bd6447e69060126e08e65d049d009dae1f823566642bf2a65b16b8f8cf7bd9cfc5d5c90787bb876d19e8ab4bc3cbb024a18a6bee43c2d0a6891a46e11ac674a5fe6a81e3229ef98bd5a5724e904f6675a73641221841f797de61fae6195df0175d061d2a8dff247dfb661736261cc0254dfe3b95ff0e5904f981f10b17f085b0ff7a5d95ae5a9b2ccc1e88234e1e4240f51d953e251382a92d5288bb5c8612f1def1c1c7ae504d77cb4595b4b9c559aa87b9a996145276dc810cd9851c799e9e146cea5c399fd9e4552b12e1784b481b7e0f6f46353b4d092da817c09409fffc68a7c7b7f3701108f31b18d08357e19eb0c36791331f9facc9fbb5f137e784977c32c7db410da31468a409af23229a5941f08f2b63564c9dfd3dbee83ed34f5b84116a59ff0abaacbb0821b71b12e4b5510163e2142bda47db6bef6647d24f23282cf99081758b569d539af26c1f948dce5a80dd03f75dd5e0b00c0d2f7916f61496cd433729f6c99ffc7d42eda5faaa932c7e06cc930464cbf56affd5553e42e81a5d762063622f90812f49d51558eec1ccc926f906f705903e39773256d723f2af4271bcf73d17d60057eeed25bffce678f631416b7d03a8b65b81bdf954482063786f381e927932e71cecbd3b13f7da16a0c8379166f4db457997da024c32e9e4725eac3b8441f358388d4d0136d4531682323280b34e1daf32f343b9ba9ce19bf0024564e17afa971f0395edd27d645fee88de7cae3dac27dc4208bc4abef538494b5984a6695d108fd3bb85bbf2f79bd79faf2348d5218f5ee48bef28c31724fede6aed11f7b2aa4dcd1b3d1e6b39bc3a132c5b36416b07fec5f29d1d600dcc0de258c1649dec3c893aa25830314af6bd61e1ba12ac7c315797db090e3c782f18ebce9c7d9286934451c178e085fd568f7db9dd270cdffd4e5c7636cfe9a32c3a975f084f568226c0836e061dff0103c85e7f89f421bc7f340e66c8e16ae07f9336e6600f5346b90d7048d1be7ec4f5109cc074c8b141485b32438f8f078594a46a0b7c99ec6d29d60a9cebee3f46f8442e63f5677d1be68d84c44d7a4e247c4240e3748448fe102d10162f5828e3fb5eddc8045b8cc7c437f66f7ea07c76430dd290b43ec5c528e3762412fb3edcb7be06d65085a36f498e3f75989ba81714712c443d90da4ad9eb00b66b0c99218b297d9df101d3bddeb0beda3d0652e45749e8d0bebee15412b580383caa619cfa1257e9188008b272c776a4d5fef5a1f269feb5672bc08e3e9e6fe61904696417636a68b6fee86566c45606c6df0a839b15ec538056e5385fcaf10e58f3b890c511a42abe1ebce410acbff7fce9eaa4479e6595a611a61cdb0f1ae733753171b542e1d6ea24964b607f7063a6c298b83ea0b526606439cc7fe655e76f399e73cac39c70e4a67b182f2978bb4ba04c1f88b0dde65c95f54eafb07117ce5dcad26804963cb7a97b88678b7f5964ab3ee5240851490460bf6483ce643ffb8d91f4da6355edcbfd69d800bc8548c02841f8c9f1e5fba86e51341894b9ad715cd6fee70a85f660ef1ac8e3b27f6f25e39ca29e6b3d345d89444ef52c7b55bf3abf15708c4330f0570be42dcc10e3eb015bc11f21f5f2dad624abdf8c0a9c0da3e0c05b55a386fbe750e6a09a79a6f0ec779b1b0f2818c3c691c84734e8cf7ae58ea125acf93ba6d336ed826b1559ef5ede307e7ea3db07214dd67e0d005ce4e4fad759be2dfc8983f485ebc20b21f89bf6d2778ae594026751d5720112de4219e020c36c87f0666a02e7379f3b6ada79a5a3e7eb6c25c1968f05acddd65dc42cfd71b83012550ac2b937976d0323db13470e76517a6d0af210652253358dbfa47b8d63d0092e31a03975aca6c0e7c1ee9ca526ccabb27e65528658a6e947baed1d14efd55a90ef12b8fc253a8eff4617319b413be1e2d1b34b80eb26e6485ace040dd32c398a9f65ff3df245097e711576173f705956ea11454387ffd34915a17d343b0c2ba4f18d76d68efd5d4af7d3976d6f97f6fee97b3144256c3db23393cec75dd42d383abe0245eed75de0c48e1bc407b9e10b3b4b2121749cc1847bb53585719ae468ce2801a5c20e252562d650a6674ddc3087ea4ac53889e806fcb4bcc0896a339f5b93ccf0f06f9a4b5def65ec8ca83fe2163d1a2fc46aceeb769c4bd7757ae18b3683ec6f102437ed02f49b322e96c1e467b0245257fe8603a1126ebfb31ab8dccb3a49772e88cb6b5c0fb4474f0ec96caae67bd00055df41423e0781759f9e9be0fc5f3341401e6a3ae3eff8e5b004899d4201a4cb0275bd83f05271775085dae88a7ab31a9673496c8af735f391e6b2e48c677d0ac1966f19ffca5598a3f36c68cb9859c99e7575b34809c251b2ceee375ff7ca34c6da66e70043b9dc780ddb53bdaab64806cdb0ad721ba50bb692d420659d7e6d7f89918966ac98c3dd2f0603b610deb7b838405bc1d4346c665b5256cce88ce97603b449cad4d2e51c14bf2a889d68ff22d680d4b5c3182a4a790b928708a02901e1ecafcb3f65a3dd9b7b696cca88fe182df318245a400ba48e7b7086c0dcee695c591d9c87ad2df0b336a6d85ac0e9a4a1a8875a56fff60e8ca2e88f87da9680397939960c18684c16804369156fd1d81a37dd6799230e9b724b2987bc99ce299a89a8ef5f9c331d7fc14d580cacbac7ae408f1f5c91fdea6816710b401661a0a833941d51c708fa68eae11bf59bfb217996ad3e7e79227adee3ad893f75d26c0b07dc746aecc1558353d1f2fc7203a104c73a230ddc8595e6b594d9f5fc8cedcccf9b32656d3b105a1d4cb033cca439e8fab7ccad4065b122f37a5249c349bdf33418d02929a98f347dedfced6884d2a5cee3248a5ffe2858689a9049f3823d26653fdd6ac36ebeb57cc7255109a9fc5f7b3ba1318e06701bd21ef9283935dc65b5de4deecda5aea876f112a6ea6874e2988c725bb01503ec3e7a2ccc24106cf2445ccab26daab4c2e9e4efe15543e2cddc03c4c685de70eb4dc279e8b9bb38e5207c924f4695882f86a546f2b151234865f297106242816196e098ec37a04dda5388b95ce3e70e05506035160a3ab4165c5f50eb89620cae01d10908c61def9134b6d361e9be7805201fc3f8bedd0026ad37fe53d2c8b99346213611c094337353d4eec66722f4b65750517003e41d25728a03afa8daa6c8c91c1f21f28ff0eb28727a1ead48a8a7dace9a22610326ff49fac5468d27cf4507cddc19739b580db0bd74bae74148c154c97e1156f34e1222e9b1c504f91cf3802fa4a227303eb6a916b5e80354f3bec6b31caacead2b3bd82abf31dc818f863586675c326f37dd06e182e250dcbd1ee200f91e64c6c3b7ce70a94190df02c385ca0b528eefa8795f188bd87ae73b041435ceb070fb09662549ef38cf4dff483ad10dc655f498b1368b5cb88e8eec2bef7907b5f5420845b7015251c8daa2b4eead89ac551eb43f13c58cd4fdf6c5ad0787fb9d6103ab6ddf3fb3bc06cc498488fdf285926305dbcc3951fc95d70146886a328d303b96322c725bb82ff947e29ac717ee82a64ae8ad72bfed1617cd314cfc492a922909bfec33ed3e7265f506aa934ba099773d4eea234256245d5d24a56c500b20f5f46055200f6b1473d6a62735c710f2bac42f86c079fc611d901717b9adf3e92fc6a78c140d6b252b16e418a83edec89abcc4d55786bc1716dc9088550f73a7bb0640faabc705075d5aac7a8f7d1d0a9267e474121d028536998036945121b7bafaed9d9821a967b9de10fe36a5486042efa889db232d87be8c7221b124b1cb62b42a9edf4e19c4cb8c7063cbe675c2bacf1847c9273e578ca1bbd4bacf470098c55209b84b25de764c2c76f454e7216049df005ddfdabd2fadf9986ee103e489954c06faca5e65cd77e10f7bff9043c8d551602a31278282944072f0c601fbaffb8eb9f1005abc677d75c1d82e504e6c6327bd5e2b3d2c4d4f04032a6c8e174104e1286f1eb3f255b5a927585ec8575f91a2ff005faba7f672a698757f5d6cf66dff741afc1cfa9fcef5aaa2f85249453e00f8144d4ef9ee3bce6bb6f3401f30478100bba6b630084e9de9105d00fc077377f50d78e241b315228c7e1ec5f8cf6fd3ded199faeb1506c750e7fa7b77058cf160826aa4af69b0524dac187b479d0b1548cf64089ef2d7283880862803fb0ac74a35adf8396f3d34a6f2a4297a63ec6cd211881c247fd568f4d1d547222bec1a103318ea1836e73a378caadfff511fb8c289960c91ddd6693a364bd616088e662b9fa6e68b576d4013ef863be951d0adfee9f30a7e3a40dc1d116655d7a52e3250ece2bf904bc6be7ca7bd6fbdb88c9768a03150567cab4b35b6ba8d9c228409500876423647d596589d0002b11a28577162e143fe9c60ad7f9ad6cf0848bcf86c867fde23ab52b58dbe473591b7b74110c3a5483613b1267aaf4007fe9160d8e2687c3e581982612bbc90df8d85b3f16e4dbdf757453ca536b8cdd773bda10447e1c642e457707389acb7cb8cb7f1fdd524dc9c8d3cb92a822849f721a7962c2340e4efa39a6a5c4fd7bd708a4180bc636bafc76e6cbbd1587e0d84b651462833156731b29210f5be27f5fbd3793593c2511a3eecde6403827663fd43b234a9ed20ffa9f30dcee6649f3623f1e17615f650b6356d5aa9543e723de6b1f8141cece7acc8f9a9efa9b5c67be89dfc61a546e8ad3adb022749bc10519be151617f19a22d93cea5a6ad88b9313ef0a1050fb0782842fe61c9a9a7663a6ec85e9fdd2a81e674abc489ccace900c7246959822719066eaa1d5e3c7dbc4f494d364033a7106df64f0b146fd6259cc83501e10b64593c5fae8f424e99f882d172dd14620ad9862bbf06e3338a83b5f3495646b69f5c1a60a4a628a902416d96d28aaf3a8767140eabc9ffd90c71939dadd2b8f45f0057fbeeabaef58b402ce4a97af273b7c97f51407892c3977bc13f9d3bfa91d842b17226adc0685c2b435fb839d3aa33d2bec3f05ac67f8809475645233163d5da4e5d9ada67e8b3524a5e894980dd1c49ce80c4dea91528b9f210c17dae400abc7a618bf3bc404632d47fc917f45f4002070249779426709a3bf5f27f22042dfd031aafc3eb2970db6ad0c777c80fc7b1f73a73069b2fa2e718831c87be6199e4f6c933b128d85a2f48b38b4003be1d9258dedaa79d1afffb252d90c339f98f4fc34cdbe5989f62b2591bfd6323b06089a8e9183c805d0574c75e6de958fe9e2f78ee1537c4017966136379da4dc1befa8ba7c3afb434cd7211324f366d673d11cf9318fc213574357f5d941731a7b1ab8178b9f3247f84eebf79f04429a0033367bb43b83bc86632a86dadcee8735341817f315b85800902a91fc1018cadbcf9bea9fbfe5f9eefaf177fe5493d5eb1bd0fd27abcd8d21adf912","title":"47 全排列 II","link":"https://leetcode-cn.com/problems/permutations-ii/","question_id":47},"83":{"day":83,"pres":["滑动窗口","字符串","Hash 运算"],"tags":["字符串"],"whys":null,"difficulty":"- 简单","description":"```\n实现 strStr() 函数。\n\n给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。\n\n示例 1:\n\n输入: haystack = \"hello\", needle = \"ll\"\n输出: 2\n示例 2:\n\n输入: haystack = \"aaaaa\", needle = \"bba\"\n输出: -1\n说明:\n\n当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。\n\n对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c1b032f243483d7875596a35599d892b54c0f31b000bb354ec0a71d663ea883d71adcc3e38c922a16c067bdd3cb8a6a41f0c327acbdb467d64159b9eb1359f0043708944f236f9226f654d0b88c049e78d3374efacdcd4fa451ea2ef3096c0f1dbc33138fa3f760e9213957c9ad53e613b45083e5dc32ba22a9929f52b5d59ea626883946e62410fc42247f0da772b0b69e1e62e535d2daebddfb9a5a3444d55bf5b3f00f012b2dedb3e8b7610a015b74e0295584073e8ae472d0a2bfc218cd9f9e60be4414eeba218bd9d09186bb81be8a04ca9ff1712f59cc68ec920dde96b8cef55652c7108fca2dff73922c3481ce9c6550ce181d7b922fb5a74f9d0b001128272d6490b53982242817bd1f5280588402c24ce08b99ece5fbcb4624efada1520ca414882601d9709a86ed8997101ddfcc6e93541c85f0d8945f0a8de9abaa387d84985c46053b0daf89dc9d4941da8fa3d12a0cf88fbc2e529b23ac6ce29a1681f343e5e56d1effba260309b51186d3187e933142ca9b52698e45dbc9294d39012f1af2d5ad1322f4404a08c40425af76ee4560ff39902b09b76a8ecceb9f567bc58496253faca83277e72817824638ac7266ff9764b2d3b657557d923c58981a0dc30bf0c16a5e2ae1c19f6207012db8d1cdccbef3f70297fcfb0dee73af7b838ee9f16a43dc2ac11c38fe588677fa1baac04e21bd1de44917e07c381f79f4076b12a2686839dbdc0d22fe9ffb8fa93d79a4f0975b7dbfa23b4cf285f35b9616f8ad2632411827fd3b2c81308c0fafe8b64fee1fc81b809a8a7b931c4588bc975a81f3f88e03c489fd31e3dfec4117264583e2d026cfacd3c3ef70b797f28bdfc866c2abdb49fe69afa4a1635e0ac310b137ba189b01cd7042111d3b9e8318023b7728809619c5d3b4c850c97ad78d48fec331575ee386e2c03c888b70ee77ba7eb8470cf38172edd86d010b71ccdb27ad67b22727cad5eadff9b48487d29974d339dc0473efcdf7097aa29fb7e16072780cb79503f5d4d9f6aefa0b429fd180c0c1191d601b5d021d8756e7ba0af52812fd434b6f241ce7b04c98eadad5a8c5c2ef2828ea2511184317790187a7b04e955e700a44041b49c7218eac1a2442c168e92e6dd16624a2d4829100e0b0ec8ffddf1b5e67f23077af05a301c321ef3e178824c7e9e4ae313a0dbdea5eb9780ee359917fb99969a1b8cefec8f31c928196bf15de869ce487cd6b4a9b400f51f10a49d6dc6b745caef80117d0747385e43faf09edad54f1c751a2874d3df011536ad01d5ed1259aa56e6c748c4043c83f183eda273c63977c74f5d9ac341c4754adee71ddc97ad9cb9a6f6a28548294b107011da4a82483cfc30b8c9f5b4544a37508d8e4934b5a87e9e9efc3a101dead18622f37f149edc638b1a2155044d06fef150f965811941886cf5e3d803e72565bfd0eb235aafd3221728b67d48e56d3beee41251ade71c277b3fe8adbbd5da99c246e462746f05c2885dd1335062d0b96ed87347d68ccd41d330043743a61d5802d12062cab88e0bb1eddf8a488cd87c426067f1e904d14032f7310176ca5e6487366d60ea5c2d73fa11c1df6b1237abceca9d318fc7ea402566c214a23afce486fa5553f80827dd212a0c0c7846288db13dbdcce20079501cf5be6fa8f4521c1f1a728ba0f401aacc0b19f7a562d4204f1967eede26b6162da704ccf47e9401790427d3659b5edacaf04672e4127cd7e3cda7f3a7363d8a74b716adf0b6ed616f67bf7b3154b77ef49f8b2959e4c96908d2dc7ffeb3a94643e47975611e72cfaffdae6011500e115e22206c825865b028f5240360219383ec3252443944a3f6fc6d6876f3b3e428a03adf174874bc83f5968abbae06d3cc8b2ffd67e9429b67985d15dceedb8df1e05f06bf45e6f9a01deee2f634abbc1874ce48a82d42d80255d03c9dafbb7861cf5a5a9bc1eac3d83bbc0caa57ee00c5f40b30debc4539538a8e2d854bee11a14d2eb22e19b6f3ae5e79c87d8995ae71e8ce489a4674846883737dc13f253bbac249d3b8cec2519d285adadd3b9b0fb415eade79bd1cfb397f0c655419c680d271706a233abafdaffd431180fe4881696f783880f9c6ee06b9c21b3950ef26ca94294632b280ab00f62ebe45b4e0fd46b4df68882b4998a66542c35ccf8819fd537d7a0506b98fd23ae502b74f02f6b7ba68d3dcc2f2f1a1b0c8ea6ba3145149ab7ed317a93c8261793603733a56a5fbbd4b4380feeb57df9e983732da4514bb212b2550bb7989756bc65374857a39d06559f39dfc5a4f522a314b8cfa41bed63c56dbb01f12a272c66142282d4456f54686fe69eed5f6851da25ff072671ac23dd47fa678e9674e804a2045e5b5af2dd622b1e8fac87dc560fddf512c018f08846f5c315b976c78e1d42d2f9686ed8008947bcc9b14573b7f39af129d973b2f9a4a6482bd57d2ae171f5c62c6dcea6c933e39afbd997e0300828905222dfb21f76582e9c1aa6508ac5f8e590aebba517bbb59a9aeae2c1f54df4126b94253715cf158dea79e3d0e66b7171a420143372198cb4130f0d72e88d09c64980a8d0aefdd78b6f247ea5c1cadb3d9dbe044b6decdb77924dab5a71ce0f9e810c4a07719eb4fb3096c94b05b2f37837b07e87eb5257a6c3228452536ae60325f73f4ed65e3c282fdfcca14a890aa9fa4c44871bfa0b0cbad76ef2a3200b444608b2e5673baa5ff5c96a1020f18e1b9e723f4dd1b006299d4204a5bbd245ede7e02123e750d40afb2a7bc7dda2e6691c3bf73553708743f48cb4792f92761ad9af7ac1e90320e99eafc8c9cc2ac050975d9cf2b4863f5f17db967ab5a20f1017019269dcd93c2f175d3ba37c229cc0bc868b457ad5b607300529eb6b2b191668a0387d87895b532256956a22f809f18f5591d28cf7e9f0f6cce88ce980f4511cee34d7c14925091bbf7fc92a772240c49053499aca0dbf32266cc0c8a026dbee7d7a3176ed5b7dadf9fb5ddd9cbc265832ca411ba4beea0183e48d2e4928199bc9a0386c3627d3e28c2e915c24a468825b56ff326a7dd41c9b606d46855dec0d03484c2df84677b4edf56f00cd3cf7dde2ddf60e7e46db5f759c09cff84a8d4dbb8ec822f92ba1acf9cc382ea40d508b8e9d452d3e89a351cec042e5e15a17704821c11ddf4cff77df60a98ee119d749deeafed65deba68d88ef71535dcb77cd44bfee8460d776e1657a46e7d180539ed2bddcb105e36422e9f42c8dec7ccb0b33a569de401b4da8f1527cf6482c6a570908a4e171a0d53e061d878ded63a419f6e9292d1f359decfced08e4d6409a36133bec7b6cdc9c7e718c941589b665efdc7d136eded579a662c59ceda818cfaba1e45db30089721ef9283935d941e09b18ca29918b5c80c5f7f2bbdf04e74a28765fb2b7a5dbc98e0eece4e17874f2cc7a228ded11c04dd02bf46073e16d48c6119775bfa47bbb333b080aaf3cd1307e324f46911ccac6a073b79664630c75f34770a2e145f2c2f4dddc36912d3b212d8c19c773ea75548461424efba0535909e4afc9e6e9fad4e6b90b768cd9b52123e625fd8ac8e1e44b2789be38b03249a32f874699d9022605f701f1e1b7f6b7d14a5691d6b427e5f0517003e41d25728f27faed8ae6bdfd584ac7153b673b29a27e7abc5f3cf6686e9a22610322ab8cce95433f828b900728f84da76e3c5d35fdc54f227559f1e109ea8057f3ee87018d35d091cc58e7b49a92c673d44bf7fb33f798e304a558a444c868aebd1a2efa088b84c9352e242153a3bdb58ba329e6e5a6f66469f83af630ddfaa0d772e29b410801715f27f395bbeb116afe0df99bf9bb190ab62fb490f12f77947b8d62d548bbac9f7cadd8eb201db294842981272fbd6dceec48cebbac37513116e9e25381c254ec8fe7e1cf69d82d950f14dac7810af47a46254de2c3af4db5673e5898eaf0ab777ee9e479df50a1f69a1d9580535bd1cdcf698c03c65d83644e047444ae562192b35bbfe02bfdb71b8eb034e4fb97e22feb01dc798e3c223fa47140b4bfb0c07ac938be064e3689608b74c74a956211e268b9bd8a417b24c9b97c2b9e9bd91fa447dc8d1b2ace4a6944461fc460a9f48de43c08fef415b835447cebd1593547d93fc7c498697f4c6edfd821e5c5aa450d9ba2fb246fc7fa9814be8c3433797b05ff2a9d5d6fe17335ba0bd81255e5dacc0870089aecbf394bb533e05223fef42bf18419f29b5d7129ae6642b587bf55dba0549cbebd9abe420eefd282411747cbf006495d30dcf99b3427f5b9e05810611abda77b43a05d4cf6ab1a9530474a30829dcee6352563b1695602b4cc1f9bc93e13217312883ddc9449c53a45f1a378111ef91744d1d92e13abab69e6c8e80abca91affef4f2ac6f7640525290a36c7c8e3abab94b6fa90956a9bd0d3d373c0d99b85a25a0d1e2720935ab437c63c3f6cdd802bb1d2c13a82787e200c23a79efa7d8e84dbe4c302dfe6b408e057d5c5b062a9243b868ed048f2a87709a81e4dbbbf8ecab21bfdb3b8cb8a7c653a4e8ee082e3f1fc063e44aa1c8eef00704d7ed1b65ef080d33ef22f6f73df7019fbdb35827b896d3a7f93551c209192a46f6565e81d04a235e7c9636e31292fec51d65aaf634529ae40ea311698d2a907807505b62f589aaad3829fa5d339b8609c25cf07c47d2f4d48ee124101a8ad04b3204f2e938f3494d1df5114d5ac814a9251df660d723ee068cbc7e61b24114b5bef437910131bd2fe38e060199f3fd37aee3a949cbc5522f1b781ebe7e4f8660be18ad2ea2c62e8cf7d6d8d461c711384460c37b2ff76b600834a39c4b857ea7e59e89ced40517ba8fd4112db2c7c4d3fd1b4e912c6f408c9ffc1c5c2812c2723bbf26efc0512dc4d7d2f9ccd4a3b5c25db7f1cea83d05c6fd7af79a61ae4b491c117ae791541fcc555b9e9985277b7db0d1c40ece8a0f34a7a11bae8be2a64e044877c2db7d51f27249a8a418a396402f3acb95a367859d6257f5851ca5d1c070f44b2f263bef64b64baba303ae1639d67a0421b94330218ea3c4e86efb56751524721254a17a71ea39934567104eadefd8de536f27a18570fe90e25b4aa33f3fac1f4ec421bf21b3eed3e5ac80c585b25c735cd808f80ca6fb1fbb5500d00a1d5d6b7a668cd369604049be92f31169262bb78c560ee6ef39d9df912c31083ba3539cea1d0b73bb3792c7e8719b461f8a66e63a1cbf9663076f625b0738c4b28738cf0908010ce7b8816452cdde13a150475100104a24191237ff89f1bb9254ff4e69ca10e8ee092c819cfe47d27d596d0034cb6c500bcd9f2dd64c23b28f61acda633619aa1b52378465a6cd4f2e18a2494db09c331ed95b296c004ff6af8a6020e28080936e0bb18233dbe53a88b457761dbd22b8699d61c4d33b5317b5a6793ec279052fe41cb09888c079ae644c0d12811acb898f57ab9fec66a498f5bf0b6ce464bdfa91362f6247611e28d9fbb8c49e20e11f7ffcc0fcf323b79982aa527fa10d914427e3c9976d32852d093e8474866ccbfb9087a0a80600f35e7a61640fba8ca1b9672ed3ad0485d62623ff385037ad9b0e86900c7751461efa1d51843e7c87fb0d5a8434d179c707965e691fcbb08eb0adf6a838b61630e0ec038efd9b74dab2f18568d81f095a62216ba02a358125f61e06929ce33d1e160b96a69b94feea59fa4f60d4ddb3a9eff2fb6d68c3ba151fca142865f1beb475c2c5e34a799c663e4cfadef14d6cdb0c13b55fd439a655762711fbad346e4f242dd9b779565665b712eb9dec072afe3e58606bd26c86faf17042d8ffba979d524a245aa90dcd1d09e159a5ba95df0d296a5a83aed68adcbba4e71876bb5689d3558ed952fae5fc579d9898fed0719844477711a48a9ec2c89cc0e9d2d95905ca777842f4d68b4569a247a2c0c6bd125c11594d861b8e0b0807c91ca8aed05fcad881b50882219402dd97448a9f5ad4721cba95bcf93605f905b579c1e26b97e824ab50a56646ab14b4d0920f132d757da26ddd62a0639f71c6bda4d04ba1985998d30bc87b1c0c88ef8e7f1358190b7eed3e8d7e4b5fe45de87f69af3e64237aad39412859f826b26f7c79d10d0631308f50934e294b97e28a997fc3c29b37918e76a066639a7bbec960c82f50e6c1ec0b400c0e46b0f86341ce5ba5753a5399c8312d16b2b9f97f187b24ca437840ed944ecc88c1ce8127b5f2794bde71ad42fb0186559029d9952fbcf04a600c7e7c1367a55103c47a31bf76c733cb9f1650ce3effec9f2dde69da26c885b76dddcb00a083b09c8ec58ea03293b680265d1c5849fd0e8cec1dc301f4bcc1e872cf80cbd361900a148887f2a7b38b0f19c0feb60eedc9dc11689762af22f8f5b5d512bc8ecee12e5ba4bcb9c57b63515ce35e658bbb7cb43c9e055dafe5e37f8820d97d898b9b052a97c66816824758b270e980b6b7ca505f9c9dda484d41fd01de943175a247939a40ed9cbe9d6e02beb17ca04e325b53ce33320ec1f13bfbf162fd437a928d9d743a4d7791d62b3feafdc2e16ed094adc607a4d89f34d16ef0e410ae8d98f998bcd4733ff456143af8afb63466eaaeb861f926256745c7d63c811f9eed7c65bd54e4f89f97496588ffee5b1d3967d458f5bc983c3060fd97cb8586e922593659c792a51f2317a97ae7d438cee69c0cd39059c835db24c9437ee611c97393e47aa14fe79b3bd570b003af8bcfe5bbf201cb2b3d85fda4201a9a03b686518fc85ee31fdce358570fab20a52654c9d0bf62d8da3cc9ec308cd4dfd0a0fa249c0bd33ffd081bd52a0ea2b36f7c44b0998b90a7ec37fbd7e6a2e9428ce736175e23e8b43288a6b059e2cbd2f6a406664bba80f4f257e43edd3b1e3c5b22460e767b1d1b05e8a49b0650e1a55923d567b1b936dac159dabef2d610bfee1119820759aa9be76139d92f0e83527d824b0efa6a70ec1b3acf8ec1a1a9a7000460a48fdedee8f824a386e703eaed70db70096352a0d21aa4b337b4c02cbfe44e6a2b7b7cea954df2f5a2a39e3fb4a1137c86d05152ea5e49be758d2fb88536207fe2ccf81579cbb9d1bf9abd030bef47619f8134e4de1ff748ec9048fc65874bef4f594e8bad9b01aa82c2e789e0db63dbceeae32ac39bf49755def5692b23f5ffb013176bb9c6c532342f12afd940686728f604dfa187c77126262f2cdb9a2b91744e92208a61bcd2758fcf9d6dd0c48399a7f83c00b0e63aa1572d3e1e08f72c54cb5840aadfc48a0d8c83d17a21b51e06f58ea8f26e8386ad5d7969640c5c3804bf332d2e675b56443723488ce6e0b0a026b41a5be2760e1d9fc5f1d9365441d4a421d40de7fb7de688596d76f8045f288a48f01db7180822f340dc584f7eb0e27d5a7de4e6f9886aa36d2faf3228ad23cc02556093d5173fdba1a0d6e166cf81f3edb1cdc2a7747c06b4644db726267a7b2b8de74b0bdcd9f98ba7a19f7b072f4dfa0b8d6d7ccf880081880d9cb07ad4668d3ffde2d26db87be539e681e9055d7e0c2b6c6f3a630b37956751ac8c65681284d80a2b0cca010e1af7e500b76f867cbac90c0ea250cb5c629b1f8b165a43d1b02f32c22dfd676bd4d37aa0869ee0e89741a6bf09edbeb53560518b0a77eac3d473e935b9c74b5597a2203a78a196a64534528ff11efac9f07b093bf66e5d684a2781635f066245ac588cb0642a24409d1aa21048516309f206f80c72022ca14a59131fc8171f4b756f40cf08e9c405b75e151cd0abfc4d186d7b7b02e39e93a990bc2a293487bff966b367a7644762dc652a846699fb66254204d9e2fbac691f9f6ca4b42172a7987bed9caf0f6edd9ccdda1b5caeddfdb1bb6f3a9d02652ef9f6adf6147eb1382b6ac0539af8ec6d661b49a5c8909f8d3bd03391555dab5d86ec58c81270e966ae05692b54f9af8a2ff402bdd5903671965d42673ab81c5da58fe20e4786cbb6827e406f85b0cea82f4c1d1a5bca8d058c4183e422f3eff240ed95419237dd66e38a9c4ca08eaa84e259fe52b11f28d8449b141d42eb7a872e2f2389afde9e64f92a037f1182f5e471ea3da69eec4a530aa8ec9dccd7f053a0afffd4e3df6379f128e68f3376f170621592f41d3cf855f6bac170c54ee7a54b994d9455478b1d331a46c60f3bd4f56db89666959732a9f19ae3b2ed15c70669af24dcda05889fb185078e196a085a6d7aaa1dec92609145a71615ce591c7a7869808781f9a2b3bc88348a0a334b0090305b34d8402f02049fd8d9436116e5d46c4017763eb53ca343d87a36b188bb6ad08ba863d55107b92d42d10af8d379fea7338c1ae71ff891aed613da9472b1304ac2b20a500fdd1ae4e86577de98d7a9008f7072e7cbca3201ba1f51c649ced4038f751f197d143419f286f28dc2f5ea576f53259d4f4f4f29fd4bf21f912d92e4499943bc61fd25d5a6c76f8ed60a60eaf8a0b35d7e34fae820503480f970237cacadc0e737819221c0884d0ec4c7af98fcaab06a71f92188399b21599427074218583bf5aa5e0e99f98aa9c03fb245540e3b442f03fd660c3e6b2d4e6b1c63da3734ce4fdd9a2f90ee2bc2d6b05c2140bb960d6e6cd1506bb3a111dece91fd8248e6365d7dfe37923605055594f491d594506665798188ab044b7013ffc76a6fb4703790342a22a9b48fdca6c852accd27e19e6068816e9bd23294a97503d1706fe593a0ea73f488dccd5aca333f2401564cb96c458fe57f5abe0e4b5031a84158407e1b9b1f2b9f5404cfd61ac2c959a89c78d2946b26fa7ebbf7a227f141bd576ee3bb24a246fa9adb367e5b5b31b1db489e6098db54278c2df769349c939fc5f46b68d63181ca305d5f6959540ace190ffa21faf78874a7dc6dd88d9f910658a05841ef6d80def70c3baa21db5edcde5c9e46638e16de235cb74ad2b68dce1444ccc24cf1a27a369a0d2c4a433817490a2a07375318c8ae69d29056e613129d2c086fd58b65ff8e12ea9e5fa1ddf195878210163d7abef4b511cea13d83800eab41f2b230a249733809bc2bf54424b4aca56fc743dd9ddf01b96340b3025d61a7daf95f7b16578d20448e59af916b3a815cf808a53e1ef89a97e69dd9b88a811209e3cf2154d928fe3d0bed3db0d6f0d3d9d1478e29b45c3a0fbdc0dcd5143b5ea318ec64696d2d69fb2e2796508bb1533f349a2304063a253d21fd7e3ea2c19bf08783bda8c9ea9dfc7d1454f17ccf71e8104458c6ab612c159d8c2d687e2bbe9f7521fbfc2ef18e55bd2adab84cebc6390487a26c9b1f98a94253461eb7ce2f18770e732ed936e539509e64e78ab42b8d480d58c46d7cd3559172649c0e8acaa1d4b09cfe768b39d2ae659f4dd68660f7527ce3a849ac006cb257ae9278fef32b754f5c64caec6da85c074fc5382c41086d6e3bd1d9e5e078b0b0418f4606fbb4a3c492468072867e6a3470228dd46b368d112ece4d433c99f068db4946f9b0277c0c10567c37691cc66b37349475016d0acc464c486a0a1d574daef8ac4ac415e1fade7afb34ce710a9e00dab558e4e3981850f10aceb6d401622053cad752be29d95194de55060b2286f45a6a517a9985196be828fe40ae06d47a3da9db25b816a775a18a8deb73527bc583a4146dae55041d7f37c0b00c99f210be8982bc8e3525689dd41e9bada49fe5ce5ee1ff6da097060c904dcd13b458f3e71d6f6d2e0a1fa246a9cdd3f702fce3f736dc60e458de8ea93734a520cb4ad0cec28e12f7f4d2bd8a4ce12278ef755f40d3fb896b3400b3712fbec3e5edaee59d23719b50b485a04f7e03c8d642c4a8ac043311bdee0ea2bd1e76f2ae45e4d43431971f1eaede8314c65856f434299cd0fb970530df180a7d7e8e71b798a9bfeddaa9d8ddce85979939c083ad99c8b604aa83e16a3e057ad72120b3860215a41b6e69f1e7c58a1861fbb879a5b0edea932d4ef93bd83681cc603a4aeb43d8e8a439b150e159a13a0078272be016075306ffe0c190628f708f05a1002f7e080fa48bf658d989930b98f9f3d09216c2ae426fd7c1051b4cee687af69c5f04c768d73bb2a469aeef6d0e801caea4e8f4e27a8eab393ba5ef01a6897e6f26ef37bb5e88b685bfb4e068539253092486c2eb4db64080cb7ac32efa134ecabb86a67a615bf9357dea897a5e9ee2530085a3ed977516ee6ea2eed32348f1728b8a6dd5caf7169d5bd2e76e66fe79fdb605133ba68e32d86405a1d172f7015f95a55164cedaa0f7d641a1a24b4dae2ab1ae8553a18f6fbcf771cdfd5fe9cea5aec9945b0b4ee550d72bb27abb318ad170684823715e7bf196be7231e7226c074a6f4faf2b2053dbde6cb6cd9891e1594f58b71df6e00e0261e887dc573cfddf000b4764f7dd0ee4355db0f0aaa964b1c45b0c7ee7c48081a612504bb011f2547d56655a7fda1870cdb5a15d5814246bef3d982e259be7ba929746cb17b912c9958187171ce35d3a8eaa29d317102e7bdfde5021619ec56aac9c59a5d476371a7837fcf67ebc541862139efe7fba43c063f96672a90629f524844e85fabda965cb00b6915f4e03219a70c5a067e822387c6fea48e9d30e5c5e4a7082ffd6b2610c6510339b7d66ab7831b114eb173f54afd7a9ff1c9db033dc9e905e7dee790c4117b8d32fe6aad1c1e482b8c1e01323ac97af2792efe8260d1332a7646a93e7cd6d2d22cad0e07d7d78b4fd0fe17b23b3fbabf184be9a7b7957631615dfec7ef15c3a819d5c181cb979aa233f29cb38d137822acf24ebd65690475e2e3544116ee87d200ae0718c36f6ff9140463f1a902d354e710b979a892dba9d29a5a566d85f5a64c46316db37de905c6c61dd627a422b03f08fc34769fbd18ce7de5b7b2635232b60264898cf57aa945ea6f21bca6e5dfdbc1f7437b31b4862ec58abba2f9782fa7e9106351ced1b4d5f78bba974ff568a8dcbcc449b94d096076acd9fdfd5295889b6d12eb496136563fa66fe10469121bdc4dbc550d3e946eb4fee0f04af60c358470f41715953973345ad52a8bd347ce71e346be22fe18713df75faea02be11f34d3d7fdc1a5151ec01bf7d18a93cba273c37287b02c3f36363c2eee6b8123a89c30cd5","title":"28 实现 strStr(","link":" 之 BF&RK 篇)\n\nhttps://leetcode-cn.com/problems/implement-strstr/","question_id":28},"84":{"day":84,"pres":["滑动窗口","字符串","Hash 运算"],"tags":["字符串"],"whys":null,"difficulty":"- 简单","description":"```\n实现 strStr() 函数。\n\n给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。\n\n示例 1:\n\n输入: haystack = \"hello\", needle = \"ll\"\n输出: 2\n示例 2:\n\n输入: haystack = \"aaaaa\", needle = \"bba\"\n输出: -1\n说明:\n\n当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。\n\n对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d41898a42b9490a617222305f653595ed556d87b8217f57873e8c372d8a76a0f52312f1f85458f475f25c6c01ed76f2abe143274831f1a71a48015bbcf9e606fb514524d658bb65c94621422a5cbba421e5e75a5aabc4e2829065bba2ef30529cc9b2880b44a623376a8966c64cf0af0e2b714841707aa47c914dd82ab7604508995ee0e89b7862420bf1e4a62edad2d0a5846548e823444cfa8541f2ec846e8bdb085a3321f307bededb3088b354ad4cfe524027e067592c23e7211d00139109f0d322899b0855a0ca110772b7bba4ed31427ff7e2b415459eb1661201dabca5394168eb661b4a08c49bfd84aaff6c8e808475d444d7b3819853f492b71b5a78eb77ec7f8f5e150ec16200c26ec6ee290689487268c94baa9dc61da9a87901e5cb0a20915a0af8065bd94c2fb86d0d9edd48073b2e80fbe1764d008762aaebaabba2b8f25646ba1860a4c8da51a5ea9614a5de08d1373d5985ba2abbe97f8dd370ff7d4b6f141efcb3693948f1ff62de800878a8a45d12a0707eb07e09da6f3295c6add5336cac860fb29d2d4d8feb085c146fb26e8fe77a608a755e8036331c3c2ebe7301681028fe4c0ffeb5e54db4a18114c70c423eb488ace7bbf4cf9168dbd0c88182a8638cf47b69458c1bc1337012d18d1ceecad02f731a42cf97f420bebfe70e5e9e128e3cd8aadf9da147452546c914d55cda7393f8f597622dc99bf99c5673bd2d3f86b59b9afc5aed6490ddf00035c27f560a97927a32a3f4c13709208e0d8b52a7f2fbdb3d9dd9a190966e3f59463bb2e5f2dae75da7a1b775951d899c30e61f3c88c6f4986953fdeba1c41e58a190e8ebb60f646ce3b347d9e7dec7dffd06a8fc57eddea8f193c9889b250bf5505272a1d2ef48d8022f5582fcea6dc160b471cb074b1a86cdcd6ed38db075c7e766fd83999e08c7c38e970f04e1761f2a2154fa32748dc24fcc8a2acf590e40f81eb1a3086ead51b4f78e7e4b582f945a399cc2613dd6fa7794b22ae87116070b81c86550027240b15ce587b525f9010e2d3690ee3db4f929d255597a82945cb615d4349bf347ec7b3ddc80aa8b5bb46723e8b7889c5bfe2b693fb37829624c9c5b9641bc2acb32917521e1c7a0470d29a5901050f38acee00a664a1a4154f28798324764b7e98600e25a3f05333fd8e06eb94e68ac4be632aef3fca6f8984465b99f2ded949490178bf54afc0044f0910896458414f7dfb02a84356985347530a7bc4ce198bc9ed792136ec8f47e3c07283b1f302720303c458b33acf55951e64a822b2dba93249ca4e5a70afeb8307247553a71e31273fa63b06506c961f963f7ead8b3a1dbc49de98eadfa0220e2107011d95c844a1af233aaec1a16d7087b030003366c89e934b126fc3413756e2a68e485508e739a5b24f9a0eec13426ac8876863bb869fb33a94e6f1d48f05f21ae9b599b578ccf22303dba755cea530fedc61c5198f313287c35f9b6b5f9f595c56de556676f22d78650fb3f7c65d2b84ad94f7ddaa5ed49c13c083a5fa11e4d02d10a63e08c49da78587747e6379f366c1931da8464c52759ca417262af277eef71702872ba87b958aa286e6b3227aae6e79d198cc8da732447e4128314f1d0b3f8405afb2a2edd1f3b03247e490cb2b11a82ccdc0078420dfcb552a8d554150e3273bc87f401aacc0b19f99469d727681948c8dc27be16298304e9e877b42179063edf76b455fcc9fe675beb3f45d8e4e5a5e39e363db777ac23afd49aec545765aa5037488570cd83873b70e5f94b08d2f77cc1a2a64741e47947602956c0b6c4ae583b5220025c3e376f8a7f66a60cf514356d1cac80ce045266064898f9f6757e74c388e73faa3ac03547409d8eef9886bc8804d2d6892ec167e9709277b55e11f4e3e5acf2e7650aa95ae9c5a511ecfbf4129bbe396bcf7f87286efbedd343fff09dc619699c3f79e6b3ed9a8026fd54aa2c843d909d3b76b8b7f1d5f9294b91e815c14fe849a95e4232f09e913805d836d294c823fabbd455152ae60dce637105cee7aa7b6f639a0c256bbc6dd0c8261db324ae18c614f1f777e71e8f933c7c5008dd868ef0c6850508263203ed7c2dff806b8f7134525bcfbd8365df45e8622d42dc38d9ca3b293db8cdf81bb704a25da0f7ff05fa9176e76f05ddaf2f3d811086cb19b41d29785450c1fc8668ed71e31d4ba2a4e370d785d9e7e9b1af85a953ed464b53be549d52ec78ce247036420d4906e0fbf30e06c4b2e70bdfc582205d9e0951b56d6e6b17f563d5253b9e5474dc3d47fa6559f39dfc5a4f52283349f4bf15eb847256cbab797dec13ca610e6d63261fa612caf227fb9da7d04ebc1eae397e0de85b9131ae36ac220acc46673b9ec8af63937ae5e8ae8e3ace7bc79a453d47a357eb2b1074528c4652e1d42d2f96d4a8d40a8e7c80ce3e5f727f25af5adcce213ddb456ac2931282e90f121a0adcf0ec6cd93e25aff3dc3b474cc7d50c3336ee3bbf609acaebf14f22ac5f8e590aadf5037bf259e0a9e87e5652d95d7da1465e5b52bf10d3b0b10b0624be060e452b0d7264dc87043eb39f6fdab1812ad24bc553e7a313f5b93ca34655adb8d997a50ad4a3cdaa2d2f9febc858acbcf23ac4a07719eb4fb3096c94b011243c985155ad2ae077346c7b02452536f360771320e3a86a9cbaccfdf1db3ee8d0eab58eae0927fea0d3cdaf33fd4a185ef41423e0781759f9e9be0fc5a1714054b4edae6cbadd402a2899c920544ba73c6cd77e465c7b08453efdc1f3ee75a97a34d88df8731d7651272e45db49b4f95435ffd3b9eb1ede774bdda6b9859c998605093cd2c4306263bcb77db129ee1f64bd44705911b783c68ebd758fe6378c6c894fcd6bba16b43e303e5445d3fafffd8f42c646c99f2cddbd3b2c4304e77bd5cd56f5490602cf7e9f0f6cceda8b91703d5fceaa4d7114d84bf2f5a3fcdfa76f244455764dcdede390fd6e2382199b1e30e5b2fdae0675ffb7dadf9fa1b9a7cb8c659e7cbf16b346e1e55f3c59e7dec68ed4e1ef6cde976a0e6a7a8ba71b841a0f9171ec3df326a7dd41e3b606d46855dec0d07dca96f6bc336059c902fd00c8ab38892d962eb39f3da9892785ceb18ae49195fffe85759bcf48abe2c3cbf750ce08f1f580518aa6cb3548e71f3c744e8b7704821c11ddb280a57dfe43a5ee439d3ac7eeeda327e4ee26d8c3b60920c0b6669b44f0a8520c7d354b1eed69311b4535b648f7c010103f59049f42c8dec7ccf9f53a5ecda51ca69fd5087cce5f97c6ca61c996065b54181df565c860de8d7d4f870cd3c0b0a75194c6c7fa8e4d6409a36133ec82e2989b89e751d2251dc33225b4bad12bede65cd0202c59ceda818cfaba1e18f11a08d26dbcd783c877ec5b5de4deec9915a4d3265f7f2bbdad647ec08e69fe015874ccf6e09d810c549d3547d3b62dcfcf426dd60fac7400362f92c035503e44f513b4dc31abcca5f2cf5b4cb72cbd6051a8f86a546f2b151262cf0c60254360535f646e148edd284c98f057d3c1b57470ed55177e4a4a89ff0c35cbb44afc9e6e9fad4e6bd9f1688c9513433d774acfa2d21c0fbf778ef9e25e2ccf3bb62c31d98c263a4770031741742b354fc4663f214b77750517003e41d25728a03afa8dfc25dfd895b75b53f836eace5caed698c4cf6d8da3b90c10326ff49fac5468d228b9002fa584da76e3c5d35f9a468a0d5dd650449ee1186f77ad6d51c9525001d4976c198d60227303b61de61c348035253bb658168280eb85f6c4e7c5f647a278eb095e6362aa31f673cd3d5a1c290acad7e62c0a8380053f6f70a30187540da87e1f4dbfed17e2e59595f196b58db473b4460146b07e5be2d3241ad3e28df5ca82caad1080201a0ad24769fb828fdfee8cebbac375131120cf0f751c384e84bb3014ec998fdf56fe0eea6007850be12c5c90697fb0ca397acf898ef220ea6cc4de4e9bdf6e5a376413b086cc539c5c700f2dcef634c84efa476e826bfcd6b78f7e29e17a3ae86f4ee090d779f2c33426cb5d919cecc666ebd283ca3e90a86b0bdebf68b70ba753eb742a35b1757558d2de4c5d46c15f41171e40e9b5a3f8455ff8d1b6c3ecc89e2968bc29419fe43aa9677d23d0d760d7bf2834ca1c81cb29f81341979ef0ecc7fe811e607433987161b473ed19b9294fe3275ba3bd45113b9def9299bbd8b9e6682a0e0f749533794398032345595238ccfa9c9df953eb7b80e15bb13f57d27c2eb388d4a877c76acac934470d1749a92604eff6fcf7a34980c7140c94675c2beeb0c737c621a43b8113f102fff734408e456d86cdf74dee6ce9e25b161b63161c91e608c5fd94919cefb386ee106801ca1d942ae8deaf21d76310b1feb55730d07f5c02bd123c774e146b665f3411eab0e8e3960b2fabc62afd01378def0eccc6727ba8b2bcc5ddcd8b517cfe85b24c68356fdbf1a56a680870927f858cd730ad4f7dbe05e4b8796f7206d52c88adb23bf5f74ba0eb99e8aeef0aef7dc871c01695418650d9fee5b7c1a0f321677fba4b361003f43e2e538de985bb05d04c8f39642b509bc7770d630a69f7b6f7758cf6bf7cae52cbfcf013277d247feef1705ac3001866c531bfe60577928c9aff6fdbaf45ffb47c9fc56f7b83951662c13fbdac36aa56f58396f3d331126c689cbb3ed79c5c3281c24ee67c8f4d4f112677ec8fa14f78ddf5d60176ec29c390bfc23bc1ff7cd12f871dbe29d7e67e974b728df267b29e2d6ab17dd32b67b72febc1544591f4fb75ffb7a45484fc7b57727c41e37f01c825b506ac2f8f8f2985f7dbd89b33ca153f4f67d7b4a3576bb8bda7660cda43c62823366f4206c595006211be85395f295a37acc20285acad349fd6d8c686d47afdf3209f2b5892a273115a2227454d794dbd7b48532ae7b1007ea402138e5dc6beb1fed56457e99a04d2d85b3f16e4dbdf75741aca5824c9980869943a447e1c642e4577077ed5997cf3c42618c0041daf9d96cbdbe622c1d127573c30c62c1803ae46ebe781af28de128e180bc636bafc76e682fb15cda9804b234f04d674563d547d214615e2310af075d60b6f5e0be8e194865a5c623e6baf7123479ec372d09f30dcee660bb221744a45201c2e032d46d4bb950b9e58c4205ad83ccec57a82dad7dcbfc90f1cf5cc868f115f6290bf8bb07226deca7e4fff5943528cda4ef376ea47778a83da39f20a6b2dd10782842faf5a9ad43937a6f285f3a0ceb3537d43ab4884a5b0c55e3c46eee50871c223beb6c6ee8c82879ffdd82c0d45163fa064e8830b92adc576a9281b04a35d8eeffeecf50e908b9a1e6955db51e56f60ea4506e2e6f06d9bb1b3728735229ca0a70ac290591ddfc715e9de464e0afaadc62d6e607f601a98ad385fd15911ee4c31eaa3ba39e4249710ba0547cdfdc20b1a96914df2e9fc71f03f12107dbd7eafd3c3fa05e5084079b622550ce8291a3a23a3a924dc654657b4e8b6cd96aea326113a3f59f36882b02323770de473520673caf765973c8a97074d4389a148e886bd3cb13587412d6f173858c09d6493e6caab9816044c4de7f91a73882810d9cc76f0acf1607e90473bd5efbfc5c57bb8997ab7852a70b5de41955eb03ad61d9fc8cc6209611c0f3050cb23ada06b24fe4b1c22a155343b3d8c1eab978fd1b1e63a90e71dc42aa5db5f396ff5da88ce2d185863148918bf8ac00e1b11093a4253a2cb0e07cee30ca99ca3085b3bdd590a6e9bb53495f6ce4e550fab38ad57ad0ed7fe136edbbea69f4438fc8ff7bc9c0117b5e4bcdf798a62275fa3a5548f85d9de17fc17720ca7d23b1c0e2a0295ba9bb735bb57b78227ef7a334677caf983cb254a133d5c6e304d94fe27920168915f5389736574f90d123357f35b0bf1feb3892e1a420b426c50241740808b6db1edf1320873cb952c801f475054d99aa6f09860894adcbddf54c3284529eb1c095e02ae44991b8e140e8b5753d53ac7c7123d2b2cdbc06f9461b76527bf3426bb069305c48359d272555c2524217b306ff50be36cbc088c6e313c718f7423b51844997ed7daf67c7f40a195c7acdef97da638cfcda304b059b4199c76422f75e8e7f3a2df34e7329f8e79804f47aafc36e74488b9ac76685c35e3672508e66802b3188add26be1604e82aa2c41b0a5af799c1f3bb273fbec56eb12290c9c26524bc82b3244b3ef0ff9ce238affabe0514ca7b14674845bf2737cae31ba04fd35cd540f515a83b51ba503ecdb3a2ebb5dee517fcc0589bf93dcf4dee041ded8305cd0f73688911ce64e15c0570d7790dba7d001a2f0b42107ba1367937ebbeabcc8c79a34a51bf069b727b2835e32a7e4673d34fb9ab4d1763610b04c7cb7e3b05a6285170d6e676e17fc37e070058c445554b2ca8cf457d3d57bffbfc9965fca33169f64c8755ecb1337a13bb0c9f0ec9060904a1ee1f57afd1359dcb4aac536d7b00639580315846e28aca72c27e361b5fa113d8d3c8331f7157cf369465e7258fb2b4d03ff8b8e71b77da41f015bc5b7edbc9a168154f45d6c55a3f80bc94a06eb3dbe9831d8ef2df749124fbb24c849e9dc381efd90061c5186a73b7e1b66f4cc0aeb861f96f361945978475cc5a9eed6165ac47b6be909007e4551b6686ecb78e54835d2cfc797524b19bfe9bfba4221f1c4bd1898f352317a97ab7817a82afdf0cd0d506d34c8f76ba172cee629d21daaa3dfc2da6c2688131f348a38bbcb1e9eb06f7620ec0a5e02644b903edac7ba5c85ee342f6e3585746ed28eb6357c2cefa64d4c53d88e96399d6cdd5a9b076c45f9676b3410bd20040b9b326774fb99999fcafa476a284b2e3aa0982a267155726f7f93082e5b01bbedb9ab1fb557a4ba098aeff51e102c00e1634463e0805767a15123bac95d7484c9fed512adc67e3fc628f9317dab3e3cd3adfee0c19d24e22e09ba32f7ca47a249e5235c3125dae2b33a71576d7ea86f5e1af091f4aa48fdedee8b162a3c7e116b3f32487330c5d5e999e42b7ff3cbfc23cbba93c3b7c587cb1bf4df2f5a2a3d270fae6132cee91021a9c550eb573a766f6cc62483eb184f05b3c8ea0b7fa9ab10346e65c4b9f8134e49759f740eadf1ba6659e2aae473b38cae19b1caacb8caedd889a3093c6a2f036c49ae79a1e97f9646667eede9a020c41b9c6c53234695dfdd1092633759504c2a197c76a266f721ac69a659c394e8920912fe38e7cebcf907ccbee8399a7f8612aedb45683346d605e32dd20580e95ed707f660197074634dcee50840cffa4823ae01d4931e7bcf7c1c9f0a19972dfbafe83d3afdbeebb80cdc9a73e70e233c1922fa2e08054037402ef9df84b29b45f0986ff1ecc45eeb6bf42819aa027da25fe21caf8ac23fafa720f77c9aeb2c6c7e089f1e607aa6905a26f70c6ec50b89dcb16d55f7e88e9e9d6bc78e494e9ea898c4707c0a6bc44c99b6aa1cc97f28d1926c1e34a3812117a4109dbf6a8a8099a7181f1770b04c7a325d1f8f048c649ee542321cb7ed840fc40142fbdd27a63230264576a5d58cc32688ffce3ef8280b7024507a7080a30dd2289708c31e87f4da1c81ff253ece45483313c704ed1800ca90bc5b7086ed4c154a08b9e928305f736bb66e5afec640810c2221ad643068eed13ffe31639fc","title":"28 实现 strStr(","link":" 之 KMP 篇)\n\nhttps://leetcode-cn.com/problems/implement-strstr/","question_id":28},"85":{"day":85,"pres":["堆","排序"],"tags":["堆"],"whys":null,"difficulty":"- 中等","description":"```\n\n在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。\n\n示例 1:\n\n输入: [3,2,1,5,6,4] 和 k = 2\n输出: 5\n示例 2:\n\n输入: [3,2,3,1,2,4,5,5,6] 和 k = 4\n输出: 4\n说明:\n\n你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a33439f9240905709756ce7f7c66808b2e25e438bbe1eb009b854206a4cb13cf3cf4e62e49e134546b76e352a1ba807f0e3a76351243680d40acfe3de1e3fb1249a01597f66f479f9a00e01c9c6ce1a6246f3bf3041e8435b4a3f2e09053ab33f2e437809b349bc1f3570bd6ce670f3ae22e5efd89cf8dba458a34fc709b6765e089772270f7a08098479f0a8f3277a7637086bc3e82f7144e21722978c92d93d5459b0d1fae263dc63b0b43ec8fd93549d76c7965f852815aee014ebfbe171b646b281ac4e709be36b43e8daf2444f6638d75d26b92a7bf9d07178696b7f8bccf1a2cbd92c190c27a7003e1214475a8b015c07753bb00b216d418f552f3ec4b0eb129c6e8f12dac0a446b5c00b970a64c3da0b89ad67cb063e4909965046e8883158e2d700ada615b8d819ec44f25a5de3c0066e3049d0f7679890c00ef4cfad92ddca818e11af4a8cab7f5c67c880f1f77596aa78db5b584b0157578497368f69ff6719177d5840dc3eace7dc1f1ae430230a619fac4d38ac4840b15408d84f1d96d2abd536292d5ac9330545058880436074328502d4df3f1fa2d73ceba8e4d2b9f35e73d5ff8dc5ba5478a382a4cf391c3b8610a7c932efc1ffafe3cccf9157c0170f075b30e3639b7f1d2ebb466197a2b49acd1e8a90e3a5a59dc522c2e49373def9ba4e209d22eb5312da4f0df78cb7e81aa67c9454a356b0fffedeee061a554dd402eb014ee4943f78687028fac7bbea84052fd1085389fcd5ac7d456e3a363483269048ecba7c22f50f206d1d2adaf9eea6b9440d724447997150f220d99a200530af53b223683cc06f069dea1f03b6d6afa1edeab222a7de5bb34751392d28507b1fa871bf194a613e173d0d4eaaaf9e3b1e33255045629b47acbf7c7c70dfeb48f5308acde651deedbd0dd137b0b74a6568dca59abc0912750d78b8b400f551a9c4ad7ee019272e32dde564ee084b709d558dc3587be820b18dd7421c3626df062ee09e60688cd21bcda85d96557d5337e999522c646e12c64f88d38d6ea13444d5d214b319f7a619b32f6423f08a38fc30816b9b9f1dde107ef9c8d4b43cc67945afa7dbf97d53c70202ef392e09108f10e567c257fb59c2594694ffcb0e1cda4f5e537ebf8e4735472136060826eb1d55f1f06583e0842de05b1337322dcded40aa4e689e41e728a5ccea49693844b024ef4aebcacfb453d7c296f12046fc822d95648e33f30b21d047a4ab22fb3902a6bd66ebabba591945809fa189614a41cff09edac988fab84c22b3ade36956df416fba71e3b467d9a68811f094d25a18047c41a746adb876e162d6950dfa2245ddacd8683a782b1da6c5ab895f2fa7b7f81f1c17861d51ef53f4d082de4dcff5ccf229fe882822a80a1fda231c60a794b3eda74c8e9ede5865aa8e90890eb26af253dc649e20a43ec7b8ed930adb3168b8f006b336e6e37bbf903dcf993ec5bb2a32edd96e0dcee2e9ef6512bbd5d04f9f50a609570266dad125c353f89a5743e037d5c11c3b8115cc5b4d36c044467a458e2a0a8eb4c677b989bea9375d19ee9a103ec3319a0ba8b814970176caf98c57d4ef86ab6101039f2cee9a63003a47773f18d65f411291ca99069c4ceb34006776a19f6df5c647f7fe87e792c4dd4107fd76507cf897e7b23a22c33d1a9096dbddb65a4369bd4c4dc3fc546e8d5dc9bb96821e4fbb0199f462ba2b72ff5de0efa7ad53976f96176236b3f408bdfd1f6c48607d1091fc6df051df651f757a98f4ec45b9a1fd0e9c7b1a42abe12341c49f0906ec3f756facb96db2aeebd3945b1b152e92c6c2f08896b2fad721fda02e8d30d5b0f4ae7e07348abd9befd8482477fad2d1247d666bba454595cebc7d1630130d6f7d923a683ded01f625991bb52eb1bd6d2a40457109d5894aab6a14559d1d1761c85028c0f0599544adc25989ac04a622021199825e8bac122f330b45dd61916ddc179a00569af337503b097a898d2d41d06dd621bf4dc2af82283462baf174bc1a745cb75e7448ea1f20cc27cd2e248c066a3eb49c1db8c194e87bed710e929275da4a830ffcd5b66ff39c40441f6c5e0592c59d7427032f3ba98485ed7c2dd5c94e8a626f7812c0b986e913afe84b244cdf3ecdd83f0362bdc3f81ce532ac5ceb89b503fad261982b40ddb3292d800880da07d779282b4e4ad48f9c7ba847e41f43afa6e36bc298919982b1a8c8fa73b9674d51ac009a58e73cd94b29635b6b2a45fad1f30e06c4fbe019df8b852b5cb1115cd760796215f27fd57a7ec01d3b9e2824b43147f39bb20f0201243300e8ae41f5df3c0df1b05357ec13ca610e242d7256bb0f90fe27fb9df98903a510e0703453ca788a1bae36ac220acc0f293caae7fb259467f6a1fd8633de62fad611690aa356a621097c089e6563cbd42d2f96d4a8d45d947098de6c193b316ce241e6c43b33df062ccc942ad7845b5a120381dcb777b91413effdd95429c6354d89c1ec6cdd5baf1a59221df1cd28f248e4a8686f85be5def25463dbac4b45eaa9c309db2d7d24b9e015716e382a52d8dd0f889691d229bcb89b77311bd3d144f8e984fcc962c26f0742ff923e09a3110b1d2e45a1b3f64804e2797f3e29e0c013aad4b8a5ddc44c07792e9532bcfe99d07bfcd0dee78fdf1e8fcc7d58af236fa72343361129573006334704dfb68762529226b89813721454251bc33bcb88564abef6fdbd0cd792622a3003cc285d4122a14c8fa8e09702799ca20714effafad39b8fccaafd5e7db616d3646f560c3b01d0d5eba9ce09482c8ce1c8c90d3929c74151644da46d7827c0b7f300c5e1da1c6e9750997e8a60c19b8318f279ef278d4e1c28312444a02fd1ecf23b30bab33eb418819d96abeee83f60b51042f7764c9429c331dc32b769287432e23e57e08d057869ab8e57fe447298fd8b3cd6d3b459eb057731bc25e91a5eabfd1f126744b431d3599f9f49eb73e648b61f482fa0e395835d2e06b724a4e59441c45451ea107852ecc72c90d55d3da9d5b1962c39b703ab3434dd8b8be8ec8e39a2eea8b52a26acf1f058d8568cab6c24feb925e61fa1e405f120687a6d436dc38854e22c77aeb6af02149e32f46c006225b470876f1926e56fe5532f2477c4c0d5bf101944b9f88499f691d9936977f2b5e3ed2234ccd5202d19ebcdd579c4bbdfb43b7759eabe6920dedae7a92d2a11c5ec6a869c65bb5955a1460690b4aa320613a6635ed62dd9045527310479f0b868ac78af9fd7e3dc9ac24b388c00321d91f9fdaff4ebcdf410e045611a56dd2609b943a419f6eb892d1f359decfced0fe1f2d46f12867b5f3b7ddceccfb389c3f1ddc230ce3c78167edf057d47e5159be88c8c3a8f34a41804f4dc264f38c8b9a46ec715de4deec9915a4d360102d2bb5e42a7d888970f6014a3e82bdadde880a09b74f0687e2689d814c2e9e4efe151d7865939065436d5dee02e89063f9c2adb3a4092de324f4695882f86a546f2b1512629f5d6e6a0526160d6c2041c39e337b98be128b95ce3e70e0550603142cf0ba0c7c8db442accf60cfe80b20d1f868d9d35d1e203f1ec0cdaa5201fc3fcfab830a248632b6312cd9dc373f1d651e15033f6a6f37a532376b427e5f0517003e41d25728a06aab83b363999dc7bf1506fb7aa9b027e7ab98d9cf6686e9a226106f45f49fac5468d228b95d58a584da76e3c5d35f9a49e57308841e44ceb0163f60ad720c92077a4f91cf385f8d3d083343ab1d91552490756c5e824458e0e5e5d6b6e4f8d1991ec413f81a1e4074cc27ee7bd1205a344c16cac1e32a078380053f6f70ae0a955418b5622872b9ad28e6fb94dca28afc82a264a14a1840f9635baed9241ac3ea9ab58fd184aa4499201a5ce66d20b5d695f5ee8cebea913c5c43279756474d700b9dbb6255ea8cda8c54fa0ef52659990eea364ad22c76b1d52f6facc7daec3eea2e8d9978959a6145784e5df5c3881fd946701b27c8ab2fc81aea246e9f6beccdb7c67e7ca73422a52240fdc38d6ebf9e7a748e56d584ecec66ebd283ca3e90a8680b1966b536de6bd23284e0fd6e767c04c8ce5340fa328606496c3e2f00333fdefbd2d1f08cbec0d7673cf82507828f47c209717b98df659feb7778841ed2e803f81341979ef0ecc7fe811e2e73228b0e34f149d358a72362eb2440c5f80b1975d8aad6d5ac94c7b33a640e4d3dd24c3106d95367110b0220efe1b69df953eb26aabc409b1551dd6e04d0f8c4b23fda65978e1200585e53cf490aa7f8e9ebcd2f8c834d59ec335c63abf19766ec62e87ad240f171b0ec295d8b4f23d2a2b209a229d6ee60165c375816bff704e5f9bd9ca4a6cd8ebd552447c61dda7fa58db521bb2a43e585fc192deb731649b9126523301d6b6b413458a4e4f2c9960b2fabc62afd0164c4b54bccdb3837f0fcfaced0d4a31256d985a33142356fdbf1ed6a75080bef55858cd730ad4f7dbe43eea62a632668907488e4fc3ba7b605e7ae91a3a7f520ef7dc871c0169541c81581aa9dfef4e5af71265573d08ed88d70fbbec24b510a7e957f850eafa1abf6b1c7774f314f28bc9cf7758cf6f739ef029af2b856662d742af4ff785c8a45127fcd198dd24b2ecad4a9b300b5e30084fe0185ef6f3dccc7162b8f7bf8f436e318f5d1d7bd94741a6d6497f5779cf35528abc24ee67c8f4d4f112677ec8fe8097893a0d51755f11ccea8e7a23b95d534aa3ffa079429d7e67e974b20c8a632e0d02d24f425cf440ce77ee5891104c1a6f060eba2e70c8cdf1a27526c54e40c06c324b412942f8f8f2985f7dbd89b33d15c6b503584b4fb207bd5bda7264c9a69ec4250365b450bccca2a0151e2c53d0c424232fe8844d0e2a445e19eb487d4933faea720822b1e8eaa300d52343a110474538b6139537cf3b11511e1461c8468df97ab8484644ae9d44185d83676589489963a261a9e0a489ccc772c9c335f541c6467456a076eceb37cf3d96e5a91410c8dd496d7dba8778c82291b797ec434034fb437c1e781af288e43805d459763ffa933eec9e5178ba9d01e7e06559f095f267e7d214615ab770af82587053c1751ada39d9b44126c6f3f846a2d0edb835abfca75d4e77d21b221744a0c2b1735292d03c5c2d011e61d907508963c9e9474c69f8689fa9c4a14fcb78496431d30c2e7f5e9705bc5e02354d5190312a6b9ce5a972ce8df4f407ed45c9aa88d732da840b42c9d1a75ff8329666c063a0047397515e7875223f9b52e166c84a45e309005a5a7d16f1035bc9f97d82c072e6a14f927c78d1c84622a83cf570f0dac59dd9e8287a70ec3df812369079803b06761a41b52bbb2944793f9f22b84342193a2e80ac59b4859d5cb52adee380666f2b981607371326d1889d8091ad14b08f5402cbef0ee29a62dc50ec47a1583fdd21030bc9104fff2c95fa477195130bd2beec4d5f944ef0d1a4eb86c1958b1582b1023a3a969dc784619b7e2a081dbe9a1375f333e5cf242cce52d3f3074b07301066ecaf565953c81970e485ed2bd4cea9daa16ff60890263774a2322c0806491e6c8ab93440f5d5df1fb5f20e76940e19245b8d2f12e3bc84e11e2eff180922b8c8964bf9f226bfa9c058416fa3897189d94a7161203734e601a8438e3fc2724e60e182ebc1c68633d8d17b6ccb5e0b1af3a8cfa1d8931ecd4543a25bad4ec9a2d05453417c052fc8a80015a5f723b3f55bad65e39cbdb41a1aba3582071dd520a7fe6bc34dfa4961a4e18bd77fc37d015fdfe136edbf7a9d94c60c489dff2d51c0af89fbddf748c731213e2bf2495e3f3c217b95b7904f6861b7f592a1f95f0809d35bb0a9da827a7793d440cd3c8c682254b56610c047f028bb06e9f1c0e8a3c53956e653ae20d5b385cfa5b0392b8e7ed611a444a466c117c5140d5877da0e2ec185b0882e82c8102475d05b99aadf0891d804a96f58715dd161676d319210b7cd344841b821e4bce1f029c47c7da0f3d7b57c28922c0059a646fb07e7dac2cd04a91cd449d69771625393c26574cf559a638b90f8022317f7cd97671db18178d1283aff431625ba7a0baa187a716ab2fe5c4ad109a3a992da92e28606a87d7d9889f74a771cfde048b4a4abcaf3edd4580a9a03f391224b84b735dec610aa079e99362fb4e30a662bf97071d68f3b080eeab302ef08d6eeb1ec09acd0e4df78eb3771f6cb9b1dbe276eafaa20a19cb330a0c1849bf6e798ea643e501ce12df05b015ef7a1ae01f558ef8acb8fc84a01ff5cc58d6b06e8b46f34156bcc619856c292d8118d54ee15c585ad7790dba696c302746420d36f4643c7ef394fd83c53da31918f952ff3d2c3478fe3178730ec31cd6ea1d1b63284550c7dd583b4ce87c513998a265fc35976a7f36118a114b4b7ce1c75f3c6f31fafbf4d02bb8e6692fb31e955db9e2673153bb4ab535c5064304bcee0f4caf9835818249e3536e70166adc955f1d1ee280ca60d9541c1b5fa144909a84761f791dcf61d275ef6989aefade7abaf2a2287be6118a42c115259ec5a86c3e7e72dfce0104fdb5bea06eb3dbe9831d8ef2df749124b1b251cec5dfa3e1c5d40070b8034073b7e1b66f4c89e8b869b12a2a633edeca318902e3ed7d65e402bea8ebd234a83a5f2ac397fef3549e402cb23c3060fddec783c3ec695f1c61d1898f352317a97ab7817a82ea874fd2d6458d27df7aba5e62aa27c52ddae034ba2da6c2688131f348a38bbcb1e9f201c86e2bc0a5e02644b903edac7ba5c85ee342f6e3585746b002c163118d9caa39dfc720cba035cb9f99d9eca2359157cf23e77376ce484be3e3637c0dfecdc28ea3a43fecd0b2baa309d9884d421f6fbbbc308aaff94beacbcef2b0053217f983bfff42d121f4683c355b3e4640333e591f05a7b8a5106ab5f051629926b3873bf2883ddab3e3cd3a95ee1151c74609d1c2d32f70d9354bd3022ee9125dae2b6e8d485cca80c6dfcbcc796f4ac7c09a9b27649e89e5e917aae320965a046a56b7cd5fd9b03eafd331b8a2472a2b0129a8d904b1ef88a3d270fab05c65aa914f5bc47740ff38c420afc4340d7de5cba24775c0a983fc9af00f46af121f9fc838e49751a348e89a47eb169a79eb151163e0e19b1caacb8caeddc1d464938aa2bf73d9cfbfd40cdef2697726ee879a0e1722b9ccc52034625defdd096a727af84191f597da6a6f740530c69a659c394e8969856abf972eb9cfd5289194f0d0fdbd3c06b6af3dd25250200018b6511e8a4307f39190b90481d8b67a28ee3406f58ea8f26e8386e11c2b2e215f08384dd73e654c111a1a442a231ac9fa89f1ec4ef54913ea3e0602cc99e29a61540591ac7cb644b1be34e08559610da7685f3a8a5de310a5023926ec14ad51022c81c87d5a7de4e6f9886aa36d2fe32e50ea669f56557d93870c15dba1e990e936a7c0fd8fc78c8ea7696106e0454ae4661c7a656cceb21f428ea1a897efed97594f6e14a95fcc2e37cf8400cf9e1f99ac379511c40bf8ebc83cf43ab77ea3d2bd785465262b6c6f3a635972c13203e28c613260ec9d4b7b458c58065bfbe54cab17c139e99d000eea15d72611d245ce1f4169d1e26a66977fb3673befc8508a86c3cac2ca6b8cbf5fa2f7a16060488b0533cbcdc25cac3da786497895a5276017bc8abb1575529ab846e787a87b0830e33e6b6f546bd349042c6245ac588cb028652c48cf52eb0a4e53220cf206f8542c6956d20303561fc7170d163a7448985bbdd457b74e1845d9b0a72e18717b3e4ca79e88a9d9b7216d2ef5d7bc27e32ee13d4f23d06563c02782f671347d4d88baf2bf175ac738aaf76933f5a405e5d5a60f3ef7b18cdd1256e7fee8e5b52824963e392295bbfff41f69e879703e8a1cffaaf024284f57a3c883e0c068dc33d81b09ab5ecebf4bb4533ce963b305397954fabe914db143eda6d96c349612077d3aa70153be87eb0319ce9c87a87e406f85ede4826d1954564ff28e11ad47c2f865f3fdbf41a4d44a963ae554f998d136eff6e3caa559aa17e94b6e9b16d252000cd0368a477c6782a293c16ae32d0d3a57cea2803fbf63fed7e0180144a1b998de8aeb4cbba6f7d1e39b2d66f173a7ca7c33ae334759dce86374f10edcbac170c54ee7a54b86559b424f8b0d29217c853a37c9bb30bd844e94bc7afedb97e3b2e541825e3da167949b5ae483fcab1bb9397e09041f73aa10ec9521964ca71c15c61c116d5e6bc8dfa5feaff3fc8d368e0e775b0090285f21dc7634162dd38db417291bf4dd6540122b44e775ee06d17a3fb1d0fe7a85d2e66bcf4112be5811e45080b22df6e92bf12eb2719789e79634f09939708ec721059e958b70dc594af2a80cc78f289c357e58b8ed8b6b49f65516dd12879546da5f564a7d553b6199dff2c187ebf8416b5a4cb7070ac7ec22c30b8b1dfa5a73a17aca75ef847b48733368e18a0431fed286ad2ee2f10c60c9e2a15b02e3ddb624227828e26302ba113c90d55f2432057b2876dde730961cfa72cd27be614a06dee5a06642b965e1bc84a207d467d7aeceafa4938a22878ef48be2c9d0f3ce6ff8a8628b403ca06635ed25332daae7d13f26cbc3d53ee0ed7b3eb61745293e75a2856816756fc460b8cbf93dcdb584544cf0f9d7e2490e0ac2f3ffdb7966adf469f0951ca4f7da392246948c9af67c42b60265e68071a20b70fb127eb78a77beee495d5920e10f624a1bf440dad3b0d5928372bbde521bedef1ec6fbf9b52fee989ac2de3ebcec0bd4c16245dc7a469f013cbe1173fcd30af6073d2bff2ac03ed7a85b34e32bdc332d4ff0d3d9c0ac0d12ff0aa338797e","title":"215. 数组中的第 K 个最大元素","link":"https://leetcode-cn.com/problems/kth-largest-element-in-an-array/","question_id":215},"86":{"day":86,"pres":["堆"],"tags":["堆"],"whys":null,"difficulty":"- 简单","description":"```java\n有一堆石头,每块石头的重量都是正整数。\n\n每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:\n\n如果 x == y,那么两块石头都会被完全粉碎;\n如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。\n最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。\n\n \n\n示例:\n\n输入:[2,7,4,1,8,1]\n输出:1\n解释:\n先选出 7 和 8,得到 1,所以数组转换为 [2,4,1,1,1],\n再选出 2 和 4,得到 2,所以数组转换为 [2,1,1,1],\n接着是 2 和 1,得到 1,所以数组转换为 [1,1,1],\n最后选出 1 和 1,得到 0,最终数组转换为 [1],这就是最后剩下那块石头的重量。\n \n\n提示:\n\n1 <= stones.length <= 30\n1 <= stones[i] <= 1000\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c0a525fc6e7d305a79595c2a57b684274efbfd231c09a85de02d51d540e9801b79afd31638e22ca84d2f7afa13b9b1861d3d2a995b6d822d5664d49ec46dbf7e1c42d11bea51a00b3a26505dddff3c8e8f651eeecfb6fd9be09b4d57b650a4c8710075119c614c6af609c6279f8a454f640a2954f148ee30889a2dd5295e5107fced833388c4ae976b213552602d7615284c61e5e503659dcd726deca36d4d56761f07608c11e94861f63613528b7a2ad8d21bc4ace54b68f74a742d997eb744145498e64b7ae9b5095e10a7d2ccde56cccedd0d72ffd660727c4e5ac48ab43f0a2eafe78fa246a1b5c2c96220990e5e611ab35f8cab90981df6ceaf115169a56fed73c5550f0fa8074ece3e5d23d38d778be7c82fce6541a97aaca66d46f7c9195903b4ac16b4f81fcc40fd6a59e0d71a67084ad9e46499b0f700f7fca090e8cb92b41fb24383b45f5371c581d2dc75b59b7bf4605b4e3f534d827a90c5e61ba3452f322542b94b80af87097aba3b445578d6c37851c37228ed4860a3409297e2871cda842e78e7f75a5753fda810154c5be705858e0f72c7e5b004e1c38ce6e131eb642d3278b55862a1a58f1699c5ed2ba56356a03d727a66732508ee41a5b0e9cee19f34e1f5240660d844e17537c65d8c36e2ecc8fc781b43cc92cec236237cbc535bd7ed59fdc874ddc57c286476a66deb368564f2b0e2dd16069bc0ceea3874c9770de1cabdd3b3c65a5f79b8d488d9bb472e4e5139673eb98724633b5ae92bcad10f7e2206ab742f256405b6bbcfc7dd636d216223df62217c9d1cfd0146a24d94f22423a0bdf053dcd37d7ab090e64c722e35a43db16535a4b3faa99bd2b1bb057db11b49642a3202d064a5ce0eb5d48c731567dc53d7ccd552032ffe6da753bb4d97c8159ad0c755e55f10d41f6a03bbb0f0e23e470b240b7037c44cf5a8db8373f302cbb2678aea0e9c3b2c33a708d5e7c9f13325829a381431505be06f7ac5f41344eb8c3bb1c340d90b4e266eecd8090d092a1da01b97accd52f57d4c017af4d455efd566ac57173ebbd12baa659438d18c7d8d191588e0bfec32a12c6cc8c9f5803f46806a0c837b0c5f4fa4439a6a8d26f33596612debcb9d4a0f2e82abe015a60d2207c2cc6e22e4b9bc99c77b6e08f4f3f8b25a5416203032eceb698ff0e0149977956a7d447b4f37395f71c23e8afb91e64fa94a03fc084af1be029e639adcb2294cb177c8fe2aa797a763e27b88370e51217f80b1b88b724e8770bac7d9b9e6d6f0d7ec75dceb240edb2bd81c73d09d66c79e47f658b2ec1649484736a5377028cbc7b27c2ec84ef68c7a7dd8673aafb39b615de8d16b4aff8db8b98cd121420ad8319bdef48052a68fc08f985a3ba4a27cab8e12af8a75d090c23337f1a8482f1b3d9c0890aa0e7bd7943cfa2c12be6b67dd5ae0c90adb3468b6e804a102204724093cb56b72e74a32ecc92853a6d21202783cc898b8c1c65d21c52ddfe1b7dda0dd46753c6e7ad2b364d4766bda9cdf8e5e9c0825466e932e5ae56f35ffc5e1211538bea921f1e4181c440aa9f453987b539219422ccb1838bf64c597fb4a8f9f50ab3566690c11abe5f09e2ab5c5f47e2573c3198713fdc9b0fb7069f80d10d1270f0c187b4834b8bd158bc7dc01972f32100805c2ff155e08512aa92717ac0a1890b86c6e8a5fcdbadf8b0855ee5d98ba2adc5661a122bcbcb7b01a8a6fd9122e6593975fbde1026c59706d00daee7ff122a6684f3aed6551658d7a354b907ef4bc6881ec2384446b6678ba6e3ba94251e8765a8fac11878e9ce5704814004f203c7405b5133bab489f395d0714f1dbd86617737313a3ad8166143dc4ffaf25e350d978316ff8c2fdfcce85f859e4aef2028404dc17ee5ff00339a9b2cac68bdc104b972db1c4c954dd91a126d2f93a37967ccd6d6c9f79458e4eacc4d35514844e22f2eb88a9f753e13ee122ed5c9cf74361d7d9edbd953923eafb74aa69b229800c232598f2986f79d3408a9c8a78c1e48f71bbef508b08c8c808e9c4a57d6f8c16657864fa2bdfbc5708da4baf759f151b70ac221e8f9388bda98928565b9cc9ecc7eb2f011d4ba9d8100281079ef197bc2d3f7b0886654481ce9f58ea029c364c399a8c6cf213b26db73603148e2c0ae54bcec3502ab6e24799492add65f8b2e4bd2eb982d2fc4fa870f091296777fe28784f372f3b651f6ca01fdb9eb593158556a9f519d9b1b89de2f3a9297a65cb86627d32e116716cacbf7780b202e7a491983f881895b34cd5dde6396d3ceaf635117d9fe0e4ed94d36353ec7a4eb892433a9ccb44d663ccc8c2d32605a11c8f798e638f7840e73e8108f1efba07d915f718bb63bea604a4aca64218668a79e50a70763ed144b3051ab5d08947a96bf3fffec73ba9c86711859653440e1dfa6bfc6b24fbc0b5ba9c2ad71d31b1c9382c2ccc1aca7f6bdbfcd69b51334fcf54aab96b2534b6959382c940b2e023aa5fd15662576ce88a69c61891951930b8c535e2782534ca99812bc29049c4bdb276d65b91e214c48daa37a73972efd8b4e6186a87847f1182291f4998f2039a1273159585e068eb091bbe77453bcf79fe89a7eb32659493ad1ce9736e80ee8a3759ab05f25f2dbef3176e64d07b26e266b5237d2335021e0f1cae60325f23f3ea7dffd3ccb4bf8f3ea491b9e1fdfa4669bbd796cdae7ba108510ea07f57ca2b4316b7aced06c5fa5b6a54b4edae6cbadd405a30d09b72535aa61942d82b0e40033b0a51ba84a1f075f92b34c58db6364a7621752246da45caa02560ba86fcf700d67f13d1a6e08c9c9498055075d4cf734178969d7db129ee1f64bd44364b699d8b8fc0e975c6e62d8c3fdd00ca68e917d43e2d23540b96bfbbb1ca4c8a53d6d637d3f37777614dee60ffe756f5490602cf7e9f582487c48bc52d3f40c0b00426519a59d8ebbefccdae6f7f6e225c67cdede390fd6e23824bde032be3fca5a30a6e85e6d48fd0b0df85c2974f9e2cea54ff0fa2e516720d9cea889d91ec8134869333736e678ea5548d5164ef25a96fbd2fa7866bc9b606d42113dec888349ac2d4c8192e1c9156fd1dc8e57dde2ddf60e7e46db88c7d8fdab9c1fadc83b8a7cd249ba97981c8c3cbf750ce08acdfe31fdea6813555e70f751b1ade254a824c40d3a786ad38fe03eba75ed42bdaf1fce876a3be7f9dd8ff54749fe4388e22b5e6155868171f2fad607a3a6645b436958f5e033f3a4bdb0707427de69af37a16cdbd62b196c615218d6499d8fe618890414163051da524d871dddf7f009710e1c69ebd1ca98a8797c6196c5ae62d75e082b1ccd4c7a202c86b34d2350a868e9f6290e45797250610808e9ba6faba1e18f11a089769ef8f83e850950f12aa9becdf5af6d3750b3065f8ad2d67889471f44f156db1c2e08d810a529d6506cfa729cdd04266db0fae5c12676dd3c91e673e14b447e09963e595aef3c24c2daf61ba61108bf874547e313f1262cf0c60254360535f646e5582976a5185be5aced49e6f7ea8104753012ff3f7443cc7b402b9df3ecea3062e98a1388a831b03641c1e9be7805201fc3fcfab830a6dc032f7312dc4dc2574393551594f3763741da532376b427e5f055f457f11835960e57baadda97697d0ddbb5b12b67eb2d82ecdab98d9cf6686e9a27455663aa6d1ac5920a938c4003bc9849276a689801a9a0b8a0d77961004b4cb721c258b7640de067a65d18f7848f44a743251eb7bfa6520b321405f8376078388edc2f6baa8c7e613cb06e206503333d326f57cdb3d536f3d6c9f83ec2c0acafe056f3e70fa448f1109fc412d419db70de8fb9acda8afa191b262fd0c5176b02d49ff8d245cd5e887eadb9899aa0b9c6c1a488a4773e199dbb0bd85ebe1e97513116e935e36596b1f9dbb2b59acda8e8e0ebf1ef52645c04ebf4854de7110de867c24adc0c2b720e23c95d0549485651d6a6443f5d2811f826c705d689ae029c81dbe6d2f8276fc86e6813a25f62f32bd3446a7f1d57be5de2e26cc09c58fbbf74cebd283ca7ddfe63b5f1966fc6ca173c67d90abfc6e6061498e926511d129b240000f4076024e24f4fbd2d1b68aaac8966868e66c45968f0cf309387b84df2ec2ab623dc144cea47cbd1b43cf9cfcec86fe8c1e6c3870e6717cb408de7cf76c6fc92d5bbdbd5f4c2796aa8684f098c083257a5a567c9c33664388037345140326a2bfcdc8bc06ae73899a59e16d58d27c67aed19f9b6cbf769fa4310f5c3163ef698f63157f0f45c05f48d8be18a1e29be4baed1d02ba20fc3e8034866b64e48304b5fd0c102809a64796810c1b1ab8a1c41d14d84c3c421d5c575c1c68dff4bbce729c44a491e84fde673a9bf3b590f00cb6a196669681abd9b6aefcd9fb8d50b487ebf8022b81","title":"1046.最后一块石头的重量","link":"https://leetcode-cn.com/problems/last-stone-weight/","question_id":1127},"87":{"day":87,"pres":["堆","链表","分而治之"],"tags":["链表"],"whys":null,"difficulty":"- 分治","description":"```java\n给你一个链表数组,每个链表都已经按升序排列。\n\n请你将所有链表合并到一个升序链表中,返回合并后的链表。\n\n \n\n示例 1:\n\n输入:lists = [[1,4,5],[1,3,4],[2,6]]\n输出:[1,1,2,3,4,4,5,6]\n解释:链表数组如下:\n[\n 1->4->5,\n 1->3->4,\n 2->6\n]\n将它们合并到一个有序链表中得到。\n1->1->2->3->4->4->5->6\n示例 2:\n\n输入:lists = []\n输出:[]\n示例 3:\n\n输入:lists = [[]]\n输出:[]\n \n\n提示:\n\nk == lists.length\n0 <= k <= 10^4\n0 <= lists[i].length <= 500\n-10^4 <= lists[i][j] <= 10^4\nlists[i] 按 升序 排列\nlists[i].length 的总和不超过 10^4\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a3341809041ac4f074a7e2f1d4e6f309a0eefe389a13a7c55a83e810921b257a1dd1c11f3fc5647c87fd16a6c01ed76de97e378074213eb49a8e6cadddbbfd063b058fecb41debd4afb46266bc6e71a618f809b6b1ef4ef5b6d32ea54205bf8049f435109b080f7254a0c88279f5ca6d63f4d325521e4c86c2883209934e4eeb8cfe94e6a4558baa71e12a191ab535b3b7c13074c61a0b190bb6e12d0d78acc2b1a15f0d9faaa74d122b7be7e84e3cf5890778d8b5ec5271cb9ea02e9fbb86af458a796af066f86bd7a5ca2bd9d09186bb81be8a04ca9fc042df8bef66b7fc88fb1210837aa88457ab16b6b0d40f5d00fd996e4ec60c4026f177ed93c065f9183806eb707fe1a9792b31ce5cc45f7373caedd5ec2bac846aa53142ef7297c82ca182d9ddb72cba570067212c371fe484ae0c3286e3d46d9d76295bede0fc9e7a0a4d4c9b18613bd7e8e8b505e4ad282c7f476a2b774f26a557a275475ad9f26afa12bd31834495b4cd43eb1f6de1510e62f24044681ab501ca7484e5fe6479eddb896dabd11e382e9d38c6b27c2eaf0b2371f7572ef3da907f68f562616dc6f1b336c61e17fd198ab9463c6d86a335cd94275249c7fd6f2f6647e2c046d7e53ee9e7d1b550b543ce24547edbae709d06dea9d56daca4de9a487390d4e5c96c2fba870ceec67d5ff4ba85b9b997d919d5faad8ce0faa78955cca5b6b585ef4a506165847edc76ba687690e256a7144f65f2e5797bab9c0756f0a92b5bf93111b7269523bdb6c96e863223044d2605d78745fc0a1938ff63a31301d75ea2c4c62f279faa3903dfa427d94fe3118c99b4465b6da187f78017f313e8ea3fa635df3ba797fcde6c236827c88074859351f1e32ca6c5ae042132ee0ab9e625ed9d9d4692325ec7b198b194d81fb1686d508da860b0a52fc0530c1d2faa3694153e81bc1e350f64c6f1f6bcb0abcc59a4486ea399a00398c42b8d5e7bad6ad4992ff9648426c247aebfe5945c8f80700ec5f55e11f8a9cdbff0d7bdd95bef3854bde36060afc76c6dcbfa9546a80702dea44bd82c8766b9a75e55eeb427ed958a3b8545700059f12f9947e0f5721f99848ffe479c7fab1f16aaa5fdf19e27a8e27e9ab62125fd6c3e10e6d5ed31a678260454149386193bdb3ef7a581411230bcb24cff3da88992561bb72dfba1849c125a0ccd3a6f18a80ed14941bea94948ed3024b5720a5897859827bfc23f6b22549bf4aeffc32b85f3fc50de32937d31e1bf9482fc6fd441606e95f5675bae7d0fcecc575fbe0270cd4c96f93b67dd902e2ccd00260943095dd8dd48271ef2971e953b24a12c756d08c6d4f1decacae99b3a5d1ad8b7b26a4a0d2d8af4ffb0c1eb34d96b6afa01ed8ac99ff8d377181e126aac84e9ad9cf35457e84f367279af27665a8899fb90978f19f3dd90ed70beb65e85b266e5c810b18e0d842cc34b399772fba59c8d8e5672eecef0d50a5d615034e3cdf8eb9f3e75750fe0b06721f67e8ec2ce9631449a2c576bd134782fde61d800061527aff4459498c0f038eabd674b2b2b78808f3c03c1f4728aaf16b9a79619518622fd63239be6803445af3d8a338fb201a0a3145c3c6b9f309d198e41478508f78897cafddf484691b8f1a468d3554570e193d33d2ef1ae1b4d466245b76a2b807f5ef1467135d16b12717b700c23b21f9a970d512451e5bf7de29afdab01ceb90d122c03c3d6f35ba1da33d93f79a2e518d7b719eaaf0efbbac59ae54b1cc14e18a968f054e0ad57b6b318f02bca0e6634b8186665484cd02a5bac3246394294b0643409ed3f0f519260c7e343b772105f54b0ce823b54f270942a9dcb10a172f2e2cc4f3b32f6422ae9c8063b27fa720353a80c3a6a5e2e5844eadf0e364f52cb76cfd3c96027acfb385a29b8a7c62c77d8eba855cb6ec9748aae8517c9e198a5301c56b3fe144fc99f11765823565fab3d1bc8d17d7578b208636859e365fbbb6efdae90d4882ce14f653e462ba5f4412315b26b3f03b99463dca3ad9b2f548daba4ae46dc25beb5864a86b6849dbc87a70f124c2905a13fd4fb5735ae6def765a61488a589a5a28f0e605498f7ecc9c22f211b4692fe10138901bbdc7835803c691c865858483b43d0725e20dac6ee5b4b11ec7fdd4fd6573a73d32254bd6baaa04baf312d9b08cf40b35f94dfe1c2a1164a529ccf0fb78a9f5f26639e515510741256223e3fe519adcd8155926fb76ea72aa8caa8d1a6ebc27944369e970c2d108b714809e0851edfb2910b212f983e901494ad8e8fc255f2fe4fa1c15a5260e08acf9af6d030f04b94fcfbea7074c9f12aa95ea4a4d6a590cf2ed57f7fbe4d580772816ab27581e1d25adc578921f303adce578aecc7437d0f8110b02a2c2a25b217836d4799add769d71ec799a8cd58f0d42645b6eb0a486e61cd01ae684ea3e5fee6af69bc2f52e8c6559a9e0450c0091ef79f9f85186d66a434b4f12e115cf0bdc72c4b88f9fd6fd96eae00762e33f3cd04f948e7ba685299bd45cf276934bbdab75eb98c309d9bd3fc5e72b8e1d35fcaf634c193f9016934229bcb87866911bd3d144d8257de6439fddf783a2595896c15edf893d6f34bfee081eb37779483ad14f9e8bb758aa02c33c14fb3096cc4e519637ec07b39e479b4197b283e02086064e92559333af5fc62befc85aea5b571ac9591c88ee24074aaf3da84b219df001840f4042aca785e1ff9e1f24696f5224049a9ede039f69140763e999869495aac665bd8300c0822754309fdd1fac475a97a34d88df8731d765127394cdc59ccb7547baa9ff5f034f4774bdda6b9859c99ea4c5a21b7806f0d63eef22eb134ee5131f1086b2e119d83c68ebd758fe671c33e8947cd63ee1eb73e3023441096f6bbadca00c350d38b76d9f07c623d4cfc7b9cc65dfc630602cf7e9f0f6cce88cec5253d549de3507c59d7029fb0d7ab90cb2677105b543588beef90b12770d618a50318bee7d789176ed5b7dadf9ffcc1c89fd937d02cb811ac1488e516720dc189ecc991b58179d3812e347d28aea00fd024018160a922f87de0c31f9ef96a9d3b018dc8bc7dd796e38e776b1cdd47f11da4ac2e8a439024a2e421fad4739bb6d584a8d4dbb8aacd7ddbf4538984d2cbea4dce46a4b9851f82fa817947e7123a5e00de3b488b3611ddf4cff77df60aebba43d4689fbaa9ea69ada22bd88eea5d3ad0a8649517b5aa07582f3d0e14f60a10104c35ed62ddc0107c760a50f10d8c9bc78af1f87f1ed8a50cf2c7870837da17baddf861af904b1e411514a924c879cbdf2e418205d9d799b6189ad4e4fa8e4d6409a36133ecd5aad1d7cce7599e7a589a7b5eb3929d7aedeb519a771459cfc781c2aff65211f14122bd21ef9283935dc65b5de4deecd053a4db6a4e717dfce16435888b37b5571172c5e8bba7ab0a529d650687e2689d814c2e9e4efe15127f2ede88710c7a1afa02b8cd63f8c2aaab95232de324f4695882f86a546f2b151262cf4071255e601f4e6a2051d6c3337b98be128b95ce3e70e05506030c60e6b35f70cbef60d69e6e9fad4e6bd9f168c5d3134b6d361edda6cb1749b97e8ba5cd4f7cd232ab3160cbc74d6e133551594f3763741da532376b427e1317171d3e0dc05966e562ae96d625dfd895b75b53b673b29a27ba81b2d9cf6686e9a22610326ff49fea15239760fc41368f99da30a28e9617df5ae4291393081085cb186f25e839049b1c0d65bbcf3802a760227303ad76f0733c85344b1f88441a9ecfb896bab6a880ae5dc607e7051e2c3bcc63ba289e2248744c469f83af634499aa577a3b25b50ac10013ac22225cb5b15f8da9d399f183de89cd67b5456076b32e0cb01992cd50347c7d15340562ecb8684c4603db899ffcd5b5aec6aaec825f505d2f905c386f6a029daa3753ead88da628bf4da1695bd005e82b17de4073a7d2123ca1cc8ebf65b82b81b56b948c74466b0814a697e6509d030b2068d6ea35d21de36d35a841fcd6b78f7e60a77a07ba3801fcc38372c6c22421c041f0c495b808a496c6d43ec1fd2d5e5c24e171ef66c073a4bce474777d58dfea4b56d43ee7115a4e583e0c3373ccf2d2dca8c3a0d9907f29b46c0a9fc345d75f79378dc40492fa6c788f159be145b14015f9d1b4a9c7b8c0556b592e8d357ca908cd13a06c5eaa7e0f81b74f5c7dc8a3cdfffed193e6682a0e0f18dc602d2dd7472c45101765b6fa819dbf12a03ee8a41af5243bb72e2efa889de677956dcbdc714770521ab10d05a3fdb9faa24481d41d5af7340878e79ac737c621a43b8113f102ffa0354fc208258dc9f609a33492e5735a56773c52d4a34c89b8efdbe1f59986ee1068019b48d17fadd0e067912642b9b6f0163d9f643c28a3122c6d64146b66087c58a6f5e8eb975a7aee936ff34864e8a25e989f3072bcb2a9aaaf99f01b7cf385a33142356fdb9dec393c663fd63a85cf8262ff4f60be54f4b17f6f667c9a60c4a5bb20dfdd4ba0eb99e8aeef0aef7dc871895095498b40d3f890b0f9f8ba217648ba05635c4ffd142e538de985bb05d04c8f39642b509bc7261a741a6db2d3b133c9a4b73ffb0099f2be567f292d648d9d701486455c2a804af69b056adbc999ea24d1a658d0fe1c85ac3a29d18e3c62c13fbdac36aa56f58396f387745f76688aa66a83fb0c3ccf8716b267a54d4f112677ec8fa11252ddf598442eb8528abffa8b6ed99b7c976ecc58d66c96a270d90e789cbd18e0d02d24a90fda2b0df76fc1eb5e4f547018f61a4161d30252be81da87a9bd7d65a7a87fd426ba1f49a62a31665952801dd1be8d63a4b077c3e1603d2fa1ae438c5a84e693a90e248d16bdaa3b8843c0c9a1a3e7690caf5f1142eb2f50175a3cfe50f0f3e625bf9d715fbcc5a1bcf89dc8a2a600beb496875274d7ade1141a9826457634d0bb60987532c17a659eb8bd217769bae8fa05cf950e05aead0e9682f29da0b6df731510d156e05f4abd961b8988420c0d0d756ee47d71e0cc94f507cd8dfb16a971614537b2da7d86101acd24b1f278e8c0d61cfba3f04237482ab97c2a7b063c621d1d893a1bf909dc60320519b5d79ef55316e8fa9313b68a8e0545cb603134b3e60d75e93329364f4e152a2920035d6876de28e2c04f52b340c4ab068896989bd4c00b36df0b0f5cd8e3eb552a0c76cf841b50f88063e369788193ce49a82ff0d145527a179d027a24d52d8f84ea2ffc55488333c9a8abaef1b6","title":"23.合并 K 个排序链表","link":"https://leetcode-cn.com/problems/merge-k-sorted-lists/","question_id":23},"88":{"day":88,"pres":["排序算法","堆","哈希表"],"tags":["链表","堆"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个字符串,请将字符串里的字符按照出现的频率降序排列。\n\n示例 1:\n\n输入:\n\"tree\"\n\n输出:\n\"eert\"\n\n解释:\n'e'出现两次,'r'和't'都只出现一次。\n因此'e'必须出现在'r'和't'之前。此外,\"eetr\"也是一个有效的答案。\n示例 2:\n\n输入:\n\"cccaaa\"\n\n输出:\n\"cccaaa\"\n\n解释:\n'c'和'a'都出现三次。此外,\"aaaccc\"也是有效的答案。\n注意\"cacaca\"是不正确的,因为相同的字母必须放在一起。\n示例 3:\n\n输入:\n\"Aabb\"\n\n输出:\n\"bbAa\"\n\n解释:\n此外,\"bbaA\"也是一个有效的答案,但\"Aabb\"是不正确的。\n注意'A'和'a'被认为是两种不同的字符。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a3341809041ac4f0b4a4822046a6411b00ec8e04d3a5f386bef76b785c31ffbaefc191debdfbbf06c7fee56809762b37ee39f45511b3563498fe50d4590f8fa0d17ecd7e24c17f641a2352926505ddcdf2f86bd5dcf7b787181bf73572573fb1bb3aef78c7627a4605c5bfa2beb2798b444434f0c135914fe4419a214f926be80d522d9acc6b35c21cbf92d2f76d5d4f0fcc2a13619a7a788ae705bd08b89db3a4315f7dcede674cb69a6a23ec9ea9051807e999348842900e4ee08a9fdf077ef59fcf9c10820cf27acb76a2c39ccb4c4b906c04ddd677aeba8f7badf84db320b69cb8df961670f56cf2370491cffbf57edd4a2c83b9c25225c7c8e771b3fc68de50f946f8026d8d6b745a1cb0b923d66cecd09a2bba02e963d6b27996e57eaa21156e1de0092aa1482ea1fe451f975680f79492c0e2281c0cb4d176aed80f1d6d1d989323ad441bc0f56f2b0f890d9d99614a2029743b1d8a9fb92c70a983d80a013cdc7a5f0dbfbb95cb2a7b5357ab911464174d0ff7d9336ef29c760a24af05bf2c3e27af7ec4e5884590d2c5898ea085b1357828bd6f03f1a8ff1118468a5d7d8a474e801423d28dc5a0edaaf26873ea29a2605ffdffa63662c0a5a726ff623e1938183f0ff6de551a4ebbf4edebf0e0858e5c640d6ae8c3d3d4153a1cccf8871c1d867c3ef48af519ca17474c6611a677aa4aa7b8268f49eebfe977b201c2d571abd8934f3ca41240fb0e2e925d2c96778285c46b88d8f483b50097159683630395182090ba07f082e69889f2b780bb698c1c9d06e6d25712dd1682752931fd50d44b4529cec26ee7d479bd51932b90095cda0acfde9940da2cb515ed7b5bee0b6bcf9b46b14b49e4b6f38162627846648f7505072e2165bc752dfc7d7433a2df14fa54c974599cd17a3fecc51d3500be0137d02b5adfbe32b6a2f2bff5728a63fd0f4a2a428b22a85c06fe38536c25f23551555b3fd5462c0e6312238f8456e2d9564304372d7990a0bfd092cc59b5161590cdf4be797e0ace441dc0031c26ae5716f3fa37eb010f4a427a1264d1f3d54d678c112688f891ffc317cd9e7d4b718c55543acbae3fb4370c62104ec3d1b03168c13c26506832adc1bff4796d4c81a3d5cca939994380938012b462e880800f3dbf910f7c23caaf03477dd8f5b771ca1aa71f11368de36f445fee88fe4eee2dcd87cec2188e6afec5ea49ca5b24c699a33e811bf0adc748fe4bd7eccfc10b3500fe6ef46821d3c93bd15eb9dcad4751909d6b3c8c0554276f1cccf99647b2626d726dd3c7dfc97887507448d8c0861dccbf192a2144a780ff32bd95f45af5c9ad372cdf276396901f1c1f4efda48a54bffc28bda6dbf4518e432afcbf58b46a682df8f98413bb7af7f8bbb11bb96b133080897ab2f38f597720cf688fcc01336ac816a840da068f328aa6c4f1d55d65d02a79b5a8c5dbcfa223237b4765ae6621fefe4145cbcfe1d25503cd383b9c5f398d76ce46c65602fc08572d53f5f6dd08f4cda6c66da9cdf49e10c0b1b6ba8377109d5066cec968c01bbe1d19c4b9cd17c435564c1f306c54f30d4330879d3595c85d4efe1eaf0f48b39d0021a343048ecd5b8c329dd8ec5166f758e45957db9dcf4b24b19851646b3395c6532190d12d3c1220e097c65116474b58d07f5c5175725593a95c89a27cdaa1d7f859e039d092f6457858b0ace6432f35be5b716956b093b658562f317f0ad985a1bb812d7126c8df0dbd65e1cfa2ba749dbe2fd9268392fa7337e72dd29c0d2c3072788dd0263c978936e386ce228bb62122527f322d1c2e81b01377e3c14741d0bf54b1a5ed464c0d5e797f1dbd8a0fdaae0cdcff7958aa2c2411353fd72b720f19dfc5e092d7c81bf86eb43280ee21dfa25981bb51ed8f12c7913014700999a57ac61311bff7156338f513ed2f84c824dba9b1c89ba1086775029d8824fbca3507b1d1d45c52fc32d924e8d0008d0a16434451350898d2d41d06d9268af5098f7826e6904ffbf7cf24f390fbe323b1aea5c68cc6e836022db7f646dfbce49b0c8bee87bed714adbd121f34c9f27ae86b665ef9247310b605048d180913f4a206f70e9bf85a40c5dd5aa01ce27750479ccaac6b743ac8d1a3947d87adcd5395770bdd8ee05e47fe41df5e8f313a9dd6c802d419caf2768d95c97f308805f7d2a4252d6dd817ff876e51a47e5c9c93896dc8ab3a8f2e4dbec73b909021ffb7ef917a93c8261793619612c54e0b0ff0e50c4fbe04d898c803602f04514bb212b2550a12bdd2c3bd10c27cc3f70fa2e59f99daa706552283349a6fa41be8479028ee21d57be56994b4e2d230c7c82079cfa2785d2f399816aa499132e56823bd067ef1cef6e4b9f5c291caaf9fa799f6dffe8e8a4578b2fa9df4d3c0da15bed6f2f6509de223fe1927f6ac781ed9a1e9f4683d96a5f482b6be65cda9721609a5d0be6df57ccae5b5a1203b1b7ba70f07678fdfcda2a46528edb29382cec28b23a8dc3a8e53046f81adc5917adbb462cf231a1b3e6131f4a841a26fc1c373a5cfc5892e2d05f0e2bf8541350620d6321d1cb5c30e0cc2ec1d0c922cb4c8016f2ce6dbdb135b8461ca6b3d0bda50ad4a3cdaa642494f0e258eff3a77490e52517bb1ae7013f9af3136e65e22f5de423ec7777232e4c116064a027770b1cf4cc74f0d199b1a5d36de693a2f4dccf5d2fb7a9df84f93af50b1851fd1f00e0781759f9e9be0fc5cd381300a880ef3cb4b80e7e30c0c843524fad2954c93b19506a1c1040b886b6bc6bb77a7891deac7300761f623c09e95eccb80d59b680edf700d6340488e8edc0ce97c34b5d2780bc6e1c6bb5be669b03ee1f64bd4470043bfecc8ac2f836dbaf78c23f871ccb7fee16b2777e77580bd8faecb1a903c753c68a39c1fa60390445b775b08302a7101a61873fcd4e2f9acd9cc925065f9aa60a39468c4ed0fca3a7f58d6f2444085c67cdede390fd6e43ed1d9b1837feb8b889176ed5b7dadf9ffc938dcb8c35cb6ea61dbc0febab42724ed3ee9688c3f08944c7936c18707c90b040e7020f9764ea3bf87dab860287e243932d07c0c09f2588c2e080632079df02af44d486359f7f9e23b3a13fe4dd1a8ec8bac3ed86c5b8e5df7492e979abc8c3cbf750ce08f1f5c91fdea6813555b54a730b1cc5774b90125698a0b9b631a34fe3b343d93a95fff2ff62f9987b94c6b2557d9ece289508b5e61558353d4205ed7d10104c35ed62ddc0104d36422eb542c8dec7ccb0b33a25c9b601bc9de5133bc15393c6ab67848c0f46494b58f224ef60c9967d06a611dbde95b60bd6c6d5faa44d6409a36133ec82a4d7c989ef3c933b56fe280aaf9ecd55a5ac05db78521c9cd681e5b4ee5b5fb448169764a1c6d1ca5ddc5b11ad8db8903fa4d3265f7f2bbdad642988c763f453503685a6b48dc80a4f9d751d87ab6881810960ca1ca71b137b31ed8178187b1cbd5ce0d068eecbccba8e092de324f4695882f86a546f2b1540279c02217513251d1b6c2b5adac5715fdffb46e0d0973679e94e2c295160a3ff0c35cbb418b9ca3bcde34e399ca266919c601f3f7f50dcef89492bfc3fcfabde2079ac18f6716cf3f6041e633532160b72ace8a78f18772b023d0f553d437200810428d375b6d8a86c909695ec7103e331fed364fd8198d9cf66d5bdf06f5e756fb2cde9053d9766fa5901c0d68e7eb0918116d45ca07454d60b6e9ee1186f25e83904ce521f1dd58a6a47e31f6f3253f774f37726cc75465f921f42879fbebcf6a7a881b35d8852e2074a3377c53cfd66d66e476f3548d3c6e12410d1a20c244570e744c1545efc2c2a56bfe54ce6fc87d6f1d8b79ce73df556435ceb070fb0df245496a7c9b98f98cab314a96a527ac74c3b9fd695f5ee8cebbac32839116ec30f381c254e9ebb3d48eb8acadc43f61fbd2a43c415a8621d907824ea862a36a692a4f220ea6cc4de07dd996f47636c1ca097c71fdf0f245d729aee368f4eb1476e826bfcd6b78f7e60a77a77be340da0cf9a7bfbd62231fa1fddce8de42fbfdb98e03e90a8680b1924fc2c8b239773d4eead3b256743d4cf1645c438f54d17015d61083a33dead9792b886a28c962064f8177a97cc18975a6c7bd49e67c0e62f30ce4797e160b6475f9798b1e0c7bdce507d656b9c3035e614c01eb63e3ee36415bbe60b1f37d1aa8dfffed193e6682a0e0f7495337911dd573c170a5269e8a9d9deb61daf7b9ee119bf6c54de6160be93b7e677952b848e714f411252cf634ae7b8b9b2e705969a4f5ff0205c79abe4dc1dc621a43b8113f102b9ef2e09ca41389cc7b20fd96adaa726584f336b52cea31accfbe6dbbadf9986ee106801ca1d942ae8dee96e856318f8b0e1573096621612b812656d78142533122f11a3bbe3ea965005abc62afd01378def0eccc6387bb5b2f2d2c0cdfe4b29a0cddc73037624d3b2ed63732270927f858cd730ad4f7dbe05fcde2a2a682cd52c88adef11f5f74ba0eb99e8aebd4fbb289a3fc044d015d33f81aa9efee18ab33a5d7ffa0b763a29fe34ebd7202f3819c04aca4a91c2edee2bcd7d651b87a622989971486e25b923e50c7076d7bff7e2ca3778ecb8822e58ee18d033359ea3282111379d586f8640668b435aff51a99816a476a9741ba26fd258452b5116ab94e9f42da251ced85759cd8d098d758b674211e1fe764616dbbd59585ef98c7dc80c222365fc3041ba7faa41b30cec4d49b10bf124a7ae59e9d4070efe2f4f9ef67e977ddb5e4f91320dbf6253228c2b18d2bc99fc9709b0e11d649e42a72dee862d43404d112ca7469d92c3da687129ddae191542faa41cec76efa7acf796f54f5196edbf1040edf0a788da86a2019aac26982c104b73424ed6fdfe205aabfe1d4ac19c81d45e3b0f3905c6f495eeff6d3e641127e6e203b10307337a13f7e22d02a41640fbf7b1701443d9b0cb679ba66e41bdd05d9de8ba84c9ead8e8c0ca5d5ce6404781bf15a3864005100c6142e46f63e2cd93f323c283e618aa53684908a21b851fdea26df31c45b368757abb176a3ee9197feb73e392a0e7baaff1d37184c56ccffc217e500b2e1d045ec188e3fe9f10a3a98f1a55c67b09f55c484c19bc21b1d4cfe7b2a1c6a0b45f6456d52cca0bbcf61dac6803d3221c6b757a6cacdb614c43639491ff3684b2be72e37643b9fb779cc7d545129e36bc4c9dd02e0860943a9ee3e24dab470bb66ada3c1ca68c6e216c625a2a34d2a28c3ae00b112d00f6ac815441cec91fa36754532c0a4b0e271300e188c8a6927df4424efe10ccfe0a3fa292cf5bd067616d2010c94f5907f1942dcf42e5ef9e38c0fc2e6c33da547574ef4cf3ac434762ad211098f4550f99200fe84e19b3e6c63120e281b0937533b19a39dadd3c8ba56d94902aee27c59175d3d2035cf83af427128a310774962bf9f0b1af218c84cbc6ef6e8c290f63b26c7117e460ffa6998983299c380c58a7ecd8c29fe1bc305f0e245dbd16cbff2e6c62749a7301066e9aa027d975c2973c584893bb4eab8bf453e0608140206530775a948817c5b481e5d416190008f89f7568a228109a8338a395b07e27ab5b7a9aaeb2d4d729d5cb41b888677af0875f841aff2c9f4cd38e993c1223775c787bc521a5a13c4baa4b5522bc5526374d9457f9c5d69ee8de6fc9af589552edd3067325a1c4f0d02d48093441c01abfddc834494646780b01fdba0b39d2db10b689ab192c719f5b0a72f8bc799ea6dd095e1efb2edf1ddd15b0bf43609cb2b4970d618edda096811c17e59ff6df72cc3c0856aba611d09ebade0afc072749b6865c55202453d0bec7c97db30386a86ee437753e77c2b5c69f250313205c7f3c009fae34c2442799455dd62624688359537155f65b1d9aaebdce6b1965106a6c166d080cca832ebfa8bf730969d6e065880e4710269391ade18006aa6096bdc2548d6d1d7dd619264520ed0cd849c71146831e28d10697d444782224d4946c9d79e06c27f53f2da02c9305c48310c4235359637f79297525bd50bd12c35ac26e783c7c8f394bcb4a0d8a13b58fed756f50a1db95e49ce24afb6da0dae337ce219e27ab1474297de9b88b80966f8d5bcfde53c30306f9af61dc4288a9f03e77433bf11e1010f47012f80ba9860c94164da67ea2974f5829a3cbc9e3a73424f0c16ee46399cb987428bbc2bb7e0446b9b1dbe276eabffa4951c37b06031c45fc686284b71bf401ca1dcb4eaf50b4724be01f55a4f8acb8fc84a01ff5cc58d6f9668051ab4910ef920bd746342d9103d507e1400533982c43ee2f46532c4d4b2766a1267037b094abcc8c79a34a51bf06c937287431e72f694637cb179ab0673d63610b04c796543b588c025170d6e620a43c9763104844d85f4b1939b2c95c3b5529edb2b2de6df5b81b2fb91e87008fa24d3a1afb3bb515cfc3c7a97a53ad89351ef0296dc109e32e7a21405d55855c28e64e52e807f381dcd32780081042c38fb681632cff7123bb1377540eb31b5967ed8960cd77cc249ffd2b1dc7076305fe6853c8a21479100da80e792c199b416e6570fe2cdfb93ac88193d3c2ebfe2a7db8c4c9e97e5622aac86d6805c33cf5edfcd92d801ac43197e94b","title":"451 根据字符出现频率排序","link":"https://leetcode-cn.com/problems/sort-characters-by-frequency/comments/"},"89":{"day":89,"pres":["二分查找","堆"],"tags":null,"whys":null,"difficulty":null,"description":"```\n给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。\n请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。\n\n \n\n示例:\n\nmatrix = [\n [ 1, 5, 9],\n [10, 11, 13],\n [12, 13, 15]\n],\nk = 8,\n\n返回 13。\n \n\n提示:\n你可以假设 k 的值永远是有效的,1 ≤ k ≤ n2 。\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c3b1093584ce3c64605a7e2355b8822559eafe011808b071ec3141d560c88a224daded3538f60ea9442272fd1cbb8ab91e0a3676cde4476b5f1bb393b10bbc024d4a8f7ed6d34f8da4e3254fa1a534c7e4494babd4d14f2cfd8986fdf82aadace1a5743fb76e4a5ef731d727ba9f8286fd0c19591cd849f62dff6ae66edae5079eb4d7a65b788bb2246770cf99fcf7caa32505e6a68ba632588d9784c52b0305b0d6ebef3acc61b5bd7fcee0c91a97778d8b48843e54a2e34aa5bde676e95eb697e646629bbc6757a2bd9d09186bb81be8a04ca9fc042df8bef66b7fc88fb1418efa52670c5bcc3756491ce7924b0f1c755fb0ee03206e4280430834c2b3e90dae6ca20fdbd4af4aace1088c3867e4e509ad96a225a53d4503955141eba01f5af5d40092aa1482ea1fd649f54966e3fa106d3c76d8d44295b5d503d0e2a298f00c63101385418da9545f77fb80fed37098ba97897b0a3d3c182b84ff759fc571e97e494f113ad249edfab4600e8f523a693293efd1df642d7cda0900bd3006d191bb79b5894506db5a5b504fffa008da9bf7e439998f2771c7c5ba06d5c48dd8ce32e74426074d58e029e60d0b12bdfdec14a9644484d0e7a4e2a3e3860ce571173f2d4630f13253f0a2eb1cc97797b7872045ae4e0e48dea697e3081b6b2cb66a6fdd42718e2ef92410c45201f493afe41ebf14b23fd27c3e4d4fdebd0a2d7f91617eb00935431f36bbdcf8ca97d35778ecb0b53c4854c6a5c0097d436b3a381c8f338b8d061d720cf0c9d3e21c2cd7fafb92b86e317547579b516b348d709e3c29f75ef7bf16402d06183fde71f0c4cedbe2143c3dca24a7de5bb34751392d28507b1fa871bf194a613e173d0d4eaaaf9e3b1e33244a4f8d3ee1acae4b7f43eeeb6ff6f60aa34bf81b7d080cec1b75d74ee7847f17969e39144e08789fb7cb53cfa7ea9f9c7a96c889408be7017fb680f43f5497da586be4cc08feaa4c4a540897753d9cdc5231cadf7a8ba02afc4016072e8dd64e50047d4a9c72ecac9c24d12c0d111492cb3fb5fb2517829dfc78589477a0d4348cf079df7902e581a5bf578e5e2ef2858d8969d82b682d8c7a0b4342bf6e9844a927ca249f6e34e8c98d442c3382b8d7d202464b275021372c0a0bf61d0ef0a2f77e2b42d531c8dadaad97ae9e51f2226bdf2ce24efac08dd8c3e0c9f17dc42089e484ed4bb39cae994a4ca5de12f53a814cb11f5176fd4bff159d5328e9e25ea3f290277a69e1e9b9d71c4d32a7cdd4b1e5e3b39ceaaf20dcb47f39b94bf4542ef1da0af9c1ef068e2556ddd4c892a2148e273ea25fdb1c3fa12befe7197f78b1a2e0c487d08dbfc00e38f5f2e2aad4509f4b3fff319dd1ff877ba5a3c68c9b4a3bb7af7d88bb13908ab1330f0795af271efd946131f582cac01312ac816a8538b668f32fa84c44105afc502c84994ebd5abef524093c59077dac152cafb5182ef5e97d577a7ba294cb9dc4d09363b50b4d3a65d3c922c04316429dc57f8d1159bbffdd0389327f526ed44771778d3706879ce576b1beb48523f2c60f1e7732a9ce779b787a93335a2fc60639b75102564ef1e8b534c30f1a281b47d7f9b9ed06d08df3165c738f59a57da4daf7a64711a31e44b0355e7b0c1b193d153fb2ec9bc76b3c6174b5960bf3ec1d463e5b30b1cb8301cc8b39b8743a0081272c797e85943dcf6814f259dbbb069c681c37689e53fe06f3afac4e11be1138b7d58dd0ccd54000f8369349c1c4f5b460391296315a4dd006cadfeb0626a4da0167c49119cf11452a7399254d2f4f5bb0d2e2e51b3b327c123777190cfd562eeb038e4d04014d84d9b20304242a20c6c3882d493ead84a660be5fa9320b38a5e6afb4cbebbb42a0cfe461ed015bfa9247945d04e3e3e0bbf3f5710b9949ebd7a713e2e3f5379abd2851cf4aa72d7bc90062ed31a08fbb6f54cc597b9ad7e9c2cb2cbe31b85ddf3bc6f3323bdebba79cc44f16ac8946fe109e5cc000604488b5ea6429bb48ebfcaf22bbe8e129bf820b935ca4eb6f93dce23d72e07552112fc149be923e54dd39cb4cd66b3439e53d54d5bfd5e3a9ce555c1ffac69caade7a693c15cae0506d8040e2fbe8fd047e033aec3a67dbaa9107bd043050c6c5744a26cc7fe854d6720e70ea0959ba42a98a6967e1cb04e75b4eb7789ce1d4c39935496ab5208d2e8b98422b7c815f7d397a2a4a233227e72d96c7814c9157906cac2da4cb9adf92f3c36d4c368a810122018b4d4c0ad9b11dfe807d8faee2ea05ee78bffc10d2bb5098a841e59f7e1934c5f695af9e8d3c56841670faf66676f0c429835ba98fc1a7befb21e6707fbd405e177e64dc1fc82a790ecc3ac579a365e16346804a7a3be8f0e3689b67ffbcbec733866ea48c523b1ba856a3221d6509de3475f0a92567c280f88747c93a9c857707723c37f95bcd98212e8d543099d11d9ce95270380b1a4f64a53384fe15195cc199c4187587e2fa6cf342ad3b472d1ce8cf16fb4ac3a6685da5bd61ece9ca84735edc30b5ea6e8bd5b3c139dc2d2479c1cbc527c1acd1e2fba2e50046878c5012aa0f176f865de76f942809f66911f90cd5913513111017c5480a0818c8e2285027c8037b489e0105d4de7fcf7c95c45127ddebaf29b3d21fe57cdef7ccd9c4ed94f235ecf7f0fc6233b470016e385641fb484c2d0f2a6a91aa3717474b759f3da0b4846ca9ec72f7d3c15320038d0c03f287d3192b17e2737dfaeef8351188bcc86cddd027da8cc8e8b0c2a13a7b572aed24b3834c4e58d1375c505c781e9002d5ad1c38ac9ef8a7529b241fd0e3f5c0d1dcc851043c97c26a4530f3e529f46de35225e916395c368efecec6e921dfb52d8363d941cd7df35df06864735b5182fbe3e78242c053c0d152bfb832e3c09a22d34509ce7880b1960ade03cbf5654d7e6beaf3bd084bfcb88f1e95777a67675a61c4bb8c97e5a35567263061ab8d198350cba2394b3b1fbeab510d1f4f2e39362e0c18e5589465916fa0667fb8b58035675c67543b22ee3c67a1dd9c02c2e99921dd8a58966fd924ea3b29ae5927c06ce793517418aa270a0c6df494b857ea5dd8784bb9468d1ac8502bf14418f5625a41386c4c56711d59b8322e950e7c057757957ea6356d69da761144b1d228938b96c11fb1bc2cd889503d7863b853a92c2ec31c98552b7202e22969fe423d3fc2cd417c885d891921affcf394e2c35189ffb5eff279e21e60b210fae9825aea71186f7d7428b692064a8d427442d8d248be7b5d0a980471a99cf291d80db458ac361ab7c600de3c51715173f4ceb5c399556a42f7293ebfcfa3d4d7ccb405df2e14de2b1bb393dc7fa3e0169768490b9a9fc581b7fb4a4ab84205855ce7dad7c70d954152eb8ee2d045ed902809367bb2e032389f866fb54b0079c5c2ca8081ceca37a19e2724e51847e49f5ad572d1c884ad1541f3c389d02ce72401e9e581a9efc05de27f8832c1e94663e692c4b4dd8ddb0b94ea25002f0611306ed13c3b281a98768d305d4f92b66fe1ce9df24a89f20cf04d168c42226edce21b258df1ad557cd7d1c33655547b2c9a8e68f9770545a29542a93af88c701acce7d48ff59dd7baaac3896092abaec6f49a95b8c4a4e71dcb8468987548729f1b403870d7d573c31a5c9a666f034f00fa2a2f0a97d4a9e33d230c9cee73e029a3b43a101fe165007fc553ac34e3c54c5009d7a5186425f9132e961c95c9330986bea7236d264dbf377eb2f304efa1118dcede66072a02301f06471bec4cc92780be9afd2bfb7d883aaac2e2aff10b460fff821429c0baf2b64ff209f4fb39a8e6dc6962803d0f103953185c6523bc79cddaff76989b7570b7913a3d000e1b9887b700f80304070bf3b1714c3bf5adc3bef49775d695e90795961c6e4e0c67c1d90b571e2f9f79e510ad90098e04cb9275a5fd4e22b9d3794f367de667ef015b9a1a6584daffc85d307808d954c2b8c2d15304ca42d647a5cd1fa36c75713aeaa43fe077a5380aae87d73a780bcd7440ed1a486e55a3445d4b69a35434d2ce879338e90ce63fe313751efd9b8826ac961ed53ddb3ebffc81afbbc69dba166466140d7dec9bca683aac6007dac113d509fed332178e37fa2131cb155242b43dbcce530575235b5244a5aef7e648b5e41dc023f331d09224b6f32b64b1dfc14e6c636e3b790321d7a3c7b7e151abf48422a7addde496b06c3f393e3ec76bb41c4d932e86d505a4eb5f2b5a72f751b23b48fcccdaa3c623cbfb2323357a61a4036783d104c3998e4d7753b705810611abd544963b38f6c14c81aa463f7a9605ee1a00e0ae95b689eb1223db4e024b147d4fb3acef6b7b16d213df7ea0d3fc6c962f5cf4ade15a3cda3a5b47ed4621242a192a6b0c7b43bef5aceedb4a7bf98f72f0154a85a75a98966b61babda28eccc9b95872a5ccf33e54637b8ae9e3642258379b55af44488964e8d178b90830b28aacb45fe90c2a77b56331f22e223845674c9729f27cb95eb552f779d3221b594418674cb8b8c9168fafafc54cb1e8fb3c2c1808c078f14684daeec80300c1fef7ec9973005bb0376679d53e94634d358d8fb9bdda600dd4d324dc93b62c4abade403eccc390ff2a576ca44c709b4043f5bf1a2ad0de68fa2304f32eec31190c356eb4db91e6583a920326cdf4394d8c46c047eed2d4a2c82b0e2f8be7603324e4e923fa4c450e1ba00713d54fea2f8d79937323db348cb44862aa4015a39e31990fc6f23ee6535490dd1c302c98687f1b8b242a3c0ddbb4ad71f6e74bd87e8f46a96114ac89f79b1f20ab449496c2dd6e7204cdae082e49feac1fcd7ced9fbe754b1bdb9958e2b60e4ccaddabb4d1ac4db9196878b47078670f315ab37f4be4078b9d555eb5e5b2b3f392c3a6aa009bab97af5176fb9725dbc00eb83b90ff958730937137c264559c85b22d7b43bdebe20ec9970e359dac1a8483c4b8a18be6b093fe959756d9488ea2199f804032190f4063ea4e70e1ef92f41bc08fde1faf4b45440e8f169c10ddae65f12e7c76abcb7bad086e21c2faedbb12ecdbfad8f1210d1526a98036c976cefff1cc520f522ecad7aad1f048977b4a586a803d20b91556f3cf2aacb1efe6e788ae0360035f5274d701c80d87f51b9c6c00e7311c7f6d7b5283d96a474e40b092cb0668140bb59c7a0cc9d93af9fa9d102922d931ea9fec28087eafbf432f309c0a934bb3039f1477fe8d02684e2633296d9694df69d4669387881778815441cdd433a17e635038064923251804c588ffad936bebc0c11718fef50a2aa29fdf66d175746c362bcb53798422f589458b78a7f13c9c5ae6a4af6498e8ef661bfdcf177412cc0c425410553ebc2e1ec48a96092358bbe58daa6819123fcf30921e8020eeea4902f760a939885eff9f892f387aa9f51907853f27749734fafc8ca425aca581c8a35569dfe2f35accd6c325e3988be73825ac4cde0e5039236c464e2e2bfbc530600027de2e78ffd5ffde273f4ec0d26a32fe3df911318aa48a126b97e60e06b49b1f0395fff8db92ce6920ac0e7607373fd1fe98cc391b9bf20eedb83c4587263e58b0fd618dfe607f363a3637960fb07c1a97ad7358c242ef31bb20d81a7849af8ac67dcba89c41d40e6fb3e1b656196d7bef82f29865d9221750561d68b7253fb21ef53a2f9cbdc7303d2a0681bb9d8fc805f25f4f45fcdeb381eedae16050fbb90a26c9140967c080b545d8cce46774a24c3e5ccbddf772a84d8b17af5938a6fe18574259e5c8435d0fbccd53172107561afc30b5e2d96450d64d26661a8f71d288c63b1ee093e8abd703634812b07eaf3e6fb36ffbc6b0b26716010ba5c0b3827655224d1b789854afcf57aedc53d7ebf342b79c82f83ec1fc1e56154f91c8cceb90e6cc809be82f4fe63d2d4fbd9eb7182cb62fc5d382ea0f2f685e12db29d459216e9136eddbf01492ece8ec32fe5fa76e9a913ac0b0168e7054c6bfc39431624ebe73c96ce250ace414a254a75d4b9717b4e3a60f13317bb9fc599c0e9e2fe547a8d1a256a5343859a4ed01ce781d1bb0e2ad661c7d050a67e033b46a427fec5cc570ae67f6e7dcba686d474000cc61cd661acb63caa74a698a3dce5e433f80aedb8d2d8acff96da6f337b92e12ba173c67ab7e6717e997b50b0f55182ad0de3718e930db765f3e93a86b27995d1c6fb9754061b16a1ed06311833b051e624ab50d37c0e37ba542871dcb10f559a53f5caa4b3bcbf8e5fce197b707f5801998be3d8542fd000ae29442ce12032d8b32d544e1271667cf040dd1600e1a540b03412ae4752437d5d8ee81c937f74a18f106da72083522e33a68081e8200c1e2153d636b042e81c31a7851ef671f7098a974c36ed270015943e95e1e0528e98a49207434e7f7fccd24aee4747bb01edc77a5ff68755a7c9c36db5e91879e122bb3c4e2d961d3825fb797bcfdcdda291c8fda0babce05ee6eb886a79835c6572020be80deda478350ed6ae6213b3d21f27a480ba5a408864bac7ab5bc561965e5e095fd4270c79a34f1dde4ab23742e39b94b577cb305a4752adb427b4492e1efd40f7fb8c5e8c2737a3aa6ec696813e83cf8edf7dd3c4cf27e950241a5f8108367625504e96497f4ef66343967d4b4402cfe796460be8bd7a3c9fa2259365bcaa38f352c18a9bf333bbf121e1aa42df40dc825c038e9432c8d0df15eb9c548cf73a6df68cc70a71aead3c7a194b503c9653494f0fb465f930ce2acbd19689b53b1187bf892ee5aef51c7d6191e3ff028a16988e32cca8589d9c59b05ad20e502df0816ce6361cecc0c1331deedc2dbafb56d8884b2afef5d82f022111f72bbac2ba085b005e983d3fbb8553a49ac9988f145aa65893e576109771e4e7f7b171014aee1de133db5ed512ad368e33aed3b5b8979755f6dff2540d58122c2f11d5c148bab6cf1c833dcf071be09ef7974e241b130644371666a99b060a48fdedea1be24ab82e803b8e928bd33127465abc922d1931389f30794832b0c014d7cbed41fb5b0f6aad22bd0e6132cee910248d94c05b5758d0599a01d2b51c4ea8440168efd9dfac7b1460ab5194bc4ab34e4de1ff748ec9a52bb2cd33eae7f7e54b582f469c4bf8ca3dd99811a93c6a2a2739098fd9d529bf9612f2af2d5f97c7b14daa9b05c40695bfbd14467677af65cb9e2c295186938524b8fe76582391ac872842fe3d22efee59d6dd0c48399a7f8750dbdb456a91e2d201e18aa0052cb1140b6c2cbcb0d471014bc8c41fc994c470f5ea6052768f7f9784e0c5c3850d7722c23421a11592a6a1ac2a7b2eac64ef54913b7144f44cc91f3cf2f260283e627de27ebfb69cca9592024b0410a76c41cca19b74b543e954fda522877a1c81d0a3cb6a7b48831ed3862ed2a50d65eb77f0860de94436d92f9c390e336c790e1f786c18efc27344ba2495eb96e1b1137218b811907dbe9fa90e6b68226022c51fb02e62e3dc0ae568e9f4893a877a727cc3ab8aeda13b866e57fb3cfaa511431422b64227b370b3b993e03a9852c281284d8436d0cc24c4f4ea5ac58e409c332fd9d440ebe50877f62c95adf43080dd1ac3f2adb64996766898d048ad5caa1ba9e6b91bf44aceab7297a66d2340cb6f1811ee97cbbcb4b3d93bf2c3216f589ae5f211b83cf0bef9dae32187bee2b56615a66da445f171f3ee119d8e2613d1117e05caf064e40760df216f80d14332ca14a0e5b5684521f05696909d412bdd84cf20d5105d0ebd60418717b7d03e9cddca994fe652072adecad27e133a76f476ad420648827c7b363304f5686f6fbba235ad631b1dd6933f5f96caa9bf55b639ed4d9934656b3b0f2aaa706389714392fab99e2e6146eb43c672f9b01e8f4ec202f5f40bee2cdb58d3b9975915d1ee44089eb10825377e063e051782b49b4f79148bd46bdde90276abc0f07336faf1e0ea8cef40855c79aade5370474afede4df054c1d15049f07d671c738163ee9e9a046a4994b9777b562fe8694f657412752059f2a80c34b288601860f1b0c846597063333d7dd83894ef024175575cda848bb03be433c259c9a81474a133334b20fcbc9f2d82521bbe446ec625fcaf51e9ccbca5a7cd5ce3594707f69d603f16263e24bca45a98f44f4a2fe8653f2ab0d6dfff0d331b2c93faab69fb1bfa9488b5a396efb385dd8460d356b8d79dde0d1a3f3c43cd95b01e412e161a1b703cbd6f1aeb489e0e4f6ff342e74be6682b1c68856c081a736a1bbfbfe13210ad2adb63260c78588f0aa7fefee02d51537ffcef469d8d2a527881d5be9e0a13b61a7b2ea7f73bf6ce76cdf100f1a74db4015fc2a8355ecdd024106d91e27489518a0ce86e7c734a6f2153042e3f17da1dfbc318a993d864b0f172e5128619bceffcccfb7b2512e5727c95f495868f143c117d671e5a10cd65caa28dc32cfe2c8259c8f0b35f3b9f8e167726bfaef691d20c8870ea3aa65684271bb405fe7197fdff33f573b7611161bace24cee149514e38f5cfde7c183fcfd0968cdfa726502020ff35fd7a8faafb688890fbe82ddb7ece4edf2ff60f3ac6e8b453aa0613fec2e0e21a6cdd3363fceded53dc1ff7625ab1940263b46b56affafbd3dcb03d8d895ce0d3c5a0419eeb389d1304f11a04b1c56ba930920b9733f51e2d7b27a39080f545fa94b0aef2882756e853481d03dd4a1264284337ca6d4bda466fa819d9a4390636b6e75144ba55a549af46417fb0388f7d2af8fea9591b236dabc0d939f60d609d5a259fbc839d2d1fac62ef31b13c9ae268363f3f827229b67e9755e40b3bbfe95dd08538e36d15f61f0e229a133f5d72a68495400caa667a04763b398f5e99cfe8a0db9a46fca287247a06962d53615345688ef66cbf47ad8391b4abbfc2bad1286114f8d58cbc3786e8a1d3a950286e2ddc02416e9b802f8b2195f50c0e6ddccd59bd0b1a9cf85d1cf0c6ee4","title":"378. 有序矩阵中第 K 小的元素","link":"https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/","question_id":378},"90":{"day":90,"pres":["堆","贪心"],"tags":["堆","贪心"],"whys":null,"difficulty":"- 中等","description":"在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。\n\n请你重新排列这些条形码,使其中两个相邻的条形码 不能 相等。 你可以返回任何满足该要求的答案,此题保证存在答案。\n\n \n\n示例 1:\n\n输入:[1,1,1,2,2,2]\n输出:[2,1,2,1,2,1]\n示例 2:\n\n输入:[1,1,1,1,2,2,3,3]\n输出:[1,3,1,3,2,1,2,1]\n \n\n提示:\n\n1 <= barcodes.length <= 10000\n1 <= barcodes[i] <= 10000","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c1bd23f07d6231746d59590f54a19b245fe7f8390508b05be10a76d05bdb801b79acff2039f736a84d2f7add1bb9968e18342399636081e50f5dbaf8fa3a17ecd9e1895ed2d3688e6f77660886c1a56322f6dba7d3ef82a56cbba2f03e529ce4bc871aaa14a4f1cbfa2be2278d9d47516d0c345614fe45229849b97cee1b589011661831b3fa4330c1e58f3f1c0e324a33e48c68440b779422f59092dd3e1d4cb092f3e272cb6fbbb57686f0d319917485c95d98251ba7e80ab7bff170e85eb29dbf06618ebc6d40e9d2e4053141729a50ae759ffd100cf68ec989ca18e5db418cdd63661a41cc377c491fdeb551f2d58af331902f216d628d633d3df0adea15b96da700dadba14db1e1089b0265f3c70b89ad67c9063e4909965167e8913458d8d201909f30ac1a9b1ea575918f7628c7d55746bd41e19482d703d5efacb3d1ca9e8010bb5c8fbb47524de183f0e875859978dc765a7b0e5f718c94279cac11f119177a5a64f83fb0eadc1e26e8371b0a4fbba56c15a1756eb24c041e330afc9684487dee525a847a342b609a2c404750328f2ed7d03a149dc1d37ad1a4d3e6a968c6027e2627e45903e9a2e95398a1b928c5117cf977792f225f7e53f823e1938d85fef46ef49b6e0f2e9164be2b3f59d0fd42cfa68b0515adc5ea8a500a71ffe664d0f08e3f36c3bbfc74c97b3366418a65f52239cf5a644143d2b70a15594b83e0bd2c3886a9bfb7e0e09b675f6c5e381314f7dec2184450e43d442f613c93596792f28d90721cdd0c3d67140ac9444a026ff2b8b1c9e74fe5f6fe22d54bf4abf87ae0b52d76f39a60ed4b7da8c81d7e7518602339a87672e8e447f3f94728bcd7ac6f308c7b11469afa93889a3809f6504170af94a61b980b2f5f89eda270dd7ff6229a1571c2326f08d55497f239848ee136520c5defa0e9b84f92a613e6417f4e3ab57496c8ad5a84d02d9223063fb0341d4d9dfcae6684121fd2456414955e167372d6fb4b8f1fb6ce78dce5f85424c0984f2d677e14c666a5d38464a00d585222f0bf3adda715872f7f01fabe23fd3d8f6988811eff2671e3dcd79536c64c49ad9bcbf86366c5341ded072b093a8c18c36fc242d656f95e45b6fbc81a3b5edfbd97af280b2d142f481c6d523fbe9bff794e1ffdd0f25ce8164d365650fda43da32e3a8729bf1bc06404260d2d557cb64e42d3f0ce816ad6c48cf10173fc8105995cbd33f93223d647aea721f5371caaa571e0af9b56324780b0aa88667740ecc19df4d780ea9889d233aff66753d752810b39b8b02896b8e745cc1f3faed08cc2b071d51c72c750b17910ce72f38f52481ef9bbaf8f9ea7e79588622ca6aefdd6a675f53a00b1578bb7938612cf8c95ef99395da9e83687ca63a7d6c90b474a98fc5a009cfb7965a8a6929c0179cf973dd623dd30c76af04f265852821c17efe565c115a3934d0654e9641dbf7d72bacd7f2e99be7d15335ef3dee5e694fec71ca64d280033a9ef439c5a701fac830e854c078f8a8234eb5962182ef5072769fb6f0ecdc5e121d0accbf237939c20561615fb8e5ff32868e3424e7da30a6def5d5828758a888c5da41147653e1ba8f8dc9f0295c4dc7d2761d218af14f7cb9114e71aa4314494025e451c182f03d1ec18eb98d065157c76a1ae05e2e01456135b19a5c89a27cfb42370b99b03aa1c2f6757898309cd4811f364f5b52588643e1a6ab47ef40af0a3a95118a22a388ffd8cfcc7d66607fa1ea249c3dcffb6643926aa325d46d013fedfea2b289ac50263fe9723c2fddc4f28bd5d1a392a1c88b39ccd71442610413b107532971f3f894e902ab0838e348feb1b5e5320439cd133e3d276f6b9eb3b9e37cc22485fae83c1a98b86aa05f2de8625ce66d743924dad5d2ed8eed9a9fbd36ae529e62d7fc54ef291b32e3f5150638917884a08ed483fe554f79ec7ba905cb12ac0d73e5e11de34dfeb0eeff0702b4b6fd21e055206c8fe6e13993d820bc66ed9bcc3355761bbfa66d865794ffe3e351eab356380669e3371b21a2838af8706fec8e5c251ed710e92c220ca439e19aed2f875ddac136d09645612d386da7a38683d38a6eaeadd04149bfe7ab32737136ac3b682ef10f6c21347289c72989c7a037ef4e1ea18ab1ea345b0e4f318b89144833b409aea2d76c31f80dd57a9162f781a04ddca853a8d43e4076fadb3ff269ed59199a8f2e489a920b914724fb01b815efd65f3343c635c3b0a48b4beb44b54dab2fe1cdfd0cc2b5d8d4564e968647719f572ac797ed60c68d23c65a26959aa94fc575152207006f3b415fb8432119ee45b0ee513c7614d22366802ad14c4fc62b295efd547ff0599136e16c2719131ae36ea6d58cc076021b1b5e1789b22abe8f1cf2fc860ed9a4e6065ed12ae6f5c315b976c78e1d46e60c39afc910fc86599df36196e3235af51d2c23c3ddf542f8b9a03a3fc3f1f544289babe64dd6b74a3bd8977030b82ca496d52836ff76893c3ebaa654ee30d8e5143e3a10335a714e0faae3d114fd6506ba7095655058f1dc6ead956246db70613582b43372198cb4160a1d961ce969070900c991eb59213dfb93ca34655adb8d9deeb5ed4ea89f2643994e0f97286bcf23ac4a07719eb18fb4020d1b0537f668d281cf76fe87e34727b134c256d844a325f73a6a831b690ccfdf1db77a684eaf3c7fc5a73febdd3d4b83da54f540cfc0d26ca2b521ab6a7fa0fd8a121115ae4a2e220b2d45b004899d4201a0eff68179d7e4b5c28340c57b285b6bd0ee03e6cd38685730076176e395adc17b4f95435ffd3b9eb1ede774bdde4f8d7dfd6c2405a0e908b734368c1b760b17aab5c2bf3006b2e119d83c68ebd758fe6378c6c890ccb78f44abb6c2373015f9ef9f2e399188603c4972ddbe177776743a22fdd8b1fa71a520bcf739f1e65d5a2cec5256f11cee34d7c1492509bbaf6b28be23d2a145d086f9ea8a0dfb32a2f8208911f2be3b9afad502b81bf899adcb3ddc9c28c689e3de34fd525a2e516720d9ca3c6c991b58160c0c36a3e717d8cbd19d644098071a129f47df4d262c9a806c4617fdec0d03484c28dc1332e1c9156fd1dc8b52cd0629926a2b665ae942193c8f69f82d4dbb8aacd7d92b25381c8c382b150c64bbea0874b9bf48f7210b307741b0dc439408b1c0fdde4c6dd7df60aebba43d43adaeefcb827adee3a88c2f91232c3a17a9d5bf0a55a167134592fed203a104c35ed6280ea3a103f59049f42c8de8e8ab0bb6a0793b701a89f8f4f729317c69d8135c1df0f5b49051da5249c34d99e61028b00d7c1aaba1d86c4c5ad8e506459f26f63a3ceae909292cd7bd26b589b665efdc78373b9b805d43b44189c99cec8bfe90532f11a08977cc5cfa9d31d8671779487b8d15aead345103b6ea7874e69c88775e255187182c2a3c1c059019d1649cbb73cd4ce0234b44efe15547a20ddc066087f46e606aede268783b4f9c14d68b02ca72c14c4f46a162e79565d268a5f7a252f29000b1f275adaea215195a012e7dc9d6a0ba91b527e4b4aa3ff0c35cbb44afcdd21cae31a2e8bf175c5b05c1e23625bc9efc21353bf708beed0030e8632b6312cd9dc672613285122473a35781dee3b372d0d2c5f4e1b0068419b1928e375afc3a8608dd6dce31e1ee57bbbe70de7ab98d9cf6686e9ea6351623efad7e915389b6ee0083a86aeda76e3c5d35f9a1be1690ed64d44e59c326f25e839049b1c5018d9867447a728385903eb37bb3674c0750f11c60114c6cfee96eba7e0c4f20dd95ce30c5f636bcf22b27a97445a6f66469f83af634499aa05696f6de749977e5efc2c6c19ede544a7a9d399b090a7daa677a5400418b866069adf245496a7c9b98f98cafe449b6f1a4fd66d20b5d695f5ee8cebbac37513116ec30f6e0e294e83ec7e01a49093cd52ee43e92c4ad517eb325c962510f4867c73e5898ef220ea6cc4de07dddf760763795df8959a35d946705d689aa366864eea6d6e826bfc9ff18f2872a76477f96b4ee6cf967be6992931c40dccd895a46ea3de83c23398fe7a0b1424ed78ad23dc61dde7873b25340c869b1e13817bfb0f5246142f417d6cd0ba8281f38da8c0d53b61d26c079f8f57d909387b84df2edbbc6c2e8f0b9bf033f85b04d6cea1e28fbbc04e7e6438847934b8088b5bff3a32ee2d4ae6f40b527cd180d6d5fed193e6682a5c4a20c0613743d94d3a6f041268ccd0ffed89538834c4a4419b1551dd6e6daad8b7a53bd478d78e0200504e1dac2c04e7e393e2b24789875e0c94675c2beee68274926ef627c85da51cfff2394890522c86cff76be37bd1e462534976401797f703dba4a695b5eb9f86ac513a428559d179e1def40bd76310b1feb55779c3315950e7577e28206b26270f2858a4e4e4e3df457bb5c669b25479d9aa5cd7ec387bb5b2f2808599b6542ef38dea7f1635218ebca570684a31c03ccac89263a4657dbe05a1f42a2a682cd52c88eefd6ebba30ef290d7bde39201e466e271c0169541c81581faccb7f3f2a7752e2aeb1e734546e86e6f1adff5ccf551dc4cc67730354e9b9726541b4f28bc9cf7758cf6f933fc52c3bda547687b2404e9e23d188606137fce1e8b9b1f6accc381f47edab109aefe0185ef6f7b83951662c13fedfd38fa03a6cb9ea8907e47683c9ba67093fb013b9ae84ee67c8f4d4f112621a9ccf5002ac1bcd61030b800cfbea4f53b8bd57cd12f871de9619eaa3b97437099a861a98a682cfd2599015cbe2fb0eb544591f4b530a7e3a44984975772487619cc3400d82ea55be526ebda64948adbc59b63d2176b4a37c2bda85b3bf999dd295cd24add022336380a4f89d0002b11a285360a3c5b73d7cb4dcce2b43cb9d69693cbc607fdee20cf7a568fab2351126074415d345689623d5a2cd0b14e3be1465fcb268cc3abd4872104e7ca518190247d57a790d73b211edb5a22e3892269943a447e1c642e4577553b86972ca6dd6e6c9f454fce95d89e96f42bdafb27573c3083604b46b46cebe7c8e928d61f835b449378eeed76f8cbad1c87f9cf4563007d9e7c0d7e1b286f1204ee3144a538c756664521e8ab949b5a1227663fd43b2303d8d207f7927393bb285fa0216a4a55291c7e522353cdbb9819ef1b8b75148c2ec2c534d797c581b6d2251cf5cc86c611547fcd84a1b07226deca7e4fb61f435a8dc359fd79a70a3ed3c6c91af2582e7edf57d7d767d018db97723ff6f1cef3baccf55a3a10e30b81c1decc451646eee508719066eab1d1f4d9ddd8b585dd3f56453c55d364d6e612cc48198cc328712ea2419cb6ebffee5e97dfab227942c166cf6975e44c13fde8ed2ec1b0a27ffe6e69d5c1ab008cb54c18c1c351e9de221b47f1ae945e5d783a66178fe03b5eda4d6fa6462c97ecff7db8768b55b51e40cebf97424bc1cc67b1acbd08f27e0e1032f877bcd8d1e003e3210f67b023561df3252d3a65f6e72a88310957f9efb3d390efab260c746b4ac24282b0602f7610e3270145219fbb31d06e818a4f425f8df564ea9dae1faa1fc40e633c05775ac08827dea89bff93581f4408ecf35f2ae37a53d5c77df0f1f17511c8133bc8eff1809238969e66a2997033e690158c19eb319351db83933e5c1f735d3e51c125a5e6722ca34b097ebc452f3736c60fbf8cb5cab1af3ad1d01d8931a5d11b7c35a181f29f2d05587a1997548ad8810b49465d733300e19e1b74dcdd43e5d1e20a656bdd5a4b73e6fe3ddfebcd4e5805a6228258821bbabb476699fee0924c2bc893c4e8c44e19a2daa2d733832e534d89ef5f849eb59145fc1f7f06b1d514553d7f5295bfc69d76f45fd3fc62bd3237512e91bdcf96255839205c7f3c4ddefe3ac2407dd45802c02b307fea430e7555e17150dbfeb3d4044d0a420e6a1f620e149ed938e2ebea32207599c22c8102475767dad6e8f0814dd144c5f4981185641d6390477d45738444991bc7520e83046bd309948e0f7b3205c2946489709a3d29b17a7cf569c640cc8a0bbe725d1625393c7b7d25ba17f56ce909872d3772388f2438cf494a8011868fe16c6e1dfac0eda1cfe257fb23e58db101c97d873cbf3e292678ffae8d81845ea771cfde53c30306abea659a5b91bfb037745776f7033154bf0e4bf002a0dd26be160ee92becc30a0a27f08e9da8a93c24a3d662f92086cfd87022a580f4324b64fff889b122e3bff74940ca60654d4845bf2737cae358a654c908de12e646a52e00ba413cc1b6e8b4fcc7ef4abb981d84f7678a57a3121ce28945da4f29208109dc55cb5c0570d7790dba340f5c274e014233ef723565bed3ee98843fea1802eb0f9b6c7b6a79b724060873c35493ab4d1763610b0497c75a7e4bf77d142593ee66ed6ec4655c073b8a114b4b7ce1c708290c7dbffbfc9965fca37869b916c412f0b1333f08b556da4bcd550647f3a04b45af863591c207ec7924700b6a95db1b5846e28aca22937073550ef401c5df8c255a3a52816c9d6ecd2389b2fa957abcf4ff4a3ea741f15596153b9e8da46b6e0d688ecb525cdaf99ca96eaddbf98a1dd5d8df749124b1b251849c91ebc5bf815338b053117df3a4e73a0995ebb068f074413345978428e65a9eed6137e913aaaade981be44344009e8cd4b314de6a06b13f3360385a28173b0fe7deb08e792f498b933d83b2391fb51e151aa939199948a217fc7ca2bc2afa0725b4aef23dab625ac548965e8d272679144a7cdb0cefeb4a7e55fc9b0b99e9c77f8fe29854891554cc92c240ee56c1d4171a35f0278f0680ce2fcb91b6d0add05c1ed61ca4049cce4aadc81f11aae6c27f0578d2c0ac1dab8098","title":"1054. 距离相等的条形码","link":"https://leetcode-cn.com/problems/distant-barcodes/","question_id":1140},"91":{"day":91,"pres":null,"tags":["跳表"],"whys":null,"difficulty":"- 困难","description":"不使用任何库函数,设计一个跳表。\n\n跳表是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树,其功能与性能相当,并且跳表的代码长度相较下更短,其设计思想与链表相似。\n\n例如,一个跳表包含 [30, 40, 50, 60, 70, 90],然后增加 80、45 到跳表中,以下图的方式操作:\n\nArtyom Kalinin [CC BY-SA 3.0], via Wikimedia Commons\n\n跳表中有很多层,每一层是一个短的链表。在第一层的作用下,增加、删除和搜索操作的时间复杂度不超过 O(n)。跳表的每一个操作的平均时间复杂度是 O(log(n)),空间复杂度是 O(n)。\n\n在本题中,你的设计应该要包含这些函数:\n\nbool search(int target) : 返回 target 是否存在于跳表中。\nvoid add(int num): 插入一个元素到跳表。\nbool erase(int num): 在跳表中删除一个值,如果 num 不存在,直接返回 false. 如果存在多个 num ,删除其中任意一个即可。\n了解更多 : https://en.wikipedia.org/wiki/Skip_list\n\n注意,跳表中可能存在多个相同的值,你的代码需要处理这种情况。\n\n样例:\n\n```\nSkiplist skiplist = new Skiplist();\n\nskiplist.add(1);\nskiplist.add(2);\nskiplist.add(3);\nskiplist.search(0); // 返回 false\nskiplist.add(4);\nskiplist.search(1); // 返回 true\nskiplist.erase(0); // 返回 false,0 不在跳表中\nskiplist.erase(1); // 返回 true\nskiplist.search(1); // 返回 false,1 已被擦除\n约束条件:\n\n0 <= num, target <= 20000\n最多调用 50000 次 search, add, 以及 erase操作。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d842c3d4da25c067868220c57680898ed435087b8217750843294112d894dafe10c10fbe95567cac4128fd47ec11254003bdb501c0f8dfb1821537bd5b8f4619055114ec311e855a0100f267c7cdfde268f885e1ec8d0b9d0ac2210003a8432c7c9d92099833da7344b946ed77e1c398fed355e1a3e5aeac7198b5fadbb544d0ab750caa9fb08a73f2da198abb1f0b0b08f67e4f32f5e4a2e81981a656646f2e647ad8da9a93757a26a39bd0a7b0a841aba400991634073a3f913b4e3af36b446b696bf486c8bab234ce399f445566421cb1f25bb6277f88d7464350812c6c2a2200031a7ebd1b50785dc8e876db949f9db96d138a32c2f4e5b63d15963f3dbb137ff1cb24686c0c41f9888578d5106f68c7995eefb2cce744f4bde6d22b5ac7207d2bb529bcd53a49b7aeecc101d5db69b0f20525e90ae77d40d2fcf0420221c3205211010a27883a4645f74fd82e4ff7590a878c34a58512f534d81951283a00de31e2f56584cc03cbce2dd1613e5083c0a4fbba56404a24562b25716d8493692fe851deaba2143cb30267006b79840407e31a010d6cb19189adbd15beda9d3ccab75c20b790b2ad75c0ecc98e976a4a3b024c40b5ff659502e186f7452e72af0bb819ed0f469fd9b763d239d54bc2d135ac6ca43ceaf81102842758ecdc1b87ee5df64d6f048956d98be5b919d49450672c724f750cc5f90d5f0947d36c29ffb904d54bd330384b5bdbce0c623d5f15778ee81ae3e4a6cc6a5d6e7217e2f671d5bdc3bc6c92f7f1627ab7913e2a08563335b1a6ef2a9a8c8e75dfff4fe31ce48858129f42ebf1640fba24c53eadf7e46b2b7cc9472373867c4dfed8c6dd4d1fdcaedebd4293cd22c00332c7c461303e1911fd4a8ad276a478e20deaf8d617f59dd05ff4afc16bf4bf8792c5c9006dab0139781e73c5e1126ddbe8aa430ebba7097517c6a00cb7b965b4db6433aea1ed5ceb27bdb7667f3b326ab6d7641f8a73809c30934d19c4d758df516ce9847964b68593ae79e513964612ac4468ade9b4fa000475121f4b205faa61c9a2e6b17f6a50af121986fb6941cf8367fcdcbd4b732c67848adb5eff86468c61838ee241803168c12dd7dc148eb5df95c4486dbc53b145ff5bc98a50a0916272e552166532fbca7f9794735f2d8d65df4314e2e5752f3a231ad263a8e2bb31ec16c276b0d2f87d51b941adc948aa114a9ffefbb200da0b96cc975e645da4879c410db9f48a40475de800f93a1df292916c182c9f3781b1de7b3e3fa7f207e78032ebb2772ea5ae34f82192fb4a8369a80ea4bf71c3d80de82eeb5b425b7fa6e2ed778a92b2be3c11b5b54bcb8d2c5afec86bbe10312e1fdc7b5d45fad4518f532a8caf89452a8bcf18daf5b3689a57299b512adabb00c1f0897ab2f38e378fee37f6d1a04d8f92b66b90aab5be23fa23bb7b29f801391ad325f099626e5ed5595c43290956685b7ecc437518df01f124c3fd992b8c3f295cd47e94f656238e2824afdd084955e47ca5c928617720bda4fd298dae374822769fb6f0ecdc4d111d1b0fbf028949f2c5b1a0aff8954cc2876d2476e484cd8b368b2c5a9b8761346f42ae48bacd2d52054655853a9888c477312cb55db20b9ae9bbe0467bb761bb4670341677f1d5c89d877a2a6ba1d01cdfc6f6fc3a9d77f1f1f2673af85f221a6c3362cf99440d9175d147cf31bef489ce973cf56b737aa6b0217689761fe2ad4aeb2521aba37fd51390560b28c5c6b9731c135ef899fbe08642fd46f6932b119bf82e26f79a984695e89fd36ae9bcdc828ba471d22051fb3819cef66818cb8c0cfe6e1f920d8af6bc33edfd3e2cd6e0230e9d6e5f9de47646ea099fb644a68ed768023f6dda8176cafaac6e5986ea6f4e26ada30b951dc3fac1678c2a588a2a98a5877c659a6ba856fb5ceb948aee35148a617b24f0bf95b36d559fc9ffd176bae347edfbccea68c2adb59a2338617a49c3455b681d6d4d7244b8ee415cb43e24ca6b2c044b5a3ea611466d865794ffe5e0703a34f6c85749960228a1c3421b29d1db0d5bea63eba717dd9db25c446840ea692ad0b8c8258761c694d13c6c6dc7b1e217e72f284fcc5450d99e3529a2934167c88ebcfb169ac89013d4ed521cc923b473afc9fa2539d24a658a5efff19e09f7e882e579ee77778ca47cf8819f25c7db098b056346c3aa343fb1c47c6b0a871c690c3e0fcfca5cded28ad1d1937aa1f9a47e575d13577655c663145a8f3e2071dc4b2ae42d0cd04faac1ffeaabb757970158b7896656bcf0027983a28a8240ab695ec535452283349a9f54176498893600e5311ad5f9924c1f1cf36562cde677e9b6e55204f86779677a1e33c913ad861e27fff7604895d683ca0bdbe24cd22b1e8b381728be7366bd8d2f1ed46fc3a191b08dc2528ad9d7e7b9887ed950f857dc49a374c3b7f39a01d9d5feddd5fbd9fcc991680fd1e958eafcdf62ffb01f6bb247b2af8cab906f187ecfe6fd248ae2e422f31f31286759e5916b0f54d2ebf55e0b4ef2c195fcc0432e8070f004cec48b8246cffcbe90dce83fbecf7bf218ddb5120e0d7e80451d571dd039e10f48539b4fd78af4691363d1c380f0a91f18cf921e2275d26c5107f5298eee03759c165b00a6f9476fb92ff14f47f87ef5bf7f0f4e1c4fdaafe20fefad1f26f2a89790c6038544cfa75632f1a2c66a98485685d162daa5c7d104efa0b24c4775b1cbabdeb5d80ae300402f5a3ed29fed0503c6cd49029d5925368df02c782fbc6bdd1803959772aed23bca7504b5cdcdad4c80d4118860c5b56dbf164567f488d16e6ca15361a4d1d1140bd86b1416fefd0e97b2acc768378d8ff0e82cea0f4012f000112b1176cff26ce4eed1deb06b73aa6a9e7cc8150131c7878e4459f2b1de635709db6acb64bbe4b6d926de22c10c17e5a80f70821500d8fcdd66c7a8ac6b054e74e300345103bc3e1eb8798fc482b400335ffa246d0708cd917396a25d3f67f7f5d6d5a6033484c27a0008c2ffb6cc91259d1e68f533f6a0e0c0446b23a05edd2fbb9602fe40b8cf26ce033c07a9503ac78c7b6c07bda907b451683120a0351f6b3a957d952d85947b871a217c37a2dd14815f5615a50366d715e7f1069b90f1f941c460c575b9455a6356d62da400645adff2eaf979ad601b1ab30d9b4583b535bbb4e852e0ac51295682b593de02058fd6d1630e9e5434e93528939238df9f09bd1c0639a1004423528ca5d09a994f9ee9250de641a5c62742b909303448c6a7142eef2428b7a52019f0750a09ed8a7da29a259843317b5e002d530556b5791746d09721789ffa766fc80292b4f5d0a2b2ee24ca3d913a3f67d0e68b2c7c754993bc2c24d1d012dd090da8372dd8836e75b1d453ffc09c7e7e4b49f9565fd876e1031e421010759f8cb4ffa571114e682938de24516d8aa9a3dc842ddc10c64cd64f11a543ea20054f2e7bad02ce72401e9ab87beee48a58a2a965cacea2ebc250321edb9b5ab7da44a63162e100b2d215a8ef96715ddb644cad9c23e3ea50d52034c60edaa4079c7b40eb3c9209fb04e258cbd24ccd348616d364ad3aed35c57bd73cfb6835c65ca299c312c8d942e3d1d7b14011b377e7453e06a6370687e5f515f496d4f96187fee3ae78db86a88968e9d06799c25f3c82794e0d189832fd5bda23b10743abadcf81d279c28b10972d4aeda76b78d9a0c9453e56619d64d44d0a44f6f4ba77d4193520503ddc62328fa7b08590ce13d91367ec0155f5094400fca94ebc3bbe5edd3ee5ddc13f90e5b67118078ba52cc2b0e3a34089fd8ed2c0bd5ef4471325ae74ece7e2db7653c55a4b610a9f981d6a591a08db762fb560f1de26e47b0c22412c3e98aedc6d784fe4c86684840891329b58dbff5eec0aeeec33d56502ac31238486d079bf03659e59ccda602bf1ae92047c047ac2a119f6833f4dd5673e5898efd2feaa57740cf5c57e6a9caa1c75a0c14b31dddde98c13766f8268b5ac3a617fbd6d6b78f7e37ef333bad7146e6cf966fb9d9242cd15d9a8bc6a423aa968d847bc8fc665d5868fc6da177d62193abf932256f26869b1e13817bb34a13021432007b7a9fbfdc9ff39bb8d3b42968f86c5ab58f57d909713d84d72fdabf2d3c815bdeb97df84f1d97d6b5ad83f0cf5b7665659a3030b4168302b63e75a67952efa3211975d8aad6d5f1de9323d89bca97df5da6e96998036945445260a3bbd89de453a33ec1a555f57046d33504fa889de62a956ec8dd344f473149e5634ae7b8ebf7b35097801d42ec321930c4b0c737c67c8e3b814edb02fff2395d975223c8cef345f16c89817b0d30541958de894c83b88f8ba0a7d8cbee4b2654875fd178b5dee1749a4910bbfed5053cc22a444ca3497a222d50364c5f3e1ec0c3a3aac64766f89224ad5378d9a05a95967d75f4f6b6809899b64e32b0d1ea7e0c356795a4e86368535a927fc6c39963f94f2eea44e2bf2a376857a837a2adb277b0a34be3becbe8b3ef5ea7349b7f8853d405d33f81aa91f1bc675aa9b3cd1a8fae9ac57496e6dd1d2c180ec35fe34ba1c4eec13902d8c0f9ecb578004db323447ad92b957158348e8abab9f18db77043ce0c106f8042b5ce57638fd7feba2a9fe357ccb74dc0ef6738d6c7182c8467e9ac30ac56b6d6c4fd9d744a7266c1e772c6aa5c7cd48f47e627a54d4f112677ecccf41d78c0f5db117cb61ccfb5ebc4118bd57cd172ad1dbe29d7b52ad6086bc6f667b3982567a1778e1a67b72febc11710c3f4a830e4b6f647c0d84169071319b72a65a760f145e626623ba1416f7b1c03b9459998c0f87d702ef6a3260748fbb91cfb49ed93b0f08cee4f7fb2eeb4274aebf3aea8d36912b75d344bea2d761d572410e25d36ae25e2e47b2cf5f8ddd4c6d4a9bf0e03bdac96ad4e77ce9328c7c90e832f043f54dc4e57e9d64186d8126c78a19e9b1c3a008f016dc994223dc66f016536642e0932537e91d62bbde0695798041185d3c38797fd08c1d1701f757cc660430fe702aea2c5c6668d57dc4c0bc030baaf22a788f61bcbecd00c671d27d62f7c3d547d210a50b6315aa230d6166f0d5fa9e8df950a5d776e36cf11234a9ed200f59ff6735ca3ae37e4d1e982b49ce19f81c4037c16bb30588a65028c338a8a2dccda11701800bdb4dfcc86c611042dd5a0eff52a72ded77e01ba0e433cc3d74dfb72bf17668a9e9256fc442e75850b82c060f814f49b7d72afbbeaa7f59cfd177b14e82681cbdfc5433c16bca0063fd53ebef8bea08c8f96bad898aae7d4fbd45fa1136d8856ec9c4239c6c3ef278f7d01302762ab60185cedfbbf548955affc18a69a2d0876ef183f65b011cbe3f5ebab0a8c9c4f37d6c75880cb3f0b58e7ebdb254d646e6c588fe23a5ed0534daf4c30f7aeb43cf60ec555b37a3f83fddd1f307917ef77180ee63ea599a3c178b373450c02813bf08b9c5eaabbf8669999ffb20160ca41bee9ab34087745490629d7c6b8ceb22fd6027ffcc0f1c108babda6a64c54a20ebb460cc2c9847a3191010b09a4749041c1ff908690b10636f4547d526f0bb68f98aa6c29f3a023a0d73413fc3b623798ab0d88a10c77514503d91c6e8b3148a217b5d508c257b635cc3f968598025c18735d641f842a87a82761aa1f1d6bef5b6e727c821eab97d18fe6af54c3be58817ff0de183e66bbc4f5ce43571c71548e01b786c80a4e4345264211eb9c1012c8da49a18da30c68388e5c423aa7f83dc4dcd34e4660ae77fc37df1ff7d41364db97b0de1e29cac6d1f2d45155a0cdabdf3cdf3e7056a9ef3fd6dba78b45b217670bb0c90c10326442bff08a921fc841d4f86ba66f281a2790fa92d0715a4365523a6e0c8dbb3a8f1135c45810c1272a74e205156d11f35b0bf1feb3c56b190a0a4b68142c4040cac334e2e5bf771a4c99c22c814e02542fc0dfe8be8900800cd7f1911196471d7dc71e3d096dae4cd15e861607835f029c47c7da00327b922d48a109c30fc58a30ae8f65b233c06d2ed801e2771625393c2c352fb91ca630a11f832a767239d76d38991e448c11969eaa776e4da7d591e083e24bfb6db0c0ea44c159d769ec76216079e8bc9d888274ef348e9a5d8d465eadb41c940bc4eca515271235b8427a5d61baeb349a0b15b32e3c4da67ea2de095821a2838ce1ab7b38b5da3af93f959ade6126b380fd324738b7e79aae76f4bfb41c1cca7b14674845bf2737caab5ea84587419b08ad54a4744ca6533195d2acb8fc84fd1fb0800b93f97be503ab4159a1c6049146ef841fdd7dde25c6a3b858fcc81f97818ea76c420d66a1267064f5d1e5cc9179f71804fa1db1727b7a70b77f23077307cf3d6ed0a4a6c8a6cd74089cba8d6380d1b96f620aa43c9731551c59cf500f4532a49f5c743b7df7bebddd6bb2e6697bb750c205f1e44d7a5abb119f1fca0943c1224ecbd404b23581cb07b7536c354a2e95c61b1003a3cec4368d29780075a144909ad95c1f7940e5289427a277dce0b49529f9b1ec7b14fa5adb48fc5511b4fdb479264a76dfa64e51c5a6be8a2ef39bb9da37cdbe9e27c224c2f918d4829deb9ff5fe2a70b8034037f2a7b6103389e0f1358610636000dbc27cd6709eed6165ac47fff8dcdd0ff510422ab8f9b1b711964d3dbb3c762fafdefad1cfe32216770596cc8724351ed450b7817a82afdf0c9a8c448f2edb76a71757802dd964d2b82db117b7cb68c77ea148dc8bf5ffe9e90ec26c36c8a9f66522b903edac7ba5c85ee35993b1581e46a466eb3150c3dbbf648c9e60928a6384d6ddd9a9fa76d95f866dff4d4d9a7b47dfbd3d3503f8cdc2cbaff63fe5cce698e374a8a267421f6fbbbc308aafb005f28edce3861c4f04bd84adf012b779c53650612077464b332f247d40e6e8de4817b5ed512adc67b1b525c7c76c93ceed8975c2a01104825510edd3fa5424d96a0e8f2f1fc3125dae2b33a7153acf86d28eecbe741118edc8968ae8e524f186ee1fbedb7dd70d6d2617e49e5faaff72a9c234b1e2153e4e057cf79501b7b3f6d8c20dd0cc132cee91465fda1f56fb29df25bec4310d72f788f00f7ddcbad8ae80b14a08b2554b929f34a69150bb528adf06bb65d323ae1c526d98e1861cf98ec0e8d3dad57fc7eca2a27390cfb5d41e89b1202a6fee96cf410d41b9c6c53234695dfdd109263361f90496e0c5802f726f333085cf37926b07ce689764e19a62bfcf9e6d998a83cbe6b67b459aaf7ca91e2d201e18f72a52cb1140b6c287915f819e9c397dbc3a42bad9e6d86e8386ad5d7969640c5c3850923e3720114e5b166d664ec9b9a3b2b91cfb1b5aad761b4a9ad0fc807d574d9aa874910db9ba7aa1c6732076f5155f248a1c985ce4507e63bf40930d5077b6c83e0f2feab4b0cf22f7472faf6f02ad23cc02556093d5527388e4f3bae936a7c0a0a5c78c8ea7696106e00c0cb62b046e65658b951917ca96a8dee6edcc734f6e46ec0b997c79cfe241839e0df2d63fd46a8d32b1ad8906fc3fed6aa3cdaf095d305966766f732d0d7bc13f1de2e2633d7d9ef20a2b0cca010e1af7a655b8459b7ce98c4048ac02d93936b11f8b165a43d1e26a35c33ef02c66d8c82bf7ac9ee0e8ca6b8cbf09baf6ac2c671d811c25bca69a34e97cf78e1f3dd6f1683242b3c4ac5e215c89fd01e69df22d0139a2700526407b975375066245ac588cb028656a079d52e34300547604b150f65d397843ef0e51504a9a1e350d3a3d488646bdc44cb743150cd0b0fc474d237b234ce4cbdaa79df8766e45adbff966b367a7644762dc656f80748fa91a640e04d2fffba43d5ac738aaf76933f5ba7ab7d5bb0f2088c9828f5b11e6e496e5f3616ad2556d6aa9a8e8b3473ad23e683ee362b0f8ec6d661b49a59f85fcc17ed060c5141ee00fedbf109e533ce963b30539791df7bfc305e902ee81d1753a985f486367e3785dedceb14611c787ada87e4021caa9a182324c73554fdac707904f8a826dbda8f212a8d402d37bb527fe8dd07afa8eaa8ded0daa0ae9087d864a80130e0ad01cc3476167ccf7de9264b064573c0a95acdf76e930aa9efd06520baba9ff8d84b805e1e3ffd8e3962d2db83ea78b3576b9140e50dcb34974f10edcbac170c54ee7a5059a469f1c038a0f2a721a9517698cdf65f0d735ddc173e5f197e3b2b513c75e20a129dbdf12c3cbb9ea4bca70244c1f3573aa59aa9573d702e35358c803117b7267c7dbe4a8fafba3d161f702774b0c90601a608c057d4c68da969e557b5eb5964f6a12766ee731ab40d13f6df0d1fe2683c5e42d8d1411b86e1b9902e4e624f6e468db31e614f1d38dd61eda9333b63951abe7585012dd49a1a4713cd882cab32a8f3e37b0a38b6149e85f1cd94dc2dd46895f795831472c19d886f28dc2a5bf1574522fd148004330ea10961fd87ef7b51cd80fef698e71cea98966dbcf4f24bebbf9e120782ff4ee335e3280e13e4c2ee2adcce77ecfc62194fb194f9693a68083f8b07771ba74da3796205ada48490618453ba1d90a4fcbad8ae78c26b5114e1e240a3f4ffb7d1964716c0038626d8c7678d465dd9a66deba2b92a5e41d7314bb8b0d7e34ae286baea1528b9c9faf9c47e72e3275aa44c67757515588f4d49b95156e0a63ab88ab044b7013ffc76a6ffd363f98606f39a8e8c2c6aedd7bacc56e92897468db35d2987ac7e62043963926cf9bf0ab27a0cd8e8354897b7e76600244bb5a5c81e16e17be1e4b2322fa0d7b1b541b9b1f2b9f5404cfd61ac2c959a8df2dd2d12273eb65e9bfa724f54aa67e6eb1fe69ed10bf9a9a7a325b4254cc95629e6098db54278c2da52c34ba959097f2252e824dc48e1a77752a1515599d1961e516ebacf020acd776b6c8d9917927e91608e638ffd6a44977ec2ddb5ad8c614dc0463880dcc2e1380249df8c89f3e5da9bf42ac8c1f521b9fb5a7c399d0c1a7ee9a8bc8da0721c02e158246ca8a60a2d8e91323d43711ab2d2a8420093d9bc4db465eaec0073373d84f5cf96c04846ed15d76aa04d5aad88b2fc97cabe5710a25ef108e55382a8672f6af6cfae8c9535c3fa2aea0d109f8a90abd7773b6f0149435943ad794385872211b1c3e6608e8f02c58f6da16cb6ebe8b29a0615e001e1b4ebb07c6758f96ae7550545affc19755f065d0f5aa978377cac0b433b5bc073e0d957c0d4f75612311d7547ee281cbffec8cf1f49af0ebce7e432ba535803ff23a161181e371694e9db10c566164c6972664b7ba22b58943aa7993f961d5b0554cf9f060c67bf7b11d354048f6ce284a0d4537609536f8394aef4eb7dff667c40b173b826d329c4fde7e60cf5d96cea3dbabf7b0328b77eeb12c8144da9178ba4156b88249ac006cb257ae9230bbe02a21070e648fab47e613430acd28255a6b2b6e759ed0cf8239e9e3158c4a02b7fba2819f518d32c6767d3324378fcd2573c51862d0296172dcb52c970c4fe3d8683340100439636901c62d762a82644f1544cc4b5d626a0a1d1902eabda603c140fde7cf34e17196350e9e5bb4ae72cee3981850f10aceb6831b6e384390da07fc519c1fc0d77f060b22ceb509222e77f2c91976e838d440ae06d47532a9db32b611b430e99690e9202d2997c6ea4060b0071d087e2e87b00d85e308ecf6d0eecb7b716583861193b7f0c9e5c445b3ff69a0844e1a8e41c453a814b4e2086234650e07b16cb5d1d3f57eb2e1ec1cdc60e411988ee03728a56c8e5390c9cb8e5ef8e489f5e502b52f66bd3c180887fb8f6d3443e62335badef99fe6f6986424cf15eb80a97c285e84820996fdff50313bb5a15ce6b55637abfd11a5977f4ade6254fb81d11eda485eeb7568c08b83d24b64d206583439c625acb283bfeddae1998e86fac1d875c0cff691dbb11fb583853e331b289e6668e7861f08a4751b059db3d8845f67faea36e0aaf8b5ca3a53be798c29899a2a7642ba45ddb2ad39a01d871cda737d712726e05955170ea68bc3996ba5708f05a1002f7e080fa48bf61b8cdbc11a97ffb488c65592e1107acbdc454022a13f34edb65f04c768d73bb2e125fdaa7779aa1caea4e8f4e27a8eab393ba5aa4df584153c6e9061fa1288ab85b79ee0685392535b61d297b903b614d29e3fd804fa13068be8ced92c7d3dd3387de2c6281a96aa401c82a2fe9a3e2be622fcab844c06f93cce9203b38ffe6b940d90ae6534fb35bbff4e5466a6ca679d6517ecfb78fd0157d9e01f6cced0a1f69004ebf7141ffa6de5a79d53b99867b5a952e7fd5fe9cea5aec9c21e481aaa02cb65fd37fe3194c32f2610662b4547fadab35f21e722366e011406d222205edbc676bb89dfd8a0051420f253a2e9240261e887dc573cfd842a0b0f25a49571b27411b0f5b7fe7caac1534117b296d2c4e8465d55e258b51c601063157f875022d3b5a1011b4f3366e430c52336cdb7f6d3c502850ab548abead7c65b1cfe403adaeb7b9452442e3ad2cf023b6589c23ef0df518bcf293e116232ace172bf500970328fe436b152bd63e47b72e74325ff3b8406fb94f2ed20a749e5c5511e5672d20f87e176e67e2e7b73b844a78a070b310478ccba93f62d496c10389b2f19f92a74ff40eb0a3f45bfd1aee81cc9ad2dd197c758279731731756f4d332fbf7afaab6c5fd95e0526de8d9a8228eb6bc23010f0780266293a9d8230612e2f0be5e7669aeb404f00623eca9e4f3c1b290647905722f169af173b4244584c6363236b3736fa792ef21d25de141e72ecc7e2db4ce233b40b8a6c6f220c9b6dd1ff128a63f5c3a8497e38060e0a5a3bb06d39e46b1165ba12460a15d9bc2f600fb8412824154c4f62bff2215622653647d03e0912b51085718af97b0eaf7b092d3c84503d6514c9647169d27f3925e191b1b3fdd10256be8973716e9626c6c866c97e9ff6fe4b5d3815461b705c26d6f4c0f985c016778b5f0cd9bb0dd445883b6bf27b05abcc700b9357ccb8858d86c565f26d92a0ea971c92193beab0fcb494e0b6b151c1d1aa6fe2da46df26c02a35c70e641af2479d04dfb0a62e86bdf029db6df59f6f8f12abd16b8b430f51f8afad6d6eded2e60b78842364661ddfd0117e7ff14acbd6910572c39643d59c80f72c3cafe95360cecc64b608109695f714e306349006436b4be97cdf6215a15cee65f312efca9907c84259d21d3e4abe4e1e0f6119ecdc5bdd4e67e844220b608de7bfee2c17ada59fc8e73182c4029ef0bb0f195c7f5d5245ee74363afdaefcff87b78c71aaa75049afc9e5dcbee5b3bd38efaa109d0294a175a2099ac7a60aca59d4fa53edcffc101128e2cf72d75fbc108cd49eb67d7bd20aa9827131ab7a91c55a742066b05b5e5786f77e1d7c4db67899633a64153f4358a18dda214e0333a1aa00ddc6831b9790c027db7421d15e92cdd6d3fdd72629dda8e34af6d8b57531d57743cd59fa016a62a1141d24ece3122de6548c363a811ec96b0dd39f166844c2a7140691422ecb140d10b0b6645c33f58d85a9121b7914d4c2d9df4f5da36dcefd78e10275cecae24983bf0c25030646881d5290ee1fa2aa2bdd742e844448913aac4bb1bcf29e6933f37b7ddb8c38d8a8f7c7106367fb377449498bf5e35857f2ff0b1f95ea05751b5db1cbf03be4fa90ca2911faa73abcbfefe224063b84becd0fb40cec8c7131521ca7a499b2a073d6558ec695b61c268734895e1176e5192a546a3e0fbded21bd37b24a8655197d6617232c19be3545ed6769e0c0eec35fde58d82ed680066de85ba6fc4e1c8bdb78112e8af71cd620e6e08616520332165d1ebf58b7029b4ca0a0597efa83c01d1182f1b097cab7ee53e9a1ea2991d12c7905d345f786d940518c9a87575e2fab8f3d9792157008467d23f2f683b62ab87ab180773c3751676b1318e0a14918315a1fbf1d6c28e9eaa5673d171ffdcee47419c775742c8467c9b5e15df6925efe78a2cd70a637cd1ed08aaa579219033d64a72d08d2613bf1b4387af6ab3674723ac00a90c8739d1d6a8112f620310c11245278a96daa086bdd60c14c24c9c9302b10ff0d72c339ed03c6cc1a3db734192ae92d93a73cab673151a6e8a58e0c2e6bca2a57f08f6045499d71edfcdece110f1f659acd27fe9c9b10e817e394541103172f17f5930dde6fe6c14c44fc562f48d1a3a5ee80330f2581bc320543088c495e046ccd8deff36f60869b05eb822070387bba1f446e7824dcdd235ddc173e92cc4e6b739d69b35ce6b4af12f57c047493dba7fd51c4866d8df5bf330cd3ea6bf835501ee549b3d55f61bd9d9f86999983eeea362c5bd0f2592b01b684da47ea9d76e33962aabec1da619b622be15d8fdc0124c960a947d8c636095464eaa97a35f6c4d66228c4ad9d5f87867864a696887b24252e3e4f89552d870e22a99fffb2a1917c9921359599cedb230e1beb6b5c595f0a933e0ae8209d6302ea08a0e463d0746c2a3cbf451a949272cae9eddfb289385daf6b63aa05d2868068d5790667474836835c0de45eeef5b6ffcd57ee26b292d3606869b815244d1394193a6d864a4c94680fb32f0ef9f6ce82d664422d91082d9d77e7307788f995cee8d375f2952f97e8052ae5af9c74882f46f587baf983acef9e9a0919a913d71e6bd086222e166cc3f2e401190be209a69ed5a0d4115c86abee09d419635dfd1d6b9edaffcaee2b28e73778fc7e7c3542c4b6b8028d43b198185f783596cca6bdfa946705f470523f5d0a9e1db19ced07b8791c767b6110a38e17b4308ad72bd4eb7a701695450c745b386fd2e8aa126c4f5055a587061c3f05dce2a13586b5e2a2d7b6072940d93fcb9d14ab83461097af770d43e833333be774c93f5b43effd88b2d2441775d2262a8051c3701b53a0ed2c5e844aca7e7d511e0e914ed4fbb625387c00765f95138dfebaf95a3542b9f80f74aebf1f49aa04db9ed7f510c4c8b98570b5cd000d88208ca7f60a1fdbcd5df9e8a1538300e3fd9c7148da5b7a1a98a57a904a83f50fec7c6828a4d19c865bbaad5bc4e1a4adead1fdc31c6e45e252f9f74f761103ac52ec8e374c0a8d8bab3a8e65b5e5021ab699ab2093ff00f156209c35b99e7f07b052479bbed9536e1b3fc661a952212efcfc176d36a9f16d1381491b817ce54cdc7fa118c0081059776297ef8fa22c63438f89b93a263e09a7223f2f81306b40901263defe74fe89bfebcaf8e835638856b2ae20a6817f78c6d3b97600d70104ceb98ebbf9c52973acbe1673fcbb3a14b551844ff3bc3d10b6103aaaca3c8a3d55720d58847879eea7dc9f95a17b2f1c1d5238910daee29e5ebcf3d1014b6733cb5cd06b381f274310a5897cd7b01a5b6c0a6ffcddc4b40915786827c9e7790580b0fd6afd8ce50bb4175ed475cc2a07fbd4d0bc2834cf1ccc22a52457237f00302f58bc6516def3e26c0d386445b765059851d4c69298004393061df9eefcbe390b8a4829e8b4b562da24960db46b627fb18b8034780b5b414e21c3a76ab768e2c9150e23550871ff28f89838e55d35c12845b78578c766177377bd0b0ac18376febb21102f9002fa710a00b3ba4fe94798aaa682f24df5a0f27b558b3b4239cb19e36f34c9cae13aaaacdec8095bc36f773eeb32390fe164e5c77dc30f6349f5a9a07f573d4a5a2e44ecfd4d9cd53e1129f1759bd940db13e613ac2d06e240f42861372cbbba7b1ca9128657f5eed432e6ba4ca382a8376d1ed04ed737ace1451aec29679f718d860cb7249d0432fe6ab84f209da088fcc410688b93a738caa778d2496aa5c52ac370c719ab271e6ebe802d05e4678e87fc6b1ed9406b85da6a1e5e130e6c46d3e1f6e7d579206c19c46430b4a2a021c1c0723410791c15f8747b77440cabbc4375ca8e2f95ef2f12e2620e9a8a4d72d99c157958d142bb0eb872d036370c220bd096f5c27d713e165b72a73b3e49425f82e4a1428fff2379d000121402e5c04a75d8ec2ff7839180aab4481cdb31328f79c82d50b48012796dfabcf19b784127a2eacaddbd72bc03c8d283da954d20c42755d1e2d93fb7c5b90ecd8eddcadd97bd61207a871d1f0561060805584dcfa5bd6d0368e75da68f17de8323cf48a8612b33237187e5c5d448e904ec549f5d134ff2133de9f396005677c8b92db0cee862b6acecfe9bc35a7bd17ffb10224db8cc26fb08dd36f058aa4d95b744c8395434fab294eea94670a27e5bc3b5c3d03b4f3d8414d4c3046cbbe85b0c49ec111c6f73cc5c474de55552abedf64ea5ff0d51b8d7e75e821084058b4c9cc48e387473cad5ec80acdd3cb608664617541e899bf350304c5031a5d06de7b9407bcd5ae0a3e15b43ac8cb26a5747e7054528022f18978c83156791415ed9ebc6cfa158ed8fb939f1ee75ea0f7ddf20078dd53c2ce6d58c1d03d5eb61747dd7c90dfdaaad5c42cd3f99af29966c3a70ac839ced3d055ee03e7868ca3a2c0500a285803464e2f15f0ccfca358a9c62da6449b8c46e9312146471a30e44e0eec07d84cbd59427b5df5ac24261fccbab66950e29afad402edf82fdacf8827a0f9dd5128a6c1d425de71374d0f3723257d08bd0eb3b779f04035ca1a2fcfbad191b626aac9d7fd1e6547450f13ce93ee6bd1d493218b36c1526c947b7fb4fc078179330616dbcf0a2b0022f407820bd193a1e8fe30eab2911bf9d080eb282e244ba8ced7a86db72b550c8431ceea5872606513fd2b5c7952cf581c976efb720e6356529f45399922a19320831b3cfeb26eb4be327225f71580961a4c4d5fad23b51fe258f1720f1d2107d2cebd175cd4de6991f9b7d2f62011df3c51fdc10798a5369718aa07bcaeba6ed39a7f47d30fc60bbbf80653394cba51181b35a0154760e9e38613bf8167359a988e1246e29500b90bdabd6807a3c8e0356947501b8cf92a5816d43c976276d83ba5958c6f721884dfd7c513348ad7cea9864e71d015961af78abd7a3af2518d789699e326de3068b777fb655781eaa7294c3faf9a8eaa7f0c04c2533e16ac03784fc520977d355254951300d30cc8fb4a4f9c0d6c08cdc5bed48b5382f16aae97f0c853ee26170f61a13ee77f45f867dfeb483a2c84efa2dfab5dcd00ffec3cb3e89435857d3734b29ec513cce25d46cd017e812ef93a613612f4f2093daccd2ca80eaf1ac27b60e5791b69cbbd877eac8d6fe8b3e2310edf9a889b6e4d4b1b6d42f529dd6a1ad70664c02a7743191d5465217bd0efb8d790a1b050fd9f01be065e09db36b821c0a94b50ada051308420447ea94ef6eeb03233cd8562d7bc469dd093c5dd5958a3ac2480eba1489fbe5a85363f1032a67c2d78130c0cee97b205d6169214f5dc982f9e4646522130d87ff2e29fbc7631655ecc7432f809910df372234296026bb8a064fbd2c1c0368be2547dbc5e4c5b94ce01215d7a61532d59b3594857a9004472382b2d4cfdec14fb808d10ef5096502c398d16a920fb6f89f6f70f660019361cdf5fc3010127aade8cb6b26d87dae8e45d3e3d585224f3292e768c0b26573b30addbad5202e3deae9afdfc464d5fbf14d0e5cd7bf05b245801ccb07dbd216821d64d6881d74ef11a213c988ff547281094463aa53b0e05575d30db829772108728abee8cef10d56bb4471854698eddb27a7e503d4fb6f6619797f39498f4ca3fa78a761b5ed4cb87b11815c90aca6819e4f45aa9d6c5c18b44de1c1c573698dc1ee90235948ce43a6e4a7a4b9c2c6bc6ad15b44bddcf04751fc689b608597af417549d719663c96ed7b70f97e17fe1e05da686ff94bb025a7d2c8d0e0551ffa2cc0ed6ce7f98674d018418a23085fdd6a73a0dff26578aeb564a06d3462187ce8122e1981dbf080df2ee8c7a5ebe7d73f562d594fc7e0f2693f149e094c95dc6b3eb5c384ad3f1e84959bba4c58b9ee4af38481d34fd6d78c08aa2733467e22e193524958f799f74793859c031016fc4a1ab80e8255714be3fc2e52ef887c1e41cfaa5333d881812146faeb520c8a01b1b57ec088334f3329d61793242e9e0ed34cfc69007af9afcc58f3381ab9f6aac2a253df71b7ea97339f5450825751d7f978b5c0f709f57dff86a4e01bfd3ae698578ba8ed21ed43933f9c2c49e62ce6ac5f21a14a400515686ba41ebec70e0eeb0","title":"1206. 设计跳表","link":"https://leetcode-cn.com/problems/design-skiplist/","question_id":1337},"-3":{"title":"预打卡","link":"此处正常应该是链接","description":"让大家熟悉如何打卡","day":0,"tags":["预打卡"]},"-8":{"title":"预打卡","link":"此处正常应该是链接","description":"让大家熟悉如何打卡","day":0,"tags":["预打卡"]}} \ No newline at end of file +{"1":{"day":1,"pres":["数组的遍历"],"tags":["数组"],"whys":null,"difficulty":"- 简单","description":"```\n对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。\n\n给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。\n\n \n\n示例 1:\n\n输入:A = [1,2,0,0], K = 34\n输出:[1,2,3,4]\n解释:1200 + 34 = 1234\n示例 2:\n\n输入:A = [2,7,4], K = 181\n输出:[4,5,5]\n解释:274 + 181 = 455\n示例 3:\n\n输入:A = [2,1,5], K = 806\n输出:[1,0,2,1]\n解释:215 + 806 = 1021\n示例 4:\n\n输入:A = [9,9,9,9,9,9,9,9,9,9], K = 1\n输出:[1,0,0,0,0,0,0,0,0,0,0]\n解释:9999999999 + 1 = 10000000000\n \n\n提示:\n\n1 <= A.length <= 10000\n0 <= A[i] <= 9\n0 <= K <= 10000\n如果 A.length > 1,那么 A[0] != 0\n\n```","content":"0961e884611df7d4ac47a79a9e3b6f257d8e3d84c28815f2546a3c7d65595a035782802456dafc2c2809827bef3c5c1bd14d07d3813a048bf263f62bb5fefe2ef43b2766959ac2fc046cd2b7869f517a3af7328790a5418a3bf424dcf5a2b5c05f2ddd042cba9d63203f137aadd4daf214bc076a7bcf1605f7075b0c830f9d54a739a8fcf3c94e787ba7408641de15b5555d00b17a292354cdd22c78eca5f0154c772b2568cfe02b4566c12f06df1c5f22abe7fb7a3704619e1ce97a49f53d2a5aad76fd4769cb7def9d730d8e66087aa517c2675b22ac8c09619ac733347e81a3415b9a53673ea5826c39bee7c9ee9d175fdb410921ab88476e916b6c234dd0ce03d5a3ebea6aca3677334b31191d33feb3e4209867a62e65b9804597e90b8b0466f0ee0998a3a21ca93c690c966349e9911b59ede30085b21480f11ed748ff424ce0fb1e6d3b75d8d16f958cda02d2c0a089feca80a011af4a8ca6605d49fc84caf177a6b378c756526703556b829604bf8b341fdd92f78fee6feae7fcb76c1ca251196530baf51721f42f77d109389c320efe9abf4f9fa992d34fe591fbcc2951477a72dd0a6688f27a52b8bcab7fa7f4f7bbd861b57175a797720d71c2e19445fefc8c4f9f291da2552f69c2382d639c7ad8d2ffb98085658fe6714c6b64d710753759e7ed42fb9e8f3e1342728acfe68f75dbde8a64b90e04d398854c9a9f4e80b22b931043b28a40e5b0e8d71139bc665544feb164be994f1e29680156e01e536052390b2f33527dcc9ee0ec256490ee9b8147bb025cda907205ed003f48140ac92e491e6efea2bdcbff5df4e4e323ca4ca346b47e97ee21ec2ec9462c705b735abfb7c391bdb392c56463f9e27f1d6e611607741cc3b40bb49ce4a1fa4a1635e0ae2ede8f899bc4ef5d9a52173b063e69b966c839af301776c6187508d85186b065d6d9bb673d98a23c19770f5281789f4c7b45ac8e05b23388cb6bf92ca3489cf8e533833b72edf06b8d222512ca9de6b4985f069cff4f37d7f3c41a0aff5fddde8dd66f994a166b492fcf4290091bf866b3c88da94276807070b305f8fb74bb8c50a70b10b8d9aa636e9470dff4d58a17cc75500b0f563c82cd0db5bc33b0aac0932cce53da08fb678755e4fc225b67828d9a563a968b050b253f277a36d9df9f6b114db3e0af2b6352946090989fe59b7928e548a13a9f0db226cca3d4d95a3f5d6ca0459456451229d8134a29298fd82809b841ef30e6679cf45235e111a7fb3800a4a353ebabacb497c24533124ebbd0cb243b1c21374f6a294c78a3796bf3bf6fe3598db51c64eb22045b904aa7d20a58584b3adf4aa3a967fc67ca9311c49acf7f2166c9d8ea60392d0c690a93c761247d00d34d9f4434f733abd6d29bb61b2a2d4802e3f3290490464c961d3a76a8820798a5253edf78feac30e5d8a44e11df1ed041a0126aeb05a87b7ef2ef4a986b9dcf0692360a7ce89690b66b7fe44c39edc33d5cb2d0f0b5f9faa3afec9ec7f99d6e85074c0b65c1e7c075f9d1dad1a377d5414d35118008ed5a732b2ef3022754c86f0af2c5ee2bd395f4fd128e9119681620d78e5ff3246ff7414862a33f54ef71702465824043ea75a4df693600a9c5df185989ac8d726313eb6ed63a8cad8bb10541867b22a76a1973656525549bd47788b2bb0a15022e96e76efe4fb9da8f9ea713ca8719cdad147eb190008c0a2c4d688ebb0b23fa72a9789fd302c12f046c17be1f9b2b94fcb92e66adbdf715a8d3ceb98d5e6aa21ccd24fb85b19008610fd87a73339b01b486ee6d72ab87606284cd02a9a6c2275e8c294b3c416ca4d0ddcf1b31307b2839b8bbaafd4c06e627924139344182cfb03b142c362dc9cc952a72104113e73cbc3bf51949729d83c58f8b8bb807dfe5813ee165d961916b929bfe2c781258fbd37d079c5eeae2ac1aedff334aa7d794930a18975006d86b3dd353ff99c21449aa3561f8bcfea18a0ad754890143d04109d6aa7e036f5011dbdf7441db6dbd0bc6079bea4790a7e74b31bb50d61325b374b1cc4ed8906aef52dbb55cf84e47f8cd4974533d2ffb4c5b245a1df84087779c1a14708d071e8f853c7c5008dd868ef0c6850c0b99a2afe44d0b94802bbe7e211a77ceeac6c90cbb87524728dc32d8cc230325e181bd44a666e000e7fe9c09f8d07e9e6f7692e32a3c8a13819233fd537d784341d58f937ea176f82e50bea2ba5ed98ec7bbfbb7a8cfa520d80e0271b007876ce072d61c7536723d634faeaffa0e0bdab2c2048c99b72c568e380e91212b2550a12bdd2c78c21b26953470fa7573f39dfc5a4f5228330fe9a841f7d67518dbe21219ab56c22d4b236b475fe84bcaaa2be690a6d04efb0fba234416c2719131ae36ac220acc0f4814acc8a32d9563e3baea8e608b27ea9e4f3b16ed19ae0e2778269767788ad4282f87c4a1d458c624dc873e5f783e6bfd4b9d9c7208e14f5cccd457a7ae5e5a0313d5f6e563932f2985bd997e030082db407678a96f9c689cccf6aa7418865f8e590aadf5037b9059fde0d503741a98042ef5071d105ffc9d144016e1b2a8128edafba3869da15d45edf86f6fe834791dbd238651fe7315953c059c6bc0f46a1140512ba01127696dd482575040586a3346ff42027778eb52b3727ee9bc5b44379e7b4cb432ca77346c7b02452536ed21600d2aa6b531f5d19eafa8db35e8bbc0b58eae0927fea0d3d3a17ab9451803b5567893623d59f9e9be0fc5a1714054b4edcc6ca7dd3b2221d886724307ff6d178c6e365c61753c3efdc1f3ee75a97a34d88df8735e3703753209870383f94525d5d3b9eb1ede774bddf4fcd1c9cbc8056b75d2cf4a6223fcf7579b4a9e6f64de0b344121b7a986cefd36dfb637d77b845e9721ab08f32f3a7e7e48dafee8e2ca3fc54fd28c31dafb327e4354b239998415ef630602cf7ec94a2f9ac79cd96c2145d0e30c3850e61fb9a7f1bd86c1207609000a228eb9acc2e1276dd655d84a2be2b1f1a35e2081b791d69fa7b98dcb8c659e2cea54a94ae1b1592011d5ed92d791e7c47a9de9627d3e28c2e95c8403009125e76fa02fe9d326c7e54f8e2d5dd7dbfa3484c28dc1332e1cd719af1581ab29de64df7de7aa6de5dd62db9cb684b6c9dba8b1cd709ffb5adae2c3cbf750ce08f1f5c91fdea6c87b01e74c720c3dde3a049f1c5f88b9b4be00f601ebf143d13acbfee79227adee3ad893f75d7485e428de08bafb154925266805ed203a104c35ed62ddc01059795147ca10bb8b8accaeae3a478ded13d8da8746728d17d694ab35c1df0f5b490556ae2f871e9bdf3341c4449292d1f359decfced08e0e315bd0347eec8fff898b92cd51d26b589b665efdc7d136edb07d9a3b0659ceda818cfaba1e18a35f5b9971bac1cbec1f871816ec9db9cb66f19e2f44552bbdad642988c725e62b503ecce8e08d810a05d52c4ac2ea239d9f4c3e9715d415543e659bc0344d3e14b447b2dc30eb92b3e9c6766fa267bf611382fd6a457f220e3862cf0c60254360535f646e14c597274c98af0290bfce3e70e0550603513d89ff0c35cbb44afc9e3cdafb0b398ab460979640452f7359d2a9885b0dfc6d8af88d4f6ac23abf3837f3dc676e133551594f65262048f77c3739072d442f17003e418f7d75bb10bacdbc0ff5b2d4e11a53d53cf6df3dcd81d8998f2cc7bfe3264b2562e58fa0457edf39ae5d58ccc89b25b0c5a010d64ef46e1298501fb4e1186f25b86c46d755134ffd866b56bb096c2746ac72e9287481314b65896010988efcf0b9f5e589fa13dc29d6495066768c72f37cca6e1166661db583af634499aa053f607f20f0493817b267295d81ac17f36d4b34376879107c893081de99208bcb2d72e2e106627b154a324a3be157605443891f20a5fc95f5ee8cebbac3757f583d97135152710b8fbb2c02a48a93df02a24def2c5c852bed2c1f9b6856bdd5286ffb8187e90aea6cc4de07dddf205c2d305dbbc3951f97133d5324dfed21d206f1476e826bfcd6b78f7e26e82877e03800fa8a9e2baa972f74885d8d96c6a566f5cf83da2590e165061024a75ba1239773d4eead3b25340c869411d71ad53db3d98384b1c5ad9f1b527f171f48235432ecc278a9b5334af86fcda5c243658a575af0528f159be129f81341979ef0ec95bbd2106f752fc46170b400cd03ba177b9e2d50efb3021970d8bbc6dce5fb93e6682a0e0f7495337943980c6683ffc6ee506ad75874eb23e43b25c61c7c50cf7c77d0889de677952b848e714f1c1b02e57e4aeff6ecff9c4cb8ce1616f56e5c24eea1d72cec21a43b8113f102fffd5623c2006dc888b209a2269dab7659492a1b029bf01fc0f6a8c1e1301d2229a0ce4a0e8039ec5d4e6aa550a78a1fb0e01abe2cdbd0a106d78af8a1bde2a2c79fd6501421401ece870dec2afd01378def0eccc9377bc1fbbfc58584f07474bfcae439093c66f1f1a56a680870927fd2c49e7ce84f75f505bff43a236877ff2c88adb23bf5f74ba0eb99e8fcaa59e13c8c35c8069941831584aa8feeb5bbc4217755ba4b361003f43e2e53c6e98aa605c15c9413642b509bc7774f311202969cf7758cf6bf7cae008ea8a541697d763af4ac5a1486455c77aa17dcdb452aa5a6deb0ef1b4ec6395cc41f69aad32553a8d2cb359786f231d2f5ed96374babd493f8503d9a0f03c3f71b448d46dea5674211e0c07a4616dbbd59585ef98c7dc80c2223653fe4dd12da62c645b639dbe6159a2529b6b43be4138d86b26ad5018829a52c6fdb822b5070b40a2519eb410d90e384a319f9b8d32137b903a563a54ab70f3075575c8927dcbba8a1771676c1ed6c0f176608b54b8b697b3e28064fe2dd6e226fb08c7390f4b8bb3331c4212325953512405c4368f23b46b058b0fc1e4dde9fade2b28697ffac46f790f0f06e3189814583db66e031616e4e53a0cf739a00bdd09d8a8623407bbcc1cc0fc9bfc08de1c936f2e4d2d9ea908ccea2ba4d33ba5b3fe28851c182295833431e49ad054aa293a1af44d4c38f07f223660969955bdb37b5cf5b987f78db20761fd01d2f5deb9190815cb0ce909ce28680bd53f5917cb04bb8aaf7a62e131b53d480efe1bc128eb38d0576c8403bff4042a3b032e7f9ce80b08de891acc52441148c2b9f70a899789e0b41fd475441191046cb8770093a4ed4d9f954372175fc8a1779e0877ed186e22257956cfb5ed2a3395008927acef79514ab34478f0d7097d4febe3c6977333018509589e163d24840067f5a534ea3a45079816aea8894ad8ce19fbcd3b2","title":"989. 数组形式的整数加法","link":"https://leetcode-cn.com/problems/add-to-array-form-of-integer/","question_id":1031,"issue_number":4},"2":{"day":2,"pres":["数组的遍历(正向遍历和反向遍历)"],"tags":["字符串"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。\n\n示例 1:\n\n输入: S = \"loveleetcode\", C = 'e'\n输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]\n说明:\n\n- 字符串 S 的长度范围为 [1, 10000]。\n- C 是一个单字符,且保证是字符串 S 里的字符。\n- S 和 C 中的所有字母均为小写字母。\n\n```","content":"0961e884611df7d4ac47a79a9e3b6f2477863d84c1b032f243483e5a435a7a0c5787a92a74f3fd1f23c502d161fbbd42a87d4088992f12c5be23fe2bfde9f36ff331672a8bc6cef10526cfb6c68e557025f0789580ec089727ad24c0e4a6e199566fce4462bd9a3c2832137ab8bba2fe3d96c1ccfec31329f917540c873870ca271d822966644e524da455bc4cc40dbb4f6008a376252e43c1e03c72f48ef103777b2c2868e9ff2e5d4c2eb98118626240ecf6910413761da95ab67234b13576379716a36801af53404be5ad8f5d2d729d2dc26c6a2db3ac0b768ecb351d7287acacfd1f94ff65e0800f4bb299a1fadb47535dafd4c72e0714248611330033aafc4d8584bf9a4ca04552410cd25f5b69dfd99001fe14b64a89d3c515a38865b55b3dc78253bce4db08ce744347c94522b5817206e7b56ab8c07abc9c40ea259a77e00f508da85d64a7ac70d2cbef6880f0f53e564c6850fcd275f3d67e2016c0e7aecb39fd950a86781b3f37020fa0235883ac06cb1917575a64f63ea5d7dc2938c315e30e55bdab4e20a15352b15405da6f1895c5a41dfca12c4ff430116e04a0be665aa315a0658bc67953adb18e4baaedffbae173b66c756262c50d47e0e3b947dbe75b68826f40b33d774d667a0608d8638e9727e5c6f74bed955d0e2ca351b3000a59dbd243f4aa8e10274074acc9da829c51bb24d49f1085f94e1bfc74c97b3366418ab069eb42c35677011d88e04a42100dbd8531f7894f0e4678615ae73054579ab4acc05c56d40942692fb9cce7ff869f4bb80248b6b6ba9262c988eedb877f3f49027eeca5bdc9e75df999d8f956cc4f399efe795a87ecf98b6d51d6f77f5c9e90e66790afef1ec0b74c06a88bffa5aed9bda73c708e2e6f7ccbc18e88973519a4016ef04072c94596248891080165b459c232ab00c0cc67ddf3bf0ec5117fe47a0936c6d3c09b6e524862ea1d728e4196e3e2d42ee5748d7715c38404f95b3953fa1f80a01c7aa84680121fd2fe121e957319bbd8b61acb8d2786c155f7097b3c6df9f8081815280aad1b97bcce75fc7d583a7cf2cf58fdd665984412139d3cbe79e050863c35da447838e6809db1b829e4eaaf82fcfb7552c534220096b0cf8ae96dc1069e6441b454fd46a0fbc92f25b06d135d1573672f6275684b1d4b5bf4bb7795fda3fddad25feb384f29515ec889309b2dfade03f844d6dd81c2eee3ead37cee218af3a6ec63a29288994a679e10827bfc23f6bf0b67be44d43b9cf20b0aa7bf44e1a8b558145a80beba88496bad4b7658767f89d68984fe3c43512b0ac625fd1f73c1bf65d382823de279438e90c3fffd0eee7914da25e0554c9d429ac6442157dafef28bf2ecfee0c1414ac99cb8b99719ac365ef55bf7f892df4fcbffd4ecc44e55f6b2002c26db37d4ee05475391fe49099dca7f67b08593a31179c58535de0fd704cd67c77d256874820f2bebff60cc3db392731154eb48149548729acd7d3aa6b355043253fbddc7d79addfd11ac792a2a266f01891f3972783d0ecad87948da87cd4ad73c090f60a8347803f91b6de19e8c1985efcb9145b8e577477365d4d505f1653fd4050964d15f719039496a22a0fdc47af8697f0eb68d6d99e7dc528d8a8266791ffa6cd61ba9ad9aa00876af7539b06b14766d432d56bac276bc80b83b37052587e545f688687e542216d69d9278aa984e189d10ef10f394d98f194ff95acab53991583be141eeb2fde44ad669831f2a64f1d068edba164662637e13f06bbb1cce31c989a0ae095404d64a42de3fbb7bdcf53d2894d50149e19404cffef56423bc5bd1ca8eb77607506f131d3ad6885f2a2baa49d7679429f93d056c1eb888e80c5373324991c9fc775875c5b6e00484d562bf4975a78fdead8ba79107d4ca8b38cb6ced6a50943c8ab469e9e0a31e65d6cc00e5eae48212f1f733877f089b9b01db01c1e43386af08867b503480850a93aa183e642d05d63bdb77b84c990a7184f97e7e3f5202c8c02d1a83398468a243c5eaf11f3424ffdf2cb31d7842be2f3700ab4d618f7388322cc1364e6df1ce29e28deabd29a37155dcc738ca4a8521d3c69c21acde39690d770413da87cf6b1f7a3b0fa6cde7cf5e5dc8aa479b69360671cfb7c6a230f3c22b6402c758989c750c7e3317188e09cb2ba465642deeb4c3689e4505ddf93e3ac30e8adb19e0531c2a5545ca87a134a947f90856a4eaed7edf90c6bbb8fbffa38320b9524d4ff95c9f52fd3ccb616436093c634fe0e7f37d0888f7e00a8b85d76551d14e1dbb7a012550a12bd2233b46cfd60a8ad13ff8ea3634519cf7ddef88c7607ae67b5b8b9157369ccb40d65af0caf6c3e2cf408f6926e37e307068c633bf09136e16c271d877ae3edf5943b10f3472f8b5cc24d661fea6e7c733de6ab2f537694fed12a1605cf4d52da8e14810b5ab524c2212f161fc7e233e1b377f6bafd73531b7c111c3917d1ac04a6dfbfbd7ac4f3272e857a6b3690b00bbb3b14754dbb0d137a84ce655434c6fe8bf6bd30859696269afbe5def265c0eb9e1975093933281863a5cfc5892ae950b0e21b71b13112769372198cb4130a2d7338899d9089842cc53bc896abdf66ef70306f9b8c497cc4492ea83e3307d8fdac858acbcf26d8ce93b5ceb47ff097289b04b2637d85155ad2ae07734253d024d564de21d32426ebba852bf9097d7f1db3ee8d0eab58efd4168acf496d7bd33e8007501a04c2487315951aaa1f15d91e4221458b4a4ae61ba9149314899d4201a0eff6817df2c0e1d216e7414fdc1f3ee75f45034d88df8731d3a5c2a7023880c9ef9091fd5d3b9eb1e893f0291e3b98dce999a057a7b958a650f37f4be7dea03ee1f64bd44704d7d9d8bb5f5ef088ffb2a916cea468476901efe3e2d23540b96ecf3fe9818cf50d3d86595d87371210aaa329bc505bd0654568a2dcb036c9c88c3c56c660ae4e34d7c149250d8f5e1ae9ae6243f6e085c67cdede3cdd76e23824bde4a37bcf7e689176ed5b787f5b5fc938dcbde20cd57a329ff12a2b65e3d5fc8e6959d8a9f8129dbe9627d6c6d96bc0eca4a1c8076b245e0348dc62b899c2cb7635edea39f70c1e8a781736e5fc106d75e84a42e8d2dac2fabb139a1923dc0c7d5d4fd9697f1e9d75792b253819e8688a31f9c14b8bb9d01def5c97a07b34a740a3ac4144cc34e198ea09dbe33b10a98b64397729bbcfcdb2eadb510d893f75d7485e428c34df6b25a0a29740c51f32068551f3d9e6c91855e576b110c964bd3f4edccb0b33a569de448b495d5467ac4598294e235dcdf1f40494c1db924ef3ad79a7d06900c9a9bcaf310d5c4c7d0d5676409a36133ec82e2989b89e718946b50e81d1780c7cc2bed8e5e9a7849179a93cfd9bfa13432f11a089721ef9283935dc65b14aa8aecd550e28726427f62a687642988c725bb01503ecce8e0c4cf5e52cf2c41cfb66880810535b44efe15543e659bc0344d3e14fd09b49927ac91b2ba93093df80ede695882f86a546f2b151262cf5b286c0f255357282b52da97364c98ae12d7c9ce6c39a71d52034d7da38c02798efa0da8d66696ad436bc8f8689ef9134b6d361e9be7805201fc3fcfab830a6dc032be42579599213a6e354c444f546a74468f32376b427e5f0517003e41d25728a03afa8dfc259b91c6e35b4eb63ab29727abeede8dd44c86e9a22610326ff49fac5468d228b900728f84da34b18092148131a0275dd650449ee1186f25e839049b1c0d6591cf3802a760227303eb37bb3674c0754657c60931b19decd1bef3d581ae408831a24945193b8072ba329e6e5a6f66469f83af634499aa053f2b39b410c1495eae652b51b9e549a7e0c8b3f1def4d4e727f5054a5cb02d0fb0df245496a7c9fbdddd8bb55ff8291a07cc4720b5d695f5ee8cebbac3754e3b44c30f381c254ec8fe7e1ca4d8d68c02bf04e76903c902e23654c02c2afd863036a3dd83ff3bc06cc4de07dddf201563645df5c3881fd90f365d60c8ea21ce1aea716ef165b093f9c82a28af7377e5715fa78a8562f0df357f8e46b68dc6ec66ebd283ca3e90a86856330efc71a1239773d4eead3b25345ec3c8655afc7be60f160f477b1b193fdefbd2d1b6c3ec95b40368f86c079f8f57d95b7d2fd18d6092a8292b943f9be129f84e6bca85daac87beab342d326b04f6ff729b3656e5a3ae59ead27531bc8db3752810626818247242000d0c7795f5d9fe5094e66f6e95a17c332b093ffe69bd37779206abd725a1e9663e5a6edc51b3094befe7d983d12de4eb20021d767fa50249b016ea351d6fabbd88718021acfe2ebe399d5866c18c0d9cc10e3f24c015bd5406a4d193e4dfe54067d5367e5754e8363924c43aadba4ad90cb02f6521e757c4d53c4972dbff963f7542a3d790e5645418265ff089677752475296826c5ba43bb9b84977a3096980bc0f163d1c295f59bbb868006599f3f1f457340ae5ac93f554d035497e9d68dfdbbe45c2b42aedd2881385286b0e92316fe0666b3e20207fcf72c80dcd48d20de10c8d0b6c2b6e7b3b4a213716d305725940b16d6e5349710878a57266a5fec0bd952b69beee9c8a861a597ac24b7a39b836c0cbbc835327b9bcf2600dd4d209ea98b20a8f7b2cc2e609434816ef377300c4bd68cbab2638c6c6566205a7306a9f34935d135e646ef694bdad0a15fb6f1b98af2c05d368ba33ed878e97b0562b65d7d31b753f8bb2149a046c78518c4342c116a91cde1e8bfdcc7d9448200d229f266d8fe16ea342a9eb71915beb7e48913202a66e54308c003ad09abefc8331b8d337649e42872cce862d4a6b77b69bf53b963f76670d0e1792de375217e0c346efad28e58eb7cfc23e178cad11e2e6375fada8fb6905b55e2066ea2d441c5e0b11dd67348e0fece27f22ffd8ddcee4de909602ad32294e3794b58d9b436c52cbe10559626341a1d3445cb9701dc1b9d97861db1a7c38c357f65525496950a2debb91d3e9c9f1073eb6d97c3629bcd47394cb3f3950475a2097511ebbfbf4af3aa6f3c97ce27b221c1aed53a549948dc676d9bc76236c27d229395ad39893ae71b3ec999ce38483bf6bf7bf60b24dafa9c8a3200b235ce0b6e0efa51d8cb7893e7025d09c33dfeea29031e6f4eb4528765d0c4e0893e1fa3bde199261299b6e87952e82b99898fae3255cb58ccc953b5b759a84a1ba72468e8b2c0eb2591801d8c141bd7bb75a19a0ceca13925a2a7f904a82df6ce71bc8957a63e3f29da796b6fd593423f40d9adac88b5e6708bba84a34c21d97bebea08680bce396ca6c1e2773078721d8983b9801118dd1024644a5429386fce4e840c3d7bb613d64d24cbe0335a4095dab6130fd5664472bb761a6525c6c860a10a0d193f11c2c08db8986352f5eb7e4bdb7e1f14764da8a58a4e160e58c310213ed758f03d5497a1583ab934230fff803f5eff167f73f41101bc02dc48a90e80bf4434679b6381211a038302a38a3e069c0783517bde8bcc687e8f46316766018e819a8b0606c3917f67309751583886588219c972c051a999c47ef84e553e23b945b30744b7101dbaa6491bbe2819316450608642eecae1c94d62f13ff385cf17c7e9b393bc8b9b0d292299c9828ebdc436fe794188c24b030da1f949494621c0d7f437c1eed3febe16928fe125c39967f26377b894cb69fd38fe5af738ce71d992aa5db542e66868fee8b635f0c7c47c01df181c1444025092a4255abc45ebb3c10ca282666d597b651d4c5e34a74a3623155d5ddf27c6cc637d015fdfe5a28dbff93e4051587db97a1817f1ee5c4dcdf728a735a56f1aa0cffd78ede0afc072763ff864055732a5cdabed4d47bee4f868227ef3c7c495de8b5c69f250c1c2095c2828a6570fc12b6b61ca19419e8aaa64ec8f3a89862f0965b59753cbe8a91e6cab1ddeaf4de5837dd797446f5e1ac4670874782e02a2f939aadb6c64f8042d5f28c07d96d5e14de12311d28e1029958ae1c4aca476dcf4ec781253d7b5791c064d73f843f73f57b64f3789318c4ee51c03a5357676a34381428b11cfe38e45a8b676316568f39389f1844cb5bd71f3496ee855c1e6e2b095cea3fbb45497befb073d769ec76216f3ead3b4a0050e81db4745e975b9906bac678d04287a9ab3fe38ab87ff7d1993c8f8d70a56665a977b6ff63fc1c50f5fce63f670c1041bccb7245d45d638dd3c5706733170cb383d671277124cb6f776ce39447fc80d1e48010a8f35166dd47b34ee51f6ae815e07a08e94d398ef0e8f1afd0a001e8cc0a93aa5b867ea2411bf3834ad55d03078118d54ee15c5735840244c7345b1a630f11597d8b267037b0c981cc8c24894a51ed43cf27293470e53a7f13599e4fb9eb0d57494b680fcc96377441e3027b3096a663f46cbd72195d42d911380430b493413b687de4d1accc27b0ea7235931e875da5a922390ef44383568b525d04efa6401efbdd66d5bf48d41b65220339c189521601e2f9c672813677495fc24d90c1ae761f791dcf289475ae6dddb2b49567bc87ac2c7be906a540b41c20b48ded2d6e0538dfc55750c3e8dbf272fa95bd9d1dcd8d963ad56df2f7029fe4d4b8cbefd40070b80c4f73deafff3b0581e2f13bbc6f2a3313d2c72183089ea22765ff0ea5bd90d649f6590b62c3d3bbb515cb0c78b26a712ca89b859f88872244364bd1898f357552ea2ef8d366cbe18b129a8c489b6ec17aba5925f548b721daaa3da107a6c22ece63f340eac5e8b1a0bb528c3b68c0f1e0705fdd18ede570aec15eb835dce3585746ed28eb63118d9cb32a9d831af3e91e84cbc0d9caf3769a20cf23f741488b5300f2e63c343bf2d8819da7ed7fb9aeb2e3aa0982a26742424591bc308aafb005becbdcf8af553a43b79ffaf712b7799968167c5b22460e283e105c4befe8856217b5ed512adc67e3fc628f935e9cb3ebbe41dc9311049f073aa39bf5056dd9610e9e5235c3125dae2b33a71576d885d58ea8d209024ab494f4dee8f824a3cfa957eaa070c670472617a7d111feb63cafc263ddec477101517cea954df2f5a2fef85afae6132cee91021a9c1f05be2ec234f6c42b066ab1cef0463c9ee69db09aad0305991505dbc877a18d11a401fa9a0eb27ed369a517183891cb9b1caacb8caedd889a3093c6a2a2739086fb801e9ab03a322af3d5db514463fab98c7c70201eb882726c4e28b2048ba88ced6a266f2f30c69a659c394e8920c36ab79268a5c7d92483908387a7aa7953cbe601a01e6f725b59bc3178cb1140b6c2c4c40d81839c7a28ee3406a7cbfb8927fe86b05d3d203758471250d7727e66111a1a442a231a948da3f1ec4ef54913ea63656ecc91b09a7d544dd4bf699158b9b534b4c60a3b5cf5155f24d736c547ce103e23956ad35b02bf2c4bbbc9c8e4f53614d06bf9a56af0a18709cf0156605575aaf74c2ec3ba2c9331052e1b02031763f3cfc06fa3c87ce495b680ec07678dff0a74274a297160b6c1cdd106d5098ba40a1ba3084bd31d729c12d62dbe6b5a4efd1cb247ba221963051d1d4c2ba9e28da4d5f40eaeaf2729bab7a3321fb08fc944a2c7b96a2198478208fd7969aec80bf052ede7538032dffdef197dd2a338f077fce3027cd8421214257769ac361bcf4d032df7add25ef35d8c9d94342cd95f8e5ff94d5fada58d305a4fcedcc19bb48f0f6439d5e6b02fd9dfaa88ea42db5f46110563c420779cedae9f3d967bc9c6b2b28269bff8502c6e52a182d783da55a2d98295f9d00c8330738b3bc5154c15277ac086f63b3e8900044f0749709b84a9111f3cd61da33fc483fa56656aaf67ca76bdd3c98854384100f9c26cfe2a50a6af4ed33debd563a9cedddb4846bc930123797b53a4fd54156da35857681dfcff31c6e1f74f8c286aec2d155b8639640a0105ff489355cdd76da057788b3a536ea024fb5139b193242f0cb0328d121108bcb41bb8c0bfe9ea1298425d75d8968787680fe487c1152a5e26e9f0bddfbb310bd165c61b226dfdcbb2126d59b514f733e00a6650a75f1a636d6ac5113dfa452813e0449ff9ec41866f81d6f105567357ca16acc8c69b5f2649a724be4b0e279db88b73401d03057f8b562b68652410b6eb4dd8624bc8f603a2cdf07e99637efbca400204dc734ef6af41ff281fb4ea00dcdeb4a40683a36933e87518a97104d67334195d7569cd46c49165ff1e5de2790c224e8e53e6e0d4b2fccf0ad86a34e236ee62a79502c9caf0b9b74d15427d617d7777e8199af38f9217a7a0c48c451e0c681f1b29d0a59d3b41c986bac7aa7cf92a9f6ebf903b471ebd151f0bae24829b75aec90ef66d34b63052e213ec189c076d6e749d1e0b9372a1db272ea696a67dde7f6df0be06091f4bc603bffe110e4ecfef7da0f550ac115ce62d9ab096b98fecf4642d342e67601980eb9cc05ab6b6c6cb11cd30931ce657718452c95af949ea2328338c4b22d3f7224286993f2466762bd097e84768b3e0ea7c2a0a75ff097a88515c838838036e5c71aaf00931f9e4058e15e38bbe704706580c3bacd9460a8df9caa2de6fb343490c215e2142b8610b6a2b6c47b4aef91faa870be6705feb697da714617cb6b5941c4491d23bbe3c3fb36589440b1c4a128c29bf8ff36eda41b1ebf19d1745132174597d2c39814c33af8df0b4305bc63db47177cc60abe2677f41232016b53d6ae05654a6fc69c75340835452d60a911232e55f6800e1206a87a97e4cfddcb0debe814e85d66027efc83bc7d3fdb437cc969cf9dd38baee39c1cb537adf52589c0713bc1b54f7ec13f83a1d2bed04c31dcba17f17e21ee63f2a75f3d8f6cfba361ee638a4007b92ab0deb42f9a77463161921a7ed7ad31677f7dbc4aaf9f620e413056ece16737696acc57cf8a7b55480fa66e6fd74ef311a6c80fd12ae1cb70d4ca749c0ed4a8116d347dd2992b6490b90dc7b5bc9184f9591e951230b0423740930535d0d0050d7cb06d8f80ade7a4c8e6c5c4d83e6498211eb4e6ad7a2ffdf510e39c7965d0f869fe90eb0d102c9c01feb16e1d76caa2f29286de43d9d3833d1d1a92a9678b6d7c460fa5204c8042f01a7aebc612f4d41ed7076ee2aaff22604e4eb5cc3399adbb999f5bc8cbefbb2c1691d809e1a237ba937a5679e36e6a6d09e95e339f533fe0e3a61e9ea507cb9fb9e077eb567b1aa5175b78ef6bcbd414ccec2e411aa82a6d5c35236d793f778487c3d68445c2f271b5815b4979d1f31ef37e333409b66090f43509edc79fe96fc2b178764bfd051fea51fef76fea05be893775ef9da0ada079c9f454d4a54e39d18053a4b541a993feb27199e6bed809e2b87486d41c33f73d101ca6971971490ccbf9fc3f7b0388b17cdbb37904593996ffa0904a2eb1de95231b234849272fec13c644e5b7884fc1ce6094a0d806a573c1c016e7f91a7b3e96be9b05d815719bea8a5b09160863b9c3f2e67623680dc367fde5f6283704772bfbc2ccc264fe3cc662e0c42132f37741ca7396527882927310889051a362203067d67aef8a30c82d223394ee215b707b48f7ab7351bfe2b7f22dccb5fcf593011cd87b1a90bb352ae0cd6515277cbc3a3b20b1293e580bc1d7591b37fbe10de29c16ede3dcadbb474f327bc734d2a4fa5c4db00330ad0f50593d4e81c7a85f65ecbe308e3e6d6bcc73538688dcf589dffb8d696895ca4e36bba98580495038812fc4280b4492e2e2c4516b01fd284aef71fe1fef755d560b654cbf5a94a28b86cc71ff28087cb56b4bedb6226ee279cc42ae2d9844d7c4ff9b5c60fd8a2580a6a3c68a4b223a916af325a6ef792e64c59f50b2616c38c99b5c812a0fc187effa4116d08c4825fced12e744bd504365ef6752bd09582d205629a4b7134038e6cb7caecec9693e1948e9787c1c568dd86e6d6d1a04df7c6d46a574b3c9e6f69e7df020fa4492b3a8afa84d55f35d2a34ea5e4f192fe681af63ed8e31b40afa0ee629d1d294bd131ba0bd346c9b9ea89e34fca9089ae383645b36ba57f800567a9b1bbaf956325669d650156f04a6f2a1201ac63b3213f4005ff99ea68afc0525ae3a402d879ff2a4ae37d0d5d248013a1a42d7240bc3017fcac232b9f2107adbda82cc83fb5126c2b27567fcf53f153cca9310567cb79dc2c0dd275e65ab6c3247b0a47abe5b063ffd3720192be96c9129c5b406b58b8a530d3686804a0bd6df4517ee605233bfb059d6473e7822a71adb254617bdbae32d02a58e5d170b14403d9a91f7180ecebffdf4aeff60e4db223a0bc801af1c33bf1a263e7b452e4c7a5f5e3945b0b4eac16d723e036e840c3be66755e3e797867f3d7b87a3ced7671180146438159695ed0912f8fc597d0aa505a72fe1dfbe05c473293cea15e3caf9a53704658a48871e03142cbbcb7a234f2f00d6354e799aaaba6125f44b0d97cd5f39ed2dbe879c2f61adaef55501e332fab34d47a28d2f6a7d3c919cb16f85d81b892955550bb0e7d8ea360941b4f253391c17a6920c7966ca88c6997e07b665f5b7ee6fb35b95a0e634acab74df82fbd6ee4327bfc696cb135eb54afa8f8fd30994eb6c31a1d180bc76befe075ed5c47242b2dba7d18a095d38af90b34243ebaf4ab96a354f0f6a1721b9b7eaa417e75a9d1b5fd069dc37cd19dba3c7cfd7139447cfbd938d1aa8f80d695bcc7a11f6db3c4b33482f2fb3a4e2b63ee6326b6f98471292a8ec7e63c373beff750b5547eae8581bfcbfbbe6579037308089ab73db53b52848f674f6b997365a8b8b937c814fe4ca035d6683bb2ee02174cbc988fbc7481b0da06e069e0715a34f7d2adb02cb2aafceb0fafdf14b1441ef2247dfa16c990b759f3f71cce041a83a22db97d7a4226037077078ed623515c4a51e6c4e3bfbee4b59c90001c914e5dd642039677fbd24e38121b64f710256be8de7116e1585976be3ede9aad2bc2d09a80453c9c03ef12300d5cc87e087c529fffc29b7853d49d1e0377b00d92355c866bdc6bdc8f23df290c5f79eb6e408360e32193beab4a871a0b0b391e002216d1fe79ea6cf26d2d841339a350cf242a8807fb1262e56ad75cc8e4d62b92beb864f442e1b42af54dcfa9e4d1bea57c25a4c70d735a64a5b4460299d509acab7407014a3a652c549f5d2684f1a4c25942ab9203608c097844710730341a53317fe099d584ba2c1f7b81b111313cf3ed19905e8d64f55e683c23677b398d249f80eeafaf7edf10749d669a3faac5df28931efd9c730d7e4c34c7079fa5e695ac90563a8b0a2de68eb6cfa42778955ff94a02cdb9f003f2ab5026c2c7a8f21ec72e5f11636c82d41533d7ece04fb83e8eba927a5bc769a4795aafbf58dc4fc13596ae4e8891225344e3f3411bb7100c6a1e8eb6635027a497bebe57d1d471894b17e550a01bcfa716e4634509ec02c07f74c43619187cfe40124cb253de7d7dd0756ed3b8cb66af3e9846440056612eb6d1f408a679590e8047a14876aa2a2b8b22fa19f684eadd39e523a5145f620128492d8fef08cf6f0b2f0b907a0a8c34972ba6fd4a1f649dcea89636dff8d79f160447c6ae24983bf0c20b1a182dc281665cfdb364f6a3d706ef5854c457a68dbb41915198fd7073f2dda5c3c389972e3f413b74ef3958d98ca4642e85362fecb1b745a01e5abe9b52b76cec1bc743e6d412b421e28cb6e3645d6ba545c9c1e077d3c8a41a156583291de0637a74360bb920250f8d2c36458ba558391f92b803abfce990f51297367682515187df61367b92cf981d23d625d10c02b561c8e9dae7a83839089ac1ee74f3e186f8e0815ca7eb69ef580775226165203321239eb9f5833967ae8f146dcfaea25243954c39051235f22bb12e9c1ea2da435e959f197b1b3d76be0518c9a87575e2b3fef3d13d264103976bee7b5c3a7f698c99ef57503dc368163ef470ca113ebb8349fdfbf99fc2929ee4567e9925be9ee85a059b615451c40733f5002c9a790ffee7962c93433028f78e5fa3ac53219033d64a7ddfde6352ed580b8fe13ffe6e5c09e849fa58a15a86d6b5116b691f0bf65b007ecbd4e2a8c4f393177097019593599b25f08a06199ed03c6c8fec9f3619d7b992d92636c0ab205c010ccf19a4d99196ffbe5548b6447ef1e808c785f1ea4492a41dafb919faccea74d8547a0900436272d5785c29cca7f2774ed948c173bef3132074e80330f21c05af200778c796c1a51598ac919c29ff132da613b731595191f9f5ba51afe10a858635dbc773aa7b94b6d87782962b9c220db9610e87414d71f5659b1a5134f2d671f330cd3ea6bf990158be119b7e4ff648cede803bdcd66af3a32190f50f3485b4536c1f8170b2d70e50d87ed6c61da619b622be15d8b6841825c358c638c2376d8b5a07f0dfbb1a3f585b5eca26d989a47824d31869689ae6524ccabdbf9440d53dcf22a8e1a862545de3d75f0a1c9c83fd7ea4bef0faccbfb9a97aaeaed04898776ba8c4073b172d0597f199b11ffd497c63bfcbc6a92493d185a9bc32b21b224e06c35e8a4c7474836835c0de18c4ef5b6fb5937eb02e7a567f7bc3d6cf177ed1780fd7a68a21f7b20f80f669cb929f25bb2d280b76d97ecd97926459072acacd5cf38d630d7c17e2548052ae08bc9433cb896f457bfdd266b5b0e9e9d4c7a9693fe6ef771a70a428983230125891b926810aed134341478924f9a5950f9638dfc3dafab5eca2eba1f78a770fc680af9754314b28d57a867e1e9388bb944350cb42d2fe473976401f7ddf9ffbe1895c9dab32879ac776cb110138b32e0d5aba79ba35e3da58160602820be78be36ac5f668dfdf055a582224908b14b32a0e5864317956326079941ceea198fb5b923461097af770867b852335a52550d6f3ea47ff98cb6d0e365e0339800589d0ae9eb524c137307a9c1b11031f6b86a344ba4f3280a40a14dc4f84dede39ebadb3e31da2707f70ac0f7d1d6822bc156bab8ac39366118be8189032cb829e378eed13717a776f2959fcace4cda81547d34850380e3749b94e940cdade07394f4440df9e6eba09201836bb90aa1165d026ab0605e8958247da1eecc69b1ed52b678e08285e6f357416d885f6fe19e3553ff1ba3684ce8bdd40d9607712f1d690e076587bbe145b34a1e600e5c4566061ae438a18fc40e5f161d36e8a27fe9aff4cc37ad21597535330f1ea41af502fe78a9c8e34b699affc46986901fd63616468adcdc920776b520d255694b876e7ec5cba4274b4d8abda40e5a1ced5c8465e38521d8d11a71e1c2b04d8f7a84f9a8486de7f4069c02e27e47033466a60c8e51f5bc66b758370a77197c8730f1b44a772972b45b7556d00a1aa10d97b2de8818c402d8e1f7e0946975fa1ce791c61a6f7a7f26e7eb076cabe64996cdf65496cac89d0cb45c8590da41708c29362b05e60bc860cdfc9d5455d073d5cb41228bfdb87032cf26b3fdfce970d667a4409ba7e1f3721e954234820929eb488abd1ea8b8e8e8b62762d8d26268546cb75f009ba5167cfaabf3abe48023ffa0bd306915aed1f06a802b699bab1dc53df480ea414061f8361366a5972c1bb945d685dbe981971f5004cae10fb6774f6f9d237192096ea965c8f83a134c6367387266502d33dc1373387166c5f6d462915f367e22b1bd2103fe9f0b9bc18b56c7ab343dc20f47ec5f46069eb11566408d44ad733a19d250e0dc2626438c4c34125728602acf92163634400ff6d6d210ba9537362a2e04b51930bd1f019f02e33ce0b51bec28c799e10d17b8d7253dd4f4ce6b684e21dd541485af6d23221ff951469e04fc923067652ac370c239aaf7195a9e40ac060576aa025ecfaa5d10fbe77dee8a2ea2bd3de4425672b2e578f06a0ce140252425940151f1d1f5c32969e3afa09b72f0fd4fe8a2f62b5e2bb5efe8c251720a0a8b8d75e978d12dbca4031e2ac867273230d974ef25e215c35d84160ac7eb9864d2112922edfd7fb806f37aa2ec5a88cda8eebc108de4b5579bddace8461a6576d62dac01a1d7621cec5aebd4825241df98c916f6104fee888ac62bd3c906015a9449a1f0f70565014a9bf494efbae8be595f0fe519a1b0ba84cc5e6525762c244c3c1b61397d73fd42bb110b235e07b7daf8a1bf24cb0dceab2d2aaaa14368b58fa30789956e4c05e30f9f2edc3a4066d59c12c58b1c401534579a5017bf5233cd6eb144520f81f0f0bc0d8186f0e782f6683950a09ab2107ea897a1727fef333444251baa1910605543e0d8aa09e84c4ca804381b23acc825ead5b1c64fa9a3c8519f8b6178d3275e3624c1b4383c98f1db1d42973fa4df90acdd39925d231333b41badcec736c158d6c5a5400fc12a25eb987840232049046c9c766fa247a1b45598425abd221877d032d5d5aa39ee746aa40cc94b2d0c661b55ebdf7c8e21122c04899cf7717f5d06e16f94513982fc4ab95c9c0c03288ef958ad02884a779c4398d9b9107ee60ee86d7dbe79405586658571452245ada82fcbe58dac861e30adcd80ebc123a6c6d1a30e44e0eb12dd805f30d42375de8fe12095ae3f4ab3211cdc9a0cf38ede22f9489880da0f9dd5178f383d122c97133025b73506a7f05fb03f58075be0471d8305ee5bad191b626aac981d612754d17500fd2c7ed6bddd881319852c84946be7b7fb4fc63c428660545e78046275076a71ac3559a83a7e8f975a1b2b349b7d2cea44d672c35b4d0dfa1769d2b550c8431ceae11767c5716c523022c4d861709d662fd360b6a0078d34c359963e3c028d11b31feb221b5e64d202ba55cc7de4e421b1ee123e244e21eed3f1b5b0b55dbcee63d5cd4de6991f9b7d2f620118c6810be8a45c8ed658d0bc352eea7a144d39a7f47d30fc60bbbf806013951ba2255082eee4c4f40b0b1da57fbd63827abb28e1246e29500b90bdabd685abbaeb370326d501b8cf977723cd43c976276d83ba5c78a6e754ad7dfd0d9126ec3b489e1d25506fa488d30b7cafd50108208d96df3d7e34591742d9d5de60f17d1b38d6a007efca7c19d754001c45f7145a4026f49cc78e9742f7854951300971ec6b25542db5e6b19dfd28195a148a6ee32a98bb48756b55f1b0f22a824cd7f45f867dfeb0b6f7c86f0888cff1c8e4bf1bc73f9b4c47eea7d642eb2cd9141e6e25d46cd6f31c56be320772212f4ac1373bace7eec41eb5fca3535a8701a119fe4d73bb68d03a1e0b64a47df81b1f4601f025c2516f534df2b4daf0836896d3f1702371a653c7b9caaf6dfc3a89a50beca53b054174ec127eb3cdde77f04e8fd3462845f4437e74ea4affe75768c8d63fac4299dd18ec5930c14efe924d3a4f50dd8bc1581032f7032eb336820394940bdd2b24bfc169214f5dcc87ddb145b4f6f2c927ca086f1b4353d654fc55e18f809910dba342b2f911971b6bb25fcd88edf7fcca50d75e2594378948c53641c317a792d59b3591a12fa7b502538362d01e98836bac2de18f605d91c29738154a72de4229ab8fa4a7d48435914961197014f72e7d78ced9824c1daa1e440233d64074ab6296d23de0b3b577375ec9fb67802e392ae87fdae6c0f10f05895a4837bb908561d4c83e638ab216821c302629bdc11d3592d3cd48ffe47394ef60f76e0334d50055d6383d68c7512cb73b597a6af5095","title":"821. 字符的最短距离","link":"https://leetcode-cn.com/problems/shortest-distance-to-a-character","question_id":841,"issue_number":5},"3":{"day":3,"pres":["栈","前缀和"],"tags":["栈"],"whys":null,"difficulty":"- 简单","description":"```\n请你设计一个支持下述操作的栈。\n\n实现自定义栈类 CustomStack :\n\nCustomStack(int maxSize):用 maxSize 初始化对象,maxSize 是栈中最多能容纳的元素数量,栈在增长到 maxSize 之后则不支持 push 操作。\nvoid push(int x):如果栈还未增长到 maxSize ,就将 x 添加到栈顶。\nint pop():弹出栈顶元素,并返回栈顶的值,或栈为空时返回 -1 。\nvoid inc(int k, int val):栈底的 k 个元素的值都增加 val 。如果栈中元素总数小于 k ,则栈中的所有元素都增加 val 。\n\n\n示例:\n\n输入:\n[\"CustomStack\",\"push\",\"push\",\"pop\",\"push\",\"push\",\"push\",\"increment\",\"increment\",\"pop\",\"pop\",\"pop\",\"pop\"]\n[[3],[1],[2],[],[2],[3],[4],[5,100],[2,100],[],[],[],[]]\n输出:\n[null,null,null,2,null,null,null,null,null,103,202,201,-1]\n解释:\nCustomStack customStack = new CustomStack(3); // 栈是空的 []\ncustomStack.push(1); // 栈变为 [1]\ncustomStack.push(2); // 栈变为 [1, 2]\ncustomStack.pop(); // 返回 2 --> 返回栈顶值 2,栈变为 [1]\ncustomStack.push(2); // 栈变为 [1, 2]\ncustomStack.push(3); // 栈变为 [1, 2, 3]\ncustomStack.push(4); // 栈仍然是 [1, 2, 3],不能添加其他元素使栈大小变为 4\ncustomStack.increment(5, 100); // 栈变为 [101, 102, 103]\ncustomStack.increment(2, 100); // 栈变为 [201, 202, 103]\ncustomStack.pop(); // 返回 103 --> 返回栈顶值 103,栈变为 [201, 202]\ncustomStack.pop(); // 返回 202 --> 返回栈顶值 202,栈变为 [201]\ncustomStack.pop(); // 返回 201 --> 返回栈顶值 201,栈变为 []\ncustomStack.pop(); // 返回 -1 --> 栈为空,返回 -1\n\n\n提示:\n\n1 <= maxSize <= 1000\n1 <= x <= 1000\n1 <= k <= 1000\n0 <= val <= 100\n每种方法 increment,push 以及 pop 分别最多调用 1000 次\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d768f228a04f50bab074078247f3c02341afe906d25e29b5c3a72e15c86695abf3ffaf3406fce911155659044b8fee931e364252a97d1c4e70a2cc6a0c49e533134eb70c984b3039c38bc28dda8a7a99e5025c14460f8883a28320c32bdd8dcb533df4a2a294ffec570f3ff8463ec08a1625acda3f2e3a3f5d86228960d950ddb296369ea6271a9dc196c8478c18ff1035e76370668dec42e50542ca6ac10446a4df5e4930f337b3f9e5aa87d38901675259814bb6005ad686a9f6b05805e147c8325cf69552f938e0b7380c0313b72aa87aeef2e95e370e2b43d44a3a9a0e5fa4b6f53a2f1de2e0a3526b20b331730aac44387b49c9b658045534f0ee16b584bf0d6912a38ea7cd11d9eb22e2d884d985d02e38f64a3e4c01acf7869a942e2e6e4b6285ac2f501908815a1f119ec44ff7a45e1c80b6d264adac2669895c402cce6a2aed8c5aaa811ae608f8e725c7ae88ed0cd76a29e7bc37b586129534d827a90006ab4ae5f37302572ba5487a88435940bd5c08ddfd7ec4650f96824fb526d907656c9fee34df7ef5d4d855b3c2c5893e41b4a16448d658ef77866a6b39669acc0ea574730fd7a22097fba6d41a3a99b11a0ceee0aaa6c49a5faaebcf0a3fe8227b12d540f0789ac4b637982fbb8489336e4e3df1e028c07401ca5fac6b77b432065bfb4e01a89ef062eb41e59a5175ba080664cb26fee338772e0b0c2cb163487c8c9f5b38b2dc1c2194b25bec4d526f5fbb9caa7d9b95b094ab3f1d9be7c5072380d008c12aa8d02197d16ee0f2d721231dcf0c7a2b87e01786463986b5a3b84469d211130a91228f9a56643da52c3da7e74a2b7ceadb6b78562d0f13f35cc112938513278da1b19d229313f1072a8dec96c4db4414660a8d8aa06c2473218012550b547c0308d36c3e17ad0e1b00ff51d75fa68041bedd2f7b6a690a8fc21dbed46f69ef3c8d526e6539da2f71b4d65c207465dbf579ff7567cc32fa3aed1722fdad71e95b5091785f0428623b1c373ca0a75066dc5f90414342b20a319be9bc571ca7d510371cbc258cbdf6597411832a9d12e9d65b030d9aa7582160e87c7b8eb0a992e63f0c9fcaa314bb5690b94bcbedd8ae377fde952ad22da59b4cf6d5345ccc49a0c1c5e5cf89a82f3a9aa856d5229bd9df57a6a16fcd5e6983b9c4c0b7f52cc8732a10b35a22abe21faa5ebfe86a4fab013dc8d191d472910b3f9ecb22d0f86a56ed157e46efa4941db10f5bb4b9d0c76d6b70cb498d20413d30e2fc0d2761b2fd8b3dbddbbd7fbf3f6cd75c0db2529d626e03372e99f6bfc99820ff47b529a58121776b4891f164dc75d1d079b2ac1e2127b625f10a29f84a4eca2825b354b417f72498267c2db07a3733d7b19db626a051b4bfcff3b7eef5544d43b1225e4d2cc2e39b0f10a1ad6ad32720357c3be6636aa17f05aae67a026b8a38a800adde37c5dcd0bdb6e15b9d0dd368c8621ddb57a33e89631748ad0a4f869182c160c5f56d67181bda4dd453a914c87dea1067ec666c4bf13403882348eb09b917dffedbd5dd7a7331545a005380c39f62554a9cbcfdf633abe539b8a56ffb3e61de7810d365b5f2f90dacc60d980a4e2c9cc2151310dda590c0a85ac9646cf13f661277f32838b73fe8f5af6d787ae91d4df5978fc714830afacdda13630d37f43c0ca8392bb027017758d87441f95f559aba28a84941954e47a84fb758a5631e45bf9f3e6de4e9878dd5c7636a69b75bd9e4a3f1c2f3063a4ef7cfa009f62573a27c3fc64905c344c9a71f280851145233ab9e70f07ea39742291b861a29eabd68c5b5d517ad59a96b7879b743102ff7818ea15aa88e1b8f9140421f3c3a4fbff542a7aa2dce23e6a6bac34f674bf81f33d80e9918b8c8405f1f24ed95caf71c229d177ceee39650d72600e96840db5612f09dc6a563c8015b30b4ccf6bb6ebdc59caf457f5f09dc9156ab43665f4b2cf918036e791365ddf3fc6db2c36d1a6ab8bca89f63c3cfa2e8372b84bd599d6747765f1ef29a107311db76f7447e51fe64c8f08cfc905cdfe6d80df45b0dac3c238b8225adddf06dc4e9411a0cbe372eed9003657250b4f920e1d979f86d7bf7134aff51d51d5b80dce3408787bd5aa92e50e8c96092e499222cdcf320b6afd97ab47b8772b915d672de77335bb0bd78addd46e64c34ec3880a809ce1d4c39c3e4771a723952c8aa86c2646ae52473c760d51231d29e4248bc49d519157906cac2da4d68eddbff906f4d1b05b5590fde33e8b8c8f2e16930b57e96466601ef523c8203b925964c52f6df56a59351d549fe0eaecabd3a68150aec73056caa0415bec02da727347207305bc0987c873a7defcd207b85de17c23538c259923a236bd321ac5142960eab569ad7ee71e507716e78b54bbcf0c654fff02bc635c204b841152a2817e7bd999db801c857ec2db7107337622af1d9297baf62ec39a72df46dcbd5b571f1ddc3e75d8568587693d31b78296477bdc7669b97c38f43f056b02a0a7149b16c30ad6e7136afe59f2f0bc037459cd577aba4a6e441dbf139cb29f0f0664ac061c572b8ba8955d70ff30e2c73c88ddd83c988a53e77932873339946ac7c368184597b71ac66c5106a2a43c354de06824683abfb267089665f05c3fc0ff165c63c2381ea37aaf273c6560024a2a3666ff869ac818a823a681ccf0fcc53e204f5e703510cfa7566952122c9369000a50e5cbb666be97f13c4606cb5d3b713b299eaefb3fee920d5936d8976b145eb0381f94654b536575968b4904485075a46b34d580e673dbf6f9e3f3934f850436c899374c0d2ea5607746cc8c93af5a3636c28def1653916249adb761ac29a35e3cce0d2a413b819ec69fad659fcc268c70944fdc2da603fe2f3d33442187bfa7acca078a1f9ad86985a5220f7904fb66d59b17b9491a1fcf6f8f1f4608076102a2c2d7787a8befa1921996b6f1b992e221708b94f03798beab9039f5a647e4744a35f8acfd66bfc8101f5119235c56097144f53deb5edcff1eb2f50672cb1022ec89d1f5ab0385c062b484b60773daae6043c5e227cf788212ac41cab50612e8f2194d4e1eaecf8d07b38636bb55fe1d0d4cd019b051a75861a5677b59ea91ff42287cf1b5aa08d43f75cf210d7167dd7acd0bf1bc875c8ce3cc701bb30fe1e9d842c0904798bc1b496d32e770ce732043d055d2a5f5bc276a549e1e256e9be730ce02960bb6e6d3f888f5d58ac70af396faf048ca1b68a1d4a4d5c222c70f626c082813fdd1302df54c1f1fdeb50191132403f27a4bc7dce0c2a701e22aad5d4c868e58e85536473bf97207516949cac9cf15f8f57f3727010d4d7ffc17eec554faf2b4899264a8a012d46f069f7d7745114673a2b8399ca9509b4b5434059471cf9860732a24b76149a09be7b1bda90b21c3ce2178a1f214e6a8b0d8d2421258d7aa87a238d2d10c2e5bde6fd3ecb1a3224efded84d30ee32619cb23714b7e13b5ee4386f4acec0d3cf2f4a7adb4d4f147cac48a84daf799dce1dc100eefe43478af0a5155a8bf7cf9ce9ce8a43b75c9a25973d1535bd21764ccd31e4ae6014b9e8dc191d8234944c8a733a3636e269de01b81708ca91153f3ab83a497e1c0f8ffce378f3f373b172d1705d0ba9a8765c1ed0083320b5de0775c5301d6950efc772aa12130191d55c0ace4a2765f626f33250892df44ed19b9ba09251fde670365d25ca32fe2ed5097cd042582c90fc2f1a437d9f1f55467a8c63fcaebce812faf3ff1d659ba93bd03aec80373055e70066c19139910d8ab0a50673b45dd02fb39c192e1f683023669e3ec5e10a1faf2c322ed6c9deb63e9f69f2279e86331735d6954f487ae7db0058ff308e4a81f17aac4533a7c7f33380f7ac317a783ce6be8ef297a506c78495732c3255c416e06bd941c751b9bb67edb1e7c103b947aed18afb0118112f2549d626ef443d1e020260131804846eedd04dedfe48ee0a3dd54e9a2db42c5b7ddc95c17e940e24ba2f2381ba582ffc030af3bd61d9bbed202e0967df658fdd8e62deca7ec9c3fbf9acc843ef3e72c4ed6b8465b8b63d73384b7877869755fd59b7d46d22fb4422112556c4b2915f4fbd2d1b687a98e9e5617b1224ecbf028d15a7d37c2d32ec1b3363d9515d2af7df1096b979ef0ecc7fe811e7d74278a7f2fe0089e568c1118e32d5beff80b19758bef9a93f092ddb268370e1f5e9533794398036945171764a0f4cfd4a316eb6680b212eb7a3bb72e2efa88d9a331957bd1dd39474f5e05a36f4abfa2b9fba951ccce1008be091365abaaed37c621a43b8113f14bb9a02f4c8e46638bc6e609be29c1ee6a50142d5f0891b96689b8efdbe1f59986ee1068019958d86ce68dfb2f963340f4b0f15f219f551602a3122c6d64146b665f3442affcaeedd5457babcd37fd101da7c50eccc6383ff0f4f2d0cac9f84839bfc3aa314f2b6f92bff170420870927f858cd730e4097ded40edb224692678d53195ada221f5a50ef4becba6aee21bc57dc871c0169541c846c4e6d8f0ffeeba217a48ba5a1c1003f43e2e538de9d7fe51851ec139376e1cddc9241b3f1f67ec94fe5fa6dcbf7cae528fb9b6136e33672de2fa355ad24d0f6fcc0cfa9b4e708fc59aee269fb541c8e401cca13b7283980862af70f3e92c8056f58396f3d331126027c5a677c6ff1232d38300a139875d43116b3ea287f20a349bfbdb0a7ab452c1e4b6c5118bd57cd12f871dbe29d7e67ec40e6c8ea861b4ab6459f42e9a011bf663c1eb1405d1de9f5ad4e3c706c0d20c0d367959f73d1ca76ffb40c326af8f49d5b68999d633d8576a48258fe6ee5b26e9cffe2f569f69c6222c1c6e4b1d89b3557845edc8040b295738ac9502dff9ae6de19f978886dc37bcab53d6711dd2e428731b7b20594569088b736d532afafc0f63920f058e3da6c3ab809d2d04e7c950939b103f0be4a0a26e5e0ed17913c68328439430441e4c257c043a07259bcc31b1cb744edd5c26859796ab89a376948369576766cc290f1b9e6ce1e8abcc7d8d46c155789277f9b778b699f241c8fdc71b765b7e83271e3d497d67135ba16543bf3bd60337570bb381949b1354276e6b9c727044cd864eb9d43e90ab284ce66974564574546750234ed9b0d911ef72c4205ad868868c298c89839dfc82014ca09fcece495d64baaea1ed587bc5e05440f5536952869368a179be0f38c4ce9b5da7472968835aa88425a070f9816a63e9edb3f3b4dfb65d6411e91c81dbc3951b3216a1b5086c9020bfadd7f4c5c0d8b5df916c16453c558525d9cc1d923159d18356130db0198e91e9eeec0093909865341cf14ce57b70f05300e5a9ec28c0f9ef36d42f3693a7ab158cd80d5989824eacd6776457a8c1ec2a2a2f10245cddc3245bcd5f08a61762a2f3f86cbf79c51ec4501f839d825162fddc4deae8e76fe67a0e4d60eb77a2a090a444c6110b61a63e5c58fb737f7367fe8369d6776c7aa4fea6ce9ed3bb221c366541ba0dd6ff3435691bbe3a4f453c8fb820db68818a4f4a4f94b65de282e816b97ec80e357d0f31089baa6491a087f9931e1c485aa3fc5f75a2380b9aca38bff8a566729b1d689caeb2cb9c379c856fa294393dfcde4a8d57e5569f51d3c0952d12437f0f2c16cf78adf30d61aa4b5522bc016e7e6ec84de2d6dc81cae6478cf1008967e4de4f1866f581a29307185869769d4fd0ca88043125636b1414a4a81138c2842682c1e3186a308b13202fb3fe7896b5d30d570ba03fd67e8546a9b15e1d8fb6a3d44c33adc68abc815559b1e48bdf21de32191db8c55f849ef39759a8176806af9d6a55732a1fc5a5c2d17cf80afefd74bb7331672383f68d976c4d4720113e643e97a47f9b1128bb1653956e653ae20d086c1db91050c6fefdcc794d430c5a521d6d0533d7d138ccf0dd325b0882e82c8102134f7f9387a0e19237804a96bd9f7e8d6d1d7dc003360961ed44cf548e160ef3517bd44f8e945b3d235e919b4e9470ca6c27f53f2de96a9b518bd31189210957667232173828b20dee35f853e86e783c7c8f39389f436ec454d7daa4392b15f3dbc7a19bad07f028fea7e3449a73d769ec76216031adae8dc9dc3fdc25808e2ede5b1dd3af36940bc4ecf83f7a3835b84d75008e244bf002f08864f25f0ea637ecc34f2866f3c3c0a0b45f76f0826ef963c99adf626fa3c1e36a0261a8b8f1e276eabffa4951c320654d4845bf2737cae31be901870ede14bd47ae7a05f81f558ef8acb8fc84a01fa8e658d6f920cf03ab4154ac9244ce5d032d8118d54ee15c0522922d58e87a4649730701461df5692037bb94bab19753a34a51bf5bb1727b7a70e72a6e443a8054c5e404536308454795d3197e4bf220183e82e66ba83cde7f011c47cb5d424b27cbc70874267dbffbfcd02ba8a37d66f457d35db8ff0a3b0ef31ff2568b0e0808bcba401caf933590c21c9d5324700b6a95db1b1e09b08ac23b8c2a36525fbc448081843f1f651d8361d93cb33889b9f1dc7396f4a2603ea741f108e73f3b9e8ded2d6e0538dfc50115d3e8d5e325c89294831693f28935dd3f9bb25184ced4b8cbef892a70b803402e9dbc9c2f0c80849202891f6b500ad3c16fe670dead2126fc17d5bbdcd91af2103c7f90c3b1be27ca016ff93c6b4afdde85d1cbec7a377f119493c1606e55ec28acab7a82afdf4fd48a178633c234ff4537c4629d21daf969e044edd868e063a109fa97f2e4a4f90ade3568eab8e06c5fda4daefe3ee88d10b77692a517045ced49b93150d480b439d0c92cdabe78aefcddd9a9fa359611d539e15d489a4f5caafe2e2437f9c387ccafea23efc6f7b1a309d98867421f6fbbbc64c2e6e30bf38ac2c4b40f770ae4cbb7ff4ad930d3360d1f5b3e4640333e0d1f09b5e69d0643b5f05127cd7cc9fc628f9317dae7ab84699ba75f5ad04214efd5fa46239f2e5d9e4f358d570aae4a61f5542f828dc7ad92e6535a43aac99792a4f034aad48357eaa070c670136e5eb7900cfebe31b18765f7973a6a2b517cea9510d8dfa2a3d270aab34064e6c9181ad24a48fc2ddf6feccc340777f584ab713c8efd9dfa9af84546ee0803d6d23aa7904bf754a08b4ef236dd6eef44627190a49b11bbc28cf5f7889a3093c6a2a273c487fc87109db73d6d21f5ff9a13176bb9c6c532602114aedf5a72726bf40a92f4c48f627e66341ac69a659c394ed40ac36ab7db738fe59d6dd0c4d3d6f7f0351ab0e129e45c68721e43dd2a52cb1140b68b82c405d5cbd52926ad7a52f593b5ef6e8e97a45d2b2c30590e7650da63654c111a1a442a235986e9f0a5ec07bb0a13f73e1b0c85c2bed333171f91a0698b5982b572a9d022743ebc465167c448e547ce7a7e63bf40d0584b31abc034143eede6a2a26aa36d2faf6f02ad77844b066eda9b546d9eecacdebd5fe986eff6bcd8c6ee3a6f45ae5871e473502b2c018be14b428fbca8deb2a5852041275aea0d89637281d069818b078b876b9c23de78b7a5dd47b56a9839ed9ce94c133d17016c6f3a6359729c1803e28c2c7338d090437802894f5a17fafe2aea45867cbac95e4bf605c43862cf57c245541085a3292d992ffc376eccc85b8acfd0a3f3e06b8cbf09b094cf60221dc20039e5dedf79ac32a3865427d6bf3d7f49b096e30b251397ae46e09cb1390527ab74187041679e49042c6245ac588cb064203e07d452fe434b1c0845f21bf81c696140a1420d5b569b195c436e3d54860fb4c405b75e155898f9af0a5b3f2f3e47a78f9383d9b721206fadf6bf66bb2ea77a4772dc6c2a986f83e03e2d404780bab6e1730eae76ecb83a48bcf922e5c4db0f68c09bda9c5e4d84b0bce5f33c408f7f2d2ab9d087b950ff38dce0c66b8d2a7e29c5c0ddf715c2c79fa736d0f526c3941c81023bbd58ee9e2cf935caa5c34de1b9d90531b011d5c0792196c9b49eab77ee9a576a77f1870e30396dfaeda9384f2118a98885800b9ba041d40b8767f115607c806c4dab15c71ce11f72519764137f636ac506df49e7289d0a91080c0fc1789747a7d46133432ea30ac091c8c90e1519fa2ad5382342c386c22b744f8d80d70dacaab1d0a89a2d6ebf2caed26319ae3ec9d9467afee0348a717c7cd200d4616ad76f06b51a56cc5c4e58049647fe6058a26c77f06f6d59cf343e4e7579e147ec9164db1c53d97b0f2043826ddcedf19df3dc1ad54405e909eb6880b903d5d7f0b8b84d16537d59747460f41abedc8f943ba6b2d14bbfd98ade7d51159729603045c5869ef7a857cb2b886bbf961c45278e15320416895c0bb973528344a5fe78b5a0309e21a709f887a8945295d43ca42943f8bd1a4900cf0deba9635fc59ed18c0f86141db3a088618f1aa7990194adb38326f3db81d7ddd4b11f3c564b62187782acddf706c99c9caa24a6788775b66812da70be2bf202b820484e9c0645c6a2774f387583a8a00430aee7f0061780a0987b685048bd6f64e8335cdefb1e573e6312323aa3f344e40c8f15d5a952d7d9c183e13be897491d8ee0cfec942ebf42008dd48fe9c128edd6dfe5aae8b6bae2da7e7a8d1d98d72390ee6adea522aeded02637ceded5d150ae1636d5437d567362c63ccfddf308805edc98cdefa2ded99b15f1808afe2a4d07b28fe8b33b5fe0aa79b1fa08cfabe267ba81d5bfe97aa28073557085fc60f75c449693a13c4983343fa0d5a4ea6bf302122f544ce2e8b3c58a8d4a97d44f3ceef61b035b7d7daf1804481c1b5dac865bc9b80b4eb70766e16700d4456393b7309a720c61af3aa460fdf9c9b624eb08b9c89e7b3b15521b5c61ec58d70e1ef49e43b15bafc85e03451b65f0c50aaf090f98cd5f201717588b544ae406effadae43356b053025c31a49102db852bef48414ec8a320e5448d5f2b860ab0ec1edf2ba2de35854e1a490890dc5562ca0c6795addc593332053161093857532c3758fffc0ae2f20ade774eae6951788d09fe366ad62562833115288f999d5118b39053702fc74144a204409c36820a78e054c1e6bee7e40b913910efdebe0f977089dbc94ef77423c932170f98a2bf7c384347e9706fe82b8ede2d25ea04f47eff335bbaaef5beaca0f1b4eb6a1d97903b2a9824966215b264b5b780c3b18a67c25797157a13ea95fcb5743c05cc2d850e51145e749d4a1d16b26451c3eff1129c85a3c8febca37a91f35a4477216e605320383a59169a9d8707f11d8a3ab4d49d5b1eecf2f75576ebf3aef7293f80a30d1ee66e47d245f64b488d6f4086917b41a403cf19748cdb9daf7210cb8cc38bb6bf4d5581abc500a161287bb73762271c82a5a23fc625b2e15ffbdec2acdce298fd77c52395e969d11a9a0db01e8dc6726ee3060025fc14fcd735bbef3a5a09732a0f7ef96df6874fd7fb8ce36b266eb2050a2233b42173b609b1c5fbb2bf878c46833f806b3b752863db96adaa3dd4f21ac5e1d8dcfc62d45e0aaedf692877022b7cf2eba203c1b766c4e2f49d6ee64a261f624249031dfde2a30cd21be6e5c339bb27c265499f54b6e54cabedd24817f820e47e74ffe2e9b55e31e36a985551c4910506cc986a73beb4eb8c610685ccc212d9406ba95eb3810913f758817096330a3822e2eebe60206380eda45f91e5b6be1d1a11d0ad43fde6cff9c0615e2bd38058d9ffb5abef8d102400bf2b7fcccb40a483de598f6e2cc42e6d2b57167cf4330b535fc76150329f71a75eb55d0a67f2b80aaf2ea6f28d870ef93d745f116fd04de4d05eb1c4cc1a4729a3b2a176e1c1ffd9e3d1aae19c6622cf63b698bc30254295ab4802012ec28e817009cce6fc1874f9b85ce0d92b319d2c43aede8349e9d3c25ab0b2031c41310579915b583833cb3fe3e3eaf1b9daec999ffbfa087fd8071b3e5d007e4df7056bc8142f7bac5c28fbd25645f7016166a1bdcd881667a1ee2df5ebe9ea8e7952b83f9274d0c5411041a7129c2471ff33940c36f0b7e6f2e0a6419fe198c851000c05d1d529db4dee4ee0e2a465e5ddb772f3f9ca0b91e4fa95a55983f68da33fa2621e26ae3823f6c74e1ccb68c52cefcb66b1eb2477807ffbf7bcbbaf09daea7a70bfc52ba6c13f3c2ad527fa6df7e2cbfeca9f175bc11645628ac2b804ec059acb338d7af3092c8be8ced92c2017f96b38ae802649c2aa0f59ad8a86d43e6da76eafee9f3543b57ac08c67cd8fe36b8471dfe72134ba71fff7545f7ee08a61993652b7cc78ae480d9cca1f6c809fe5b39a04fbe70a0bb16affe4d216bc9868a5f334b4fd42e9b5b5d3c99e5b5807bf15fd01b273bb3bce86206813762a5921e6dbba7564b42e3744485a52db222d40dbff71bc8080fae3504672b71df6e0474461bbc2901132be91540b1325f7d03df47a42f9aff2b31ee38d164954e7c48081a6125018f55db45a67446b522f94403ec5f8b75c3c51612fa378912e289bf6bad38a478719f602cfbed7cd461cef6a10f0eb7b9452006b7c91ca1f392894d372abd612d3837b3211622598b33bf8185d6b188fad70b101f82fa27531a9176cac75c144b5faefec319e52f891525f29219a70c5a035ad76246821b944a5980053555078d2a793e437636c10389b6c4cab7831b114eb447a4aac8db5e311cfe57ed096c45770ee4a20521ab2dd71b5fe858db6d78095eb4f6dbbd2ab20c5f5f2241c1d04ab277297e596583b22c2daab37383daeb904e17b09aee6abbfc1fbde377d19755a5b9abf36ac301e9289126279e37b66a799ef25df58eb0aa629c17f2dabdf032045b199f4f2318ba39a06fa74af325a2df9f4add325b2f1d6eb0faadb0af71812ef6732bf3ade8ca241b7d769d1041882f826fe32506526124b38488ece4514084a18e6d9e3aff6a1b0da824321cb0215850546f46cfb9b45331b1b3f8f55713ebad93757a7780815e93ec387b06fe49f9a9b4e2cb50fdf576359448011443a5e9fbbd79bf993105483e0fe6baa55fa891dfe663487dc36d967444542966e4b8371c92193beab0fcb00080b381e1f1f51efb030f014b73e56cd1334a341b22437951afb442dff6b9b0ac6b298018ebdbc6ff342f9f8638e52c3b497cbfbe43a3a9a89527f4b3486b44b5fa28209a7f03b03400e5c603814fc7751c5d4eb8e7f43a883514aab49291f3b0f666b2d106d25b383d8eae67f101eccc2457070b7ed8401e04bd265968cd5a5a2abea78d09980fa91b460d44331a125da2491efdf289357fa8e08782c4029ff1ca7e8bec6e5d17327d66963afdaef86b62f788a5bf2420297f7f00f8fa64a3df9edb4f24c822d711a522cc1863335fff1d202d66a9dbc8a095b8936a42566f7c7119711e235cdd964a291220101b7a6471dfe11477444fc98312022e4ca94d97582ac38b041488a7a8a5b8fe755b4333c1ee100d82c69b737101a28c45b1d0fa26590203687162dc992cb66af3ece4a49174b767fbad1f457ea79115cd25da14c22972b1cb82ee949d699e2d10ab909d6185f211443312dece608c410496342d37a5cc37d9a65a2a8575771d4f3f2da2b98bfd8fd1e0d5cecae24983bb9840b121d3cc0966200b2b370e7b5de42ba0b4d8d41d9c4af0d837be9d77073f2dda5c3c3cfd87c3f49216efa7a5ad7c1f1277d8d2726eb9bf95ea05751b59252b16cec1bc743bbfe38b421e28ce6ff60112a953ec9f2b46a9e87971b1c219150499b2a07742b0ba972415b8d6536588bf60c785cd9b615aef5e998b5549a3e2e99655197d6617232c19baa125ede71d1544bf63cb3f29fbefd7b0a089cd0e445d9e186f8e0815ca7a272c57a4e753c617529337a4fd1ebf58b7029fa8f5d6dd2aea51c0dc7186f401561ad7ae245ce1ee6d75f2a95cf2e7b527335ec40558ce62134aea9c3baa462451257ec22937b4127220da699ef57503dc3685f70a07098546dbb9e15f2afb0958980cee5067b9034b598a7140280774d6fc35379b9422ad30f14c5e78a2cd70a637c8c8e6ce9f73c6cd57d820b318ca52a2fed450b9ffa15fe6e5c09ac00a90c8856af83fa5f2f72090c96380075cbc5c282e5f3820c5ac754d7df10d825a69865779e99722fdda9d27305c6e58ec53c36cfee73415472cf4fe595c5bcf98f7f08f60454db9851da83eaa40df1f65987d267f282e76dcf76724941436533e57c1e2fd1b4f8314f9f0a8636ecbc303a5ee80330f25840a0665438c1c48bfd46dcd1dea44bbe4125f556fb775551c2f5f5b016f6994fc8c37b8f863ff902dfc9f27c9f967ddd6e16937b5ade110871a67fc6630566d8d62cd96de714e6ffc37f2be45e5eb9f830a6384930bd197ecc351d919ae5774ad1e4d0c189248e7546f1b4509709298720d62a987bb0507d2592c660c500804d3769e41c16e4dbdd52719781cd29914d4c20d5e26ebafeb74f29d3f677050e199d59a92fff134b31bbceb8270ab39dc1162836b7242e19710625f0e472b8ddcb539330e91a2ec8f3adc09e333e051dda46c9fca1690e163aa86076124062b378bcf5ce874aed34a1fdee4adfa1055ab50252f9aa6653ba7af12929590e8e968a64278b7c419ca6b66da006da2c3ecc4c2b07e1e8436680ba43d6317413e3cfc19f5a0efc51a7490e7f1726c8389702ec3e7dec475dc29fe70f528762d3c3e7d7d5d4af945b36cabf5a8eec0098f9afda104cd047e350929aced37fea766e078410971b4c6335245168431d2218e1ec651d662bf4f9cd8912e112b8fd514c7171d4b308fa5630d1a9b7cbc9a2dfd4c6e9965896a332ddd4ce63b6d6b09c649b819d7398e907e4e410794b47cc5fa6c7e3a96554a07f73c2eec9b4fb6d36dd66efbcd2fed7b7e8c7e8b414a55a200533d503fce0a5bc44dd42e66ba9fd5cb2a5566722901d4732e8aaa294b99c8c1aa0d392a471ab8b6c0210d3325a6800f9690cf17dd754e7bb5b4ccfc96bb5e7547079160999a15474729c357d314920991668a98fc9927911b2e3de50e94237c45aa6ae7c6d18df96a3820e2d310222d98c589128610d7c2ab528cb058aa338978ea4d15450990dd8f09ab50855c6320f65b7a50806e7b8ae44f410230a6288358d659c27266778375a18d196f573cf2ac2f70b38f4564a6f1e87974e0dbd224b5d31b1294fd96a6776364b04c3fd56536ead5fa41bdc7426018ca9444ce62754008e528a38c004f00377f6f95aa9133ce08ed28d7fa41b2400488276163bd5e7aff4170b8c331f3d7e6a4f43d6e65b85b044c9c8fc93f2736d1eb3af93b7e02c2221f09159d43ac7eb6a2584d8ed1855ddb326bb1e7c8996db202f29263b5f91a02d1299671f09d1610e919622184b19a919e8182ed2752d7aadd78f12bca04d40f4604929b1b8a5ca5300bf840433061a65050ffed40cf3066e9fe70e932843464278125a841a3075ad071c92a92daf0a5b9bd75e93919662401c3b76a60e75f5c88a103eec6b07d9c9910b654e4d488a1f05170b8904621a259ad8efb49cd9f68399a5b1387868a24a2a8f15e27df047ef4a679bf8eb45f30a476d81768e2cc215ae735eba04b6d7f285f32d9a1b5ad05b6557c260733b1f3ad7bb83093c12e0b21102f9002fa710a01e31bab0d36497f0642f24df195d7db972afb4328aaa9e7ff814d0b97fa4e383afd2d0f173b927afff3cd5a5424e6820f62df67ada49df2fba67c4fee7fd1491b29fc153b9089f5e17e99d0dbc722813c5ca507758429b133c8eeca7dfcc936d3e2802bb5d7c2cebe0242ad0339dab0abe670a8b0e7baec29679f75e9732c33b07841023aaf08ab146d400df800459d9aa6233ada17ed60e96aa5c52ac370c71c9f73da0a9e40ac7774a48a363dbb7e99308e40da4adeced6c8d843a25356e7d579206c19c46430b196f021f5410165c7a949810c1239d434086fe822762a7e2a211b38466496cafa1a4da33998819c1973e79f9accf79782a0d8522f20d64107cd902e676ff6315faf48525bb16056b7ab1f23a8c2a01211d045c04a75ddd87b33e7b1e02ab3f9dc5ce0c50bedbca810b55017596dee3c827ead761224af8adc5ca2bd126a76078e810d2114239185879e8b8440cfce291a39fa2b61c935c53e96dd7c9174b5e801cd693e55bdbd838947ed868f778a53526e1c68128ec640f66775c066e8e904ec51bb08561c32077c8da3673593435858ad11da2940161ce9cacf073a9f40ef4aa0b2c9681c37cfcdfc03f048fe09c78054c8395434fef6c08eadd294975e9b776513c59e9e4dd400918750a8abbcbfac8cad602cda86885d10ad7555834beb12ba41aeaff1b8d7e75e8625d1211efc9dc58fdcf0d3ab453816580968534c728326f6be899bf68464896461a1440d66b8419f489ae033513ff21ccc972f838794a4b5c8b7eab971e8e3f15374019edd5b56cf7159fa5fb98c14be31ff1dddee7125ca5108f43bdee2d6d9f9b2c918275da56616aa082ab4a8dbc076f0faf7433cf4c94086e72907485281a3634421cccfbee91f489ddd281dac893ab49a0c207ab445c05dc7dacb583c3b7f659eccb2bab17d0079feaca996e72a6e9de585e32eb8b080d276fec7572ea5e15679d0f3d45cb78b0cdcc6c5acbc5c4f3e3e4ff9d8329eb3858f97898fc0683e7200776541eb66c467855dda0c5ffe88115093adc0d5456c856a16397f612bfe72efc67ab20250d5eb58f4e00172668cf6f8d3f0578703d75d3b239ca2d5d760280facbd90140103ddade65010c40a9542ceb88ecb1e370bcb8eb88649d991ae7149a84eaa5bf25e1ff25826417a74aaea33b61ae7361cfe5bb0a985d7089cfb2da7b8dab4fa34ed7765c03c49b7b0d1db576fe1bc61e3d2c57319cba49cf8a7a16b10d5cd318aa4d9a692467d7665fc3cfd3428753c8b15c16398507ef9ed6ff658cc0e406154ee066138997762001d7d84a53bc10cd7e12acc34f4309d4f1cdf231a6fa2958d16fa452c7e511b91d5274b40a3294dfef81542fd69e4f5d7290cb7fd316b28a82f52e6ea202972ab3d5a6638a7327f332ab0c198fa9e864436ffdbb83a27f41079f5b7745a11e7942ca70b22e7a1e01c15a4f9d54c3fa47439956771581c0b4d7d315f2b160af87f59913f4431a5529e070ea3d1cf5219ae6473a3dcdb4e7def015a4613707e7266427e72dc5ffb3315b6a9c0879d88e43f0f872e53fdc9fb5ed50ef6536acce4f8905ae5f03b78d60f78387500e42e41f42f352fbb6655ec2cfc3d1275656147054fb77926440c4527a9a74280e1a224c7037749caafd83d3eef415be09f31254d0f51da71191057096d373147b23934b442dfd0fa4ee7587b54763c8adc4c619564b4b05c88d50608b41607e88545f8614ebb7cb9a47e9d2c7fca9802a0b05c0798151b45f1962c61defd897c5ff5990690b1517be9ff29b63c2f4439d548900f290bb11e0b37f6099722c2a8d52c7a71c1ee3141c525d0eebac9bb250532c22ce510003fd504a4237247d42e99677b88edb59ef0a91097168d74ce825e76dc192","title":"1381. 设计一个支持增量操作的栈","link":"https://leetcode-cn.com/problems/design-a-stack-with-increment-operation/","question_id":1497,"issue_number":6},"4":{"day":4,"pres":["栈","括号匹配"],"tags":["栈","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个经过编码的字符串,返回它解码后的字符串。\n\n编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。\n\n你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。\n\n此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。\n\n \n\n示例 1:\n\n输入:s = \"3[a]2[bc]\"\n输出:\"aaabcbc\"\n示例 2:\n\n输入:s = \"3[a2[c]]\"\n输出:\"accaccacc\"\n示例 3:\n\n输入:s = \"2[abc]3[cd]ef\"\n输出:\"abcabccdcdcdef\"\n示例 4:\n\n输入:s = \"abc3[cd]xyz\"\n输出:\"abccdcdcdxyz\"\n\n```","content":"096221cf5b628be1e73e8bcfe626c734768e278a04f8088208427f247f0e0e2b13ffa443ea6410d1ec9878a833a0e65ebe221bc49a2e129cbe22b42dbfe7b231e23168699ed9d2bc0d26c1aa8d98106c23f6748893ee66f477fa654b0266256db0a53fefe6414a444360493f2f3825348314cce6efce2926f8275a0c890d935aa8d6186b3b463d3e45c128b70f9331de2b684feb5b6445588da61c16ae9fb05e7d33760b27afe875237c64fb8877175a25aad5fc7a19366fa826e86c7bf61b225baf5df8686427d864592f36ed21343cfe01ae3a6975ceb9492995976b1803cca3e3b41dd9ae4db9ff3104f5a3d884ff080c51c949a44e314b5586684c2942d5ff03dea5e4fe4dc5015f1671ed331a78988c996da600fc3eb49cb40ae2d161fb0a09aece76c08bdc46af791639f4256495c515029fc74dc09a6bebdf778a46871d5daa9c12045352a5a36ccfcbf84848272446380ce1926ed255c4dc6c3617e7ddacef3ffeb8008963123f362f2b98df7e9bc972e74a484d3a3fdc59edeea56c07845118673a83cf190bdd216ecd09358f312ade9abf75b9b16304e87b584757fd801d13755ae801bf8e284ecde9ba04c3f981d8c032c960230c63b7655ca3a8b811a4dbec12986f409e3f5c4b6057130ad062a999d2c2e9bf35d2d6243e56d453ce532a019afd0c87aefa602a352abaa6b2bf3bbfe7238ac30ae97ef2c760c7c4792f6b638c6fcf0b8d42fab3f0d7191e92cfd2fb386eca7724f4cabdd8b8c24bb6f3df78001c06fb054cb1fec1ad7f714437080361824e08e7907d19d70c16581f0ed3fbc384b9650675474c9a755235b1789f3325f569e4b7066af89e4859c6dd735bb8b7ddaab7a18b6ce3fd3e19ccd4c9c3c5c0dcd92503d1380b3828424128240f23738da5f460712bcf3282c2a80a21706ac1298d76c4462e965d3a779a1dc5f93691b061eebb97a72e1a6d3e973721c76edca9d28970dc1ac8ab6086eb069c3f0b3085363722debf24a2677c6d81d9a2d71e86b59fd5563dced476acab2ad762d2d7ab83dd4c56024c439356ecbfa5ed2db80c0a049cf93cb4f939d16452758a82528c30d30cb41cf380233884e89feb09862164eecbd3a6314ab26915af793e7b4dac519b5b9624cb059f450ee8e7a544253280aafada2a754a3b5b2329270b1eccdad139343ba9abda15b60e0955493ea0a648f00f44df34df46eff68ee3dfe9d8d97dc43987c2b8ec76969c9390497fa1df03dd3a8f61b12c7fbe6feefc01bb5200cbe149b8f28a317555e4e99eec1d6423a2d5f95f5589fbb089ed05a6e74f51e263803f3ab98427978ac349d2243db4e781d19172ff2f72ca63b3422ec442fa8c6d6c1ec0aaaf8c80aed58b8b6e2fa786d4d6a675f53806b17a85bb9f911fe1b297cc99375494eb3eabcb6c93d6f92a447bb23baba496ce7865ae8993822978f2993ede19d70bf165c166257b6aa518be69bd41cf3a96b46b87eb67bf30a3160d8eb42627f8d35f5c54584f309ed976779d50bb0a730da07e8e76e5d0f81289b00fb8530d8381168e529ccf84912ffff3bd0be9d64a2a812fa6edd6af42abe2ba9a9ee32d02811ce2dd9d00542ef831fc35315956c01d889d4fa60f5a63003a3e5d625894067b05c29b9937a01d92fcf580fb6a44f02e3916e2d888e39cc2d25637b00ec3f8397953193a310cf1f5f8f05a0005d6a8b87296bedeb8223ac703f3a893843008d24a94c77387545879961e790c37d54581941d2975a99c61feb95c280b243856f284f8359248f5e73a3c0360183ade3a6aa673de9f8d375b7041d9cd4e13fb2e2814a1a85db98cff84f3c08beaae7b1b59243299f3f3e97993e36ace74d0c3f386146d34e0d7c19c8f036bf0534c77f1bf098e2bffab27033bb0ef43134d203c07e9cf892fd3895bdd543db43397602a24674765ffcc00e5ebd6ac12ecd8f43090b31b5e20fa05eb08d96fd344f5fea9f1157e9d3549c5b2ebaa6fbc78922454f50ac6c83137e6bea08fea4f0d856bfa6ed522ecc238574aa2bb04d576fe4a88828176f2d58e7bbde55c8109f8d105cdeeaa6061812f6f7974cd2af1af5528d14d82609d221d7ea62516939e89bc92880d7c5884e4e1e8f82e2e0e4bbcf31210a50baac295b4063d5e38805f6081efba5bc9165be1babb7a366cf213b150903138208c0c1ee862e5c36106bad3789b4825dc52dcb5db9ac13415159475c50debc7615424b410f6a0a2a6f221041ee636b9280ff75415a239f90fd653251727182cf4f5f3732cee7737db1b5578ad866980b13ee691819617b21b87b746e6e30a94f63cddd635067d92d9c1e0b5e8606be3796c9899471895ff5cd645f8cbcaf9e1f878895612e87a317169de339304fcc19c0af019f62aac6585a7098b84a96934699846e1114a99a4b429ac6d46b5afcf74d403e198aade53f4d22769aceb0d426748f1039a434fa5d2fcc3926ab50752d7ff5cadad0970c00b22dd9fa2ab1a7642a93696f130065cceadc5254187ccdc6ec66eae33442f31e0cd03f547f9b86868b1bc48fd274937b6ca92579882328fb0d5ec529e3a5314c482a92a99d4eca38a97935d56f3f64d52e60f5316823a68e69a1e0afd6c11fb0dd69011301e2b0ece4c030932cfec0b7d26c32f7b489e0c27f4df78fa70a9cebe9a9d878647e0d968856fb3afe9beaacce2822660610b32e5e331702d49387f65f94640222a376a91ad38137e40748f3a9cb48955a9ef64dedfc6402d2685002cc687d8322936feba8e8fb6ce5c7ca4dcb872ae9832bad3fcaeedd4d170763462f36ec0901f1c63b6a3dd9ebbd123a2019e3cd297396d052da651b2c66a6036289c948b1b09b34e54eee2e3791fedb17aba5e27f644b59988591b4ba4b0754a60954ad235893ca27cab6efba09454069ba1bb746fe44e9b2a1fc5357392a0af937cbe7f4d935dd906519b3fdc446c0a1043c528620fce26f6fcd00aca1e490a397028a787d9cee0ce0869595460c3098f4b1bccc771424165afe1d5ccdad292e293454418a3268223f352ca2648d3ffba5b2f400d092744b52606e5d63e25cff75c41dae8039039aa30986223ee0f36aed46558c0c015ad12061575f6beba57e36dd84552bb468816db71ce60e818f5625a41386e6c54b8d7cd709fac534947570d4ffe07af5c304db21b2b36f2d961cbbfcc8910c4c23fa311d0f9d1f7b866ac221dee11be772b710fe02168fe40013efad940608550a118228df8f3b0c7c04fa8ff9df4f257c61b7580d5b2eecd3eefe2f401672f7ab8ee5a5fc635413e81c829d3483f6eb8719f5c5b54051fb65fdd26e09c4e3cc60492546c7691515b014c34674e08d81c3ba4d6b6c8c893e85e826511cb2f1df3919866e2f4118d7c5c03c090d1cbf39034dd4d92c136862a3a13931dc698fd559eec5d8c0f168ff2b0b7116bcc984c5ca97f99fdf87a65262406c2d331a0a82c24e83547ff835ad342dac8844fb1c14f30365ce013b0ca79eacdb6b4c75964a02aa220088dee2b1c3f7c0d1c289f4b690f69a5ceecadcfb34b3fb851d87db23ad50984d426e290c6f1d96c63a0fd44208c4430a8371c8af05534f2711b9ccea891845d6728969b5af0530747928940843bf48b431ae7c6d48ec59ce7a7a5dd83609aa7aecde79a9fa3c784e5929488107a351150ed4061512fd69a01e775208322262f1e43e0437933e0a8bd6fa6dafc1129865bed52b12f26f05ce2beae57d24ff4770ecc5f4bceef513f6cab3752d24c5f1fc088295af66e682344e21d91f2e966b3b79e0e87e303680853720a6d26339b04d36ef89cfca73f727c9a2faac1e3affa3f4b29c283022dc2a4e2b540de07d4f633b0c0de5671810f391a244f18414422aa42c1d2c676a08d7f43889c091e0d21055e7f6e815f9edcaf7d83bb391e1b652b115e7e5bef13432b934a794846019db02adf047afca603c430a9215fd117f7785bd17c34bdd63530ebdfc7a22fa62193c95d91d16a45246d77df0b28b31ffad09af33264dc228b67daa90eed384e254aeef161c2f8e8230bfecf967fd4d8343ad15d58154cec34ae82c68b6ae3fc3a0bdf8f60b70fa650c9702b30b9e0a8a3453bbc138b713e96c4838489c596a9194779171e7328503eedf072a98a2849d874cc96d0417aab547ac4bc179891ebea58b16bbd9f8b91cfb6d54a7e6271c37e2cba41d31fb46264aa7d54a7ac534131cca49c85b9d8b9ccafb189c8ef18fce5ef5db3c78cf9d0ef5c5e553d629b75ca4659d475a7b15baeb93d323929eb2f01ae8f0a3214531db13319fdb7b6e2e94c95875e18e82e0c24a2f3d3768a71aa71d154f828d56fe0a104bccd0f131acc19b75d378f3c307d1551d467d70a7f6f7acbdf5d1d6dd7e8a00ca91bec447f60bd6d1349e5b6fa1953bc0f4f56eb5d62a2f8ae414c1f7451bae9e8b88f072fbad527ec156aa7ac428d956b7bc6fdbed5d1d0bf5566d985a33142712a9df1e12f2b4734d70cd1de9e7eea472efb49e7f82a79722c8678daa4b236ebf718f4b983c2aeef0aef7dc871c045c1008b5e81b79e85c18aee217755ba4b361045bb6c2e108da0cbbb56ca668f39642b509bc7774f314f28f5daf7368ceba27ca92fcce6da13277d247fa7b7701486455c2a804af6c9403acacd80c97ecde31d84f906afef6f7b83951662c13fbdac36aa56f583c4b6837453720bd8f37092b6413286c564e67c8f4d4f112677ec8fa14f78ddf5981366f11ecfedec8b7ac89e7c9061c31ded7d96a535ec4631b5a633fdd02a5ff33fad014db72febc1544591f4b530a7e3a449849716274e7c49f2361bfe34a34af426f6db68c6bcd588d4638b103f0e6798f1e31e2afce4d93426da43c6282336380a4f89d0002b11a285745f385b23ac4eac30ace255b7fcd8c686d47afdf3209f2b58dbe473591b2820504f7108967d655b3ed0b14e3be1465fcb268cc3abd4d56457e9cd4c9b941e3f45b09a9c3e74128417399add632adf41496f616a671639523390cb35b0862f09f7040c859d96cbdbe622c1d127573c3083604b46b43eaeb7c4ee7cbd5ddb565fc62bbaaf22a788f61bd7e6ce433a5525d626136d113c75255ab77f5eda75d60b6f5e0be8ab949b5a1227663fd468770bdd9901bbcf6099a02203e064240f04746f7a512d0998a19e45bc0a81701f9968ad8a2fcc8eded595c90f1cf5cc86c611547f90aee4fc2163c4e07e4fff5943528c9308f33cea5a6a8ace9347b34920239057d2c161eb52d9dd1337a6a0c0a7f59cfd017117f31a808f98c7507609a7ab0022c427a9a89d8acccfd69ffd926688eb91936ec64e56c912caff0a3db2514ec93dd0c56e1a31c7744b0de990c166ee20b3b36b9ae8afc6b6039afd3db778a4c6492f33878cbb1c9d0b18d46e06abceab765b68e29a813a77561a19d0d32a81803ccaef571c9024ede34ccf27e78146797fd68d1e54d737692e98a050547e69b9f97226550bd262dbc3359d6cd6c03aedb7b9e42308ac6cd681a355ada181141a4baaeae2ae8b6e8122124a463a5db0b5b79fa85940a10f904e0bf5c5ba68309419e78c15b236c4c8c3818baf87eaaaad31540d3621d1f0adc0243699fb17ec892545802c3f60b5ff548ff8684d363403bf4365e1566ee7a00712fb209f39ff59c2660545fdd6d39bc9bfa24cee206cbce26ed2d3e71aece1b99d03b3035803667534bf4955b740911757c980a05d306655a1ddc892997cdc3d06448083a6c180e09d2a5996e3175dac0aab899cb8ea14f291b7780df0445b14ea8d8f41c01e825dd1667dd7f67b3160088fc825c64f130bd88f48576978b405dc9cda2228dd145b5b4ed26b91fae27343efc2b6ba8e5d6f3b58903ec33d1ae2728eb388db0537565a8d93d68fcfb997c11b51ad5781e25981c050c9fff342bf9ea5ee32c4e41e450d4c83decfed81eaf08e776a5b3ff2757357fbe7a84a6e8d4791cfc68b3c5d17544fa50f850a1104fc3ca582c459f1d881b531832d9303c8a883577cdd1593dac991dc9e2368ac03cf02f4ad30a29e65853ecc652ed53ad498beb5fe86dfb9fb589e3bb626c66e6ebd87fc49b4bc5a9ee602ea6b1e39a6eca17b1267130a7fe5329f454565e55fcf5fa04cc4e4fd8365626d4d24ca62c16118e857c5b069699a33c276443b9f85381f7eedee9a3f978f68a264458d718af78c54af9786f98e666359665ae5b37d35a165cf0f3227e0fc7b470fd7d7ea18744b44b34f293dddde06d1cf88e0d5bf64789fad4fe9c51fd158e04ada7cd2cd5284bb16626a0d6c412da83063d71e5abd09bf0284dd1b02963389b584ab15d58740fbc0d847bfb434fde6a0e2cbf5caea27e9ec9b75040d0929ef64f1c579a81eb4ece1b51dffe9a0e305d43b814017aac0acc16f0654397ea4e7cddc137a80618c18f5cdbcd9179f8dfdec267dacbd86cf7a664e5ac55e6485be7d842994195faffcfb7c8a18d85e8b879c162883cd6638874456b570c897b6b6d55261bf9dfa724c7ceb05e5b1dcc42c81143e43c6b9b68163ed2ff521ae0d7b5a27bf214665da9a6fde45cd07abfe3e112491cecdbe7e00adb0450c1f67fa311e7536d2125e17eb25e10a0c94216d13236f2a7b8fb4238685d20d241eff845f177cf959a8c9aa6f9a84bc6dfd5b45f165ae3afd370c348e3aa399977c5e5e419103f2e32e90f8ff491b3e6f4139a081aafe143b23f3a3bf6de21d46c0266a52bb5d528b0bc62d5c90dfb357a425ae1e329d659f2c07cd19f44de3643118b18ddd3c8c2073063848abe537ca6f14bc1e46917fb31943c492d85aed6fe4d4030a3cc2314dc60963c326fcf7daaaf9761dc405aa33a921e4404ee2e3367c1fa188ced6beb22b88c7fea2f95a82d1280e4a3bf2f37e90859a05becb9af3b813324ebc88b5fa57d92ddb3a5872536d030c753259045ae6bb8a1a1eb5e04f2a8f33b1e6488f9317dab3e3cd3ad1ab5719c6410aa2c8fa6e3f8d6814b45235c3125dae2b33a715768a92c3a5a4ee5d6019f0dddec3e8aa61f38ae80395e33f933e13260ae4995880ff72fa8778f7ec477101517cbddd04beb0a2f08631a8b21330eedd4754944c0ca4428d66f6cc62483eb184f05b3c8efd9dfad3f703159d0f1fded36099d056a406f59243e92c902ba7063b38cae19b1caacb8caedd889a3093c6a2a27390cfe7914e9bb83d1969a180d4471760a4c69649673d1caf85740c3328bf04c2a197c76a266f2f30c69a65d97507cf209011e48f6ff79be06dcdd9839edcff262ab0af7ca91e2d201e18f72a52cb1140b6c2c4c40d82835ac1bc28829633220f3bdc2bacad5d7969640c5c3850d7727e66111a1a442a231a9af3e2a3b842f51d6cb96a1d44d191f4dc2e5c1e80ac7e910de0fb25efa9592076f5155f248a1c985ce4507e63bf40d0580274ab9a380a38a5b286cb25f6237bafab9908e751be92d41b118d91dbf596c3bd64685c0c6d67204a3fc4a59b5ccbb86caaca95f2b63824e2ef48060cdeb4a89c360e3a6bfa0b9e0437cf8400cfcd48d8fc3fd46a8d76f4eb8947b87bb77cb6c4a851222d58796c723a311c228473579ddf7821388fd85e545f9e530e10f7ac4ebe4dd439ea8c4d5add13d9232ccf16a1165a43d1e26a66977fb36766c5c8508a869ee0e8982edcfa48b9c1a62f775396496aa68b9d1ee97cf78e1f3dd6f168320bf5c4ef0b731797fd00ae9a87281434f03a65261333da4e2201786fac588cb028656a079d52e34300072245f21bf81c3b6d52f41817134c9c564d59363d1ac316f88518c810415efab0fc0418717b3e4ca79e88a9d9b721202ae1ecbc7c9967a7644762dc652acc27cab330640e04d2fffba46f1f977deba31660a1ab2feec8a65c188ecfcd8f462b84b0bce5f3616ad2556d6af9faadb35a3aef2567299d48bbe5ec7c4c1b49a5c8cdb58d3bd03391550fee4192ed5e9e0179b926f251462a49e6c09105f402bdd5903623d35b526121ea161bbec6a14f3b87c7ed82544a654069494492eed8808d5a67ef03bc33a2679782ff126e63941acc21e2346f52825619794c6ac51013864346dd401dc6e58721a007dfec67a2f71a0afe78e3d4b8df66673d9169c25a9eb306dbfe4b25601241228322435df2ee96eaa46bb1104fa2b70ef8b3f21929cfbb6db4d8d5c91ecc4a2839e710a74cd6df48580a72c30dddf34e76a27076f06d6fb45f5597b0b222fb2697883ea20e1d94496993c057cb7d294c1c36736dab745084058525a4d27ddf7a1f3b2ef24a610f3177341ce34fc4dec2c901d56768c451291c3bc09991556055b58f3c1357373ca43de0459e3730e1d0f46c9cc5e5388e670bbf6a4fde46cfea7db7a725923ce752bd0c157ad6452afa178a986a0acec8af1b92652caf924c4d12289c23fb983a6533ee8f10b051ed1bfa998039ddd9b1cdd0f395d88ef284e8a8bf6e501aae1c85c89efb7d961362d036a3e14c8b15e066cc38c9aedb71ddc70e6afdb0a2f0616769e3f428122884e077695defc894b72c8a9572ddb45742f3c5e78f83ebe4233eb72888fd4acfcb14f58ebcbc81a63e1ebec70d2d226a5df435ac9e83ee89e4e92beff1cee4bee8b593fb13b58c09f4539a6bd3a401b8635f89b69001428fc6bf7cf9ae1c2ed5454b59734ac918f4dedd1b837cd3573d10cda0b7d4941c3d86fb39402c878feba03a5dd9a0618c77cc343f29e7b5c3d3aece7bad877dd1856c35943dd7cc2b84f16a1fc96464ead7b5ee73e382cac6544adbdc76a7b9ca2cb6bc0b20b99425ac4b4467c448024f15499bda9e1997a46dfc30074dde6d12ee444880b607bf7f2a66ae079760eee625139565fc5e5f7ebabac7b1de344c8b3eca5d71efe125ae32c3e02a6d5e5400cbab638c4465869be4fd9cd0b008a29b6ce43e7f489c6b6dd2f2e1dad4523bef1c04b28e02663f8bb8800bda77e48241985c33895e846917930382ffce9d6850b6e75ca7f545051d98e5dd8490fa","title":"394. 字符串解码","link":"https://leetcode-cn.com/problems/decode-string/","question_id":394,"issue_number":7},"5":{"day":5,"pres":["栈","队列"],"tags":["栈"],"whys":null,"difficulty":"- 简单","description":"```\n使用栈实现队列的下列操作:\n\npush(x) -- 将一个元素放入队列的尾部。\npop() -- 从队列首部移除元素。\npeek() -- 返回队列首部的元素。\nempty() -- 返回队列是否为空。\n示例:\n\nMyQueue queue = new MyQueue();\n\nqueue.push(1);\nqueue.push(2);\nqueue.peek(); // 返回 1\nqueue.pop(); // 返回 1\nqueue.empty(); // 返回 false\n说明:\n\n你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。\n你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。\n假设所有操作都是有效的、 (例如,一个空的队列不会调用 pop 或者 peek 操作)。\n```","content":"096221cf5b628be1e73e8bcfe626c7347784218a04fa31bd094e51256922010200f19c5d26e68d9092e660af7dffba08f46803c2903e14deb929b72dbea4fe2efd717a7794d6cdf604308dac848d517a3ae17392d9b0199b21bc68dbf4aaa28a1431db0862be8861435b443cea542d78f736adaecbac7434af8dd8da3da9927f8fda0055355d153140cd2896109331de26736ce8595f457a89a4312dadbc9d5e5e09702f0c4c61ebe6c422bfb01863484fc1e19e200d958d77df6cde35ae1474299f14bb60038374adf77b64ff5b751d8e7cb0571773a0e66759e8bc00532ab6d4f7cbb37a37a27472a3da39216b4c554d5f57afd1c12f3a0824ad0c311904abc45584b9a89646b3464f660cf35f586bc0d68f20fb0898a84d14508a244dc0339465f0e405bd9ea228b1335735994f6eea8b2d56e1f700ada615b8d819ec4410858f601886a194eb126b03c3b9857cf6a6ddabb9a49fd950a327e99b3720769de2c99427b8db1de3ded8b6ffc4b42859ba0e64b4af423b322542b54397a5b31278991a457d73dbfb4b53ed722fd56e8fd9730895c08ccf5703849b32a2d8bd85387dd19f85b220bc1305fa8b02184fb03a251d3865fc68eecff6ba379f8e68777486716f39831981896bbf98acada7e49c1ced7e1e5f2d1765b41c16effeae5997739eac9e5246848691fc600c39ef19202b75f32e39ae1e14de26f04401d951012d1f1721b4146989688f03301817d0e04b570100f6c36eb2844c0eede7c89f5bcb533b13664c40d104419dffc28da3f4c13b0a138e07848004277e1ff10e2c6a1d16d4fafca8b9440d7b58439b5a4936ac6558848c3020cacf4f7cadc062199fde3102b0db6644277c60a43031f9cd2241756d523f3d57a7e459e48dbae29fcf88d26a59b811407aba95ef4853f5c61187eaea358c32a26a8ac3d27fdce3b40ff11875c87e0b3dc7d0e582657d4b8e960f37c55ff1abf98f71c31ecabe538bc22e9d142333a62dffe90838f34be48c9d14215158d06976f9fa1165cb8c1084c274d60b4f036cf1d9cdd9ebbdd1001882adc24dc3b88cd0e8013352ecc966b8451638b0df2c8665b81bd9aa7082033d87cf91e939bc2d72cacbd3b63f54a9632c86791c4642a676997b8b24eb399c5a27e9e1a844103281a3f3d12b7247087b23232d0d33d937981e576bb5f18431d05a343a3324c4e0688942518548c30ea0d0e1a5f68e83cf1d9f2dee5cc4b57bd7c582f1096bf7850495678032ef0623f14da68129f42f0fa68f7ee0afbb5a21698dbfac896e5687313a0b75b9e7c0fcecccb3393ea6de7f25f63d71e0a36dc3ad842de894b85a186e7c39b74a760ef928ed5ca92be35f8e53471dd88f402b346249e1cd6048eca4573b11d1f50d3e5edd317d30de7ecdfdcdc6c44176f1a11c2c26db37d6f503a8c322f2581b9cfa638b1a2155044d1cd7fc6dcd893865e91aa84d6e1043e65e3c8a98758154a0fe2c2f34b66c6de46508eccf1550a0ca1c22713feba4bbf7cc94e26be4665a693cc38573e03f424bd1bb45d55956d687e546c93d0a2362ab2a71c619e5fb48c5fb1d15782466c5379c257d191ae0876bee246cd643716faf3b4f27ae8abcc0f2f2affc33ff8ce49c49cec0b9e019d0bccc166072835c897f8ecff58d601aa20e4c880f536b0e16392cd0dc05e3bed8a3f883e36f67c3a8fd7edad6dbe746483d78a2bd4b00b0ff799941516e02e5ac6eb3747eae4591f93ecf17186d1eb71da62a93f79a20419b7964b7a8d0c057d74c05fb29a848f3c63a7b98bde15bf437718873d8b586334ce6c54e05efcf7ce397a94a5ce341778fac1fa0a49df050472b3d4d331477148a13388e49a823523623f9cfdf6337499ca6c5ca9e2c5410ae899262a657ab27033995e0ac91c5236c943a204e67f618b548de3d810b78e09d40412543d5dd0fe53d7301c13199af23dcd9173c9378ce664a9f706f8f7590c5c77417a95520faee8b9df15ef414e22acc5c9ce1aed97f65121b18ddd97d12ca62d971e24dc8a3c13b6267afb06ae4567358f67a3e18ad160ae6e24bc2b77fe9a2e07f08fe260e1241bc48f6c7102ab233811fdc0f5d2783a6815c6f4ce3acf65a68383f0a6c2a30e969152ac4d268659d6227b0c88c4876436cfb700ad7d9c727cc988d7ac5d7594924d178eb41d9550fb65bb4549145a985756ae5dd05f47e4c827195caf8c19726a5158171c419cac45f4e27a52a1f2a116d74464f179c7fb791d57ff51b881df939df7927d6bbcfc0484a37958a0d3418887a6504e3b91fd5b2bb33e4b9fcb2e441802f838cdc6af1c571a0fe695b7cf289fb85fbc80a39e11cfc1657a0cd5b1fb8479a3214626c7658a11683f829b0d4e7d307bd54f6782a188821d638841c6b869c04af85a079196aab74e40f547526cc4fb4251782d08b74ba6bcee6fec73b7d78296db0e832426e6cd200b84f4ea6cff3e08d6aa92353e8cf559a8d0842f10a16d45a00cc405af9a30f922daf7901d3c690131dd0eeb036d331fe3b066f3ba1920a9b17f1c5314a03bf6af9276703b9d0bab2c3a341c1ab899a6fed57724199b6e2789abf9dbbe537335757ed233f4b829cd0df285dcf7459b689f1602efa1ec3960d1a113709c3561b0a11eae13b582ad73878689c0b3cdbdc44c57baaf1502dc4e8830bbdd505e27fcef3ebd6c4f0b5f003eef5c4c0601695790c60345358fa71782c1d3f84cdbc72687327218a44c485df33b0a20ee0b79d6163778d7864f5f6930e4968ec121bfdafa7146ce6ae903af48e58d9d19bd0d15e06325d5ffdba35d6201b2d5a5937772a5a6341dc58ceaa4e3af083b7a24e9734458befe98ad7d697415e3dd7857b0f6abc78e11979a14f6478e3ea2efd2006021610b32652f122c546d328e51ab23886a2e6d9b35e2a2c7777c9459f2ef2525300a6e1f18e2fe4720ade5e8e97990be203c7f3774e4e52eaf3abe4c94c07699a188ca1f3afc5a860744a410c2e8ee3b5d9ad6169d518980d2ab9b6ade41e44ff71556b5a7a31425720ad01952ecc75c91573d3d2b4533f6a0f390445b20a05c1ee3e7897ba14848ed665e131e5bd3a681ac700148510f1fd1b4457f202604851a2e8a41e9e62a40e65ea19977baf7b5e47c2dc08bd94b7d0fc8488a2a5c22d9cfb03c88bcd9dbe00c141bfbfd04e84a8cb6512ee250d99ea1dbfa42ed48e64305757b569ad2c32e81ba676285409e33662fe412c32f2fb417fad50a70421a1e7f081ca05bd7569584cfc55f41b4e85d39ffb2eb584684503551b7ca6fa5874d934620880da3cd34d186289611789fa8cb995a574c967d3dff5e9728c3237d1a3168ecf096a2a8bd39f66c18a231e4e5d0b2f21e442acc33fa3e2750349b22975dd5cbbae9d5771483b6e7fbeaa39bf9653b94f540f129e66f977ceddef99d00140efebf1ec1f344e0385c7e00789506e99bba88d46b0f65bd2904242d15829c5e92ac6368bf1fbcf1206b4e536d11beb2619cbece8ccb98d09e978a733e9f9a8d2a3f7e7eebdb4a6548fa7a5e2a5fcfdacceb74630a29e0404694e3f75f8d9639088bb99e72082047d9fe01aaf846190e10b2e8db22781961e0823385dd4aa8f0253b37d83eece592bcf7fe67d699499293a1e64041c1a726e214eec7c7066112a1e465c5331129d1b7df473b5c3f37c9096d2ba011bf73dbfc96faea6c0908e288badf76f1d7e26b192ee0d659e6dfc5431c0c09f7bb0c88b11d80daf2e77fc95e1082580e225a17777cf5d1304910ba09862c69bb58343f8279a3b95217c45874209ca0b3d0c3e28334733f54bf20963343e3b48fd37fa16ce9cdbe980332260fffef3d9093f1f29b30c8e1a52fc462d4fac2ad80bcaa3e9dbf49e95b166a6461815e0790fd39060118c8de3f9cfd880ad6e84684807a11e51e093c0b0ee91ebfc963b5045278c4138142c4e93d47e1cf0909fdf0cf603d23d4ac60ca47f54a55121de867c27adc0ddfc6fbf38b78a469e942008631f20eee9d504f36c1d0419cfe633c340ba3f21d624a88fe7ca7030f2293fe86c4ee8df9968e3de2e3a8555c484c6b74cebd2d78277c3a621456a70bd32ea2dc72687a6a5632c2f26db803439ec228a5a171351215061708ab48688e686e298d17968e56c41cac1148d40773584d72792a146788f5cdde121f94709decdfea392aaf24a6f7220c23d39fa4fd71efe6c69c92d5beff85f513c8ba49f9bec9ec6b26023152574956e534398512c11110066e6aed4d4aa5da42ed4920ff07c5a937e61aa8094fd5dc830aea41c166d4e0cb02644b7eaf6e6a8519c9e5818ee221960eeadc771936fe76fc85cbf02f7a97c52e8006d81ceb201a37ddae27518552b422180e20fc2b6a39eafb2cdcee710332bca1d942abc96e672d92a5ea3b1e003719f643c02a34f066d64462e320a665feae4a0aac50560fe9259a94074c6945a848f6b75fae7a6f3d1d8b35072bfc0ed76167d6fd6f1b41773222d8955afe18e41f80a28fb0bf1a6657e27788c7ccda3f776a5a312a0f699aefba149bb34873fc01e9c41933f81aaccbbe8f5bc6f7701f202651e4ca16a5d07ccaaceb5499502c86d2c2b4d86da775f31492ebcc8bf3cdff8f632dd068abfbb1d6b386a38f3ff70099b585c3a9b60ab802f40e2d5a5ef6fcaa60ed4ac4ed1a03b22d3d0182b8f2df2f962aa4bf5c5c3bd90655b692697ae37c6ed7632819506af30ca4d47456e3ebf81e8010b89b4db0f20f417c4aaeb97328b8e56d12f871dea619eb570d81e74bbf273a39b2374a176cf0919ff66b8cf1d0be2a0f473ecedf406d49f1f2e071319b72a65d07bdb0aa9668fa559dca39397d533e0567b407de09ef31b2bf8ced92e439469856462656b0a22d0a1556e44e79f5d75681437e9ce02e6d3a960fc82a7b98e873fb1b529850158dbe473591b797613263a06c63235535eb4f81a72a00a1691638c9ae481876413a8ce45d28b0f6d43a78f8a27315382166b8c870869943a447e1c662c475d077ed5997cf3dd635f9b0a45cbeec28a98ad22dcd15c2a163083604b46b43faeabc7a1678b46fd4c4a857dbae1769db6971587eddb0d331c60c43b03695c2e640a53eb2b20f075d60b381642a4ee94c81f5e6168769a48770bdd9915d09f30dcee660bb221270f09661261567970cca9935aba1994701f9678c6963fce9cd995f1ba5b5db68788965e047799a78b9a72269a8f384faf0c101a84c04dbf7ae65a3290ce895da6036b20cf07eccb61ea40b0d43937a6a0c0a5f79ed7533443a648ceffcf96163c03a2a04534de32eabb94f4c38fc2fd92982e0c2c77559c228b9d1a92371cc2a9025b44e317ddc7aaaf8d0ec3dfc86d3d549e00a3277cea7506eaeaf563d2a9a26e9a256b87e281208cd5581cd5824ca6d5641d4fffadcf252d3b3a6d1889b95e1a9f1e45a64c2ef5bc9029ed24c555ee2250ceb2845563bcc505f4a6f76ee172195e34bd70bcc5ddae0de8430867bc224658ef63306b76e6fc2cdc39085df1ffb7d586f2a1305f292350bc42c7fc25217c10e47d2b066ecaf565953e8395650c1adaf509ab84e016ff7a900e30790f7e068fd530e2b289e8d80c600908a3b55f68a228109ad470eab4b42e688d5f7dc6a6bff3c63a9a8032dcdc223db5d5418457be7c9f51d3c08f2e5e0d38406542f725eceb6c6feb1b0567f2112e64788a58b8ded1b9e5ee79c7f44dc661ad9b5d184cf581a2ce2d180a71089506b48a9b01574907651701d79f1f3fcc905ce7d1ab510a5bf7780a7fa2f972dfa6960b5042a0299a5bd915f0e0132795a3fab54c6887c68abc831e15cf9ff6df728a733d13f7ef0bccdbf39845b3596849baca051836644b9bda809d35bb0a9daa25ed167c1477c2b5c6d663035d6f087f6f0892b834dd4427e24212d6257f10e20d5b385cfa5b5088bbffcf20044450417c0424546a9e8b7db1ebf7601e5cd7ba628151024c699dd5f8a4fa49c109ddc6cf45f047377d9012310328eb09c94f9e5a5dc6486e9547cac40f7f3418ddda4e9470ca6c27f53d2fa2069305c4831094001842706b72287d31bd1cf270ac08c23a30797cde6c7dca5d448d07d79fe9697f4cfdf1c7a1cfe257fb21e78fc9449a73d769ec3f67607fe2a9d9dbda38e17f869020974245b2af77da4fc4a2b76b274170f40b7b12f17038a443e3963c94164da67ea2974f5829a3998cf4ba2738f0f63cac26e39a962467f78ef63b4c29a39bdbe276eabffa4951c37b1d081c10ed6937aca257ba44ad1cdb00c23f8a3b5ea8041cc1bce992d6c4e05fbf8d0e97d3638342f81259cc9f7acb037c688143ff4ee15c0514922858ff282f547303054834bf263979c3c0ea8fc762894a51bf06ff372a2f35ab16625c368411c1b54d583635785086d51f202f8c285170d6b675e670de72557148fb440e1e39e9ce082f0c7dbffbfc9965fca37861ca4ac61eeeff7a7a14fe469f7e9754025dd8ab5e19ea845ccf9f42f016766e03638ef11b5846e28aca72c231634f2cf505d3d1846b1f37589828f527b562d0d6bfc42ff9e8cb2e6ae206b45aa21d3285a7ed2d6e0565f5ef011580bcc4f52cff92aa834bc1bb9b74c171e2fa59cd8080b893e6d45b5ab8034073b7e1b66f058eddec20ba24656310c4cc7d945385c76165ac47a2d2ba9849a1100f7f81dbb7b054d70e78b26c7f30f5d7858aacad2244364bd1898f7c6517a135e2d509d6ee9c4794975ead2bdf22e31f25e762c60bdaaa3da107a6c2688131f348eac5aefebcef47853059c0b8e06c5f9303edf151a5c85ee31fdce3580503b97db92d11c2c9ae1fc9ca2ac3ae33cb86d5d0b2d076d95f863099220bce000ef2e62d300df3998b98fba426e7c1f9eba309d98867421f6fbbbc308ae6f605b684cfe38e017349b2c5b3ed77e729dd2a1e3c523e1d6a333e595740e6e8de4817b5ed1864ce28b6a86a86883ddab3e3cd3a95ee1144a80759aa9bae2f6dd9334bca07678d1212fb7f40f35435c1ced6b0a4e40116518e8fdedee8a50e89cfa957eaf025843c0e6517a6d110e6ba33b4873dbabc132809587cb1bf4df2f5a2a3d270fab45678bbc34c1ad55176ea29ce2df885312d73e1d0a953358efb9bfad5e45735b21d08d48f7db7bb52a71cf9d70fa04fd323ae1c4c12e0e19b1caa9bdee78bc9ce759390edeb379086fbc6518bad616f2ab5ff9a13176bb9c6c532632114b194092e3261f17796e0d48c646f3c4a7d96ce3c943047897be96ab7db2ea5cf9d6dd0c48399e8ad6873e4ee3fe2107d754d50ff631cb84501f589ca9442d18b957333c43406f58ea8f26e83db875d7969645176657afd323e263b3079345a237986e3e6ebc664b50953a96e1f6e8fddf1c92e54208d9c798058aefb6fccd30b6920b4411a3ea01c985ce4032a22fc0bcc114c23b5c834140eb0a7bac366a3227afb1c56ec6087197f4a93d5173f8deea0d4e97fe9d2eff0938487a7324b06e00c0ce46e503b6063c2ad0e4287bde19095b98d30046051e40f98773fc68d0094e748d8fc3fd46a8d76f4eb8947f72eb14ab2c0aa4e532e59782467732d2a26807148ecd86323308dd111010cca010e1af7e500ea45867cf3877f5ae313dd7832d44f831f4169d1e26a66977fb3673befc8508a86c3cac29a3ecef340aea4cf60221dc2242ed7d9df61ac74fe8e4460fcdb68320bf592a04237528be115e6c1b5351475fa67187d242eda495f066245ac11c2c37c24294c9302b610480f7a4ce931f81c69285b8b6059131fc85e51593a6d07d64eb4c4179d43150cd0b0fc0418383d3e44e8cbdcda8df6626b61e8f2a932ea6fae6d4739f6652acc27cab330640e04d2ffb2ea2f15926ca2fe7219f5f92fe5d5a60f6380b18cdd1256aeb0bce5ba2f3ed20d6d77f9b5f8e7296efd326d759d07e0f0e5764c1b49a5c8cdb58d3b9f66c52609ea568cb140d10334e078990539791db4ea9105a647e980c27871ce142d336fea5200c7e4b14611c7cee3fc7e102ac0a6ec8b2f17371a0b9fcf49c50283e12bbda0bd47fca7569238fe29f58fc46badd4eac3a5028017e94b28d444d25a494284368a09732899a3d69b7f9a64577f5fc7a28d3ff352fe9ee0061c44efec87c8d0ed57afe3b08db7e5796cb233a98f2863ab37157adcb34974ac24f6bac170c50ca8ea07d5479742139c506d725cbf473bc9f565f0d7358f8427b0a3d9e3fbab32d61f7eea69d1d607bd92b1e34bcc7624034a6100fe51afde2fd301f7484cce584b1f362e898fb192abe098f23b9d425d61069aa59ecd4ab8df89f25c5336b1efa544d76f6a387b6e21c278cf66eefa352f7d93724532ed4e88e5f1604edd0eb4dd2598e06ad430e61ff8d7684ab21f36a572a1dce8dc0a9497471a22689ff612404042a348aab7743b01a7fc2ad5cd3ade3c19820cc5d996d2d2e5b21e2e4349592976b6bed2e03cc8a0b2ad1d9478877854f7b5da548e2cc92c5b8aef4ea1144bf8ac7b7c01759388a32920a8ccdeddee6b226bfcc2c48977d3c962dbbf5c51590f0a06733c74f2fcf94f88fd4af50d52e2e1c280c8fe047acddb4b69122806da63de9ce7ac8e9b8b25b78cdeabe1ddd6f2fb7af3ac4487433fa37433ed120d2b81dfdc2432277e773fe2e17b3fb41b64183b55a868c0bcb02ec303e7f894e724317a2416d99588c3254d2f838ee0bc3b5fcaa97da1fc38c24550feb9cc524e13f6697059b8c721fd44fc5f43ae5452d6c353c9b55e1536178e6779064aec36bed6c1a58cfa2eb1810837839c22af8df7cd67dfdeddec945e91875af18c0b4eba0449ce6f26dc4f4d93b62cb77e3f75ad1ead63d8fa2b2da767e9755e40b3b6d4b3df037b8c06cb5b7bf60d812d31e9c82950495134d7a754a44772bf98ffd69cfe830bb6896fd618724280684ffc340d3757bbdd65d6ed74ef30194da8f4368d1f9737429675cfc1438236e38021e11d2a2157a69d2e48a9775ef9dbe50e6b115f5d496a626a3e483b3d614dcd7b540bdd414eaa7b5d7bb6eb5bac3b81e8a469acfcde510e38c6b86a05948de50985d034f9c238c715c0e96db00e2b0c49e515b93a2bd9d1982e9a57a5d5c456fb643aca222f0e8ab7bd44114f5ddc7775e52485da213dee05ee5afe027bb884f0bc99adfab3cb6433879f101b951bbe6139a3a07c4505185a4e39f514fe1a0269dbc07ed72935539b3b299a8aefc288f7123a96503e4d91b2f56af499fab2d5f0ff4fd0ba7a0b0d2905064c6c5c02024ba9dbc53d9544a778f3fce7030392aee9391af784cad17c519eeb7322b8355cb221c5063c8b1a14a6ec1478cb5fc95029aeb9c6981758f4d3bbbed2f441df6ff5c07ddc584f1c9c48c794d90df6f73ab857898801c06248423d744510184fef173ce579ce2b4deb06c0905e2d81239bab08f3610ed43b0ee8e582aeee52768110d3c0fb4dfe91c4848dd7b2242926089b2c7ea60a9df93f60540143b006f555f9b3cfe2f84f59d5a057b9d443a3eeb77a0cea17a48b7b00e0f596d6e1eaf8f5b00ee4aca37798928ce908d6e1a4c3a7d9cbf76b571d2945a110702ce872fb2af6e67930da70c557263792964da30a2e7497bffec102069526a81cde0d18d5aec3bd757d888ee6a3430cbfcf2e8b798433ba13c0996f6ce73ce459ff6926564bf8bec76c473cb4a936df92cf9ebc3d3fd61079c71507411c2cf099e05850e213653b116d2cd57b19eb5a58879c51c71fb7399f0872f792e8cdb2d223e083087c7dc4404a33ae7ca47c9b51365ff28012a312a81c181d0fcc1d76413867c44ae7f646b0fac81c6725ad9cb177eaeb3a2c255a773f178bda53b850134e89e1fa3b13e0737d00a0fea62364fc5f7cf5aa6241b16d11de836ac3d3337c45ee00d8c67cbc932a1c7920c6907dd0aad1bb32f973002d7b7550cb5f0e2e3d7b7cb04e3877370820d56a0957c6fbaaf01fa7817620bbd0019ea8e959771c759bbc357fed3f2b30141dca993da87064c79938720262a2312477c033ae09d56ed2b8e1b6e278f4918bb4383c525cd808b52795e150602e48cc0429dc72c5889e52d9a6b4ee945381f6107acbcb0d236ea63c2ea6cf450bc824927ee6a26ab9ef7967cf51a1f4babba036cbe66a34eca251ea84727920c46cab47cdfec0bacbb3211dd55e5a70c781a01eb904c99839967da91c109ffad6cd234458f46132b7cb6354d9fd1f0e9eb2e2d96928aa3de7a1ca2a42f4699d8a24cdd8b166c70f9ea46a67b725b0fa4e5762eac17f952243ba9075ac54128ca5166c8d92fb99b0c2133683c905ea331f48d47218897e76e36235d1760712200f3ceaccf44150bb6ef727d874ce8666a1c19bb196aa710545f6f207b9b1fe49405282713a51d4d677a68dcf92ed13093fb85cacac1d1b76f19fc94f29ebd04c4e4a71e7da35f75ed21057b76e8f6d48bfe4917056471a0912435bdb11a100754265d6ca42c6d023dac59092d6a4a135bc0891ed34797e485cc76ecc3ed2092c7f779ca65a859f562fe72397ebb9f9313095c39b013fbd2875921b37fbb8ff9df71c24fe57ae9bd08c4a608c77e929a552ebbb75ffab0bccc138eabfe9ca2a8f45b658ddf6cba6195aefa14ed07e257a75ba52f3d10140154d2885f99da06419630521d03c55f9767be153e23d1505e9833a04db5831865c6035deb3261b591a568f9567a9fecdc5e4c5afd0a11624a6d09a6e83e8e8371d4246e13a7297ea8e6c3e22dcdae93b2167edfb49ff5776ebb5fff68eb58d382e47334a5788fc7cb73e49cc884f773be72420aac1bb37d95ffe09bb288f6029addf403509ac9fcaf431c8f78450a434bf2d592e94cbbdc735a0f8fcc125d3","title":"232. 用栈实现队列","link":"https://leetcode-cn.com/problems/implement-queue-using-stacks/","question_id":232,"issue_number":8},"6":{"day":6,"pres":["栈","单调栈","队列"],"tags":["栈","哈希表"],"whys":null,"difficulty":"- 困难","description":"```\n这个问题和“最多能完成排序的块”相似,但给定数组中的元素可以重复,输入数组最大长度为2000,其中的元素最大为10**8。\n\narr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。\n\n我们最多能将数组分成多少块?\n\n示例 1:\n\n输入: arr = [5,4,3,2,1]\n输出: 1\n解释:\n将数组分成2块或者更多块,都无法得到所需的结果。\n例如,分成 [5, 4], [3, 2, 1] 的结果是 [4, 5, 1, 2, 3],这不是有序的数组。\n示例 2:\n\n输入: arr = [2,1,3,4,4]\n输出: 4\n解释:\n我们可以把它分成两块,例如 [2, 1], [3, 4, 4]。\n然而,分成 [2, 1], [3], [4], [4] 可以得到最多的块数。\n注意:\n\narr的长度在[1, 2000]之间。\narr[i]的大小在[0, 10**8]之间。\n\n```","content":"096221cf5b628be1e73e8bcfe626c73472812b8a04fb39950a4a4328440103223cfe8c5225e0885c2263ef418d6a54a5fb0e268eff401fc5a93ce974ffa5f124f52a696a9fd18cf0076dc1aa84d24d6d38e6718399b2439335a168cdefb6a2864a6fdb062cb89a252c7c1470b8c5cdb933df4d665120b0833e62574efa09f32786b545596ce3a3e7d5622abf049835d22a4b452d9ea1d1b208ab060542303b9b122c0a4916e98f70450073b7cd6c700311c286d7375a0503fe1d94334abd442f31d34b840d69820ef7c62c19cf22301dff068f374f53ce8f792d8ead87bdb4091ba2f32197dc79e195044aafb14c6b15c88fdba3d6d82f3a0828bf213f0f3ca8c26783bc919942ac46636b03ea665875f2d98418fe06884787f4c738898870895601d68d779de5fb1cc9667d47cd4a21b6b57311e2b57098c249889c42c12180710f80f0493c1423b0e40fc7888960e5aae1b9b39084d848a62bef96362f429fdcce950f98dd39c63d28646a0a6be4c8201179a47712135b5b59ea3fb0eddc1f1ae430230a619fa56d34a16c6bb1543f0fe7985b46e475df03c38311a55b504ffcb4241e487de50e9c831c41c7d9b304dfeb81dac030f76920024cb55e4ba19d85138cf3ee3f926d6dae3d564d6c6b1d09fc54a88cc8c2d69639d6ea253661da69eb502c3a98e1228ba7da631f372aaf8abeb83cb9dc1c8be639ec59e2ce4af2c47c166674a962f6218644edb0f0e51b0da0c2fdd23655ce7a0aefc88bcab9c04fb6f3df96b3b4c04b620baf94b2bc0718457a5f06dc6eb3cd68261646f3565d7c6c5eec819da0fb3913191f70ee2f5a4ef46bf44f2d9921fed74f7693c074249feb1401bcdca1aed6ea861ba2cb695ef6b5bed69abfc8b06b14b49ea73a186146130ae3b514d4978928737e8d06e1aca45e7e71d404ca50f522b5a456a2bb98788c2a07b74a728458d0dbbc62434246d283ad29dc99f1d7d513f28c0d45a5114dbe55e796fb2b9e246b82f07a9b08f08c614857044ac1a47390527b82ee15112c2ac36914293b82ca69500a4843a86e38deb75aa0107e5d19f1b026e4a427ad2c6c04f08a38f0038d6aa1b61fd70b7ddff0d58702c5404aa3b3ebfb4370c63703ec020f0f2a82fd9b5daf27ed3c96612debf3aa44382a476b4b19b6daffa9e89d9faece81771d4cc2f06481cb8503c35a362f332fe6248e2187f20d827b906a6c5a6f433539ba25f045d0e5cfb17ed5e3a6f23360fd830796458430c21c23e373a29b2f175034f9e3578f37048497f98db1bc8b7f5b9d613409277f52764f5e65a26568ef8173f738ba7de3ac67f89e5d8d5e94309ddb8df190ae60791cd629ec5646ae619bd2582172dfffe4a2f2c9efe1e5774bf9beb8acab1eaf2152ea5cf7f8921bac723650597ef2f3423db60618da37040868226c08fc443291f2786eac8e93ac2d7ac284fa39b11eac7adf63f69bcbb84b98d63c22cd09e9342beb503ffc0649a614299db91004fbca7a5a7040a2a0d89ce1ea9c61b10d4d048aa9d262995e7dc03d298b4f8405a59f8c3bd05957112fd20a9ad745aab9581059ccd1b1dafc3aa39b1879f5e33d13b8169d30e0200b6ee15f6c883b796491274c03ed73a0d5b4e144f4f6b6ef02d6a0e6faca9a0a9d3592376833f77740fa28053e8996cb6764115aafea980e077fa37b4d15fdaf5d4765dfda541e1e39003d78b9ac482093f24499a2c3d2c44dde00a41727b806e9f779870b9681a01a1fbb3e7666362d7397756dbcaac8c8571df067870ecd24dc66102bcffc6a9e753441859c511941a8e1e5e17905dbdd9347f3f05b25874d100a091d93909df6434622304f0a297536a61f2eaf4b85185c0736fbdddb672d4f7026a0aeae6e140feefcad08e057df7c2e5ef9ddecf0cc9bfb7ae7afd51b8a19d5d02fe9388ab17e26540d2032d509be60e6f0951aedec19a51400e9f042845cbb9d43c8f619fb71523493df5cb9b553325c1257c5639f6ec2049a2a71415cf1daf496952c25e5cf51ab63b12398342c0d81f1a85d78c87a8ba1af7aecfe8e5f8fe757830bddf409dbe5ab4e5e862c647b4ded29e9835427e54f94739d143f71b524148f8a84a48c871652589fc6e6f3d72f1b3f4997f91210a50b87e99ab9083e4230865a548de29b59e82c5bc0a7bb53166ce627b16190331626891433eb42dbc05b0dbbf06995720ad661ffb4c183c00929d22ee5c710d5c5427327a2301812376e7e6546358c7cb194d962e216aa0ef925fbbe9889e3fba6267772c19a687715cd194048655b95105aef21eeb5c16793522c40934565c02561eb694b8e5e5cf86578294834aeb215ea866f4cd4bf0359a5438322003b2a7659b10e8ead6bf293fd8c09ff3499fccb8006e91c31ed79f96c5e9f743d12e5703fbc109a3ee8a141e127e72857daedd52aa80aaacca09d2fe378f5d4e5b02f10305e9866a9092ca49095effd35b4590ff6af1687e26c7d7de6b05b9f9cbd154f4fa80b9439ecf2cc3057004467e0b3e409aa70c354794faa75086ae7019f982c33bfd237c6452828df99a03ccbb259c385bd9463ff5a7d69998efa71b08a9cb5dcf0913e03c6b3374aac4c4a73e138e0e679790f9b33078065eee46923555338951317456cd1b4536b469e11393ab44566c28924d31fc0ce1774c287f00ae19c1abe25f399aac6a080bfb06bf0a399cb29a835e3c09cb8a3db33e89ca5e2cbfc0de8620c16217ff76d8d1815a4546f9878d1e176e9ff5d97a1b6faf072510ea93e5a858afe56488c1a42b03f52cf7e8de4e5751f46afc13454d16fc6941d1d57b6bdea9287c923a2c4107892806f163747d851c28f440d7c3532561aa909b3717eefd3ef7431dc748854d8de1982c88bfd12370e101eb01255f225c14ef5202dfb4cac3ee891f8cd2a1f7c2a628b30a787992ac77aae8dac9375bc4e629049e0c39860b925ab6c8fda9c0ab9c6110959e9b49a13966d6565494f60f48083b2f8a2687e240366ab8e118e71c5a6175ed789dff16c7e7d7359403a49532ca106a62ff16cc6166bd1d094533f7cc99bbf44af2405dcc1fab0462dc40e8cfb55e232cb7a95034ee54870b344acca5f0671bb427a0205ab8ed436c23aa76c2ae172e47de3237dc52c45f7040475421d441c230e0bd32077c92e0d736530ea6acf6a460fa16262188a935f80e3c6ee43d09045a6b51e546dfd77f6cf6d18856a861e737c7f970b26bd5b5b79dcb23074ee3bba707cba97a991879f59e8b5958a8d43a5645dd6b88e9ebe3b846c71016c0d709af4597ce534622981cb10d34f2b6da74019b3f28ca08e62b707fb077333876cf5551a7c36c75007495347eacecd3bc1f7742926051b4c77c014ccfa5ffcf83e67731cc728d138fdb8e50872304a5010da8051de901de75a024408f900f2ee20477d5689081482c9ba9b136bca9b4d5d8a749dfcfb525f252511cde839a3b31725f33945d48e5bc044d3ecb1a21a4ef1c384d30ee32f05cf206f757e16a4ea6da530f4d84458c490f683d3bbd10b95f1e3edd296daf9ab8e215e8bcc5e069d4f0d6efae86a92878d94ee1938b6910d08e33904c15a37e1ae7146ab6571dbd4d4f286112f0ec8c65ea6081127cca905f537bfea795ba1d69cf3def28aadfbb3802bf581da85c4fbc6b7a2f6e17e92a61ef3432838bd7517091b9fcb16b72a10e1523b5f426ba031696aa88af4cf5a5b35fcae7b9b7d99e3401876b346531bd11bdd15b79a4de382205ddcf69a2e818b5c9dde8a1f75ffb803afbedfcb748e7fafcb06cd80d749aa875057620b78601e3074e72c910bebdb9c9644eb11fd02c29fe9c480213f69dbcb5d3281fbf7fa23dc6c91ee50ebd6bd2b50d4603277566d72327d54e36c948cf202e8951f1a94fa511d6d7e142b0c40f816b1bac242fde60d59516d43495b1604cfb7def26fc7b69de3fb583ae7a362605949b2138a11cfc825e58e4855a55132bcd22823b69381fd70e425949744d38969456c364ab9d49855d70c201a619a6cfa2e8675d4aa1aef384e3d49cbf060e1d32edffc6b1078ee0739a6ce219a073e0052da2f49060f913a60e68adf916cb53ea251d25b2815b4e1acac4e3c8ad43bdf3493fb6c3eeabbb3f9537f1479070777445993cc3fe2b0591ce21fb591bf1e79e10e40465282155e44813ebdf352045fec86acd312eaa9c609f7f47c86139059def779829e5f56cca3d1d8eb8487fe150b7c6879415d20d0770602ca5143484496b3483f0b1b3cfb7bbe2f72921092d433882ebbdacf29eb39ed0b3ab4c9bed2e848a6e4417d1122239f630989947bfbe9ef762ac77ec6e61e9f44b652c56b20b3956ec5c85e4c2a84a23992b73b16537e0a5298e60281f9bd89e8df94862b96cac774a1946bba8cd43b9e6801ccfe72eddd5ef197c41682e8f2e5d2cae99a86bdeae3a7b1c24e6bd48778af7a2dc4e41fb1c6ffc1117a7c01432c60dfe3724302be86adcf135631a5f4a4b930fc41157ff822dbbb06ab645ba5eef3a910842e6b33ad3a6be7655b1f2d0656ce77d00dde4fd20ec40bb52380b4e0bce1bc730c4ff340276d0332928994374d43038ad00ddd6b64ecea3f02dfe8f6e68f73005bb1175878e82c975749f00327b88cefa770e49643d9e92ac94a3121a1ae172c1022a05a4ba74357a6464fcd51a9961561c1fa183fff1ed832210fd9f93c12eee616608b569c763182c14e22e70c8acfb00c5d24002c87f07d332ccbe814f3457105af62df9d339f05ad5dfe6987bf7ecc5c2dd9b66fca936165a776877202fb7abf881b0b99bbf77ae2a0f0409ebd16271c395df2314fc021a929a173ebc47af1b8a897c967c65d37562286f2bf5b2afac5847c26da43c6282336380a0cc6854e7f6ee3856a5f2b5b3fe0cd41cde5af60e6d89c83c0952fb1a764d6680cd3ad3d0d125174110c3a06c632351078afff1a44a34642cb65c38fe79196301ea6d457dc9c1e7957b1978b313d109e5b7087dd2b43943a447e1c642e4536492dd5847ce3a40c13dd040c859d96cb9da970c1902b577e30ca2e4b1cfd3ce3a6d3fd24de41c14a5f8372b2bd24b4c2b40fada99e4b33552ed674563d547d620940ac6575b10e97766f5516e8babe9b5a1227663fd43b234a9ed24cb5ca7e88912470f05c744158200d04032d0398e8d011b458c4205a917ace8635d79483a3fec91201f58fc9935f0000d2b4a1f13c75dec1634fee7369528c9308f33cea5a38cf9a9541bc0a2a63822da8c46fef70b0de33f2220d061a575967d5f1eb008e703f90cf74164bee23bfe759d17e26100d4a3234704d1ea3d1d5f9f376ad28444f942d0c82d77d1a4426a571c5ebe2f24097a08a6dfabd7f8a6a9dfd3aa5941c3f77da073c768612dcc11a712dce156adae11c8218868d02470e7c776ae09ba5fca9d21b03efdd25ba8311dae5402a7fad40e278f72bca934765481034d39923cfb4bb266ba3f0d5c52bf2760790c04462dbd4f346fcd5c304ec85a5e6392faa7cda6c14f16a7b1b1a177ba6dbd0adac4a871836aff0839a2decc6b2e60e6fc351a40553d7861a99ba5ce599e3447ea968cbc6aa86bc8f0510cb5845556d2b994a67c73f199ad322ee9d1e44b1393146bafe4cbefd754d341a14bf415128f2b32a53bcd18e18fb7bd909954b4ddc05128fae95f6a314b6360ceed4358ecfa47ff5841d17c51db653037274038c4b40b941bf2454e1a24cdf82a1cd2ddef8899457dbd0a00dcaa5c6b08f86cd0e04c2d04136bd6c1a2f9cb8dc14eeaab7601df0477217d6914ab02383538450affedcf2773f40338ad00802172346a89f2107561bea00731919f6a10bc1ccf318aa79dfb2d93a1bf55532784d9535323135e845cffc62ab433d4625c2727c3b25475a661a7ff9e04d3b951dd2d333d2ce33a8ddb52a92e2fcc5459fcb7e3a282ce8f5858587b3999bc9840621ba0b4f33aafbcc1a62e9199a81b5bf5706153525ab48ea3a7855c64ecdbf57ba90dcf4ec35c851847f97a10cc0b319827b52c98aed9e2654a00cda02f39c31a78d66a116c1583bd538c4928a8939f9d5e6af4cdd639e4c9361e6787f33da776ce0594401e67bdae7767e5ba7a485a10858f33dac51457de755ef7ba173cfe7e0a66a736e4e0cc160cb6b19e055ca84516aa605cd7c633e9195d7af1789effb6784e938a20c188825dff422b918338afdba6a7f47674decb36013a841ec0f3227e0fc7b4a2bddd6d13b777452b3422f3df3f5c97187c3d8802292378eaa5daf0b8d9307ec2db077be955ac1d02c300c1b381c0bd943559c4d7ae74fa268e1fb8bec089d4529e8248b1cfa6f9ba7e9fd5300bafcc89be1f3d2276ba1653f62fec0ab0b36dd6bd4c878b337b4c6fbb42ce9062270c057936fd694a4e1aa2eed5edbb6cd2e8897c459208c05f30b8b254545c25e0584e04dad4922675795bbbcd935a5a36a37b40f93008fbc2b3b09e811ec508953174df3a01566af9835818f42f15369315309dd8e55131596c5b93d902a735f57f201dcdc88765e2b4fc632be75e72389b2fa957affbbf72e6aa75cf14bf35977dbceb964214b6bd1814453c1e9d8f42afa98bd8b54c0a6d65e9124b1b25184ced4f684a1ab5a35ea4c3f30f9b5b6724cd084b861f96f6b334597c53b9f5a83ed714f8647fff8909849a11019659197bfff54dc4065fc3c6a29add6c483d4a12217791985cccb3d6245fb73be9b5082afdf0c9ade0dc8668f76ba5e6aee21d27494fe46e07aa6df75813ce252a3c5f3ff96e10ade640c83f6b46c528e03fcac78a58c17a559dc27c3f946e039eba6be355a52dc9d9b69473ccfca9993a6f3bf249620c523e708ce69afca3a13457c44b099c2d6afa476a284b2aaec09c1ed320c4b14fac13097b2b015a4cbd4f8b32a684fab8485fd5cfe79826e16245b3d46047a781f57847d46de58177042e9ec74d7e3ed62400fbb94fcadb260d0bc5e66c1490daa5e04afa941c1249e5235c3125dae2b33a71576c98fd3bbb5d448624aaf92decfc2f824a3cfa957eaa070c670476f51e4dd10ffb12681c505f7f15a71104b7ca4da038dafe7f19d0fb9a8472ce38c020b9c1c05fa21cb20f608f9e63ea08435f48448552dfa8ab1ccda4a1204d1fe6ea18c50880bee8b067ec27ce736bc3b38cae19b1caacb8caedd889a79d5c6e1ed26de9bce9663dee474663af4d5d45c5914e383977d4b2a13a9d1023b3339bf07c2e5de812c26abb49ec68a655996f64f88736abaca2e6a5331239f8afcc3e2aa737ff3e128a9db87a0da80570052cb1140b6c2c4c40d81839c3967bb7a528eccd5f2639e86bc777969640c5c3850d7727e6611535c44646c54b6fde6a3a331b60747ea235244dc8bb0db33074ddff02cd40de8fbfb7a2f176f388a4f1a76c563db12b050b9ee16844af60267ab00fcd2ba607cf9cc23e52b2f6aca8a648044c5eef85458be15f1a1e990e936a7c0a0f782d8dbf5276147ae5f26ce2e107b1d01e1a01d038fdfe79aa3f7e6590f2e54e31e9a6f1d9fd14283840bd8bf739539de7687a4c512ec32aa77e6dac32f5d7e0c2b6c3f6f21153b82324aacd82c3e79dcbb427e4281527a5584aa52be00c274f3875875df50d72430921fd03c5a43d1e26a66977fde2636d9a11edec3d9a5bac66be5f15da8f9a0323c1d810622e8d89a29e932b2d91f5597a2205f4aa5cce6105952dbb446aec9fc7b093bf66e59685d2ec7494f1d4845ac588cb028656a4ed306e30d4f497800a054f80169381d8b6059131fc8171f0d3a7406d23dc0c409ef13504f84b0e104592329300febd1c6ecd1be3a0a6fadbff966b367a70515309d3c79c27485e1646c4b5c82bab8f03441ed12aaf76933f5f92fe593e95d63d5d2c289121faeadbcf5e86123d2496d2baba8a3ff1f74fb256e60c943bbb1e56d3d3149a5c8cdb58d3bd03391555de25b93bf489e4e3ca831e17e7004069eea9105f402bdd5903671960f4e7d3bea0b5df0cef41e4182c4f9d3373d74afc7e4822f4c1d1a0b9fcf49c502c0e738f3fcfc42fd800a8b77b564ff97da6bfa9ba69eca0bce52af0a7d9810da024542943fc34c6176c5ecf49264b064577f5fc7a28d3fae31b89ee8455311a1b8dbcac1ec0db9eaffc5fe963d24f1238ddb6733a33e0e50dcb34974f10edcbac13e8a00bde0199a0fd7096dc55864720795473bc9f565f08a1fddc173e5f197e3b2e541825e74e7679cd818bc85ede40c8f242c1416356eb710fd9c21cd66a71c15c6515035362e898fecb8f6fbb2963493583219439b6b014a8c057d4c68da969e17291bf4804f6a12766ee775ee06d17a3fb182f86185cefc65d1410be57a0d9908e5e763a2e7319e27c609d98ce1974b96c73bef3551f8bb0a5d0fcc13ffc237328acd85e7008f3e37b0a3c22749b2591ec355d39701d10b17407414742ed88be384c2fe9515231a669d0d000065b80abc1fd87ef7fb539655aa3bc17a8cf4a3288e824f38bef8acb32e2a66ee8c675064c1ad24662ee2adcce73789c629d7b44c01c29de18682a2e96371e43c8829db6f56be62490618453ba1d90a4fcbad8aa2c06fbd5e4e112c586e42b533616a232547703663da3734ce4f80b04cdeba2b92a5e41d7314bb8b0d3731fb7225fcef4b9b9cdefdc81daf6a1175f16ec67757515588f4d49bd0593d4f798188ea4a187b18e4ed6a6ffd363f98606f7afdbaccc9cd9a33f8c57392ca2167ff4d9bdf3293e8720ad12337b1cea2e527e183dd987e897b7e763d2819c35f518e9d0159b4c6cffab612ea9481d2de33b9ed21e40ec5fc30cfc99f1f0ab13745faf705f6061326f124cb3ac7a9502ded20ee3f2653f2e4f5c0b5291ed231af0477919c0ceb7aeda65851172034a5e760dd3c68f5c7d9adc1ce0aca7607c41ee1f1b429a818ea5e483a07c2c02d582fb283184431b9ab6dba7fc52c15cc568ea07ae6a16b475ac3487f3a07fb9d4b2eb11327ca9a910a15495e0617752f2a002d5f07eba356f2548d0982c462a6c60c8f8f1192876ea9ad12f5eabd2d19926fd9666cdf88a15785906acf9e4dd94598f207c23b4d5157a749ab66ab75782dc556ddd48ec603974a41970798a730d7e37d723f6b8e234d8058b89c7f228561d4ea109ad87cd8f5cff98c9deec7049f0c5ba79051459a1869be2f053b8dfbab8660ef58b92c7b15fb97cfaa762f33c729800f47205353934b080cb56744c2edcf1cbf81a0daeebca05291d1534665396958512d00025a04bd9da12ff6209dd8104958032d87afed21df38685f7f2a2fa9ad0a04eb5174d166c74943ab6f40959e7173a402f91a61b2d982ac7305e14a6fcdde92f372aba8cc16a25936b46adf1a0dd73ae2fb21bf589a9700fa714c583b7f411cfb29f45963cd16852704ad1a8eee6ca808fe526c75ed0a5bcd6164f4a7d9ae88e0d68231cac3d771ff98d085b1c07f94484a22ff554ad066a38a415f347969c668df079cbba28bec0a04e7f03fa3a711ac417813298052b1f8270289b9b1a792e59ca0ab52ac8dc2169accfacb558fc0cfad979391f5213c34ae4ab6327025c272cb2ff6e679df4b359e69679212974a9e06317697bfde0c925ffa1fc742dd5364f1c08bba0b2aaae78bba1d47a7b041a611e83ec24fd4f83e5db451d4259f664f0c4ba6ffd0011b09d1ca0190c4fef9e62d75932726aa2f652a0a469580ac05799d7b476b4a4c40aa4568907e16f59d199115de54bf6f09feed8ec7293c7ee31d085555c7737a33ac72609f04949aec2424b7609f79d8463a4e9e3425143b1a66cb2f78fa7598fa773f11c0f09813b5ff7556151df8b01ebfc05d9741d6fd30edd22b19d4687f0184fe9c3164da4473e88b6e55b7602ac88542cede0c5047c23cdace6ebdb4291d493acd9342dda5c5b826c1cc89a5ade1c9ed8d8293870278d7ea8bb05c28488a576004f692117a109b84771ea9d13cbbaaf17b753c575f376024c8636b18b8c068df699e17b83b09d0ba842995596648ba4aa868b47cb6c0c6e8ba4c90f794ca64090509f36def33c139ade7dd95ca0b3330f069f28253cba7a799d21ad2ce819f27a2455ea54ecab9563e9ca46542fdfd1a50e16626b0bf07db35292d5c44bc301bfda3052b992c06b791ab0eef3f96256d38155a78c89430cace9e220d77e173ed1302f87be9419dc11051096388206ceb346ceed5240e9abe6f9a765586fe336db56e68543ba29e52f8566fed010538d31b5bce28bd987cfe4bf7151af7362bfd4cc0d32f7cb05e9c927146dad1375c4511b009a8b3468a0587753f2b97697de26938be5f725ffa0139020f1bef0b5fe59553ac7def17fe254ca2f3c6e6d1b7ec08293593ca9e7b2d5701d3bc76e6b8f51f099e365d10165bdf466678815a2681b661fb8719d3bb3243accea0aa600ef477dcb77548006a9441a71b4940e7033a25628afb8f28b136ccbed6dd9c7fd0caec2d3477f5d0d1f6ea27ff5eb2845e59351742870ef75e843c5d1466f936d485815a2df61095c99afc103295f9b1012eb1edcbdd4231bed3f9f39739758377d7c1d132a5e936ca40b17299517fe7387fcc42cc54d4e9c08368cb7ba2ec7564c4850cb8650cf135dca493a32dbb4d1980a7dd97cd0a37163fa7cdaaa8b75ff4e16df5b2769565d085a2251f5068fc226588151d2c9ef8279fb6b8dc3c73913313344527653436689df1445175e70d0015afeefb8157d8e0633d01bedba8123063fbc2ac281604fa0c58baeab9b3d3f7cf3b2d2a2c50465273ca26f6870667b8f4a318bbe012555bfe5e8a06cb73cb47a3d62f23e8b09c570f202bb15d515cca31e8308b9f873adebc1cb91e347854ca421e8009999e118aa947f55c4066c56533d72ad1905e5065a1a9ccc4e29ea9fdcb391bc6b9c1f79a22414e6a3f50341309c5c739c7a52fc6f77c46d15efeb3df83a51bba8fad5d07f08d4dee8a990596734105bb65411017bdd828d63ed785ab897bdfced2e05a6a625d3f7280c00973029075e51d08d55ba1a23d19e83eefa8ffae2ac78c39d50c9c247b3b9e03def1cddecf97c1d56a4bf42da513f8f87fd6ae0c860880f00ea93dfa9168b6778a486c19de70306e9378862972945ada3b6958251e6dcc9a107a84b6f6c84b2ccb98095bcf104dfec5ae87d6bcbccc7698b53e472e09d8964203e2cd48b4eb9accf9f790a3959dc425545f4c13b048991e08d7b1a43a4472e369d616fa2b370e45244850d4237a03017d29e27cd5c873a3009f724c57e133ac717ddccab0a5a109da263848411122faf6738cff06194f6d3dc0f801972ef6f0597a77b04b33f1e94f6b725afd46e6a89db1cd461aeaa82b0c58d112f864700599bf01da2baa871271f7479c6d945343ca6b2ca0c7bd1e6e8df672d2e6fca53824e4d6ae4654500d9c1f76dc23b9d165fe0d9f1549903a90a8f0048a30b1b12dcd9dc2ad72b3d48871d94ab0b559819a003567af12bc0ca3bb9b859ff7712169af03ee89eb15a940dca350a0ce61a5259566701abe5d649f7fdecda08fd5b2eb7f6ece30eace879b56d2bb48af52a16a5dc3a4ed58012e1cda0f7b1b7cda95fc2836ae5eb4440796a98bc12c10b9a126408e67187485328bcf50a662124c8d1aea7445ffb76a7d615b490b47fdfae6e5f52795d5440e63c0bd40d29a38215a9700e594372c946cee29b65486495bd62fa425052c6395c9a57bbc460b76a3795c00a9b1e77ce38c0785cff3a8ce0fa8ccaf2fe9b9dc4e08edf18f317ec64f6b343d7bf228f89d2b88eb3313f1ddf65d2227c8ca13975e8cd063f20f0b1e7203efecb9567b5b141c4c333070229a2743f05dc1cef79a1c6d6867753582f1fa843c7cb9c61b2880a0be17009a1f6e4a1c3afe26a32e880ffad85e449a897c35546939f040159afc3436a9f5b1d9f3bdf7bf9f73855be4f8efe09f62014292d4820cf4baf85cc10e8ab27305b467515b106233563dd9ba399276056295dd73182a2bf67a30bd4505ca2115e0e8da229e5a2a3f82916bfaaa3732c320911b73958e245bc772158f29a047a8e4866fa003c57ab5334b24d9ac8189f709d1a0decb01072508682dc9ff0fc62f379c34b5385881fc027c3ca8177757b1f957514f4dffa74166d7cf819b0a9b071e76186412e9cd56bd9b4734950f77792ee5364fcf2f35817f2b30ec1ec7fceac4d8becf69abbcb803407599ea5faa2dfe602bdc9ae32f98a43dc4ec2cafcff61966526ae70b584a3ace3d8285577cd1bfcae80b52593ee21103853849a97701db1bbd0d3837e724508b21ea9a36b2fa78d995fd69e3378d9dcb1e6efe36986bfb0f2d46f99b2be92cf2c95ad33a206c8353dc603b1d8c555ff5a5707ed3cba8e7332223d733bcec2458d820bbb659ac19c9b895161bcf4cbbf75e9ba42ab9c2437932f7e1501957279c7d4f13eee173a1ffb17323e0fd76032fdd17d5a83bdfd5f3b5bac4b12c0ebf9ce21c2b3fb4e1ac792932bfe1a9fa5c0e4a8f77f592284e96e6f8bab2586d3577b74c8da1a02864006df65814474ef267f7d681ee069c5758d8d9b133c0fa5c72dd5d7951653572d324ddb9e898ad066c6cd1ee79334b50067aad064a821953a164425adc40ebcef422c8104a466fb8cb882ad8cd99420fac91c3d06fe046d3069c414848903bf3f4be1417f15663e9f6d4106ce6f3556894b2d86bb434faafab9e7846b305d92bf2bc858e44af116f59da13f26b59126218393661654631a8a778462f3f928cceed5bd640d6e716284bfb3aee39bf143a90ffa48399ac5714314bd1130850d3421c7fa21499cd8206e89ef52ca4498a322d8799a5c5168b221b72ae5e75a05e57c1c2f8b4f94935e079e58ff4fed486ebfbc8bb33a15a1c113cf01cf2eea6be6fd042e35da3c453b08a566615b0107817e8b48d9bb8b68d3fbdd1878f738cae6e0e3ad30c48a696820c026d938b6fa519b9915f74a20b7887e7f9ada3dbd8491c3990702419ceb65df8ef7a15cbb56e11b4f6dd7cf7431dfc58b4837e533b19594f07e4e7b3dbd6a7e719c29cefdc9e8719fd5360ce907f29270e69b1d55bd85e36737893e8c33e0c4fe671faa9e5ac8247db00095737a06f81b15ba9edd095e0f6b2121e24108c69eba04a6eb616073730ad79103c1db7b3bbbf0c681ff63a30609a9e57f2992853cb6116b57b984486955b73812cf3460818dd3f9d44a1339b9fb77d0aa029c7ef68722307900417323a8d4896835cfe8cddcf6871ac615e2a28154409b2e1d44be942a8689b0258abe052eaaafad7d743501a441dac2968d1f26e289b9966f1f1d19f2fba1c578abec521180626385093ba231ea569fd83b80221dacf097f0136e54ce45348d0074b6cf98b9771f39d2429d52f1308f3ee828c3031ffd316544f20385627a2bd1957efcd3ece2454b0c3810642bbb7cc34979765e79a767feb58ba850a7c3cc6d7ce201cc2abdad7685810176a3b2ce92aab1036af37021759498904461762c545314961acd1a39eb7d9f784d7f0ce302b2daa49608f0bea7fd615ba4d629c85be1cbc581328c57edd69dd16ee3531f350cd83bcaaf30e9a1644d0122b03d8193677593494f5d7097246b1db5a02e40054da3aa04d74f6f6dd37deec6e7d399e4a5d69fc39b59e328aaa9e7ff84795f539aaaaceec49341bf35fe32a2bcf1120c8f39abe1aad5eb35b9b5ff915f02b096a50e4136a5902cf4dda3fbb9c1439c40ceeefc72e41a8dab6da36d6a63a24285a4369c4abe2fafd123fa72f4fff90275cd1ed04ed2e50ce1451aec2967af796379e05bbaf40dbeb20392b268a7a85175a84b23e65aeba4e02e310b6196ec4f268af86b42705be7a0b68dd12e197b120ad27311f64c328e53352066fdc1248ad92f2d4d9912ea60418c186abd6e5d2f59fe8d8cef71b439078cd2fe486094a82222724725d995928f0acbc200b391e913909d1348d4436a9ac0adee2ecb0494ef25e215c3ad741a822ff7e08b3a29f76bd12127528bebc739d5355605e4f2709b6208edcff396f774cff3f90d8ce1d7abedbca810b550175dc982533d3620ae3a8b80c655d76ee509a45ded52da07ad4f297dfe2dd2d479b85075b1f5778364ff11396806d81187bbdf4e536870d2728db2c20f05d98b13ab235e07b72a08ad253e175724c775c056e4630e2c51aa19077da6eb12310b395e5a2e3351d24e96501adaf754f2f31b1a7ee14f6bb051adedeea3d763441a9f77f2d11d5e8dc27bf434fab294eea94670a27acfa331f6851f9f4c30618186d44cbb1ced5c9dbfd6981b268cc9f5ede55552abedf64ea5ff0d61b4ae5e12ecefcd4d8010e35b97424b6bb6ab31a807f1649deac64617541e899bf68464896461a1440d66f891cfec2e71e2200f92789c668fd74796547568e0df5c32fc82f56380e15becafd2fb11bde97ab9bd561b55ebdf79ea752768f1a85863943ebd06e0af7540cd33dc08f9fe4cc8923d5eec8f29966c3a70ac839ced3d055ee46abd5c9ebcd940558665857141b6a0edaccfca358a99579e707d08207e44b6408031271ed640eb12dd84cbd5942785d337ec9b7c726330c8bd716467a729f2967ae1c332dc23c5518eaf8350e1caa1dd9a6b8e2b6a7e3fcdc1a826d72bf069abd7eadb35f1e172426ef0d66fd93512102454c469cc1b63fccc39c65dc598f5a3fc03a3cfff549ee0226034a9faa2d1e6e388d798308dad0ecb8b02ea5beec41ba8ad0f26e243b5ee783dfd239d17e0145cb7fceb172757d6e13f160050600cf5901de6efa3e0f2b551bd71077d271d5dc53cc4968bbbf20eab8247464f7408e901a5c1d1ea071f90be24d8e3f06460b07d2cebd4408959d228db0f986e82042d82953f59123c8f065df10e952eee1ee16dbd33113d346c616abe34f4f781ee85f08073de5004e38f5ba835eabfc292eb0988e1246e29500b90bd5b26893472376d8a2a9c8bb4861a09e9960fa17cabf59ad600560fd9abc5c7a3757d5ba1702252972f99e79b85fa7754d07deff4fe649bd115c799216bfed71cb0f89d835eae62989af00337b4a100c5490163e0bac4d2d03893bb272359af439d5807b9f183fc0853bc8a7fc481e7f1f67a32028ba336d6507e23ac88fafa539b422c2f237fb732e92f9ba1c46640c57db34ef3431cb245a39e817f2f28905597fb70a5efd8349e8f465f736e882b7ec742984f72f1a8402d96699458135e970c5d3647a3dda692df321107ff8b2311d4a7f604f4d0c25d352ae1b94caaf0836896d3f1702375465217b99a9b0d6c3f5f113f5c416fd0443179b6bbe3a93b34557a3b52f7fd4284d60e81ca495f94f3adfe96a87ee039dd18ec5930c14efa524cea4ea02913cbd63bca481fb4a8ea0e598c99c485f0ca813a63ad145720fc77f83f7c8aac22bfd536c7300d6f4e1d909d4ae31ae3ccb0ca4ed9b4993980834a51dbc8e8d3e82e2487dac505952948c53641c3e7579e5f91f591b03e8435258fe93a2850074fb793e4aaa1bca48b0a0c10d926bebb7799cf9b4014f4c5b0e1450a918c7f3d222530b2a22c9addae8e45d3e3d361d60b6296d23de0b3b1e3d21ecdce32a02fedefdcebcbf0d0144bf089dad9851b908561d4c83e638f9217521900c24d29d5adbddbaa85e235481a8ef1bb5d2259ef89895fef866301ca5e2e121f0c48cef10d56bb4471854698eddfb6b3e5a2458b0a57b849ee4d1c0f0cb6fedce7e5c0d9f9188da5b5ec75e853811edea1bfb84be88f64dcc70141463cad24ca0457dc082b27b224a67569c623ed8f00fdd00d39f4b2517cf929c08597af417549d719663c92784c54adaf303a4a45dbb86abc6ee4741572c8d0e0551acf68d4d9dc02fcd340509c74df039dd8284a96844b86e038af6560953dc0d3f9dcc925cefca54f84059e9c48c7a5ebe7d73f56286c0bd3d4428c3a447829c880f94c8a2213151f9f1e84959bba486decce4b238566266f3293797c4b959694de22e193524958f79907b24bb953bb1d7fd031b0f4650aa92a909fb5d64e859080e3be56d1eaefb46c9869a952048cc593fb6dec743cd13a5358a12a4c485d879442b815f0f37a885c7d6c58f3381ab9f38e92c353bec4963fd7b29cc0e1623791d3385ba760f709f0aa88f1d156bbfb9c449a5d77f7555b95cd6e93f472679f231da94ef3c2f73a2e28a7b33ca293fe72a47e9ddb9aa34469a4a23f6af488fe91533ca2c730f32ebaa653e564227c001ed796088ffe0048efdb3fc296e37cba371d03276a2a035c9ab535157dccd15388b9a301e98679a2e0fae2506acc5799505910234b6fcfdf923733517320d1f4106aeeea6da918fcfee020c6a2f2ee07309d250f72161e9842eb2966720512d313d5b32af5901227c27e63826f072f3e2dc396c0bea22a3d87e988fe4da7a4ea8c248b2641a85f2af863254a47fbd6cd55f97cefb15fbde772e9948f81bf6216519e8c52d893ddbfae8972830a282953879fdef1677e09a96094b3f6403dc6a505d4139b66bb1fc3808b62a38e7df64db694c09c5ef998db8df98980ab32bc5f3400a6c215aa5ffb4f8ab2c574ec2b90fc3429f0d9b37debf14916c1c8ba7b207c366e0aaf399eeffdd8280c5485945f2d84fadc13493265dc608d5c4f4d5dc085e6787568949eb547aaac38a4bf2152fe79bddc846158e67d40206c3b42988abf03702dfed56c57c8c42d8d09a708a5d98634f1ad0746dc6157ce6008a1e7867799b4d1059d937c226c72e01da8c1070062c0c281220d08cb5032f2e829e4a8719b9c06242aa90d0514479031162b084477df22184f3b6dd75be9f52494af416ee6646ec02fb55246a3099ed414753ee88ba1a92c60adf8289287d81e712ab93947b2bd5f43c6e535af74eb22d388922fb577617c397d51cab0ad3bea57ee8a06d65c7f82946cc65e66f8aec5cdd610697ee54b5d2549c3f057b9c44c28f9019e9a8eeadaab96a0fd2e5d18f7557a69cc667bad7575d62d125f33daa6b6a1a04530ab2402b29255427149b682f7fe81a9115342296b692f5bb9970a1e725d8d714acd66667469b3e1a9937cb05e558577a20783a996a74ee7b5eace9a103b355a002b58dd86cbb250d020df6443f007cc43ff692cfa6a68fee63b412ea077017440cdd8cdce074bdee4ba371e6658b446689acaeb45ec6230e8de7b56540cabb5c672276077171482a6386070dc6ba9407dfe320c2bd2fa9134c9ed6bb3508efebfec191ab3d8d52a2d343372824acc5a4e641266ff9f2c3226f7d01bd51c43ac95c21986bc75ac54cea34310b98beedfbbefdf63a43792e422d817dff56368a68d4b93caebc4a6fe2e6293b269bfb47f9ee1113d2ce27f3e4f7612b18ef2854d2bc3929392a8c9dacd13e6310a6830fea2828a55e1ffb41bbc94ff7b12ffbbf3d5a282dd4bec01bcbc5035045edc24bdffd8fb2ed6999f0e8993d051418f363d86401ef7d1faf5cf586712384552c69ef21417dd46e6b2f66beeee00bd47362b5793ccc17e189363172eac83dfa0ff13b8b3d2760b7ecca87eeb3becfed7e8586333b7300fc2ba75fec32c1cf39514f0d76525f60de2d657b8a0098368b273604034b6297a030a5747ff543069231278048ab1585e48cb5d3453ec89a0927bbda0bfa163d3f469ec45a4a0e1d75da09495d3a8431080d294b4ee640a55fb9ecb575d5bd8bc4d90581f42708841f715b87dbf410c72d9dfefbf8753a15fe4374bf1716c87e7d92af8e273a6b43c4072224b4b0fdeee78523d41578f9edb521c4d4b4ee9d24388ce055966fbc1ba428d635f60cb148b084e1836730754271e0b41c450d5cd543388e4a99d6563037964ebf8e692080734886dde6e0e0fb8fdcbfe2970e817b20ef13196d0f8cab07f0d8b1982ba9be9cb24519b36e4a8fb993dff75b0e0e7460eff819d4e9a5ff0b3ee80877433503876a9e4acc5fd2df632845a69aeb4d176952e2a802408cc11ba4d76a733830119a4c99645fa698e2fdf710cc8373c0289937ee9e711d57f8a33c5e683ac6538f71f2a93a8707668f95a88a3f9a8cd33da0da86c4ef62d5d60f719374a0e4beb33917b685c3979dc8fcc267694ba70e932108ef44fcc246d5418f14a78f5f62868c037f924f5c7c2f3d9e40ad92dcb02bc45a9cb31ca25a275b65679e0558187c930120fa56fadfdea2fa90c510e40f353d4c8eaa079139edc57e836b621533b573e41940fafb1818860526fe659b02be891309d691f7468d29ff6eca668ee664012089bd65eafbe698ed9f828cf9a48293b75b6a82bb439cffb589b22c14e174a3481e13bc821f45644d663ed06038ebb267c52903599e9b6b92490f1caf38a20f13acecb3c33e82abb0eca0c3925a443342126a52240551c3cac57911116b4b8c5e60eb0b43f24c454425327bc95f2e22ba431a1e058e581efd32573c25c6fb6c5d86821714339d798e2fd39440d6f7473495aac3e9a06957f1b4740d6e190d77185875081c05ed967cf2408408f3056db582d75f2a4228bf3b36c3627eb22ebac9000c7247ea809e05626f4eb3ef58b9dc29c31d6f0abf13a496edd6af8c305c950e6468de3127d82f8105e0fdfe40fb128d59caecd06ed11c4d871f7bc354294939adf76a65f4239e2385be827d202689d1d60e8ec29c756ef9b5def1b1316b374f349af9bb815a49729ce65acc3210433489d814c29ae6a338bac6140ab5da09bcd2955f2cf120422959ab2ba996c8fa54ab63210203d3c33f4d3cc8d078913bb71bf4c8469088fffcd90ef863f173cf40a5efc93d20512acecebc525559b059c1092dc92c792427fc4dd92a13b52864ea70325820b87d76950094b9bdee623ad7c33d2b52abd966d016cb7640e9b204991aee403d8c69f8c7dca555e8dc98fbf07f0787c3f544c250639c1bbef331692c4870fa49d5a89ac983efdd4b001827781b7165831eb56be34c6c6b9193574cfdadb40898726405f282ab95088a90fd8aab9d79ceed45bb6deabe6f1576174563ab64af6786be0f115ff27d3155a0a4f44ebbfa6fae54e4451585e6c66c44ab1f0285d6f82f876b58a95942dd95291fca580287932efdbd2b432f4a8f183a1fc13122ee3bcbe2a33d40c5dedf2471ab94fce276a4550eeb62acfeed8a63be9aa1def0ba29d763895659cd8e9212f70660c31266b815cc51078017bcf5bed509c7ed2abe3064eda013d06dffd1a8931aebc1d881b2fa6f8b1e11828b84aee3d4920089abe016d52c08e854c745851895948b7abb805b4f229d27310d6bb06df6c623da1e0e945423ee633578003394b032c58585d673b631e21cd7e3378b866e50904019e5a5daa939c2f0abcdd4a7f17b733100728024a9331ac5c617b52bd7a3823e48c8da6cf780173fa458e5a5c6daacb44a82640ab812fd30aeac72e4ab4de0a6689b9253b28e26692a563864699deaccd52808dffb759957344f7c463fcc62c2a51a4a8486a19c6b485a54c751af180a5f15c8a552deae50598634979b4b2313a27ca5316baa94d18039870e64120d2b01d9a68d8a268ddfc60a676a8aaf59bde1f915105dd441252ab932a9eb2db17cb71125c4c381505b9f1140ddd3c9c665816097aa2974524c2348b5c0dfff807e2214819e31c6514ea71060e8baddeb523bdc5e4e1c1a1604ec117efb5bc1bc106d26245380406efb9f2eabcb35ad1edbc6eecb14e82dc06221b386f685a8ccc4e7c15c56ccc055e545bcaa25218dfe48c38e29959ac35dce161fc01ea14ed9badc7ec2d8b72fbb4def696324e8124e57f700f82fc82c3f586a4a89bb2d9bf235721b41fe5e02e40dc8bcbd68c3ca28a3954529c004ac3756e0f62443d444159de1ab39d5e5bd12ec00d6a9cb247fade098f48408e538169285f1244f0a2bb8dcb272217c53eedf70872ccf20adf8523fbd6721c246a6d4a664728544a39c8e87196d8c9688edacdf95d3b1091a1f22e5ff0e43920d6ee68d96a932c97a19e7aa46f59ab0a199d3ec426af1654150c3cb11cd64d0946c0f88deb53e7011867f19ffa15bddaaaf1de06e1ba8bddd03390215b8d7a04f623fd0b3599a17d117ef2a8f21b4367f40b2a5c8d93dc3901935d036159acdf724ded286946f8ac5adb03821b6c370e0ed818d897ae472af9568ce4ce6190c2aaee26016aeeb3b6eac103a706b042f8caa31cb0251c034f33dfe8034102e0fed4db51a035dd241de6c47f69ef9bdbbdf96a2ccac74a52e725063d30d0445c5b02eb929cbc8832644788081698c39f98e3e053715c1acc334cdcb06bdbc2dfb31f585d5976d421e8652f3eff99cd105c2873d84b328980799f1b07b6ea7293e9dde58cde84fc8612098f949d917edb10e2cc5ecd1bca049725a4d77efc67380d08ed43d9180e2ea8987301d259fc101c465936080fe71bf1425b19937e63af09d5d7c21c8795b04b35f8a28c2bfc12f073236fe1b2e62e70246a9fe6ecd952310f75d8bdc648379147a1b6994c199c84b10985a00e9d3f3b7d57ceb7fafdbcf3a37d1dc3222141c7c9f1da3db03fc83c75cb9296af37be2997dcdfdce8d80b3fcf4391fc077768310c6bf3051304fcb1ee34a563b08001800bb5228a7d353446489fc8dc2a864a2dfdaad2fb6e87fdf40d14a86f9b66fe5d8c2d4e0d327633a9ad10264f7532f4afe6b73d870c2e1373e41fb8d8252424b12dffc2645739e1551711f952b106aa9fc12908a4a30e2b067e704f98318286e7c429b6c0705b738820c1212905e4247cc13256bcda7683fcde62417dbb2e54bfe6cba3e0aa1b235d1e564932738b0f9e0261d17c840986ee4a83b3681678a57baf0ba3e9a84333b0ca935f200d43f28b8f1a976b538538703b6ac09457a7342d38dbdcc481180a09399f11237bb71b0b7cff068349e21bd2cc9b0bc14da2787f7fa521c208ea8f099d16f794438c34d41e5ef68c9e052e35c68565399d5120b63f26f43fe5708ba223b672bd32754e82ee5cccd00e2a778796be87bdf6e06a8c8a790d40b0b2381eb1d5f756441975468a224c9b51413147e4f46a2a4b47dcfc265871115d9066bf5bafe2c7f8bb834284e27c465f7","title":"768. 最多能完成排序的块 II","link":"https://leetcode-cn.com/problems/max-chunks-to-make-sorted-ii/","question_id":779,"issue_number":9},"7":{"day":7,"pres":["求单链表的倒数第 N 个节点"],"tags":["链表"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。\n\n示例 1:\n\n输入: 1->2->3->4->5->NULL, k = 2\n输出: 4->5->1->2->3->NULL\n解释:\n向右旋转 1 步: 5->1->2->3->4->NULL\n向右旋转 2 步: 4->5->1->2->3->NULL\n示例 2:\n\n输入: 0->1->2->NULL, k = 4\n输出: 2->0->1->NULL\n解释:\n向右旋转 1 步: 2->0->1->NULL\n向右旋转 2 步: 1->2->0->NULL\n向右旋转 3 步: 0->1->2->NULL\n向右旋转 4 步: 2->0->1->NULL\n```","content":"0961e884611df7d4ac47a79a9e3b6f2a74993342b3964da843074a7e2f1d4ea5ba126cb6b71e6983b7c364be6cfbaa5dbf2242c49b6414deb063ea3cbfe8f124fd2d257794c0c0e70c6eceac9a8912155da73ec61144c917d450a23e0124585c33489e47213c61f0acebc1fb773f4761925fa4cbbeba1b498d393a4abb6cc640f19c25c7efc7893e7bc128bc37952fc3297d68e45d584c6aa4a61c10af9c875d783b7b003aa9d744236c5af8b457117b0ba6c1e37b053262a70ee4767afa3c3d58bf42f3576127e0695aeb6bc7437738a79120fed322b8bd076fa6258794b40ad2d1ef5ccae1dd0d37ab45be81a3ece0a2e5f26849a4420f457c866849084ce2d6e16b11ebce5cc92e521878d7331c7399a5886d981afc378d9c8c0e2d23cdfa0c2ba3e06ec283feaa2cf9d283996e5eeab73859f7dc0d9795f806189a0cccfd4e73e0dd346c0c46dbf34195bede0fc9e7aa88d0ca9fbb1e886283a06e5253d088f6ff76a8be74f26a557a2756628f942289a11ec51a2d6e5b4ccd3e87f3dc2225e43f082f7554815150fc6228e8616283795dcdf2e270ebed714fa177d60a40fe940b136d49e835ac8d0a4cc1d5b4eb45a7cce7a96bd82665b6f558e003f894e470bc7d289b0fb5ca33e4dee4bde3bcd141e87279316b2a3cf10253fcaef93614e5247239c753845a0356b0ba99fe0514682da86871be202ee242d397865597a64f9a8921bf1bac37d118e1de85cf52a5170793d47bd075a7865d1f28666e57fe665e634627016b8ea0a223fcca927c717839203883358248b5ba7c0febd398f6d6886632451f73e0bbb0c6f850f78a875db5724e05aa20cddb686c2e1cf0bc92ef0801a9f77c14622236b56960eb94737f0c016e767857a8a916a0a7342e63472f1c3f09a61c0d23edcef24588291f7da29322f742ab5199902fa462a9bba75a8f201bb04b41ae631799ab23c7e9b65f8ca70ee840627a7ec31bfa27c147f2880cc65a345cf70fbb6782fcad6ba72212c380ee8c5ddfa55446bb8d272595ceb65e9660415a1cee995019a2fd85c653af01e86d76b5d684b44a64906e0fd67b85fb768fa7519633d61bbdfe44c8beac41819daa88e169f867115b31e7c50cb2de5fd0dfe6ca609775e907e16b58f94049b9d426a8591cf1d5fbbd70663361736a4b1e6557e3b698395267a6da8a07c459332d3c24f7ec74bd4e52aa48ce11a1e0c463082680ed339427ed9ba9b010b3f9031e9ec738d00ff638947eb2136fbe72e3fd219a5e02cb0ddb2a37d3013615e988c6fc721a1fcfb3fef7b9e3d1fdfec17acae6270efa25ca3f73f09a66c7a48315c07652b89fe6cffd0eee7614d828ed5c46b15f9af9732e79d8ffc4a71d724727885804a796dad8ae79f50222b252b0b89cbc1ed29295edab3666a92ef106ca5bb23a61a5820bbf88253bd2947806f990fec1232ca2aa648538ba6bc93ba941761759eb5e08aa996dae5b92fe2d1813b6474fe56938efdc0a5288e61d1378fa2e1ab8c1d695f076e66c748c8aabdd609b61511d97a205816ce8357b05ce05cfe75275e5444d61801803481d49f95069352ea7f1fd3a1d7305a6f36b5ffdf712c18fae7db0ab6fb789a9ea3f859c77a50678652e2863133a00c21c001ffae0da039b1fb07f663e3ed1c33fa28a14f8b1cba2df8155b0f67488a3b51115cdaf3ae466ef897e7d5b2c1e1d4378e55e1fa7b83f67ef11882c4e4c8bb70ec0621236dc56b72e836b100c64a87135d8193362f3f47f97bd5f2c624abbb8416aa43dcd1ccd88a282054120d74e56308e35bc9ae36d55ba855c578bee06a8b5d12677a32655044579aa3f7301af81f5f7ccdea89b807a97e064de1ac4dffd846d0b3bf797f6b684462a6abdd2af6b7166e562f67495d9b4740a2c3946657d923d6600e715f778d00fd1349bf42b2a484a3942d5d31ee53e76018e5b56338f1528d8b75dd015eb9d1588ae47bb7d5a29cbfb0af0b8767b4e4104c52f91399205d2530f8abd3b463b087ad4a76d019047fce750ad5c7024f1ac843602fe35f59dc801f1bcc74cd0bc60e165d1b55ad9a2d07e09f51b0c2643be48e6ca0f21b00ead13c71b5331a2637780f7d39ccde121011f879989cd51c3692139cace606cae61efeac2f71c43ec8052f1c280c39559dd2e59d7b6b7471263c93fb057b53003048c0101ea41e305ccafb0f46b995f16d157f1bada9ecb0f2616a24bc717fdc4597324b41adc98b36c6a6e4103827eb69b37eb5ad3d2399a47c1cbf0acb7a48a6cfbe10ec25c3866e77d0a6efcdf60e114f56473715067877ae98b32493a997821d07657f3586cfc8ac2b6fbe3043de3271186f2dbfe160fb8130ccda9a8d39756a0038bffe87a357177d23e8b24ffd3930ded381bba38acea9578ca92d120151deb63b276643f8e6c8beb3155d5c3ed2ab0374576f6c038a4e7461cb29650543f13e762f0482ff9e79db0a503d43526b6f2160c2b0a68fc0433d79e88a5186e4aa80e9333a57205d2cba02e12c2cebf12e131d01c0b6d0ba3bf079713d50ae6f5c7e65f967c4c6bf0e0d321a1ea6daddbb8ed38c31e277fd5c7d117ce95f9eed391e50061888d7210942c175b955ed179962207f1651af90ed59002371a3707cf4405cdbb64e2206924f01cbcb93a0b3cdb19f94f75bdf55218eb2f7c837055bce940d51e46bc8cf2e3a51ba69df0bb3938fe2a2ae6d7e0d53e207e7d702118cc8a4b69601a21b27dc7a2e431a4980ccd879e7565be44c565e9ee91145f68d92a1acca662d2d42b1a1fffac8f17b6e1feadd7c73eefcff32be50fbf946a4b4de3dafadd272009830c8ff990ad751b1349d97cee8c6702b9cbd9c1d205cfd97e0a9bf963f2e231fd03fd116478d4d6c1ab034b6c2c7ad716e679c934dd4f42811ddb4e8f2d6b114ad27027190ce716cb124fbe2830fdb9c02ef375d505c9418cbdbc0ade2dc9d95e4f42492524110a7bc7b4be30977a6c89d61b39c4e1c2aa95d453256218fd0f238f55de2865bae2fdc01763cbb7bedf92e293e8cb49ca0deb6dcfff1da2218bdfc2000f02572c7224ae425bc8b5a1b80464d94dc0ca01bd33a021958dac7ac7b6ce7aff907176189e26052f58334d1c55ce531daccf6fd02dbe60eafa6d8add7ede9c9c84a5cadbf6ff81319eb23781c5ddcb927add06f191c912c0a6e43558f90f465e4395776682110fdd97cffa63f644bef669c034da26630ce21650f2723130ffed858002bfce266ed3fc9af2debf28819dd5ca9724d143089198f7f3a658e0511772537529bc92057e48be9fc989ee2117133c12f06e4cc8dcd20576a5e001995f479d846bd755154a36f356cf85d08b4d284ced61f45626242d334f59ed14d3d75ffefe3b4746f15749575fab979c6d7547347573ab8734808e53b9759292834dd65b9a754d2b23b1637da99ae2a9753ad5e02974ea27ad50fa5168281a300a438c75168725f90e45d48056d94f15452e759b07a5defbbc248f7e07a45f66200201cc9d4fe06cc99c1a72afe8ffecb78b48e5cacdab85edd79bfcc3dd3409edf7217bb51150489cb478fec29fdba4387ccbb56a7bd646b444dfed0e218adb68c51bbddca899a852541e9a8074f8750f4abfbb43a8301b2cd9976773137e515c4ffed0ead524baf0d1e6b7ea9ad29ab86bd257e00ead3f224ae07f6a5302cb943afff99a2ce7ba941c6fd4405c32e19cbe043007269cc270ef1b99b6172a13c57d0d52d75f8b3eeff77497e607cb186fe0488bc22e8c97c31d843809a771e6eb89239d19f1d6597b41549e5542d7cfebc3baeb8281b3943bcc63c896f6ab1eba109059ccc3612803c7d7af7e44d1ef447b4570e71684000bae626cdc4d5782123914157d95304c6def5fa78dfe29074ff09f0e7e95a4c97d141b0d7ee5f803de9c4f80a01410217a28204a755fcf7962a15fa3525d730fc4fe0e45f09099c2cd23e1c2197baf6de42214947f10a2c72e73b7c6dab374af1e8d994f89df3d15253113b697c150974678152ddbe76a8605e36d35a86bfc9ff18f7661ef3f36ac7112f28ad663f2d6257acb18c4d9cfec34ae86d6987090e02d4a5d3fd671a16fd227d4ade26e6b600c9b9b0e1fab7bfb0f52085b78002e3f96be9395ade9ecc8c96121b4290797c1188e003820aedf2e92fa2237d81586e167b7444fd9dba8b8dcd4811e2e3128832432e003884ddd6c32be075befb30b047593aad3d5bd9ec6a83c31240f74d9762d43cb4f2612444f28eebcddcead53f67bc8a41af5360ab72e2eadc0d4aa329523c2cf221b12550cbd3743e7e393b2e705c5875b16b62c5126eeacda37d628a460ab13f102ffa07c5a8e4f3ac895b25aee66c5a56853422a0d78d4a34c89e5c5dbe1f599c0af433c01d71dd26bbb8aa16f923b44aad4b55724bc7f1644e24178632a5133325f2911a2f5a9a78d212fab8a6fa90165c8bc0ed1c66b37fae5fccec0c1a40056f385f07d0d626195b4fd3e681570dc2ac9c0cc1aad4f2ffb51f4a6642a3a698637a2f0a911b5b70b8ac1f3a9f8ae0a8c328c34da3cbf018855cbebc8bf96e3a2602406ba38795c56a077611d8db2afbb05d04cdf6c266719d8c71b06621b46f3d8b275deb9eb3dfa17b9b5b75b73754836f4e31e5bc2005c62c50bb2970523c1d8d4f1239fb82a84fe0185ef6f7b83dc506a897afce836b74bf5cdc3bf9f314e7a68dfe37f82b81277d9964efb618f031a5d6a7eecdde41b2d8fbb980c6bf91691c7bfdf3b8bd57cd12fce53ea2994a92bd91f20d5a622fbfa2d24f42587014db743a292002bdeb0f030e9acf34999975e625d7d029d774f8d60f14ae926f2c760c9b2d396d46483182205299ff8ff523082978d660cda43c6282336380a01c687003611ecca205126512bf8932899ace02eb5d6d8c686d47afdb06fca650cd0ef68731b7b74110c3a06c66f1f5337fab14e3be14614cb3b8c88abd1d52718bcd450c9f25b3f16e4dbdf75743f83006da7c6662c946908314b6433453f423f91957cb5cf7547dd190ccdd8d78fc0cc22c1d127573c308337030ff829e3a1c0fc7cd05ccb405fc637a7fc38b387f11cdc839e4b33552ed674563d547d210f53ea7a07fd75ca166f4e02b381949b5a1227663fd43b234a9ed20ffa9f6390a1310baf2127060a77126046755783c2d011b458c4205ad83ccec57adff0d7dcbfc90f1cf5cc86c6115439d1fdf5b06f26988b2d1bf117060ad88822f33cea5a6a8acec04ed80a6b2dd10782842fe91bc9803779e3f894a7e89cb5167507bd62ce8f9ac55e3c46ee894122c408a5a7d1a0decac5b5ca983f01206b5b9d21d39854fd6259cc83025b44e344918affa3e94b9b8bc8703d498e00a9321fa40652aba9be6d93abb77f81332ddfb9ee5997ff1c59938241c3d8460e4af3c1ec557971726b18ddc03b5eda046f8c0c6cb7eee303ae688406bd5066ccb1874479f3df579ba6b222a47b195660ef79bacbc4eb36ef040661fb3f5714e629307266e2ed73dc140f4aa5c3bdc596acef28457d225fbc4b82bd7e6c5517e3276f492a8fef4f953c81974f0c1adaf6096e620ad01d920dbccb16433808c0806491e681ed935e0f484cb99f5f68a228109a8338a3f8f12e6bd91326c8a7b4c1d651d9cb28f6dc223db5d5418457ee6e9f4cd388992a5661360f30168471ada82761aa4b166de91b723720c60f9c979fcab1af3a8cfa1d8931a5db542f66e5aba2ce2d1858345cc054fa8ac8135346456f421ca4d75e379db40ca881a3582071dd520a7fe6bc34dff69a081b1ae16298588841e7d4136edbf7e09f4c6887c68abc811c17e59ff6df72c93c0f18f7ef54999ee2f417fc173c49ff864055732a1f95f0809d35bb0a9df835ef217c4465ccfb83c7712913205c7f3c4ddefe3a921173911653952b2969a71771385cfa5b50dbfeb3892e4d0a420e29502c5d409ec07dacebbc325e08c1a779cf566d002f939aadf0891d804a96bdc2548d6d1d7d90563d4535ae498831c7520e8304289c47c7da0f3d7b5791c0649470ca3c35f5222de869d241ee831094725d1625393c7b7d66f559a638a05ac973782d56a539389f1844c454d7daa4392b42bb928be4cfb245f56da0d5b75eb073d769ec76216031adfdd9889f74a7719fcf53de0356e8a178d15390c6f83f271235b84d755da4244bf002a0dd76ac1650a62eb099011d71f7e1e3a0ef7576f0826ef963c99a966d21f7dea2795129e1e5c1c876eabffa4951c37b4f4d4845bf2737cab756b9019a5ccb51e65ba5225cc3047f8ef8acb8fc84a01ff5cc1d9aaa65d529ab4159a1c60b9e46292d8118d54ee15c5735832c5ff4340e5f6602680d66a1267037b094abcc8c79f35b5ff143c3267b6770d930624d59c35493ab4d1763610b04c79604290be86d0924d6fb20ec79d6757f1c118a114b4b7ce1c70874262ffaafa9cb2bfcf77c7f935ec71d8fd5047151bb72d05b802c6944fcae4c1cffb259c89853d91c6035016ac7944f1912a7f883358a2a3e7716f210fed5c0331579558a69d079e76ac7e6fade73bcaf88603ea741b84ebc1d73dbcca92d73183891904d59d0e8c68a6eb3dbe9831d8ef28328916cf4f31589d09afd93bbd41d6db84d153ffbb1e23d66c0aeb861f96f6b3319cb843ecc4783ed716c8647fff8909849a1100d6f97c2acbd54d6056df6271a4afdde85d1cfe376447a0e9f899235320c837ab7817aeee68c58f491498d6c8f35ef452cf362d5649bee268b07a6c268d679ba04e68bb4f2bce94292653698ece06d42934db8e037f59c0cea1f87c9585746ed28eb6311cec9a86c808b2addf26e9a989881fde15cd95f866db3080bce4c4becb864676eb099c2d6f28e5ca284b2e3e10987bf670e5a21a0961a8aafb005d282c9e3931a764ff3cbbcff41fe7994735e701a7a5d6a333e59572cafbb8a2658f1a85b2a8f2bacab6292935f9ff2a7d610bfee1119825011e3d7eb2f659f205dca5f2b8d5705fa2b32ba1538df8ccaa5b5fd001f118e8fdedee8f824a3cfe011eaa83bcb7d473a0ae48e56aaa458fa8778f7ec477101517cea951ebebaf5a3cf70a9aa5c7be38f4c5fc44b1e94688d66f6cc62483eecaef05b3c8efd9dfa9af74215b25c569fc775b78a12e906e58752a04fd323ae1c4c12e0e19b1caa8dcdfd8985847ed69ef6a26e9087f0955ac5d369662aeeb9d3404305f6828038342718aaae4163726cbf19c2f2db883d2b7161759ece7eb6394e89209026f88c23bb81d83584c49e99e9ad704ce0fb2eb2342d201e18a56f069e430eb68c819372c9c6dd3e33c4692cb5cee8d844898c68d9d4afd9ae99a2d612dad8a0afaa104e000917c961146725f9618c9747f8f2e6090b3655e1ee857e4feb67942d47942307e3e5d97fdcfe894fb23e987cd4b7c2128f4cf4c4c03d01caceb8604b3f35c866f7a96bf798a94cc44c5c64b9d817f8523b20277df3236d661865491421a6fdbc26b08620f3cffc83a381eb82c032792c68ece70bc9eba99d33967bbaf85328c74657816f68fa50c74bcb562e13c1bc14ed28ef85c3","title":"61. 旋转链表","link":"https://leetcode-cn.com/problems/rotate-list/","question_id":61,"issue_number":10},"8":{"day":8,"pres":["链表的基本知识"],"tags":["链表"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。\n\n你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。\n\n \n\n示例 1:\n```\n\n![image](https://p.ipic.vip/r1afvu.jpg)\n\n```\n输入:head = [1,2,3,4]\n输出:[2,1,4,3]\n示例 2:\n\n输入:head = []\n输出:[]\n示例 3:\n\n输入:head = [1]\n输出:[1]\n \n\n提示:\n\n链表中节点的数目在范围 [0, 100] 内\n0 <= Node.val <= 100\n```","content":"0961e884611df7d4ac47a79a9e3b6f2e719933409cb941ad4b0a63642131446523a6ec636b8aa2147f768c33830d2eb0626e65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dbb21b9f24f42bc1e3a6bfc0502c821960bc893d665b6d3ce9914d58bb5fa4c0bcba15478a36d8e122a75a29858d4a6c750c116e13e549f53bf169ef52165fbc10580c30bcfb4112d0e4993c13011b4032ca83775c0267bccd7a4e0307d08bc62e5b0728f307a83069b74e1c30df4fb70d60a00cc1c52d03c22b2c19fc008a355e6fcdac7b28968768133ecda1cfb81be8a2739dfe3124f692cb85c834006dc780c368661b49cc3276451bd5b457fbd8b4f731903ccdc3c5493c06589a86ac608112fc29a293aa20eaef54f92e05afd753c295ef4f9a56191ce9287ea7ca1c3f9de442cdb95ae9dc4e8b7d891268bc9621275c4582af57e6c8ef768fdbdad1d3b4edbc60d254eed5470c17f8fea3f02efdb732856f183c1b182e80f290296ab7671b0f505971e2d1026d1b6c0dbf5d0145df3560d294a14141b2512bd9481799d181ff5724e90bf069556948ff96201f6f6de61d9f8c0059cafab0eb45634b7da44fed017f21c558c7cba2bfac12b4ce02a001a8d8f778752e18797760fb2df3876e2d0670b163947a172e9266bf0f175ac5c34dfd9080243f4873a4cee2a472e3f864d4df48837b9aa4409a996847187cc608f25ff87a9edfef957c3cc99bf99c675cbd2d3f86b59bbce6de26d8d1b8e284d8bf5f057d97f1fbab7a7e49d5bd57d628cad00a72191fab6612246319b692eec9e4716e077c2de970215d8911f22b46927d96d62f259f8e1d2cfeb41b58c3eecadcd283ee1cebb74539a597d8a88cc4b1a50d73ac1045630b1803244e8fab73b38af77a5425e51484cab3e49308f0eb4831b710c1ff79186fc755f3bdf03896e784736c166be79aacd95adae357a602756b1fe679df5d4db44d1bea0593d1e67ed461329eb63ba12b123892cdb0b4985f069cfd5037d7f3f74e47ab53d2d2e7ba4943c186aefaf82a16b4a8cf4afc77542fc2467a8c7c75af0494fb74bb8c50a70b10bed9aa636e9470dff4d58a17cc7550224a0a78f9c901d7cd00742d7f4f874d905fbe9916b49e791beac5a7828355dbaa743f7e5031604d63433e74db3e5c19bfeda3407e3fb2b8023b56520da6b84f4e9a8f326cfbab4caae7d384a2deba25e6a76595b8b71b92d3edac020192bb6ff366e74cd34a51e810dab548811f78cf840c9fa316e5addf453e1f5ea7de42c7d071657f536b342226f72c75b5d433e3598db56c0fb2754407cd6094fb19588cc9b770d13c9e4dee74d983c74ee2814a68f25ff2f5b8fec0faeecf7f4ac4acb89fa219932e53fb48f5c494de71c5ffded1c66e62ff9635cfbf48ff91fd63286ce5997963e3f6120d97ebe4ac4c06cef256e566a21da802cddcca1f71d65c37869968a9549cff2c2f34b75a56e74933eee63c5290f4133f6f32fbabb5fac19be25be5564d6020f88650fb354e76d2b84adb5b46d993f44ad410083860a6044003ec396ddb888f0ea5ece99549afd27c435b66f7c507c56431f7060b6cc45e61923b4b522d99d0c66cf26f7023581be899e5fe55b5a26efa2561ca198722fced92fa5250f9061ad3193f0d1a504509b9b02aaec0e4037a5616fd9867a4fc4c1213167eb9affa1f93cb1114f99365d5136c187bedd32fa816099b05cbceb11cad783327d2739951fef2f5487ce62356daeaeaafe1aa353e9978bb12a3cdb228adfcaf0ef490f4dd29c0d2c3072883e70c50c09d25c1fdc75328bb6d1c1926118eb49cf56b443e2888fabed3aafe4c25eb229a88fba94384e3b1093a2c2b02c8c19b2e702b6b6971e147f3ab240b3992ec695b4ee48665acd8e065d02db97af63c9602bd236f18555665ff0aad5aebf8aa1cc2c8fb0e9dbf0c620a805aaeaf59cae74994380f63d0b30afdfb5c350b5f11f4b40d8854eb22c4c0083ac2bea795f14f39b48548f7d671be41f9ea8f2b344cffb262f22e3902a0743a0db24b4203bb61a6df4491fcc63d73cc777c362dcb41b78e0555cf2cc677c1660507e53c55d592ce254a05ca9cff3f9eb2eabe4604afc0490581c801099dd196a02b3d5e0a8767488dc8a15be6185fdaa154de4509cb73ee45d56a2d70fe2d57816aa6b77568c5cc0add554d835297e5e2c89829a5f82beb02d64fca4641249a0f1b3017a8bca1d1fd207fb8a5d849e5d359ec64d603631c33396356b2be920e0bdab2cf4dd2d3cc2b5d821176bb21013b50c32bd0323bcd0c2c985647d07757f3fffc92e5f0ef91d06140e5be98790e8fb095fb4bd67ad00e0c490c48e81698fe46e690a9dc2ff613ad3920539a25f331ae1cb22268cc02376f849f853ed822e1baf6ef7d43850b18bff08857b6ae2119690f97aad446119d9e96b682fe43c6659ece5f57366139cd12908972089a0b3fcc911294fa397038c7407c2ef710f9b90e7205c4292ac29b003c2b830ef926d69bbfaa7808e21ad60d04cfee2919fc17a5b8fa7e431af91f04a555587152b21dcab6d0420e0fac2c53186b691de7307a85ab7c128107144ea75dea77962713fd6d19f83bcc922422113d07cd763acdfa3661fcb5a31c63205ef24a29b2bc7d4ffd4c34c0b09d83904ac9fd6b8647b284dd7b634de0930ba5afec73f6fa74d7900b475513b95a1843278761958b363f6a4269a433b897865cb5ee51f4d3c14a2f2d87013bdf87da032b3dd9737ddbe2fc281bbcb6c75ef7d238d38ef4eeb3e899355f6a29c005bc89594963e5ded6f32d61c117b5586ffdf050797c438e17c4d515273143303e4fb7a1b14641edfcfa7b0dd9779e78dac40481f490f33721012c24b02069ff2ff14ce035ea0ea13b9195e6f8bd51051f777dda4fa33e11c52b70aabdac9c7fbc61459555eb0c08e5545b91c70b0e6c00b8dcd4674e84cf8a5ad150313b66103bd52425085179cd8fe39de36e408246c04a01786051678af112035217264655267444cf3ceb48cd3abf0c218ee80dccf183a1d4f4c5298bdd621c3e25dce93e844750c546a962a32fc3ac410f1aaf13cdd21a587afc0b6b4b4cb6e796159262930e51e4188178a9554caa527973d39c39092d116b166551d15b01cd49494b0f6fcae422eff5994d9bcec47411e702395e2c8b7a1a827d11d0eacf947dfb14ebde69fef245573a0fb16560b3d8c3a5181cc0a56c95ce1941d0e8843d23ca718cfd8bcbf276ef1958bad8a0c9c212c7015443051015f2cb11e42bf2d799461681d2481e6c9b4e1982df8f88986cae18f3204bf6e954822706156bd3177c50180fc5ac8b28a8934a4a7f14b1a323cd58afc318a1de5c084d8cc7c717da7b4c0ae4da81c5bcbada806bdd810de96e1a453beb0efbf82171665fa90d17beffbbb33765ce8b4f65bce02b503ecce8b2c8d55f00d3654ec2a32cb7814c73b44efe59116a655e69998aa39a72eb4750d14dc2fbbac04c7ae3ed47f7900370a2fecdecb78b48cf0ca58ceea7ced1a2c2b34725805fd6fb4adf95d33e38a51442295160647380f153148e6414a6350f89c940f175c59b560a291c1e9b2f1fe6c44781081127cdbf35f4088d2cc4dca0e29ff1c9f98bafe9bcb707f595f2687e5f525f497204da90a42cfe622d38bd55103f159cf12fb63f22e25b2398dfc96641652ee28892ab6c1564feca158a200e3ccadc8eb27b6817c700dc29bd548d7a449ee118a8a964fd9e37d8c8c559659ac505f9226e032cbb37f2ec60b1979b0eabe00d6d3c98b8e2f0d5995d8852ab8cae9dfc1dfc7c9e39a7e8c7665b9f4423ef800306c1a7e5b84de606f6c7f2622941b9cf6ea7a9d399fed1f41168be3cb6d49431a5c72f64ecd53a6e691f470546d444d2291ac040cbe42d76516d6444411804d78a1f2086576c1c384e0d4ed0db39561020a576ff09430b8547a4a5d852e8a05842e4f92d232c358273628a9b5f89df3d15a4e8d1315b28db41ccb8f7ca5d01ffac4eea6d6e47c251112a01b8cc00b3c5407f00ebd2832baa97a6f8099906210274ec2378210d9c0982420b1924fc7eae2353ec5a2819a2e398ab4f29b6d71cd63c92dc898883c8ac84167a7e152e6828503ee1f576a5a73947ca5523387b84dfeb3b57abe501d33746e04abb418a9e37604b3a19beeaa9e104dbde73aa1a7cf76c32e3ead7633c93b9b140201e7f5c16317f68370ecac43bf4e4cd5eafce8cf6fa02e6fac1b7f953b93ed4b409ff3fd9029aeb41365a5cd352b03748cff3365b09a54960e4bbbab2239e46099db7944d98b06d77479600952bfd2db23e9e45a0167a0d9cc1a2c9e4486db53edb7f4252315841d8a32f82b3c5f18b8699e5a1542dce56a7be00a89eef6b844946f0acb5042ed72f6643ea407f6d79142d33117745a3ffa6e39e436aea8223fd5a1d8def478ac6307afdf7b3c485c5ac1b7dbbc0e2754c7b2a83a5ac6a3a4d24c72dcb8c9f75ec0b669405a1b86f7e687e907f88b0b273b0b60faea5dcb0faf420ef7d84349416db0e9f159caad6bbfde4f50b7755f60e621053a67b401cc9ac85a6059e09d839086203cfa9380b744721a7b6f775dca4fa12e1168ef2be567f292462a7ff3555c25e762a801dbed2492f8f849af57d9fe50684b04ed2e1213edbc11f629a15bdac36aa1ab0d796bd9669464827d3e33edbb6127dd6cc00a324db5665112677ecc3e41b7893bbf60b6afd5297edf19a63dfbb33956a8953fb7183fd54974b20c8e87db7de6361ac71871c4df961858e10008adeb530a7e3ea0cdcc37868587c17f93217d960ec4aa769f2940385f7dbd8cb61c677704122c4faf6033fa88a8d28498217a867677323204f89d0007b43e7eb381b2d146eacc64dceb7ca2eb5d6d888c9837ae0f36ed145179fa168731b7b293b0c3a548366600179fae30b68fa6c02d00ccc83ebfeff0e16bfdb04b1971f7ad97861f55f34138a19789fc8082ad87b172d1c1761092253379ad77ca8a42613dd045cd0dfda8298e64e888273397374c6601811f53c9ba6c8fd7bd67ec74b5fa879feb976ae8efc518ea9c56133552ed674563d5434674e5da7704ef068cb0b210b47a4abc8c75a5a62277bda756612cad212e79f7e89a22a02b273311e1072522e4b6842dcf3fa11b458c4205ad83ca28c29d6b49898fac95f4eb0a2c98254546290e0e4e7724a97992a21b01d065a818204f374af1b2e83c2c041b7597007d10782842faf5a9a846b72c8ef84e2fbd2b80b6043bb4886cadb81451646eee508719066eab1d1f38c9296fd92d9284321790d877fa1cc4fd76259cc8302370db043b38aece8a7488a8d9b3953489f09e53435ec4313efa5be3ed6babd65900f2c9baea70ac290440dfdcd58ac9e464e0ab3ebc62520256d6c1f91e67c5cd64c16f22263b3fbba28f0248b00a21c1585fbd25679eec219dfe9f667aa71194834bd37f38adefb08ea4a151ff36c1258a025303a23a3a9698f3d0556bfe99cce97e5ef7e5f3b2243bb16ecff24293710f52b551d44caf565953c81974f0c1adaf547ee95f278fe71810e7e3c107d4b8fce20ffa98cee9d580f515cb89f7568a228109a8338a3f8f12e3b8e5a699bbb9fcfd63ed7856dae882220b59b04dc03d033db14c8eadc6b124b360f30168471ada87424e9041b66d21a627233885beec39fd7b1e973dea949e77ee1d74f1866f581a2ce2d1858345cc054aad88d2a544b4c240c10fc9f5e6187cd49ebceed1c4e3e99171155ccbc34dff6d34e1b4af36cd61d8047b8905c2a9ef7fd9f0a21d595ded2ce5852feb5f6df728a735a56a3ef5f849eb59745af435206bbc3404873645acda4eed271fe11b7a827ef3c7c1477c2e8ec9f250313205c7f3c1f9baa6fc05f73c353008e44653ae20d061201d01b109bd499f97719420d403a504f1204db91579babb7720b51a8a16a814c08542fdbdfecb48952d24ad8f29654c5285c399e18311d7cb444cb5e93075ccd0460d90683f00f3d7b57d08e37946dca006ea66b43ef68d60dcda91094725d576b6a3235383ea159bb38a11f832a767239d76d129f1844c404859fa4242b54bd88eda1cfe257ac6bacc1a644d236962dec376f2431e5b898cc913ae2299bc479c30306f9af36940b8aa9a06b270f35f0083419aa6a0ea8568add26be164da67ea2d930166cfb9fc9bdef3b33a8d660b72691cebc0e67f78eb3771f6cb9ff9eba22e4f1bf1105c3664f050d04fb0d37cae31be901875ccb12ad1bae3f50bd04628eb6e9e0a8aea01ff5cc58d6f9208746ea0557ef8353ca46342dcf679b0bb9082f70d7790dba34461a244684b6f26790e0f11c33627e2453a34a51bf069b727b2a22f27f31083b8615d7814d1763610b04c7961c7e44e2284c7098996ee164c31b551c118a430e1f29b3890835682eb1b5b9c131d6e3716f9334e456aeff04351efe0bb53585460347ecbe2520e6cb61ef8443f25924235c2bc5ab5a1114b182a63b912a58541be44e90d2c1375b701d94029475e723c0f4fa9d32f9b5e66023ba41bf5df0596bcadfed713205709a8445189ef2d1f83ab3c6f48353dbbe9324c576b8b203c19a81ea85ef9c4531fc186a59b7e1b66f2089fdec0fb62b2e3945d3d13881039ef0612be910ff94d9cb1dcf5f1b6fcb9aefff54d6056df6352b4afdde85d1eae47110580495cc85357345ec2cb79c7ac6fa9241c3c527c8668f76d65e7fba0cd2659fa03de252f4c2758161a10df586a2fface31b970159c0b8e06c08db4aa1e97bad8b0bb11fddfe581913a164bb37438d9afc6cdede3b85be2dc18e89d9a8e776970aca21e35c59c7005588b36f7c44b099c2d6c3ed25f6eafda7ef0382ec221a4b6fa6bc73dffdbd1bf08ec2e3e67f320af9cbfabe12aa3adc211b2b157b1e143323591905bebcd35659f0b50531f667e3fc628f9317dafda6956e98f05f5cda5359b79bed7a3fc24b0e9e5235c3125dae7b61e2437b948ec3adb5af141f04e1d78ac5c2d224a3cfa957eaa0709622027017f99e1cffad69d08778f7ec477101513fbfc74deff5e1f6807de4a85674ba8a281a9c1f05e3428d66f6cc300d6ae4d6be5b78dbb0d0a397af4d03be0850b5dc1ea49e5fdd62aad5c33fc8159e0cd98bbe0f493dda147b86a4f7a297305571346bc4040a3179d8635bacfcac214920d5becb7f7a6cfa9ecb9a5f48cc89b9e11ea9070f3103f286a68e9d0906c95a8ed8409757af3376e8186d58f756001b03a397346eb9ab56a41eeaa984d140be974fbc860b60015e8b4e1f26bc9464f09b6a491c7aa7013b68d9cfaedea89bb1ca1ec5eaa98db6ddcdb0eaad5d62275c2af3578c896c3a204cdd98b4b057574ed4248c77c876491ecc805a237633b5e2ec1d93b276f55e7ea61ad316cb8ab11768b8cad2216b494ff110ab910ba09e01e6619190f035118fbb1f39635843946062396d58374626c5a8a646c49168adf0991d3985e18ed2297508782e7040b6ffc0d313fb09bea9072ea2086fd1d6b27a8c3e8db0584c4cf709bf7d92221949c3d1ffc58bdeaaa7d19ec865fa9c564997cdfd2444203802cac991ae325ebe23e520b42745c9be0c972cd2ab28814397d2865576a2cc35b811fea9596000d99c57404e02f6007aa040795fc4e5914e8ded0a4802be21d65549bda4196dc1182130424dcdcdee1c08ed6a5151bde7d76df2b4e395b412c7d1c1deee68c0277680d4afa1249559e77bce91db3a9a70d8f19bcf23f2241b579c434f5e203247ca03f8900ff807500183ffb0514c38347042e4d087fa96fb747426e2f19d23e726ee2858378e293784739ee363611d65d7ed9da12f3c8668e3f92e7aa1b17aa7dbe5402ed889ea8f5706e1e3b9f79520309e46747de0e2b8ab4f2cb96340378c0de4bba329231e5bc38b82fbd97e9e67c2504fcd418ff65ed51a72ae30b6175f3554faa1d441f94ef486c4383cd209536a3faf4f4ce4012dead8602b6415fc88e0032a7f24e7c28fd2940f0bd363ca1c11a9252234b808119554b815859ae850a37e18784962d90bd875f102fe04921a0311ae709609223385b8909236e52a5f371a86e68415ae78b7d8e0c284de28654f450530c349553778465382a737c40e1fff9367a6849876118ed66855f6bac170970bb3f0199b029257068172642f2d95828b6731fd5013ad5709d94736357ab2f841ca1b7ce569dade0fbde1b9a20e8b342a025a6d27aa0decc774d84462acbb02c9f0f1aea441254e7f5462bc963e85567e610c55d0b4a414a5b9d4e2123c3cd08b82fa932018467673e73dab4795503fe3c7ef7b82cea8ae31ba9b7583c501c162188f314beff12e831bfd898dfc1dd9903372a2d22f32ab7a251981672fb7934c790a21ac2ef1ab0ac9f8aed5167010c05a4805eae4064b51325aa6af74e5f986e88fd566237929d9481a2a4ff84afc558b54a1f44ed85cb828de01c6a6db7b8e9f4f7eebb6efe7676528b3ae2f152585a4243d04e2ad85a17ec7c769d1ba5d4fcacfa6c29eeff12e7fb764d06ddb6f5fd1361c54564573e4984e54e1ad8aee853bf35f45133d646e0bfd28566a6b600634382d9f6f60d565dd9a2e9bfb6f9ceba1452714a68b5e2936ab0a2afaf342d680d4a5816ee03e5d7be4019e235e4a7f88f49ade880d53003dc486e541132413e2c7222abc7224b2606f28b8ee99c6a99a7dbd9d27fc85657fce4dc6c418d3a83220fb1b33b3daf0c868e48894a97ec93b3e3c215405c35c5d8fe47853cd4c070224e6071f1b0f319b1f2bcf0146839f59c2a510fbc816cf957a73fb67fae1932aeb56f57502aae870cc09bedfdb7e3b1a42129b80629e6098db54278c64b16128aa869a97bd7d63834ecd863001036911114b8a1741ef0afab6c73dac9923bec19691541df40d13fc47c89bb648208021db0c998a09cc642a8910e52903d84a9cf3d5c75056a2ad0cace218591fd2a1c386c184da8dee9a8b9b9f4b67863d158a4899cf6eb794de1370837641db6c6385364d35d0cec66f59be85147d64c95c1db66c04846ed15d76aa4ac3b7c0a36ec976f2e5344f71ab42d953572b8229f6850f8a98c9301329a2e0dfa907b8a70cb57337aae003da5cc03a99865640723a715c140237f5e16e17ea8051e075e1e4338a0551041b4117d50bdd7ac7efae061f1846e5dcd84dab03cbdfaad3887e8ed6eb3bab98463e29873857203927743b9f113fa69bcbc5e493a587d5fdd88632551fa559c96ca6540b1c83b10f69539ddf793a0d36aa97682be3ba6ab48750e436dcf941ef88391f96b124951f98b452050356f2c92e18300e3675983b81474ab464e78ab42bc30d5545827032d444d07e2b8b1886dfc89fb0ddb0328b77d5bf249506dd8774e6484be3fb0ce04662e100efc208bfe83c7212406f92a849e6195f1bcc122c41412b6e759ec3a0f06de7ad5096514de6fbb9819f47e450ce3f33672463cecd2762c4432c8b4d0e2a889f6cd74c65c9f92c770c731938727336862b772581717e530d9f1f332d2e4f17571ef9b9fc73c35cfde68216fc22df5b099f5ffab510a1a2dc1150aa20ceb6d4536e320690d117ef47d94c89de1b53476e9ee15b227270d8815c37ac35ca0eeb5e807a20b4db3fac08ac60a1d899eb313d2f90d1ea1425eb1410541c5085b011998f49fcf7ecf3ca702f68db9d0a87aba4cbe5cf55a0e937c4d04304dc64ca48a877e5f00c242e364655f722edcdcef744b5b1a462d17eaa54c0dafb1d02a56c8e04b4c9d49f38f4f59eada004a4633c903a193f9dbed13f4b47e13e32af90b092abf390731cda51a785e0636d01cb980cc9a4f4416045bcba76ccb55637abbb58f7c42b47c02c52f687834694541bb73154da9faed940688b674d2f31db21acb2a9bfeddab2dccdc9b485d56b8ec3e8cd98f94da18f99396a1e50fd2120b3865050f04e3c27f1e0c19b106aeba34ef8ceecf8944230f33b1da03a0ad698873e9759484cba4aa4a716f0597071e1917690e283cb790c0524c960ea09ca3dbae9d7a8c918223ef27b4e31c61c043e5c67bb021de4fb1d2881ffcb21f4d6302bc9cd70fc12bf1f27985f6feda2448434a087fc8c738a81343b62669b6f76abf9ea3da747b04d310378025aaeef189794bb4176638434fd454fcc04945ed48f1121794d24e9b74bfde0500f889a5002a29e6c536973a3ab12fe696e37afbf7df94a7920561352ac1dc11650b5f13edc394aa5dfa820805dd87d1eb3fb","title":"24. 两两交换链表中的节点","link":"https://leetcode-cn.com/problems/swap-nodes-in-pairs/","question_id":24,"issue_number":11},"9":{"day":9,"pres":["递归","二叉搜索树的任意一个节点,当前节点的值必然大于所有左子树节点的值。同理,当前节点的值必然小于所有右子树节点的值"],"tags":["链表","二叉搜索树"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。\n\n本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。\n\n示例:\n\n给定的有序链表: [-10, -3, 0, 5, 9],\n\n一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:\n\n 0\n / \\\n -3 9\n / /\n -10 5\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d758e3d84c2812cf0556130537954472458a5a8244eccfe0314098752ef1f55d56fe5890764637dbbb538ee3ea3b0b26efc3b6f7198dbc5f64420cceb8a92503027f6728498a4018d7bba2ac0f1a6be991431c01b75b09f632538146be7c5c7f07cdf4a282953bed37be6a0887ba40eb273568dc7d7ca8af61ec768fa28f56ac248147bbcfcca92f808a73611acb8995e751a753f12a1df6a23445af5a96b1d6c01a1d2fa7a193862b909e95b7ef710365bb862fe616bc448ce9d722d837c1071a110c95371c1192dcf279d9165163fcda1cfb81be8a04ca9f5372ef689d785ce040971f38cfe4864225cc038794814fcb673ced59ec1368d0b206b6f8c44073de293ea1b956ca73ed2c7ac4785c60b9d0764c3c10bbf85a420a43c5e37956a44e4bf2857d9fb0190af1596fc1fd36dfc7b78eacf226d1244d9d5779890c003d0c2a188c6c9b79b10bb5c858f5c5370db83f3fb7b9a9778cf4e585a1554758d951d99af09e212135b5a61da3fb0cdd32436e6111a09689fa74939a07456bc7f3bd6761a9ec28b10c6a92f4fc732196f05b6ba41575633b921d4f11b1ab5e3d361d6a4d0dda87bc90c63062ada6c0dfe82e94a80a3b231c10b7a14d0ceeaa33e0b51917fea3d6e0a46f469c4946c07c136df7897711efa8e09d02462a8b74e5c96c2fba89c767c64d4f74b815099b16a99956746235525806a9b4217d4cd8ae95063a9a89dc66ee05ff2cb0324e2e3c59f6ecf97e5f2ee878f3e617bc08ae4eb385624633b56ee3ecad02a7d0026ab6c3b254f16b593f2cbd3596c27772df35b21689e16c42544a04296d51c24a18a1c3bd8b5235ec5f9ded1e8a9ed3df7b67818aaabdda998d6bdb30172a6084a68321602394585ab9e3bd58f6c1961f052dfe7de52152ee861a66eb9438ed91782f8cd50da5f31f9125702b7b8f6e0266c2f1cdd541ba432c9cfa0883cb30ca1c158ea8b23e45a0c58fb0abdaf3a5eac44bbda921537545bc74770f6cb1160cf8d2781c362e309522d6cfff5041e1a2b1f861bbd95cd57c27f53287cdbef58d0fd678f4419259ade0b9ea0016fb694f36e793cdb838e848829c32df1b68eb24313bb08769615765625e964c10b856aa402e3fdfa234a1c8e9097541c5e05bace97a9e8fff1aee4b9bf85fd7b6829fec0cd50d3014f295150e49033b42334a001b41ddc17586f432b5779b945814f511a39df13157c78c3c5380cd55dffe578d4494bf713fabe45bc1f77e7bd0dbc9cdf233f1bda96cbd650170cd9b0c1f3bad6e5fccde877f3d7263ad625f52c72e99d64dfb58811f094d21a5844563ab45a95b467ed77da8c01927549dde7d5663a6a012e4b49274dc88f613a723b1cdc229d9674e2183e705bfd4a395348c6575efeb334c1b353ff9fd381a8c322f240169ccf668b3d22929e2779c59d3cf21fd538e964ef47276261830336eefb6ecd0a8092731f58d96015814878b6d07d098eb373323c50c7dddec09be7fe118152283905a8e57c9a7e551e8dad0cb47604a3928019c95940272cee33296ceb6d09d1c7f315d088edf62d959d08771812c94d06c25332f3290640c45d5ebe397f482f97dcc663c66d7b3a5910c299e5f650bca0826c491fe54eda3584adb38f05749d75218d64216f677f1db93f77b124c1d30f7b6115f3906babdc67f0b89db5100dfb1db7cc1a371510018c172e654f888422cf7538f36efab41daf640e0368b556fe18e6afab451aba3034a8f88dc5ded7642ef02da449cedbfeb57f390d9f315d56dd16d8dfed07278fe60d7fe49503c9f3e17028b9481605241197ac90cc70473e094f151274078f110f8145af185e3124fadfdf67195c701fb5adac48153ac0f6bf1e0cd57eb18e3493d1ac96f8e6a172acc1e36bfe3db951dc3c8e3f79f5a787a3ad65c7c10321b5fac866ef9eb207d1e3193fa849cc73549f476063e63602b9485ccd527c99ecc8cfdb0fbc2b8057e30fc9f81936eeb1ab89fe4c038e4d15c259e577815e5426fc94ae3a28fa37c289c93ec55e5ce41fe57c8b0ad0d707ebc0a45b4e8c1f5b7b65cb2bf1bfb8877b88ca49d0693539e62a5dd7a7ece389c5b8e2589acdedf2c82e2018489fe81a36bbe40d645c3845777c6eda5606d0cdc604f85d03f1c5d2534519e071f842d7782673e31959b276ab9d596be7e20bf66d4fbb649ce1d4c39c334b4ab023a73589ae4b2a5190505325752577212004e826afc68559904b9d619620a6dbaf33356d06256640cb994f7402ea167f64a0b04a8d8a25e4bbbb9902a31a969f45fee20994d435f9f535107f9fcacfee96cb6056e677649490721096ff7cd470c5c9cffae2ce72825236e044049df64df51db3fdf59505f1301b84f237a1cd4caeefdb6a73038c19be0b82c08217ca79e8d36d301ba55de0633f3a50bd461292d44e60d29182fe1d867586d814017a2d39fc5dcfc3372df64f7298ab18aedd2f5a0f039aa3a42fc77776e1bd91364641c6d2402d52a96fbe2e93cbeae22049e8568e0b4ff9a05135f217b5ace265741a98566ba1524f5e5cb81ec1ea981a4f29bb065d0d670f3e3ab2965a1ada917bc693816bd70ccc17fada31bdfc7de74a55f9f990dbac0a8f89cdaa2d6294f8aa1dedf8f227d9a02358a203ba093ed1e40e7d79833500e166fb5d346c3747112570ef33665f6ea6e074f7d4d7d7f1db72ad84eae6c2e15e27e3a09bc1a877ee2a1840a34c63863d1751bfa8ed5bc5a06c4000f5a4e26cbcdb406c23ca802e544ba73c179c634b082b3c121dfd9ad9ee75a97a7299deac7300761766385d8642dba1003bb196e1bf05f4774bdda6eac9d3ce8618092695807c462df9ef29aa03ee1f39974470487ec98394c1f2218ffb37c229de4ff07fff5b907169665c58daf0ecbf9c0dc60a9cf27895e77d6a3d0aab3e939956e84942449c76d74a2d8a84ce96692046c7f8677c14c01f97a1adae96e0277044155c238bbeebc3b121748c059b1231bbfca9e25e22dcacf0df9faed6d99ede2b9e7ea51bab1488b83c324ddc89eca3d0e3c029e58c26382402e8a91cc4000f9364832cf16ef4d56bbaf94a813c1c918ed06faec28d91666c50d815fd699aa038b0629b25e7b722ba893684f0b6d7fca094dad9b975fefb00d5a68c8fb250864db0b1c01f858c813555e70f271708833f41c35811c0e9cfb928ba46e2ba11916e8fbcb2b869f8a276c3b9f75d7485e428c74de1b3471635790456e5687f510839a337918c190b155904c268c8de979ef9e57b02d8e43ca09fc2283dc952d6d0ed66c9b346081d6b52e1619c7cde9e774dc428dbc1859d169a8ace84cf042800f84b33ec82e2989bc0a1599a2e19df6643e0c78577a4a15e9a69430d9b88cf8cb4ef5254ea30089721ef9283ff14950f33ab9aa99953e580725f622bf5e8256d84c776f74e073ed1e8a8c8c04e49b7650687e2689dd60467d20bf653156d319bc1294d6a55fd0be09f65e584a7e9da0763a67ca069599ff83e1526671c4948cf0c60254360535f646e52cfc47c5185be54cac69a303ea50d520d1f25fbab171fcbb44afc9e6e9fad4e6b8abd2792d30e4b3e7a51cce9ce1759a824e5ab830a248632eb1b2cd9dc676e1341031c0a592c3058a5607824167e420559456941a6056de554b5c9b92d8c94dae05505f73fbb810de7ab98d9cf66d4a6ed721e7e2ab2cbac4968966eea083acac59e7ae3969f10cd12bb0d5dd650449ee14a206abc3756d25b181b91d23846e1332a204fa460b578319821031192400b86c6bebcf6a7a881b35dda17ff1c4c7d3bd23df56685445a6f3b6cc2a9ef2304b38075663b38a80ac13711b8697633c7a504e7f98ab3b292b587b427864a0609e46440fec50e5496a7c9fdcadecaad0b807d5f43a00e73e1a2da979df8e3e98639551d6e8b4a79583f4ea4b72d48ca9792c90bbf40bf697fd702e10c1b9a6920de867c73e5898ef220a32ac4904889df6850222047dfc3881fd946705d689aa366861caf393bd025fc9ef2ce3a4aa77a77e8714eae8a8779f29b6127c912cb81c6aa27b88683d73efee7264e1524b434e0679b739cabec7f0f1e0c869b1e13817bfb581a0f586a00757e8dafd290f887ec8edf7a3cf62242c7db4df309387b84df2e92fa6c788f15dda07aac135c97d8b1bf93f0cf5b766565823424e0228356f76c32e32d5beff80b19258aefd6c8fe82dfa93f000e0f749533794398036945440164a9ad9c80f900a734d7ef15f46745b72e2efa889de6779562c28e211d590163e5634ae7b8b9b2e705c5ce1d46ec225265abe89337db21ca74cf56db02ffa07c09c2006d86c7f64ca23492df74535f10591691ab1fc5f7b8d5b7b4d58fc4106801ca1d942ae897e921842f5fe6fea84a79d03e4556b9382c6d64146b665f3411eab0e8b1d35f7af9882ab34e73c8c50eccc6387bb5b2f2cecaddb51530b6c3f7315f353c9ebde3643b4722c63ac1e09e63f93b32dc76d5fc626f2968dc0688adb23bf5f74ba0a5d6acebe158a63a8025c00b95128d59c7a4cdb1eef4ab651b1ce91f425f61874a2600c1a6d2b54b9514db304e2b509bc7774f314f7af9c8a227c2f6f133ea17e1bcb0530d574774acb7135bc2004600aa0ab6db463adfa697f66bccb000f7b14dd0bb2634cd954d48916affe07fe94cdf8396f3d34540632df9e97a83bc5c61ce901aa338e3041c4552388efcd5471494a6cc2a61fc1780edf79a7acfdc7c8a05871dbe29d7e67e970266c8ae7aa5916924e938874f18fb63bb95064c91a6f064f2b1ea49cac25a6b4c6d4bac5d4f8d60f14ae926a5dd6cd1a289969b60cc4b6b4023a6fde00f1fe7f5fe12049206876c2f36765f03c580547918b9af775f68142e86880299ac947cf093b689c29170fda06fcd7f1d9f883a0a4f0f3b737f4e0eaa7b660759b5f50b31e10e1a8a6280c3c79d863039a6de41d8d80f7e5fa8d2df2e5e53ca5339c9892269dd7c447654216f01771a63d5cd3dbac22f138f4158d0cfd8cb95b36e8d817305271aa9604b46b46cebe781c3618d46e0574f833cbaaf3aa99cbd0887e1db0a774e04d674563d547d214679ab625e9e3a924e655e4da9f8c09b47126f237e902009609ed20ffa9f30dcee3143fb6d314a4d665d7d572d0285e88450fd14c4265cd87a8f962e8fc49999e79d0f1de8ccd28758187690f58bb07226deca7e4fff5943528cc044bc6bea476ad9828f44ff142568895399ae2faf5a9ad43937a6a0c0a7f5dabc006043bb4888cec991532208abbd5c7c8e28afbbc0bba68f96b5d7986c4d6f617ff9648bcc4fd76259ccf7501e018d589980a2adf5418c8bc8703d499e1be55d67e1433ce4edfb65c0b5bd7cd97f359ea7a211a6d51c5993821ce9853e0145e7e6d86965636e244bddf03b48cb5b01ca057fa3caf54b9e50cd1dab11518ffd815c7feb98569ba6b222a43f5c1060ef79a1de9db016ef040661f371120bef77647f67cfe03a880c097b82d9fad29fefb86e41332e49bc4e82e421257557ab5901066ecaf565953cd3d21b594894f55be482f20d9b35c40e6361696513eac024d1cce2a199d3cea4ce1e179af224edb83c458613f2fb04110c88bfc8a1f1440ae11078b63e5daaf4004a841ed17ddc3d7bf9cddcada5ddffb8a4d300dc6b1585a430cd9abe069c8685f85bac70172e0d0b0bfc1b6bd813b7610ace3262b9cee58029d7c4989a4ffb3e1268818aadce90e6901b5198c00b58bf05453ee4e6c44d9692e5e6b87adb394fe2def173aa5b9916b56639a9ca1d407656fbfc4242277a3cbed27f193247e88e1c5218efa018ca97f7f41afcd0b5d33631d490f787d928524507b37496276fae75f5cb80b24618002287c689a698e7a649b1f676dd563d981279bfa8d99325b7fffdec569edd5d3a2b24ebc9808692939584fb86203bb4115932afe9cf384cea36948eb7bb561e003634bf45d0107870f84ae487b427c2b1c18568f93bde5dd4c11fa8ee34f6034183f8c7df595fdd5dd766abbc4cfaa927e91d930125bd52fedcd2be92fbe0d0a26df962a0429962cc52167df44430d74c109407cdd5ab69255ca39284af99ab07f473f2d4a902c37d9d39ab7f0b4af82b4b1c2d37b20fc00b45df0693bb31208353bf5f295fa5e294977cd5df9a1e808250b06540947896fc65de0050fbc9ed396500005db0eb4244ee48a4733e50b3f6321435b387f6b9b597ad31a4bbfa8cea43bdc2c98fcc25ee805e269f44c73afe5eda6ed070ebce518b7f8ab4e3ffb280a063ffcc91764be552b16ee6c467739b5be08ce4229012f4459b8cea1ece997fb0ebdc9ae48797e06ebadcf004056f5622b003f89422b45ed5e6bcc527ba8aadb44ace5a1cd9d2e7cccdb96553cebdc13eb25174b9ee31ad3858adf9d9aa0ad7c6cfba415ccfce82ba3661352ef139279ce904bc42c7233bffe05abf7e97538a410d0db82dafee85b2f3365dce00c7e1f4a6ac2879dec2c0250267b75cf0f3a0cf68fe0e5e1cd6d8db84088a0db647814d2b5150d3113c27fff834f434b434d09e364862b1a98a9f185eb8d0043b512ef87b547d4b82293d43ce9b2e7434f34270687e77461da0c27d9ef2ba156273ffdd061637ae65d5a293f75219c70ada2f2adbc164ed5d3f32018f14805f56c9973753e65bdd9e779bada6484e4077236481ccf1f1754c30afe49609bc042cbe1f1319b90ad4070bc62dbe1abbe471db588e5f62b21cc01c66ad289c35e7134d043e2f12ef4a97da091852a9c221c64a31bd10589b45ba1540d090fc49ed54f9d731103cdf304ff43466d6141065566d62d61fdf11aa09acc452acc63d0aa9fcd376306f1e0c39b11910744d2fcd1b1aa4e2bda71b10f8151679a212023a0538c880cf5e563c0b826dc32db6a9af9d82ca8680939dcafc205d4e8c8f1829c98a1ae7743fc22db93d1e2b4e05a53228b9a8469cd56f341fe8c349a8ae2c97a871d4dd1fee9502dcd50206095a2537a9dadb0648647a2d47be65732591590db45bcc8193872d3dc26c47fd3f3ce23262fdb6bbf5b376394d366d386667f53f5d89e9602bc78d0ed89e11ad31ee3377fc8ca61b436be2f90a7a58740c768df123fbd1593cb12044b934e8021abd3ba35ea768bc8aff70455c9530023b3a180c37f62e646738f5556a231190603cc6e9ee755053b3ada32661cf38fdc9ef384cbbe0a4b97a9e44a1ebcd6ae0e080f45e3aa00d9b8b36ba04eb171d9d080b00d116711393ad30b2817721cb6c809ae5b98238b6fe0f88ff73525502b50e83983464a17348f14d08506e44173699e5f5a3b6f8fefa77b7e9e1d4b59580b1a6dd7d2f676b428b68fbd673a889ea7e542a35baeee911698103b0493eae6046f186b04ba59bbc07df38fece7abbcc398554eec7f32c0df3ccb97d593e33fe65c3aa6ac08d69b849cbf5da5b4ab0fa7e2d2c0c46f00948652a5b491010acc69c23acae21e1c9ffad85437ef28b2e0f615c5e2b71f687e18066c360e6b95141bf550bf4543a8c79ae10ca325e1947cc73ab30291d45ccfffdc8b2c4aaaaf29fce683277eac225732584ac026503d8080e66fde512ea4e8632b5dbc3920e9638fea714834eb1c0856c676a129f31ba67a3414f960c24585867ca25c0f04ea37d45c2ea827b8ced124415b120f74f4a87b0114bccf5b4700c60adb0f2799e830b5e38e6f3b30ce6dda992e645ee988ec9802afa482883aaf6bdb778e7472a2d564dbc12f801695c0eef454b1a1fc2170d0d313d068954bdd966cb05474d93ebb2594363263e47a78c88a3d9bf5d663decfca228ee3cb5394e62a26538cc2ccaa1301a0e16d280fbac411c9579e9ac276eaeeb72ecd5d80f70dd908cd31c5884adbca9bc2624d25f6d16bfa8ecf00174e12a3426e3629afce8474cdcd83e0c5129488740fc0df9982db70101ac57f38e2fcd3bc09cf5d82845559d6e02c9ddde3f718b0f733b21e54054edb2bb4603c78cadb97e8ff329244601ebd5b51a7f978140c5c7072fab3b0a37823912ba5c7bf968f78c579f56f6c9c9a6596d8b5a8ea56c8241ef63688735c047a7c7713f491d4e9aa1ecff9b5f3845b131b1491029b5828c6e641115097fa77824457c2521bbe446ec625fcaf51e9ccbca5a77d1eef561d4f4c874c9884e058f4e871fbdc801c3e1b69a0a808f4133d06010ae7904e34338247d7a64c945e49964c7085eda510e1b62470eeba18b96afba1d842a38a350fb31d5a25292f0971c048a8cefb83260311ffb7c285d8f9713a79ac14ab1f28ac47b5902ad4368f8dd064b195c448d06ee659e3e7aaba8916e90c0e238ab421ebf2352d619fef7699aa0258f07e639cebda7cb1e9cc67df56d18a7fc0a5847985ba0e13769a0cd85ab45db3e65f5f08b7c49c1674abc1b87ce0edd135a19755c2c729c8ff2d6e8a5bf15234823ce03505536f002f45a993af9e35d9406f4438e7187efc16dcfc64f25beb0e9f26a2428f6fe334b4ec1ad794c2ee2ff89b32b9d8821d0bd4a47c4d6f5cfd6babc6a23bc72867597214ac02a490b185432baf35754e187ccf78e2ca7584f05694e671cb07a0e392f250b7c3631d3376fe44fddd320deb26792bbe44f7a14e9ce592b25b57a25e6ed5dc5e491fd9945fb7a553cee44db77071007dbb1bdd584513503798c88f90d4b7f13edc7616faf3f24b2606f36b8eeccc6a8d567f8d873dc8f763aa135de9a5cdcac37028334219ed6b9ef5aa9d6a48354db3431226e4e01af4b11d3b76f15ed0b191223a3481d175456d25b2b925415c6cd30c2c90be7d32c8e837634e064bbace32fe457ae2f2bb0b724ef0fbe9ad0366f57064992c0629e60ca9e0072de63f73b2fa093c5bdfd4a238d5babe0535654693a1b4e8b03258012eef69970fcfd35beccccc2062bef1414e60ecf90f75711fa749940d0c913e60863da44ff3402d8249df2c8993e4aa9ba58f4a63c550dc2dbc2a1eaa4c9cba7c9dff5d00f22c4781c8b07938336b8bec31323d43711ab2d7c92261134c78adb4f42e4c0547c65d45b0f874604846ed15d76aa53cea6d88821857bb9ea351724b65f974e5e2696668e8c0fd1b2c930137be7b48afb49b8e949a3681da0f74891239372e6993d5e137279597f6c4ab2e36714ad887b833aa5a129a02f11445b114eb70dd07f94a1ae3d151557bc8bd946e97dd0f5aa97cd388e85bc7aa6c207777bd430046575333d6f820630e2d284fbf985b585d3eac9fb7d3a72d13dce70b67f1754c6bb29691dd29b3c69032ca5cd636cbeb339dbc614e479d3d30fa0dc392381b525f51e99a90c1f504be5c93e0e12472d64ad30c91e3ebc32a2c9e064df54445fd673349c4fde7e609651dec2accbb08ee473d92391fa2c9f5c938762f64156b88249ac006cb257ae9231b8a166724e4f789efc59b55c420181312c13047f3b27d08dabfd75a5b3419c1e67d1fbf1c4de03ce7ace767d33242e87db622b911927c5474b7fdce678d65e1bea9a287c1e105d7c643d5d943f2c4cd121543f44cc4b5d16384f583902eabda603d05ae0e18a67b53fce6246af48b5f036aba7dd101ebe4e8be5af1e6e307b918278ae03d95194de5506596d81e1043c62699e9d196be86b9b12fa43901674fa8f05b6269344fdc4dfaf262b77c5d0f0553ffa5954027f3e8cab3b99e300afa382bc8e676a27c9d94686b6e39eb1870de1fe63bc840640b041d04f8856c8c73d26602a4753eb60a9809ab302f7e3e63adc25aa559195ca3728a56c8e04d880d58e02eee395a7f203ae7663c5755f40d3a6a3362f2af33127d5baa7983d207ce5d139dd6f502d988e843a6642ce9090c0a395b5ef5c222dccfe1863d9241fb6ff41a78d281023f9be3653f6b39c03106603c0b472deb7dfbb14f7780413764d6824043c407a701efa6f422813504eef206452ad84a1bc60b7e90412c79109ddd3cb3429021cc7beafbc0badf5a5bc1bf4b63fbe77e21b4daebee663a13a2472dc308c27d470d1bad3bee97cf590ac8e3b2c475fcb3eb735a169aa8db9aa96623e669d491855e756abb0dbc2d95b1f42fb1c378dcef728d0f53e13cbc267f310811627926b63c0b045980362555627e0086fa1a1a18009e8c83bffce324bf7124f221f7e2974add73f95b48643586d822afa4456e5049a72d79c2d2e7b49ebbbb33cb7e42b75b6d21722d5e372320c48f6f21ca62e4258fab53cb17600b5354877f15dec4b22a5997ccc5d329d9cf63e1e36bf6459bed552","title":"109. 有序链表转换二叉搜索树","link":"https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/","question_id":109,"issue_number":12},"10":{"day":10,"pres":["链表","双指针"],"tags":["双指针","链表"],"whys":null,"difficulty":"- 简单","description":"```\n给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。\n\n图示两个链表在节点 c1 开始相交:\n\n```\n\n![](https://p.ipic.vip/bkdl1z.jpg)\n\n```\n题目数据 保证 整个链式结构中不存在环。\n\n注意,函数返回结果后,链表必须 保持其原始结构 。\n\n \n\n示例 1:\n```\n\n![](https://p.ipic.vip/bzw15z.jpg)\n\n```\n\n\n输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3\n输出:Intersected at '8'\n解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。\n从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。\n在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。\n示例 2:\n```\n\n![](https://p.ipic.vip/26cojo.jpg)\n\n```\n\n输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1\n输出:Intersected at '2'\n解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。\n从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。\n在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。\n示例 3:\n\n```\n\n![](https://p.ipic.vip/2tpyar.jpg)\n\n```\n\n输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2\n输出:null\n解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。\n由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。\n这两个链表不相交,因此返回 null 。\n \n\n提示:\n\nlistA 中节点数目为 m\nlistB 中节点数目为 n\n0 <= m, n <= 3 * 104\n1 <= Node.val <= 105\n0 <= skipA <= m\n0 <= skipB <= n\n如果 listA 和 listB 没有交点,intersectVal 为 0\n如果 listA 和 listB 有交点,intersectVal == listA[skipA + 1] == listB[skipB + 1]\n \n\n进阶:你能否设计一个时间复杂度 O(n) 、仅用 O(1) 内存的解决方案?\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347481238a04fa3ead0b547d2954020e2d18310ec8ab1a6ec9ebd627f465eaac46b8280bc2d829199fbe23f761a0f8f223fc3b6776d4ddcfe70c31d1a08a89547039a97280d9b51b9179b52cc0eca6a8c0552bdc1d72faf1446a7247fa4f14415d9751b4cfbcbe22aa14b6fccbfb27c824afba4b4a510034741cd849fa0ae46ac9601c538112782e3392d64c32ede6ad361e2f09a5bc684b2045672eb2b7165a774ec0e99104057a3a8458965038b83399b714d13b0e46aa0de7c7c1874ae4751a957da6541a59a309c2eee7bc335f36823141729a50ae4db9ff31041a0b6b4192066f34c6fc4bc1a181e1c12d4e4a3fe3b664eed4b2cfd426c3a791e18e60243fc39fe830bc6ca208d8f6b54b9ed305bf1c66d1ee0981b5af2aa43d731ab26cae684df2fe58b677a4059a69199e2ee6f54966eddc196c0966d9c25599aada02d1f9ad8bc8c993ae128d6a8e8b7a5f7fed8ed9cd7bb9907afa6c59612b575784982f94ac33cc152555595ee53888c2de231ce72b3c096d9ba7491ead5b72bd4d2dd8651397e28e11e7ad2e60da38014408a79841616ef76ef45f07bf1fa2d73cebaadbd6bae96fb75c616377f80378f8efa05dfcdba042a8091f9c63cdaab2f77453f420ebbc83bcdef46bcd9c7d14c1369c3bd79db45c32f946461cf1e7d4f507052a2eff2b35e3400dc77ef61d4a921210bf8ee9b448a343b2029e165f84d06662bd8993ec6e0cd83c8b879198b0f3fbe0b3e6e996b295cc48520b9596bdb80a18555b530bc66c96e562370247d2415f4c5455d39d7124b86d217b7c449275483796449e3c11f87be7b53152fb9d6950e4cd7e74a2bdfab8bb9cb66ce5f63c06c8d8f8f602bee7a16e18b771286a757e3d4d018ece2fa2d58d44d020e8346d40f34e93c0b745f832ad2105701d84c4228909d79a52d7b6d37a5f0b72f68ef3ab5dc2b94aa6182c6a46ff27994f5ea05258f95bd6d3b036b81d27d0bc41cc08f08c6148551b9f5d0f101681bd191afa4852991283d281ab5d5dcdd9ebbdd161de371b71f96aa9c48db5407a880d6da35ba082e75d168939db05a0063ac848a6b4554b05529e03baa1235f2a3ce4d413a0b079f7fa9ce820ca5fd02e2af52d9c5a1be1c7b6ebdece02420d50f59ac7e1e8a7d8a2c98b7c379538736a9cc58d04ca5b330b310dedec5f974c508149c125a3ccd4a7dbbc446db99311e79a98a115b7f4e6a8230cbebb6eef43e46ef3487cf21ed2a545bc1f77d8bf0dbeb3d3360417dd82c7ed471a1ffb754bbae3e6b594ee4377f2d52625db2be21a72c7bb6ade8c8209de7b64ba9dc3fdfd3afd7721f022eb764ab27097c855e7b975fef29b371a5d2b5ccb976d2e7104611eaf215fc769faffb81bb560fec8d20385e6353eb61700ce3b0479beff0d8299ca61e5dad4c030e6ce894420c6f341da678828a308cd31424100ee356b94f6c11b92e4ce615d3ad10570ba1e2b91b9041c3d14da5b6c77aa86d09ee7c59e4ea506470467cdd82ff6571466be03d91d125a95f3ef2c883e54544acca82642d36e35e3e2c9a3dab4cb1fcd771892f1ded912498b0bb4a7099ec1e53694b577b786e2bc7e100cee75e990e6d38e270d3851bc3f400490caf08243ac7d91eefca2779771e6c646f0de88f6a9c0dff7f4af241670a3f184e16e43c3704fa9ca9e87ba02012fb11e7981b873739645eae9ccc73608a51bdcae4bcd5621fa41fdddabb01aca37960f207fb8bc22a0fd0e4680feced55734f02db2e525187f7a9fb9e144b1b6f454e27b1d50accbebc64704ebf876f181a85974e47b516d2c7bcfb7c0ac66255318145f2a2baa28d76fb225f61b126f209188e80c526d144abed7fd715676f3b3ea17b837ee374947a582f3bd8b8b8505f1c58601d067e94a54ebfb0714ae8ae22bf0d47b0ab341e6d88b12cbf2fb0e9dbe106ccf4ca82e49f20077fe3dad95b24c7dc3437b94fac6072496bf09be9238830c4288e2720c63072d4611818863f31ea06404faea46adae2e84ac70e0432d727dd4d6622fa3a8cc46cda4e94c9af8c13c75d174523a20d14fb6ac0b57dc25c96bf3ae88b6e53e5bdb95eee2a6d95d5426fae6a16f19e96a3703c3c1796dba56e3efd6f02a5b0108da3a6be5abbe3572899cbe9bf43c26098f15ee2eb1578971ce2e55b3668d85ce60e3d2e9768fc859d7797c037a0cdbdb866ab618b84052e2aab371d5d2dcfaf8fdf6ddf979f8460c57a913da3d837cc221531cd1b9d0c3457e3c92bc8dfcfa088d9e89264cac0458bb3c2b355ca167947f6fe24969cc4f7ff67355e7e0f05a031b7b672ba6e741c5c73043a6bc5304a75a9a000e7063355ae81581f277849daadc5cdcd62d8aabb158be0d8be063e06e200488aaa6421f60b16ce62a46763ed943882318a7cd876c9a6bebc8f4c737a9ff4a13a3985e413f1bc16afc7f15f6d6b37f58afd6050d7212880a37c0cb2a0332f793a19d1477626cf13efd37279905120c97a683d6da83a843f957594562fab168c70a9d92273cb0e53ad8682436d399a100c0b471c881bc9a55f85679555f4723e343410b6e006357d98741f56f72e7094b11ba0242dc9c2025f155153cf00d1cfdd9d95217a6d4f086e3344694354dd7682777fc7c2fb382708917a6a9342c988f95a9b3ca14ee78f3f0f4f1cbf6bbfe2fe8f6c7de6113a9720a48326d77fb53502c380a6696933b1b6d84a766b94c188354a60028f83d733f460ec8413bbedcee9ec7e225e989212aa60159e8b0ac38ca8e5bcbdb9bd1fb9a8c67c1bec439e02960ba8d3ceb90befb85acab11ca2b69938e711721711e905d5bddbaa485d195864b0969c4cf384869bca66da503ff1f78a0441e4b7fd88d90cff17593fb379d7c9c65942da603fe6d666a046a96a3a6b187669a039bc578c6fe7b750b04fb66d5837c30cfa4c471c29f43259ddcafc5e0ddbdceaf042f40f0501e67223a630eabbec0cffefe02714fd9b33a66d0189b0931c1bdb1a3d3f64fb7caf55a7a314b753065d265b9009e0f6757ba7241d5f092ab91733d804259e6ba9cb10d75f0cd041a8077fa2afe7bd1c727c9ab1bd4241c8d94b14fd789c491522e179147801dd5f87d92648c34859f3ea39423a29cf484b9a9f15a2ae7575a2de8487055046bea0a95713d6a821b1607fddb79c7a9df8a13d7c01a96d76a620640e9338e467cfe76ff4068fcd72fe3e73a1b335699ef20239c1d08daee045135f8e4a028ad82d7f69125e55e05b683f9ef9d59c360115b739a997a16ddce62f1d98783db20d04b1a6c8a441780fd632f10a5ed2faa535ebb6bc944573d7d35f579067c78a467670aa3a48044477a345d1a527bf8685b9866985d7a19a162c77d973bc0e567dae080fad81edc699ece2aa026211d5bdc4e575d217b4450b4091688f9ba8e2b69fca44c5f857f99daf15044260235cfd43f6567872bdb0349cda651d252d0cda8a00b66342c3ed02cca2723c7236b467c32a0e5498633cbc14775d291caaed0a1ca0a94ccedc2e890ffc644198e5186d45f03b2423463fbde4655640398d33d378dbd0428e63a1dce5912cbad565eac5d59dbe1cff1bc022138ddc44cb90a170bcf972ef72e9de45854a3f69e39519cc28fa6c89561a899aef1d69a9dbbc8bfc916cfa567805e445ea61b401f7ff1f171d12b5fb7766d2056cf07862011b8d8b3e7312d00540ad2e10a9eba0e0c1dcc470268c75e8124eff77497e60722b8cd0fc2fd9811d8cbcc564f99cd3bda085943ab77f1655e84345b50c61c42848af29685e2fc89ba5d875dab8c938bfd34ecdbfb2df092eeee81252769cae45f16acf7c5d220e65893e458e9d0892858e48d8384d1b892b1d486e36da88ec42aea862a840e5496627a114a006636c55aed828a0ad0bb707c1594273f757242fdd68cdd06a695d48fec0f5ce736a4d8b74aae188413c1ce35f661d2fa19aba1312cf459b8a3a4a568a32081de6519478dd1fbfe9a7c59d335d946391b685f25c440f056a8dd2aae647a7f0ef6a43ff7b258fa881223b5e20409a9f50d98013e0345cb2378210d9c0982680b1924ae34f576c53dd48c873b2556ca2a3cd7a129be4bbe97f6bae887a8fa7473f88c9ce9be8dca7c3ab66c49cac31bd906377b4047aa5447edb13c8b5360a13e81c05122592b7c664584aaf6c9555b3cf448a97cf46f31e3e9c06c3f8bb87db2d9d9b6f5da9acc42407d0f17da773c59b229290504187bccb6d9c9f917aa2fc1e146b17154ca2e5dbfdc95ef6cbf7cccc73d0a1c1328e56257fab8f7e7ab49ccce463cbe67186abaf1c9768265ac5a8808db02ffc17c14c2616386cdea5db903cf81715e53325352dcc14c88a5f2dbafa0d5cae710332bca1ddd6ce8d6eb6083221ef9bfe65f1b9f761650e646793f2a14097d75341188b0f5e3f40561ee9e7ee62b6aa7bd4b98936a35b5fca7ccc982da5b3cb3af8952493e6fb8bee12f72225ad23fc5cf8760872334ed51cfbb6e6f68269269dcc4fc6fb0a518e5a8cda1e1a164a0398d79ac5fc615a65ac5ef9ef4f4e5af651659ba277f43579a716a168de3cdfe44942e86393f01509bc77706774f20f4d9b631edf6a261ae3cbe909c137b212437e2f634768658412aee3f9af70c6addc980ef78d1e36ef1926d9ec5457b8395162f806fa1c07ff9029bccd2b6d93d126427d8ea20c6e51977cfd964e67c8f4d18596f3ba98fa9073d9cb1f94d2ee3788aedbfdf3b8bd57c826ac253b06099b53bc51f2898e77bb2cc416da771e94e09f225e7c1160adeb8ab38efa6e50de59b16734e6c5cbe7e54a760f14ae926a58f29cdb29a9cfa339e197740268ed5be4525edcfd97d26da43c6287e1c380a4f898748625de7857f172d5537ce8102c286e02eb5d6d8c686d433bbf328cc6e1d95ea3510553f7c59497b42a43b35522afae20b7eaf481a856284caa2d4872103bcc84ad2901e7e5286c0f5757453ca5339c9896a2cd57e267e0164660036431cd88732b6d67208f7040c859dcbe1dbe622c18362036962cd602533d800f0cddc85689e52a43201ccf33e51b05b69788f016c36edf5eb9edc7e7c17597de7f1832b869e35f17bcdd2fcce722d5b07e016486e51dd3f09479e1586605687482be2a6749cd68fdfa6d3b2b9296c9086d9159e72c7235a1d936203d62513657495e30c1ff6cc4066ac9ce81f848bbd72e24355b9fb779ddbd6480b8235904d93d8220b46b134a6cce463af82c523af189a11919163084b61593b38e38543c744ceed9a0dc185827661cecc11af597d5c2104482c11121cf885c59e9271fd87cc8b4fe69d5409c4f7e32aa57501332860b55b1a78c1fabd7f854596f03e80971b187bdd3d3e75b011cbeb1c4b092081d5d9c420825de940c4dec22d750f96beedbbac56bca3b3a03bdbd538858f7f780dbf22b869907ef6d00d5e1bb79d791ff7753b1fe70caf95a3fe75b7668af2ae831ce78bb167a4b8fa6787a9f5bf188364dcbddbaaf1eff2447b3027fdc1b4d88f20c30ab0026cfee414b69198a7697da322aa4e0be3c98a7c3087080401bb74bb7ecafe918690980933fa596740abf2168db3ac6631cba0088ad7381af73f43db233b00b8be0d5379461fff11548f315489f92d5841c55bbe3e9f977f6715d9ba8c8d97f9b723be3104e2c9138ceeba75f481ff9764d9140e5b522b6ba20833ae17f9241a9389fe311b260997bc90a1cb05d3514262e6dcad90e5def9617bd8b92f27c4271565e08eb545d6cee76c7587413e52c6dfd25ea95ba515a97539a8f61f6d6458eef144662896ab1d6c9897be8b26da204059acbf51cdceba9d19aa5e6c46b4c2141e6a6911dfa0c7941f7496356d9c713c69dbeb6b9fec952fc78bba98e49c8947563ad31d73d3169539c9ac884acae0a0955bfc97615a742bb78992e2cba7eaeae5cf5930e5757173f5e1ac4a7dbb4485ecc885315d0f69961d46e2277959d845e2bcbb28f8b0dd886adc32d45be804892e028d49c71f9f9bbfcf1506d915b979f2ef74b7eb0c8554be5c478a10b5e7b2edacabbefacd3df304ff4bc305f5fffbe702ff9015def2499b4b766d8ab5dd7253c7b0cf26cf6139e5cd82449173b42923ea8da982333558009f66a7b5574449c34364f9a436f74b0b704315351c357dd0c65de5248d5ca5696f8e7b86eb6fcd3c5fced029b2cb000142b0d85647e055a6793459b8cb3e291eb291d67d2c7627de7a7649d79942f34f5f48820583f24e77d343a340fe028f74b927de9e2cb4d149632b7f670969be5809f6703e9b5bcb0cd29e1a5ecf04c2ee8f18d749e227d181b660ef0dfb3480b6808ff0a5af008bb5991653116844ee1e8dd724c203e87b3a11b7742c6b73c854f1eb828bd84b180ac753e497c2168e5132d6208c03f525999cbdbc4fbfed8cc6450f9fc9e1fb243f640365bcc13124b97d8756a59e27b5c6003bb5db598c879f3f298fed60048fabe147f7136e23212b95c61b1003a3ceab58807e2b1b17e405d4f8ae215730518a28d579a5e525153327d2786c0fa7853f867ca17aa2ad9ed6c72d6e05389683015446103369dc1b1f7119da076819c3070eb1b25184ced4f90d4373c9c210cae7de726f0cabd16d6b10f130dcf5fbc41f84170be03a28e5f16bdc4c3f320163a1105f2a86dbadb67e9e402cb23c30213b7222183405e7f4878e612748b2b8d203f27319da463272269ade0dc82fc976f8d18049ab2f891e32a7668e3c04df171bf348a38bbcb1ab7de32be2c1687147c19a1db92931d66060ce2aac422bd9df468cef51c7d409083df72e4ccb118a6384d6dd9ce5a933f35f866db3080b8cc6a2057addd481002807660163f13941186b6e912266faef353291ee75defae24bbe8ab0f7bd151820fac8f9bed631fa4ef3b73d314d49306a6a11180ee98bd5431e9fc73b59dc04acb82795b93d9af3a38769bfb8504b82401cfef2e07b288b324bdd067c8c5c33e16f76a70876cc95c8b6b5e646514aacc79b9fac9928a387ec16aec279c62b6d2617a8db0baabe72e78730b2ad03100d7b7cea954db0f5bfa39a35bba27137c491024dd45649fb688527f6cd7f487cb884ab713c8efd9dbb9aac0307e6415682817ab19253f757a09743fa21b123b41c503684a4c348b1e18caedd88d8308ec6e0a26e8dd2b59a4b92b569792aa690db57766ba3c6873c7a2c05a9ca232633759504c2f3d2933f74212f71ddb03887130ec960e940c7827aed80d36db38bc7dc6864862a9aef3ce94e740a5d54b67901cb620ffa97908d42cf99b67a28ee3442b0c8a8b52bd7efe3093c3b37491f6c19983c1029555f12176f6f5cc5a7ebb4ad0a94531386771c10a2def4df71540591ac68a717eb977db5d7376f32b01c5f29941cf415b704102cfb05ca720277abc87d5a7de4a7f58828a3702fe72a43e942c0021d25d2917515dba1e990e936a7c0f7ed8ec0cba7286107fd0c4efe44503b372b8be14b428fbca8dea7edd1730e605aec07982e7e898441cf88048bb93f9c2fcc3296c18947b87be539e681e9055d7e4e2b716f786d1737996603abca2c3138c194596e0c82444f5e96cf00ea45867cbac90c5ce704c3242c9b5ea1561a03fbc8096d9c7fd0282280d27aa0c6dea0ab9a3ba6d340beea8b2f6658c24330e3d8f37abd39a5dd5a7e82b8277c65ba80aa031f1b88e028e18db97b4a3de72f5c47022eb6000c520c0ae81d8cba60202b43ff5be3182a072245f252be1c616043e00e381302d5177178565148da1abd8c09f607770ccdadfc6a6d1d17374cf5dbdcfc8bf9214e1ac1d3e24c9967a764470e95367ea2688ef63a645e65d2e2fbec781b8359b1dd6933f5f943ac86f2612c99de86dd4234aeadbcadb6202eb04e476af9faade41273f03426739929b0f9f16d367940a593e7b58d3bd03391555dfb74c7a210ce323cf47eb36b4c1571b4f5914db143f9b7902c71c66e0a2d21af0a09f6e4b14611c787ada87e100d85f0e4d24d4c00070bf1ba25a9029ca825f8e9b673a8ce028319b839fe87cc6beff6e3caa559f73dc34b28d444801f1d17d678c317007ce6aaf4d224f04e7d7555022620f913da3b0466c3b4e2295265878e922fece3396f755f9ab934fc0a1dda9166a4889f40094d1bf960d5beeb7dc5896e3f8262961f96ea03e5c6b79d1388a773f10af8c63cd9eb","title":"160. 相交链表","link":"https://leetcode-cn.com/problems/intersection-of-two-linked-lists/","question_id":160,"issue_number":13},"11":{"day":11,"pres":null,"tags":["双指针","链表"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。\n\n为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。\n\n说明:不允许修改给定的链表。\n\n进阶:\n\n你是否可以使用 O(1) 空间解决此题?\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d71853d84c3930af0524c30537954472490514debc96472cdec9c7be126a0a557be330cc8912f5ad2b362f921bda5ed33ff3c666096c78eff002dc9a08dd0517624f030858da2009b79b02c818dc9efce19a40feee6784544437c47fa453d4e51995fb6c15107b3498d393a4abb8370e335134b57630c1370f148e0334cc420b5637ae507d5e38333ade74d1dc1e5853d1d0722a5847745e8207647fbb0571d4200a7ccee782631618b36eb5668f41a28598b4ef4546aca51d99c5b058f712773843ecd68702f92a3095b86c9132b7185afa3ef3a95e26a0d28a582f591ca87d51f0b68d48fd9646a0c73cc365f491ce0b771e5d5afe731902f2f71688c742232dcaeeb069f6d8a2edbdb9747b3e504b52c8b4149cf05e8e538c1415f45ff432eb29c9cb518338522c249959d54f622a2750ebdd9471b0a2e9ee304c0a18858fcaadeaab5bfb6d8579d2bd6b3351d799de2ef941db7df07e53311776b084de4c830cbc316a07f16343e5e9e7bede6b963009d5c33533d9eeb1723e42f42fa0339b2323ae896b861b8925720c3b9c8a48cfb8c26f0fa33b83bd7d1191483fdd145f5a7d3c4a87bc90d563927f3420ffeaae66f9da08605cd3774f8527c2d387b7552cb22d89f82b2d2f644d953b1e1b81c1ac6127f1fd58e00d4c7fb3b7f0667cd9ae4e829c5ba0ecb9e26be30ec9f1edf8921182e23b50ead05ef19cbfb82ce7662928590c54b0eee1c8b530ee0e4dc9f67de9ce1fbe9bfa7fb0948abffc49fb98ea4ac9755f3270e45b675262eab612127671ebbb0dec7cd60613c502fc5642260b01fe420469e6b90d0282aaf8e1c32f5be27685c3d3514b6b48d60ffdb3f21e2d6cde5c6e0d6da2813de3b2b3b1e5f453222e3aa11d4b5a62f4c4f8d0fd1ae89637d76ca05ff4af7129fa47dbab8bd598d0b30b1767f6bda879a813b1b5c34960a3ac056f3454ed839e350b5aa38dff767cd3146529e5ab9ff5463e52096a1d549343510ea060ffd91666683c837c8a64d79e51a03108ce95b5a3e54af2a1ab79bcc55e97d78137cfbf959ebe4678a761607b716fb31b119acd1bf438d092c89c093ea34902f67eec6c9843648be86f06afc99e68923d79a70ac27f3329f6e3404710f81939a81b0e3dd2141a88ff9e88c6b6f3ebeb3fb794537fff7c851c30240127d9bac9459f33c64dd1edd47e9c38cfbc9eeeed77efe1486ff96ef7ca19e8cb14a7a90dc30fd37a17eb42c46bf63f0ff17935e32dbe072aaf1841f7b6fece6b6fe1f503da7faf4b1e7c5be9eeeae11f0bc5931ba43d95508dadb3af2c1f721852254dfe3c490b7308c1705a376fb1f1ca427ded218777ebd90c8c695f88e9de90213d4fdc999d84c8f490eee3281d6f5837ba8bbd88fb95a3a8da079a6aefc251e756e046ce4855c61c4e111089deafca64c1ef3f146ca66a104ae3ac33e615001df1569b0f204842ae5ea639957e84515b85c7e8bd17d3a9bb57a3ddee96b1ab9dffe9be468e44355631ce74d23fd791643bfc657ae136bb2f3ef2c883e54527aff4459498e04248fbaed74b0adb49a0efff21a1c7d3bace16175ca3fc53d096dcb5f5d9d3856592d8de4c571e06d5e225a20ea99e7f55e9da08c704c1ffc46dc1896a3ac870b66b077389467035167592355abc874b685ba1f140a1cb5ed5fc18b4a77573139dbaea074aba9481699ff6d8140766803d59161a3727d945892eb1acd04116e3d8b1cac049bf0992d539a784197a8d2ceb8a3586ba71dc00de38f9a8a096534d46c46fe1f71f796863341e5cd4504edff7cc39dab7a68e66d54623c7dc0bffbac7e185220285e3c0b6c8258678002f7323e6d199380e92e9de1752ca241132d4e38afa2a063a65e7595a4bc7d06236a64677d95286853a203e626d027be6093b46d254f01f1cc4509bb4bebcca910e9fafb0e9d51c3b0439c4deb861c86bd8d6d95c6e54a16836abe767b4e4e0396be0c9757ea3ec8f12634dc87aaafd84c3e858448c11ea064c0006747b88ceb433727d84f390fbe26311cbf4d6ecc6f882135c15a6b6d3e53fa75611320d14fb6ac0b57e519c96fd5693539e61c75d69ac9e0abc35a623ff8f8b0457be9f3afcb400e90aa5ae4277552384569606fde4c07e1c0ca36d05f3ee3c5d146490ecd72c445d46d0f7ecb3cbb2dcd322fddaf372d82180924be34e1d5bdb7aa54084910b828e50a56b9b1ad38d889c6ffa8fdeb896e8e36d09ab03cd96bd215b4a8213976330d6005e3fb37958503320f67f5e5cca1835982941ae79faa960d8a12b081e93abb509807bb33183c0150393f22021923d5fa22f192794cf19a1317ac59994b4228372612a9128bbb3ae6d3f28b4e855be731670de826d978e273ac2a42894e6d66e5ee852dd66bf7e8bbca3cdf6ea7975c3a47a557ef2b55385bcc4678e1d42d7dd380fd8613c67d89ca7a4c117f39f212d8db212c9a5d0bccdf57ccea1a0e530d9db2ae64db7b78ebb482540300dff1407630ec2eb3688ec3a3ef244ca211cb015eb6df5e51a01cb4b5fc305e54cd4862ee2d5d501cd672f8a3861e0e0ef842564201697761d8810066b1fd7edd92996bdb428f1ffdda6af5ca73ef1301e4f79797fe20d4a3cdaa3471d6bcab1bacd0bb6990ce385dae4ff74c38d1f30f4c6ec03710a546a9246002344600257eeb21765673fd8231b690ccfdf1db3e8499b9e1e0e14d62fef09cd7e92ef5485d01b01f00ca781759f9e9be0fb6e4255c38fdbefa02f599053462cf9d73535aba2c17807e05193d753655ae8980ab21b5167d8bd9963c59334f2f6212a20c9ef95435ffd3b9bc56973b0eddaee9cacf998718093b8c83674163e79d7db129ee1f64bd4470043b9dca808eb523c6b57ed829cd41c762f44abf7763705c5bd9ecb2b8ca17a00387d87895b532256904e77bd5cd56f51b43569a2cd10f3c81dbd5ef256f11cee34d7c149250d8f5fefc9aeb3c6144537667cdede390fd6e23824bde4a65b7fcfdf55e3d9ce39f9b91bdd7c9c3dc2acd25f17eff0fa2e516720d9ca3c6c991e8ab2986c3627d3e28c2e95c844a1e8a76a972bd7fe8d56587f35e80737fdec0d03484c28dc16e041c9156fd1dc8e57d8c688b35b5aa6da6883f8c87d584a8d4dbe5809057b8f213c1e2e9a8fc5bce6bbeb18c05f48cc17515a45f777422c22450ec535598f4c5b338a24fa8ee208d7996abf4d46efeba5497d7b25d7ecda169d101b5bd3f58353d4256a874267c0566b90c9284551a215957da0786c5edccb0b33a3ad4b71c9c95c30372875483c6ab28c1974a1a0d1e37a5249c34cc977a0d81449ad184a159dfd2cebefb210800a33a19ec82e2989b89e7519b2d5893351bb889df70a4a3139278530bc7da8091fae95b5dbf144dd965e79b8a930f830f08b690ecda40f6c80c5f7f2bbdad6429889460fe4f5e7782bba5dfd50211c8370f9cc8689d814c2e9e4efe56016c6586c077186c19aa09a5c137fee8e6ba8e0970c924f46958d0bd3e013d65157c17a3607b0f1e4a131f24443e849dedd53578af295054b8b548f3c0bde16aa9d526f150304ab29eaa073787d84739e94d178bc6ab96855c5d249aab5ef86d3245bfb44592141b06d4dca1d985fce6cd8ab3ceb2a007f7aded8de2e50178085048d67d25a0fd731735924b1d111a9dee14b6281ce87b119cb6c7088fed880c13316f31002792cd50ee15a7bb3d2c1ce556eff95c9918a0e1fd6b98d311cb32abbd42f0b919dbeaeb5646a2cb10f4e7f7ae2d8a19f3ee46b3b79ec6052dc281ac92393b044831e54fe9258ea497f31fc9738a08a8e2e0a2db00441beb449dc50d2e6674e7837bf09975b6a5ae7923f92261541a3478671747853d8acf99368fcb2d6ae1f52c62783b400475d46e1481abc357cbe51a59516e6b48762504c19bd4c16fc994bbecfc6039c4b86272764995388b1cecce0beb62cae41d8c983123efb77f274b5d8c2cc06317b57510bcb9a6d4f33c7e0ad863e2b4c5db5321de42d755a9f238a373507014d8a51beabf77ca862f2613b01c50fad946fd3ea7ec29c37c161e79f91e1fae98aceb60cb8b09867dd42b2381e1ada54203bed719f1fb491315402fc69f9817497add704c430e12a862f2a9ae3247c862cda0ff4252ab98f060bc17b55f79a3f8400dd8c9f02a6b5948ac863dad43deba3889895c32c59f2bb2e02b60abdff85da0dcffecdf9323f599ca97f051abf38534a4a0f7ec95937e333d3a3fe47d51aae15bb12e1f9debbe5c88dba724c12b4222d686aeb343efaaed4a7d3708239868c417d316f79598707846bf03a530f2229bfdc74f0cbabe54002b89dbe6096485356294bedcf1b9945822892632e5d1245c344e71abac996adb19afe2d48521d76302bffee61b36c17fd0ae04db9ec5a38feca1c4b9d4431d207c2d07e92469ec71803d872aa7610ea7c0712a5246081cfa1156d996ad3187a8dc1f6921aef082b63ed84c3e7ff50be2bb3284664fb2e3c98b139b1ea177a64632e20d23334a694d932aed59b7789952ef47d23b0e5b5b396541a25d7f7ed39dd9be76f886e24972097e8a498a02bda29dc95d54c2888bebee311f30f402301ffb66cd703471bfe0f384ba0a02b89b2783e4844fd64cb12f678fd4d472ab1724841e398d092bf7db451997a57aa7740d916df46ca9bcfed35d12e0d0186eab5171feab446ade21d2008af5b5e3d2694a0eccbf7f6c5ffe8a70c5372a394411a1d87cb22f41a531ee7969b92defe56d23f74f53ea866de02f918a3ba32f59f4831d75728b3f2a05ee43358fe0a69dd120ca880bfbdb60e426c18fef3d781c7614f439bdfab4ef03012c9ecc075223fd0cb969ec29584b30421bdd8053311eadd57916385d30a2de4bc9a3f537e081cd85889e2abafa0ab54758d0e41059ddc3fbd7a9b8c06a95fce19f3224defc5be29672804b45301b49c89f4936c14d539d93b12d6977bde1c30de99d011e9fae12a182c693a28bc7b1abd91c2bd4343482d74580c9253059577722bb7e14b7c6fa880c60594ed86ce0e7e2a628d21246b8a703a9313ada41020fbd4f3c0e8c89f1e641c991bbcfb9b8f9d04dbece6bf011bfe75e67e8a094f85a19272837b73b284afadb0f321eb81b6afcc42e8db1efd3e484a30363035e505fd430df00baf41fb16701e02cdac6dc7873abda40584073819be33c6a3b1cba867b0de5fc3ae9eb97231ccc68b92fc4dd4f695a139e0a762dd9498f9526af2690d43154a6abc0c3fc9cf653508006eae4a55f7edefacb6a23a0c054fd66263b2f481413706b10a8d5ebf4f576a307408b4fc29f4002c5e0dc2ab67a001803629e651a57e6fbab7c855781f310989710177bf1333c76bf1bfdcf177412cc0c42d8c33f4abc4c40cae3cc3f6a019eb8ec9b83916707b3b806dadd068b8e6e7802a62a8a4a9254f4d0267817bfb37b33d47e3a1ee429bb9aa7f67b936c4c3c098d14eb443f36c3ba52aaeda5aae4190da14bc5819f6a696a1bd3c4ef685f75251cf94b82cc6a6c313db0780162670569c951a53e52df9ddc627ac1245960b333f368a9aa8eebf09d5044fe37e6acab56bccacd900972c4dd65869f5d399ca3b6f1233bd913fe7447363a36b34e76ef7047e19d17ff6bf01fff289802d381902713611ccbac9c40ea2e6fa7c065d7ef08961566777795469cd1de99e5af278cb258c8758fc1187d31f59ca28668591c3453cf9165010ee199c9a58d8be70c02fde14132ab6d31129da4e514f18255a2f33484dcd34eded578aa7aba19a7553ba3df1e474e5bd4ec414b0f96811cd1401d3073d543c1f293135e9a34303746b73a9ab963a286171d3a665a95351f16f31e885b0480268ed4d0ef6f727d07e28ebae6ebe9160498fefc3eb6ba23be9a36f3a1a278cad2a29a4dcd0bf1feb3db6b195f1040291e79110c9e8472b12d65b39db42b2f820e281a2a78dbd3e1b589d81fc15018409221cad4cf3892ece8ef15dc5e966e94b9155f029c47024584fbd7f05872cc51c07ba9975bfbb500ea1e80ee831052d7dfd0899ef5c9d5a345e86388479e5acebeb1f9a56412cd5d10910699dae2787841d99b87e1e5c854f820e54978c75df37643c6b2bae3f62d5c1f3c10b20bd00042e9a970c965035cd55d85236493574b61f0023b4ea8242880728af74ccd162ee93ae758d3e203898b89e0a5265cb9c46ef12b8cdbd2247aea8efd225320b9ed87e23eaffebe471f86231b4d5558bf696286af12e953c208ce12a615ae2f44a51f55c2bdf8b8bac5f34bf5d158deaa6c8054ab5c59e9834ada4f3207c557d515cb5c0539917905fc75154e27475f0d28f46a3c37b692ab8acd2af7441ffa5ecf727a6770f92a60447ac30fb9ab4d1763274a579396493b43e77b057e98a378f032d9740d480aa0114b167ca48b5b31262695fbfc9965bae2627bb9038713f0b32b6170bb11c235c5061048f3b90f51afcb79ce9c09f9167c241040c8db4c100faecfca7a843f654f5fa05990c9c839487006e561d275ef65c8e1ae9567a1f4ec3572eb48f15af9416eccc3ed633b4974c4ef4754d3e894bd6efb9ea8c706a4a5973ddd61b1ba17c59d80b8caf2d4533cf7544973eccbb66f0a81fdec61e46f2d7216c38a3b8902caf64b65ac14b3b7c79854a14313659499b0b60cca5b06ef166225a98bd79f86eb63176250fbc9cf75093dc33be1c07ae1e09b4980f4278826cf3cfb416dc432c86396e37ea144ea833bd2318007efdee8f8a6f54fd70173c0b8e03c0ad14fa4ef7bc9810db77193a71d5702a87cae2045eec5b920d88305c1f337ea99999ca9b233981b8f6de8220bce000ea2b36f7c0df699ca9eeae532a299afe3e45cceee6e424445bbbc308aafb005becb9ab7fd07775eac99b4be5cff35c5683c355b3e4640333e590a6ae6e8de4817b5ed51469534b7922dcbd61789ffac9a3a88ee595cc34355aaddef7c39d97c0ed61774870977ae2b33a715768ac0d1bda8e34c1f42e2ce8d8ae8f939a381fc1ba6a9709d5a472617e49e5faaff72fa8778a4a00826014c7cb9d902a5fbece68a24e1cc132cee91021a9c1f05be688d2fb0cc6a0e7fe2d0fe1579d6a99dfb87b14d13aa10429fda1ee4de1ff748a0df06bb65d323ae1c11388ca0c848aad68ce89cdbce3edd83faf67dde8aed8005f4f969662aeed59a13176bb9c6983271250eb8d1520c3328bf04c2a197c76a266f2f30c69a65ce7c1adc728d6af98e62e9d4b76dd0c48399a7f83c00b0af7cf4342d201e18f72a52cb1140b6c28d820d89c5dd297cee291bf5dde4bd398a86f6777969640c5c3850d7727e66111a1a442a4f539af3cdbea80bf51947b83e524484d4f1de667e4dd4ed2cc50debfb34e683592076f515086cc350dd5cec002a31bf41cd58513be49f745a26cee6f9886aa36d2faf6f02ad23cc02556093d5173f8bf5bb90f436f794f2ab89c9d6f3724b06e00c0ce46e503b372b8be14b428fbca8dee6ed9f3f003914b45f9f6278988a4e8a951cc3d63fd46a8d76f4eb8947b87be539e681e958777e0c2b6c6f3a635972c13203e28c2c736ac18c5f7942ca515a48eccf00ea45867cbac90c0ea250962b489b1f8b165a43d1e2374c977fb36766c5c850d8c3cab5ba846bc2ea45a1a5cf60221dc2145dfba6da74a956ddfe46699ebe26210b968bab4e6978f1f406ee99a5516a36ee2f4b750e5d95050a522b0ae242a6b028656a43d814e30745536706a678a15f256d0ef20f155513c85f5a4c7e2748ea0fee9022f8075005d0bde2047438286a22e8dacdb3f3b721206fadbff966e02be833477fdc236b9f73caae302c4b4596d5fba43d5ac738aaf73133e8f941aa9be32549dd9b8cdd1256aeb0ebadba2d2fd2132c39adfaecfd1e3afa30752fc706f5a0b8774c1b49a5c8cdb58d3bd03391551bea4693bf0d9e157dba37bd4b7c2149baa4d45da028bdd5903671960f07336fea520ea181e6460cc7d4e1e7294e21c0b5b0a82f4c1d1a0b9fcf49c50283a824fba8b453fb8002ce66b574fc8dc325dedce3caa559aa17e94b28d444d25a4942dc36de4727269fa3f49264b064577f5fc7a28d3fae78fe9ee0444e01aea7ff8d84b805e1e3ffd8aad02d63be2ca7837d19a33e0e50dcb34974f10edcba9335911bb5eb4bbb4d94576dc55864720795473b9ab92aa7d728dd8936a4b5bde3b2e541825e3da130dcd21baccbeaa6049d7025511f6d698010ec9521964ca71c15c65150667a61de8ff1b8a5b7fd8f7593472f1f2690601a608c057d4c68da969e4f2906f4856b0e572e3acd75ee06d17a3fb182e96b84d5fa25814713a2742bd90bea980795e27ddb10e61ff8d38dfc5e9ad370e6697b84fb590461925ea1e83d76cf99c0a454ec6774fce6830d00e94e3fd95fc2994cdc1a5e5d74143219d886f28daeecec414d5522d80d0a5329f75dbc02d836b2f458c325ef698e71eba6da7ce0cd0b7dbef2eaf27d7e66aea62f152585b60e4c2ee2adccb036868a6494f35f0ec5c7a6c5d0aaf62b22ad2c96779737599d62122c18453ba1d90a4fcbfec6ed976fee115307265d2c51f66d133e380f47703663da3734ce099cc932dea72bd4e4b7497e0af5ce552a7ae5342eebf50af4ce91fdd500af7a183cec44ce241b1e0288e9c99b96186e1b7081d381044b7013ffc76a6ffd363f98262e29a9bad194afdf72bcde5992ca213ad5679bdf3293e8725d99383ea09bf8f86bef9a8e8249893d3f25340b44b23511ceb72b53be034b5770af48511b541bc85364c85419cf85568d9e54b6d23dd8852459a830bbb1e36ba204a67d6ee3bb24a246bcdb88627e46065dda881c937ed69e0c739707f76960efc7de97a06063cd1bdce0305d5f6959540ace190faa52fcf38e75fe9976a1c1d0c61d72a05841b24780def75111aa21db0cc4a009cc08638801df3315d34abcc3e1ff2533bbc24cf1a27a36549c6a096e5f6d6362741c4e33398dd97e725ee46c1311b2e3dac3d7bb4efea235e5ab5fa3e5e0522c36c9bc5807b8aae72498d70de42eae63d19bc13ccd317b51498c4b8e5e6eeb91ea37e5dd741a04cf36f6880f4d1153f9a4ef2230273df41a2cd36be8c55fa029c967c93eb3","title":"142. 环形链表 II","link":"https://leetcode-cn.com/problems/linked-list-cycle-ii/","question_id":142,"issue_number":14},"12":{"day":12,"pres":null,"tags":["哈希表","链表"],"whys":null,"difficulty":"- 困难","description":"```\n运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。\n实现 LRUCache 类:\n\nLRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存\nint get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。\nvoid put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。\n\n\n进阶:你是否可以在 O(1) 时间复杂度内完成这两种操作?\n\n\n\n示例:\n\n输入\n\n[\"LRUCache\", \"put\", \"put\", \"get\", \"put\", \"get\", \"put\", \"get\", \"get\", \"get\"]\n[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]\n输出\n[null, null, null, 1, null, -1, null, -1, 3, 4]\n解释\n\nLRUCache lRUCache = new LRUCache(2);\nlRUCache.put(1, 1); // 缓存是 {1=1}\nlRUCache.put(2, 2); // 缓存是 {1=1, 2=2}\nlRUCache.get(1); // 返回 1\nlRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}\nlRUCache.get(2); // 返回 -1 (未找到)\nlRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}\nlRUCache.get(1); // 返回 -1 (未找到)\nlRUCache.get(3); // 返回 3\nlRUCache.get(4); // 返回 4\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d71813d84684ff03508524a256a2400100afd8c74ea6410d1ec9878a833a0e65ebe221bc49a2e129cbe22b42dbfe7b231e23168699ed9d2bc0531d7e88a9c5e7732ab17ecd7e24c18f45ea20339c9c6c019a73ce1e46d77a6e8f96d32ea583b63f6178c435109b080f71d6c0ea92f70ca3b1347566d003368f148ee30889908f7277366ea664644429948aeac6622f1025c76153667dcd52d7f4223a3ab1a5c4146f2e293222e7a099c57b16038b133998f19d2f34658c544eb906915815c3f73851bc253702e849c095bbec900197091a8adcf3d97d872efb50d458a85a9ddf94d575dadf5da2202382997083e123da4d178889e959770854663560ec76d5b5fe1da831ff11ba44a9cd32aa82e4ecdf71619acf142c38ec848996afba910aca607c4292f9fc74dcc9852eaf17a8a48961365a494340c52538fad66d2cadb748ed1c1dbe0a0e09e48dd60cbd6423617d6f9adfd23fc801d856c17fbaffc9f5550b2c5d514af423e31225cb96b99a4863a79951d89cd3283d01419dc2e50ef090d88f751f1fc0d10f3972e6cd3f7f19ab55b6dc79295f7e73088842366285f7ab31a03093e25b07b8dabf3ef318b9b27646881606e284e992e1eb3790b5c3731045f9078d0d3dc9d83be6880f44eaea85d8c3ad4feca044941e6b38d221c4243be0a1652c37bbb3cfd9e0396d3164f825e46a0d4abad41fe69d307875f7588d47c63b8bb90fc6d03c13c4eceb925333903e0b0dec5979697c1616209958abfae011a7372580fe76da6f16f250e47d5775d47485fc7b19e83c93913191d4bc126785ef469de4c29892cccc44f578206d7875ab21b662624295d362f78f13076b0d7391132285b767855e6e016e2ccb0e5958b8843a3ab72afaff645432afc1882e7a60b2e78b75acd33be32c0dd5ad7e2a40ce12e75d76e0b15e6d2fab060687962ff1c72a36a9ef3dfd530d550b3b832e6de6ae112467a8856afca5571d3239eb0dd4e213536e9071aeb9d707d83c63acc9d4b906f7e590ed698791b6763320d1b8a87c94dcb7b68377cc9c55aecd2669a51143da6df3396688e32d39e4980261288fea0e925952676c6cac59f3c4eb5643faf790f444f866e9a668124dd0e9f4811e8f68246093182b9f3d01e4e4b1c6c2030020a0adedbe135343ea4a8f610b7262c554007af897bf02b6ed712d745fdc280c3efe2dcef7fea1d88e6afef66839d84ba4a69a4de1de83a876cb0057eb160f5f82d9fbd9a49ef569ffeae08724fffeb92ce1c6608a4c5ddb0d0c0b2afc9ac0fe17b8c9d6eea455602ebd615cbc1c3208c035adfc2c2939c118f3118a145c7121cb82ac7cd1a6075b389c7c5aadd86bbf2eda54b10ba958615ad2659e84d1854f88564a59fd5622985f1555ccf654d957f5577a782cc726eb4a65552d6f1657654088bbe2d71ae40af12ae3bf73bf4ecd8c700ddf92a53c10bc27502e9999071859777d3bb2a7effd16974d69ff6bd204e7e24762621c65cc2edddb16341fb22f6d2a1050fca0fabce1f4054f3439cb684e66e919cca49d1b9350c49ca01247121f03b58c3caa2ae6f3ad022ecf72190b3974c5262943b6276c04c0e56b02fa6dfe2c9cc21517f16c3594c48d0f1d64a934af478673333dcd23ffcd658ef97cbafce8d930678b23079566b3a4e7b9d88e94723a0aff1dff55b483df17871eef97c72801195e99f821a1bc57ba5d977821e37b91aa4a781e168ac58d71f2373e68e77e9f50e604871740bf0a130b1cf10d889b7900a442d10afe3e904eb515630de8262028c884202ec39337deeec32e8cea589d608d2c5d8190c2e7e3014b2eabb27c6ac2e9f2d9ac783c84c3217e1d4a3f382472e6de1c3bb703923a426f060bf46638983d2874e32168d1b1d2de30eeb34de04ae6093ae612a53082f4fdac0032da1fac766dc92ae33d1e72e3c974fcd75799c626a8041b6c7f067d118f021c1c78b9dfa59e73de30ef0568de3424bf11e34024d98812d52cd7e8b0ba076ed89c3767c6bf1f839a6472b06a5747448ea102fccef52d4b47aeb6460eace417674342ed273b4a6029b5fc47da239efd8fe64a881466b4431084086c1863f55266fb3662b693da1994816c5529db1cfa74567716fe66c0bfce3c711c5988d7ac7e3484931f778eb41d6691073c70c5795426f5ec9b26b64c34fd29b44d71f0f0d6445d0c79734a247e34713e5f8e33896dc85bca83a7b3d6c9b07140f0cf95c15ab23fa2bffbc9e892e494a928e904f458cf7a00a9a99c47611c14514bb21242a5069b469e9803d4967e6781f8f0618b0d5b95408177c3b5dafe141bed63c59d4b09bc858d671df0e79496616a86ce0b824e65804748b6eb27bb8e61d07de3df41e87659194048ea145cfb6ac2ed6e411557b19f2a1056059abacea45d520cf999cee53f7d3264f80eb0e7f6c4ffd02ac644d86d83b134bda125a0bc1ac17beee5073906a119df8bbc466522fc31cfaa22a750eedcb9f2518e0d45283aa56cf5b4d756ccdb968c4029fb604319bdb36c16a2700f79bbf0fc29f5fc380bd9360f45556589b94c372b6a291aaddf2af1a0ed0853753b44d407ae536cb09f62b4a99577e922a83f03a7d473f608e6e6c5106a2953e347ff5693875ff540fb1a542860ab9a3081c9fb79a4bd8c869b240b1b8edbda2c2e0a71ba7b6c5b50f08f70a390b53781e9b7f1f76194a34a7e1462f16006efa5688dde852c38443bdb2ce3f5d20ca7929b5daf270761da9206e898dce5a74823024fe136a95361f083a26441bf291fda725e0393a8ec4a87c5420446179408646cebe5d1fd5163f49d860cb8d610f7004025c0887cfc85c0a99c0ab3335bb0e992a87ee7aeaf9c19e0a4c5a227bdd3e22ac00a919de418321da658de8b9e7cd3c15733e4f8b248a427def531eade0ce9e21c65002ca598fb7a40ac217c9dd644c5368e1f7bb0d43ef563e932ba5fdeba88bf73c3e4b070c6984bdaad3f3386ad244910177a4a9bbad5d3e92bef0f55a4713495316a32f862ec952c91e45d2eaa7551e440e2b1145b42b04fff3f894622fe41a8df259ea35c37b860742f04c70ae65acce520670af427a02079984da2df63bab5823d641e878fa2159e82f67d7073276410d431d0c3408c11a7bf1020b6369dd7acf738cfd814b8af6d22f5ae85f29171ec2340ad45541d2b19ba629ee53e5f0139333f0c438208a65719d1f276699ee2b22993fcc284bd0dcb2f8d2aa2b9c93d9f58522fe71058eb8fac68f5ad25918766a7628bb920742876e764fd9cb4ba040512d970761b39ee6addb198d55b5051abdc302e701556d589f685f097e0788c19e60c191c6a8e3e3e681af05863b0b816951adc99866a4ae59cc7256568798d995b0f01052a15d01bd0b293a3257c64a9ef26e164f04d30e79e0eed5ef2000a2952803bd10c8edbc0b52444a2f839738f2c02c7dad263f88b52d8b64a65cfbde1b04acd7f8a814837832aa584021002acdb04ee369e79f3960afdbf6ed8793ab6d8fa4bceba5fce8a2e296460886585722be4c3158fbc04e90a39595fb1538a2bc0e11dd3900ce5b35e5ac5e6aa7597fdbeef3f3b901213cf2c56495061601cd9e22f62b9ceb4452a1d396f3e5c78981f3b3b32cf792fc81defd2f3d01453cda1f7cf46aa997f32a8fd6dce71210b825fbca28f3bac1c8d77688a3f26119184531190e92d66ee1389eb701061cd570026ff45da104e0f35f95e1092488fee3599fc1279496fe3b0ba5af63f888bc9f47f11387b05bf9ca8157c4ed450b3e13300d02492ce44cca218eb0bafe25e57d890aa8f4eaa1c1044607f3822800c1a2c2b65be405ccf43591eede5741803a0414047f116878228263c1d1ea7797ab7771ad9133300c291e504c5f814c89de9f67818c3f10397f2a11467d5efbd78bc800af9ad4baf60070eed93a6f1024b37bd62daeb1218f23c6917695ff4401b3ef494f3252e875dd0262ae1945baddece694424d4fa57d81ded4ad3f34ae00ef2cdcc847d774100b2fbaf80db3ca6ab7f6304d6bb7702dc5b018f05b10482fc649f8a9cb45eda0205f4d74af6bae2cc77d9dbee4782b6245d6940e04982ab4595c0c446809191516646b1426522a7011ece7616c6bedfa571e958bbe0967e9285ea8e02fd1036bee76b3843a2b386b443726b4ed91c909cac271a0139e79edf56d9a9d5362c2aefb11286e11667b5a5beaecb38abb099fbeed11c6ccd282e3822267315962d023fa0826e115fa810ce896754f0155b218934307eb86ab8f8679cf8c4f097d296bcc4378d8b316aee08b263666ff66826c8230d44ba63617f2c040b8ab700776943dee2623e3a590b991ff1216dc4f15611c7a465f384ad6d584029c1ced6c44688f5ea6b5263804fdbd0bd2d99e0fd6b7e8ac8af5a3f7a4d868082f5818c3a90a00bb5fc68d2929b95a0f8fef70365f46383b3581fa3025011b683f651d4435adf3acbf0ec08f86fd1a68c9df78bb1d3d8a83ae875cea3d3d75a05138d70c2e22686a779028d341b4658150fd40d330005a631164768bb0ef1e8fabbdc469b0eacf372f2931c36dc94995eeeefe0008ebe3f9d09178047db33f5b7be11295715836a4b1b493eb6233ddd23be799b0068c4e14010587e2ddbee5034fc41c53c60969aacb2b5c94da079b1263aa0606b4d0c5307393380c629d6f8d587eddba4e5ef1ec76a5674211e3f14e491ff3b17d5c5eefa771e114253e57f41779b96da7408607ec595cb63de9e76a3ff7507eeb9264e005bf851d8d2c63cd8a0d587398112b04ec43108deea5bdde2cce8a03da39e04be10716ee3f531d6f0dfa348dfa81ca0c09119ef12e5135e90cde2cce392a32fbaaed4d4da6eda92d4aebf3a1a7ed64098a5f1365e81c48106c2413d864349a3bedef4d2dc4cddeffd9d7b198c35cb4f3ebb8fab521338f4f5b04ba20061b7813e4c02d02a91554ddfaa64c125dcdb2f7659ca5654dbac45ca5e3b683dce8f9dec2d46b5fef4646a7961bb1bd463d34e1d6e6e77d59e0f9b5f526f78df71ea8764a46158c1a8c25dd8676f22271b97a677bbd366d05c7f5eda110ddfdf8fef5e6c18e279b8237db5fcecac9c474075001c0d5b6fdfa7bb1eaf63e1a895b588c772afeab759de88fd5b1db9186e4a22b2056b072f15ae7e07cfb604cbf274d1260370cbc9631540c028cf9b80d206528d8e94266bad25991cdd34b1dbf3580709cf80b0762903693c3e5708d443c8160c6361182b7602d446f6a2434ef948b20e909142300d09f827645cce91aae4e52512d3c8753067f5df4e1a7bddddaa236498759f29c5136c6c0e4278e7502062462ab541a74e5f99c7b887c81f139ab9536277af539366e8710f8dc1a7b3acc345ad4df3245a86141f4eece2b61039688e0a2889e5c2bb2a71ad6cb3689b14278358629bc4f55a5154c83385d89f526258a0b027b913af7dd98a817942928096bd81384fabd30ccb0903f9cf6bab46516ec1ad1d8d042333a005b6845c198dff2d652e64407f6a58eca75f7acc0d36830ff13f9110686b5b71f5d996f570016b55acc1f6a388ca4a40418c959796f6f08958e929f650dd0af2bb2d92d17fd27553793990d89bd0d6d4f4538fb1c63b83246843db1ba49ea5ebabf3ff3f9cddcaebdcdf38b86d918dd6a1cb6a530e592a5279c9fb3f475807e1617021b0dfd2e63d8399f6d0decfbda5549246febb2f2fcd3459c50280fe682caa08787e50a0ce4d84306886c1929908ad31af093b77902fc4a6115f39e856fc013a650d3707ad5c66a337b1385d4270e0c1d46a6b32327791add26b6eae76a5cc14c1f7b16b750d3a4e4393ecf90de9fda2541492eab738b156b874d1656d0eb48715d1ce283b2efc0c516679ebe7ab81e7c914606c1444f73a40d107d05fa9edd633b0f0134670a420e299697c986281bb51b493090c2cd22740681024700e93930655a2bda22d3513a599125fdd4ce0e9ef5cded2ad050b84f7824c6487bd95dedda0f3d7b1ed7c0a308c30fe19f33a4ac64b6351fee831094725d162539fbfce6af4cdd6084499f72c0bca4dc4ba1b257b2e603f64ef0a4392b15f3dbc7a10a4ad7329a61486de75fcf5fac5fdee4f89d657c514c07f960cb6b18eb43c6965d851c940bc4ec3e89b7d7ae2289edfd60bcc138a8021a84273c4da67ea251e5f2e109690e0276b0dc7047c669aa7a045ea5ef320a27bebce493b1dbe2762f03728ce26bbed7e180c437e3af47269957c42ddc5df868d070de22c32e7081f8ebfda8ae8a56b3cc1393a0200a8e1384e529dc219e46292d4987618b5ae2cdda75beaf23f1e6860d46420d66678cdaff1a366c6e15be24d194179652c1e5b2f13fbaa89cba60dcb9ee0144267b2104c79654f39a12edeaced6eb318e7cd7717f361289124b8fe7620088d50c577b607f5ee55d6585a07fb2269239450d099527bd9f75845002cb20426c3cdf9435f19253ff1c6a5a2100d48d5a2b05b0c39a26c21d795f1a8b6ed0dac43c4c535e8369c726e747c6e7b8d93fd0bdec2b7be32db85be87b74dac8ed76440538dfc5425aceefc0f23bf08fa6d115c5b786789172f0fe04c1c7d4e3e1efd40070b8034073e3a9ff3c428bebe161e46f20761cbd8475cc5a9eed6165f80fb6ab9ece08ed451a2ade97a8b218cb0506b23c3060fdde85d1d2e56b17381b83ccd9353e17e72ffbcd5082afdf0c9ade0dc832c73fe91962ab3ac921c7aa73f44beae8688131f31589d6969baaf70edf7873acca950f1ed04ba8ac208fc85ee31f9fac160412bf7da8375edf94b92dcdca2ac1f43a8dd686f3a9fa76d95f866db35c43875300e1f23f3d07f9cd9bd6b2a435e3d4f3a0e35ddb8867421f6fbbbc308afbf84cedc5cfe4b811415ab888bfbe0faa69a37316355b3e4640333156572da7b88e0159f2be51659a67a8b93b828d5995f7a6c31095ee1119820759aacfe6663ed7294fcd1a7882425db32b68fa3f768ac086f5e1af094b02eddcd09abdb569faa7ec16aea06dc63e02711780d10ae8b33796ce36bca9031d48022884da09b7fdecf69e3cf6e65d79a2dd0b309c1f05be688d66f6982a016dbfc0a51671d789dcb3d6b11e46a8191c9fe57bb19c53b224e9914dfe21bf6afd487f778ea49352ff87c0a2ddc6cf7cdfcf88a27390cfb5d41edead212f79e091cf5e5a32d18384763a2718a585093b337cf74d91afd392276b365b718fd64f9c394e8920c36ab78f66ec9c93298589cec0d3b9754cbeff2eec482d3d1e4cbf6301c55515fb8f9dac48c0c7b67a28ee345bdfa4a8f26e83f9e40e1f3c28405431508c587e66111a1a442a23488cf3f6a3a24ea1015ab9301a1789d5c3ca3c1708d4f031d80dbfb37db58d1a6126b4561670d336985ce45023499540d0580208f98d30152ba188b6cc2fab2360eb2a0bad78e602556093d5173fdbefa6d4ac38f792e5f3c9c2cbff3d611be04243a02b5e757273dfcb4b428fbca8dee6ed823c0b2b1ae71a947a399fd64599cd55d8b270902f8326a6aedf6db87be539e681e9051331486e623f68260f72dc324db7c060593884d80a2b0cca014055b3a00ea400de28bad40c40f71cda5c629b1f8b165a43d1b02f32c22dfd67288a8c15a0869ee0e89741a6bf09edbe9a216659b6061fe3cdde3ca733b3cb163d8ddb68320bf5c4ef0b731194fa15fac9b43e0131a2731872466789471b532f08f530c9f16c6b2442c506c94300072245f21bf852266c43af041c4b4bc80a1f457f7c0cac46bdc44cb743150c98f5bd401621297b1aa78388e796f3640a6fadbff966b367a72a0826996b7a9e629cb32d645a4c9bacf5e068178a61c2b22877dff92fe5d5a60f63ddcfc4944158eae5f1a8aa092f93116324bca2f9b3473af23e623ee348b0f8ec304c3149a5c8cdf2c86fd878d40c54ab4eedbf109e533ce963b34c7f7915ffafc805bd4cbd81d87f229847466027a7130de4ceea6c11c787ada87e406f85ede4826c0353495f9f8106814783b56de9e0bb41a69c438033f866e0b9df7aada1c9caa559aa17e94b28d444d25a1d0acd65cd382023888391fa21f1205f2b178ef18340fc3db3d1b643720baba9ddc3cbfc40e8ead5d8e3962d2df178a7db6733a36c4b0489e10774bf4198ffcf268402b2e061d502da1247c558642f2d95473bc9f565f0d770919236e5aabde3b2e541825e3da167949b57bb8eedbf198470295d353573aa10ec952196118d1c15c6510d1f1c2e898fece8a3afba933e840e771d4ddc355f698c5e574c68da969e17291bbd9b6548593337e73ca006853276e28cf36f83c8e52ad11d5fb60901994baab22df6e976db73a954b2c9ce901e91d66ab67c09a1e15e0303dd4fb4ac7666cfcdd1af458f7d78e2f1ce3219f55415df55c09908db1b5a193c5a2d3395c9a4c8c2eceb15775566c94545002dfd4bf811f27ef7b51cd80fef698e7187efca67c0d11b38f0b7e8f62e3766e7ee2e036a89ec772e63a3fdb7ac3b96bb0b94fb194f9693a6c3d6aab06a3fb665cd37842e41c127491b18137aed8c4f65cbad8aa2c06ff311004b690a7507f17b451562610304790b9f7670c61b95d335d0c579d7e8ab4b367af4cf487639b43e2ebaa83bdece91fdd500af7a455faa44c67757515588b198c895596665798188ab044b7013f0c86a06bb3676cc673c7abcba82d1b09a78bd9c7db8ca213ad5679bdf3293e8720a983772edcfb8e274aeb2c7d032dc37327e690b44b23511ceb72b53be034b5770af48511b541b94102bf612049b9e5fc28a18ebd43d80986c73ee65f7fdef6bf041eb3238a6bb70ea03face9a7f325b4854df9e46b46098db54278c2df76960efc7de97a060208255d29e3013102d1c5417ce4d47e301a0f28f6de18e02b3c4d39f560ae50e6bb24780def70c3baa21db0c998a09cc08279f08ce32029d1e9affde9d7658b5a041f0b22b5211d2ea8388dc89bc8dee9a8b9b9f4b67ce7854ce46d78a36e3c08b5a70da4843ee606581202b34d1d39a4f59be85131921910814ad4604846ed15d76aa0486efc08568de3da9f8345356fb1e9a5e1f67ec32dc850f8a98c930137be7b4d7d149b8e949ed2759e5a446c176cf3599b82e58192e741c7f2809e9e22616ebd714837bebe529e16b554412454eab07916fdcf9ae3d151557bfbf9703b129cbdfaa97cd388e85ff35b5bb5377359b7441656861367e80541aadd489e5e8acb8a7d1fcd9e37b0b55cb7ac47afa710101caab73281fc89a70100d7fec972664b7ba22f1c614b031c7aa01e89d6a1f9eb130e01a98b57b1f1e04f9d23f0f540e7e30d97fab6d4ab464e78ae063c41b036ec32976e84ef97f64815590c4a6dab9f7b0328b779dfa65d10893c22ce6001fb0a61cff4528c107efd13df5aa44211a0e2acafc47a8012d4fc5382c1c6b76445fb482efa213e9e915b74a18a9fb9db6ab608f39867a332866298bdc3636c6582ec7030937dcfc62c4580eadce6e3d5855127c762758c628762a9d64103f059f4b0e372942077d4da4f8fa42d015e0f7c07aa871c57011db7682c03ba5a0d05d58b24b9ef7971a732d0fb29958ae559803948e14544a6fb1a4093f2e639a831731ad6cdc0beb5fdd503da3db3ebb0eee60a0de98a026217793c2e84128a77f54453950c5f051b3c96aeef5c3bced7a612d5248e2fed5e496a5cd51b7ec06ad9c02578f08ef69897aebf7016b2e3e2916b86ca98e9fb651afe3935a952eaf54dce0af736da537a404d88087cb56bbb192e9f44caa6721e37509019faecc701e00b37167ff90ad929cc8986d27de5c9b99ac752812d6931ec8baf4416045ae8b5ce6b55637abfd11f5c23d06972117cabfca15df591a983a6fd0d1d8975e6df5180a7d7e8e71b798f9eaaf96a8da8ee29688963e85c2ded6dca145ae889f6a414e3f8e2d20fac85615db4d2f25a4f68dd8040eafb864a5e4acb8d4681af9319361cecc763a3def54c5fbc07cf414ad1cda737d712726e00f145b5bb8a1de9914f331c350e41b057e080fa48bf658d9d4b95fd9abb4c8ec3cc7b3423fd5da010827ba2d7a9bdd0f18ae26837ef5a477f1aa1348c952e5e1ac9aad3ecbb53978e4ac49e3c1223c20d536fa7ac9f8cddadfb0743adc074c63c390e74dd22cc98531866a945c42cef6c6d0370a17f9387db294614cd7fe57599fb9f8d46d24fd2ba3eedc2756e216cecf2999dfac22c21a8ba22150d638b1bc425e5ce9c077d02452f69574fd551690ac0446aa9fe5b39a54fde00a04fc23ddd5f530b09e6eb4ba31a9a95faa8ff5ef8add0f5247e50bfd2bb273bb3b8ac3663b0a793c1134b58eed1968b4762d440114069163705ec6917db395db93aa041f699d1df6e00e0261e887d3587db99b004f5a68e9cc71fa3150f4f5f6e770e3c9430419beb0c1c8ea38504bb011f25434102d563e80056d81beaa0216350d66ed33d46a46d4b2ffdbd019e15ff84181ead7c65b48bf0976daf67bda17132e5efdd31e226583f871a99a1ad786517b5f363fb2b33bf850182a5c81aa73e906bd7ee42f33ae0f779b68c154affabda9659f41ffdd511e5164cc70d8a07de83729350bea01e9de533a310478ccbac3a36f05255338d22218ab3f74e51ca2596b06a1c6a5a452c68a3395d890163cbd31177b1fba9877bfc4cac4f3c5b3daa4176df597a42788f4f969091d1de622638fa0de0968678e9ca5747669e7f204f8486ceaa3aba2dcfb9062701b2f5a14dfb826b23810cccc071836b3736fa792ef76951be442ef2cc77468a3c2042750f1cac2ee2282e5dd11b474e03f1279c59aad917cb2a485a241be9e0fe5455bed6b23bb23d28db800a8d05dd004548db865d82703206b426612558ede6f14084a18ab96b5ead1ab94d9cd4467d14d5cdd0c4cf46cfb9b45331b1b3f8f55713ebad93758a66f6731957f8fd2f5308bd99ad20032cd6092122d0d1c86164435119fa682d2f4dd140dd7bef669e455f88210fb6670d78858c0684d0a2d9f6e10a971c92193beab0fcb2d22422510161d31e3ba21ea70f87a13cd0e34e000f16c729b5dbe1025e76b8e45d3d1d642dcf8f12abd16f1f230fd51c5beda98a3b57c7a8c8b4a7a4b24a5b4465fb3ff09aced3b550142792f351592183bc582e4cb4b62a3820e60c84f6916254e74654200212aaf84d8cceb651705abb1113133fceddf2bca4bd265f293c8aaaaa5b27fd18980bd9aa329ba5f21a5668c3ff5aa8828f772fd943840686728f80beaeebed1bd906935811626a6c1c5cff87b78c71aaa314bcdb2f051cee81363dd97e1a644c9387d541e2bc7d13e2fe8e094548f3edcffc10112c762a46827aff51c8920a45dd3b220aadf67566ff8e2565cac68493905a4eb787a67e4d794943fd18c38b041488a7a8a5b8fe755b4336f4aa043da6a74bf2a1c176db7115c0fa829872864b63c2dc992cb66af3ece030754193332fffbcc5fe8615405bc5ca05e228c20058c35ed55d191f1d877bf23845d126e1f2c6f6ca5aa009d5e212f0b907a0a8c34de65f2fd041f799dbde59b30d9fa8d855b4013baeb2cca7ebd8d5d5f0a1cc09c6500aabf73aba6fd42a60b00cc19aa8df5488a7bb2fd7073ffd0f68a998ac3563f49723abb3911d991a47435d8552ff0b1f95ea05751e89217a015a91b9c69e6d412b421e28cb6aa225d639871c4f9ee3c8f849256153cca2c08d77f426f010ba93b0f0f8d2c36458ba5587450c4fd32a8c7e9d1f85cd9717bc7464abdd6617232c19be35403fc38d1484bbb1f99a0daeaa8791641c780ab2ad9b7c9b1a4811de3af408a1a42346669014c7a6f2e94af9bc4346cfac1122997a7b7784e955d22055b35ec78fe7ac210bb850b0195d933335e7c32a52f18c9a87575e2fab8bd963d2a1c19a97ac77b5c273762e7dde119156597733c3ef470ca113ebb835de4bab5d88ccbc6fe5823cb71e898f35a0f9d764531a70738f511519a720fa7a2cb68d9442624d8c73faaeb3665d528fc4a7ddfde3e78c7580b8fe16fac270a48f845a95a955abfd6fa54626f1a1ae35d4430c3a1f3e181b8c74834d845d09317d461b5de77199ed03c6c8fec9f3605dda982853864c1b47d465f7e9b19b9d982f3e6e07146b35c00c0b25193cdbea444f1eb17a5d776b4c2ef7cd57069170446316fa6795f38dde0ed6b03c011a136fda71a6774c20330f25810bb690271dc8195b609859cdeb22ee80451ba3ebe361159a699bcb713f08f64cac270db893cee3c9fefd87782962b9c220db9291f935e5e34c830df0c0d28979234fa2be73ea6bf835501ee54da79118254f2c9eb7fd49825b7e6288bc55d60dce44b5c35ed39e183254bdf7ceab858a67dda6bf05e9df0e8554b8658947d8f783bce6046a493ff562a7a0857e026d989a47840bf5175668ca22103f5e8bf8f43866ea96b81a0fc335a4eb1d74542739cedb230e1beb6b5ccfabde665a5c0cd4d93387ce5d9075d17070597f199b11ffd1b7f78b899c1a93f9882ccc2f275f7136e685ba77d9f6c7e5e836235b9914d96ef371d89b63fa1236c2d7944899291436e86700ddfa69a21a48008d3af2894bbd62dbc682244639754829a96323f426eca8c0ff3de364e340dc8548a52c2288ca409c1bc2a5834eddd35d3f9a7a183d6b81b4185bf1e7835ac6bd96271511183af7d9a69ed500d085b9c6aeea1cf00db4aced1cbfaf7bfe4e5eba3d7656e83d9a68c7e3141289a38cc700780dce19a55728e6993fb417c11147b38d5df83a19b59e4fa188c9ac704f9554f12886e511aab6cb964e9eb036f5502e667aec5a82f819a218c8b6b151c356198da0d9b685f11756e002d7b6072dd43c7a1d8be13a31e61097af739c82fd73020bc225bcd8baf14d5d8ef416d5216457d24cb59425364f1750ea1daef53facf869c41aca023d506ba6b5c86ef1a36fa763bd7aeeddaed583d98cf9c04bfb8b5aa8940f7e774516046998075015c95498282419f776de2dfacd6d3ed971d242902649dc418c2b7afe4e28277993fc44517b7d9cf938d117fb412fda3dfe7514e2f92ad4f9d07ebe06f7f6ac618f1700e599439c8aa6fcdb4d0a5fefae8505e596cc02599b25c7df147522b068e5fd7e4fc3e4b4b71e7ac9b70a2ffac641e916b31e5b0ad62df259319847259ad8c28e75583c9ea03bd779a25b21f4f7febe908802c0ccd9bd08969a48497ef1d90750fb75361676baecd60d6afceaeeca8891a3490152aa14b381ffa913934df2c0c5a530dbbd9c6b98c4ee860c1e77f2a93d0f5125c18719a7f86d14f2e54e4b786eda310ff9b40469f0f4f2db93f3c1e16eff5c2d82317fb3420d0562d72b8d79a16b6905743fc4d4b3989b296e95f04838b3e0b05366e0919ccda0ff50267a40baa3aeecfdf437d3458802fdfcf738ff660378f6ddfd030ec4c9f83866f520d3732e1556586f48e142cfb1464919a8b017f3d7d65801a547865e54d314e0f90daaac3ea8b92cacddace302b2dee4873c20bf258e11ca64f56cfecf121b65d4709ed3fc067d4148e7c03bd3ef98eb7f6871cb01b5ad05b6557c23372221479cd8a9f4c60568f950f4cbc587ba70da00921bbbb84488aeb686346c4601427fc58afb4328aeecb32b51eeaa178e3e6b2e19ec5ee73a173f3b32b80f50f6c6a42996cb205c1279a69ba37cc87aff547d4d4d9cd53e15bd14359fad159b92566298acf50347b42c0393c8eeca7df85d56d242b4ef5527427e69f7d72ca2585be7be56515971d58ae99bc79f75e9732c33b07844366e6e4c1b647880f8fdd500cb7a23a3a87a17ed60ecb805c52ac370c719ab27ee9a7bc4a84ecafbf2eb228331668c33df13c692a6fcd0348b8b53525380e92c34e0583d9bf8d90ea91f0f19faae3b58510d009b7694086f18d6335efe237ce45449faee74b316350b65c69c75c3e8ab178240afdece3ae444ef25e215c3ad741a82df07e1bf4e457ba5d96ea80e05550f03f99c481812e5c04a75d8ec2ff78113105b174d59ca25429eab585c54e550b3b90dca69b7fa6da2a387be2e29f92548d7ddd1f03a3558b6c5913185879e8eb0140baa197bb998fa71ea95a42e965fbba541667c51ed0b9b61e979e36dd309b68f761b5293ca0c49d17a4786c1a3610532b95ba4ec549f58c1e916e779bb57a35576737c493da4dfac855628781bdbc7ee2e44cb7b10035d399d671e5c9c76f10f5e895522f6683954306ed2946a1d13e7562f4b3604b3b2eb2ead45f0c113e4ba0f285aec4ca804381b268cc9f51d1551e6fe7dfa167e73569934ac4d12ec1f8d7fe3ce38f1db1890373fa10d320cdd3af0ccf2a2a300584d0ec3c2807d2031a1e0e997c8455af87ac082f3ef423cdc259f4357a4e7d5e802f85c978c83156791415ed9ebc6cfa15c097bfd6d155e31ff1a2dba74f76d95bc9d37c58c1d03d5eb61747dd7c90dfdaaac5ce36c5c39597e62e86e64eb731809c9410e718cd868cf1e79405586605575157394bda97d6a358a9c62da6449b8c46b41b2e49475175bd4eca29801dc1059cfef39a4f5aa7d1ef5b5223e08d14e3bfcf28edf82fda92a20da0f9d25e78e28d98a91bd3a7bcfab4bfd7fcc10d807479b00981be589bb07f1c1e0d1ae30f61123bd1e8bbc189d6025b59c95e334baa0cb004f4c152cdef7167f90c82c484a82caa4e6e1e22a753c3489a93bce8bf7abda0f352722b436aecdeb0a420167124b02bbb90971ef964489f87b1065fb8231f2c00cf59019720ae77046a0531cc3a7fcc6eedec288a123ca5d128bcfd67202ba55cc7de4e421b1ee123cf6eab58ef7a422a425486a0f25319d4d43dd0b0fbd2eb2055d9255de7f55d89b929a01df702bce2f75ff99a7f47d30fc60bbbf80653394cba515b1c22ed471166c3ffc713b5a9217af1d1c21b5dc89500b90bdabd685ae684b370326d501bc7bc7327589b78d21d3b996bda9b8a68614bdcd7c0d10876d580c2a48b5c40fa15961af78abd7a3af2518d25e1b3c926de3068b777a64f5781eaa74d2076e1bf84aa564507c478714fe94d274dcc6cc2337a1611950e009d1ed7b26266dd427419c8eabc89966ea8f87ff285bd9856b55a564334e437fc5545f867dfeb0b6f7e84f2a28cbe58ca34a5f30caba5dc6ad0757971e5e18b5c88a7545de76f31c56bf9742e7257f4ef0938acc353880eaf1ab57874f80f7b088ee4fa7eb18d21ade49d7f41d590d7f4601f025c2516f53480034f850836d4476f454b6115316461faefb8d790f4fe1fec8e16e2115331de23e82089a95018e8df1779ca6b013ac507a5bade7d77c1c97487a546c4aec08ad7496ba2e474b1bfcf0d91fa15b614764379b36a042a6a5862a1d3f705dc52c759b885b7359e071f2d74559c3ae9c8d1d03f7f2e1b88187bab5dff42fe712b2593036efbab5ae1d7c7c14199c8487dac50101cc08c10254c7039307900cc42627da90019586e646408a08b71adc5f244f07a9c59243ef25c8203fe6483fdb3267d121e1d5bd254970b013da39285edc34787dae8e45d3e3d364f25fb663b66a1457413360ae4d1f93c47eac5849afdfc460f10f058d4e0c704ed47295509c2a247f16f3a65d5053ff89255db1a7c27b2a5f54728478a403fa4330c1441226589fd91621d8f5ef8a0e0a65e9e2ef02b51073de092bf7976192652fce121d0848d9aceb5863fb997763167d08c97de5c7980599e0656a0b15aa3869784dd3bdf1f555063d7d208f5083099fdfa3e630e185b822c7bd3f055b461ddcf04751fc689b64c0c37b94e2bd534d727b62a9a8b0f82fa29b9a413f4c2eeddc44741572c8d0e0551b1ed884bdbd02fca221b019918e6658be5ddd62001f92a7c91dc7c0953814873ce89c938a08e11f55e17ac9cd87a43be2d21b034aadcb93f4b3db9f114ca94c95dc6b3bb0e7d1cacb9ad081db6bad68c89b2b2250b0629b76c2cbdc4b959343af904333524958f2fd03d607d47d639151381dee5cfac60281cda538bab65bdc3adee1afccb61798e4d4a5472a3b7619ce01b1b57ec088334f332d32e3d7712ddb0bf7199cb8e49ea9f82c59233cfe4db2fa1662e2cfa1d2b833a6a8700456a235875c3e519026ed14fadf14d1011adbcd26392bd706c50e67be2f92d423a238e70dacff8303e61afbdd1625c847b2ee63c119a8ff5b12f4b90093de3c010dbe90863f11b532a6ac1e32b6a56527db248a52c2ec3eedb04b1b2aaed35557adaa476ff1c09ebbb2994ab433e0ed5cd4e128b9a3072d129d16b19873800aa971090148d3a3faba6b8d53a7326233c53505a0dade681d686cd8ab46e55225132893d5dca0c98597fe18d35dad9286c516462421d21ac477e223c69e91268a53ff3f8dc783e0ba676ada03098c4a1830500e7860dcd2954da8d6874dccb49e770f468860f077cca0e5bbed209b675f4668ea2a3111ba277e165752d01aef8082e29de816652f8c22f5d12f7b4befce15bbaa1d69abc279e5476b7fef36b716c1c9f5d9dbc6a84bbdcc9b89ed6dc0af06a89b00a4ea4c0a5632c497f7bbbbbc1677dfb11f364c61dda3872805ee7f5167c0ac642a940021966480329055961ce81837703b23f18954fb6f90985244d1a714af183e3779e5ff3529289484c03d270f0e7204c3454f48e62ea5ac4c9293abc1b3d2ad70ad5a8ca59850ab4295033f769fe0fa5d9fa58b2e6ec356ae24800f7e2c28b5a220a73f3f16b8d0288b81d25b8fffca0cbb5fb5ebb8fbe4d3624cdd01a16e80a0cf9de693f32c1b9c8d6a2af2c448c1cbf2a80f4899c48a5d31e5a60af3cee6602a944fb2a5b237ed0b93e385bbdc2f95c586ef05e4009e19760639d107c04dde36b59f9defbcc02ac3399d709d7618fcbeb41745bda17aa163a22bb486fe18e2c30c99746d165aa6713d677c92c97ee54b5d254cf7a493d921490cac619fba7802a4450405c86a492c475911e404a8b4e1c9ba6fd3f8121a168e19fdfe8f4cdfe522c3b66732e6ce9546cf1158f7d8394e71231110a59b30fdeae6b91836bd3de35220add321ada3fd510a65256713a6573846a3cb71a50feacec4ce510cc40e61f6ec1659497cb8b4081af9eb46e9d313056aaa64b7cf3704cda540d232d55e30e1b5ad07843fe6be116e967b0ad4357c5f05edb2360c2a3f06d50c6bb4c6e0876503938046f638e551bdebdd91890e33fa7ed7f930500d2dead3f08b1b799c18dab6ed913e1981e352136ceccb2f30d2128bcf1bd22727d52f81d82349d1d68d441c75ac54cea3431589fbae2f6befbf23e40213b7c298429ea5f7ee52492b774ebfd0e45c8e6293b269bfb47a497545f94c06bbcabbc347b18f228109bff3e757143c793ed957a0f51f58442e53b74e1046d840dfe874feab16cbaef7c193c79c8d8b95ecb9e291400abc20c9aa987e1a825dffce8d2780f5a59f966822c45a60f5eb546a9d20e6e8d4e0669ef214134926e206a3fbea7f32187362ef377708358f7f6662b58eac83dfa0ffe348bfba7c8722f3d041117657731fe7477f9e8bd8916f138b80bb22332d5dccbcbf6fa98da7ae8e1fc4fc372bf5db8a2f9c1c189656fc44ef68f6ca0a13d1b278048ab1585e48ce7c55427dcda4830ab9306fe5c2b7f36dbcc5351241d75da09147767fc341c18512f24db15cb30f7fab473acbdd0d1d512dcde710c9a4c7900f5b8bc458966ce8ab48b3a6841e94220f7451e9d3d2fecccc1693a6346d3132b74bacef5bde1862b8b4133efe0ee62c69afde2e60f62eab510ca20a755f86d936ce845df1afed1e0a92e30694230b2e612400e12d9522995039edd0e7c7b8b6af3c1266b94234fac9cb4b29bb2f2c795e2970e816123a35d446b0b82af5ff995ac9a33a7b0cefd1a52e0383197a88be1b50a5d5a3523a4f65591eea4ab0f7bab00357b795b8967d805dc2082d6633558a68ae14f02331fe0a52f0cd48f52da962938436345db0fd26a13e3d5a56f15ba0902ea78b727f37333b680d96741d7d58fa30ba85bf9086632498ef21a79470fc8411718cd242b2c4e1fbc542fc9b43ee8b8b3bead3956bf8590c3dc8bb7cc646357e909da4e45a012b9ca15c3598859a4c44e73db8a4e6493147f67053d9e40adcfdca622db5992a972e65249142122c51a5c023b9d0734e54bb797de93d090c510e752da95cc1a398358d83659aa59edc8e4a056a985170cbfb51b09881e5ee633fe14bbc16a6690dd3ec26ea0068906e62223cca7e6370d6fe09589d9ed0a7056761d5a197cbdf96f62c8493d3f1b436d229430aa4cd18f1047bad3ee9aaf7bb030ae367eaf3efc9c963a4fde43c3d1df62d6457d4a862b3a59f7353f7568434a6bbd8fe78185a2e670381cfbc3dcb6c3f2eaab14caaa235d07f288dddee0872ea4444f5787156c1a4bcc707947867e3f250052a1dd51377c7ab30d8a0ffb1f5ef7187d99de5b0a4d2f15f9906a10bb919194cfb8d289ba81c6f27b5192789470c123effc57250fdbdec8fc4bd7ba42a6e436e8174b95f1b8fc254412e6dab4e6506ca85617e72d9bbfbbef857960015a2e48aad853a3e6e33efaa64de400c7303b4ec26ccc5ad9601755ba30f1d009d8c16790b1cdae7031eade30a75ad8484e72125cee0b685cd940410efaaa61151a693bf6a0cacfee567145439d858f0b2ef6d1f4fab3b56966dc541921199c7f69d5816a1ac15c3c179dae28b8b2bf847f75e218195ed246a1cc864b625d3a431b2a6a13c936fb46e4be11a8e596cf915ae11146d54aac537b088da298cf464a76daa3b13d852c84fa0db6fbd5ad178c48deb11cd2916bb9fbdacb5ef8ae3e87427c2810e0932b0897d3b42704d63ea64fb0ed6b31fb7bde0a9ab059856a002c6a9d095578523786e2131a32c90e83bf29c23f3b94b689d1b460e712333e0c541c56b7aa91fea48ca0b500ab38af3a89fa87501e9bb813310ecc05eda19b4516756a883a6069647c18a63e6be5046d4d4c8794bed6c7aa60e060cb4a3280d6e556b9ed94223c39cd5a62f96fa267d9a4082f1eb3eb6d95cd091268ae42bca13ad8cc18338cd976f1c71d3feb84b0701928e48d29061edc2a21db0c0f372e3c897373df1e60a38fcb2719890647c42a092b2af45fe1cda4b39488a712e70e93c9624d32f974bdab40c6e237fb57c7e75d96081d281ace4003e03da6cf2b158315fd6e17101cdc42614d78577bfa6388de450c6a6460565e896a7e58d61596e726d775aa07da2f7835c6741cf78bbb22b0e4c8f85aac3020f651c3a41d82f168b2d930483d146ec20a74644be73cfa46853e43954300cf940ac4f548271c25b804453b21420734ebdcbad99849d67fa38b3e44c057e06d4c03ffd80e26b2661c86a163b5765c7c1f617dd117c8cf06be56da762df0436cd64461d23f54ef114b67684c080c1e198097a6e6649f9f9670e83e29cb717a38cf50dbaa354588a48571d0c69ce94299289b86bf864040a9f4cdd8f75db9766d81f7e13e9e57b79267466e3b39f31d64d5b78fc85b1e4a75ed06442c8aafab416d9d2f391b92c1986b92c0b75cb3667797ca6aa50230c9c38d4c639f0d55ded8e3c66fb06dae8e2a4c604f097959697f363cdee5ae250bc82ad2d05a8486063f031fd1f507dcacef67034cee0462fd04e4b35c28637010cf0462b3dc2ce1c672b00fd2d3b48811f82bca6d30fbccb9d5fcdad2ff8a410a949756fe50bbfc4a6cdef1058ac060d8cf8e5080405247c76a86316614bc255840f628be04e2b4bd75fecb0c7de92ce611bbb89c9cce796ae7463ab98082c73ffe8b25e4496a1468c3e02ba09583895bc337847cca60efb15bf3fc0b2c42be2a21319e04883c445acc876d3c7a6150a03e98cd1b5e2da4f48c6b835f38e8eedc2dacdb35ff248a7f81bd3939ca1d0a668a224c6efe1bf77afaec80dd5b60cded83a3f0f6f5471edba4bb23cde00d55ba0c5fc081b8aefe09d5981063d01e0fbfaaba9eb81f2d7d81a6778d85d807b1542ca89843313fc69f8713b098305ec03a392ed23ceee47e3b2584adc4c324347d00285f94945dd59718b660d066e966d3f6cc792f2b1ef7275997b112aaaf4a482196402348da66bd848dfe31bd6b20b81624064f00b34de9acb449cc6ad6d0c0ad7272c3d0d6c44933a6526672f9c8c70703b86eb0c562fe12bf3455fd1940c68a48e963240db86eb40165b6e0f1d6e8dff5faf9d635b27a3a7e29b5007819fbf9719261bcdaefb390ff6d45ed75cb68ca1d64bd","title":"146. LRU 缓存机制","link":"https://leetcode-cn.com/problems/lru-cache/","question_id":146,"issue_number":15},"13":{"day":13,"pres":["递归"],"tags":["DFS","树"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个二叉树,找出其最大深度。\n\n二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。\n\n说明: 叶子节点是指没有子节点的节点。\n\n示例:\n给定二叉树 [3,9,20,null,null,15,7],\n\n 3\n / \\\n 9 20\n / \\\n 15 7\n返回它的最大深度 3 。\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d75833d84c0a729f060673f60565b7c085684842767c9fc0e2909b27d2085c35aaf331fd4cf6558ddb829ee2dbfeef86cf330246694d98ee31b2cc0a98c904e303ae5658f99b401d330bc35daefeea38b1420c60760a782633d23027ac0bb8bfe3e5084cebc872daa14aaf2af55da70ed36d5025cd7e38af5dbab57ad4dc62b58c4decfea5840465bbd48aebe6b22f03e5f7a132669d6ed2f5155c11705df105930a8f6d97b051f63af15e54e6ff61135598f483b8d875e936a9e51098e6608728235c56f7f22ab810a5e86cb302b739281acfd1594ff57eeb8134190834c4c554e4275a2cbd922022024b807311627a9e94b88bc9f9a63be404773e144fb5564e7d99427fc309a4685d1c93f938855a65139f3824ba4e6dd24ce5a7244f27529b1a07330d2b75da5cd4d8b9e66e52180710c92c54b082d20a7e40fc1b1845fd2a6e7acbbb7a6d76cb12ad2b339395a9defcc9614a2df13d13b0157673041e4c817c5d13ba2703a303570b45b8ba5941a768139455a67dcc373be4eebef750527a63029df98887ab5b679e869b7dda8eaffb73d1f5e4de439b38f2756c6efba04c0c98efddc3aef68230e71b76d51a382b71385c7ed0e856d4faf3f576f605713e57e21f6bb81a8eff671f8945b0a2d8b4dbe0d315ac5d342ce97800f15404d91cfd2b070c7dc68d1e74b816f9a8c6696ab4747017dc810cd5efe7e9fc0d29a492ac399f19d6660b2082f8ba487bfdec326c0c3bef288352f33435acf81d439b91b4469521efb60a4ea60182344d6465e4e7c50e1be9db2d73b240d1041ff2e466bf663fc412b9223f1e9494c9e2cf051deeb7f5aa7bdfaae58e8b31da1f0435df7bdbcc2abbcf8ada8cf05b894f0a2c08ec6d36945b85f467facdcf25d9a5017de5215c05ac162f633992f61d2187108b56397b061d6cdbc623d5f26a6dde6a452ee9d03f6517e7110b6778127cc68f78818eb590d54f82893a12c5cae62a5fe8543486a1850d2b59af877d20b09ff212cec50cf17350682cc43521d6b4d8f78003107edaf187a5024e65cb77362a3d1496c7ba899be1366901dd18c7d8d3c0086fc9eea0cab204ac8cafb943e60896a0daf75137e4fbd65997e8127ca249a5d232e9eb3185626cbd4c6bf737c2e6368574b186a55cba19a2b726587c6873de35b32373a0bc5ed56a84e5d974ae004a1d8c0aae39481e80b9a30ca99aa931c8ff7edac150da3b96cc857ef6ac8a6cebd6ce1ff15a75130d2e171abf38e3e7a54e8e6affc1f4335a6cfffb3cadfb099c2ae28dabd5d31bc43e75815d1d82bc8c0df138c0e44ddccc692a2148c3c21a16dc61f1ca429fbdf145b78bdbccbc896cc8c89eb022af7fcd4b1da6d9a453cd63090e7ff877ba89afc8eb34234adac7dbca81f978bbd35330bada2260df9946808f798f2c1060cacb44b8b008f6ad32dab6e401e45d05f178c9c61ab579bd62d1814bb5d6be64126efe2105d9dd41f2f5c3dd192b5f9ee98c766e773686e27ec844ccc3e487cd4a36837fc0a80828c29e35b562e2fea052448df6e30e3c7d21cd1b0d1f20a9a9d1e621602dd845eed274dfe415e45a02c65e16d70ece03d84997ba6197e6b072faaedd99e05a00a4e13407860f70eb634aebd84094796772489652e5b67753e5bb6e97db8a8b83b100a06b2e54dec8a774c573b21d7908e7884ba4a16aff965b3a2c3155ce3d222b1152b9407daf376b209742c1fdf43bd50e1eef36664e62454dacbd5a6c88035048079ab11a8ec9828086122d55b7d308e33bdb0e86346a984535c8af12aa5aaee244490ebdf611c5ecda6f8ac472e51082e91b8720a98120fa4448c28522f25f9f8f16936587e0aa1ae98531629cbfdba0ce265c4792d59f8d6f8f1cf8ff85bcfa7d20e8503dd16f455f00215a8a4fec69adf1367b221b6d2c65bf099af23dcd9173eb25fcf6b6f9c61458e4f9cc6e77b17a95526fcd9642d8033ec55b921852e85930b67b182c3d5f8384491e118eb77e656a05d403dfd97b33907f3f845fe9407b1faf22e878008bf47a4eb6d90cbc43d4ef877721a20d14fb6ac0b5de924c748ee6b2008e53d54dba0f5e19cca5a623ff8f8b0abe373682f17c4f7776da357e0cff6fd0d49002af23878ecabbe3cb71c1bbc94ef31162d42bdb44db3300211823a0fe552d6c14525bacf5e9a7a18dd65c97d3ec4a4314670b9219b1f86b5622a61805e410676044420113320ff1c5052b600dad4099ea84b6b3819e0e288257549cb82437b19c3164f74a0aa76808414e89cab9923931a969f46ece70ba7f639c5fbd9b734dcee9aafb08c006941f8de6e1994e45a57248c73a596e7aa91d821c4727887445818538a6d9b769cc6de45f254973d36ea2a5883407d61b7fce865822bb12d01227dcd27fb90523d41a157e83b55fec73ba9e5521389b9507c1910c64af15726f9f3adbba102d73804b7f6390667cc19f7626ac2f2d78d623144fc509e9b8597df76514fcd8f4976bc31c1f72e9b91a4e53106fe16c9115ea4f5c6c95e59a6e8fc31114e96486bb35314109a40f15679709b97c572a3809fb8d8f2901a04dd8ff013b625196fbc5ffe67961b1339b5a83ca84618ece0d1d1ad589bec99a4366dd3b8b651a0bcb43296ef384de503f64f389db91bec9721517f688270bfabd5b2a5e9e39e1fa4a9d3bb3910f52e3d0b4274129f5bd0acb5480ea7e36708160a57f45b90dffa50cbb666bc8aff3f5131c96d10b5dbd8717a3cab217285a4ce5f7c90de9459ac8d1abbf8fdadeef1d34d673454d160c6941e1c5ab0bdd47b0d75094d822030ed903b4b132db66fb3d051610600553835c193d31653878ecb0d73e63def4eb1a024ecb7bbbe5422754907d1407a88a6469a4184e53b9b3b9b88eaf4b95322097651e44c8e051ec51471a9b3aaa44551ff08d0578fb8be06de2dcaf17c4d6655e0c0870b6efdb4be30977a6c64467b61d8b281a8e5a851412b0f49ab983c4bce4aa01a6f380c98ad7515f0f59cff9349500fa21e8dc07e3b94212296d3cb282c0065307a1d93f69a36357166d126c028200f936466f31145d449f765d576a4427fae99847ccb8c8da27c6a595eca4737e2a53d9e7d864ae4e409ad9b3a8ed5abcde79adbfee59f7dd3b211c8868299ae509a5ab4b0c95191e2c43b7fa443660d1d8b044bce494594bb81ed57f60aebba07917cdaa3bde043e8be6e909ba41838c3e828c747fab20f58416f0740836f7e554535e07cdd895e442573049f42c8dec7ccb0fa7c56d3ab1cf288c80926971784d1ff6093910f4b63051da5249c349bdf61049011c0dcd1e259d5cf8391d645374cef273da1c3bafcded9b319da3917d43250b1829762e4e157c97e4a1fc097c0d49eff4e4cb9125ad86ebb9cd1da1a8e0f54edf4acd9558ef94c1e296abdce2b6dcddd0f9141107e86a9b6ccab491edc3655879127d1d41867d100fe4e7e3e659bc064187c58fd04e0d02db1c2abfbd66d68b370bc612cd0bd2f3a206f5012308043342c433b795f646e148e972851d1f81ad9da816a70fd48064d042ceff6571fcbb44afc9e6e9fad4e6bd9f13a8087461923360e80cd805201fc3fcfab83570e8632b6312cd9dc673c5661040b01370e3549ed3c7a2a1a7612444f647b11861f20f275b5d9f2699a9ec1be5753fb32eafe62b7ffd0d19d29c9bdac74597527a096a55463d239a22a588f84da76beef8e75da5be00d77bc2344fdae5c2a3fc21344db5c1a1cbbc032088d60287363bb76e97739c02e7b4383442c858be0cbf6f5e7cee7778858ab294c766fd520f432c5200f222403cdde85634e9680537e3d70aa0599301bac782419f0e502f2e790cdb891bad4ef75ba4a1e55b07625b0df6d1296af9bf6c0cccae359cf295452800b29b58dbff5ee8cebe88621464320c31f2336254e95d47e1cf69d82d950f14dcc285fcd49e9230cd6617bace23923b1c186a06fa538ca92429b8b291963291cada7cd4f8d0e780f27d5f768d407ad253a8b62fcddb79e654afa615da8310e84a0b45bc797023bc11886a7ecac26ab91d39a14d3e429584a248f3eed76c33a9ba0ad600f6459c4d757509b51fb0f52465d615433729fa3b694e697a4c0ea7b2dbd0248dbca5dd95b7734d0d62ec9d06c788f159be129f85a079f9fa2a388aa881e7c743f992332b418987cf76c32e32d5beff8425721d8e69393aad18ee6256b566b31c567314bca4c2611494c64a3bcc894e279eb7b80e15bb13f11d4607afadad4a13fc12b998e3c0e447f0cb53702efeaf6fdb308db9c5451f6335530c4b0c737c621a43b8141b456aaf232098f4135c0c4f74ff62592f96f51522a1f52dfa35d9292efdbe1f5c4acb30b42418a5dbe00e2d46aa57aa5ad133b2fd1bc3ed9d0bc131826474e196ba0e8a2d85d242d673bcd920903b07bceab37eb61c4a8317f7a2e5e45200f3483f1f3eba3f5daafa7715362c8f1cec502bc252efd3dad88f424cc1660efaec5ea688e4d3734f4694d4fcfe3d1e1aa209643b86de7048e1841cc5d85aa5a6626666e90b0ef1e8da181c66eb8e1cf212f391bc06de34883c0edf33e02d1da314b60b89c30f8253225d2ae56a5f83f8f8bb881e9632ffd14e84598b21a825c39c2c8164a612ae5034fc6097ac73279a9fb325cb6c204930b699e3a9f461d5e725bf2b28442bda53dc670f5bb4453fbcc564ac9c8d4a8e128161e8ad7523103c1ea25cd4d59371aaa2913f050e626b07b877121c4338d965163ae4f1690a13ca204c4eb24e0776d91e006302883615e21810b03d38893fd8232b3d212a745c2209e1a4a8132327a629b51e56af099cb0d0f279dc52d5310f9cb6ecb03b0a5f3a9a88b1651c68a9e653fd35f0a7200ac4e8a186a5db1707b4b03295bb95d51e53ab89c414a733b7d0874d7a48bc25dbef1cf8d3f0dc6ff79f596499e4b4c0c136fc0944930c262649cab94277b74bdebe802d2950f32b6a11bbc83e5baa394e1b39cd51202d1302e8439","title":"104. 二叉树的最大深度","link":"https://leetcode-cn.com/problems/maximum-depth-of-binary-tree","question_id":104,"issue_number":16},"14":{"day":14,"pres":["递归","层序遍历","前中序确定一棵树"],"tags":["DFS","BFS","树"],"whys":null,"difficulty":"- 简单","description":"```\n给定两个二叉树,编写一个函数来检验它们是否相同。\n\n如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。\n\n示例 1:\n\n输入: 1 1\n / \\ / \\\n 2 3 2 3\n\n [1,2,3], [1,2,3]\n\n输出: true\n示例 2:\n\n输入: 1 1\n / \\\n 2 2\n\n [1,2], [1,null,2]\n\n输出: false\n示例 3:\n\n输入: 1 1\n / \\ / \\\n 2 1 1 2\n\n [1,2,1], [1,1,2]\n\n输出: false\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2294143385f274563c504b5b7c0856b8952d7fe710b3f0987cab7ab5e61db7220ad3962513d4f02ff460b3e5f06ee02c656797d1cce04630c3a88cd0496d32e132ecfee24fdeb279c2492a7dc6e71462eb2f52dfd66e0b173415e7914e7d8fbc2e6a780a7a3aa062684d198357e0f19d2228507ca3dcd861edf62dd964d247147f8b115412dc22738abdaea2845c60177a0d16a1f066227e4ff9907f1c5e03aad6db7a021c618f10e86f51f7121b528b6d11dac80d03d0c72e37c1202b18fe1f9c356b640b668ebd77c0313b7391b1aef51097fc70e0a12645ab98a3c5d24d4167aed0f22e102e25900f32152f4763c541db99ce3a962d21517a8e41393cc5acea169c6f8026d4fbb247b0ff0b9e136ef7e60a8590a03aa233533b975768eab83e59e5f60293a616b5d813fb68f35772e0fb28601365daf5639ab1e900fce7aa88d0ca949c1f97568e8a4f5c6ad783f2f375b88f976bf79efb661255e7eb34c5c61baf421fddb4bc3cbb02a7801c7baf2f445571dbfb5b50fe4429da65639e465dcdf2e049cbec4f7b876f3d2c58b2e923471642b067aece795fa2bc9c6daaeeebb9f679b57c6a625ff40d70fee29179fac78aa0286e5e9c3c7355676f350bcc6faa97f5c2fab836d2e027104fd844d1500c0698f9288192e4602e112b90beb28a14bcde398bfe19e845f6c66dc6c4552c645eab6fc9048d42fab0e5eb162b82c3cdc33b44d67610cfc89df7bbe178b0e3d19590bbc65b6ee423fefeb97d40401d17825182248039097f27ebd398e2db96733f5b1f7efea9bdd8eb5de9e4e31bd958898130e453708aec3306a6965a71bbc40c7269140e0528a4647ef9996d11797f027a780fa8b416b48deeb0d0829bac0f09b4111333e0d0e333874b781dddc4e670c1628d2286176dc165542201d72475df4cd7ae26450a638c1a6d3e960c1c03e44b454ed828c453a881ed434da3559c83e63f92376790fc6be6223803f88df09e50c1b55958d5f84449bf0b06ef53cfd29cab452de795a2ee8500de2a1b0aff66b8c895b954769d7061a317e9c39915169439a010ac1636a255b2aa3c4b102f9203e9917b030569b5980dbecd00967b5239e570c5d904a42ad20ab8abe9df96460e31a5904d0f9ce44a3b5b232927d4937b1d5dbff0a32a6f4298709c8893f597780ef5358bf2188e7b81666c47633f264475b95c8d4f530b55f9135b29348fc93819a843ff20f6668ce478d7612a8d3d97a2490dc92437169ebdd345541e42c8d2961c795b757f3467385d65a11451c95de15080372f671fe41e4814c860feb85a726e5539b48f1619a070f91d3c8426d0eff7cdd575f3cab3f2fcfb0d40c74af098b88bb318922053da51187330de7ecdfec8c5c6645cfeaf34c3826cf388d56d015be4bb518e7351d7a1f982e4c1160e401ef941a0126acb1fa7616ff2ef81240defd161cc3f9591513156d05114b0647192f371348fb3472d3b66c9d2e3e095faf6118466293d0ba8da479b627913b7b10f80640687928d08ee5b5917c0448fe10fe9186ed5b28c168feddeb642abf4716c516bedf905e34030d4240b47d35d46833866492f91d529f163637f1e591ddf95effb51a18882707b1cf252da16afaea38305518a7a0497663d586464155685db759ea0b51433043082ed5fc1874d63541e21dabab37488bc4b1192fe59ab406b5a01f98d6fbc6b7f9e5190ce11cf231c6e00af1e81329ac8932d78b797f01fa5e8d2b88d4266af12cf38e38b808c0b5434d9437c3d970ebea8ee6e6c9388734385d001aba9ee245089254f214f62ae3f73ae4c3c5e373d5c0639639a6565b33ff526016103bd82d23350502e49b0c7fe537674eb88098e37f16fbf4b549b8eeeba8abba604e4d88715c36af3689b67985c06f5eff0adf3f571098354ebd7a71df6d5f7178fbe037ecf5db82d76d60249cf32839ab8607dc56c4999d4ddc2c826bd29ab57f315c7e01c36ceb245015e898de4e162a84b9329a3022f2db62e2e3a22cf34cf88c635ccb1d26cdbb85627dc60b776c3abf1570be1340e0865b24dc3cb0f20b02f9512f52db19c22a5d213fbd7a6c3c033e2b7f7d5a4a7f349681b01caf174659d744d065e38f0a092e20cb1d187f1aef633ceddb59fd297fcdb629d1d9e1196ecf20f7b0d97e745459def353be90a8eda19b4000e394a41e7dd977fe51fb70957a2a0b771d9928abbf8fee4d8a020e23e021db012d31fa86c823d253618766a06bbd1f30e06c4e0eb198a9f8265198a4512bd212a744b8b2bdd7111834926896038a82b59fbb7fc5a4f52783d1fe7b641a3cb21568abe0516a013cc67246d632656a115b9fa6aa3e9e5990bfe4ebd752b50967d9160a07ae9645ec50f2f69cfb5af2dd66be29bf2c338ff7dec9a153941bf5be927083d5bc6622aa893657b9ffea8d454dd1f919014177b3f138562c4c33a26d41521af901389b4717052439ca6b346d07278fcee990d4c4cd78f093936b345f76893c3afef2308e50cfd1847e881513eb751b3a5e238521ac81e2e8155585532b31cd7eed00e146dc354561d450c736491cb4c2ef09561c79ccf089842cc53bc8939f5f07aa3081af9b88997e44490a383e53024c5eac858acbcf23ac4a07719eb4fb35b29c0e5096137f72900e800e077346c7b0245257fe8607c1027a6f831f9c2ccb3be8f3eb9cac0b58eae0927fea0d384e933f5525d14a15664ca1e5615aaac940fc5a1714054b4edfc29ee88126462c9da765b42ff750a9d2f450a2b395e55b385f3bd30e53c3a91de8b32503325752e4c805c90b51173abdfb9ba1092320d89afb9c4d2dd86564c399fc1621b10fdfa38c57bab5a6ced4a224d7cd5d7ca8eec7bddaf70c4388065c46dfa34d4546c75150bf5f0fff405d03029ad9838d5ff7373282ea437949e05f53a494e9a2ad64022ced3e4c5256f119eb60f305dd1509abaecb09ae621240d5b2f2680a897c2b82b2bf6199b0f0bf8b8b8a34762d5c3889ada92dcc98e8c34972cb17eff0fa2e516720d9cea80c999e581349bc32c287264c2ef5a841b4ed838a921e863eb8f6b9bf352813a1bde948261c1d9a7c1332e1c9156fd1d81a37dd67ddf7dfae423bd913fc0c0a384f9d4c6a5aa8328defe5a819a869fa2028008b7b4854c9bbdab3555e70f275e4e8b3e42821441d3a28ebb7df717ebeb4d827b96e7fcea62f9bb689693b11c38d6a133bf08b5e61558353d4257a8746f420235a431ae815d554b0b41da4a98d08b89f6e73656ccea04b79cd34f728b11d6ddf84680924a2f1b4058ad749266d2987b15c844c39c83ba1e969bc7cba44d6409a33c19b1a8c8d8dbc9cd7bb11b289b0511b982cb1cc7ad17da785609e499cdcda9e91e6bbe565dc368a0dc83c877960e1fa897af833fa4d3265f3d64f2e16460dbb464f644246c89ade8f9d34f17f32a42c2e868cd8d4c5acc0bbb7b1b7a2091c065443e4f9e47e09963e5c2affc8e017de339e96916d7b426043b79151464cf5d60385e601d0a282244dac52151cafb46dec7803e24b20043187b60a3ff0c35cbfd0cfc963e9fb0536b97a424898347196d30189bb680531cfc719ae7cf5a70d43bb663698d893520137310151c72785e1da532376b423719051f503e40cf5766f576b6dda877dfde93b70a53ab6eb2d472abe7c88d9d6f86bbe772456021f4d9ed183b97339300728f84da76b180870ac855a07750c80605d2e1057225b9341acd5d1c4f97c9384bf413633e469f65fe737c9078115d834716c6cff49be8ebedc7e7548854ad49576048c13fff46cc2b1f67364b81d1e6240ccda6056e626eb50d861c0af5374619ede544fa838e82dbf4b494a70ddf0f40993480c90d7de1ce1062611f49267af44ef80317070af0b67c6101306a212d0761b08997a15fb53c732d20c1fab180081d731ac627c0a1070b41df3ea4d46feb80504ed6d1222b1734957aaf647c2dd0dfe79cf9adea61060cb21ffbd298f21c6cfa3c4a8565268b6f334a1b4adbf663e2fae8394e6a124ded3726a6ce219417350376e0287221e01493ab68ce888639eb0eea36de11400b110f370f859bd8b33cb36c80786cd18784f589533f4a557040790e1e98ae40e3c22f09906291fdcb2810b23e3fc3f246a93b29af59d6e913584661017e30d99495ad79e5b82c8244cd44aa8c47eae0773dbbb579d86f7e5138671e20e89bc9b5d052a8ca8526a7affdcb9798603d27053ce347b41c4d9e1eb5d8218ee67c29584ef3539d0948f1fedba1ed23ece522291b7741a0004084d006e8999b68777caf039108f821b1db283908cdcd598ca86707769227ec3214e3bc93b7aeed110bfb4c36511c4f655c174cd6e48003bc39ef467860bd7ba689273b09dfbf19d0d08e22d783dbadacd4a3dba0d44f132f7716cc950f009d6bc497342981780ea6d8712a7646060c369bcd343f07f8fa8aaa5f6560cfcbcfe412b93d0312802b8be51ecd0660e98acae9538e4e130eff6d5a8f384b514f3a209643ba73e506b8108957a1441120fefae1a27232961ae9f396a13280929b03764c0c8b15c223f0c7b6960946b1f3988a870d5b59e5486e12b836f2035b64d6b7ecece01372cbaa86110e7fc58956392f408c8fd7baee0460c7045f2baf27e0f64b1db6a475b07b009765ca4fe9e5ffd3414b7220d8e82dcab63673d78342850cff67657b55778fc0e50ab7414fb26e6ef812c0be95897ad9d535825cc650fb5d85a33b9756208ef37ca384646bba258f5141b77ee2c10f6f91f4f975f3e3e71cd6fb5371597578b76a4ff6308c51c326a5c36cd1f7988dc95fc64f7a4905caa9b3203ad58ca74c0cda148e616f7338020cdc826c6e47e7c9165124513debdc4a99aae62ef6838aaac3823fb1912ed36e169cb03b501b205e110c3a068a77615379bfe91a57a4101a87478cdeabafa87f7de99a04d2941e6b16aa9e872118169c1675ab893f69ef475f541c642e4534483086cd7cbadd4978dd190ccccee58a96a34194834b126a75cf680813e600aeb1c4e349d212cd4d59aa73ecb93a84c7bd5bc2f1ca2776036b9a155a3d1a38791279a7674fbc17df10455e0be8abdddd5a1a6e3550bf322311b4d20ffa9f30dcad3359de64220f09411c33036346c0bcbc54e21d884141f23ccec57a82da9489eda54a4ab080e4c60c5431d5f6f5dc37709b861c54d55943528cce08b670b91f6ad1e4c013f20a6b2d8342d6d17de15adc957564e3bbeaa7f59cfd0e1e43a615e4a59ac50c7912bbb74671c434bfa68f8ad194bc9f91cd220e3b751a9d64c29f3c962f1cafd6503701b55291cdebf8f56286898d215c0bdb0fb07b59e15017e7cbb26dddbcaa7fb824359aa7ca068c9b5901c7ee59bfc0202c03b3b0ec25206c7c245e9ef62676da4800ea2d22bbfbf46eb96cc554f34d15c0a8807c75ead401d3a8fe67ea78085869bd6dc48a90ae44f4061a60a122121ee169637f3889a96981524619b7e2a081dbecaa375f346b0ce85299b0296c255ef326536a2b9cb029f432cdd2014b4e92ee09e2c6ad1fb16eee0e633c43714ec08865d8b5bbeade5324464ce6bd1c3df04455ccc674c283b85337c8506e9a83b4d6d737bbb0618bd52b3deeff418457be7c9f03969489395c4b704e7c45c16a87a82761aa167f22bc552674689472f3c1da86d0d473f1fa1b8f31ebd70c660ab0d7e7824c1608610f885cb9df9a285e594c66232eedb65030c2d858a481e00d721d98044f3387c77da2f881075c02a765cd37d015fdfe503b899ba5c90924e5bdc3c1811a11e5d1b38726e6360c13ef8d51d4cba0961fbf426e25bad00519115156e8feccd873ef069deb72bd503942328ed7bdd6580d41691b376844c5d43a924c59911601d03a3068ac0d0f6a09bf407a86d499cf7b03491647661e2c1413edca30f485b8761e00cca768c4634b0061dcdee892801ddb6096bd8b128d651c33df12312428f218991a891d4ac666219c1cedda0f3d7b05d49431c63eca2268b17a4ca0318e18c4cd5fd0373f0d0f393c265766f50be36cbc088c6e367338ca5836c95908c449cac7a4776451b6b9c9f78eae4cd123e582ec44c836833cbe38212e7ee9b8b8888269ba71819117866106a5f3369c458ba8bd5e271433b8033a19e1464bf604a09369fa532ca828e3db4f4534becb87efab3014fed42fb56ad2b0cb0e27b7ce995d6f35edf994ac65eadcb50d14d951650d0805ef7e1d89af5aba52872fd40cbd41a93546f32e7f8ef8acfcb9c2a056a6bf199bbc549d46ee490ae48a4d92467937816c870ba4324a3492750deb2e466e7503076329e5637937bd8aab8ec336ef507bbf069b727b7a70b7366a083d8c0093fa4d562d250b4a88c2546b1f8c285170d6e620a43c9731551c43cf451e1932e1b35a216357bffbfc9965fca33166ff1ec912f1ff367a15e911d1509106121e96ee0f4caf983581cb07b75324224e3ec089555820a3c69937e87e361b5fa144909ad5671f641d8c67d839a260ddfbb5db29b2b0e7316be2498a58c11c119e8ded2d6e0538df9413159dbcd7ef22ff9eaad754c1bc8c7ad561e0e7148cb585c5c2c5d40070b8034073b7b6fe260085aee970f92e257745c6966fe65a9eed6165ac47fff8909849ef5f1b6fd297e3f3058f4e7cfd6c7c25bb8a8dd8acad2244364bd1898f352317a934f8c53f90afc20ccbcc039829df3aff5178e66bb721daaa3da107a6c2688131f301e58bf2feadfe5e827d328cb8e1715fdd4ca9e969ab9e1faf05f6e3585746ed28eb63118d9cfa6c9d8b69dae537d18493d9cfbb3a8a1aac6db3080bce000ea2b36f7c44fcdc8482bea876f0cdf5abfe1882bf670c502bfead3ec6eaf651b2cbd4f8b9102304ab82bdf6468079897316355b3e4640333e591b05a0bccc4417e7a416628875e3e162c1dc539fa1ed817fd3ba1d19cc481def89a07d249e295ab45235c3125dae2b33a715768a89c0f5e9e1464b4ae8ca988af9f124ddcfa119a5f4708a35017205ed8475aaff72fa8778f7ec477101517cea954da0b0f6f6803efa805260bdd4281a9c1f05be688d66f6cc624877f784f81573dafdcfb3ddf95757ef5c359f897aab8a1fa501e79752a96cc909ae1c1138cae19b1caacb8caedd889a30c183f6f721decfd395528dbc43662aeed59a13176bb9c6c5327d2f5db1944f7222329504c2a197c76a266f2f30c69a659c394ed831cd2be78b6beb8b95219582d788aed23c00b0af7ca91e2d201e18f76314cb4309f18a90d517ab839c7a28ee3406f58ea8f26e8386ad5d28786a4d0c681599367634585d52103b2a30c9a7a3f1ec4ef54913ea3e4f0d8a91fcdf3b005fcec72cc50debfb34e683592076f5155f248a4d8a52a5002e26f104d8144731ffda74707de4e6f9886aa36d2faf6f02e465cc501c27db810525f1a1e990e936a7c0a0a5c78c8ea7696106b11e02a53e007e796f83b30205c7e8bad7ccedcc734f6e14a95f9e6b639ad64ecf83078cfc6ec56acc38b0ebc708ec7bb42bccaba9451d5426412d397b633a3d857719c8a66c3378ce995c6a26894d4f49a4e573a509d328f386420ef97a9676629b4fde54160a92e22829d833f62628c58103f9c7d3a59c982ec9b77dbffba00e6d59874927aa8cee66ac3999c15b78d6a0613250dfc4ef0b7352dbb446df9cb92e0569d63c5d6360619e0c41063310e90dc9b035652442ca528f0a4e4c67019e52ab4875360ea85173131fc8171f0d3a3d01c046b5944caa5e154285fcb0041e777b6f4cba8388e78cfb6d296ffffaad33e129a7301537997e00cc27cab330640e049bb9fbac6d5ada25aab93c7fb9f973b9d5f70f7ec09bc2885e1aa7b0eea0a734389c552b2bb5a9e8a8703abc71267bc948b0a9b928335e47ea8e8bf0df33803a8a7f5dab15c7bf109e536dbc26e64037365bf2afc30da50ba6ffba3671960f07336fea0515a482f44619c6d6f8ed2b0561ccbe81cf7f1844120296cf12ef0283a86dbda8f212a8d402d30fe762f5acdb7bb1dca583f70afe17f44b798101871f4712cb7a8f4f687ce6f7de9264b064577f5fc7a28d4bfc3dbbf0af425944bca996c2cafc05fce3ae8da6c36823a137eb976f3ab8140e50dcb34974f10edcbac1708c08e7ad0d9c50894647d845643c52d90b3bcff365a39276928f37e5ec8ae3fcb00dce573de228dacf1ea79efcf161ca70244c1f3573aa10ec9521df0aa714538f0303613633948fa2edbab7b28427dd51320843de241a7d9105331924969f9e456c4fa18f2b40543722b430f52cd17a3fb182bb2ed080a86b815d19ed2b47d019f9e623a0a83adb72b45bee8ce499509e9d65f77558e8e04f045a8f54e4ae767ed9889ecd008f3e37b0a38b6149ba1a51c74ec2cc039a10595f3846617591d4a1d9cce9fa5377137db70d000065b80abc1fd87ef7b54d8d4aba2c803ec1a9cc7a86d10a7bf1b6e8bd626f20e7af7c7a64c1ad24662ee2adcce77ecf9774d1ae5c41d9d5e08684a2f62323aa75866b9b2845c06b522c18453ba1d90a4fcbad8aa2c03ea654550e67456709fd7a43396666083e726d887e73861bd4814cdeba2b92a5e41d7349918b0d7e77fb7a6bb3f3548a9bc3b3d554fd2f5d6e8044c677570c7fd5defedb901917651af1f8ab67043456e5ed402fbd767cc8304539b1fb9fc7e7e97cb49027db856f3a8e4dcb8a70dfa13110fb5b72e59bf0e968ef818eca07fa3a3333145001ac17659cf26e3df1470e5d70ff44516f065ede7164db110ecf8713c29273a89c7880d13f73a879fdb1eb3ba219bb7d0096d748a240fc9a8a3663460675eeb7249760ca9e0072de63f73d32ba82c5bda06063cd1b81ca3014196951040ad3040fc427c2dada7cf0d727f2908291682dcc3448b215c58aa25e75aa679a40cacf12e60863da448b66479d1b87f3d8d6226db4ad49dfad14595488afdc96dccbeba7ee9a8b9b9f4b679f2d11c01682d97eebc4ca0823d4371ea4072ad765457b9596925043bfce4a6672d90045a45d048461de7776aa0486ef94cd21da7bb5e734172daa0e8c5e1c2f8b6288dc078391c96b137be8bba0fb49b8e949ed2759e5a446c102927fdcb533591d7031507b6e13c2fa621da48e51d26fe0af6ff2605f10531855ff19c47e9aece125585d089b959703b129cbdfaa97cd388ef1ee3fbe8648333ede30562c32292c5598103be29ccbf8f885ffafc8f6d3db3a511aa564d57afc6a0b08cea23e43539ddf793a0d7fec972664b7f364f1ce15a83cc8ad61ef987c57d5f6609a0394ab4e4b6d4bf3d8724a250e7e3fd655ab6d4ab464e78ab42b8d480d11826d32df4edf6e6c8b089b90c89fb0ddb0328b779dfa65d108cee82cb24856e3a849ac006cb257a19d52fea16e211a0e2acafc47a85c4e09c53024400d6e2821f0c2a1ed39b5bf15cf5704bcb3a5aa91478b7a9263336f682688cb0c79d5546f95550a3edcb431975e06a4d2731243541371293f5d8a623e6fd17a7e3f44cc4b5d626a0a1d574daef8ac038247eae1df28fb71cd740a885feb9f58e4e3981850f10aceb6d4537a5e06989952ae03d95194de55065a778bbb59777d64d0855c30bc569b04eb0bca3678ef8f78e244e030fa85baeb63787bc583a4146dae55541e633f8be044caab08fdeac5f4da5b6a2cd8d94698bae282ec9c10eea206eed04304dc08831bfc19aab4187b6b6b5343eb24a18196b15692acb373d17eb658dfc6b43e33a56c810bf28087cb56bbb1dba7a04ce12229ba30511086a8c1636649f4393391dfe9d7f5ba836a2bd34cfccde830274daed648c4baba043811e88b5ce6b55637abfd11f7d22b1f8c2c17fa81d61e8f365ef6752bc8f38c8c2f1a9f584a5754847b721c047950782403084352671ecb708cbab3b2e94d21715da38991bf538ce60e24c78f22d4f2d3f5dc8cb656206024c860413a7c4ce51a97311cbc0d0aeb8b851eb5544a48bb568d6ba94ab0ddd30d2be09edc8dc74a35061dc663cd2dc03b86e0e2b20bcb838751dd460ff31c0e22515e9bc7c242fb1d1281e6d92bc0cd3126fbcd72f712a13427995d6ff3a345bc326b745827c60663a6826c48ad625992f8f22aa96cb7403422702578a1f1099791a04353498a0ce44861d8048c63d5b31b2f747dea9cb73cbcfa2766b4d936083873d5f4ac1197c063f6222b05c9c178b20b41935d175ead17ce1967901e9072fcf407dc921b4ca55f463d7278d5389bf81c52b3a81812202935c312068fec12e61f0147c8421b984d75f96938d1530a3d0e0f17cecdce549f4b877bd138ff136ba3f5f0e7e195ef360b30b3d971df80819bbbcf738fe5f07d548c5e01025d26cae9bb16b0334ea8c5fa5b4162ebf55e42c7b097e01439be2ed8d812767111bb263d9081db7302382f628ad48d338434d485d4fcacb87f9db5315c2cf5b47b4b2ca07b91eab318313a72f32803d07589094a1172d4da52e1f5465111e75e44447bc7db7a434ab4965da29b571101c15175767ff2f968d24e1c3918c6b745f01ff817b63e37e75e6cf73d8f17fbb3f2e765c350ba910e47037ab070c5e37ae325392e71b844a68c4a55497478d1bac3a468063e547dc9641ca7784acc1df03d3f06a9ccb2fe069df061d097c25279ef40730a56a48177b4f8c1c5e4cdac99e02910e18ccd66cbfff3291d0c49a7276984ed80711867939cec3a393beaf156f8562fae9dd6b6dad1de377f186809129aa53daf2454848f6d322bb33a21e8c0ab33c81cfc08ef1cff2473cc9a4d2641a99fddef74cfcf9445b420ff6d1f73d69ae88155bcbb99a241f19c44b81646bc3960aa25de8da444bed6638c0b1b8db86db264596820051c38558ede265a47185ca38b93a1efabb5d284026d9602058518579722b4c90176496a31975f6c25e095351fc32b2236d8149e9c9a01e78cd4915426a80492427f480381104d2e5acdbf82cfbcdd050ad1bfbf7c9a55b38e0ff76e6bd6930c96341c4268d83b07cf78c97ab9beab0fcb081c59650b060a17a4fc64e837ac1456cd1334f104e67165db1aba167fb704d74c95d1d6429daaa324ed43ebfc38a750c5ae91ceffe4752ff3c70623193ac0e6021ae1f75be3a26f5b4d0730747454970f698d99808e1c5cbe830432c54c3b5723017f7e09016823a884d489f27e16589a9b113161b9b98a79844b9337c4e4abb9cbcab044d08e91f49ba87e9d5e2ab222d46db3bd9067c712b49b215725093c964ee2ecbd88b9c2703b99437eb2c7ef81ad3734ce1af11b4bcdb2f053ddf955768694fcfa4e827f2d43346582865032e9f1c81deb3e9dad931a38c762f94227affd168206af70c4fb36edde760f4df2e04759b7031b6b0cbfc1787a26b6859ac461899779b84b1cf474dc1ac3ee4e9e336f03ee0cc16831e571070267e3010e05ae31da243fdd6e7fc089e166af6c8b575206573373adcdbb3cfb0051019239ce7163882448a02cec54bffa92d437e269974e1e0b46631107ecec08f0004d6645d92e43c37ade23bdaf045e79dff4e89b21c8bfd7855b485ca2e160dd35dac2011a1e3dc399604de1b966e3ee8442d259458977e5c9b048d151b2f77073f2dda58a8d9bd82a7e056910bb3311d991a47441d73a6a9efebd1ba01b14f3c649c646e61bc743e6d466e664a7e2f9ee675d319f79c8e8fb40cec2c7131521ca0e1bde6f693b6f4ea1320f54d006364f8ba558391fe6ea03a2c1e3d4f95cde706b821910dbdf61293295d3aa075080799d4856e663f2ecc1eaf503440291c1ff6fd995d4bda5ef13e3ae3c8c3c53757420292c33553794ae9bc4346cfac3182b86a2ec261cd0184c4a1f70ec64f879cf4ae2d7157d95ce337b1b3d76be0518c9fc3d3cb1f4eeb29579721201ad6e8851412d7f27a699ef57503dc33c5e77a77e865478ef8308a1b7b4909695b4aa5c739934be98ee5a41d2664863de096abc5619ce7212efb5c36b9f5e78568ccd22aaa57921cd19d6407d82f46358e27221ccad7ead3d5c7ae34cfc58935cb5d6f33b2f204c5fdd47423982869fea80bcce491bd901dcc02ada68b5a37e76dbd8483ecaa9f1790fd7ed97876842d6a7366655628a19f5d0cce788a57f08f60454db985e9ccdeef601beb91dafc119ba8caa24817e39452d596226ba5e5e28dda9f86b58965ad973a9f55b6c1bba5071be2840f4201a75dfc4f4b2148d81b2b632ea5d3bfd5fe05d5551c2f5f5f958b5a743d6d229b28927ef3ed3e6ec77d2c46ec8704cef3e088d504400a6629b074031d8b723a1719452efecd7491fe65d801755f61b9a8caa3bdc8638b6ec73d4aa0f688ce816264da86db3c2235cc479eaa06daf029c22be15d8b4861a0f930a8377907328d91c56e1dfa70d34045a16b6638bdae53455da031107c9e64f4cb1adbfdd09da6efd259ab3f13a0634e3921359599cedb25ca8ede2a9f7f1a4ec74a5fc9c099f7e7af2cb58036f5444db8199ac1fb30c6d2c8c99dde834b19884bcee6bff1a2868068d579066747483047c938a04ada10f2abb902cfc6b60636254828197453d90753093bbd82ae19e46e1a93b9bb6f325bb797a5a2ad00ba8d9d77e73072acacd15bdc231493945ea048c52e714ad9509d4b13d0b3ae3e73cd5d3e9e4d4d6d46934e6b7137f22e06dca3a611e589eb820d302bb1f5f1254841bb7fbb76b9635dfd1d6fab8fdfcaef8b3d12325ced0fdd200630a7e9028d53f1ba583ebd31925c76e87f6586a1007016a9a84fba08d5c9c833acbe0cc65b4180338a4281152a172bd1cebf1076e5543ce7bec89e163cbb3398a9e49095078288da40f8f7c560a6535665c7062709d04888bb9d14ab834615450dd70867bd73633b9215f82e4af429a91cf2d744e184f6b0cc7581e4979f07560e4cef816fe9be3c84daccc0eea1be8495796c61420fc0674c7b9ac86e64f368d98bf04e492b5cee509b9ac31154549cadc4901578441969f5bd16964f7debc84f5edc15c687c476c8dcd14c2e7a9f3f5dc5cbe00e90015f6d3cec3974c5d8d778a80dfbc0c550592ad4f9d6387a973717bd726f6387037db7d8da22683e08dc4f2faa11e0a593a813dc2f31038e8514a6f43c61793baef3d515a77e7ac9b70b5d5fc365bc7635f90dc9139966a8f1899745991b60bdf52cfd7f14c9b2ad55dd90a466cebfb44e54553aeda93c12ca4dfbdef1a977614b00c196f39e18258aa88e4a8e7b4c012298c007ca7583b1ff5d17647d62c165a4d66c19885f0d847c521d4e77b2ed0cfee02111863fe30d4950a7c5c90e5cca7cd9a1365858f4a8483a57dcbff4d06a6d1c1d5669814c4f9729bb98e6b5546e53270e88514ca8fa4357d0a45979b730bbe9492e9b099817c00bb33908271c424cb01404686e3919d04bb1a5fed470890b17bb14919d78a42dec7c2671c587b3abd0302df8bc6516dbf6b648c9ac5447a784d5c9b1a0417218904621a61df9eb2e1e390b8cacddace307b7fab4374cb03f92fe712a0572783b4b73bff0a133fc020cb7ec211ae3c4bc350b6caf2fe8e079a4f08910d200591727a791870d0fd85466e46fece504ef01b05a710a04d74f6f6dd678cef6e7d7d9a181c75b317fbba60c3edd62bf447c1a778fcef9fbfc1d9b52ddd73eeb36f88921f1f3f4a9c6ddc50d0075fed17f12c0f6a6fc111567f0bed5118953d73b094cb06fae1ca1e4191c0b4ff39d6a608233b6581ba6503644a32cf93a71a76fcb20e76bfedc075b4964ea59614665ed3559935ab058e9747e3c4ccbb84259b40883844849330648798423bf819922c6ec1cd6b8384b50014b57e2a68de2becaea8238329311f64c13eee32561e6fd10d4a8b81faf2d19229860711c28482d0e3f9cd9fd7f5cec73d408a56cd2ff34082918a0d2ee52d6ef22629a3c8b864a8cad7e9015b91153cd3c35d6465dbbf88940ad1629d81fe10","title":"100. 相同的树","link":"https://leetcode-cn.com/problems/same-tree/","question_id":100,"issue_number":17},"15":{"day":15,"pres":["DFS","BFS","前序遍历"],"tags":["树","BFS","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。\n\n例如,从根到叶子节点路径 1->2->3 代表数字 123。\n\n计算从根到叶子节点生成的所有数字之和。\n\n说明: 叶子节点是指没有子节点的节点。\n\n示例 1:\n\n输入: [1,2,3]\n 1\n / \\\n 2 3\n输出: 25\n解释:\n从根到叶子节点路径 1->2 代表数字 12.\n从根到叶子节点路径 1->3 代表数字 13.\n因此,数字总和 = 12 + 13 = 25.\n示例 2:\n\n输入: [4,9,0,5,1]\n 4\n / \\\n 9 0\n / \\\n5 1\n输出: 1026\n解释:\n从根到叶子节点路径 4->9->5 代表数字 495.\n从根到叶子节点路径 4->9->1 代表数字 491.\n从根到叶子节点路径 4->0 代表数字 40.\n因此,数字总和 = 495 + 491 + 40 = 1026.\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f22961d3385f35e6c3f607e596e3c5597b2276efef2331a0b8a62ef1a79d776d08b1e7eafe53d32f01344dae2e935e02d302ad4d8c4f61d20cda18cd05e7179e7728bdbb11e9136b520c3f4ecbf98546fdd066ea1d63a267c0b7aabd785b36bdb462c2959bcaa14a4f1cbf60cdf2996ba455d5b0e3d67f148fc3d88943afd2b4d6beb6e6f476ea8a50310afb99a5e7f2b74350aa0cb59227e4ff48a671f7d07a1d2fa79331361981ee4637ef615175baf5dfd4877c855cf906a36805e1473931bc2504e2f92880b768e258794b40addebd65eddf9dd0d37ab44b0904c4c55eaa9824144618fc4f1cb22acf58d4dd7ee0edb9a0775f30c477f5c0cc452b7d15d1c2c61ba10fd39939daf2de5d25d14bee12b0ae6c2bade458840151bf0287ea7c82c339ddc6cce8563e3c476896899127081950107507e95ac50efcae25e81ccf8d1f1b4eea448d176ead7681030d857674a51b8df07e532286b6a1d5aefcc16c5e61ba1600e330552ba7bb1a5b3357b8e03454045d7c97353c6712bcf686d897857cffaee76e0ed72418b76152c5898e81c501642b0649efc7c7ca05f3c05f1cb8dfbcf3aef68213c41b44a52a38fb11096f1ed07b263729c3d6f706b603e0aca416c064919543def5a53253568d45df351020e98c4334e1f5ab674274d2220b2ae37bcf2178ac020e879c6c47ecec44a166669bf62c33a857ccfb2f9ed180db6c0effd3863d57437eac890e8b9d757b1cad69798b3c65b6ee423f1f5b77f6645e575138e07988d2a0a7228cc0e3a7b1d2efcf9f7a9b86c287b64429864543a9b7b9f2b18f75ef7b8204efba44355fad391eecbf6fcd0ec8428b57e54d351f3a2bcc887607867b9b804b89e819ad08288863423b411133ce0acc94896556a11ceaac0b85fd13394101f61c00d54c04eca5e17d2cce76ae9b999a63f184134973d21c67be1a7ceb271d50fc5937886d307558d8ee92d92f3fc1334ea6ee48d821700479e41d3bb739c4e568dc926ceae7f9660445926f5996737654c1cc849a5de944966a9c58baa54b206f3a9229f2f6423fa9b2339b103a23cf362c47835c5888c8354b6792fe7b88d9c6211b300b037bca2de8a2bd74ed004ff6b8c4cf3abe9df96460e314702443f9c061c162d4309b8cee86f1144b3e0af2e6353e55a9c8893f5834324f53584f264a47b817f6c4863530ca6f5b65cf165490b29d30271e1aa3c0c9f83b251ee30e461a62cff54a89c2727bd74f8890fa4aed3362d16eab9cac36a162dc3b2f9ecb7d8f9f1d2cdb37d76fd8c72fd509071e69c6ade8c8138da7b75ad58504f2fba607b2fc92bf74346a97e9ae64b2255c5f2c0a3f0c3d0efda484aff9e7d0511cf2a808865f7f6e5b3d356e8fce5d8c67344393aa31702fcf38bdb6d0257e7937061f6c4112c80eafca64c1ef3fc6dcd668c086bb662e8f0d801dc1b65a9d707bc02e5db5c958463ccf8e66a37ecf13c5ba1da1c2a643fe8adbaf9c798e87821d3edb2b97a41e15feecbcb1708ca09c6c2023b549e5d8ac3bdaa2ec2cbec4aa9ab8da9e47688a6b68a08ffd71ef1f5af6f25a52ccafa5ae6a8994c97fce2576829709889a251a6047986b6836e5d1b3ee53f2a47d3e3da8c7da270a3e419140b4f9d7618ba651b5267771156bae277a9b4bb19190525b5e75dc98b4b71572c1adc919174a8874b108efe5e9d4d465b0ef1bb618f717c9c6b90fd1ece103d6d2d831c930699c4a02d53927a47bba4dfefb88e5468962fcd2bf18a87ad03600ed56d64328414bea8ee6e4cb0846b4283ce15a5a4d62b4b8c26612d86bd6e6659ae721a5e3f0b542e1dce5ca4a0ea148f4e22264282e7b12e0e2d0e3fc6c8aa2c7a22ac838767865d45958dff3e46ada2cde4bc6043428a39ce64f171924fbb5d11cce5dcbb5e3c1a53af8f6f29401aedfa50841eb408547a895ca38117edd32afe33021e9f954feacf763b0e4706c62bbb67de02c0535bf7bc324b3b5a1fc78d766b8038946da54782c08235342eb6f128f21c6c42be697458f13520cc27cd293f95553738b6a01cfd8afbba28e5055cd7d71bc74b9250aec9f96ef2d813646625044092c89d3f5a6d2928e1fce0c15851d5ba08d50d75523880f9c6aa43ad871c3850d272cbc9371854f48cab48ea5dc711f5a3b61cfbd869cd2b438ea70b3a8619a1c75db8597d2a484bc783d273ab56b70157a1eae363bcdc8ab3a8f2e489a969ff140a1cab1b9c43a03cd0242d634b69782ce0fbf30e06c4b2ae0499cdc4644a950a40b63f676016f52bdb2a3b821b3b836060e43710b4d5a8534f09023349a6fa41bed63c56dbb05304b95eca6a136d2d731be84ccaaa37e696b78e01b94abe2738578e6abb31ae36ac220acc0f296fe5b5fd688277e3a6a8a47d8b2fa9df1d694fb038ae6f5c315b976c78a5927e27c49be78050d87989cd6a5b3b316ce212979763799a0d219e901898a3450c534fd5edc06c933e39afbd997e4746d1d3123937fd62e93ada84a3fe6908e20ac35900ade4137bf959b2afe12a5304ce4562fc1c37105cfc58cfc88d44242df74639724102616098a80e74b5cd04a2909562d2039a1296a37ab9f86ff04626e2f48cc3ec459aa39680642494f0b20deef0bb79c4e9394deb0efd5a77be9a5b2f37832b00ef66a93434253556457663e30e671231e3fa62bee49eb8b4b571ac95eae7c1e15d2efefbf984e933f5001840f4406c99704516b6bdb20fd5a86a6a54b4edae6cbadd407827cd8172540ebe264486544b5c6a75033ed7c1f3ee75f92f7694c4bb734b3918636b4dce5f968d0670babdf6af5bde250492f2b585d5d7d20545348a9b221349bcb77db129ee1f64f402785674d2d7c693a075c1b37bc065891dc179ef4cb0250723540b96bfbbb1ca05cc0bd59737c1bb7e602f50e766c8cd18a0054a02c9789f5d2381dcc0976c28599ae3506114dc0594b9aafc848d6f2444085c67cdede390fd6e62cc18de4178b7b0bcf0436edfb7cbcf9ff793df84c331907aab18e425a2e516720d9ca3c6c991b5817bc397372f7033e8e95c844a4ec525a932972fa7866bc9b606d42c138dc8827bcb96838d7668489d56b15c9bb17dd42dce70e7ef6dba923c9492a9c5e4ddc092aacd7d92b25381c8878da4589c47bea1c74d97e1c96159e743660d1a8b7d04930c11d6f49db832a204bdfb0fdd21f0eefcb827f0c467f2d3b71d5eaf9471c140faa8153b7a79071fc70a7a500c65b448dec0745579104ad616819189ccf6fc6856dce40abb94c6142b8d4384d1ee358f904b1e472f1ea567d075c88c33359601d7fc9eb71cc4e5cdd08e4d6409e72475ecfd9dd1d5c0b32ead630bde2a18f1c7893ff7c7549a3b0659ceda818cfae95b54b7145ed66def8f83cb77c55b5de4deec9915a4d3751a336db3e1216fdcc738bb6f1f7089c2e38d810a529d650687e23bd8cd0a20cc07b95d003e789bae7b037b3e9e04acd830b6c295f5c25c79aa6bba737282f86a542b6e5312319a410e700e22160d376647cbdb6e5d98ec5dc4c1d43e04b210436d1e24e6f60c38d5b403b2ca74b5ad4e6bd9f168c5d3570e2b365addb488004eb36bc3abc05f768f289c312cd9dc676e133551594f372a321deb7d636b103110510d006c0486027aee3aeaa7fc25dfd895b75b53b673b29a6ea1abd6969b66d4a6ed721e7e2ab2cbac15269628f74f268fd69539b7cb8116dd53f43d5d841510cbb3566f66bd6b04911c415f91c43850e82f767d55aa7b913674c0750f11c60142cacfa5c4b3f3fdd3fd5dcc14f8414c7c74d47cf677d83a566f2513cd83a5635589aa0e3f3d3fa810cf021fb0256c12eda102f4a181d6be8afa86ae60bd51465cf3785db0d5244586a7c2b9ddd785aa4a8468560ee64720b5d695f5ee8cb9ff9720415f6e87496b14770187aa721cb4d1fccc42ff678b03788524eb2611c40610b4c63c39b6a3c8a76ea9388d9149dd8c75580d3110b786da4cc84e221227ceaa66dd64ea6d22c73ffc85e2c27e7da76a6cc2714ee8df9968e3de2e3a8519dadecebe29a4868fca7dc5fa610b420efc71a123de35d4e6ac696a7b588f9b4539817bfb0f5246466a54666d90e0f8d1b6c3ec95b42968f86c4bdadb579a5c6a08d1922e8ffa2f2ddd1591e138e8134a97ccbfa393f0d75f622a41cc717cb441c556ff6d60ac620fe1b44e5f21d8acd0d5ff83dca93c245c4633dd677043c3296945445228e6a9c9d0f958f67bc3b409c26a5c86042efa889de677c76ed0db2301073149e5634aba92b9b2e70581884e1eec28137fe0fc8271922da478d4418257b2a96723c2006dc8ccf45aaa7bdde472184837511a80af4ccaedbda8b4b8909dc410685ce01d946eae8da773982c44bdfea55e62bc7f1650e646793f2a143833122f3bb79aa8a3d62105a1ccef79acf1304dcb5640fdd313744c308f93da31b86801a37f42f1f741390fc8afaae954df1e4a62a062d3d1be4da130b2b0aeac64eb32097bb04d32d12628394a84c507efbb7fe709a101844cb847173c3b262621bdcd51d543781907de332e9404734c0c9115c822ffd989950141b8d38b4b47b4d4fe71a6dcbc7fae30ad8fda39247e277f6117cddc11ca760045cc545dbbd6470340ba4ef9900042468e4062ebbe252ed1c94dfa1829f936fa302c2035669dd7b6ce5e2088012cdbfd1d6e8744ff4bd4e71144119f8f64dfe91b4d1781ae1a970a4f7952b84d58ff1eb32bd523af1e6ff251fa860d3a922f4c81e165874290ef71816309cbfe52541752c190a48c2b18de8481ff8b36beed0ea468e22dba1d4692203847745fae25df878aa1641875f4ea6e1f0ca0b145875f83e68696cdc12917bbbfd43214b1e7e7d3f6124dbb116f408c9ffc10402712eb5f35a006eef04b23c9fdded4e2d4818ac17c96fdc4b83f2feafc5be29a798a435f071d77e791412bc049549d95bc204352bcc3c70cdc960d1182ac059881f185a1b4f1b0bdda1039e03a2dbbd54ca6c9220750765e29be6d14bae4f9992ea5dae473d64f2f2b0def7c8b48a08403992c39fb560317b7400b0784aff9e87cde93b2cdb8bbf2d042adcd4bed13a1ef9ba67b6e3b1499b2854c15d738204a5a498c3d1f91f6c4a29031e6f4eb839493e8af8ccc0452ba627bc4684a1b8e7dc2b523d6929892acc56c6c85e6acac62541cdfeae47fee9cf4e03e0fbf131078cac646b068a315248a9d955e9c5f266f9455d18c7de015cedd396c8ca0c0ebb0c8fd00610ea655ce9f81ef5e3c0aabb10832c53486a6c2e5c08f8bb5ace577676f3c1c9564839e00983650ccd8285b44e3179e90fac1e2588693c63d68549344b7667af00f4981a9be30b9f9f27c9c282f9aeba349d987701cc5c750e7c929004de7a3cf257b0f3a2456ddef314e9f5000fe1840b2e8ff65ed39c52e934b3f83fdd21076f3c34db9eaf776a4765c0d60ad2deec390b244e5161c59b63a5714ae69757464f7e172dc314d12f8ada9abd3a0ef635f7d2754bc42c1e5326c245ef326536a2b9cb029ee75fc8c650c1adaf509ab84e016b976915c6d70067e5cc9803fbbe6c8ab93164a0908e0e00d66ee6d56ce8d6ee2b4f1333b8b4669c6b9b0cc9271d9da38f6d7227ee0874fc812f8289107928cc741124b360f30168471e3ed7f35c60e0367f05b76626e8e16f5c2cdc4fdea7cd8f306a331a592543266a8aba2ce2d185834158654f2c99d16155d406d0a01adcb0556879e0ca881a35820328800042daffb7c8bf8850f574aee6c9548821babbf5f6ed1f7f18f4c638785dfee8f4e5ea2d7a2d124cb3f417ca3ef5f849ef3de17b252641d93c316103f244fc0a3c89576ee5893fa6ea874281d6ce8b5c69f2503137d767f3c4ddefe3adb5773991710c03c6b76a74b0f385afc5b5198abe1877c044d0a5a20507777409e8b7db1ebf732085dcfe8279c0204557d9dccecbc9237804a96bdc254d0471d7d905674456bfb16f55e911742831928d2029f8e63782d12dddb4e9470ca6c7adf3f2dfd06930596c644c1201316766c7160573bdf19e678c370a82f2e7d7cec767cdad7d87e7efd9ae4796154a59aede283a304a82396c2af11ce3a9827ec2d0b6031adfd89dddd38ee32cf971d970355ace258c14686a9aa6c2f6667fd081b12e0614ba24def892fbe4d67a67ea2974f5829a3ba9ce5ba306a84d02bbc0d86ded33a67a6dbf6225a6ca4b195a721ead3b3071a863f23041b11a3393fc3f831e901875c9b40e815b12f4dbc4171c1beeafdae8cf250ba9851cdd320cf03ab4159a1c642d012297ed455d553e14c1e5afd790dba34461a274615452fed63703fb1c5fe89d93cad0302da4bcb26227279be7f772273c35493ab4d1763610b04c7df1a6f05f5610b35d6fb20f569d264101242c34b0e4375faed0874267dbffbfc9965fca33169f64c8755ecb1337a13bb0c9f0fde060a04a0ee5c05f5dd2e81820cbc5a242b216a95db1b5846e28aca72c27e361b5fa130c2dfc118503d58cf6bc127e73e89e3afd02ff9faf22f72eb49f813963f3b9e8ded2d6e0538dfc5011580bc94a027f5dbe1c048dcfc9331d770b1af4c848081f487efd20670fb56127de5a8f12718c0b3a561b73a277f4c97df5fcc5a9eed6165ac47fff8909849a1105f2ac397fea001d34031b26f652dfdd58592d3ff2c127707caa38f352317a97ab7817a82afdf0c9ade0d954ca576ba172cee629d21daaa3da107a6c268c877f340e0deeebfa5fe09d82b72ddb8ae3913df0aedf751a5c85ee31fdce3585746ed28eb63118d9cfa6c9dc83cdaae2fc19089d7ffbb3ad942862ee65a05984142a2b96f6d54b092c295faf678eec1f4b7a45fc3ee7c681f6fbbbc308aafb005becb9ab7fd55320af9cbfaef47ef2ccc7d59731d7b1448706b0b590ca3ae8a410c9fed512adc67e3fc628f9317dab3e3cd3ac8c43b19820759aa9bae2f6dd9610e9e5235c35b1bae2370f24778d889c1bdb5af08024aeada9292e1f87f89cfa957eaa070c670472617e49e5faaff72fa8778b4b9157f53183ba2c143a4b4eea3cf70b9b34122b8d04e1a961f14ae688666b59930466cf8c3b80f32d8bcd1e1b0b10346e65c4b9f8134e4de1ff748a0df06bb65d372fb59447dc4aedd5aef9984ed88da9462da81eaf67a8be5b5d41edef969662aeed59a13176bb9c6981834695dfdd109263328bf04c2fcbdc76a266f2f30c69a38b6134e8920c36ab7db2ef78ac938828a83caf2b5272ab0af7ca943077d3432b76a12e13b30ef968c8b439283ff356cab2e2cdfcee8b23edaacae5d1d2c22451271049e3d3066575548446b235880e9e2a3b54ea11b56af3e010b88d4beb07e540e98ac7f960d9fa971a3ed166433ef3f5c248a1c985ca0153863c03f99164b23d4b7750938a8a0f5883ce22132bf6302e1668a56480edc9b5233dbf3a0d7a162baaeefeb8285948d6a6106e00c0ce46e503b646ec7a74514cef0a8c3e6bb8d3f656d14a95fcc2e37cf84009c88049ef273912cd976e9ebc502fe2fcf3ae681e9055d7e0c2b6c3c7f2f1f7c937b44aad82c6e38d6914d6358e042425ba4b600990aca29ee804340b87a9676629b5bce505a1084af0433da3df63535cd9b15c6c092e0ba8524d8a50999eca0254c52860c7ea6818434a032a394353dd6f168320bf5c4bd4e2052c6b45684c9fc7b4075a26e18770e33da0d1a573700a451a6b028656a079d52e3120e467215b755bc14617a49ee1e550316c13d1f0d3a3d488646bd9304fe0f500c81aad60418717b3e4ca79e88a9d9b76f6f2be8b3af27ff32e2645a628d6b7a837786f67630060df8fffba43d5ac738aaf76933f5b069e59be94b26d3d7c99b464c84b0bce5f3616ad2556d6af9faadb35a3aed7f672b990dfebce46528540de0c681f0cb6fdc65d01908ee1fd6af1bd01c78ac6de5447570149eea9105f402bdd5903671960f4e756fa41d19a8c0e30f568fd3b7827e406f85ede4822f4c1d1a0b9fcf49c5538de93dededbc56a0dc4c9c3ff029e28bd377a0d0b58be90cef1df85b239a0b961f4714c57aca4e4b67ccf7de9264b064577f5fc7ebcb3fe037aa9eae495801e1a090cbd0b844afa7ff96acc22d63be3ce2d5357ae4765a4af6b34974f10edcbac170c54ee7a54bd502885714c553797251d40b6e8cff74e0dc7b928536eba7d6af98e541825e3da16794c912bd9eeba44b98357766357533ea3ac6f651e64cc45351834b7a1f766ec9ccbce8dcd1f1943a8e51773843dc354e29c34b7d17428ac3dc5b6058eef76540127627a921ee55843751e4cff96b82d3a01fd3511a836c45dc41aae062b9bd7fdb28835bbdc9a7d61eda937af03959e9e0451f5bd41ab6ad6367d88385f71ba53e37b0a38b6149ba4b04d34ec28532c61a5a7732502c39c686a3d9d98fbf15231a669d0d005131b65ae94c9076a5fa538c06f443a47187ef89288e824f71f0acace07b6766aea6774b4eebad24662ee2adcce729878f6dd1fb114ec7c7a8869bfae43379f0288862f86f0d9462490618453ba1d90a0685f98af18935b6111d4b385e2f1cf1720e622a3e6d703663da3734ce4fdd9a66deed63dbe9a11d7b47f2d148737af27a3099a111dece91fdd500af7a1875aa44c677230310cd9a9bdf95533d0136c5cdab194b2147f1813820b36237917b457afdbacc94e79a33f8c57392ca213ad536cfd162dcb87a03ca5b58e59bf0ab27a0cd8e8354897b7e7660020daf1f1980f86f16b31d071236fb4151407e1b9b1f2b9f5404cfd61ac2c959a89c7880d13f73e67ffff4ee75ee41e02963fded65ee46f187db276e5b0c1bd5940cdb6d868d156b9707f76960efc7de97a06063cd1b81ca305d5f6959545b9a175fff01e6be946fe8927becc1dad75251bb7241b24780def70c3baa21db0c998a09cc5549f0448b66479d4ad2b68d933e19e6e80cb1ab161c56d8e0c98694ce93eea9d2df929f104dce7854ce46d78a36e394c31323d43711ab2d2ad72b0a3fd09b8c535fbd884e3e3fc74958ad4d19847fc15d7caa4ac9abd1c03fdb72b0b05b1725ab5fd91b126ac632dc850f8a98c930137be7e5def519edba01e56916a1e14bdf24897dd18f7506727a311c3e2847acb52658a49351833aa5fc038a2f11445b114eff48913b94bcae7550545af7959f02ff668f9aa789817dc8d1bc7cfde80639349075097b27283f73835d7eb981c4a6ad8cb4a8dcb9d3c0761d2ba535803ff23a4458c6ab2569539ddf793a0d7fecc47329b7b13ff1885ba03c83e759e190227dd3f0609b51ddec061f0304b79d7b4a7e535430d97fab6d4ab464e78ab42bd0620d11826d329c0191670fef5dde8be29fb0ddb060ce23c8a82bd15bc68f37984856e3a814865d77987d84d238be8b442b10cbae673afa0a999dc900908a87ff9b647fb4a72133bde9ad150a9dd7335153037c9a08da55f986f7ebff629f33365589f842bbf4b77402e522938a791ce4dcae3a7c7137afab50a280f214a5f9f9f96e8ec7e4a596a75322a6b6a507a818af7203e07cc61ff0c276dc4d179d7e655784eaf565c6e7dd57e4d4a45e25f26bbe76962e7a93a5aee76820cf9aa1ea4348ddec44fd7be9688665b5a1051dfc7d8257a630383ceb2d78be752f6dacfb6df5f6651cbe1d2ad50243c4360b453514fc92fc5850f5124206137f01d553012cea9e470419b82fd2448f6f05cbe1b2dacb8901aa1142164c82387b6df373f6219c28464a95ef07f549be7c46325b91003f1e1b288a5f83bf64fa99e3763e2ffef09818b7df7055233e3d0159e7f637dd5a7f2eb0998d187a8e493e7cb3aed60f0599492393ba1b35bb0750ddd319d8b36866139c2f929b61fbef0d741413bff56db40a79308163b3986e04751d6c304d2658047de2041b035f366c88685a03f599c2f27ce4a611429abe67bbcc43db771f5c5f6caf7cfc3f222c091de3a23cab5ee7376e411046ef1181e0a27cf914bc18f059793f273be00a005a71a6e8de8936db2bc458fa125137550ba44947d8f3a39711d6b9b488c64592fe3d64cc95454f3b903331fb8d025fd5169e66b6e1e74c2b5d0e8452a1b6e8e9e268f0e03936a59347f4807c677fcd3ae84f8cab47061ee0655350e2880eacc69f45f84980d67ad150b1131b8ba6ced63e201cf9443bb0876b4187f7494b8bf3acc93e02af20a6c4","title":"129. 求根到叶子节点数字之和","link":"https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/","question_id":129,"issue_number":18},"16":{"day":16,"pres":null,"tags":["树","BFS","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个二叉树,在树的最后一行找到最左边的值。\n\n示例 1:\n\n输入:\n\n 2\n / \\\n 1 3\n\n输出:\n1\n \n\n示例 2:\n\n输入:\n\n 1\n / \\\n 2 3\n / / \\\n 4 5 6\n /\n 7\n\n输出:\n7\n \n\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2695173385f366503f605659512a54a08f2a64fcfd231c098867e6334038d12f1bd385394d9ef220ff2ba4e9f225f573696bd5d7cefe4633d0aa8b91587224ab7b8f9aa5419c3bad31c1eaeea0885f36821d73b09e633f300b6aaf9ea2d73d9504acde8f7a209760426df41dcbca1c028ced387b253063ea28b7019835d2285358e24a4c4b69b1a43c32acba95527b00762a36a3f543227e4ffb886e1f7c2da8feea78093d6eb527e3685df60f34589944fc7c4ec952ee9e6c0081540c72ad39cc454a2e978c094a91ca02207392bbafe9327a4df4243a6d0297e6ebdf7fa2c2f1adc9d0c1af82836edcdc80840916b86b362e5cfec539791451cfd1b7f65edbb425ff2593a837580382e4cf75f92f2fade563cdbef7aa2cba91c37a2b7d94c938259ceb65cc9d58e8c276894993134a949c1204515a97ad4bedcafa638ed3c5d1cca2ec8876dd6fe6d5590417f0d7acef13fd8f3b896a043c15342880cc79a3cb9e4d1a0b6d5a62d7fb397a318f76bf264568700549fb9464e8ec67e6a51ef79d51220dd57d38e9c243e4b7c208a69f417d4aed0ab039a93ff628b2925babfee37d7fef59ee2d395cb76f4e7c0d0bd53967288a02abd82fd0cde9a3f7b1cf54ea6c6b6e074630f14953f3aeeb1ccf5197b79e5d498b4e0e48aab7fbc5080a7a20a27b7ca05b5b8e2eef7501d65e01e580a3eb25aa699842de56626778163bb5c2f2c3e4e0629869c3240f383c1aca5f507e52487976d1e6cd0a3a7ae51963236818b9616dabde6234044bd94751606350cfb39394f53b392c1d5af7216b5bf544d84f219e20cad84f4d86c24030705ba5c4c9ceeed2f29eef1ec0b84539a8a1d7a99adab09d0472bf2a485420163e2843b28f7c8f8af45a7426e80a84cab3e49323c74fab748b4fa3cc17b0d8c04eca5328d8125505583d522660747761fa0271834796d5c0d60ad753bdaa33dbed6bd430a9fa3f549ef95554fb2f80bbd64a2d381ffc060ffd9f59748fd11fcf9e659b65705b09dc7be7513a4342b456ef8aa828fc1701341491d83bb7ef03d0524576b08f50a10dd83981fe46fd7a20cb8ea7a15b815125f6a383a3401da60078be2877542ae44ff4069540ae04f63420839ea2245720e3d6cbb47146298fc2a6cce2e457e0991eeaa2cf7e3907d4b4041254791badbc55f01a50d024d946c4f58cfafce3d4e47fe4021d13447d1bb9f9ee9616e3fd9712956689b832d4b01492377ec1f90f2aa7bf62e1a6b4561771828d9664137f2aa4dbfd3b300b33340527b32a2eb1f93ab500dcb9571fa211411fd926fbae5f144a066fe702b7fa28a932d4cf44a80b40f7e7d83b7f32555b241f6201c9df34693519529e77c89826be75366412fda4a1d40b56ac9f7c78ff4a0ccb375e30f3d6a2676da5e855521d069de7d2a94f27eff062e865870dac2ac4315b4c00ef08ee7d0dad4cc4651a2f0d0ab44b480991f76a5692973e75da5b6f79a29add737699c157e64e4c6014e08746fe354e607d7005817ab2466f0dc10153513b802fd4a009d506c83870639b7f5b7156c2731d774765884501831faaa470d28fb866dcb569baa7a3be630f4e9026ec8bdaddcc38187f459653550a93b49305931fb066247c6ac4de64988314efde9fa29cd4c17931e461487cbebdb6e0756d971054f8da92d2f3470d6ff8590490b86d758a4586bf908b5631a90987f27f8d1372b94bf8eec7e84c9c7798102e78af8a6ab4fd444648607d10bceb6bb146c93318566d9ab9ee10e9f28f68ad511a42abe1650e96cd441efc393b26e2f120f1cea5cfd914151a3e8eedd3eecdd7bcfdef7490f4669630c191a28d3e1c5ea097ebb68c00286cbbbef73d7c6fdf6f8261f3cbba69466f3f4e6d79993d040bf408ef7f8001a87c93fe38782c44620a99b44a9820334493255f28a5157b94f80ad04bbe9c3582af0cb9434b00de8343b7ad087b480145d83ec970fe06c545178aa32b4d271b13dcdf410486289a5aa57996b8cb727c7af6a456f24f390fe35e7448ea1f728974cd7d7182003601be980cfcb3ae9575bb304289b875880fd719fbc9da64f0945f3f51254a05ca9cf17a0c6c2360c3aeafd3265dd5f8449a72271c38d2bc95b169a2d9622d42dc58b2ec235736bbc2ab2bf833a80bdf89f60af4c174e72c499cfc2c68b01383dd4db41c33704846d9ca916eec189d4f02ece3a77dd0dcccfae6b686c6fd74f6596e58bf00a556e569c7692a7355616f06b2b4bc5a0fde98ae4ddfcdcc6518da1441fe746e254da168926077c60a20857b23a96b1db6cca91f475b023349a6fa41bed63c078ef50612e2529a314b23272e04a7099eb20de69db7dc4ef61eb36e265f8e349160fb73f96710e60f296fe5b5af2dd622b1e8b3c238c568fd971d744fa157e0670d641ec22971cbd42d2f96d4a8d45dc635cc8b6c12687f24af43c8d2272ce1165cc2891680845b5a1203dcf6ea6c933e39affbd62c037f82920e762ae821b02d9b8faee4225ce45694730aadf5037bf259e0e0ae7e5e1a98042eb6524f1041fc09c7a7851a003df8565f1d6d173f28b2cb4130f0d72e88d0d5229842cc53bc8970b3b97ff6145be1fd9fc3bf20d4a3cdaa642494f0e258acbcf23ac4a07719eb4fe25c29c1f5556e67d33e1be922a3226662374703713f8460325f73a6a831b690ccfdf1db3ee8d0a3f38eed5c75f0f29ac3a167ef2a1840f4042aca781759f9e9be0fc5a1714054b4edff39ff88052423c98465544af72b42cf7019152d3d0a1dd7c1f3ee75a97a34d8dfbd2748241f27394cdb26deb9141fd5b9f8bd5f11ebf1f78cf9c5dcd3c753485f9a836a1b30bcc432fd7cba562bf3442b2e3b9d83c6e3fc25938f79d829ce0ad621d350aa7b6a66061596f2fae1ca518a4dc28f78fdf4616d0445b767cbc55fee630602cf7ed64138cec58f9d492a478baf4d6114824bf2f5a3fcdff73a6608411f6784a3b790bb276dc629911e31f8b191e6513aa3f6968adaf4e7df8ec90bd168af54ad40edb11f7256b6a3c6c991b58129868a247d367a8da608845753c56bfc23f126a7d42e9de3549a6845c5ead03484c28dc1332e70d818b6588c89348d79c314b5a1288692378582ffc0ed858efdaad07ddcf70481a48a85bc158a64b8a69d03c0ae882e7fe70f275e4e8b7704c6594088b1c1b639b202b9f50c8033c1c4fcb827adee3ad893be132085b66dc608a8e605431f3d4205ed203a104c62a52b918518117b1c55ca07c69794a9fde36e0f95ed41f281ad46728d17d694ab35c1df0f5b004b49a577d56ededf2e418001c3c794fd0a97958bd887564e09a36133ec82e2989b89e75194240a9b6e17b393d17fedf0578a200610cec681dfb3e05b03f153039c28efc9a9935dc65b5de4deec9915a4d3265f7f2bc9ff216ce68861fe011e7188ade090814e17cc304389b227d1cd2a67cc1daa1d5d254f9bc0344d3e14b447e09963e5c2e6ba8e406be32cbd69459ff87a5d6f703f1262cf0c60254360535f646e148e97285198be12d9d09d3e6de01b4947146ef5be402ee1b44afc9e6e9fad4e6bd9f168c5d3134b301c1e9be7805201fc3fcfab830a248632b6786ad9d4292157705f150a7137741cb832793e0e32564152516b04dc166ce456bbdea82d9197d1f2551ff335e6933ccdab98d9cf6686e9a22610326ff49fac54219428b14e3dcbc1d424aa829b0b9a1abd2713831c0897a55d3e70ad3745df583c0ec29b304ce824677d51a270f3627ddb5f0f11c60142cacfa596f6a7a8dc995d8852ab491e333bdd58ba329e6e5a6f6646cdc6fb3616d7aa577a3c6bcd44c1545ea1063133ada5048d83b0e98111686ecd0db5450a1fe07d25f3936507c5a7baf6c3cd9eb70b9c29412d9c1262f99fd6efc48cebbac33c5d456e8546765847019caa3151c89d90d874fe01f42c74c701f76a208c697f9ac93836ef89dcbd6fbe65c4852ddddf201563645df592dd5a8c036c293adfe608c90aaf6770823ae7fcb78f7e60a77a77e8051cebcfb964f3d26b74c413cf8ddbec089ebeefd11490a8680b1924fc71f02dc72687a6a5696a7b588f803413817bfb0f52461478487a739bfbdad0e7cda985ce7d31f0650e9fd47dd909387b84df2e92fa6c788f54d5b229e5131099d8a2a389aa8917351b6bcc717cb4088356f76c32e36415bbf858502f9daacbd5afdfc0af326f06066fbf33794398036945445228e6facbd5b01fae7b88b212eb7a1c90272ea1a29de677952b848e714f1c1b49e5634ae7ccebf7a26b8a8a581cbe240979eeadc766c867f674cf47f90be48a7c09c2006dc888b209a22992ab26161a2f18029bf34480a3c5dbe1f59986ee106801ca1d942ae8deaf68916318f2abe75a67da3a5056a31b066d64146b665f3411eab0e8e3960b2fabc62afd016683bf5b9f8e3038e0e0ff9ec9dcb64f75e8afa33142356fdbf1a56a680870927f858c9e76ad473eeb57acea78632f648125a2adb23bf5f74ba0eb99e8aeef0aef7dc871c0169510c645d4f9d6f6fff5bc2c6907f30c7e440aef142e538de985bb05d04c8f3964767a9bc7774f314f28bcc1dd758cf6bf7cae52cbaeb547722f6a7fe6f9231998131d669b60f69b056ad2a689906adfa32aaef40b406bc2bd3e37d3f847fa150af014e6ff89bcd9de31d491fe5e11aa0332f1f43c608b7cfa40d1f515497f8286a580e471303dd2ea20df8a83bf1ba31113fc60e83db976837521dc0e8d9558659242fa202433ac1dc8fa23ea6f6c92f833312fb6687f1e4deb9f672e18f6851bb2ea1ba469c7e957a54bb11f3e63675e9b34d08a9aa250327cc7c76e2b2da3b175847c8ce5959dcfe91c16b8a4d73904b3c5c4d1dc054e8228637c82735b5c003142bf4f5f20f12b9d6b48bae18db4e8bdc99f9002aab85359fa75d6a127c6ee0c9c280b017612c6ce2f3a9f146dcb153ce7d8df111220e0793aca8a22af34878ce9934e0483f7b6b96f3dba4f2ee3a373c094255517671d4fbc0479b791809046f7cd8e2af52c5d256a8842dd12b4c35bba7f50c022531dd11f025bdba2939659b2ffa393f1ad828d42f5927ab07191a8f09b2f11305dcd83e2fcb91287838f1a55c8403bf8764ca1a92beee8e68dbfa5e7a481c42c6015b41c9d5e8f9379910b6bdc47744c191e73c08059092350d4dac154362c75e889176bd38a51ff87cb3356a77cf871dfa5166205bc78c3d78d19812340b012921575fca020686a05323e649688cb63e75d473067999edf2b4ca5b912ed2f6730673c295318445dc3c2ac9cf7f9a12e5b8b4ad19e4234c4c8f1278f470a340162ab6b1a52c2f4a676894b8f35f6491dff6622c1546266ed7ee5a7474b6f920613a0f956069b2f12fd8b90352c7c81e58a82edf1726ce8b65790d563d199313115ed75ae0dff4c97b71a3a68b4f62b00882b207dbe08fadab2a6038a2b17236bed0b8be49734ce8b9e37b4f5a0a56526dd1ac4e6dc752a3416426575e597fbcad46cc54d2ccca991e776c895c0d85a33d935f90510899b8b1f6f8f6e7f0ad12a8602b0dff5c2a1cb60224ebbe5cba893d2d18acf2314754266b3935d0399654c7ee89769dca77285824f0ed7a9927cbe936cf229792bc501ffb303fdb0b0ac413821450f5359c03462349d4b800b1562f6060c7168885de2ded084b1e973c2be7fc665f1dd195e23b3d5d48f614d1d3c0e8f1bae83c81f310f09660701a4861f24e3db5cfcc9a3452061c6780a7faaf960dfa4961d1b57f33e9952841babbf5f75f1dde09f082ed4ced8f3ce4819a9dab08b7e8a63534d89ef5fc0d8a0d645b3586847adcf071d27261f85f99bb71fbb0acfed73ba6e32142587e6ddb50f03136609317f1997b174925535c21e10c03c693aa6480b6c14f35b0bf1feb3892e044c42062813790f499ed057b1ebf7325b08d0ad78d450091b05939aadf0d437804a96bd811bc33e497dd30326216dfe10d11bda524ac6547cd447ccda1e26515791c064dd36ca6464a06d49e57cc74dc49d10d9330572606968337466ae73a638e95ac26e357d24eb7c68cb5044d954948ff65d6e45a793dc8bcfe257fb23e5dfa6179a6ed72ab9242f3670e1e6f3889f74a72ce5de53c30342bffc3ed75e96e2b47a614639b80e200fc0611ba44aa9c60cbe164da63ae4c4471b7cf1c59be9a83d22fc822dac31addfc6702ffe9599771f3193ecf1a236aa95d03908973300034826f06372d0c931a941c70cc26aab59a1295be97730c2adf8f1b3caa850b7861d95ad29d529814159a1c64fdb002952fe519b07b5237a78843c41fc3d5c302746420d66a1267064f5d8edc2de3cf04a4cbf16b1727b7a70b77f2c08208618d5a500563b1e474191d3183b18a6387b5ad6e620a478d277555a58c455290428b5884518633beb8dbdd530b9ab626af5588b5df7b0282e53a13b9f1fc5064304bcee5c09e3de3bd38e54b74e24224425c1d54d190ac88aca72c27e361b5fe501d69ac0304c714f8067c079e76fcce4bfd973a6dea2603ea741f108bc153b9e8da46b6e4b778bc5535acfe88e8a6eb3dbe9831d8ef2df749124b1b251849c91ec9ebd9a2a70b8034073b7e1b66f4cc0aef127f9232e6500db846bcc09dba1276be106a787dcdd1fe45c4500c397fef3549e402cb23c3060fdde85d1d5e86e02381994da8f282345e635e38f2cc3e3f50c9ade0dc8668f76ba172cee629d21daf978ed41a88f29d94ebf0df5cef0b1f4bb03c97d368c92e06c5f9303edac7ba5c85ee35b9ab0500509a27ce52f54cbc8f66cd1ce3fcdec638fd6ccd083fa76d95f866db3080bce000ee6f53c7416ffd696d8fded31ead0bee3e64cd4e72b42146faab51a8aafb005becb9ab7b9136102ab84b5ea1eaa6980593c355b3e4640333e590505b2bd8c0617e6a81d6cd235a6af48cfd357f099898c6cd4ee7256c6424380b1ee6f2d932058df78768f530efd2b40e85923de89c9bbe1f4231f4aa48f9790bcf869e297a94aeab06bec7047261789df0fb6963caec23fb2be4b184f0539add01fecf5efe28270e7e65d69b9916a5bcf5768ff389178fec579623eb184f00b69ccb1d4b99af84d12e61a02d1c556ab8a4bb805cc9a40ef13926ffb59194c98a4de72e58fc9ae8fc7d5649ac6f9887390cfb5d41edef920202ae687d55c436ba4dbc57c612511f4d15b63677ded4ac2b18ced6a266f2f30c69a65d87f1d81728c25e3d73eacd4b76dd0c48399a7f83c52f5fb29fb502d6d5f48f96d179f190df79acddf2781839c7a75c41e06f58ea8a421cac2ad193f3a6404286a15921c3122541a540b6e661680e9f7f1a00ba30c5fe3656544cc91b09a7d544d9dab2ccd43a4bf71e69e442038a059132dd136985ce4507e63bf40d0580277f98d290f2faafdd3886aa36d2faf6f02f009cc02556093d5173f92efbd90aa63f5ace5f382c08eba692d43b64940ef7f4b11372b8be14b428fbcec98b5e5823c0b2b1ae51a8a7a3b8cd152a3881e9db036cf408d76f4eb8947b87bac7fe689aa500f12497d29233a7d593f806a03e48a2c7275c58804684384554f53b9b66baf1c8e3fef9b604bf415da7f6bc0358b165a43d1e26a66977fb3672b84985edad3cae8ab9f39e0fa5fa8f2e92e6d59874721e7c0932fc37cf78e1f3dd6f168320bf5c4a24a2b52c6b405fb9b903e1630ee7532260e2eda495f06621886588cb028656a079d16a51008496d01b715aa552e6052ad090c41738d415a413326628646bdc4119d69482690f0bc2e32120b4e568db4c8e999f4717045eef3b835e067d42b0b37882c658227919960314c489bbce18e3d5ac738e3b93d33a7bc7cfeffa60f63ddd2c289121befe8c3a1b6313e9a55706ae9e187b35a3abc2769328d48f6b1a22904541df18780d9c87d8445d01908ee6a84f042db5b48bb26f66b763d58beeac34abb56b1d5d97825964b42633ba25b5db6e4b14611c787ada87e092985e5b6cd6018100447da891dc55edfa83ff2e7a61fb6864b9433e12eb099be3ff4dce3caa559aa17e94b289d02d2521b0dcb62ce592d228aa3d7b864b064577f5fc7a28d3fae78fe9ee0065a0da1a8b7c2d0ec4aac8fba9eb7e06c61a43dd8982861e6365c1f93e7446abd4b9aeecd70810bb7f103d509da034ede7264720795473bc9f565f0d735948773eda3d8ace6e85fd0177ae9339db157e9cbb9ea4bca70244c1f3573aa10ecd368d808c55341921e1d597368ddf9adf4a3becd9b348f477f1943df34177ede4c3a043cd696da52794fbcdd6e40037f75cd75ee06d17a3fb182e62e95ccfb2e814f75ed2301994baab22df6e976db3aef5bb58de2864a92932db67410b0cd4e155f8952ede86c188acd85e7008f3e37b0a38b6149ba1a51c45ed4995b940d50562919776599cae9a7c2a5bf15231a669d0d000065b80abc1f953fafca589d5fbb218e6c87abcc78daca5412bef8acb32e2a66b3a66750649c8724662ee2adcce77e92ec2194fb1912bc93a6c3d6e3fe3e71bf68c67db02059c02d046a5d036fd798461a8ea5fef0852a9d5e440e630a7300f77c426a780f47703663da3734ce0994d422bcf57fc6eaa9713652effd4c3222be0528fcf354d69cdeb2810caf6b116e8044c67757515588f486de840c6f0179d3cdf81f617013ffc73745a02d15b2202f3ad790c69e221e9e3e78d15750a7ff7dc15d618299e25820dc71b4520d391cb365492345e92bbee4f0af9efeed7019a0be2f9c22af8ef2e66bd0dc1b3a1b5f87b159d4b5086cbe0a63fb6f3ee14671a4b51da078114141af0461f4f42a0cb067c2575c6694bbc180d407614cf168d0d250e8108132ccf62b5f5397e860a75581474a819ae5cd90dfb20b838969f20c9c","title":"513. 找树左下角的值","link":"https://leetcode-cn.com/problems/find-bottom-left-tree-value/","question_id":513,"issue_number":19},"17":{"day":17,"pres":null,"tags":["树","BFS","DFS"],"whys":null,"difficulty":"- 困难","description":"```\n序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。\n\n请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。\n\n示例: \n\n你可以将以下二叉树:\n\n 1\n / \\\n 2 3\n / \\\n 4 5\n\n序列化为 \"[1,2,3,null,null,4,5]\"\n提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。\n\n说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f219d133385f155623c4f4e5a461d5782802779e1ff310f09844ded3747d754ca8a1d7aafff2638c00ca16c03974bf82a7e75888e8ebc0526c7b18a92597a7ae773c897ae01d124ab2acceba6a19e1631ca1b68b4972733344a7ea4d585b97bc5413b324bffc964e2ff897ae71bb26f1ed6bfb88c86dcf161ee334df928bb4e7a089d70273767224895b368eb8f051f29354b36cb8e784a035199cc47780211e487d40752230bf3028a3249bc4d1b2cd0689f0e46bc0ef2ea222fff211523fc35b4364479ccb8602b86a96b2907ce81cdb906e9ae5694f3293affbdca84e5240971fc8cce64661964cc32694a30e5b453c5dbaaf238ba1a224d648f461833d99ce90eab67a62ed8df8747a3db0b831169e4ff048a94a23081d0fb8053ec20adab7112c659ef050514ace9f041e658b3b90f5e8eccf2953541c85f0d897dd6aaff925626251013ae7e83a96eb0f85b446a9a3180df06cf323254670f7d0a7afa43299ea2472032364bb9579ea6a32a7bb133445555dbfb5b52d1782ad84262854454effae17dcbe149678678042051b9e41956165aa2658bd17743bcb28d4ca8daecbbe241b46d7c6372df0d71c2e19278fdfa94459e0710a14105490f321e40907ee9d2d4a18ead7d8ffe636b5bb21bc133712bcd8f29c0cbc51d722567cdb6f2e42edbb838c49d38893dc49710f6b72d200621a90fac15fa1acef882ce7260b6ab93ee680eec0d4eec81e1e3f99340cf9be2f5ed82b43c5772cda5faeb276d2e570756e42ecad0077e2208a64719255521b583c1c9d0716c3f7b24c1452d55961cf73f468b7c96df272a8a9f1f0af5b81c69caccc2d1ec98ed0cf4bb5726aba4e9abaff4bbbc0a9e3c7c026b785e1c4008a4cd2cb1d7ab6a176dff50d4dfd7733c2ffe7fa558a34e9fcd17b7d7ce49f8500adc135701b7bfe8e30a6b2d3cfc5718ae33cbc0a1b801b23abbc757e1853cec55245bfb0a9aae294cae6898fc8f524a4a3a955b1a9cf062f844497aa4ab2ac96017341c80fd7b522c5943936becb28d25e7140135229ce82cbffd0fd3745176909c5d8500d82ab7f246f97637e083888f569b632ef0a38e935012811d75853377570fe855d4069e4dae36ee382d989f94185402e7d4c69f734335626460483a5c56e28b99274466abc98a07c9581019301adee379b34f6a8a4bd42ca3f6e7a6eb9181d90f9815d599a5961694f0ee8e2b0fb8a86fca4ce648d34f44dafd4bfc09a7532ec83d2ba41d3c5a20538080808a415b42f1d39feefa8bee9f88f31facd44a53ff528a0c0f5735a25f04479c60bef81a57442a10b44aadb467ed64f08301ee5f49d2e7a45f3a6a01377549274dd2a54bffe7bed97984483ac233aae43019ac7136424410f2bd6c62f60a42837b5c79bf8edb5f39ca62f6e21325aa38b4844323d3f062eca37ee92ef60cb9a49dc5802323edf66ccd0fbf915f1d57c96614954872b6d37c0c9dbe7d0b3b66c9d2f3df9afeff1cae59280902a6f94fbd7abe9f5257a95292871ffedf218a347a5246d8467b6a8c05028e80f876af8cb7b511f2c417187f00abdc439a79619339702ff93f35a6650c4b4df2efb534fc13182b3146dbc4bac439da9ce8147d5a8e44a07d9be4f7a54817981544a02b5e6e341b1a25d2ce16e2b2e5652e787abda106cbdc1a452b5a2e99c48a33c386357b9f98ef3b40664501f5b5b3eb507eae6c9ef410cc30236c19921eaa0d9bd1922e7692784ca76c4760b8b5786bae1108836b8587910a5c03d55b4a3db219bda7c76e6c9b8466458bf82fab9bce2d708c2548254163acd0c3c41929217d242d770306ff780deb179f4d321e4192f1b32e202d2539c5f18d215d37ad81ac62917fa815183a9de7ae83eae09c6343280ee2678972d3543d942675faa54863523cdce52920a8ddc76bcd909b3ed0eb323c9270cc73449d5d558c5a91c4fd6116b05420d2d78ba2cd52e13de13dea5580ea416efcdbf3bc951322e8e967a87a972398342d26a3f19e5176dc4887a6a8be16123beada8f61e257cfb469e2a1c14d01d51c002151bf75dccb0203b3308012f0155d1fa2635fabf9fabcc1da3d0d35889f85d9bd691f6834a89b6333c45288b1cb904f65796ccc4b07cecfcd00c8b2b63a433ede8cab48b766c711f5a3b94ac8bb2dcd7d05ddaf6c42c35ccf8819f25301520704938fc63ae502a26542aca3c91253462576004521251fe4218e021f8245df05a52f8e2f2c7a552b2d53acb7ff1a0ad1cfac8e7f6fccad8763818c16e4bbb49619a41b848a46e1ce099cd73dd1c23427589fc1feed96c16260ed7b7995905b0197ce44dc56decbfdf2e0ee67835a1de37e3d7344c430a73df0ceac05cb35f5349a698da30a8f98a86439689969e505577613ce4d87191a93c58a489a6af5f0f4f43eaaf8501399a7524e0e17fd641fe6953e929ee9fc21ac5508cbac0390e554729174219ec0bdc674412fc025f8911f7903d8c68e2e1ee5febc33c332c73a056b1baa94009b16f2c31077c7e7489e7a6068f3ddd938a604dfc28db69864f85b606799b7e37ea6a99eabf2f2bb370ee987357b984c484fe716ee09f6344da3597c930a80d51c7d473f62847466601fabb838354dd2643a53ff5406b090718719abab36299eb28445d3e56b936ebe94d6b3a8e7e29437a597daba1e17f432340b4d571e937b15453a4d0eabe36523140448fc69ba326ab4446a9a213d1ab5a8ed5cc5c23e0411f7f78446badd402a26dc9220494bad2156d137111962261b58bbcdf3bc3ae62e3dc2a7f8731d7651276b09d90c83f9177ab39ffca84a9738058ea8fdc0cdccc30d722796807f356a96b77db129ee1f64bd053e573b8083c18997758fe6378c6c894fd365f352bb3e7c397e0b96bfbbb1ca4c8a0387d878d6e060257404b675858206b90c4056c777b50f6cce88cec5256f11cee34d355292138da7b9d6dfa76f2444085c67cdede390fd6e23820a901965bce1fdf0433cddf48f8d91aad2c1c28c6e9e2be653d50fa2e516720d9ca3c6c991b5812986c333737f7892ac12c0420d9077a723f869f38f41c9b606d46855dec0d03484c28dc1332e4d9f17ad4d8dab39d66e8a32e9b624af9527c9b6ff84a8d4dbb8aacd7d92b253c484908eed7ace08f1f5c91fdea6813555e70f275e4e8877cd3b98d547520768c43fad477edb79fe424e3a38b06272961d366199ef33219a39ce0c68dcf88ffaf8a129b897d8c2a528ff680581b2f8e3a09f20aeadc70a2232fffa0721e079f08746728d17d694ab35c1df0f5b49051de46acf3490c233468a11dededdf473decfced08e4d6409a061f550092708054d7beb17efe25ffefe395f5bff4d5a9235acc9c5621c293d3e2192dd5f81ce39882a1c2050fd64715de4deec9915a4d3741a2b7eefe36468c6945ea10c4143e6a8a0cdab209506c3c31841af2725899e328b73939191ea5363a989a2ae71e8515ecd750d7a1648a19c27bc5ea0e5003fd0f0abb096d5e26ec9c5b386eeed9afdf8d0163aeee9177b822d534e8fb57afac3abe6a50f49ca9d7b70d05a5be03368ebe31d6bc4007cba8ded87d1074b48cdb838a7456d2bbbe01dbe71b9811c6cc9ab83a495c5f5ffede6d80da2f4cbe0bbf083d284888462f9e11db83f0946e14261520dff943fe97a30852009011d56d9427102e389a4aa6e3069fcdf17840fc4e829477ad42b5a6a9a3f8d65a9e310e8cb5b4e97abbe6dfd9823d9fcf956759ccd3bcce6efbb2e9b0df1ce64b3b988039ded0e561a53680f6f0f139825e764d5b2fa9903b72aa358d6d5aac8dd563a2ba5f8126f95a1a8ca43448f0112b02ca9b47e20eb286a733bdbf4304967e25a8f82da11e8922b1abee151176f71081b0c56f51781a0c165eae83b44524f4acc2d1272b1889dab6c80fc87a0895347bb92081d7304c625e164c6a243c715a5c868e9956349e0df2d163734a07dab6c48c2506fe48cc8adea6106188e1ce9ff99f31f6ac63c8675caa91edd39792047e3fb61c7e92ee0ec6b2d4de81735a7fb31981a2f0044d72c493a0c97306ed4a2d18e5eb603ba53e87a2b3abde09c9c43348dd71ad53f97f883bcbfc4ab941a656f173a422853302979f8a99b3f4ad072cea4cd4170b9515aceb12d965f78813d84d3502175285f5e4586a4f9c16eb6de2dcf39f230f0842682cc294084193c17367a1c5c52577fc0efab99b102b5bcce28cbc3e783f0b1236a0d5b41dceb6980eb5bf8f08d31eb81694d1056bf3f89432ce88a8c8a8f5dec4af5b8b3b2ae05cece0cd922cb9b8378786d9501833dfe118237ba70a03509cd007f0b281049a2e10d12e3b99fb699ef1b3fe0401a6c1f785d5c2943d5f2ae0fb523ef44686aae4ea78d313b25c6bd0ed2d0ba2cdb96f3a08ec0a5ff963bc0756e4150b5936d6e9b3ab5bf4977ae085eb2bc3b3f370411517193bb771f6b9be0f2cd42361fceafa0e657f2354972a36adce671990d33a4a7ada841ea240a778b443fe1022c3b716955ae2be54cb5589c50cc78dd2b08595c256f728dbef7398fafb8c670b9e8d52f2f3d34cd4ff549b9f3ecea3f08ebf51b6529c7e1ff3dd8a2ef2fb45dc4acfe5a77346771f1fe201bd715096dd20df8d1552d86a6fe7c822e279b083ba93f29c6d6453aa6a769af79369065ca4fa9bcfed32012e3c7006e946471feab4678ea22e40b89d79be3fa5c470bedbf7f6c5ffe8ab8408a2810483b4e67d0d13c87d811be1446dcbd4620daa6f74f47e58e56e225988a0d8b2f59d081097e70bd172b0eeb43358fe0a69d19a3778a22f7f18f5b8aa59a2940584c1b3b91a9143fc6c7687713f9a80835a76b0c93430387b4fe92a8882b49c791b5661df39bf09eb62138ca330e278c2c116262869468fdf920d66b581e4be459dec9d8114c2806cc327c533cfaa00e3b24e9c808862ee9811258e0915e0cc04f589e90992c7842b1e8e90ff5800c2eb8ae05a180e280acb1fcb187e91223d83715a5d45da5c31927bce19ba66291880d573c3083240e00b428aeb4c4fd619f5ec7424ece65ffb030eacbf954d3e8975119552ed674563d547d680015a6705eb175cb166f5945bde7d89c401275236b81696d4af09d41bfb530dcee660bb22174040a64597d033003dca98450ba0b946c138c34c9c97d8bf0d7dcbfc90f1cf5ccd4895e007f8daed5e23763b0853a0af7170c16c9c073e341e3706a8acec013f20a6b2ed1c3192aeb37fa5f7baef23a0005205e5b61e5f1ec318752235d59e8f9e9792197f056c765270c00441a0170721da5f5d01655d3648bcc4fd76208cc9e02180baf5b9886fce4e84090d18c286c529e449e2167eb4906a7a9af64eef0d82bd46163dfebab0adb9d5515d6824df3af6c4e0ab3ebc62520253a24569ef626169f5745bb4c7df9eef579a1618301e6593f83fdd21030bc914db1a6b222a73f4e106abd7fee4c28218131c5869f51abb0c16fb99cf2830fa97bdc724650f16a6e37160f78a6d0e4ae8b5c853814a5c9af9b3ecdc7bee10d61e750a03453d7961ac8f503ab84a61bb124c4c9d998869dab0714e45e7a64ab56b9d9c1a20172fdf16798bc5d339e605853043bc8133bc8eff180927bd9cb61b0dc303dbfd508845abe6d9f4dd38c99251a05794b75458d6bade47161b74b1b6df810754c2fc614b6de9fc7b1be47a6fa1d8931a592543266f581a2876b184a3456c01dfa96c8085e4101640d11e198576687cc5aa89ca3166f359801716de6b634968bf94e1b4af36cd61dd015fdfe13279df7acc94c699ac68df2d4505be285dcdf728a735a56a3ef5f849ef3de17fc177049e2863407366f71dab4c59579ed03b7a827ef3c7c1477c2b5c69f250313205c7c3c884e58ff0597bb3bb49437f7a0884e0d9eb6ff3de1f41c62054c81da0a500e2350655d853b0eb40954dd325b0882e82c810247002f939aadf0894c8e0bc6ed871ac96515319c56664522ae0d9012ed520e8304289c47c7da0f3d7b5791c064d72598626bb07979a0319349ee831094725d1625393c7b7d66bc1fa66abf5ac373783b32da757498026ec454d7daa4392b15f3dbc7a1cfe257fb71e590e330c8369207a332646863fbf4f3889f74a771cfde53c30306f9af36940bc7ec3daf81d79a2b85dfff6386d235b00cdde330b58a1cda650bf99d8634cbdba0e5753ff0896ee8630c3f13eddf48a4b3771f6cb9b1dbe276eabffa4951c37b1e430915ef62798eeb13bb0d874e9b4ae85ce07108f80d76a4f8acb8fc84a01ff5cc58d6f920cf03ab020cf3c859d70161798105d51ccb760570d7790dba3446486212175f28a1743f78e4beeb8ccc53898ecc19c023fdbfe2da7ec2aecfc9679008288a97c2a7b38b030ef9fe8a3fefebd4197a8c618717f5cd86d722a08fd0f0245da7b18eca7a574a5edf586586b97cbe3e980069a2f4e47f8932d97d89868a102baac46b02994464ae71d395bf97c65d44a29cdf5d4c72fd06e69cd2e22382382b41c9b4bd8564ef2ed123bf26757621b91c5667dbbe61cc75c11db2fe361d2abcf5c1a4430d9eac463c0367d417dbaac24ecbf21ae400e02d0897286c1b2471c5fe010bc50b0827e3b1e57543cffeb628a926283d13ded47a850fd0a27421a20dafbf99b263698fe6ee5a28384bdb58e89d77959da9405c4d5e126f82f9f2d37b4032b7e78c2abd3720bd380b1a96351ba57fa323c07f8eba2afa30e76225f939a76f40df44bf5f8d0603782b457ee025edf3717a40d09829a72802c46073de20bf7ec97292e37bed65ddd912253ef4174ef72065e6191e5a5a6c5ce516c32a6d7588930b9fad6a2cd7bafc3f5d5a7c6619f4642c03241e924518c38bbdec7c3b9d4f142eca2271b09dfc2e4f02b19faeee41b0768623187c0b77054e6577095811b6bd991a50bba7016dd54dc939c719569964754b7cfe0e62d4b60dc3c22f54329547f36c0e59e6bd078af46ab3b961b9d143722e304909ccb7c16223791b5849e2165f6ecc4e67fc4ab4df86de6507903653b5760bbc6d408ef09894ce4652c17e313a0a1bf163298f842b17a0dc22a3c033d048da7e0bd8ecf63e393fc795416131320508cae14a9bff178164f511835b18b2109a1735c02368a194fe4a4653923a04100218203cf53b4d6a23fb574b2f11836d3cc0cbef6a715da3b1ac03620d9896aeff641e958af6b50cc16b0c5243cee1df89f77c3ead369b892bb904d0131eb9230a10dd186e215e0561f9b21c6ae11adb848ddb9c53ede26dd6fa120a6e66ca231a5bc08c2b9b953003183ac421410fc4bac9c626513800c672b8e9bedc96c5eda4810c0d2b3574ee31d4be25a2e314de917528d1541dc7edea4aa22d77b52104c2e5dc7dd1c7a04e81359f44f2546ebf10c1564e32ed9c7d477db4f4e2883ab2637de6284af923d10205735075b515d6a12f3c48f13c4d643d6d453325aedba22681892de4d4fc8cbf4e49db42dfada819617609d9c7abbc3999708ef27f2ac36f6f62f2398454ac00f230700a8038da20a9774571a894c492eecad6ffc4c3b65b94c0422ee9dc954142a5eea47dc4a2ac337e832dc527b93c6bc896099f0acc48b15fcb560a1afba62f20973bf63423978111c6cfc4a5e0992ec0f905edfaa4346314d86377a68c9a7daf7cb3cf4b7cd6ec75320cbb91a3477448dbe603fa9cae35401bed205d0c0e2eda4911492600ff5891b06c243e469301b30f49532a42fe1cf136692806a118165c4bc80a1f7968780de809f98144f90c514983cbec79115b7b3e4ca7cf88b4d9f46e6c23e8fcad2ffc29f46a03278d306fc45c98fc7f30730df8fffba43d13c725aae74333f5f92fb29def4326ddca8c9c5c12aef9bcf9f32d2f9c5d2325bdbffeba5a37bc633c51c948b0f8ec6d661b0af09acda88d6ade63de0511ee5393b719b4533ce963b305397951e2ea8c05ba4df990c34d389604072212c0525dedceb14611c7d5fba8634021caa9a1d154051d110b8db263c50283a86dbda8f25ba8df1fd3699f27b0c2943ff4dce383e359e641e94a35d4439c0f050e832ce9476167ccf7de9264b064577f13c7bf8d4bfc3dbbf0af42594ca3badca784b805e1e3ffd8e3962d2df129a99a3763e6704a5890ba6374f10edcbac170c54ee7a54b9657881c0b801e30721a950b11c9f565f0d735ddc13aa3f1c5b5b2e45c825973f42bd89c4dc3cbb9ea4bca70244c1f3573aa42ec8821e21ee2597b8915153d647880a5ecb8f6fbb2d87bdd02774b0cc16e5b30dc40330860889fb417291bf4dd654012766ee775ad5383746df8c5f37ad09da839ab3e5fed2301cb0efee77fb8e924943cfd71fd89e7fc34120c8a72a1db2130b297b453d25d75f0961c081c71c41793f1082c4eefe57fbfd952812b5ce93d999fa8baaecdfa5a3e35364c6a23b9e787c05bb58fc5c82ccf0eb31df05b70b950cb75c54bde2e2909994b1ce7fd1d57632f82ecda1a63c7efad6839e1e88227084423e463038e3d3d99fe512902066a3a76dce83a812a13f86c0e94a6d285dfc59a8bf3ced4486a0a0306db7cd7aceaa6969b25cbe7d7c6537c1338792df01d5ebd4fbed5229b75b7288fce5d3354f1d8273d38b5293fb3f2548c87d0b19c5aea7a0575a216893803585595ead4c0fa593d0c36cfdbff041a2556aa826a72fd4d6dd72f3b07e690cc94abdf67f89736c1ca3c3aae1a80f53293bf3a439d3472edcaa5ee72e5c3c2c61ace2f367f60596ee91f11cef4641ded574b193feb0d5106544ace5a7eda5a57879f5c96c150b3b67880d13f3aee30b3ffac2fe70da62644e3bb24a246fac89e65700b5348d3d306d124ddd50266c024ec4360efc7de97a03136884ec4c460080c21511a458a5c01e617e8e2d33b86d776f28d9f91570de50d04bc17d58dbf0475e5659e02cbc34e845c6ac16e8b66479d17d2f3c1c07b19bdc20cb1e2501c5ec4eadecdc98592efe698889996504dce7854ce1bfd8a36bebec31371916344f9632a85201675dfd9db4f1ef8cc183a3abb550f876c47cb20820976ee41d5aac68460c17aa6ee710a25a31b984f5363c62fc28554a098c979557beff0cbaf08b8f454ed255ae7ad469333946fcb957c530d367d07140247acf66916f7c751cf73f6f529bd2f55050f5040ac18dd72c0b4ac79525d089bbf9703f266858cfe979f77c1d1bc67fba642207ba06241201b2e3c7edf1837b1d5b0b9d0c9eac39ab9dec07c0b55a564d57aa77f4445c6d077261cc9a262100d7fa0d27264f4ef70a28946e4648ee8148af6395784b829d714dde4454a5157f8cf7b567e4237638d71e72804f330af83b470a7480d11822e7dd252c53a6b8a199b8bff9fe188f567ce79ceb22c975c9bcb37986256e3a849ef4f22e103aede3db8f51860560e37cab00efb087c0c906a7f0e1356755f9e8de5a87aa6ad469a051fb2bcb990a842827ad33f7f2e7737b5dc3764c25e308b084b63a1ae06bd0c4fe39a6e3a0c181a39713d6a87273767cc21563c46c54b06486a0a1d574daebbe34dd141aff9cf3ce11fc47103db07f0fb1db3e3ec4a15b46481f2915b6b3140ccef13e20ac27b94de55060b2280fa4d6720609d8f4d76f5389805e852ba3579ecc05bf944e030f58ac1be262d3ecbd3f14725a61911096214caf45490f82aafa382bcd31f25689dd41192ffac84acc058b5db6da2d04219dc0a8019f519f19e492e2e650316fb23e79e87f750b5a4bf62b22fa0549893e0796df26cfa569dc5e98412feb989eee704b55439a37c446ad3fb896b3400fd3e23ba9effdbbfec8523719b4abc91a064460dc09353eebaba043811b5f009a3e01339fba842ed9f2d03992a43c09cc71e9d0774f6752b9584fb970530df5b5f2f2dc123b793b4bfffc1cb998edbd0c1d82785d2e5cbd6e41fa8899f71145861fd6160f3ac2865fd4f2626bfb3e7971b61b5924ee5a4ece88d4219f9559d62de82226e0beb5f9ca6a52ef455ad5e933d3c237e26b40b10520eb3ee87dc658f738f46ed417c2d087bf6ceb33696cdd65796e9fed08542cea9683c8588485e66aa2d3cf6e3204d89218344cde976b8e631288044a7bec2f7e27a8eab393ba5ef01f584737a60c620b61295abdd9d9de068539253092486c2b808fa068e873f857afa0e06e5a7809c062317f9387de2c6281a96f9571590f9fe9d7925f36eb2eef12948bc16e48c65d8dcad6bf7149ba2622e9071fff7075e77e08461953e5ef69d31a7445f8aa5532a8c9fb7fcd550a1b86c4dbf23b1a78053f19c68a2b265e7fa58c3cea5aec9945b0b4eb405927ef773a63bf1912927175e531129b59ef63368b421650d4d51068377650b9e8b14f2c59ad0e3504672b71df6e0404d25ad87c1576da89a554e0175ebc579a27d3bb0f5b7a934e38d164954e7c4c9c7a65c1f0ff50bd854341065137fc4057081f0ef551651616eed2b9125359ba5ee81d14c841bbd4fd7ab9bcf5b17fe4736ddc17b9452442e3a919a506920c7963eeddf438bd82e3e51776fe2f675bc1013245ccaea7af414e96ace7b72e7436cb168c154affabda965cb00e7c41a1b462fdb2095e57be97e236165af0fbb9749584f0d52ccba93f62d496c10389b6c4cee3462f40ec1173f06ea83fcad529da03395d890163cfc7f20175de9d335f8a682aab6c5fd95e0526de8c7b52f85e8b426000b32f46437aba0ef2368678e9ca574763bebe051a24823efa8f8c4dbf6cf4a167d0c70469aec73a43356c199596173e13a2eebdbb5339247e848a96b826929b2db577457a99886bb5ec7e59445b420af3f137a849aec8764b2eccbeb08fa995cb1441ef57132b477f58db845d18412824154c4f665fe29142d75032b3811cf8a2e1a5b1a54af8deba8a9e3f5b68c006f9f021898051e986cb5d4113355547b98433f6bbad26343bb6522518c7086adb02ba1d99ad2006fb505dd462d104ca7064d393cd0b48893fe92001dd0cdaf5ab97fb3c749f7663999dc09c36c541a688b6e30d13e8675ee94ab0fcb494e0b6b5b50599a3b6ca371917182ffcd417bec15b2e0ad33d567e8e817ae11c14c3f4decdce9f1ef21b67d339bdf1f8afa9f98bea87c7dd9da066261558fb4465fb3ff09acba731c4d0776697848d6117eca8ae4c15849bfcf4b6d81187375714e302a07532164e0d0d889fd63001481ac116066b9b89a259a04826d86f6abe4e1e0f6119ecdc5bdd4e67e984665fd66df70ffaa8c53da639eda73052c0967bc4ee2a5fb88e3c63f69cd0d2ceb9fbcb4b17b73c70bd71b4bcdb2f0128fab5b26d3c7b4bb4c8960244a346582865060aca59d4fa53edcb687015e9162a57527a8b75fd77eeb3596f364a291220101b7a61355b742053918a49f2a3f228a98d0d13c968978c00453a07a8a5b8fe755b4336f4aa04393623bf33c5b016df15b5c51e935a4283f9c3c2dc992cb66af3ece030754196267bacae518e77a41049c57ec572bf44f48c363a811a5d0b89477a2239f5e5f731f691a30ece10b935f212f0b907a0a8c34de65f2fd041f799dbdf4da6e91cbd1925b6313a8eb2cca6df9e80b1a4e6881d5290ee1fa2aa2bdd742a6454f885ca4dfbc0fc22fb2e07021d8dda5c3c3cfd87c3f49723abb3911d991f52170d03a21b1e1a91bee1359e79b78ec46ec1bc743e6d440f175b7def8aa70122c8214aafca02ae4e2cd19d0a567bcf439ef9df2eea30ffdb1bf87261c6f86a59e8e895b0fd2222b015601f652a4b94dd3eb93b9691c3bc5547ff89b73ae15d0c6e65bb36442706ea9f5cf2b6537c57b2624612634cc644b96ef7f07b2abfbac97a7e4e17c2d4829b5b37c40c1d7d6c1e423479192bea99e907af229b3876feb13d6cd5c7c8cbeb38abf0b9add532ebae94e3c04531cc4c0d5ed48e430de8481eae11e1629ccd1f959c4d3915db64aa0f1272fd32c7f3761544b2c06561d99f10e3427e2d71daeacef2891fc6d9c51f472cb777d4cac66cdd9d8446d806d07e0e730a810ffedf5f407349e58ce2a77fa70d09aa911c83e831e8a4410109ee8b1d79b118ec7cf6f0a0304cf350db89f11a3533be85fb86f1098bb5b7991a915435697e657436144f49a4d40f0cc838e0b82271e4c1d6735eece4e8b9c442197135a791ee03e77e3c0b943e3d8e26bcf7e5a0a05552b588c77503cc8b7977a0ad759d8369ee85e7f1df22930f25840ad651230db81c7a907809184ba69ed0469b35afb251a1e96fcefd358b5cb0a858635db8336ec79c6e6b738d0d26ece2a5ff6340ed70b2271a67f9b490566d8d671f3308478a6f1cc0101bc1bd4694fdc1b9a8caa3bdcd66af3a32190ef5d60dcb653224abf77e1813b4cda66a7ee37a619b622be15d8b4861a0fc30a836c9765238b4753bfd7a5103e040601a16ad089af7826df1a3b26c9b61d09fefffb9854dd3cfb2481eff93a124aea92185909cea8fd62a5fbe4bdccf0bffd3db2e7c5418239048a8a0e463d070597f1cbf44ba81b742cbd99cae63f999485e0a03ab8473a391c8046ed4c5e74836835849b5ec4ab1e3cb98737a3276077730e90929e5162d17d00c7e7c264f79d1489e143daef9f6ce82d66446c9654c78ad76373436b9e8c52a0dd2f44281fe058825b8470f9c74882f46f587bebd273cea9bba19b84902c66eeb7542a5aa4289832301258d7f6748143a41c0d0815d677beacd80f9e7b909593a9b1fde1b9aca8cc296095fbe6ea542c5628d734d3321bd792c3d1102b823fd2b71439180f5138dfd0a9b39e4d9b823587d8cb67d85e447d882e115ae83ce94eaaa7423c0650cd44b38bfe6ab1a42d9ab14a1e1d782f8cb4189d515a253f5e2a2d7b6072940d93a193fb4af238615b35b8248837922035f06a1e86f3ea5b879cce7f2c555d0b39598b20163d2bb5300eab8abd16acd4e79041feef08ed41a6695e8ad75378ae4826d6a4bf94e64f6d86d4bd04aeb19fcee509b9ac31150c0fcad41b1c5d8414d9cc5bd43028e998f38bf5c7c15c687c476c8dcd4687b3a8f3fa8a49be16e71e5ff2c582dbd06200bc54d1ea9f96265f0f5729e25bde256cbbb2ea2ad27e9dea3dd157a7af2645574627456e649aa79f8723ac0a3489e10006642b238e57182e11b7bb98bd2960d717ae3b64ac9d47d2982a7809c171e27fc51a93c10059e6a15183553e825e9d15ca1cf1c5831a7f926a91e514defcc964addb7223e4179cd030d1c66723ae09943e1c2d5e685a68dbf66684b064c5f4f27f64cda86b83d1e0b48a483d40564dd12fe74b15b1a351116ed7f9dea734b931478a9cf8e4d9892713799e9813129967120ceb632e9352d4b84b19b919d12720c86b23659fd7b62fb59c7a43fa70a5","title":"297. 二叉树的序列化与反序列化","link":"https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/","question_id":297,"issue_number":20},"18":{"day":18,"pres":["DFS","排序"],"tags":["哈希表","树","排序"],"whys":null,"difficulty":"- 中等","description":"```\n给定二叉树,按垂序遍历返回其结点值。\n\n对位于 (X, Y) 的每个结点而言,其左右子结点分别位于 (X-1, Y-1) 和 (X+1, Y-1)。\n\n把一条垂线从 X = -infinity 移动到 X = +infinity ,每当该垂线与结点接触时,我们按从上到下的顺序报告结点的值(Y 坐标递减)。\n\n如果两个结点位置相同,则首先报告的结点值较小。\n\n按 X 坐标顺序返回非空报告的列表。每个报告都有一个结点值列表。\n\n\n\n示例 1:\n\n\n\n输入:[3,9,20,null,null,15,7]\n输出:[[9],[3,15],[20],[7]]\n解释:\n在不丧失其普遍性的情况下,我们可以假设根结点位于 (0, 0):\n然后,值为 9 的结点出现在 (-1, -1);\n值为 3 和 15 的两个结点分别出现在 (0, 0) 和 (0, -2);\n值为 20 的结点出现在 (1, -1);\n值为 7 的结点出现在 (2, -2)。\n示例 2:\n\n\n\n输入:[1,2,3,4,5,6,7]\n输出:[[4],[2],[1,5,6],[3],[7]]\n解释:\n根据给定的方案,值为 5 和 6 的两个结点出现在同一位置。\n然而,在报告 \"[1,5,6]\" 中,结点值 5 排在前面,因为 5 小于 6。\n\n\n提示:\n\n树的结点数介于 1 和 1000 之间。\n每个结点值介于 0 和 1000 之间。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2a9c133385f155623c4f4e5a461d578280275decff0317058956ec014fdd67ce65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dbb7098c20b026cfebeea39f5d27dd4475a79a382c23147ea69cc7bb33d7092b3244f2d267aaa69976ec70ca3510822b7d6e4e7b4548c73e88991eda2b4b63e55768a9fb08a4040c422f355d74017615014c61ebe6c42287961a4240a34443567b053260ba3606def2308b7638921b9b6101bd6caded7a876df5beb5fc25a2356f42cd8760288eb26a2d13ce83cbb501daae759ffd100cffbdca85cd280b69e18cff43652b78ce215c4a3ec9b96aecd983f938ba1a224d648a5b3f3fc3b9e830956fb403dbfbae46b4e508bb3369dac30bbf85ae21ab3f7f259f704aeba4075bc3ff0cab981783d71ed763fd6142e0ec146f1546d8d16f95aced02e6c9a3a2e5c9b4bf10a86b8294735f74cb6d4050b038d13ff9332675693f42e8cf2a2943f4279da5300545b97592a481097b8e3c464d44d0ff7d52c84129cb6e6084585bf0f3e27bdbe17676864c232d65aeeb1f691755b964b3d77c7ca05f3c04e0f98ce0c031e96ae5af977ecab26f27e66f9da1a725c63352f9617e2e016e796ff82de4b78b9beaf554df9676282eb34fbe1a0759c6fa43ec978d0d11424783cee78d72e1d2a04623833ff55f78db4f08e54511480fa2119353d2560c4043d766a6a57f733860df7613e3c898f9b9e442b2c9e296b1b10583ccd30934336dff97a5b6c3ca4b6f89d362103247c659989adb8b7334124038b7e7f48cb25d26785ef756f74c1c832cdcf54f529ec140099ee9150397c1a1b6ebe98621acf97f5fda87b6f1aebcd0ad6c2f9a722155744b2c4c1e8fcc1c81d7ab4b1759ec5fc6f0d454162cda44a747994d9ed215bae7cf73ed5210e41951060b179a9b161b69039b3205c651fea0f8b975d734272e32c5ef65eb20476fbb56afed5767d82180a1d64f203703de060ec19d655484d513ceae569a4964590eed976710675f2fc7648edc915ea11a515019c8be03d3a433b82a7111153c52950910d416f364f47838e68e91b557994622f5bb8e87471dbc1277a32675660fe566f504be46ae36ee3500a698ac205615e8d4c69f70640760594c45015355c7b499275067a3e58503c35b2a0a3037f5e15d824373904ddb234c46624984a2deb127f78d5e939793f9397103fc117afdbc2d9e639a8d6480fd74c57137c368dbfc6f699c687b1a8fa8df52522586446d42c6ef94e9c5340d2d3165c87a77f28002ef3e82a50013d948793aa782397bd3ffee99a60e607a08ef29ef774799699acd4c227de3fcd38ffec0e4e1ed4048db9ebbb2b914951852ec5cfde29cdd7fd1fecbc4c6517cfdb53fc3ad71ff9eeb6d0257e5a05363fbcb103c9de6ccaa8bb47a38fa52aadd30d188a852761d75e95731849a619556b8cceb8c90b47876e44a04edde21519aec1d31643fd9927c51514c56d42cdfe4693cd46b2fff6616428d03d91d1370b33b549b4f5b77332ef606255ec36d30fbc7eb28d080d7f025bc9d1f41180cff847fd7e0ff4a88cefa6f9a399552c5e4fa3b400eee6a654317b645cdc1bbc00c151254d02760ee1a840bf3c9aafb6a44f81c13d11f13cbaace8d931865bbeb98c789786d2efeba596d58d21d283a7188befa1f93c12a22f89455d43461d1cf5f17a904c2b3f561f458768c377835061acbf40ae6411cc2f4ea234edac9cdafe1aa8bbf33a3049f6758363dc0eaae0789d83c8b05bebdd8647d993abfd9315ec27f466399fd2cf4d9b3fbd573062467a796ebc5a2533532639d7d6fb2371a4e1a304293c9b33b2e2e3836c7d19d2f642badb88b6bba53aa1f1238a5dc692c4ee68e6d697e4e65f707b548d03fac117af69987a3ad8a7255c44bbebabd5db4e69f4b8ddb5065a71795650df965d38e51aecadd7c1e965c20e0f388adc053ca3b249038820c4e88e5031c6fd7c80442b1ed17f665e64e9d5d4a1e35212e3911ce37f3b1ca17d9bdf568d0bc60e276e0b559cf6478fb0bd91f0c24467bfbb2ae30b85fa2c978ea691f2cee3a6b39158aa5b587286c5aa4e9eecde22f1b3f4a97f61130afce3675978a2cf9d7ba53efc28cf4a955c50c5fdaa1543203048c2ffd2a8a466414d37131b109f4ae1935d168d35c0a3ab5fd426d681704571679f3529674efa0c6a3a378bcf689b0a8374d246ebd37d3bd9831db753d833182051f45332a63c04e493694a9ee98ad4edf0b6cd8d04dca3e91e6b08a983e8c1885964af4f60993ed3fe1d03427589fc2d4ecaac96966ed7b4e9090670b96d36bd644f7cbe2fa26328e35ca7e954a9dd5ba3df6db24aba98d6db72d986aac0ae6926ccaa7d5220f0be94c84796f304ae72dec097d37438945a36af4d0f4fe3faac56413a38f53781e10c566f15420f7e0b5b6bb17d13d35b7c83dc3a76e16d57469e0d4d4915d3056c5d3faa2017901d4c6a8121fd8ddbf13cb3ee909067105a3a2299a3ff3cd3646c4d96b9e5a446bdec2d504ac57f5c2a0a09a7cff5b42629aa9c2789aba18e4df9be62c7189976313b7371647a35efe6513790f9b33078067ded1692053503eb91301546ef989536d6c9f1724378a686febb52ee70ac0ea2275fe87f129fe901c8027cd90abe0b18287af6bc0ae97ed056da119536c5fb1dbf95274230c3e6ba1b13d00714251bc3198b5864c8bef5ae9d1d64d2120ac022fd185f9012934ca7541ff004898af5d1246ab3c47ce6444533a7b1744b482fdb83cf9757d8ec7ac6754781b772c00a2265b7ff6f167797c508011ebe71b0e0841071543aa83bc656fe3cec27428c679a842dbfc1d82fc85fd2d3f011a3fba134af314c14cc90ce92781398aa523306de57027190cde0bc53b71bf3c2cf4abc3c357dd1279c73ad5aac467cf5b97cc0620420c86f2d7766c4d1872e19f445c6c607362ff828ca2fea06f74261d45ab810a8e76daa12f5c393b9dab661f1f47333412050f14e851b046915a99667d9b7246d9fac60d092f49832404c0e4f99266e904848fee59ea35c3eb6eebd32ec9729e4eaedd54056d8442422a05abb41cc9563aa76c2dd77cea7df92244f12d75c4081d774b347c1f200708fb1a75e7090e765b30cb6ac0707d0e9b44691d9c9647ade2c3cc4ef1a64d80abf7de8fb73dbc59c1e169d43adaeeeda227d6ff36cb9fe3205e85e4289505a4fc152320406858c70a7a500c1fc77cdd06a580f9f48a59fa47197962772f8c912740876e7643dedf48a57a5d298d0664819fd7aed828945a88321a96d20ce526b8fb34c2710751774ad5cec01ee3f45626271c3f4e57f71df7f49baec1440349bc2b5ac15f9bbf9c615048305a7298b9349591529247571b3f9547d3997c532b23b16266b699d2a57532dfe1096be123a196b24d2e4e3f4490fd55fbb54245f2582cdfeb31c13db5f6144fd48bfbd192d132e52627df2d5d5f7e1683e97ea432cefa4662cc9bf387d3bad30b97ece0d3dd9bd0d1abbe0e53b0fb5103904c2f6afae864919e8998d9133aa4a30e1eca3806c45a03d5a8795342efc21d4ba9adb05f7f2a97a96cfb570044b0804fb32cf4b6761acdebd684fb9ed484a4d684628893aee2e29099bf793e846fe7ee209d332d4ee078775a2bf279a47db25fa1456d26650bfe022d3aacd7a9dc333d3590f57fef248eb5341c1fc64f0a4ff35fb319eedb6095e13627b2eae05993c321b897d422089a9b62c0bebb9d48f22b99b760d7253b03a4d10e550b517a2b6c19139910d862f0aef69316b11a905bcbccaae8f8592b1ea7df156faab0abeb628167f99b4f84a981412dc52f6d4b143478591d659a3081fc993293ca1a5fe0cc3662581b49254f36c351ecbc940fe782704b1730682e2426795f39512e83456b367e64c8fe7e1cb5c2d6d728bf4da1690b8547a46f46d2572bf895706798a38ef220ea6cc4de07d0cc2c6e761977dfc3881fd91b7c77689aa3668b5ff06d35a86bfcd6b78f7e60a77764f27135b8f7fd2bb7976129af00b6cd86ac4cc11a1c73f8103faea3a8e067fd689a13b74e4868b4bc3454865db0a144e154c0ceead189adf6b04732757d73524e0f248d68a16cc1313d9243a6fdd6171a811d39ccdaa53f5e47843eaec450225b2b4b72458482f5f346b8c504cd2bc034cc902688cd2a76b5dec9736f7e453a49392fd5a8c9b5d05080d18600afa1c4cc95b3553c22393cc37abd0f55932f9cd7058be84318597cd15ab72848d9fed880c520c5e72237207747990360afd324c899867d7568b805810611abd55199381ad8cf7f85a5471c7d950eef3a1ae28d96b7aaf21c25ed4127541360595d1e47d6e4800cb326ef727160bd7ba6b8173b1ddcbf2ef0d38d3a12746da1a9dba0df93de761cb1e353b69f6d468dfdc48521efcb6c5afbdb1798d849271a3482d4353235f8f5a1aa5f5c63d7cacdea14b93d0312b4178aed0fc01076e5b6d7ea7d9d4c363efd48728e084d5f561e2b924fb950da0f8a2f6be218816f2d56793842e9f6dd7cf796d58742fbbff14a5321bb4e95158fffc4b094034db1faa18990335a4bd5497238ba16dd0d7c41d49dd9e1f13a72ea9245e5fe008d4a3328adaf17201c3ba2586f8c4064ad407ecdbc393116298466bd6a9631926d09504643f7aaa9ae1717f97c1295b93907d460bf2fef651c26b25f2764d7d4157410818e24953049797fa04260e314b501db06a61166cf50f184000c902772b4e241b544a1ef9d052f58eb8001657388282b2bdd4124bee28495d136ff8837c437ea72e32b16e022581e6a37f503a8f8bfc30c14289cd10c5f27c4cb78da009db3f080858a397cc99387653fd39cc8b6b61708c4142827a72f1f6f524350d73b4e825ab1de1f7ce9591f147c7f053ec95a9e3595994874d49426fcfb0ea22105167610fed12c1e831a7fcffb8e7edbdb1b381c8d3d3d06158eac31ac80e691644045b39fe41319cd343482db77a6cb2704506b402097511287f5161a80634b822fef2c672085021a890ddf8b67f00e73b04a6a72893dd9c71f7b1a6019e8fa5727b2bdea76924120da058f5f271145e8c8dbdf1f080d4c7f947b7313b49143bbcc63dc9d2947e7753d050b28536c496840cce1ca3bb458c4201e9d7ace933fd08e9e9ffe857b4eb49ac39442153398fde4fc342ade983100ab5059788c9308f33cea5a6ad98b855df2176b6e9e4bcec16cfb13d59a6a39e2e586e6a0d0a9177d00f240e48f9ac55e3c46eee508719066a6a2d9e2c8ce8cb594d720012a7f019a2bc59f4193271f8dd64e0f00aa5489cde4e4f45acad6e2473d07db4ce52935a44217eda9fa2bc0f1a0649b356fdfb3b61a80d54544838b06c3856c4e0ab3ebc62520253a241f9ba33a55cb1e17e90378ed94ba29ed24c555ee501583fdd21030bc911ff4f2e770ea155c1060bd36ee8a90ae44a6431d70b6226900dd5e69472de2f93999360211a3e2bdd5ddf6ae2f56576b11e84282b0606c395eb07345403dc2a72ada688fdb0a4a4ed6f551a6dcaa16e83ed507493c433808c0806491e6c8ab93520c5a00f1fa103cac7a59ddcb6caff8a9252ac41362c3fef8aab87bd9cb28f6dc223df193128c05f133cb58f9c0dc6b124b360f3057ca22adb5271ad7615522bc5526373dc61db6cf9f0c1f1dff1655de29908f92543266f581a2ce6b570a3404c01db48a9b0b495b4c6e4a06e18e10759db40ca881a3582071dd520a7fe6f07189b39f4e064a8811fc1dd015fdfe136edbf7e09f4c6b879f8a7a2faed27f30dcdf728a735a56a3ef5f849ef39858ae176549b6c840063c784bd0b488ce70fe44e6f05ae626561477c2b5c69f250313205c7f3c4ddefe3992d4d30dd0fd27abff95c80d5b385cfa5b50dbfeb3892e4d0a420e65157a180c9e8060b1b8b8600f4dc6e07a814408522fc59ae4be894ec50fd8c69a29f6346074ba56744528ae44991bc7520e834566cf49868a5f783513998c21c23586650ddf3f2da02c9305c48342d12608446b397d352e4cb519e612c330b16e1b7338ca317ac6182497018291ed7022da6f61ed8b8fa217b170cf82e94eb073dd69883367297fe4a990c7d174e13e9dde12c3414fb7ee64cd0b90bebd7a275c7afc087b77a42e4bb657ee9e72f75903a60af0d20a3666e78ec1f6ae397ff0d944f969c99a962467a3c6fa24113af8fddbff76bcfeb6527bc3714f4d4845bf737f83b015a544c1089b5de841a8335be75636c9b0f8b8e184ee4ab98043fcf92acf5e814153aeec04944c032d8b18b51ea00e443dd72279e87103746802075066f3693f639a94a1ccec2be61e04ed489b29352f3df53a7e730eb829ce814d1d6c4b5d459596027e57f26112319a9272e56ad263065d5d8a0c4b0d29af845c3d6933bff3aed62aa8aa3174931e8714e3ff6f7b08f45ecb16c5540650e9bc414cd4e52eabe107b75c2b70ced7251d9bff8f592c0fc26abaad9e5ff944552734b09fded8678e53ee430989b2b9da34efa0a23071f441ec08e74820b48ded2261057c999601dc2111510ec87b714b44bf173746e259aa2177cc31085b170f775ec8da1ac4e2ea705b12aaf1706838c6d36f6b7703c48c278315cae16175a047eff18bb263a1105025c35260449136d0ea1b9cf6dc54162f73410fbb818bfb170928f093b966e61b44df2a6973a59a860d0ddb3fb03ab0e943c558bb756c9313c23c6d428131bf0df78beffebbef0ac82b6ec0d7a2261ad057e3e73efc9b56b3508fea725746ed28e5305edfc8f264dc8769caa96399c8ddd2e8fa7bd954c46499080bce0000eff23f744cfbdc9bdfafb968a2d4fdb0d142c7fb1a4b044591bc3085a0b0c018665d2c44556a0a3c764a78920dbe32ebd385f7f9fce4f5b1f690db422074ead0177494976ca1635ba72735d272382563885074be3382070ae5c9fa6a29d97c0ecd1d67975719a06672f71d7ecdc986e8ffaf52354aa48fde99e6ab6bf19ba15fabac708479473b09e4c575aaff72fa8778f8e347280194c15a53cd5532193b17c05621a988210daedc30b6cd14ca4ac46f09c2d4fb1c2335c19348532fd09ab10346e65c02d9813ca5a50f8a48bdc21bbb27a833d315116a8fb5ce4ee4cbcdd5ccf59a3d9384d9b30e8be5b5d41edef9696925ee102a95d2c30009599ef2c5f4fd8809e38e98798465682e6aafbcc0e99e74b0659c394e89208626e49e2ef78ac938828a83dbdce84100bdaf3dd20e503b3418f72a5296185b9cc2c4c40d8e8c9cbc8244345ff54b1542a8032168f3e2afcaa593a4fc1fedcaa3aaa4d2ee88e4b85062036dc64ef54913b87b1b119edfb0dd73190c84e5248041e2fb29f8831c6c0de468563fa01c9801ed4b5449bf40821d5622f9867d0932b6b2bccc7189472faf600dad29c6085f6a99df1d35d1abe39ae33cadcaaaafcd8684ad636b0cea0606ee645a311d2b8ba71e0ccce8e191a8ed88351c6646e61098223797880096c44883d63fd46a8d3fb2eb8146ea34aa6def81bb40092b5e65774510635972c16a03abc22c2377d7d856770cc25141498cbd7dea588607c7c01724a25096766d941f4f89e7865c5aafdb27b933c0a07058962708517c440ceb107a9542785def381db9107ba6dadb789456f78e1f3d86be3b495388cabf5e201ad3cf1fa2c9ae340f21ac38596a7327c16375066245ac1ccae320372548c95caf0646532e45aa1bf51c782406f84a54130ec10c350d3a3d48c200eecc1ef80c410282f9bb4c4c7d7b664cac9e99a5d9ee212d6fbcb6e24cb367fa4e1a79f6256a8c0de0d0401406468bff9bc26f1b897be3a4646ba6ba26ffff8c4f239dd8dc8d3815e2f1efb6f312259e003923b6b4ade8706ae9336a328a529af8ec6d66481df79d8ee18d759f77d47f5dab15c7e43a9e533ce963b305393053e0eac744b81997d5903671960f073326a4065db5d59b4611c787ada87e4026cbb9e4db34661d1a0b9fcf49c502cde729f8a0bb5cfcd454df32fb73b0ba9876ba88e3b3ac43fc56a5437edd488a52314b886fcb3e683c91ecf49264b0640a6475c7a28d3ffd2cbfcaa9451c06a0a3998dc7f555e9adb09ca6966c21bf37e39e6771aa140e50dcb3125ef10edcbac170c54eaee343940c826c05cb006d580795473bc9f565f0d735ddc121a0a5c2b1fce5008c0621e369cc807de9cbb9ea4bca702405593d32a44992d72fcf458d1c15c6515035362e898fecb8a4bee68d2993023645558c221439972f7d4c68da969e172949b18930125c762fe923af4acd3831e7c3f735fa80a86b814975ed2301991deff179b9bb6a953ced1ea3c9e6cd34da9333b6701fbcb24719418507f5f827228680c4bf58923326a0b39b7a63ba1a51964dc2da12db0d034f38573d7c8a9abbc396bba115755f34c944434129cc58fd499d2ca4f450d07bbd2ccb1fc8abcc228ed00077eaf1ace8042a66b3a6675064c1e9623526b0e283b372dfca319de0334f9693a6c3d6aab0393eab758078dc2d48d32b070e11497aaf9c440bc3a486e18d3ffa0a2a4b690a214fb8284b3c6666133f647f8c72779a008f862f90ee358ce4aa4e7b59fad355733ab23433b8b018c5e491fdd500af7a1875ec0b947f160401c7f48cc3ca183465798188ab044b7013a4ed6a6ffd363f98606f7afdbaccd5a9c948a09d7dcac76c739b3fe6d162c6bb3a75933031ae93a8f329f68cc28a4fa37b7e76600244e91f4ce4b72b53be034b5770fd0d054e06559b5e65cc4f2ecfd61ac29473a89c788087703aec30fff7b063d656e33800acff61a846a8d594627212484f9b8344d72eccdb0d2ea62df76960b4edde97a06063cd1b818376550d26160017d3575ae61efee2882986d776f28d9f910658a05841b215c58aa25e75b10bdb0c998a09cc08639302833e5bd0039cee84b93e19e6e80cb1e2501c5e96afc08ad788dcfff5b08b9b9f4b67ce78548700dfd228aed59b4b2afe3711ab2d2ad765457b9596924c57a298076b3abb0814ad4604846ed11c78fa51d5a7eb8f60ce78f4e53e5360a30d96544667d8649dc903d29490391a60cdb48afb49b8e949ed631fb6ac148e3994378797395b0c7669112f241ea7a42f438e9351833aa5a129a06b5717534301b01c9c25c6f5e93d04584bba849b5aba38c2c48097cd388ed89627e0c247373bfe1a0e6fb0e5d5fd6af6bb78070e010b064f5990b3b7a53f58c712a3498866ffc0f5001687acc91b10e5800910e4f96a2bf0d42bf5098848bc2b6fcb38513939d334f801975d5dc1a5a7cc1d3fbce8e7c8deab1fca3baeea164eea8a73a21781ba8547e99f5abc33ffbf43924231e6f0b8b3b93644eb313fc047cc0b4f2cdc48927b328f2cb1ab08f36638da3903f7e7ba95ec7f6c8408fe2d","title":"987. 二叉树的垂序遍历","link":"https://leetcode-cn.com/problems/vertical-order-traversal-of-a-binary-tree","question_id":1029,"issue_number":21},"19":{"day":19,"pres":["哈希表"],"tags":["哈希表","双指针"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。\n你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。\n示例:\n\n给定 nums = [2, 7, 11, 15], target = 9\n\n因为 nums[0] + nums[1] = 2 + 7 = 9\n所以返回 [0, 1]\n\n来源:力扣(LeetCode)\n链接:https://leetcode-cn.com/problems/two-sum\n著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。\n```","content":"096221cf5b628be1e73e8bcfe626c734a10fb742b1ad41ac640b4b4ceeb6ece4c46c74b1f94135d5fd897cb866ebac1fb82941c49a2758c1af23f822b5e7ee6ee429652888c1cc99636081e50c7898f6d70dfa767226f84f5ed37480a7277449dfd71f8db85e1edcc5b6fd9b2d0a27389b0ec3e1d0cf2906fa3f5f0c87219c4887d6065735461d3241c422af249929f52b5d59e4757d466cbcaa0b38af9db0527b00702f0c4c59e6e50c7484c17e6b0f0bd68ace12592402f127a33154b6420415de50830f7d8305f6f5230deb202801fc09a6366345c29e4d2886be690c3bc29dcab917c2a04d83ff042ef68dc188e720094dc281c05f65117acb0f54a7ae6e73cb889e9598458245487e03d66bb7d11e5f6c82ff33834793e1c41a8d8955b45214ff8c7995e7d210c16175831eb9ab7e0c732df4b75da8c14aa69f61c220ba720f85cf8efcd5b4582e9f9391ec0fc7f8a189fcc994981e9a6b8ca6605d49fc83f2de75918678e66e5849035475ba97018daf34c0182f6b5946d8328ae31b6126a5511847f5d9d64552d17823e9606087615aceeae26ec3ed7274876c112f7a9cea314a176c84658be0795ca5b6b66345a4d5fda85afc007e222ad36d03e8b9e75a96a0af27ca356bfb5f482c0c7d7553ee20e38e819df2f469e99779242c9168bd161f5dfdeb40d3a88e1d384873a4cccfb071e0d864d6d64b9e559b99769a996f450647c83ee95cda739ed6d096433ac1b3dd9d664ebc132680ae8752bbde7ab1cdd6480035c260750b87837a6dec93b8ff8a9330ba0248b0b6ba937fc598f3ceeb7f3f0f4f2cb9ece9d8f65df0ced8f462d84d19aae41d25c7bf4716a7965171f59141211d050f2f35a4767ef2997a11646d1b50beb508708d31456304153936865e19b811024ecafa25f51381f0a1012550b56bd9309a09cafd7a743b4d9d2ad8f43d19510758deecb860736c6bce28ff57a2013c7e1fb93bd34850b40c09e658dfcdf97cdd7a68c0ae24a46e7d5f8182a4c91fcce60c15ff30fafe7b96ba29ee6c1701198cd36b530b6d429d6fed80b62bcf180e291097d63fb5d405d3716b7ba29a5ca43dd82381fe78f0792bda829e9754b5702cc4a78d815a1b9d0079970276792ce44fe50b996ea303c4350eb99d9f0a5622e9d5f98f734a26664844a6e28ed351375ebcf065bbc88515eeb6a29ef552da8c30ad273a9906518c66a9e7cf858ae3bc0bf4a7655f08291aa9c5ecae09e31214a896718033da39ce52fd62388e3d5219cee054aaf0a91b755ce3052543da1b34c9b0c3d9b7cefe1e666ab06a7b2535c22bd21fb5701f64e5908227f194d2dcf8f99ead3b8f211ca063d71f2eb421c3e5144675b094ccc782f18f8ac30813cdfff288da5e9c490ed433aaf4f5bc4da794c08fb95af3777bf706c97eb3d6c326476bb4fe4f229dca74649d885644dffd3873bf16a31fac25f722b6e01e7dc85d1dae9b58b65787cc2c3b00b67e5ae56427ede71c50a5fb1f32673fca9556735f5e59d7210a762567efe0c0753e4959d0836bdb624dd997e441d326a7d6bc2fa8cb8609eaab02411ff015736668a7670dfa9796e16f028f1eb3a45af781a633ceb568b0c5b7c01d4003fc63fa8aeed0c92e5d3616c26e7d4484b795398852b07d256745b0de71e7ce47af9b82ec8b81c75426f5615075a3e6e7b23a22c36d4fd2f0929eb6130d3dbd4c4bdfb076749111c1e9ccc75d00a940d0a6368f033fe206e1f9e5ea4e91209615603de1f422bdfd1f6c48607d10f0ae79fe5a8422026e2886fcbf10bdf2ff15a7601a08abfd230f91801f5cf5287528b6a43be19fae8dd02215596bdc8196b8889bb2b1aa3ad7a067cb38c6cfe4d7450e09a09cebf8d94d3842a3afb2762423f067ad28fadaf5174669394e233cc169684ea24da371d054fb349bef287e15537a4f9b8a54e5673155ae0c0d7a831531c9e320fa08ebce59c7f949a77d5628829f0abea00b7b074911ed06ca29834f930d4ad9e8541e6f1350d4a7706b902d960bc6079be98135f1aa5279c1508aa3897bdcd28e54af0ae62acda7f85b9cd3f93e4ae476751c2de16b6b0e96fd7d9906d370a39b70963018a4ab89a1a9862f6a58a5dce6f3c1edc1a7c0724fdcae0dce233b56fc1863001fd33859eca4b703b7021a50297df78fab8e17ca25867a899c8e2c3be470edc36520b8dc4b985526df4defbaec85c2261b16a26fc402dfc577472482321a3c2a6d6e4b4f14a57cbc86db4fd9d357fd7dd0263c62192a6348b5b6b30ec07c3d6bfd590955dadd57fdd107a92b651ef4668e6c37838fdc7df0f676a1c04c5853d58bc9adf4fd2e3ff21613a4fa1331db9f62830ffcbbabca869054ef0f2cb521061815ef5bdb1d9fa68965b62b9568833ce7877bc0b5c3201d2beb60afb1a8e7cf2fcc6afddf106901b85fee6f9a89d452dcfe2473b7e838446e63cb09a9604c85c3fdd1bc69ad185ff3e15fabb20970d80f0ef9703800dff5e96c57a5ba683d3854290a881ef3debd31c33fe91b055325acb5129a16c1cf356dc4cf7a9e5a4468c9c8d32f90e85885da99c635ef06256afbc8db2ec38ff721491d0bb20fdab337578f4e645ae434e303cf06e378a3f816890615edb893d6f34bd4f8d4a7753498e1f00586ffbe7b97f3776aa403e65d25dbfe5b741da97b55ad2ab02276203241456c78fa1b4f5f27f1e742e3ddc4b4bf8f4595d0a4e0c3fd0527b7ee8784bd72a7475d14fd0471e0781759f9e9be0fc58b714054b4edae6cbab0017a7ef09a745f49ba3a1b9d1705082f321b46e3c1beaf25a9673496c8af737537026f0648d81080f15d2ed5d3b9eb1ede774bdd8cb9859c99860509759f8079486bf5f929b160ee0264ad5f704d3b818388dbf02681aa72c22bdd079f2df315f5372d787e0b96bfbbb1ca4c8a0387d878bfb532256904e77bd5cd56f5494f44cf76d24e3cc0cb818b712e5880b026394d9a1e8db8f08796da662d6e085c67cdede390fd6e23824bde4a65b7aeb8f7423c9bb7949ac8fcdac39ff718c561ab04f148e7b11e3c58d1f0bd80ecbc8d29cf9e79573e28c2e95c844a4ec525a96f972fa7866bc9b606d46855dec09d75d4ccdd94672648d004ba589ce570de638a2db49f2495d1738995e4aea8d4dbb8aacd7d92ef7981c8c3cbf750ce08dbf5c91fdea6813555b54a730b1cc5774ac74b1194ba9b8c00ad57f09043d43adab3d6e50dedae7af2b9f45e778521ac38ce0844d0c2b3f8eaa32b9e8a3a6638eda5545ad9a7ab9c803284757c025636a93a52f2ec06fbdead4b724ba0405d1ca1045ba29df4a7d83fa286349fb03b0fcd40b8","title":"两数之和","link":"https://leetcode-cn.com/problems/two-sum","question_id":1,"issue_number":22},"20":{"day":20,"pres":["哈希表","堆排序","快速选择"],"tags":["堆","排序","哈希表"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。\n\n \n\n示例 1:\n\n输入: nums = [1,1,1,2,2,3], k = 2\n输出: [1,2]\n示例 2:\n\n输入: nums = [1], k = 1\n输出: [1]\n \n\n提示:\n\n1 <= nums.length <= 10^5\nk 的取值范围是 [1, 数组中不相同的元素的个数]\n题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的\n \n\n进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347683248a04f82c98cfa5f9247f160f2728f1a65326eb995e2c4c21d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad2497027a976cb92b3098f21bc2bdaaaa6a0885427c11d72faf1446a7247fa4f14415d9751b4cfbcbe22aa14aaf20ca816926eb7da005c3a672e3063ed2880209935de265247ea6c44476ea8a61c37adb8815c6e3b702f0ca3d65b22607df88e7d1e7835a8fbc67930316f9b3ce94f65f61b1c528b7efe6749c951ef914b0e8f5d0171a424cd475b2dbeb308758ac0313b70babda3ff0396c770ef9936448bb5a3c4c8475359aecdcc2d1f20249229321529a8df738e808475f30c45495903e44b587fd9daa23efd1a964686f1c506a48a779a510bd08c6586e7e82fc04d5447c84c2fafb47104ebb675a0c2498f9c43cc259a77827107defb8ee910278e195903880c2a685732026b5f9b1abe185cb2d69715146517f67f4af804f9d2bda2d1a32d11e85128ed68dd46551d35dd48e1e2a36d1e82500f723185c5150cc42c74ff0916b6320afd96a65db5a77907de425b5460f0b3351f625be61db3832060c6e8bb06f2ee8fc7c932d15d2a3b43ba5572a2bfab1d99c4ef289b6f41813f5341666f2907d344afb7e62d6c33f2499a63162ca752bd381856c2d9ae644e08e59d4074b1cee7a072e3dc64d6d1489b6d99b44698b4754738400fe43cd511de93c7e1964605c29fdf9f4b5eb3071b434525b7e0f628fac4b9cfaad79a4f0975b7fcdfb57d46663a30098c069e81250b7d2cc90c314fdbdd73f6d0b6b9440d787d489a7d6431917b9c1401f54bdcb41169faaa73969eea2002a8ddaf95e8eab20b64b6662da8aac7aa8fcebe9d0077b616a7d65250a8a241a193708fb833f1cac9625ed9d9d46b3cf0708f37bb608a1861a9097219c5589ba274c4c1bd0f1b5f6da6c0e9b6785a29b033f6f57e10cd669a1f79dd84c939910228f72d881d4d5862d82387bd08d2c3a5d303c1a85923c4854749f40b1bef42e51a021880f6578fa295947df4c89b20c7a01778523dceb901ca4b8906e9cdae3f58c174f31ee053789e10f6b85d5a103e827dfcc0210f8c865d11ae1a758a207b6029e56ccb05bc6d6be548f181e8ee9c450b3e8388d3d12e63451e70233c0e0929dfd8f81c3737bba8f83cb40402554007140e3cb73335a300bd34f6aae5ed87b9f9bd36fd4ac2e8cda87bd6efa6f01769f785049752a233d8092cf76aa9b419f20b1ca59259e3acb25a255e8086a24e91de43f9ff92fec786f48589cc10aeef6352c5478c2b13b8af0a99bcc848fe313c82f883ec9e9ea83f9e4d25e8614ab97890d5672345f5fcc3a1ffefd7efc34648ef8dbb82a916892950c361fbc9a4de53cdfcedeac6647539eb25a3c557ac10b1373a0ab895e0cb511cd4ed7f65564a82bca5a85687068468f32f6fb8025803ff176b9dcf069236e5d26c5000dc017281fb9d6a3cf8be1775d99f327ac2ddf1c7767757d4e44e4b8cad6f8744ed3f48753d0ecad8656adaa3e946ce14e7bde96d82287cd76f31ce2a63bc15ece9b84abaf192f1dca16f846af2276ad443716fae155a0dd4c8ec2f84e8c664cf625e24b68d6d98fffe50bbb2814a4ff047ddda27bfa29381047e9674289d89b1c8a1df4733a8bc12872e566406597494a705edd614771c5734abcb9912c598217d90b5018a0d2f7b6d84ac27c05202f36de0ba368b69242f698253fe06f3a2816617a005d7356148a8f391372088778723afd4b0ee796c65aa503b76a470f79b68a6e1e6fd4c0af8ed7fc58ba85848e96364630a58c1b2f5ae73375134049bd9b16fbe506794291aa2522705f9c9c366184472148aad8c791508cff0a115e073ee783458f5c9d4f6d28ffa69d8acd52e880cfe14cf7efd3c1aaa9ec8c487e71057af2daff70dd53a136a8fd1e30e3da267c06a469e7d5d8f40a8cde17c874bbcb0197b8a9fdf53dc0be33cd354baff4d71cfd8e39293292fe5de69a86aa9248a0a2e1b9cf0b67279c05b87a6a87aefdf8f71b2e36c85e74ab675eaa2c54b09f314013c59bd61f0c7353eb027b910d6229bdd21635594f8f681cbdc3e0c04809fb9febd51216926bd994e26c66898b3f091808da9da4394c281da8c55f0205fdaa1ba6c2c63e03bb150943d2c2285283deb65dec14623bac74c98540dd05de9b5e7a0c0080a16a24ec401d6c7704c25a934192505676e5ea38331b714c4b34b9149b86c8c2ca8d98cd1b8c4c174793692b303093a8b714809caae1dc998bb4a2be0d426ec6788f41fe5b24380a87cc79d683339dec89780a38c3655871064f9cc7475e3f929bc7ca69aefa6bae32cde50bb6ce690b7cd4e31a417faceb4e8639f316bad36e78a6acc89cd201d26ea62aa7754134bed24ea2979dbe6e02b9e2fa6ffac9334f1bd4e62eb933611387b9a7c910b22a7919bf8f633be5838c469d106e7405e91700e9ecabdc671652fc31c142aa1bd5ce188c9226489d6d16fc47eab3361c180a190079633dbcc0544c7e07e9c48466bd6d5dc2581ea6eacda8bf13ff830c8fa5c0d6d72b5bb9db3efffa010c087b16611803a154f8db268cf50bf89ff5504f434c97f877e580162b070a386ef3d2452486d9d0c203da668f63655be0ab3cfd41b75fbb3f00ed2913784e03c71357bc5ff81f306d7fadefb6508939cbaddf3f11e9655156d1e4b02bfe36600171c63f574961802a147618f2cd8c5552d26af0139fb85e71c2836c0725cc82a21d6816e4e4bad68df13ee8ec1dfb3eb8438616f27f718bcb859a7ea7d1db2ca89adb528c92e5790ad5f172161d85fe18e41067c02375027a8ccdb7f0890dca61427b81e9f2bb8febd2f70c0a31745731e975f91e6f211df4eeb12e9279e3aa792e6fb8452243e7557d34db70f1ddd0371a993afaa55be4f629043d0c0917ab103a36c0a1248038dd9d96e468bc49b55eb4c330d791737cce3f0809bf4562a782f3ad4878218911831b7395a3ed1db459df09fdfbcd9cc9dcd65c535e745ef03b3fc1b6018c1898585d0e6d229f58c2e286a618da75cdf6064c525a96fed7ae5ca228ab64f9a3c2ea3c0847bd4a9eb93767f49d418a91581ab29a550df2eb2a93ee4dd3a8ec8ffcfa1d4809280cd7d92b25381c8c3a7be039a1498bb9d5a99e3d32b55b54a745e538b3941d51c7d94ba84b2399a43b8ee5fca32d3f5d6b827adee3ad893f7313dd6b034fc46e1a3521d67233978ed626f530770b962c0c05e55685968d6119ca58999fde0341ad8aa0fa692874d729c6acdbeab35c1df0f5b490570e474805dd58b760681169e92b8bd0d9b888b82904d2746f62f67a9d0e2859bc7a206d20319c82e33bc97cd28e5e44cb0110659ceda818cfaba5857a31a00de6fbb92cdc610dc5b13b193bf903fa4d3265f7f2bbdad642988c766f4541e6a89baeeddd45e5ad3304b8be22bd2d4027adb1cf052116a0ac9a4710b7f41f813e8d736a8cee6aa870926e335fd7272a8f86a546f2b151262894332254b0d120f6a0b5adac5714df1f046ced28b6c7ce03c48571427e6ad12358efa1eaec7749fee013e97a52d97dd5605396447e8a2d45a08f53f9481830a248632b6312cd9dc676e5a7b055919762f7400a577793f10275142525448009e026da833e1a7fc25dfd895b75b53b673b29a6ea1ab909b9a25cdacf65d467323899fb149689c7df54c7ba584da76e3c5d35f9a1ba0275dd650449ea34d2c6ead6d7fcd5d1c3291d2384ce237221f4aa57cfe721889265b0dd8094bd1e5a596f6a7a881b35d8852ab495c6678cb37ee49c82f16126807dbc7a7260acdf85c312835b32f840d56f5257733ede544a7a9d399f183defee727f5054a5cb02d46fe8b241ff8f284b99298dae56ed2291a07cc4720b590daa7ee84a2f497755a1173c34d6d5f6e0b9cf03259ea9f82c402b24db0720bcc47ba7f54ce373abd8b717acf898ef220ea6cc4de07dddf205c256455b796cb549c120b14159aa27b8600bf21228b41fcd6b78f7e60a77a77e8714eae8ad72bf1d833748d14d2d9c6a92aae9f99ca7cc5eb234e4d5fb50ca878bd59d4eead3b25340c869b1e13817bfb0f5246142f00617a8df59395f2cba984db6461e346079f8f57d909387b84df2e92fa6c788f159be129b37d14da95fbf7edfe811e2e316bcc717cb4088356f76c32be0771eff80b1975d8aad69cb085e89b68784b5b7488333706cf03200b1029639be1b69df953eb7b80e15bf770439d2667b4dc9daf77882b949571061c0749b7261ee9f4fcfca0518dd51d5fb56c5501eeb0c737c621a43b8113f102ade528728b7d6dd588e04cf127d5ee721e53770d78fea34c89b8efdbe1f5cbc3ba453a4fca4fd17ef3f4af21d7634d9ba39f1739d6553c0fa3d49bfbada3ffa3db99d757122d7910112fafa92293083381ef0aa2c2fce32f744710420254d2c96c4039b768386f1c783fa3df9cb516d2433175f537c967be01cefc44236c20d528e6a976a36f31fe302c024c675a952ae74e5bea1596410da6296f06527421662ab2d51c8d98a2c66e9104798eea86bbc370f147aeeb017a5c7bdc8a99df287a0d55b0255bbf37ae965376f0dbb8c4e2ff3070cab040eaf3e21fda3e3c8fad2b1a1026905742b4425d924047ffbc371d16a74199bd6a8b2f9e6a385e727ff7bc94ad0d09fd661476188cc28952f48f88cb96eff67a4a21e9781a4f3c8ca1059d164176639b4353dd14bf21db1789115ad79730e67d36f76d67212432a906c7f82752eb04f1e6566f11f9047e61ec01529681d3a5b572d1e245ff4a82688aa5c429437b5a1d348545a79ec0c7567309ffad1b3a49fbb019e364022e36ffbec789159084d82313b2dfce14b4162cca16112fb21913774c4f68da35758158b0cc1d48d29c9bddb3aba8ff8241f7a5fcf3621189807580e74426c7c36e7946a1f86659a470f271f7895d1278d9b2fb7b97a2454085ce538eccb990e8eadfdbc0f9785fdc4e46b19c1ea4aeafb787c5db23b95b16acfcf8a823a4d3ccb43fa2bdc4afec46888e730b018c1e39e649023c8342293884aff9eb56d292a5d9b8acfed25895cc48fa1084c09a93626d210b9da883afbd65fdafcb5a4d8e3c3ebf1f4ec4ce3287b1e2f8e59b85c681b55c704ad63dc20780f8f22ec0c5bf0d431153100d97963c4e37009dd57ff3ae6e2cdee24664bbcf5990c2c48ce70835b35e92f429015cbf378cc9eb6fbb82e72fb15aeed83954a6667b3833317f53408c3ae409140e03f29d837e4ac1f006a36a4552000b47023d1438ce67453f56d3a0104f8857c373e64799d88363b61b71276b0baf0c43720e4d7714d0494374f2477881e9fe2dd0f2f92b8f7073d2fab257a6965018c0d11c9aca201b5efaa488257b0f6a711491ea3700b51e45a64c7ab2fdee66bf388c1bba4e15d7b2827b56eed41ce4e3fc76ac69195334f264f2c3defa5aa0430060be3f1e58e96b643a68aaa932f6784619f1adf281d3f5a12c0d392e43ad06fdfd213c2517fe270d4f209eeb65d673d4d91b5f01f0f509abcda616b135cb0163f4cdb9cf4e37ad13570e27123c4a0908a3b55f68a26e5fc88b71edacf1673bd213759da2a2899238969e66a28f5974c8de4a9f7dbe7c9f51d3c0dc6b1d4436c98cb641e1026da7c7804b5522bc5526373d964cffd8cd83e5f645ddaf58dc74b9c2157b34e9c8ec9a2151166042cc54accf8b10545d157a031cf6d71732d39245e6d5bd462c719a004f3eb2f966c3a692074956ba228211995ba9e00d70dba6fbb54c6887c68abc811c18ea9f335fd44eebd793064c98101e37468dfc6cf5cb4e40ccd4bcb6b3534510589527779d6d824cfbe7b0b85e190306b3c593b99ad2b2845c4ffc1e90b40a82953feaa0aa4dc4daae997afd9772677529a9670a420e29502c5d40d8c42fb9aaa2661408cbbc2c9b02044f7addcefef98946aa4a96bdc2548d6d1d7d9056740c6eae4cc815941b54c60c219c46dada44347b0cbbc0649470ca6c27f53f2da02c9305c483419a2208456d31713a36238a09e771bb528b3a766f39cc7676db14448d00d99ced6b7841fad2dc8bcfe257fb23e58de3449a73d734ec336d3374ada6f3889f74a771cfde53c30306f9af36940b8daaf8376e463beb083612ea604bee02f1d372f14645af70e4de1d0b7daacb928aef7576f0826ef963c99a962467f78eb3771f6cb9e0d5b239bab7f3527bc37b4f4d4845bf2737cae31be901875c9b40e815b17458bc573786b5edf3b9fbf05ebc9e509fad2e9c46e80e17e5ca0bd712276bc84a861ae8551e5ad7790dba34461a2746420d66a1267037edbeabcc8c79a34a51bf069b727b275ab77f2c0873c35493f6671763610b04c796546d40e57c1e22caaf6ef0229763104f0aa0114b4b7ce1c708747135f6b7b99134f2f07875fc168e54a5a44d7a5abb119f1fc5064304bcee5d09fc9665d4984fc81165334062c4d54f1716ea83c421873d79551ba85fba9a84761f791dcf289475e723d8bcaada2ab4fdb94a3ea741f108bc153bc3a7ed2d6e0538dfc50147c5e8c1f220b38dacc049c1a0c33ddf70afba03c19ddaea89aa93493eb00a4c73e5a4e5611e85e0fc69f0667019459784759170c3f64b25ec07d5d2fad91fe0103c6587d2f6b506d10d2cfe797534be91c1948bee6c4df9d76ba3a5756357e33be1c050c1e39e5fc9de7e872ada22f35862ee39b721daaa3df152e48e21c231ba06f7f0c1b1bdf41fe74d2185e9b52911c70ba4e22fdeb55ead4a91b054570fa37ceb28188dc7d06c9d8b6988a06384bb9c89b593388d1ac128e1040ba74e5ae7f42a2e5ab0d68195faf624e7caf1a6f9099fa22907486fd3fd63c2c2f155a2a2d4e3b8127758f5cb93f046ef3ecc21083d52256c40333e595740e6e8980745b5e518648867ada92f8f891794e6ae9e3395b53b19820759aa9bae2f6dd9610ed1117696400feb6570e24678da95d2fdaffa44134aebcc9d8bbaaa61ed8cec04e4e735921f154252a2df0ae6ab7ab4d235fbec5778015a7cfb9c56d8f5a2a3d270fae61371c4bb021a9c1f05be688d69f9cc2b066acaf9f09c862a3a11765e29a3827ed68e3a22f3705edb6ccb685e8e7dd043e435b8d6826e243b806557206951045eaa3f023a28b6356c72409e1a62eaaeab661100b5dfe43c0365aef1cec73a7f99e1898c79884367225740266f2f30c69a659c491cc06f9123e3825ff08ac828cc8dcdcddc852200e1fa39fc5b2d3d1e56b27d52bb4309f9908d9054f0d6d92f6df27d48a1f5d5ec66cdc3fa5d1a26295c1d6a11833d2c7a58544e3f573d12c0a7f8dbec4ef54913ea3e4f44cc91b0ca2816019dae2c8c43bffb77a9ce096124b01d166ade67e55ca95c7e2af114ab250239a2c826707de4e6f9886aa36d2faf6f02ad23cc020725c7804571dbec92819436aac0eeded6f1958d696106e00c0ce46e503b372bd6cb4b428fbca8dee6ed917a544414a95fcc2e37cf8446809f48d0917e8464e838a0b9d05bd135b17ca1c4bb095d17427f29287f314772847c57b0d52c6938cb9b497e5e98444059b2b60eaf0bd22ee3ba495aaa599f7639b11f8b165a43d1e26a66977fb32e2891c81edfcb9efde88f25d8ed50e3f9a03449589b417eaa8cd97bbc32a38e023d93bf3c6052fb83aa5f051397e103a6c0e7514075a26e18260e2eda495f062b03ac50dde56d302f09ce1bb906080e2258ef1bb31569732ca14a59131fc8171f0d3a3d488646bdc405f1431d5d85f5a94116213e7b07af97f3b8a4b73d202ce2eab732ba67fc4e4762dc652acc27cab330640e04d2fffba43d5ac769ffb23c76fba960a999ae0678f79b8cdd1256aeb0bce5f3616ad2556d6af9faadb30b6ff9246375860ef6bdbe65285e1ea58183e1f6468b7dc41851ab5688ea5eca0e35f249b30539791db4ea9105f402bdd5903671cb2507336fea525dedceb14611c7daaded32132a85b6ce822f4c1d1a0b9fcf49c50283a86dbda8a347ed8147dd34f361f5909c71b18be383eb0dd16ab2057d9948d2190617ca629e4e7a4dccf7de9264b064577f5fc7a2d015ae78fe9ee0061c44b2c6d58d84b805e1e3ff91adc25650f12ae28f672ea3704b07dcfa07208a45a1a1eb70c54ee7a54bd5029c5d15c5502d3c53950e3bd4f575ebd77cdddd73aeea97e8b9ac48820517a167949b57e9cbb9ea4bca7076094b4e3ad710f19570c309f2591b961e1c793e27f29f91a3dcfbb2d87bdd02774b51ba601a608c057d4c6888d3ca427b55f48f2014095c6ee775ee5bfb27159ba8fb6e90aa826681d2e87beab60d8e2e1feb4b4bb341f5b35bb9a6afb81ed0937ff97e3ae1b606500bb31e2070adf43f5d427ca4468ba875390d4b44baddd80cd2300d8310f2d9a4dfd1f3b5c286f6e2cacbb6112f1a62f309c498ff7ebf2cd843da3e00831d9569a612dd437712e008238ba0243d1f1bebb2ca7b27ef95f8616490c604c8aecfe47e09669c5c6c964f9b93635c5d6310d5b859884e925b452751fdc2cfb8fafd0f6bcfd56468251a07e85ede9ce7ac95aa8618978dc491e0dddff1d97ef1b4568a4239a06635e2320c21bae9d0232bc9e6fd3dd1cd7609b7196c083249ac6aeabeb31fd401ecf394fd2e304c01d019710a3fd5c8a7040b225ab88f3e2ffdf2a71ca4f7f0fdea8dc6b355af5400fc0b0eb9be11ff11df62d2ba260a14d7d72221546e82030a1a039121ddb8e4fbc7c04dd8a16878b7ff78b4dd9ec73b8ee994541ff417659f5e0483995d8cc05da49cbc1d77f9cb27f6283925cf0dcb3ad1a84b0ae039ca3f3551f0c6d4cfa73b13ce3fa63145918016e85ec46084c71a0f2aa6d65dd41d66f5c4c9adc1f9c372b9c72cf36b134ce6107eb36822500daa9e09f8870eee497e4dc4a40de770aa5c22af09aff9da2f8ba2df178c6726420f92dd7b77c92f5595b5f396c48d07015a07127e5328065acfe00ae2fa0bf679438b61948d132ed47c116fb5a011d0d5be380557ae993960b8190b54bab868d98f4dce6e9bd818c11c405377854887736fe9b7e133f21cabbeac7ebd1319a34f0742f9b3c42e14233de2312fc642e1d56460de6cb25c80507bced8c5c8f992a1e1f022b57611f2dc0583fe3d25ed3ea8ded8f7d9ee538e29b450270bbddecbda061b539b11ed555869376f12a4400ed63e778cbedb6bf6aad7b0fbd7ff4ff4b86216043501064d495f04324888fcc70690459967fcf3ce0f1cb1acd73019c498c8e56a519eeb7223b137708d27d92c319019198bfbd3a029cd1e89ecc1a5a7cd1734bde1f7c8c2991cda38a2d618a15c0a72a6098d83af4bd497599b25fd914d9946062424241834884ccd393cdd5ece1062ea27e3934b388f1990ab29f36929e03b2ef7e7ad8eef50538101f1c3d37ffcb1de869fe6bd110822268e2f70a00da5efd1d1f2c7dd030ae14df8b3c60e490a04e1f111b0a43f8c8dde7d7ab02d6f44e855bbd06651003d3f2f4e8926372a9464007c0b880e50212403d2cbe1c48b8629e165dfb5e935f134911f6c9b5ab0f608b4c9db5411a259cec59b1f72204fd7d752f5298904d6921c451108ceb509227863918d1927bb778614a650913969e6896da905a962e9c3debf6f78328bd7ba0a6bae03584f7f34d1b042cda252fbaf82f5c061252dd39054d4a9e195b1c842fde462bace45048e4dd717fc50e4e049652765583cb86ca9cdd3f702fcaab962dc30ad52d3cba43735a53ecf4a9c888ecb53bbb99ee9e44cec222bbb340d14d3f0897a3d00b87134abd1ffc6e38ed1236c9b18f5d6e8637f03d4de1ebfeaf3477354f1dc50e6e32d64ffbc43f1ea7651f44817aed3835b941c5ebf3b7f958998c14a64df050a2b05dd25f6cafdc2e389a4dac1c8bedaf275c086b09998e44dae889f6a774b3e927920ae865141e5493a72dbb384d85f24afb864e3abfeb8dc2154ad3191248acc386e03f6459cebea6def14e41cc66e7d346962fb591c1c05f4a198b36ba5708f05a1002f7e080fa4c2b058d1dfe816a4a5e7d0855989f742219888181730a13c73f6c77504c768d73bb2e125fdaa7724801caea4bba3a32a86fd4272ebab44fec1343c7fed6dfa44f3e2f8be85ca68539253092486c2eb4db64080cb7ac367b45743d3e3c5c2062017f9387de2c6281a96aa1204fcf7acd43e6da76eafb3b56606f93ccecf2999dca92ac453899c7260fb23ab8a0b1a64ddcd7c94294fcad863d72b57d9e01f6c809fe5fadc04a0e94651a223f8e9c416a9dd2bf1e12ca6af0be0cefe84c9945b0b4ee550d72bb273bb6ad98c343c4b7575117ae1dfa46764b43f6300444c06df223152dbc37ba6c99a9bea4b6c72b71df6e00e0261b587991b6fb8df5b210f25a49571b27411b0f5b7a972acdf16411da99080c8a60f5018e450a0002f102c1363d90539cfb4aa0d0d512824a8719175029bf6bad3d902cb5ff84181ead7c65b1cac056ed4bb2ec71a3b6c7bd2d1583f5b8eeb30ab96408dc9726075363fb2b33bf8185d6b188fe46b9b52bd63e47b72e7436cb168c11de9fab5e265d500ffdf1b0b5b21977096f474ff226d2521fb08e98524101b0478ccba93f62d496c10389b6c4cfa2b7ee340e3413306a3cdb8e80a9dab3384d4905372f93d734513a0df32b0aa8880be8cb3d1a50a6de597b4328aeee867455858e7603dfca9c52368678e9ca5747669aee92ef00623aee6abbfc1a6f4373c5726076cb0ec73e07646849e487d64af3a21f38cef22d544c662bd22d3782da8ce452241be9ec0f3688eabc05bb220e16a176f88dee49d71b2badfeb54d39e46b1165ba12460af39d490b245a9c156fd0c1594ea2cfe325c686f4d622655c19d2c415a185da89aa6fcbecefc9c8c006f9f0218de4a05de64bace117c1d1b69c7106b3ea5c43e16b201223fc33ec387b02ba1d99ad24f2ca41fc04068430f9607732a2f94fbd6b1b0dd445883b6bf27ed7f99c749f7663999dc58c06c420b27c4721bc2389b3ddaf0ff03cb00005f7545530f1ee0ab21b9259d3e56cd1334a341b26278c71af30578f861d14c83adcc4293bbb27fef44fdfa73b04c83fac4b2bea87c34d9c706734b7f8fb4101effaa4cffe36b00520a096239179d5570d28bb1a41c0cecc64b6081093475714e302a07532164b6959bddfc7e5818cfe50f3161b9b9c401ca4bd26596ff81e4b0b3b943cac593fc98b33b871c65f06a9169faa38a6dc010e7932940240067b14ef3a9fbdaf4c43374864a7885daefcff87b78c71af8741f98e0be12ddee0f3df9c7b4f24cdf577943344fc2c6104a86cfdc19e43ebfb0854408ed48e42867e5f50e8c7ea879d7a037a2e26d4d54e3ef5c1bb719633905a4eb282f25a89ed7947d948b0a970407ef2ae13ddda204e176211ea80add780fca791b1865e4035c05a72d8e63369c6707c992cb66af3ece036a15492f5bb1cbe551e3781d41bb5db05e659b3756c32ceb52f082ead139e16685184221072c4c2d84a75bdc284a7f17f9345ec9739b37fefd6d512dd8fae3886d99b698fd1e0d5cecae24983bb68d591a4621cf812940b4b72ab8bd9917eb5809cc42808df5488a7bb2fd7073f2dda58c808c8d2e6d0c3c79fe6a1f89c4f07c7bd03223f0feba1df50503f0dc11a915e25c8217898676f167a3d9fafe2a13369b3280ace96ac5c8d61a0e0bca7a499b2a07742b5683110f0f8d2c36458ba534704cc6a40fa9fbd7eda254c17f73d70a0297cb613c77969b82060c9761bd0118b229faee8e91d5374c018aebff6fd9e186f8e0811ae8b934cd1f46252c042b74617879b8a5a1ce376ca8835d049cfaa9150bc74322401561be6fb1248751a8941b05c7817d385e6e78fb4b4c9bf10630b6f2b1fad922451257ec22937b41277f27a699a619043d8d3d5b3ee9708f5f6ae9da1be6bea5bd87d796a35a73da7bebd6ba5a5cd2774e7edf5e36b25405ec3343baa28225cc20637c8cc722aaa579219033d61c3c938b2601e3194fcbe971bb395c40e254d271815dae9ba4116c6f1911d94f096ee1c59fa8cff3820c5aca2b9593599b25f0d72c7ad08447118fbeda624b8fed89ce3f36cdac2773515bd433a4d9ccbca2a57f08a7571b89cc59c58cf2f101a2e759fa9f33eccde671c42d3716084a747aaf371d7c89e2bd6b03c2068b26f1a7513345c20330f25840e9205462cd90c0b208cc8a9bab7a944125f556a65d7f51c2f5f5a90df78743c68663948e37aa28c5fba0238afa62cf7611f0350ea56c1671f03ed71c4035d4d638bd64cd6df2fed1010dee1dd56955b355de80aa729282118ea373d5bb516095aa42764da86d88cd315cce26aba553f219fd2bbe4ef2b4861a0fc358c6388b79398b444eae94b21b714d085fa9688d80a47049924c73239ba70108fee0b7d406df6ebc2e9ba5b572544db7d3410d5997eda339e8bebdb5cdebb1fb67fb848209d6302ea08a0e25724b49d2b2cdf850b31a347fba8adfa13b9c9d82ada179f7437a014dc8139c662720c23a61c9c532eeef5b6ffcd57ee26b60636206939e84583ad12441c5e79431e19a48c7be3dd2bccb2dba796f3f33a40ba8d9d77e73072acacd15bdd963443253a70c804fae09ad861ad6ef45587baf9735cef9e9a29b84d4617da8aa5d7970b928cb6671400cd7fd749058ed130d5d08c82ff0a48641df3ed4d8d6a192fdaeebace6836d25c680af971d774b20833bca2b128686ae944423cb36a9a66939061251689686e6b5d21995fa7b8791c767b6110a38a22e115ae83ce92de5eb0e794556cb44a9d8ed3992b738d78944160d3532cff014806e5600367f2a3c77603b9d16b9a193fb4ab83461097af770867bd76661b9395a93f9a41fcef28b2d241c5d003948820a163d769f300eab8abd16acd4f1b641aca047b94ff4207a8dcf1f20ed4c3ddca5bedef04a249cdce045f3edf09de909eaf870475803ca9d550a5d884890a8719f3c28bbd7bcdfdfa4875c6037477090cd5d8ca3b8f9b48719bf07e91e4fbe97d1e1d91911c17e91aadfbc0c5505c3fe00cf378fff60787ac727b42309639a2fd9ae26caae94abaafaac1e1b553ad32cc4be462fff56626d09c20bdbb2f67b052479b1edd779aefffc6b5b822f0cd5dc9a41d325dd5cdc2651c3f9448b5cc5dde5189f63cf5b98150323b8e95cad0c2db5dadac130b9dff4f10c97615df400406c62ae9626a4daadefafe0cc127dde412ae20a685eeb9d3916846942335e08aec08efba5178a68d4e7633e95caaf0c104c22f976fdc132357ee4b789e2a3d5572085dd05cb8a837da7b61e52bab88f8123df51dfa172c7a0cf23105df83779b98542e0dcf0742f5e459c9b2b44bec7eaa6ffcd81611dbb7dc5ce3dcd24902b4017d5acc3c90ced5b13b8020fcef064ba5f0fcec6479f928a6f1743737ab44a6d8b87c60328eb022ac8df9d4828761904c95c567365cc5c6217618ccaae99b790b3cadcd3c72b012dee0c268f46ab27b55def0374e5f1f16ff30a476d812ba42c9150e2687ab47a9ce0b2bece2db0711b861a1614907a66235957dbb192c6bda8dab25142b94a7c8d1faa475ef6fcdd578eeb736e74df115a72b11aeae649f7f79e31ad0ac6df39a0aaadbcc1c7fd7bf728a0e62297fd10681541f62dfc7aba5fdf3def65dfadf4bb1299bc9c9f289c4fb51753b2be5bf03e2829c5d47e0b2007ca4679c0b8a7c2859338232e1ab41c7162b7ae6d67d07ad1a60ded757ace1412e18cc52df71dd8678d6f54845e66bdeb9fc812da07c082411fd1e76e3ac9f433d641d0aa1207e1640571c19871e6a7ad07cb704151b556c1a3e8bd06b85dfcabedfc2ac9de6b6b60230057ce5ac18c4f43004a3b55735a5305227a9fc9558409e72809d4ad827e278ea0b81ba0d83b4765b0fbac9462cc8f03c6841a34b8fcc771336f54c564ef402127799814e676ac0543bfbde229e918146755f6e91db700017258481947f3559eceff2834141eac31dc9d805a2ef6dbc7811a59013ed683c99b62f4d43b3456e2ad8b9662926f833334a15397195235181370e6a64010b2e491b999bdfa51cb0c07e175c1ff61485e890ce1b9b61e98913618af10f3128a29dbdb66215b79e1753419391f5227c1de4e960cb99477c5663bded92e39573528cc92ca41aad2472c9d8abdb535fc9740b7f84e2895cf9f71f5ca9a6f55c2e8c71b682ed79c431481294eea94670a75e9ae664d264a90a19106054514108af285ed8b84d31781e2219ad00ab71b116fe6df79ea0fb1874fc42a3ca72c555e1def9d831de3c0443bae19c80acdd3cb60c52b2f260ea4dcb124090f9e1d1a44019f6a9259b2d7ae1b3915d322cdc27eb929232a2c15c576f89b14c8390630425ab9f7f228bf4d8ec5e68edc04f318eeb2caae522da51a85863943eb82780ae34509c65690dfdaaad5ab4a80bcc1d8d020c3af5a816f8187b91baa46bf8690ece7db431e351d031d1b3124daccfca358a99568ea01d8d84ee452770913737ea00b56b126d85db15910321abdaa6d7205d8b2e56a45a7d295cf28edf872dad7ee5ee5f9867b78f383986c9d22244e0330776c7509f313f1e329f7433797733aa1ff8991bb26bbc0ccb951210245116c9c93ae41b391d26a9f1c07f9ca51d3d97249f303b3c287922f44d6eadaba2d03821aceb9bce8f620f3f1a91bf8d5c5ff05352356e09990ef7ed16e135888319ca31f6d7c255fe3091f2c00cf1a4ed973fa3e393a442ed01144993fa1c361ca496f85a961fbb5335d308f5cc7de4e0e5e4ae160fe50e20ba47343005f1cf8cebd175c989b3d91b5f294a25050de3c79f0ce4c90f078df5cac14babc8b44d39a7f109b468a4ebbf045066b4ca651090720e85c4e23e79b8857f0d6292ef9de8e1a16a3dc52ea7099e83a279d94ce702c6d0052dab67e51168f16976276d83ba595cf697759c9d7d8d5076ea8dfdbb5bb1b1f954d9d11fb8afe2f68fb4aa725bc99e326de6d42b777a64f5781a9f27b4734b4dec1ee3a0c09ba163e0bac1e7a42d933ef34721a0099134c961dd4c24758c0657118c9defcc1e800e7bc3aa88bac9408fb0c5b4a27f54ea62d1191299bae53745484f2ffa6d51c8e0da4f230b7a9d260af2e6075e2969d1fccbb5446964531c56bf937613c04a0ef5d36bbd72cdb41bb1e836766d3287d58e1bd877eacdd2ea1e1b14a56ecd5d1de305e4b0e766dac49c6034f850836d92c7645514c0d182166d0bbfd85ddba9a50be9779ed4f3d0ed3229216cde7c2a37e72cca441a4e9b814ec337436283380ac62e9e70791d1487933c9a9406d8753614d9d91fe7ada16411f3bf2046563fe8596272026c052bb54a9571952fbc1465f3d6711953ec3","title":"347. 前 K 个高频元素","link":"https://leetcode-cn.com/problems/top-k-frequent-elements/","question_id":347,"issue_number":23},"21":{"day":21,"pres":["哈希表","两点间距离计算方法","排列组合基础知识"],"tags":["Math","哈希表"],"whys":null,"difficulty":"- 中等","description":"```\n给定平面上  n 对不同的点,“回旋镖” 是由点表示的元组  (i, j, k) ,其中  i  和  j  之间的距离和  i  和  k  之间的距离相等(需要考虑元组的顺序)。\n\n找到所有回旋镖的数量。你可以假设  n 最大为 500,所有点的坐标在闭区间 [-10000, 10000] 中。\n\n示例:\n\n\n输入:\n[[0,0],[1,0],[2,0]]\n\n输出:\n2\n\n解释:\n两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2790133385f074703f574c55731a5782802456def33e1703b4520385a146af371c9dda651bd4b838f921b4efb022fe70696a969bd1e10621cea0848e127122e97f8386ec039879bb2ac1eaa6be8c5725dc460bdfd86d69b4e2ba2331213a8e30c3ddea20999130a737789b6cc24cfe920a2a476d4d6e7ba675b941fb00ba68720bb06a27377ecdf2157bd0adf212407a041b68cbc92e5252228a9c10446a4cf3fd92221d7904a45a8b6e37891f7637ac15b57f009e7fa5c54768e86b742ebc73aa501b52bae57761ebbf2b521885dcdff95ce3cf32bf966303b8e7dbc491147734c7ffa24b004752a06a6e214cecf80fdda4e8f348ca3471187cdd3e195698a28e6da22efd0caa9db80debf16df82801acc46cc08cd247bc5e151bf02b6180c82a279ddf73ceac79ead64f887c9c166a879435305269abae66e9c5d0648eefcddbe0a0ec8a7ad046ecd47d3315d6e7affe06fd8615847027380f32c70a53b903a036df1a34795853d333b7f0318ffe61d5aa0a6ea6a65f2ea1717fbc7127da6f3851bca79b7dec665b876f302d7094eb3e7e1755b96e8fe77d7cbeb0ad7fa9d7e3b4d843b16458a729ca450cd2b6e677a0afa902c52f42f940692c06547654f0e58e974c4e4a30bb4553aaa7099c13e73b723bcb8d1cc30eaa25fe656f08cfc88cb699fceaacdb8eea60f4c861cac65f246b73b26def03876cfa75afd29747860790eb52ca9732c0a18e25bce5f129c2c7bae88ed792460b4892fec1bb7e5342300b3b8214ae80211b7222cd0121531e33d0f8c0aab9440d74597198734b3dad709b29231ace95d9142994961c3ffab7076dc9c9d8d2c584e111d2b9433daba4e9a4a5d5bbbc0a708b3448533f14190d4384ae7c9f8d330250ad4850fbcad44a3e2ee85b62e3239acafd7eded7a80ff53e77da4f0a14d6d2e296605d4e61ee1a7eb47b94c3fed901e3967609e6535db3459083e62f822777edfcaf7eaffbb270a7da59d45b71c7f3cfd261637795b52af64ac8b6d03e41c185dfe2fe11d23a66069674b4d8e8c47e5c55eed266b073cb992d3cbef1279365b19cc36e7a20c58388a557b8572cdda482894f109936b051c7a2c09a5ddb24d308f2169222ef8d3e2671825528eb10256ea7c292d8e49d9eaedeee77664db3e0de464502d830b6a290f697afa452f2066c32a476810b2d1c2b692b44b00af448d7f0c3a85b39712a378f0082876dcb790adc7a8c20e05aa6b62417bdb360270c8d9ad1033314faaac7c17cf4ad6c759ec6d78aee9884e83b4376e351e76782322cb4a8369793fa4acc253094d983d88d72fc2672f4585dd783c740ed8c75501fee9eafb19fa4f6bd8a462fa685f8d9937719a79577f7f4de8dd340ef107a8d87443bb6b57e9e881f96bdbc293a01be972520de945203f5b2c7c23312ad8d678639b465e91aa9524f1759fd5d3db99979865489c82e320ab56b72e56d1eedf03e518dde1e075d3efd90bbfbc55d02d878c2b7693cc38473c93e4a6e1747834ede9a13624c930bd59e9fb262d8e80ed6136ccfad8e138cefcb9149afd27e6e4f61cfe30ad95632ff2c066cc75c44893944622eafc4c45efa6368385417d09af9c350b5ae80494812c45cd83683a4af84e7f4fa3d1ad039350c004681974d69ba7c1570fbafc4b6f5be6f6916cfd2cb8fba4a1f34b9c59821719db9018820e9d5830448a151dce33fc14b72cd5bfceefff612812a96516b6ff9d75ce6ef426c43607548e2ae32b1519e624c4473dea1ff14ded833a127bf80ec6d7081867e698aea36aab5d82459b0244c36406f91d3d9f2131d3a7e213b762a2ffc7f11ea16bc4f141e4ca9fab3260c2c0c28c6dcaf2c720bafa09c62b47eaa202b34bbe7aca5eee5bc58acc7d966d705b270f63d9c2a79f6a685aebb8b4e4ac67b86ba8f4cb7ee804aa9eb525b9915a07b08e3533ce34ef085fe1642bf3f79f0bfd7b88006ea579c1d852e859f1c797414ab8bf9402a80844ee7118f630e922922971e04bfff3cb80e6f4e945e241da853698f27842e25c11b3120b98b1bdf8edca734a0345cd3dc32db079e14fae0cb5adbd14370056b50139bc8c61570296f7be9e7e98e040d9ae34f9a74754f2580b793e60fff9e146d52d33bd6c8290d32b1c2ec1cff77f10cf5b1bf60b4912dcd6f05ddaf2d2d97099dc619ed4857520704938f9b74b102e50a51ecfee3288df6a0b3a8f2e4cfe672b91c4b53ad549a17b43c927a797f193b6356afb2bd5a55cafeeb039899847e18934e1fb221700f7aa12bdd2c3b8349748a7b3ffa6d10bdc9fc104f4f282352a6b041a2d66c1992fe0704e25f8f2f49392b3d56a24dc1b227bdb79ddc4ef61eb3396e16c2719131e770ac2a43cc12346fafbc852dd622b1e8b38e7d8b2fa9df1d694fed51e121087815c22963cbfe2d2f96d4a8d45dc635cc8b3e11742d39a75bd3c372229a1b21dcc45787ae475a424c95b8be3f9d727ce1facd361800c9d04b7f78f245dd6893c3ebaa6508ac5f8e590aadf5037bbb1fe0e8e57e4307984d2ea95b1d5b5ce14592a8d9750e6db70613582b43372198cb4130f0d72e88d0d561d70c981af2dc7cee9316a34655adb8d997a50ad4a3cdaa642494b9a458a4fbb76ea0e9244daa01f04c64c4ff126163d0001cd026e0277b253556165e7cd36932426ea6ef74e2f485aea59a70ab95e2e5c1e74773addb9af9e533a54f510ea0575181051e50d3e9be0fc5a1714054b4edae6cbadd402a6299d420484bac631c86544b5c6a755e14fdc1f3ee75a9271ed88df8731d7651273623880c9ef9091fd5d3b9eb1e8c321f88f4f785cedcd51e2328f3e57b1a2aeaf629f429a75130bd0335505fd4d092cff336caee7ec238f2328475b61eb7707958290bcfb6bbeae0668a0387d831dbe1327d7804fa7b8cb64688490b0297058f7277e488cec525265f9ae3146d148f50818eb281dfaa6f7c3f19217ce7c7e390fd6e71c71f8b182bb7a4eca31d6e8da6dad49fa5828dc18c3c8f37c009d54fe2a53c58c5031a035900723ab1435ed1b9a4860443f64dc8f6029e27a822b46f09da0d2ca010f0f517617dfb186e495c95e8a41e9052ad0c7ff91bbd4ea47b5ea8476cb46e0cfff0c4b1db7c306bb20e1e97187707535a997496345a78d870364782c32eb8b39bca26b1b920d98b5b32777879990285c418c767d3ea33248b87c4fe412c32cde5435ca753a004228ed4fc81e2cd6b81fe8cf4f041d4195b93d7bff8c005e40b7e650f1011f9f63fce623b5c3183d725de542c6c8e4f1780cf494b1d61bc16f33946f7d96981223e156bed19427a160fe5aca900a98a5d47473b5c12439853f19d01c991616b18946e29ce32fdaee80a410d4a461adb9c47df9935e47118443dd200e3d22c495d5d8d091588f6bbb11b62f8854d7ca57f99caf77048280b20cfe907a0883d24e73245d48e5ad674d2f6a7a63b621e67f7b3188e5d1ba77d46232b2cccb369e35ae69d2d77aeccc2eeba9da65489a4b9fba5ffe9a0f6b44a0f8394293cdd172ae414b545c3c38defa43b52c58f5572e96f51f23368d3d81f59d901489f8ed6acdb155d45f79738a7426f1baae01eb87193b5d9bd67a9a99197eed9f2c3cdd2399ef2f2d4bac7b1d1a3ad865ce0e037873d0b67e1474295a45b940cd77538be20113c1d57ec405c32e98c9ea6561c68cdc0148008c4e903414ae7256c4d9a3d81668efd10eced5b53b4a8877139659bd4c7f25649a3c63ffa2260032c8d1ff1d659ba93bd01a5d40f7f0b504b226c19139910d86cc7bef69635b5009658c0e8aacef158180ba6f4316fbd84a0ec466eeb92d148e9eabb2b4cda6201435d6b78f49ae7e36d8f82cb0dea892b1bbcce96b4c97e353c0d5cdd1db5b6ce6ec4e42c7e535d5f487036c97fdab1c705a4b1dba9c20c64d2d83c52112e9b79f1086945858023cf9268b5fc752eb3ef49402e5be641e503528b194789d1fbee9a575a4ea3704e3e5d659ab26f42d660abd81bad7d7ebd85bdc005b3d56bb5d7064f6cb17219dbb327c49cecc628fe5f1a1477f91633ac938324ef71669933b57d4e6b878cf1a30953bd8e44eb6ac9eac9142b4e393790f6c3d8b2c32b4f33e6f454a498264af853c198d84c669f5660cab018a85c67b23c8bdb978d3f706b361ea6e88dc204ffe4718c399352faf6789b937845cc9fee1d1b541a627d5b79d1ee96a2b105a2bcec30c6d2fb81fab822603a5b51e22fe00c26c00ef79f1ceb8b594f0966be179a4320d688a6bf8052ed8365007d2a4dc15f68d8ae05a8c0872b2d74f062b7618829d669ae3721f4ce7688a55d1f74b427e60e0ae28eb7b8aefc131ad14e024b1c5d5e5d1e45d8e6930e843de9487c850b10d78175641b9efb2eb8ad8c6b948dabf5b6affcf93e1b230c482b10aae70b65e244b0f2284cc95762ffc1117b731a40035f11763c190ff4f9b5a9567563d4d2cce80cb83f2811873b8add07c13959e289f5e44a954e2d25fd4b4d8f3875567414c520af3d8821993cd30e9a15c8aad7b0bcf2af6f3010b2053f0a29f43e2e53cba6d7bb4fd005c139366a1edc827f063a5e24f295ed5f8cf6bf7cae52cbfca052742e0e3fe7f75a3e4ee5f0e33cea3e1da4a21035123abd595dba40669f4a73d551a9d55622916697ea79f856bc83dfbdd36353682fd2ae70cfac763281c24ea033dd4d05116f39ecdde0013f98fdd64d3492528aedbfdf3b8bd52c907cd437fe6997cc549448200d03a12964a3e356bcad2b40b7eb765e93f119310698627b0881051fdfa5b8fc9d13b0ff2ba753d32db92449880addd6d8d5334781b5c3d25a711cedaf301349fe861cf656ef9992fdafc74f7eb2eeb91542f0f2af85e86a308d99a8bb4fe8a996b894d0b5615fe406949d4b75b5e1947b3a6d063248cb233c791df9b24eff7ac5984b87a6e96f4f56a3d7485cb05d1ef79ed97861df1f35058b9ca565f97b3ddc750a6d364e440421467eb6d638b6940c399d444ccfdcc08adbbd33d2dc36433021946d5a5ee946bbb2c3e3619d12c7565fc678efb134a399d253e5e6d10676076f983305351d33753d68994c0aa03a9f453b0d02e8f0beb15a12276676923b2b1ad19b41aecc30c1f36645e76d384a197c1c7e4c644dccbbde5df116837412d820d3c5688bf0d7dcbfc90f1cf5ccd48345012ddeaeb1ab580cdeca7e4fb6171752ded65bf321ea4a71a0cec013f2672a7dcd6eccd06ae81fc8d8395ee8f485e0b0cee3537112f30982ecd590106846f3e54634c76682a2c7e8e1cec6a9c9906556451655d3648b8a0085625185cd565b0de30addd5b3adee0edfdf982274498f1feb6570ea4106e3b2be6698b0fb2b8f4b49dfebab0a8cd51c59d5cd4ee98d25005eb3a1c638203521241cddbf744ad0570bf21f22bbfbf46eb96cde55e55b5f8afd893a1abc914db1a6b222a43f5c1060f478ba8ad4e70af5170f7bb0291245a062756e47eafa3d9d36055cf9fdbdc89df4bc1816006711b80dcbfe343f4214cd7a1a2c6ecaf565953c81974f0c1adab058fe8cea75fe608a5a6d6c166c0084c92ac2b289e5d05346094df2e01e24c16745d4d736e4bda54169ac567d89babdd49a3f90857ba29d6c7ef0d941945ebe779f40dadbf66b124b360f3016842c87822761aa4b5522bc5560786fc616ffd9cbcaf2e06fc2ae1d9331e0c301732a96cef78079160e75109511a982c14d310f092a4255a4cb5e7c879e0cfac4f0582b6cdd11452aa8e834d5f6db0d541fbd38d610d004f4e5396edbf7e09f4c688783dbe9c05074aacab88b7cc93f1f17f1e7569fb4f3de17fc4a1663ff864055216f4bc0a2ce9d67fe5986827ac5162c463e94f492da254a5d745c387919bab769c6503dd2535bdc2031419f0d03345cb31504a083b3d0274d51682429502c5d09d0df7de9faf72f5b51f9f851810f47585483e7b6da891d804adff39654d47c1d60900f0f5455ae499943bc4373982e029c47c7da5d782f02c38e64cc61ca6627ad2e2dab2cca14c48910cd63463c78137c3b3d4cdf29ff6ca1158c7d785f33cb7c22b53204841487838e7a6754a088c7d280ae02af6aaac3f96e9a73d769a83367607ff8b09bcdcd1be11380911e865147b7e8659c5881a0be3327427af103210ebe2427b951f4a64af74519dd37ecc3322520a3c6d7a0a63b22eaa86ef963c99a962467b98eae775329f7b98bad3fa4eba9407bc37b4f4d4845bf277684b01bf40197769b40e815e07a08e94230dcf8e5b8b5caa04db4821f93f16ec619814159a1c60b9e46292d8118d503e1410533983541ff7712536808110322e4603162fcc0ef85cf2dab031feb0fb1727b7a70b77f2c0873c35493ed0245632b0b4d8996067a4be16d593edffc0aa43c9731551c118a114b4b7ce1c708746234ecaffc8465bde16227e951ce13f1ac1c3327c001e21fc806134bf5a05b1fd4d248fadb7abe532e7a0b7895d01b1904b1829a3d8b30624824e839eb8bf97612794d8061da21b458c3cf818407b5f4a86a3eb56bf108bc153b9e8ded2d6e0538dfc50115cdc7d0e93de7a6e988008ee3f5749124b1b25184ced4b8cbef924f22b8400f26f9b5b62602c0e3b637b8233e76169f8d6fe65a9eed6165ac47fff8909849a1105f2a82d9adf35f83406ffd697e34fdd485d9c5e2770a6246c080a5352317a97ab7817ad0ea8b59c8900d8928dc5cfa576cc448972b1f2e9067ba0407f207f45bee65350cbbe39165812bb5772e29dbcb5687406ac6070dc46505dce7375f08933ae2673b809c3de50742de1c65e72910607b6c60f016c33c69dc0045c70424","title":"447. 回旋镖的数量","link":"https://leetcode-cn.com/problems/number-of-boomerangs/","question_id":447,"issue_number":24},"22":{"day":22,"pres":["哈希表","双指针"],"tags":["双指针","滑动窗口","哈希表"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。\n\n示例 1:\n\n输入: \"abcabcbb\"\n输出: 3\n解释: 因为无重复字符的最长子串是 \"abc\",所以其长度为 3。\n\n示例 2:\n\n输入: \"bbbbb\"\n输出: 1\n解释: 因为无重复字符的最长子串是 \"b\",所以其长度为 1。\n示例 3:\n\n输入: \"pwwkew\"\n输出: 3\n解释: 因为无重复字符的最长子串是 \"wke\",所以其长度为 3。\n  请注意,你的答案必须是 子串 的长度,\"pwke\" 是一个子序列,不是子串。\n```","content":"096221cf5b628be1e73e8bcfe626c73476993342b3bd4c92620b7d4d2211716b1cbee358478886397179b73ea41f2d8a696e65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dbad039033bc36daaab0b98f4a36dd006fb2d63920250f70bfc585af7bc641282f43fdc733e4ba8a61e819b47341d1e2d7e38af5dba748b641fc04b55e75089947caa9e706624c22d1e48d141c0f134912c68c734a014ea5cf657c0012df8bfc375a3510f230af3d738b4c0813d472990e5dbc0fc0d12c27f0211f36ff07a335647dce8376289680642b17c29dcab917d1a142b7fd1126ffbdca88f70b0845e38dfa4b661b49c021774b31fdb57ac3d3b1e03bbf2b226263493f05509a878c6fb70fff308c9e9013e5c35ffb3b0dade66bcc93cf4f9a561718e1294ca5cb3c289ddc46cd9543eae0558949961366829a3c00507e92ac71f8c9d8678cf7efdddf84edb870d64ee8d6741d17d6d1affc3cfc833888542733303725bfe973a2da7de56546753a38e57becf8bb61268a56206fdf3560d294ad6a54b2772bd8583d99c1b7ff5769a9826930065105b69640427033b82bd6c6081b8ef3d259fdafd4d1a57ae400782729db540ec1bde470afa3b007c63375fb4a462f1f5e7868f920e8ba818af1f77dcf945b0a099c1ac7377e2bc28c09fecad037550728b2aeb39529bee6268dfb2c04d398854c9a9f4e6223f515804350dc6d93d0c848dea747451618bc8937f08969c6bbcbb9fd7a6f536e78e29886326b641339bf98391a73655124cb61a9e5623e1747e37e5f6e5d51c99b9db2de371c221d66ed2d7c60f761d7898371a61072457090c073369eea3e01a9e4afa1edeab222a0e663997ed2d9cf2850bf983270881f8deeaafaa8401896cc11940933e292a10ad405683b062759b566f8ec339b2fa9559bb7af63539775c3560936e8d1e8a66f7a4461d63f728e4196e3e2d70cd350b1a43ef6d266d82c476fad548fe890fe29e4eda4be1424505acb4470fcce1c4dd48c258dc277c9cfc35f0be77b0a11382a1babde390120c7ae267b501cd16c9d7231f440a294e43d3c5ca713d50b8c2cd9579470c6c4d9883819e92fd18f8fa46312b62c798d11764827e55ae8048864ac24fd3b3d8e92b91d5517f7d4c68770760d4768e4dbe98b91b481f1795903fff4c75dd50a41266a52f3a231ad11f20b4ddb234c8ec863432644bd36cb4bdcd4cd8d7cdcc785f01249ffa30c96729430f62421e772a8ba16fb2f3f63e24494f38e0cbd14ff8bc6fb451b1de7bac7d97d1f217f096b51e9bd5b1abb7be5542df7da2fefc1dd228f164fd5c4e892a2198c073ba260c71e1b932dffebf7a7983510400234618fa7ea0002ff10571c1c149c2150d850fbcc9831da60fccbf9c6547bfea40dc3a3551d1d756e3166e7a34c6cd8dafe8b332156cd3122afae7c68891facaf3ae2316d71ef6d9bae289a68a455bdd82c2a15bb4d7409fbba2ab90b3cf8ee765775724f177c9cf3f19c7886075f0e8a456be95cfa146c8ec559a8c7d8d981d14be527e7bd2cc633255dc56f04c7c4d234d396cbf115a99e117b191ec68679fb257aea405678a53a5ee267532a79bf86a753a6025b6a2a0dabe5f09d2693c6df51284cd9d7157e83ebfa99601bbb1f4699145c4724183b371f7e749985b8382b0e129808e96e4cd1da560535d48d9c9720c0163bf8ba64d73c66176becd435b3d0d077971701f25ae4ecff8730b37ac01d3875ba9772e9fd7c230c25673adaee7ff142df41433022e6fca81094a2b547f7361a19f8b571088a8a1152ea473b65e28c72a481f0d497084e173e91c3d3ead5b1b2bba51081e17c8d7ccdd4eed0762832ccd8a5f1c9533f4abc90e13f6b6aea61ff72bfc8a973053d70016d3cc93a614ef967a3719c11af34c9f83e2a5d012454ffcf03a3612d01dd3d13678f5c7b89f81acb08a2ce45c7aa47b97d4c3a849911f0ac577047071ebc7b9124920fd6545bc9b22e1e72130bd4960741d06dd667a35698e2ce70602eb5bf61f206220ff4746848b9116c89698a3439da552e66f0c749ebe2bee87bed710edbd4758042960ad5c8cd6bdbac133e51380415dc8cd87913672a3fe0aef4a40c5dd5aa01ce2775106ac5b88db169ffc2486d029c2fb29c7a037ef48ce609e70cbe6abfdecb4aa991799f3a40c6857f68c35ccf884bb8007d650769d2db9a34a843ef4750a9b0ef38dcdc87b3e1f2ef89b829a23e021df9548e3da93cdf4b79364b623753b2b5f35c4397a98410c4e78c2558f06f1eb1e4af88961c8918b6bd46e1d20a8addf06f73d990fc9cf8c4e184dd637eec786b9e9341364957e87cc22f707f6a225ae84284bfe37e077251f9319235fdf6840bc40ef434b0862f0a0b86b3a652216aa97be40c4a7614fb912fadb0153a46e91eae6b0f359f0ff6bd6c63eaa3101d13729863960b1fbe93a3f5ff1a82b7bd716a9ac0975519c479bc419fa1ab196e46a412b639a4bd5fe5b2c5285387fccf6cc07442b9c0e8a965ce0ce246ce85ccdf2976f259e02735ea98b01cc0b655c3859a9a67e95748589884da72a99097b7eff2bc2b0ccb873578ad4c4858e522e609de0b4eb5737da40e8ff2007d5d3a63bd426c5106a3bf133779d5690c43ff6b33b1b0628a378eab1e079e80b440dbf78727e07734a9e6b18c84916bc8a296d40b6db51b55414a3657b8e890aef58e68beb1313c7f417995328aaf855b87ef5dfed3c77e2f0a99023df885fc24edee28fadd85a7d55e58a6de9655ae9b1cbbecc6addbced347653773d86ee7bad886f862ded6f30d6609880c5a61cef165757c749517d7f41b0f274034094388beb25549efd0c97a3bfc748e74d8ca2d83caa0ff002e011333ba134af124dd4dd408e815913aa5a8e4e08352271b7552c64fb02f1de0397db3adafb962b35b5d9368fcc08d60ba0785a9433f0949a3a9ad6e25fbecd135ca1f5b333b6503abb9e9cfc1e90e4d41baf06e23828e62c2a32c4d38099fa95f001f701c3532200e22c358997a9364ab655fb2ba923b644e62552d0cee324ba6e59eec5a63992bf287628a61e12dea3a33ac4301c37beb926464168824070946fa9b8354cc7bde684757f42ca41defac39bc8d20da93f0d4a69d8bf1e9c32bdbe25cd9809580e445c042a1b2c035f4a58236552394a499ce2a7f6ec34a50aeb79dbe2da20588b148dd10f084bdee66dead6891c3a35d17caa06dbf22f5a6551266174d0fe70a3a1a4c55bd238f815d10640a50cd0b86999acce3993a5c9d841ab78ed2143c8d4c98c1e677848d5271490f128f72dd669b93760f8310dafd979f1690888b83da3e314bf03561a5cca5988689a1049c280cd22910fdcf823fedb67d9a3b06598d95cfdfaeba5359a11a15977ab289a9935dc65b11a18aecd515b9d33653552bbdad642988c725e9014d3edce4ca8d810a529d650687af29c581512e8e55d43f543e659b977c047251b44fb2997fe591e8f6cb476ab76cfd6903a8f86a546f2b1512628c432e7617600310376e098eda6901e3ed69d9e8b3255ae05506035160a3ff033acb71cc5e58d023ad1d108b8c6803688d8ed1be1ee0ab8c5253813f093032cf8e0ef53c86e9765fa3f69ef0f6c38899f35e1da532376b427e5f0a1800fbd143919c36fd66043abe6e1d3f3f9cd901b61d19e2702d5c4748a91a45648cba3223f45900f3a160807e87e94a2e52b34b55d30ce149dd27994efa821260ddc8bf2f97945ca6f48b0c62ff9f2960297312c137bb3674c0750f118f4742c29feac5f6b9b581ff5d8e54ab1951603b9c6fba60976e166f7b46cfccfc634f99bb1e154570e744c1545efc2c6316ed23ff336f6509f18d8f869a2730a2d09b1ebdc80a7be0c93b605437a598cafe44d2291a07810670ce85eea793f1eba7c327083b6ec30f381c254ec8f1711c6c56574b8c088b3ad8ce2fcf63e8e31b83b93102fbb67526a4f220ea6cc4de07dd92614d63795d9882dc57d70b310560d7e23e8a4eb86d638227fcddb79e777b8d7a77e8714eae8ad724b897a7ef349836050166d12e7d000da5176ff386dc8b6fb626b851da5d2b31bb0f340c869b1e13817ba904595d3e2f00333f83d1d2d1b6c3be8dca7c3ab66c4aded74cf3542351c49f6eb8d00f738415f8ae6dbd396bd7deb0af97aeab5d6270389f710ffb44d602be237ce37671bfad49553c9bb0fcd5fed193af267e0e4331db742d0bf745050a0a156db5aeefc8bb00bf29c9af1cb96c45cf6760bd88ceef77ce01848e714f1c1b49e53604a8eafdf7b54081b15057ee7b1f63afe2cb7e8875ba3bd256b44ce48a7c09c2006dc888b240ec7d92e6674e6532531cd4be4c99b4ef97e1e89996e2103a01d71d8431c2deaf21d76310b1fee21f30da3a160af112306d371a382f057119e3b9e8b8bc0b2fabc62afd01378def0ecc8f7e7bbde1b7c5cb97b35429bdd1ab62396712d2f1bb6a780170c955858cd730ad4f7dbe05a1f42a2a682cd565c6f9b277b4a41fdfbbd6bbaef20abc388d3fbb45ee13b5689a809efebca0ee217755ba4b361003f43e2e1acbe98df7448318f0692b785085da770331492ebcd0b626d889ef33fd52d7e1f0412e7d7f55a7b7701486455c2a804af69b056a8f8cd4ba2a9faf0099fe4dc4bc3b04d3da4562ca3facb71caa56f58396f3d33112266897a63ec6b6011881c24ee67c8f4d4f112677ecd28b4f78ddf598442eb8528aedbf927ad3aa3094618700be6496be76da0a78b7ea77aedc2d76f428874d4dbc2ffac84f6f91f4b530a7e3a449849716274f7c5cf90c1cf6328c37e93ba5dd32aff7dbd89b3383193f0567cab4e15060b3bd8d660cda43c628236b120a4f89d0002b11a2d7320b3d463dacc543c1d3ac6bfbcdf2c686d47aa0d97d8401189ba4597318787711ca9abb0ea5ba311dd074e6b226f2d7c12ce482f89ca62103e390c26f5d9e9792226d52b3ccdc0fe3bf0f358ba0339781fab1a1a3f2b08bf81a05d03617b0d745b0cb311552537b22ba4b1488eff5972ca8c5d671f15e2f1438ed59b94a85a601ab3433ea4a031690d4ecca8fabd8eb71ee9193c4b9bbe0dc459ccf74d81386d899876e6408379fba9ea0944bfebef95b7ba23f12871876f4c207beb1d0c3e5ae824e6c5bf4ad9ed41bee029cfa1db84900da1e154b7079678adb486c4356b79cea076b261bb6bb730de3c1f55386fd1f548f68f44dc9a32d6305975fcfe69a168b0443950b9f2a7afdaf0664582d31015094a9cdac4201133600c7aa80444fcce83ba3434e531a284a1b021014ea89f4920696304f54c2dd689c6218cbe2c0e91d1e650a6b1bae066f66207c5fb709abecb81cc1e80f6c1ef1565461ef4cfba5634b62bf1312a6fd571ab12022c18b8e1e2c7c81e5a88ae0ce4f6ce8b6598dcd60e88331021aec5d8a0dca5a95ae3d3b6f91f42707852e1e7b9e04f7dab1a515b2283c1d6adc0685c2b43cf0be9d1ba5f4a2b96606e614dbdbd0731536195e6646c398e6d2d652e6473dd7a8a1cc75e493c1f56533dd1af8193a86abb71f71a46c7702d22b9307aec116693b0bc380a00a650f2b323c60cd932072dfc9649c9f5c2f996c644b2e5189457ae2c59bc1c43ad9a867b29938179f9501c457f43dc910d39bcd7a1e5a2202210ed95beee46632f94b266df000727e72881eedbd9fcab1af108cfa1d8961f0d0187b25f5c8ec9a2d541d7a1b941c95cca40b55484c791626f1890d28d5d742ef89d00c723893150a2cefbc6ff5dcd34e1b4af36cd61d995ba9fe5f2b9da3e0824c789cec8abc811c17e59ff6963cde731717fb831aca9eeede07e73d3c49ff864055732a6cd0a49cfe7dfa58dceb73aa6e62142487e1c682254d56775c177d1e968d7fc60d6d991f48bf44653ae20d5b385cfa1d1f89febbc060190a0b0e34503c4640d78b61b1b8f97e1e46c5bc64890b5c00669891a4f0d237aa4a96bdc2548d6d1d7d9056740c6eae4c9848820600c2406c9414c999477c2936c5c82d9d79c36c7cdf3f2da02c9305c4831094725d1625393c517d66f559a638e95ac26e783c7c8f3938d2591ca81199dab9394654a793c9ec8eba5fb662bde1a60a9673842cb87872296be8f5d081845ea771cfde53c30306f9af36940bc4ecf8686f5b79fd4d7d0eaa6703b150c1892ef2530bf277a29652587aad8881e1bd1422f8cb67f06392b0bc2467f78eb3771f6cb9b1dbe276eabffa4951c37b1c081c4bed627a85b55ee152891fd301ba74b47244ac422b87f1b792fc84a01ff5cc58d6f920cf03ab4159a1c60b9e466568c74cde45fa760570d7790dba34461a2746420d66a1262d1d9a94abcc8c79a34a51bf069b727b7a70b733694e27c35f8eab5c0c49610b04c796543b05a62851708bcc20a43c9731551c11d73b614b7ce1c70874267dedbea8cc37b2a35c6eed568910e4a76f371be37dda51c9061041e8e05c05f5dd3d88c21c9d5324700b37bf86311806a2a0e078c8bbb2b6991ce6550002b3b7dfdb71989e7fcd0984b23c22ec754336a5ba0a874caa798fbd848de942664b31db0a9db984f29064f6291e6434da02741bec03ed042d941e48feb5cb285d9ab90f9785f71a270bcd895a2877fd436b043b169e80ba50f69abe65a134dd3a75275fc527d9e48c06325d34c01e84b438fa85f0d7","title":"3. 无重复字符的最长子串","link":"https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/","question_id":3,"issue_number":25},"23":{"day":23,"pres":["哈希表","双指针"],"tags":["字符串","双指针","哈希表"],"whys":null,"difficulty":"- 困难","description":"```\n给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。\n\n注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。\n\n示例 1:\n输入:\ns = \"barfoothefoobarman\",\nwords = [\"foo\",\"bar\"]\n输出:[0,9]\n解释:\n从索引 0 和 9 开始的子串分别是 \"barfoo\" 和 \"foobar\" 。\n输出的顺序不重要, [9,0] 也是有效答案。\n示例 2:\n\n输入:\ns = \"wordgoodgoodgoodbestword\",\nwords = [\"word\",\"good\",\"best\",\"word\"]\n输出:[]\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f20940a3d41ad5d0658542135666a2c91e14f5686b5347f768c3ea41f2d8a69a8d32eff401fc5a93ce974ffa5f124f52a696a9fd18cf0076dc1aa84d24d6d38e6718399b2438d21bb36daf5aaa28a1435c61d69f898212732066bafdfc9a977d94a64344cbec172ebff9c7cfb1eb31c3981eefd0c2c7312c244f438fa6ac67ff9e53cd8e0476da2a70034ad90995d621d760b27afe875237c64f8b34f117c17a7f4c87a073968ab33e8694df7132958b979f35552ce6ac873f9a3472c2f0cf01ab93a5153ce90672bb6a36b2f38cf9dc9b504e5a36b9fff0734f689d785ce04084bcf8eef5c641154cf15524835efbf57fe36075cfd0c4a65690cf2755b54f1d7b33812827ac25d71c719948843845039cb8e548fe4ea37c1765747c87ee67e0c732df4b75da8c14897916fd323a0530d9ecb4b183821a5cf0ef1b88848e56f325b2e487bd376b728e38d353d4858146a972bb5de1cd13118666a3f62e4cb3fc4dd25678ac0a5daaf7c3fb0eddd0c1ee729290858aaab5e39a0707ebd6d11db6a1097f69712c78d2c4ff333057a0782884c4f4732a70ad7d6121b9ffbd561cd4a62bbfe7db5604a6262c20e53f4efa774fdff868a55e48a7aa9cd2d3b7a7675f020c1a28c88ebf57fe59644262eb045b2321a51c1e540d6838112234377a5c2d9bd70c7d565ebcd4ab54f9a8c61998d634f3f48cb37cf5cda739fc9ed9a5804cea7f691477b75e5c4114a7678b8c26db0fec89aa5b2c1635e06a88dbd991d176a655209e46baeea8d907d06f40d0649db87bca3e124b6601a787d6e92755ed862d945898372a50136c5a3684e9fd0153ef9855e3f275a702302f32b2cbdca6d0c7916003c3753aab814f6ccaeb2ada8401896cc138bdcaf5aabf3448f3a40d9493a23d76bad6a89a0c1fa7cdfea8a0cd522b068d6081cde17462663414961d53970b95294e2d4d42ee553a5a232ebc665ed1383f57dd36521dfb369e6e78abed28fb6d11f83f40b5ad53bebeb95c3985c9668485b11e1984c0f67742ac44687d2ad40ae3e6999b92f6f91601ca3d3706e758799528509d619bef154f07839e984b08db8c46d70ae91e03ceb1b9d169a00742d7f4f8552905fbec8389e44fd8379145ec6d7d50854195af98ac5eaa7a2cee79dc72c520ffbf2af11380dca34cf888ef5ec6b73ba67cff0148c3cce29284a6f41640126ed5e814d0b447b97112603fc117afdbe329e639a8d0aa6a438974b118e3e9776e3800ea9a93cb4b0d380a2b889565843f9e771787f8ad9988ac514a0c94bbf72e380231db8870e9785cfa760bdfb1a91fec8ff2ecc959e6aedb26113c854c163f7e4db75ffc3acf0fcc7e0f24247ee9c573b11d1f63e3eb16f9eb6b193fd6d3a95e7af385f9ee708ae26fc3413756d2273eaac6f8e739a4b19f69ad9c01012a3b6428407bd6ad136aa5c5b1d60c25e04839c61ab57a4d12f0823b75a78e74d0decc01150a5f21e077e3cc689bacae992c66e0be4fca8a0abda445fad9d885350cad87347d992ee41d3309ad8b82ad1e100e00a6df4a98c1ca0e0fe984b99ea7d736865dbfe05f75032d7330966e05e64b5febde0eafee0b934fc0d1a212b47e1dbbbc004d0acdd1945778c629a7f88c03346cd1b833a8347a35f532f183b37d0d328e3aaec67206075a7ace97f41d21e0930b6400df92598c1283df9936ede14451866e0de07afd0e93605cee07590207a020ddc65925fe9f4f37258e625671f641f2f2f54a3d52fcc06c02e027d7c84fcde1af4a5bb47f228140eeeaf64158cc44c9503c9fee25228b873d5dc4945a4d3e6ee1b3d3db8f19b740925ff6726eb22bf4c012c438ad674f7d8b9f2df00ad8c791529cfff9d00ef5fef783a43fbeed91364e69969aed4e565c12fb548f43cb3367bcd978896bb55d509bd41e7df81d50956f435b1bd236ec3679c2e52f90e4de933808d7dd88645a2a10f7502420bd12fd92d93439c0053d3bc2c5a3c13941100e8ec65a5598c25a3352f0698f2a27e79c9628882977aedcc41e61fe67bb104d7e504d1c9ab466c8c2a4e7a70e1ed1e06df937c840f9a5a6a032c21f19e417b1f25cdf50d0d07b99989cdb251386b17b49a6f0ec779b1bce5ac457d6b6cfe5d07d2ebc723e85e20f6c7e6594904c77fd470d855197ed513528d6f452f1937d4a17ede0834b23adff1bc9da854087ffc45bf7fd88df6e327a333142a10604b5540088d7cbaa4d566f3149f02f31ecd79ffb88aa6a846fba00ec25c2069f77b0b7bf3d16dd1d13f8ced98f264b15be8a3194970a33c23fa6859be9df75a5e5b2c3f49635fd77a4eb15695b097cf76139961cbe0d4e1da6e825229ee53027246c8fa1efe39aa8e5871c67efc72ff591ab101652aabf2fb65d65ebbe8e4c12fcf7ca793582708b95a61f3f0f5c228a9e8701295a09683e7861995350b319a92b6c8fe23945b37e9af2f96e26c7d9e7b2092d8aac6796523d81dfb85277903d0c686201fddc3bd01eb31de1ec3b8aaa2b2089a03e9ce35670302f29f586f6bced8df378bea6e82daa4cdfc0fddb0940c0eab0296d4c38f848d855e75e5f65867e1147c1296098656fdbcde76a7fd6fa382cd207d74226d85796a7835a1be123559c2693248f5580cb1b15a8b2885a93b3f9fb4b246ebf3ad53e0b19fcabeaae3e39e1ea5bdc6b63c1c31e1df9eb9a2a02e95195f2a4b348fe04404171c49f76d8adcd87ec1a77abc8fcbf9b9ff5d91f27d40911b6767d01a15c68ba73150e6ac83ff3f58cf3a185cafc7f214ad80a1ba26a9beac554a42d7d8dbe4efe4a44eb4113ce4b33b4b192f867eb2e7446f1c28593415c0a6fa16538780fc057eda1dee5a97a025c0b49cb158306e4b25d94767bf44ed01890b997f9167fb8ab993a5067937300cf91ac62a4bbd3a3af185cbc07fdb137ad031d1a6c657f45a80f50b127a01bdc2d5564982e0b854f47730126f181acfe2c98c9be060284b3638c7b144fd478cf60238650ed1e356705b5150603f4a500ba205a12fc442c72d50d2eaa6583b660e161844841506cdf2fd8860c37687494dc5e132ec7aaf06ac4189f646be29039fc08b2696ce9fd93f3d0c9c45ec11dbf070cd3b824aa4a82cbb8e73b3d3b3d1fc9d94f6aa9657b8b25381c8939eb51c874bf199804c8abae87b01a248620c508b314dcc586288b69ca32fbf44acb230806893a0bbb874a1ee498cc1be1333fe9928c247e7a246513566682fed203a104c35ed62b189434423304acb078f9b95d2b0e17f059df948bc9fd04613df4597cdc77c928b1345410c068f0e9c349bdf3341c444ffd381ef2a8a9d879ec9416460ed3576abc7b0869bc4a601d27658d52309fdaf9065a58016ca271851c7c1aba6faba1e18f11a089768a9928bc412941f0ee4c3f1995bf19f6a5f2377bdfa2b7bcc942bf7441e7998a0e0909c0a42944f0687e2689d814c2e9e4efe15067b31ce927a4d6c51e75ccab363e5c2e6ba8e092da56ba66950f1ac381d216c15452d9d48603f43371c0d203d1da497285198be128b95ce3e70e01847535f30f6ab046284e60ef09e23defd402c9ca50797b7560d2c6352cfefd71d53b833cfbb8a0a2f8623bf2a06f3dc676e133551594f7e2d201df65e722542635f56194c7b0f950360a833f68dab6a8d9cf9f21553ab73e5d575a3f8e3c9b268caacec61447a67fd93ac17278766ed006f8fd39524a796dd13df55e77315cd7a6e9ee1186f25e83904d252044fdc8e6c41ef603f7313f01d913674c0750f11c60104859da59ebfe9fc81fa5d9552bb521e7a3b9c72e95edb205a626611d0d1eb0f01d7aa0f3f2c3fb20a955455fc3d7719a4ee4faea988b3dbdef4d4e727f5054a5cb02d0fbfd0e1ca216261294a05793bed7fee90b009e8a3705b2232620a2f22515f13116ec30f381c254ec8fe7e6ff08a9fc245bf0ef43b0b9847f76c078b6e69a0d4353da281c7fe20a36ccfde50928d6479262a5dffc3cb508c08245473b0a366864eea6d6e826bfcd6b7e23f30bb0923ba3800e986d742f9c32433c00f828d92a92bbbd29eca70d5ff68635877b41ce0738b6ddce7b61125340c869b1e13817bfb0f520f5a7b00793fc3fbc2ca9ce9ecc89e2968f86c079f8f57d94f772984d73592b06c648f56ceb327b4560fd0cab8e4cee581542e3a76cc2633e64cef13b96532b80771eff80b1975d8aad6d5fed193e6682a0e7c20c77a370498542617005235e6b9c9cff700be39d3b509f87156956422fac29ded77c264d6ca1d0a521252cf634ae7b8b9b2e705c5ce1d16be675c2be1bfc7f26fab62853c39f102ffa07c09c2006dc888b209a22992e26016127f5b1384ad0fc6f6bb9aa8bbcaedab496056854fd023e1f4af21d76310b1feb55779967f1602a3122c6d641429341a755af19ac2e3960b2fabc62afd01378def0eccc6382ff0ffa28ed5cca4132bbcd7e73d42612a96a1ab2d2d5c1fc01bc0ca9665e11b75e94af3b0262a7825d52788bcbb20dff74ba0eb99e8aeef0aef7dc871c016954ec71544031438021dc4217755ba4b361003f43e2e538de985bb4c964c876d2166009580321b391867eed8fe7592f6f23dfe5c8cb9a41b7032763baebe5a1486455c2a804af69b056a8f8cd4ba2a9fe30084bc53c0ae2460a9951662c13fbdac36aa56f583cbd9f93112266897a63ec6b65c32818b08e674c54d520c2634b9ddaf033d93b2cc0c26b15ba0edbfdf3b8bd57cd12f871dbe29d7e67ec50e73c6e776a4d8642def0f87014db72febc15418bbdeb530a7e3a44984974462486c4bf9771dc833ea60e926a58f74afaaf198db73a933350fa24e1975e6c96d0d0ba3a47c857898293c12208b1254006511661ded9ae5a3b4200ec6013ee05db51f6d59434efcf1f36d9fefc041e42416493f2711ca8f9601a99196925976dabb25ded50d931ccfab9fd5a0cf735fa9671cc3b516b3948d31749647e4fd511bebdc0bffdef8dfc48c6f5d0a7e132eea3a39b2d659a9ca383f53515dfc22076dab9fa8b847f8e1801cdd2f7c0d68927ad500afcd55837c44f9235b1b15d4a95be381908670b0cea79cd6a4838c70f59056b3589ea0c2a720342d5fc0a9e1e8aa138187832b4dca6019f44474660fff217e4a0e24d3b2afe88c012c4abf72d76be4c278fa4050bc2a6b1347330fb3bc30483c0fadf4b7160f6733d2e0614f7e4bb1594e52c19302f377ee5aac064f0f8f5ecfd0ad178a06429839932d40fcb30b667d0530067b97acd9a64ca187d4c5543c0beeef083a99622943368a818f513c4d51dbd9aab8f815d92909d551785998c64f0b4426ab550130066396631944ecf899518b4ba6f138bc9a2d0f79d6253d6a8110f9c319672acd36711c0dd6cf4c2619c08bb1332d4ba120717f6906dd64cebe5897df6ffbb8320232ed76bf03f14196a215387a8bf91f0c89290b77a623fbc6be60b959e6c799aa48a686f5b535e1969f29bff98db7662dc41ac5e4dc6b2b361949a0eb0c573062152be2209a","title":"30. 串联所有单词的子串","link":"https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words","question_id":30,"issue_number":26},"24":{"day":24,"pres":["哈希表","同余定理及简单推导","前缀和"],"tags":["前缀和","数组","Math","哈希表"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个正整数数组 nums,请你移除 最短 子数组(可以为 空),使得剩余元素的 和 能被 p 整除。 不允许 将整个数组都移除。\n\n请你返回你需要移除的最短子数组的长度,如果无法满足题目要求,返回 -1 。\n\n子数组 定义为原数组中连续的一组元素。\n\n\n\n示例 1:\n\n输入:nums = [3,1,4,2], p = 6\n输出:1\n解释:nums 中元素和为 10,不能被 p 整除。我们可以移除子数组 [4] ,剩余元素的和为 6 。\n示例 2:\n\n输入:nums = [6,3,5,2], p = 9\n输出:2\n解释:我们无法移除任何一个元素使得和被 9 整除,最优方案是移除子数组 [5,2] ,剩余元素为 [6,3],和为 9 。\n示例 3:\n\n输入:nums = [1,2,3], p = 3\n输出:0\n解释:和恰好为 6 ,已经能被 3 整除了。所以我们不需要移除任何元素。\n示例 4:\n\n输入:nums = [1,2,3], p = 7\n输出:-1\n解释:没有任何方案使得移除子数组后剩余元素的和被 7 整除。\n示例 5:\n\n输入:nums = [1000000000,1000000000,1000000000], p = 3\n输出:0\n\n\n提示:\n\n1 <= nums.length <= 105\n1 <= nums[i] <= 109\n1 <= p <= 109\n```","content":"096221cf5b628be1e73e8bcfe626c73474822a940a3d41a850084c70200762692294ec417e86b812b8bc283d9c3b20ab7f6e65ad9d3e03c1ae76b561bceff835f3316e60d5d7cfbc1931cda78598506c78e97c8d91ec1f8b39f421c7f1aabf845b2eca4463acd63e665b6d3ce9914d58bb5fa4c0bcba15478a36d8e122a75a2586bf4670440c074c1cd24b384df500b572730a9f7a273952cdf50378ee9bf20069760327844c48ebe50d6985cf64560026c186c92fb795e777df06336a8a4f2e1dd34a9b0c5e870ce7da2d18d3220525ff0e9a34484f0b6d9aa37dc0313b7f858cafec1997e06cee832f82f69dc686ea05cf34e6f9a75e32457aac606a2541c2ff0fda99e9c7640c446e4b04d5525267f2dbb137fd368d47b4d2c41f9488689d5335eb8d76a121a232aafa1920cd2464a60ce69f9ec651c1bc56eff8784c22a2780f80f246260ce6dafb6d9ab8d403d0e5a3a1eccbb3b41fb6738d946b536bdc84caf19912d032d630007b670f59e5eb04c7f434ae612f3f185dbb7cb3a9a221799b31467155d8dc5c51e9582ac05c62855355ebfaee60e2ec73448c6b312d469aea3a661640a06780fe794783bd8052a6e2f0bad67bbb4244617ed00557caefbe61fcdc968a0fbad8fd5a6fc389323c7f9250fcd0dfa346f57ff39778072f8446be390858e8d943d5aa8c3d3a4f70b6cde1ad71c1d864d6fb49b55d9aa475999565430346258043b2855accb1d3f9deb4c99bef73d402eb014ee68beae4c614b538007d4f2a6416f7ddc21d35685eb5debbff8a935d82c6d6147f1d18a15522f3f15ef4bc92a9d431350796be10bae436a9549d2c22f770d3b53840f89e40964b617458a0b6feb9ba8cb56ce6f5f9c96dd7ccf9cbc3fcdf0816d01c3c382b5c472709e19231d694a82969678d1bf7aca45e7e71d4c119e24e8acafd7eddd7810dd42e75dd750a3af2d0e582636f4560ca08b715f692cfc63a71f30cc99a5c435f6cc926a9ddf70c84a23579a47a9876479fdef08350baa3554bd9ed475bc20706bf53d2d285818dcf7e5005744a9c643831c26ae5716f3f76c8cc5bd8d0678c651704bfd0078c679737df8f5d80252385daa5eb0aa32d72e0caee9f3e4081682db5792d7b4f927b97418fe2729e9f4815e7e2884d0c3681acfed12a76441371200d0a082bf4dada24391abfaacf28b62918546e33695fe039998f1841e72da3c5c1a7de9f81d01a9b19cf9893b3d3684d2527f206a4b56de353e46eed8cfd7814c199a7fa132aa7b9622424d90207f96fe791fd1f7b02aee9e13b2a0225345169c87877f1996c9e4990e57d02a24c2e8f13f97b5f8097d8ec2a9e823837ae4add151fbb2bede51b4648b0bff7c5affb49314d0813cdffea83db4a9c4535e93fb0f53008d7a68fc481ba7a37a38879a6ae109eb0b13007088a8a243fd5964c0cf99ef6cc0d1dadb3618b1a9668f039ab6b551d60e45f39a89c61abb8e7d271510ed8c2d2371e2b9056925ca3c51f3a7135f9a0320c110e5ac921b5fcaab263529753fa82da0a03dd371e5cacfee2148000779afb444a6645800d01879cf37787a9b78924f3c3231f4217a9f75a99615f9e19512ff82d3ba0650c556ef2cdb33ad63a18373845ddf3baf11fd19dfd1545798d499f7f8ecff68c6116bd398303a35d7e36163817d6d4100ec3f8397953193a370cf1f5f8f05a0005d6a8b87296bec3ed7269c50c8892c0d75d0bb919c0aa26d15a63a118bdacbbbd0ac92b9a4d7b26f8ce32aded0f7c356c7d40f0b33fa22244f5ffff8f56333eaae4d8de3f70d4aa852f7becdd7ee76643b971266facb96db2dbe9c3974f41116bc09c96a9988e98a0aa26caa060d87ddbe1e0f93e5b69a086fbafa6116b25f4d2e26b253ea437ef7695cebc7d6c433a4d23fa41ceafc33c67897cd09152995c21cdeff2ad1e42d509b675e9e4a5ff7c565ece4133bef50a15bb430bc16b31c87d12287ed3d1c34a7b99e1c82d6f9b7b55bc1f841ea971aef07d1eaabafd4e10a3866fe81eae4a2eb2e782f087863a27d03aceb125b374b1f846dbbd75e243dab671f3a1c25109c7100d135dbd43f9cb1d0e5f850f12f3035c2a816363bf1566260740546820f7cda64551202c1749b7d31210a50883da94983d3f7e258b714b8ec5b358e9145bfd98b74d086fd017b16384ffa970f614569240a79a6368e4e506d17f4eac6d94e6dc0d0e5c137efe789d72d1b5294a6afc0e774d090c3451196cad0ed1b0b13dcc4917e23c45dbddf0acb3a5b3703e53a3c564108467197758a0b26182ae1fe78b989836a419b79644ede20a8ce23cdbe33705629ce6f2ee8fe06140e576498291403d96da5cd57ff1c9f6c7e9ca44816e2de256337f52cf319004f1f1a805ea1cf423866a979a0b948da85f116a9f7a22e2bdfef12fca61ee9adec9ed28940ca9e28d9d22fcbf7a70ea953212084f987499ccdf71037a3339a212cec23f16c8476f8b9a570a16d45a59031b4c4eaa26aaff1a2d5cdeaecf1e7789d4fb6df65fae3b722f31e9cd3cce4bc7bd685d93bf68ff24780ebac6905d80893da4b3dfc05091334f15f1a8a839aad5f18b858b885f71e5f57d67e83d4012b93c8d50ff79268f303d9b6be5fb6920545119aa131c406dde80515d719d0333319a6665eaaa2ceb25ccea3676e593f111fa93118324ecafa8e6b780a19166c39c90ef0a618d16584a5c39448a2d6b54b583bfca875c8af941748032a48e8f68a8ee52d2dfc6692f08960332c485f9272933f37f77c0eefa33118990c841d5d12ae882ebfeb0dab93b7c512bef2fbead674a43ebd8f9c8eff5aa41872636c899386f122eb64ebfc956a6e1855a2c12ccb0f11653878ef21e73e008ef5b8fa330edb9b3b554017e471ee84a49b848f70c8a149072914bf68d809cb22779033e0ffc0cc62857bc0e30f6b8f6c353f31378c630c480c657f358b5c80b386201b8d6d440598accb25dcc74321f571a0fffecdbb69bfc40286e203bdbb345d07a8ff52639522cd3f5507f7a7c5745224a7f04a037812dc85fca1049deedb654226a0d0d0d44853000c2df14020455d04dc8f6008a26ab26aa631bf40e028e11c1f8195c70f1366e8dca33ebac3d9260a40d6bc7199d79a8785fa56971b75c243a281e1b470280e7709275e7100d6a6630cc6ecd43590fb76f621ab992588aeefffd4efab444a9811a6f6bf71c8d43f1f03ed4fd604a390a8b687eab1e2b785d24d7a17bee42c8e61858656f07569669370131fa71ce186586d4a7d404cf108d8dc70828293a379d23f2561f2eebb511b7132607f6617d255649c2a934e12c985f428a844afe55227735f16f0b555c49f2e1c002d2f774062600114f6fd0d220585ffbe73b7241f15675922a97c1e36a1c341c3f37a9df4a82cd308e200e2f56c3719ef57419563dd0044fe3d1c5ee1222a0b20d0fa730011b3e0a5d7444388e913dc72cad26f23347f4a151d252d3fc8fa1004cf1e2b1d02fc22509c5206b4b7d12a9e8518832e1d982b36a93d58fd18fdb09b9f0251b6095ebfaabbc1e529bf95d26be431446fae86d9a9aaf99ff1a3b94bf0e07e23906c2572cc6ae4960ad6076d6d6def2843d2229ffc6609f0a192fcd9e22fa3183e4704ea8f2bff3ecdc87b9f3b18010f48bcb84c8cfc2ada4fadc6b919d303aa28d39aa461d0f039ce912b72a31e1670c574563ae087967bba5f4d354591ac4af688c7ebbfc483e7eb05b4a17c700df3a819b7fce81397bdfe3a32d89ac539af189006dffb8036a28b5bf4bf004bb7ecab2b5b50e9efc0d5428537b176e34239a13f668e9bc191147fc0df40ddb9ef7cc89032f69cbf55d3189fac0ff23df4491fb54e4e2982a6bf3620e495f5145304954e04fa18ce920ea94141a96f896f386edced4ca38cc532951070bfd84714b2c335b1c24266fbd9d81aa5b953848641c8fbb2ad338741f2e817bd409afa334833fee936488fd4f08baf3424c1e63e652e3ced4c17441e5bdf3a0c55505068a1fcef15d239a64eb2f8a70c36ed62aae91f2db7ea71ddeb265c1881b1a10b0139d6bb725ff5a1e4e2ac2441d1f66f83819ac9095ed40d169a536b57b5e689288f1b00e5eadbb44e357c7d3ced0b78df58b403f4a71725b66c8840342b82c47cfd67d8223387b84df3e88fa6169a548b1a169b8396b530575295d4a4491b7f5f062b7c924cf18f230f8b026b1eeefe80bdcf17c6f4a753b563823c79ccb82c45386e98403a7aeffe0948b433f3a083af349718a27c839f9b532e1b24040025fb12da44016d18b84918058dd8f7f2070154acd436fdaac1aa1f68b2b2740f85a8d6cb416d65b833a3fd9cf6cacab670971a90029571b88dfa7fcd0fa656bd3317c774124711e436086aea854d90e8c2d792fe876d0d7206571cbe551c5b2cb21aaebd6ead0f5dd9ab0962f3e7e240da8eb324620f72b1d8eec0e0a68b0be3a2e3a1f225e78b0b36f2d6481e4fde858361fceada7ff5ae8164448976bc2f977a62931828ca7b07c06a2acc946fdbf1ff4bbcaf2a1e05ae13498388318c308981a97eecabdfef6e06b2712b3611c1300f4fab5d04a6924912f14d70cfee48a962f48b1e39080b4069c9d34dab770e00252a88c801f57247037e8f97c14ec367600ea0ba0da0509c0c891a000b5e90a426d894a73d57692951362d53f7934aca7473a1f3a3b739dd48ed9533db2000ae3f43d798a7ee68f5e808d8ab3741565d5de15721b81882b94076e774b844d60ec17be25d92390107dc153d380073a9e29778ae340ad876c0ce367e587180adea6d87fe32c38e5431abfe2ac95dd2dd98a28c8fa5ee9e30322ef0d76dbcc9139a933faa8f40528097141e8d7cd255c8a698f6677367e4600c6826d6455aac638113b4073e5c6569faca122b5959788d5807ab4bd74992b1ad2ce28731b7b74115e7f5293607b533fbbb1453ba34f5fce26ced88189ff2417a9b02eb8990d7e1687949b30bbcf70791389c96223d56c057e47753b49651473c78f21d9c76b4392565885d7d79d9ae87795986b59362ba94a080af53fb8e7f2e0648b46c75745c66d90d676e6cbbd45d2ebd202705567982056701d33521357a36358b12cde42210a7095abdace17412b66769a6f230197d254d0b530dcee660bb22174060a6e5b2e576c5198f5d001af72ee205ad83ccec57a829c988ebfc14652a1ccc8c60b5431c5e3f2b95826deca7e4fff5943528c9308a77db85a6197ce8e08d8206b2dd10782842faf0edb86392aa6cd81f3bd92bb1f7b0cf42581cb92911f6e4aeeae016aba66eae394a08c8f96fc919864192e6e55ce798bdc46d7301c98d6501544f30cf7c5a8ada70ec3dfc8007c57c725ab7d70e34300a7a9d723c7bcb56e867f6392aafb0a91d5521cc48274a8d624234be3f7d82d293e102456dda3741a9f1e08e71c22a7ebee21fd28c558ff590ea9d7d21030bc914db1a6fe6dea785c4032f870a7d290b344b60f551ff36c1258a025303a6aedfd698e3d1519ecadbcd49ef3e12f1a332c45a059a89a606c395eb07301062885a7659d75cfc34f451ac7f519b0cdef16ad358a5b2e6f4d744d8ec730d9fdc8e2981d430953899f5f68a228109a8338a3f8f12e6b9a567d81b7f18b8f7b979e65a5a76b40aeff418457be7c9f51d3c0dc6b1202785b305bcb35adb5270ceb1f1d2cfa1969786fab51f29fcf98f4e973d4f61dc238beb87e1866f581a2ce2d1858345cc054b3ccc84c564e5924011aea9f1f35c9cd67edd8ab356125955c4c33a9f366b2b997464b18b62a9f45d018fdaa523cd7f7ab964561adc68abc811c17e59ff6df728a735a56a3bd1ad79eeede7abd437447b2cf0e5d216f4c99f0c99d38bb47dcf829a879281c1a83e18e91634f5c6f0e127309d6ae68d7573ac9165e953a2468ee0d103155f3407adbfeb3892e4d0a420e29502c5d0ddfdb73e1bea33a1647c6e42cc80b5c2a2f939aadf0891d8017bc97c2548d6d1d7d905626007cfb16d71b95175d8319359c0992975c333712df8730dc70d56c2ae43f37a07ed656dfa91094725d4b0f64163b3d26df73c533e25aa1213c7966a51378df58079404fd99e8787846f3a888ed9ab61eb46de5d6c914cf319b20af6c0b6031adfd90c6cb74e13d809101ae4c42f1ec79da5890ecb470695533b80c795de76b05a356a09169f0514ba63cabbd4f5829a390e3a0ef7576f0826ef9318ccec37629f786f2771a6cfbb1d0e234e3bfff4913d8514f4d4845e20d37cae31ba04fd35cd609a666b53849bb563ed7f0fafdbfd0ef4de9851682e726cf4dfe0c0aadc642d012296688188e64e15c0570d7790dba780954604603412ad2733d37ad94bbd7a679a34a51bf069b723d3522b777654627c554ddfe0017796145518ac55d1105a6285170d6e620a43c973114505df944064b77fcc746216b6695fbfc9965fca3312fb91e875de4b32b090ff6119a02c54d582e96ee0f4caf983581cb46fb1f5725466a88db5d1409add8a73d8676775713d211dd96843d166237cf289475e72389b2b3d37ab4b5ee2c4df20cf115a1152b978dbf683a506a91c5110eaabc94a06eb3dbe98348c0bd8d30d476f4f62ec98f84a482a1800c70f14d146db7a5ff2c18db84b861f96f6b334597c03c8f0ee5fd1c65b147f2e98bb263a1105f2ac397fef318d10e6bb26c62258e8bc8d19bad325f1c4bd1898f352317a933f9d57acfe69160df900dd566c123f74422bd2bc764d2a3268b07a6c2688131f348e5c4eeb1e1f201d82b3ac0a5e07c44934aedb07beb9d13b0118faa02124ee433eb2a1a8695fa37b78b6988a06384d6ddd9a9fa76890dc31ee6450bc51d0eece6222f3ff9e4d9fcafa476a284b2e3aa0982a2670b513bbbf17fceafad05f887d5f8af387d4ef19ba8fb61ff3485735d3c40144640333e595740e6e8de4817f1a4127ea72aacb81f8f8e1793a8c9e73a95ee1119820759aa9bae2f249f6106da1b76971c1ee17e7df31d30c68fc9a78ce04d171af6caad8ba5f829a38ee51b99f53dca700c2f1eedb45faaff72fa8778f7ec477101517cea9500bbbbcee69c70e7e65e65a0994f53d27340f0648d2ff6c1620c77f2d08b1d70c1b2cf97d5f50b16b41938cacc34e9de5ebb04d38a4bb765982ad3150a12cae19b1caacb8cae80a29a3093c6a2a273909df0804b8cb7692b63a0b9df5d1776a4c68b67793a53ae9853633b21bf1bc2ac86c7702622667eaadf2b87134e8920c3379d86358f8fdd2dfaeef3c0f3b0734eaa8556e95e6d704732b46613984240c58d889159c8ccd26002ee3406f5caedb46ececfe32e2c2b255e0e7909df213b2a57161a0a7f6e49c5a7e8f8f664f54913ea3e4f44ccc5ffce3c184dc9ed7f9040e3b561abd0500a76f5155f248a1c9811ab147e7ebf149f0c433babcd7d1157e4e6f9886aa36d2fe62902e06c8802487d93c50d3f89e4bdc5bb78a7d08a8fc78c8ea7696106e04d42b76e4d3b7b6ec5e90517c2efa1f4e6edcc734f6e14a90b837a7683841dcfdd62d8fc3fd46a8d76f4afc004b866e562f69be9084c23262b6c6f3a635972c1744cb08c667371cad8586a428d440656b2ab08a410cb2fb3c01624a2509676629b1f8b165a43d1b62532d633b36c7bc58605c7d5e5aa95e06b8cbf09edbee560221dc24934f3de9a29e928b8da5e71d6f4687921f5c4ef0b7352dbb446aec9fc2f0127e52b4c26132ed20a0a546248ac15c3f4286e6a4c9452e6434b2d2245f21bf81c692806a14a595a59c8435e5f7d781c860ff3c408fe000f26d0b0fc0418717b3e4ca79e88a9d9b7216121febfe466fe2ee96c062c8f692a8627c7b3742d4d7f86bea9e3780eba3180f76933f5f92fe5d5a60f63dddfc59e6915fbe2c1e5ee6120f87f6d6af9faadb35a3af537263a871bb0e5f16d2a5e07ad8698f8de32ca1991555dab15c7bf109e533ce931f6516c2b53b4e7802ff402bdd5903671965d42673ab81c5dac80e26c5187c78782143375afc7a4c26f064e305dde9d49834ecce73fd0e7b612b5d4448635f673f98dda3ffc9defcae750aa4cc34b288601860f1b0c843ecb066162ccb5d7926fb0265e7f5ac7e09615f363d4b4a6535207bba59ac384f54caf90aa9aa2c47f6ca870e98e2a60af3e4559dce86374f1589de8c13d841ee7b84b9b478d122a84086c7b1cbf473b84b435fe847089c963e9f19af2bbfe6b825e6be03594c912bacba4ea059f3d774253703ded44a48e0b964cf15d47c6051167716bdd8ff1b8e6e098d87b8b43254b4fc5324813d9487d5168ca8db417295dbb8f65485e333ae73cee1bd16a24b1cbbb32d0cefd26d21a13a86d46cd03b1b264fde27fdb28835bbdc9a7825f88d476e2395af5b24405428e61ad952c188acdd8cd008f6a76e2e4ce3549a71a05d749c0dc12945a1f52663e693391c0f28596e4ed52664e6680101d0075b10aee5a8c2ba5fb1cc814c5698e37c8bd8920c2c71b38f7f8b1b33e3166faa67b502a94e0776862a7e38bb336d4c6689ff0104fcdb9a6c3d6aaf33f23ab52dd74d2720d9c2c1c4b4b3e72dcd9014f88f8d8f0b33abe18004e69413a6592284b6a237306223633887262bd1a909a7bdefc67ddeab6703c50b3c8582c25882f26b3ac118a8fc3ba9054a37a537cb16ec67757511ccef4dcd69109330738d280fb560e2660aa8a6366fd6d1598606f7afdba9ed1b49a2ef8a832c6822f779c29938d77c0e47243d17c72a8daa0a560e59986d306cc2d0d232d0b4df23511ceb72b0e94034b5770e2090115075ecf1768ca0656bc8357cec910a1875280d16259a830e9f4b73ef04aa62f2bb0bb39bf5bfad48e7b2d554a5ed59c1cd66087db59368c37f73b25bcdcf4ca8a20238d31abc03a98dbc49fe9a80b83896ffa08706490a6dd5cd84904150616a09cd92881354e30979f639444c9030cca6caa49f0498ba0f00b836522481793df5b4ac92b649f80e492c0858d90d4ebaaee5d020156fcf30bfcf908fb754fac655b5fa927bb3f5ce26322996945309c9f962b3cf9c31af49a09cdb13e8f863ca96ad3b936ac4042160a9b03fa7e13be8b8c8175c51a1f67c63fdcfe6487fc80665a28aef6c6be49cbbc0ba16e0ab1d94e8922946acac173121a337f5d6c7114e9f4741bec9d12cc77aaf17bef6d5d011642419445f572c2f5fd3c121856bce6c241fd60988ba397c03590af9677fb931e606fda30c1d7d9a4d7b41fd6f5e2eacb6f185438501e7e272bf7d5b1638010f8699e39508eff71390087d07676483ab8d46920f2b761bfc857ab3481a95def9e75129ea36fc8049fad544d425dbace2e072d033a798f36f82408f821eac8ed26c647043b8f6d4989138234250dc2604c7912776714f706c75b4ff5169337079e1e355eabfc1dfc5376bd58e2d73daae221655f036984f204e711081f97776e0d04663d7addc2abfc70a7b65a9b5640a8aeb3858c518f23c36c662a2b6ae492624d5893da4cb8c57fcca72297c5fb435f93f2c9b7ccb49efbd96af1fed1455c5c7710981b0e786505511208fabbe347c71becfb8539fa3fdf70158f15b8fd0aa7f1880a42fe5a9cf9961f623955978925f617a9129bd77f0b0b59d8a61835202c1f52a6be66b913de00c24ce7f8246bb74cd427ab514c257ba4c3f5b88bec4039fe064e403936c0f545daac44eaadc1f281657727df981d99acab95aad25eb5a078a6954e4a8945c15eae14e5f2446c6b245642f12afc81dea457bea2a5649d39b71e918e259e8562f02ec144224163e0742d77611cc029b6f02bedf58561574cc299c72fd1a24d3c690a586251b446","title":"1590. 使数组和能被 P 整除","link":"https://leetcode.cn/problems/make-sum-divisible-by-p/","question_id":1694,"issue_number":27},"25":{"day":25,"pres":null,"tags":["双指针","链表"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个头结点为 head 的非空单链表,返回链表的中间结点。\n\n如果有两个中间结点,则返回第二个中间结点。\n\n \n\n示例 1:\n\n输入:[1,2,3,4,5]\n输出:此列表中的结点 3 (序列化形式:[3,4,5])\n返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。\n注意,我们返回了一个 ListNode 类型的对象 ans,这样:\nans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.\n示例 2:\n\n输入:[1,2,3,4,5,6]\n输出:此列表中的结点 4 (序列化形式:[4,5,6])\n由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。\n \n\n提示:\n\n给定链表的结点数介于 1 和 100 之间。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347d80258a04f436ab074f71275d3802341df1937624d5895e1a5521d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad2507633e07183d9ae0ad320b12083ebaaa2865c26820568a68f61435b443cea542d78f736adaecbac7434af8dd8da3da99d6e96d62f583473173341e42a892c9902de287f68e464484056aaa42a38acba9e5d673676282ea3cf61227e4ff48a671f7d07a9dfcd7a2314629f39e95c7af5333c528b68ff526ac862cc967701827b3b739c39cc5f7422b98b007282c9362672a093acfb2e95c8740d10a88130e7e6e6920551db4144612e0d2e27a4083f3f2c477dcb88afb3977f84a9cdd2c8493227659b85aa8212a53a4593fbc52f9867e73d97a1a2c874c29ae946a955191cc0c6cc6d4cf6b59fe87ccd8b68e8c07a887eb0104eb194151b534486af53c60d0882092b8794bbb68cd96bab29c38935376791f4f49b32b0d721ed3c024f6a2b53e9e324cbe83ca0672b330671b54cbca7801679830c436d5735491412c62e52c90a19b7330ad59abf5fb9b1640bf4635a7373ff8e1d154c5be509aa832068c7cea806e3ec8ce7c131eb4e213f62bb7d5fa1bc92129bfeeb2aa081f2dc7ae7c364732b0bca4e6c068b9bfc1adb81cd526b4e9913e72dcc8f515b885d025ca9a2fac5c094c9e511e1b33cf49d03aa3cf7b61edf8921182e23b50eae03f119f4ec4d41deadc39dfa9c567db01e3d8693a7bde0f52fe9e90641260b09eeb1c723f1e5977c6555382d378c33bd8f05237f22f20d0078db8573fcfbac7ef66f287323d24d2361aa1ec33644bf7d9bff0f2ba7b51d34c3b4216bc9dad1d1de99e025ecb66609aba9f66d79697408a4a16bbd4e5c12fa441b0ee3ad1bde8f9f2678528c0dcba28e7a7c51ce05f850f712a5a54a927e64801ac3de379288aeb586c4e318762e1ef657389a3ec0ee6451f8245991a83fdcf465d50b4c6b85b87629c3f23da76e380fd29efc9e118fe6571690a01f47e94a4aef4ecfc690ab041f9e9becabdd54d0645e52b968ee89d9b94976887c61678c6c141c9516d577f31ee2536e8d4af0fd19131e61d75bbdea770f254995b80f8677ae26775221c2574d0c985841b4916332ebfe894d0c203c015207badd8eb1e4f380b4b3b9b383ee7a5739f4f3f85efd184d3b425fe8ac31ad0635a22abc1ad5abeafa4332447d7cc6228af4bcec7fa59eb4b64a5597d634eb8434fa6280f205de4bfc39ac532acdef46a1f2be297552cde9b3e71e4603a5edd1b1e7c2bf83d8ae28dabc410cb07fe95515e1da0af9c1ef068e26621a4b449388184aab7bfb41b17232c575d38142531dce84ad8dbba5d38b895f05a6a1ced6be48f02d345e15b2541add78d0fdd4d2cc624913047d9db513b9aabc181c06a3b3271efd954f12f780cfc23e2caeaf518639bc4eebb38d76256a69a518bc384f238956b9fd222204b0627009fbf76a3c92be3e75da595447ad8df373769aee5ce556696238e58746f8336072df8d5ad94e58daa4ce48e33b042542ab304d00ec286de4a78003bd2471f012bc9e147c1610c7874cf0267bdb4c5b7a6688fce1734023769b86a67ea50678652e28abd2d09e1a94c8d140e0cb4a1b923dfbf79ffb506dfa2d08d20f3c021077490685b11ab4c2c028785d2cfd9867abf8441f3227798fa1fb1888c2211ff6886dd420531442d0de01991824a808e5ec798925783320dd7ba255fcc91cc2df59c0f557381c302e0affa16fbf41dc220f347e85acad08a7e3bd59fa755012ece8096b0c42ed9401c3fdd97b2ab3541d22271186879df27542361aa2b1b1b2aafe4c23e90d91a2b06d1fbd80f401515f394aaccaf67568d818f6bf0856a63bf7c1b22e6c43533d235f8e2d2d548867e331901ea81e94b76700400b342f858e51a4637f5ab9380567e15a3fd1a50a984daa8a73c7f349956a4729858344f0be30321d532bd93fd479b843990f71d2b22c1e225a14cdc1682f9f299321f104debfcc766067b0f17cfa077c4efa7d7413c01f2080629960228d1a336de6ce41f689edbc7bf07146d7d3318114fd5aaeccfe68ea9413371f694b1792ce9b3f1c683c2fe9a8a98e4a1c86fe0f80622d063180a2ecaa43ffc20e2c51c872859c3c422da082e50def23e35fb0fbe2519e912dcd6f5691e02868de5c9cc456aa5d333d5f5088a5d23ab828b74f50a9b7b66ad8dcd9ffe7a5ffa3f43b9354425dd37ea34efd74cd2f6a367a682743fad1d94e4684e2f7679c818d364bda365bf7747f6c1fef31f72c3b83493089726db72c1db7d1b93400166d3b1ae3b607b2d674139af44957805a9935602227635fe84bd4bb4bafcee3b201b25ba9136e16c2719131ae36ff6e459b0f346fa3f4fc79d63fb1a0f6cf39a12fa9df1d694fed12f927157d1e972a39b2802d6ed890a8921c9561c2c57b0f6f6513af129d9772699a0621ccdf578aef080e121edcb0ab3fc73077eae5cd704d45da8f6a7678a96ff76893c3ebaa6508ff13c10e0ab0f55037bd0eeeaeeb260a3098042ef5071d105cae1dc6b782110e3efb4944726b03770bb2c14bf5747ae8357210b81e8764f57a3789ffb3168982ce29b8979761924e6a7e34aca51c3957c769267410eead77df5cd97abef85134f6e98a21becf2b30e0735b64350b410f3baea7bbc5ba113cf4323d0a40531ea46ecaeab1e1a6182efa8a","title":"876. 链表的中间结点","link":"https://leetcode-cn.com/problems/middle-of-the-linked-list/","question_id":908,"issue_number":28},"26":{"day":26,"pres":null,"tags":["数组","双指针"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。\n\n不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。\n\n\n\n示例 1:\n\n给定数组 nums = [1,1,2],\n\n函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。\n\n你不需要考虑数组中超出新长度后面的元素。\n示例 2:\n\n给定 nums = [0,0,1,1,1,2,2,3,3,4],\n\n函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。\n\n你不需要考虑数组中超出新长度后面的元素。\n\n\n说明:\n\n为什么返回数值是整数,但输出的答案是数组呢?\n\n请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。\n\n你可以想象内部操作如下:\n\n// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝\nint len = removeDuplicates(nums);\n\n// 在函数里修改输入数组对于调用者是可见的。\n// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。\nfor (int i = 0; i < len; i++) {\n print(nums[i]);\n}\n```","content":"0961e884611df7d4ac47a79a9e3ba8a0cd85258ac19505fc764a3f4e55595c03568db42578eafe01350b925fe00844d77fca86064ca5cb38d746f23aa4faee7bbf7166609ec0c2fc0d268fa687d35e703aab6d949ba3009b39aa6adce2aea39b5c6fcb1c71b9922d2825026ce7d7dab2739b5726295ef6c433e6a09972f055ca1c1081ed386c0c3f7bcb2a832e9b19e3c4f9de23d6252c5acece2374da8af1035774092b6afeeb2f62692cac931a666d46f2f49e30067a018e5a8358379f2c7a2fbff811cbc50d0ceafe2c20d9ce9ab8397dbf631470af09c2eeeba001511badd2d9d9b37a64f427f3111cf5bbe06b7f85cf36e5e9a44617a8cb0bacf64406d5b770cfda82f0369313cdfb8b09bbb73cc5a6e926826ca222d9c38a4483ff08a43b67deda0b9e85a81caa3e4c03995046e58a175ae4fbc5cdab6de9e44a4c239255039cd7470f39239bc60efb978769d8a8dfb0b9a98bd7429521d6bf34074d9dd9dd953c97dc25cb31385868046de5ff30c6ce2ea0731f33065cba77a9af870976be2145764bd8e44a5ddd6c29c56263ab6755cafae06fd9ef5f528a42022d5abeef2478fadde439be83397dc6e88906dbe881ffd030f772221d4bb47f5ba1bc8512b0fde13d966444923e506966681406d57ea9abcc07839e4e8cef71ae2f8352bd232e56c3fa41eb8b8e10274074ac0abfb920bec0288ac611e94dd701b95610ec806a66b26fed2e8557ccbcfac6191fa2c1e8d83a51e37613e8cbabd4baf250b6f3df7800352f3c4854cda7d123a8c4c1d55008f26d80f2610f2a45f56d98ac8edb203f460e05efa5acd4f920e5ced8f47ec54f34a021c9c44263b9ce45229fca0502bae2a1aed6e69d3ba1e47f997f1d79a89becbc841c71b80b4b492017192c866b5cf94213f45a7426e13b83f2950a2160b564c131a70acde359dce1860ffd0e74e04ccdbf7e174de5067fc38e960f37c76efca6d8b07ef137c5a4548bf41293291330a436f3ff1d34fd43e79f88143b6057e55e70c3de1048e5800289c155f70a773f6cd1d10e3500c4428444ee85a1ed74a2e2bf7ecfcf58fedba359bc9ce03f0b9442b01cbc1a27d555b2a94d551c3d9e10e5f9661b3630d3fec40b2dec09230910941fd046cc7ddf5be2434798cbcb383453f28f9b8f30ce97a9e82315340a0bcfd8f3003616aba8d93c70d2dddea697ae9e51f0225fdc14cf45fee68dc6e0e1d0f571de068bc385ef678a9fb1ae8fd93419b95dff32fa779fe878c3a29b2f17bd74fea70dbc9adf221d1bc38ec7ee79163ed0b3eee5b8d4d2f0d4e47bffde2632e525f3007cc88067c582823de47745989ffef2ff11e97820e72ed778a92bc497c6492160db20402bf3f9d3e3d6674bf892b58ea814883350c167f7deacdd6feffce5dcc54b63f6b216c29170ff8ec66e2554e5814463d4e6122098e4ee8b4d09faf361e666a32e7488453e6f4f03d4106b8cf00e953ee8c8585035f60467b3162c8eba001bf9ed5f5c5456a086c99ee8d599748c085b3f65f3ee2ec37a1b7aa5c470b9195eb3f3da37893862525bfd455c668c16238da7d477a0b8b89221f3c7361d6b3ba7df709a45729c315e2dfd3e39a867017644ffd0a03bd722170c3946d5d2baf719dd87e5175a7e897dbd921eafaebe0871b07618916538586a4e0056b3d17b878cba1010092f86e745cf8b4a7188b49c1c023df35f49deb8f9824ad5136c1367f1de35bc170ebe03f6cf77be34793702de45bb5ffcd9f1527ae11d5fdbf5f7a5ed813616b0798718a4d096ec5451679f6d377aab73d4b8870a5be7da5f09d1e77fc6aca776510aa89bf186954d5b5976dcd3d3f5c7cdf7d5ff6a9be96dcc64cdc9a1ca6b0a27a98cc19c830f6bfc555a77cca4e511b636c8134a63b380dda086bd8f04cced8817dd64ea749174ad5f27c3e2d0a2f3fb5d07a340e8c78e10ded9fb08b4bc2e5cc970aac1c156c73fc96cfeaff3144c8a375ff8bee99a8323eb59bb268628be9c3e57b7abf0d6ca0f812d845ece12bd56c231594798a4eb5825ba47dffe941ab0ecc52290a5059252a5eb479dc8ce3e75dd756e1b2fc149b7a73254c921ca72f9690f36e20673397903770448db86c93f1329727bf9b5afc70c41d5e644803c751b338bf0c6f169ffc2486d52ce3bd6c8724d2bb9dfd001ca7ef63ba889f60af4bb07ce6c051800d3ae6ffb063ab1d7797e7b0404552f6ff2728d9d650fec2457b052442a7730782c0632e615b3cbaf519b4fbb6da422a5e1bcdc81dac04c5c3abcae0d130388716b0ad0881ddeb07881890f5da1e27c8bfe2bd9bd6b99a87ec89e493939ffec95bcb349e632ce251090f11202fb17ecd65af0c9f6e4e1cd65836316e06106747cecdc13b3f0cfb107d901f5369b6992a60bb58daa401668b95622f12d1537bb2788606db5294f28823faaf59c9c10f7bc7974eba2131b347898608c092ebb9e99fcfd37985832d1ae0e86e26c7d7de6af20271a4b88a2ba3f893136ffb3d02e4a438c8d092677e226b327cb95e5e0354fa575a45a09aef5c7e0719e604184549a811bc3ae54c1a99f9a50f95d7e6a357da22baa63017f0b786f8be16b5a83d74dc7949038b2688c13fcc36adfb636a96c55a7b8b9c7e45895eecdf12a71d9b2a70ad7c1af3a8af53a4ac14fb9090cc6f50f7a65cd7b0ee37fad35713e2628452f398436730d73f4ed7cf9c68999a48b72a193abe1cbfd093afee686caaa67bc4f5640fc4a7f872b1e59a2c3be0f89e4254004a5edb36caad16a2a6299d470080ee268078654615c6a22165db184f3e625bb7a28d8c3ad3e4e781d62254edc4497f90f1fffd3b9eb5798774393f3f4d6e7c997780974c4cf651d2eefcc2da354e71f3f974470043b9d83969fb67e94cc378c6c894f8463ef53ad457d32290b8bbff5e4871ff15395a563bfb532256959cd7bd5cd56a55b0d09d4549f0f31e488ce97603b449cad4d2c05925bd8e4b8d682bc45640448764dbdb4b7d8b220308228910e20add6d7e3572e85eef09cd3bdc0decbff2ad279be1db041aaaa543848dff7cfd3bbb581298687273b3e7a87a413d20f2a9075e526fe6ef3c338c1e543982e59de8e8579d7cb97eb332e1c9156fd1dc8e77fdc07df60e7e46de8dd73dac8a6d4edd495ede79e6792de1ad29cb882b904b322f1f5c91fdea681354fb55b7e0e0b91774dcc483bddf4cff77df60aebb841d610daeefcb827adee3a91d5f7133bd1e466c045e6fc150a70691757a3202a3a6635ed62ddc010103f15089f10c8c3c7dcbcb32a7c9de448f2da874672da5f9fd8ee3593df135b054053ad6ac979c8d6296bc4449292d1f359decfced08e042209ed347ebff9aee59b88fa519c3e15c81d0c80ddfb36eded579a3b0659ceda818cfaba1e18bd1a038a21feb883935dc65b5de4deec9915a4d3265f7f65e8e03752c4ba25a6011e6b81bb9bdffc20529d650687e2689d814c2e9e1cfe1e493e74b1c0344d3e14b447e0cb26b197b4f48e452de824e54318c2b8407e6521d096cf09b1c2e0d9e696f7c2a8aa3e9d227bb27a890f95803eb478cfc0b6c1a7385bc5805471d07ab444591ad8a26e65ad417ed5f6cff3841dfd80566ef471c6afa9cdad1cfb01a5e95d71a1d3b1f0cbdf5537671b15b43b3341","title":"26.删除排序数组中的重复项","link":"https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/","question_id":26,"issue_number":29},"27":{"day":27,"pres":null,"tags":["双指针","二分"],"whys":null,"difficulty":"- 简单","description":"给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。\n\n你可以假设数组中无重复元素。\n\n```\n示例 1:\n\n输入: [1,3,5,6], 5\n输出: 2\n示例 2:\n\n输入: [1,3,5,6], 2\n输出: 1\n示例 3:\n\n输入: [1,3,5,6], 7\n输出: 4\n示例 4:\n\n输入: [1,3,5,6], 0\n输出: 0\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f20910a3d438573096d622133746935bde07f4e89a717775081d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad24e7a36f67e8ed9a8028d31ab3183f7acbf844d2bc0070bdfd86d69b4e2ba2331213a8e30c3ddea20999130a73650996cde69f0ab0d2967654c5e7dad719f4df301b44274069f7e241b7bcfd82079f082f21c777422146bd8e02b4566ebf9906c114431a9c1f17b0105629a2aeb5f7df6042a598d7efe6060c555d1916a018f6b3672a21dcc46472cbb85007282ca013271bfa2aedd3c94fb4de0800f4b92a2a1c6f888b18d14374bf9ac8228b231331702abc84486928d9a53b94c7b7d0ecd7c5875c8dbb408fd26804a9bfac62b9e8860bf5112ed60e606226746865d160ecec6cc200c7330f4b569afcc608472d74c22a0790f8df5a48297e51fa271c2c8da4162456814bb8288d57ba0c46010f39a1bdaffade83dfeb712896b0dd1855776999534b9ad2cc719177d5852ce3eb2cfdd102ee60e240847b3a74934a07066b2772bd8773594febb1ae1852c7ecb31287807a38840425d31893fd6e32f1bb9fbd041c8a5e8e1a269df017c3127ed7e0edd99e470afa0bc08c7376dfd5a6f2c25557771e822d7998287e1f551d59779032e9164be2b3f5ac7e742fb9e8f3e13437785c5e68c7ee4c865f5e54ba05a9a91709a9d5f48216fc906c051c34493efe2947117c3a2d09e446eb12f268493abbbdcf8ca5f97e0d2efb08a3f574bcc98ddeb37402d4a0754d00ccad02a7c0d02a76e35275f3bb69af8c9ea7e6a1d7ac177a9a4b21b1edc1345ae4f536190c616ce44259fd43ede0c09771861233da87203f599783bb1f3b1bfdf86b2b4049e4a782a141c2364a51bae3b39fb7e6326ed135d6a6adfb5f97cd46ee04e860573f8d0e0bb0cee0daa78c7e769f68d9bb80dddfabe78b87f9d4594cae10ab60c870117fb5641b5289083e0155aa9d4555bf1fc222c3815096a5ace6ab54d42ffd283d70ccea36a49cfa98da7565dd899b4938900ce00d3945ea31f528fb9445cdd3021893dead2b3f9ac00fc0aab6a8583f36ebdbb4247d68f2fcb7e6540258fa459128d2d798b1176622ce669e5079c7cad2bc93a1a8a94902e5515dcd6f78b71420e617046483a4456ff9a99255e64b6c68602de9cdcd2a7d02c70f5f23156dd2ee744cbff8dcccce5e4d793768e4c5f0bed48909ca995a5e3fc822b967f8130c30322d476aea73757e49a496789647d45b4eb92172f5c0b9b8cc4291c15263a1d22345169f53c35a0c136ac0b90bd334aef0c0847d90becbf5f0c4d56619e4abff228bf77d2cf44ba5f00ddfad865216a48377d4969188adc6f76385f5b857b96963dfc39773040fd603a50484ab8f33160ef4b5fad7e6d75b59fce767ab2e31c06dda16b0856048bbc6a34a807f747fe25a226edcad8c54798f0025fc154b82056b9d0c426909c239fe2672fb6d878389dcbbce14f4767731c1d1afe0bc4e76324c28757fd3f485cd2ab6cdb687215316fa48b074997a46e46795c8f1f3b8f9bed78a0b7b4af0b1d72b5db1915f98874cb2573f7427348a3007a3dfec183e2794907d66eaa18250649dac9badc3bd3bde6157a5c50dd1bd73c7a3a3ae7f43cb183d039370e0a79abb91677b124c2dc1e755a3d100807f5d11642185a28b8c8b00dc598217ca79702ae0d2070748aa702cc5e02f25adab40da16b2e2a6ba670fc2af7a3a94f16bd043b9ffb8cf8ddd6712df8059d44eceaf2826e3b199e3b6e58d22dc2deda0b25bbcb0178ea970accf4f34e2a897f1d22241d94a29cc547463a044c0025772aa6183c8248b62a5c1738f9ebc8640f667216a6a4a5451707cdfc9005e36ffe7b1340f9def3fecabff972c8afd51b8524d314c84cfb0711a5ade2c5a8f81263bf21b6dfc54dfb92a818d3fb083dba7ec777629d5f628f5999c6e74a15964a20edd18688ec52e611ed19fb579afd4c6cc6d8d79c941423e9db76ae7683c6c11e48448b88ea623fb97dd6f19007b0ecc22faa8609946ca7cb6591fffa3e6ed574501e2ecc6db7a73255ca0dc04bf66a0636e53a6bd59fe2e19de8576927f0c69645512f061e4a97d11136bb09bccc96a0203d5e2087674f81da9659d20453e6afb7543663d710b3758a330f178e2e0bea56d6c2670bbbf7429a6e07df46c7bbce97c00b021b8d71c717d3cd704f2583021a3c236e67454e218b7c92a0d961fff93dd23df91c717e4d733355faf4fc5e088de2e70ed19b8535178a1700af323f2b1af16cd45133cb1d209c6777f56a14b6cfb11b061625791aa8bd08ea9e6914d5f91c58a156982c4f24272b1aa1108fb662a2d4e3931cf91dbc7c2a5f967ed468c47cee307880666320accfbc479e61d6aff4f818f96ceb967c2e268e70cc0433462bdb2120adae635ec597e59813875db8c06b3c282f75b866d1d01e31ce4756be9415abdb0b3371138886a30ef07b34d8d4c9114277d09e0d2435c61ce120c68a94e70a49d50d832a13e7a0706dba17f1a3ec373f5df1674c966e7e0008ea19c79bc5335f0adb75035542265a6e8d9b1420e5876fdf93986ed603a422a5cb4eb9f246c41e19c4dbc9d0c87998e08fe30563fd93803bc5dfe26ed1cc6576fe23e26e00e7a0564652f23440fd7ff062642d2c4022537bea04230b32d1da7af4f7b9ba9a825fb0bb9ceddbc76a46b9c9b6edae5f861354099e56669a3a0417b4fef44197d83a1438c0f9e91ec9970d6330f19a707654b32303f53206497d390c4684918b8961ee1357b9ca892a7c223d537f4ef97ac6ac3d569e94d08e6f991b38cdabd0e0f9d0ea666321a3b7411c1acbfb36d863be080df3363f7e4c8ccfafc4f23cf58141c115f139d769d977ad5763511b71e1aef7c7872ad342f0be31d7d2447f004eb76cbc803cbd301456813dd2167d8cc5bf8c4a267bdda22a3004e823b1a6cab2bdfe2e5355401f298189a182a53860cb22c8232cd99a8cb3610aa7fca396f39ff9d7b1fb0bc86ea726b74ceca972301fc4f58580f8a3e860e88e18304465b88e29cd262daf35d317d73fe6f10d90f373ba3e17b9d9895dce8dc4805b404ffa32ba4aa4861c8640bb01ab880e89c81d8988a6eaf2a5cad5ce8669ffd63e94a2b080be3cad62a6b684538adff95f4096423e0734ec015df30e088eb6dc9e34994381f500c66d9583b6c970c18d5bcafe942827ec806f8764ff8f06365148156a99676d7d167ea109aea94379713748e650d18bbdabd6ea7f23f7b20bbfa8cb0539e34194f3b26ca8954012086d73f64ff84dccb35020d629f1e7829a3d9995a29afb140b7dd2395e98c1f0f6ffcaab3aa1020bf2282cb1849f44bd942ff02e7714d783fbeb8ce36f0ae8494a8448a6fdcaf91285490aabb188f846cdb75f081558eaea0b4df19248f1424050b889f5e2e56b08f21673d78b21cac80f46f41ebc62326720edb278085666d005f2c135a68b8face74040bb49ae0c02ef9c0b1d03487f4818b86236670e121b1c2a2261f4ef6041e9ac0bd8d7dd57398f1c6f493c04c2a86151a2ec23b5c927dbca38329d96248d905d07184c66d3f7f14018af7ddcc2ca656dec6bcc234596b3147a02583538185a07154ac85656332e1d3e107b4a4b16bf3349f7579eecab48bbbdc6de3f18e31dc6fb708acff98ea202e7becf555b7b0397f5ff151fc764c8126bdcc6c91faaaa9a36d076fa4a07bb0a29c48851386cac5e728f583521c78d5f1bfe09683c4a826dd66c19991c5c788b100a8bb8b0f5b7b5ebc8dc14e118d93c70554a9008dd5bd739132c7430d5c1bd760fe8e75171063aa80da84624b1562163a69f37cefabad49b88b799956bb64f2f15df6466fab0503985caaccbecf183a90dab64035eb62056ecbbdc9cf8e5a2d48b0c647726ae555555492da2b63d52ce8e929e4af334d61b6fc755fc341797452c9dcf112988d3e3a84db0018db264b792620776742fb8a5dc5eae1e653422d5ea1ee524fa2e23f422b8a1d9c00418d63d35901f0dc7c3806cf3da172dff3afad8bf9f31acabfba06ee9df3f427547963ce3318263a1fce12d5f476590f25476933893481b2a7745534a48b4b790b4dc8b95daca672bb57516ddc22690667112cea55adab6031ffa01f2a87eb1510c8ed58a99adacfb47472702851f1ac518f53285274baa413885ad490b0794db9bcca7abf490314344403dfc693219f6590b20351b41b593d1f3aa179315909b23db5c508f6d6795c1f4ac0dd851c9f43c3d507200b22a33f5e0a8f1f477898d567ce8241159a2f38e5ed048ed55c96a8664b7cd26648b6c0ea2c3c87ed861d6dc7e066e195a0795b322dffa88c2b89cd3c9a779326c9070ce47b2b3f648840a5ec3aef13021da0e041bf0503f042d7b220f15594b87ea81aac14255dcb46487746fc59643ba954936d3f8b392c1c0b2080aa6ffc058545c26b5bdca0d1d1c0ae638cce0b45ae5366ecc53e2bf407c2b61a760cbe4db2d9cba03faa9faaff7817ea428a63ba904f835b101ece0f7eed1f9b9661921f11e584a40e6505a3e9f84dfde5cbf2ffa6a0d4f1788ab3d0466225cf78e9a11cfe2d118c31ea08f99404e304235e3d0694df7080864e900b9d26c7af9e8a6cf44f89149edad68c889253fe48c4f14a649a9e853c400b7e48faaba7b5d6f11dafe76bfa40f7beda124ae059c3f19526d2fbccdec391c9fe7c0126df13b9c84f29b62f1ad379843e477e468a0a22bee3c78ace420b8866e6d9d33ee4820ed42b1ac1d29f29eef71d0a7f130f3cf635d647109c66556de22e223a049ece663e8adb682f27ad4507d620183cec40308ea84c5054dc807a26a316e6e4906e0c669627fc4f467290c6638d5c16efac6b357c2bc9484e3be2cb8964ac96815a9a83012752d367615636f8c7d7c125f94e2255f885730b8329eaee1ad8d0a1daec36998a901537585cab0066040a40940d8e47810ce573017080e5d1230681a96cc1387ef7e7ca97d5bebc7d1dbb6bf5791b86e007572e406023cc3349e9df9e738af00974b49d55ff3933f8c82ff72e1e3df125a06479b2c007f471f543c6daa217be26c85497c374287e2fed21875412c7e8d527023d3c759bef846bfac7561f95b0c2021620e76556e4af1feb958da10bd573c905194a833eeb9bd89fdda7d508481d288604666c3ecb2d93b4997a33435b2230e3cfbf5439a75bd1328c7d7d06984782768b975e6c63df70cd99d5021cfedaaf48ceb93015d0af101b7f8f4d51f443ca6a16f3dc624a189c2e3c1fddaf69cf63a0f08250cba2ec485268d1b4ba2ca6b082dae719781cfe1b577bbad982f2f12b80df76d51e6140afdeaf7048590bb45990f04a6fbd140fd9c703af9d86691e37d347da6a1bc50353478533c91e03f74c95c22bf1545bdf1f36dff6c951189255cef9eb84a4acbff5df0d1ab77d572085e11af2fbdc883c70dc90a246c897e7810cb41556d4eeafe2eb10c27409dce93d8bdd49a3036190a448626c9e009256e17c90459161bd8832fd15bcdc10d4770888f19c59be471a86cad442c75072a4090c403e4afa4c8f94c307e66b3f42871f7595dcecd49b1e1a26c28a14a5282a0b8e9800194b162878b4f5edc8628ca25f63f8d05b082cf0159314e6554549629fbeb6e08bc221c4fad387c4570bf53dbdef3a9dbbf43f4944ff87cf1dc25207fa6c3b1a76477115d16af339f9fa52369446063151ce0ac3826c68f7ee4c4cb2a4d30aa16453b83d2629d91ca177200bc25920f9845b9996627b7948a8f3510e994fcdbf7085380f1a09d15932a331ceca61b96d6a39a70895e502a9596392d1d7869f28694d950c942dee5738b7e6e4c2181fcaf894c4e79732508521fb7b76ddb5514f74c12841c297f8a7f2b7c24880111ac8cfff83c5459001d401943142ad7c91ad7a1b66b325beba65ec94155545ae9e2e5e0f80fd81aefaf961cf4204531e1446d166abd2dd0748e3b44ee6049c62ab3a355543200d8b913fa608b145db9494ac676d215aed553d90011556e576a391a7fac30ec77a033981b22521bf57041c67117ad19b190e05e670789adb5e98cf0039862f7c98706882b812aa51f370978c3b4a3c5f267dd3cb6973fa06948bae27adf7ad6f5ab7d347b7cd7041f0ee5530fbf46c7997fc46e06ef12c1fd041a3bb687bfc7892f37e0e83c8373a7ccd4437eaee7f938562edefd95a31e98f1b90427d612061a013fd83e62b09569a1429508f802fb7fab007083603d9ca0fafbb5edb676b88801ac816b866fc82b13e28b478e376434d862b238b82d1769843b1ed37d29534e0c38401fb5491470a4fde29bc500b02001fb63f120016a1ee13d4b112aaa1edce20e5a152a624d90df105c1ced51293cbba757b170e6234c4f5399780224358b9e72035734d39896ca1c8bc97d6ddc70d11fc2e63e1310f458e6529d4e3a16efa7632fc5d476cfa151f4184e22717afb8d593f5fbbe3803d8b176c6e4ecc0ef9c3e93f762a74825ecd36aa3ad0c49de36ef891cc367cc058a861f65a72f7d7983c034f5186a8487cd3d5d9ce3dcaa387d96be984cb30f24da7db18e996b9e2aeb5b96411f16f2319faa0c1371fb6c6f436831b0a7a2adeed3fbe2ff08b1075d62096b1c7d133ec5c0c68a5e5ebb033eb1845f8737909efa4c8abcbd7693e452282e0c24f7355ce22c2c402e0e3b245f3c864852ed534d950768306ec72b3ce58f66ac5b73be855b85acfc1d5a287df3adb440787ef8d3614df689ec528cc8524b35dbbbb2d123e8f64863a789bf5b724c7c90acff80ecea78eb0cd9f21b43cf33eda6c40946c44d7ea000835e8f4b695bdca12e1c8d990c35aebef1d125d08e3c975f2cdfc6bdda28cdeb01d68489a8ca2d048d32ae0177362365d33135a5a12452cac81cd2673c0ba3e5e9b308ea629c3f864b3e08a8040c5ac7641f74221c8d7c05c04cf0843d60877a05509c04864e07802eb97ec86b6e8666b27f1e1aab7fd9640c697c70d93b01e9f05174f5eb3d725e7b321b8e10ae2af2004133836a5dc0c9a9bf1c8b637a98f7749b9fc616fcf7661f57ae12c9fdf0c2c4be6eb841c6be3a7d6b6f1c26a158f1131cfc353bcab5a8f2aecb15fd273ba6ee646535b8db9f478ed98e5cab8dff753e695cbc638caa3ffa147b18d183e479a96887d7328f5adb6582d2f2eaa984d5e5163c67cb0ede5b018762b48299ff32fcc7437fe789910cfcb278fe555f2690113086140b3c51537b917b5ea9abadc6d869763b78625770b58a1442c13beb36bf3bd61480677ab063165d3ebadfda59ab0d111cfe14c3b1919472ae7814a602350c66431d2902dbeee82781e7636dc9bd16e876d934c2467988cf096bcda854c0b6cc55257c048330e13956aba195436abab321e38feccd3c82ae3276ef92e28ee6f8d510660e09a5b6a8fe8a6dee96d8dc0a0a5c7dcdbe5252845e04542b06e037e7679c8a9220cdcf9fa8aeea48227341314e70a817d3bcfcd4e9bcd1c99ae78913e8476afc18947b87be539e681a0435d76427e213c342f1c3c86664be2913173288dd8586e589f53401afaf41bc06f867cbac90c0ea250df38369b53ce500e43cce27a7dbd7fb36766c5c8508acfd0b4e89822cbf75deda3e52e775091473be3c2dd60a17cfa8e0e26fcdb68320bf5c4ef0b730593fd0aebc9f4370533f66e043b0e7c930e17526b45f772a6b028656a079d52e3430007220cbc4ff851206c06bc4a1556599c17140d326f01c10ee9c441b70f504a84b9fc0b186360144ca79e88a9d9b721206fadbfb020b36ff325152599312ad22784e67d3775499bbb86ad3d01ed38aaf76933f5f92fe5d5a60f63dd9b8c915710fab0a1e5be282ed25e6d7be2d0adb35a3abc71267bc948b0f8b16d23571ae0c884f38d338472c31218ff15dbbf5ecb1e6f922efa4144701defc09105f402bdd5903671960f07336fea520fa489f91211da87e0e13a406285fcffa82f4c1d1a0b9fcf49c50283a830bdedbe41edd44b957bbd73f190d37aa0dcfed7a517ff5aba30659d00af5312688436c3476167ccf7de9264b064577f5f95e7d96afc36fed3a942076eefecd58d84b805e1e3ffd8e3cb072df178a7db6733a363247adcb34974f10edcba9335911bb5eb4b99479c465cef58647207c86d66e3b525b0fd1fb7b27386bed3a6a8cf6bc21e7deb34becd16bbcbeaaf0a98336c25516636f844ec8821d019e95f418f1e1e353e60dcc2bfb4f6aff38a3c98567e4b57ba601a2cc9517d002d9cc29e0a290bf8f7654012763cae32a652d1673fffd7f67ddecced25c64017ed2e01885080b22da1a13f9736a953f18ce1821ec68e33e47016a0e6035054f71ae4e83771c583d6b300c27773f4efce6154ba121dd35dd3994d940d565e35406033c698f29cd98fbf15231a25d243535465f543f85b943b81f4508d4aef748e3fd2a2da53c3cb0b7cf2bdd1a8042a66b3a62e1664c9e06d226aaee8baa6329a832189e6044fc2d2f48493feb96a2ad3218839d26f0dc6271d534a0b3bec904e0b87e89188c06ff3115d4b2c46720ab8610d6a2b680e34722f9f4175821a989a7adeee6ac0e2a1497a14e0a10d7e77fb7a6bffe4578ace8cfd9849eb3e5430aa4fc6664c7b5588f4d4c6d01c711c3c81d381044b7013ffc73826ba7e6b987d6f37b4fe88d8a29a3ef8d468b8ca213ad53ab1df32cec2720a833426b0c9beab6be58bda987ed460543620426ec36f489aff641dbe60041335b5627b5b145bcb4601dc18459c851ab18615fdc831cf9f2559a830bbb1a72ee404f5382fb1f86ccb08a9df896276084357ddd748d035d5884e27e064a43d1ba6898aeaac60378c49c68f64475f20170003ce1411aa1be0e2c00aacd776f28d9f910614a04541a26d80def70c3baa21db5e999709804d2dd20ade2b14944adfb69cb91419e6e80cb1e2501c09dee6c186919cddbabc9391b19f4b67ce7854ce46d78a36e3d98a5723c93719e72678de6a4a69bf96920116fac01a3321910814e40004ca3b9c0e0de74dc29294d03c8d67bdf9365271b175d91b126ac632dc850f8a98c930137be7e6cfaf1ceaa749a06e1dcfa446c176c03a99db7c1d587a785a3e6612e1e65d15edd72c8326a5f568f2685410413b4eff48913b94bcae75505413b1959703fd29d6dfe7de89388585ad50fbe807777bd43004657561787e9b073bf8abcba9adc0f1e99ab99d8f325801a535806df22744158fef2564538cf5793a0d7fec972664e5ff76a4945ae435a4b94fe0f61334a38060f81e99a91c352944f7dd381a2e243d7c982cf86d39fb28b2defd64c348563bd23870d048d2200fc55dde8babd1e4dde377ca25deb20c9f5bd69078ba1e13a0fc06fe1c25fc03b09478b0f42372160e6384a847fc1d5508806c25411a016e759e8de5a839e9aa5b9a0501fbe6f1d4d2039c7ad33f7d326930c0cc2b6cd4196b90296172dcb52c970c4fe3cd6f35405556747b6900db6b656fd17a7e3f44cc4b5d626a0a1d574daeb1e2578258e6f18a67b53d8b3e46d348f0b858a8ea970a4bdb0aceb6d453277406989952ae4a9f519c90004b585983fc4d5f2e31c5c94d37ba7f9114a706863f69fc893ff909a974eea0baeb63787bc583a4146dae555406707a8dfe44d4b07be2eac6c18e29253cdc861f91abadd6a9870de1e065aad04804cd13a91bfc19aab4492e2e650316b829e59e96dd02fce3f736dc60e411988ee03728a56cdc04c580ca8212bbbcdbb6bb66e12278ef755f40d3a6a3413400b37167ff90adc0bdf08471229b54eefce8302842d9fc15df90fa44783b9fab562331fbf1165fd43f11bae278a4a91ed98971bed8c5727565951d490dc3854fdf91d9b73bee72022f95c7d7e15f391033764cb0442b76243a21d761dccb6e510d3698666eba822818a4dce7f33804101ddb896905c6607e2aa2d46c75f120d120bd","title":"35. 搜索插入位置","link":"https://leetcode-cn.com/problems/search-insert-position","question_id":35,"issue_number":30},"28":{"day":28,"pres":["队列","滑动窗口"],"tags":["双指针","滑动窗口"],"whys":null,"difficulty":"- 困难","description":"```\n给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。\n\n返回滑动窗口中的最大值。\n\n \n\n进阶:\n\n你能在线性时间复杂度内解决此题吗?\n\n \n\n示例:\n\n输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3\n输出: [3,3,5,5,6,7]\n解释:\n\n 滑动窗口的位置 最大值\n--------------- -----\n[1 3 -1] -3 5 3 6 7 3\n 1 [3 -1 -3] 5 3 6 7 3\n 1 3 [-1 -3 5] 3 6 7 5\n 1 3 -1 [-3 5 3] 6 7 5\n 1 3 -1 -3 [5 3 6] 7 6\n 1 3 -1 -3 5 [3 6 7] 7\n \n\n提示:\n\n1 <= nums.length <= 10^5\n-10^4 <= nums[i] <= 10^4\n1 <= k <= nums.length\n\n```","content":"096221cf5b628be1e73e8bcfe626c73477842a8a04fb1e840a6471276d2b030313fe984226cabd5c185021d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad24e733ee0748893ec1b973abd2ad9aaaead95502fda042edff16d6a71829a6f582854f926a2aecf9b99aa2fa9f20e9c059c4c91da30453b7529336bcc29ab289b2adf294254e8684b4c6aa4a41f0cad88bd5c500476202da5eb4a22707af992711c5e3aa7ccee78121863ab25eb6f76f4103e528b7efe7346cb47ee9174148e431c70a92acf5c592dbeb70b768ec60c249d201868715fd0c030aaa481a83d21a3eef94e6356a2fbc9c1af8227931e33270caafa7c84b3ae75d40f80e71871d73e077d743521a8fd13aa4ba7c52aa82e4ecdf71619acf142c38ec848996afba910aca607cb2d269dfd7fcc9d72e8c0508a53aa12518153c0fdd9b5d0f7679ab1e903d0cfa18cf6c9ac971385418e8b6a785213a5ea94099cde26f0313773681a5ae5ff39c7f21aa1681f300558bb418ca6a7057bb613445372d8e44a51ce6029dd5c63ab6755cafae06fd9ef556286580e2c5ebfef2478146aa064bcc17a738db18d44a8dce3b8c565b6786d6174c30f61eee0ab62fcc8ab4fa40e1f845ecda241777557de23d987818af1f351eb957a1f2eb654bc1d005bf2ca42c1a18e2936424082cfca9173d4ef67c9c04b84719b99769a9c484303462580a107f61bedcb8bc96f60ac8f92d3490fda314fdb83e2c2d89c5cd596f9d5efbf99386c6c231398a393f423602c5af33ec1d41d909046f34950414653cfb79c94e138093a1e5ccb205366f45df54f3c9221c9f64f4a99ce5d159fd7280281f6af96caea9813abe246b347f3f94728bdfc866c2abdaea7d6784e314d23a013b45f467eb3d0fe48ed566602c2b4fb7ccc71fa2686166dc4146975c5495202d4d686ae6f174c0c6e435a61f508ad038d4263771ca37b830112fb5430899d1b003e98382d4dbafc6b20b989d778053714e7041ada9f6f5c8fd412cc9b6153cfd29cab4551cd95a2ee8500de2a1bcc51c67d4c127cf4eab77d6cae1ae4dcbe321b9934ad1da11b36d944beb84147102f9203e9ea6a0f4631f4d90c86cb3bbcb3df8a20da4ebe04ef789e59e8812e480c82869a47075e15b6ce82a5e8f5a6a2df93000e5dbffdb23b6f4f8b0d9c9d93f5846924e3358be5188e7b81666c487069265575b94f8d34511a29d31e4829349ab4380aa851e920f6608ce478d7613b8d28bdb07227c937371693acd33e221c4edacb8761662675694f76234c69b3697be3956ac94581b57d0ca25f09568d4ab3eb1a2351563aa74abfa21aed60da8301ee5f49ddf1f2752b6a012461492a5cc78f6c297d1109d1489e9674e1327e2766d7603a504803e9d9dbae902cca7987d7f1314d529811cab5594ec9a17e771b5785f02f7abd16eb12b076a27ee69ecdef4a89bd564b23898e3d56a5c0dd20b99b5e33373661b8852d08ceb5e5fa79077c12bedd46c92180b8ebf3610daf11bd86923d298a5d96e83538468e8a35605077e0455e4381250d622a44b1dc90cef0258072b5db1939de8469d7277ded4161694cb0ff24fe004966f2ef9bd649a7df65241fa4fad3729b15c8e14e2854c5f712b8f3d2adfb575815bf83d12e2c03087dabb91677b2e2bee8661776981021c06e4f147a2f56219c27177488bc4a03b1ff5bb94d6c4c00fdbd618e5375aa6d91fc11cd00096d109f11b40299fba72e66ad787284aae1febbb950688318cf06dc8995ab097825d5645d31ae2cbe94f86f79b9418fcd8be81daba0de2746a8265f1243768bd0ffce1b3b327e343b77352dff773ced2d92a2b06033b08ef618524e20498ed5fc794374d3b6e43fb239c53b4a649d82f1b388b88d04c3e08928fa66de539b67985d32c2eccc80fce1420aac53e8e4b010dbdef405a2be3b7bcc6ca82e4ade0259d5309591b87f5ec9504776518989f250e824e227d7579de84272d8d8d185941117e2dd6a47fc61ac44d2b9a8736160bceb35bd01395cf138211ca3506ec469982d22cd552f64fb9563b0c8fda735be250ec0d7268812d721d3809c21a6975c6d4c2d4805c6c8d43f47297f60e9e7af92115d9bff4c9d29391776c7ad8eaa4eff89536d4b9779919c21297ef48cab47b877a050adcaf839f8d869842142aae6312c8c0bcf4fa35996d7c7cfa70e496ab523931589b77c24789c9692dffefbf2201124e422bac5897b914fa2a97582a4d1a619e0f7842567460e4fc4b9ae06105164a1805e829f34e487809511a012b09244f3d00a88cd3fe1de363d60704f52283305e3ae41fd836e3b9ae8534aec5e8b396723106a1fac0f84fc50afd3f39319fe50e6743d1ac2389d31e736a72241c514036fe5b5af7f9371bfb8e6dd35836cfc8d702817e409846f5c6c71976c2aa480787dd8d4fa910edd1f91a17e177b551369bc1853eac25cbba4094fc60a16d492b2a0144f5ba9159cfd32085cf0bdc72c4b003b39f106b91bdf8aafe32b4fdb16c01d45fab5c0db509d784d6bf8d6df3dacea6ea9dbaac839f2292a57dccbf117c394f3e4df9be7307a85ab7c10b4171675a55efc7697241739bcb9f90bd655e4b8d297ee0a1319696fc4b852597c9d0b2634866465f39e2cf517cacc369a716f77c33106876cb5397738324d0b257bef385b1100eae175ffde8b8ab8957aa787e2fbdbe35a2bfef387c5bb67f9005d0eb00d2a91521759b5acea0f88e0294049b4e0c722fc940e6336c0cf0a1a0eb927459d7607193e751714e0c1a0ba34fb2e2fd8c4f86f1d331f637009c10795f0546ed5d3b9eb1e933613ddbbb9e8ddcdce0b443481c7651d2eefcc34cc25ee5225e54d6b2e3b9ddeec8ebd27cab262de228902c575a134a3146d631421bc7913000ed706c53a5dbf291ef6bdc2c169d71378c231d285c54fdf5cafcee4a2cdc6266fd555608afcb5b87a1c6e203b5f06a990cbcef0c6027159fa8e6253db1f96052ba4d6d7c9646eb6f89e9a506029a7e1cc25de66b97ea94ef0e55b3355efef8f8dd8fbc65ecf8d26326928dfe91ad1040d916ce621bd27e9d3269aba069f615585ead034c78dc392672e4ed405fd00c89e00c507df60a1ab3fe8d53f85c8ffcda8c9dba8b1cd3492ae4e81869686a45e824dbfb29d57deab817e4ee7462c55478b2c2e821c11ddb88aa37db55fb9ba5ed4779bb695f654e1a77e91ddb02a3dcba067c200fbb3580b393d0b09ed693a1b4c7ee479f7c010103f0b41cc4c988b9484b8f06f0494ff62f2dada6c728d4593c0fe678fdf5d1e1a1e37f83fb61edd8a7d02900ddddcd1be1886a680a3c2042040ed2644a5cca6d7cc81a9049f38549b350abc95853aeda819de320602e4da81c0bfee1e55b042088a21e2fbcdd514881209bdc5c69915e29c745f7767f8f9646088da25e855116c98f3e0c4811652d82b429ce221968a452ec564fe15543e28da9834503e79f513a8972ea49aeef4db447e986d896558cfb9325d740115123fe50c60770634060d2a6e59cfcf337bc59452cbd5e41400b9014e4c1f73b9d526758bf41aa5ca26d0e3642895b03b96d3600421634ad2a8ce482bfc3fcfabc74f62867ff7695f959523275d72261001732c2315f6777b2d4e7e11505a532441be1e7bf441b3c3a858d3d8dead5b1af827bb9a2af9abf4909c32fda0ec726d2845f49fac5468d228b949348fcfda6bfec5c3459a49e57308841e44e59c326f25e839049b1c501dd49c381fa71b5f5903eb37bb3674c075495e940110ca86eb96a4e6e6c6f655c352a6490f3f3bcc37f43ad03b173c6f4f85a9af634499aa053f6f70e744c1061baf222d49bda00ae3a19ed8a9d6ba81aa748e574a51b0660fbbdf354ec4a7c2b99ee5c3f76ed2291a07cc4720b584d0a1bbdea5ba9130403b2e834f12362f440d7ad3da197a1316847ae507afb5354dae487e1ab7bef4c87cb77d134847b02df76017b2421aba93494e50f5053f8910f1e498ec3765db248b70eb74826f93def98f7460ec7373c27c4e69034de20003a4f0289b212f0376e0f1d287a53681a16c213327ff7164a3317c107215fe809cc53e24dbbb3651d1c9ead8d38b96f7a774326f537179480019aaae6bd9c30722916186f1f93c18951c32ead949843926935c132e9fd0f9235b524487b8f5f378b5e737cd26d33eee8a2496d52842afdfc0486c7b5b367d3023d3becb8bce509ed385208ca1d3e1949f703d263936cf47be3b619d3cbbd7359fea61045879d25caa1f46eef4d49ae521fff222140f7147a7efe41e15bd679a8b537850b8ec0b62aa23d54fa33a00e0c65eacaa611177a129ef2a24e388bfb887f01d1bf34c10581e47505c0877d5c7b90fb71ced527a6a9d4da5a93e3a2dfcb60ad3d1b62bd7accb6bd0f7de9a91b9230857263ebce91349ee65a1f00a42cb545ef0fc14754824432f69ddfd5b460393681fa744486ccdc4cddf1dbb1e0912bf3489e60fc00b7ceda0dfe97aaf4d3628fc7e5c8f384b5d70242a8e68b858de048e0f41831546103af4b6656aa6bed42c8eb6b609fefd8ef14a63327eaa538a1488a181d85d70e180ade3ec273232f52a3227f16bfc50354997e3e584bb3f3db68f3780f6a247c0415eaae9858612068a5a4aad4344a54177cfbf1b1fd0d751f02100f03dcd302916354880d78ce0502c890319dff7316c8a7edc4bd5c5d793e7e68562efda185a2e81b00f95005a7a70b84d69dc14ab00d81eb5187ad251c48f0e2ab325508be24788439cf171987d08e3d1547018f61a4161d302971248147556f01c46894adb54e9e3001ced1f591e583df439bdfaa0f00e29009ecd0d5203ffc346ef008092f2a3868b156ac59799661dc496eaacb4232fca061728af191e5740414fdc357db257acdb1844d173317877120cfe9d45f5b5f21dd075d5b826c6fe0d92030507751af8ed83db5293d42b6642ac9491791e20e0795388df6369f775003bd3f8946f5d473e95d33da5cf0c43884640ccde96aa89b46398bd6e04682cea2e1f03f329b9f981e269867bc06f428872f5ab25f4c3f45bd3d2e34b7d0063da741f73007d720f4fa7380aab5fd60b6f5e0be8ab94d21c122f286a993b3e579e9c5ab6d33080b26645e76c7a06006e5b7a4b2d1e85e8c011e804c473138279ced96782cad780e3c94149b8c2ca835f132bd8aebdb0216f848f774fa47343528c9308f33cea5a6a8ace9256a65f3963d149c7d32fce08c895605beff394bbeb94f4481e43a648ce8f9ac55e616ceee508719066eae3f5f2dececfd99ecb38510672019623ce9e51d7301c9fd64e0f44fe179380ffadc65c919e910174548f50fb213cbf2c52aba9be6d93f9f25b86282c8da2ff53fd80590cd69e75a7d129094fe1f5c67420383a6a138aa30448d65117ef187586ebff7ca82c961cb41519839e9d5d60fdc30ce5e9e02cf67a0a5532ee7381d8d4eb16ae4a472ed96c1258a025303a23e5e63bdc700f57a5adbb81cea0ff785f346b0de80cd7fd6e207c10f727491d6e83fe6e9c3cdabd4f0c1adaf509abcda616b1358d48633412365b89da2199efc8b68e16194052e6bc5f338828109a8338a3f8f12e3bc8133bc8eff1d19c299c8667a0992a73e0983acd57b37ccc188985a1620961360f30168471ada82761aa4b0808bc5526373dc61eb6979fcab1fe34cdbe59817ff0df2f7b1bfc9a88ce2d1858345cc054fa8ac844524909220b55bad65e2fcec449a88ca349297186780a7fe6bc34dff6d34e1b4af36cd61dd047b8ad46228ff9a1db0860d6c8daf9c4571fec96edf5728a735a56a3ef5f849ef3de4ad6173c49ff86405573773595f0809d35bb0a9de169bb4701143690e7c682254d56775c367219a5ac7fc1443fc51800dc342032eb7040125cfa5b50dbfeb3896802584206601e785d099e967da1f0f77b5b1482ba69d2570b5421c0d3f7b581149b4adfb6c95d8d36377d9056744528ae44991bc7524fd15653d53ac7c70f6f3e04c48c309a378f382fbc36368a2c9305c483109472003c25393c7b7d66f559f47dbd0f9020786e39dc6c74cb036ec454d7daf9136b55b3f1edd196b61fb46de5eeac00df69fd43ac3661306887be95c9cc27a702809206974a49b7b51c940bc4ecbc7a611278f9150611ed6002be45d79468fa591aae2de7db095429ed9e84f3f5751ab9d13a822a87ceeb2867bc94b33e5138b0b1d6fc7686f6a91d2a8a351b30526fbf2737cae31be901cf41e03dc215e07a08e9047f8eb9e2ebe1ffdd35f5cc58d6f920cf03ed0e0ba18f0bd708297fc056920be9170c6afd790dba34461a2746420d66a16e3576e0c5a584c938f31a04ec4e933a77727df92a615b088a299fe2441e49610b04c796543b05e766027e97b670e172d33958546a9a6c305b01e8ed0874267dbffbfc9923b3f13166b957c95df7be293d1fb35a935380484b4ae9a35c45a6821f81cb07b75324700b6a95db1b1003a3da9b7c8a3b774b0ff417d892cc7a1774539a65c70eae5e85fbf39c50bcf4a2603ea741f108bc153bc9c5a4612b0570a4d57c6e91c188e963f8d0f899378ef2df749124b1b25184ced4b8cbefd44835f953117dffa4f73f1c8ffeb029f0456b3345978475cc5a9eed6165ed09acf6d1c819e45e1b22cb9ab68844e33b3ccf35394afdde85d186ad2244640e85dcdd7b2356e7299dab3ac2eff526f0ad0dab29cb33a03d06ae22dd6b898032ab0d8cc2628151a309f1caf1b1b2f51ac1693692c39d315fdd56a0ff51a5c25e834f9db1191a46b666be2e53c8cea76cd6a16982a003d693898cfbb4768211d320f14d59b57d5388b365736ee6d890d6e2e52ed1c8fba7e347c5d52e0c5b20ecbc2d8ae9e54bfd9fd3f8b3553a44ac86a9b212e17089283c355b720314337f170440fbe8a5350c9fed51699329b0a862dfe217c7b3ad886d95835041f25510e5c9e77b34a8344bcb173d98120dfc627cf55c22d3da86fda8eb51164ab991de90bdb577d886ed0f97a02dcf6b6d2617a8db0baab372e78768ecc64771471e2eea9d01b7a1a2f1d26dfaf6082cbc911e1ad24a48ed66c123b88b360025b1d6fb50358ea6b7fa9ab1031697520ed1d061a18b5aff1aa9c42cbb65d323e75a113098e18501aa808ca3dd999330c8eca2a27390cfb5db11deba262879a199df1d5b24fece95433a3d129c835b676a20b60dd98b97c76a266f2f678ed329d93946d951cd2ce59460f1c794639588c6d4e2b66800acaf30a01e760a1e18f72a52cb1140b9cdc48a42d583d53428b97d48b1c1ffd86e8386ad5d7969645c2d361492232b23445f124d31091ac9a7a3f1ec13df4913ea3e4f448ddfe3942d011e9ce5629040b88064978d1f7239bb41572d8459d419a9153037c249cb720277abc87d5a31efede2a26aa36d2ff24502ad7ee6285560c190436a89efe9d1a765bceafdbeedcccee7434b0ceac98849a8ed99f2b10d24e3e4490218d4ecc7e6b7d4ea14e75f08b6ad0931900856ec1149a011f00b5cdee689810fed2c8e72446da89bc3aeeef6e920635d1dc97c4fadcb677a3caed50aec8550c8b98e3261ad2cf824b9204f160ea63f9e3d6b9f35a1155943144fdfae07dc7adfd90060e7a0ac59447e02cb207aa0407758e2e5a7668def224b1d9921fb74488c881f52f5f69358025784b5e54d7df13a0c78d686c800ab82a00e2ab541110f66456be22878afe6ac94289143e1c6a9a7816ab03ea1ece79a0d8cf1a2db539bd7ad99f5f13782205b8b03cb1508bfb8b20d1c71bc84e86f190b6f4a02e280cd8795fa65b06761c4faaa4bea00e6e26f25f5eab0cb4e533d0c8c9e5cb46c65e8f66a5ce6644e6382db1839041a98e16b1f3f2055c4ad68f1abc3593c111a9f9f1fb6b2fb0ae812f829ebc4ddf7190e7b2545a46bf634d09a11b1021ab359c7bc2fec07c090d4d4096856bf50c739525faadd5fad84f7f64297f440070cc4d67d23680ddd87fb052874132546d982a65a69e403be2a6dc5346f469a6c4f9516db29e82c6e51907b18784f62e23ed147ceef53df1be3cd488ef563e5a9f875317122a334fe91d7ee033901fb33e7392a68c284e42b745ff64115b029735c114324e8af4fbe27731a3beb6a5a008fa9467bb64788f29432cb0da8e844945896015ed2417c671f80513485b020a4947a99847ca7bdd8a1bda800d10a78f368c0d31ea780f0a40c997f6903517a27e55ea99872c20de4571b8b155037f3833c477c1b307b1a1ce36ecbf5f30e99a6a7e5498bd18ac06a553eb503313040c387a6e7aa7ddb298c66bf9032443481160c29ae31a59a42b0c61ed06f18a53153d21dc43f9e1d70684ab21e0e9e72a3ff2f38bd95a05edc5848f2a50c091b60c7359af215004cf5c97ca2de5fa72751c035979d92bba7effa61023537666a23b9ebbaca5b8da8c5ca32c21f821dc27f718478c864e646ee3c2708844831e2fc23446f138ce2c61f63e1f2a27f11e0fbae26305320ca4700981a32b9f551290205633a77f1d53caf36fe7cffc208ce8c968983832e1ca5c00f360f677ce736be868ff1aae6c437eef8c7e7b8fbb4acc515ab980ad27b5cde517c9c046c5389b690164db0dcb261fcaf280cd67a5857455a00ab15103ea34009ebfb94e724304c3119e4bf88c3254e11908edaa83849dda96e83f92ff6a6cd697f48392127913d5ff5565281fc55f0587f90b9c2b7b151b7ff61546c07e1087c4a18d841dbddbed9b3807480d67a3fe2e020cbcadfb612cd9495eadc358fe403f8c35442dc684d9d3018bc185bf9df0ff9091926c304c10ef6a84f1ce112f73f1e4fffddd3c3a9371ed800a93b53918a1fe858e6af736b160819a6e35ade2070f7e7fbafeec2c3798dca2eff680b78e53651b04a029f956950b151457ddb2c1668b5fe3ab01db4164fa660cfe8558d33d98235fd11162fb914dc5d68ca3c6696bce35e3802060941071f615d3f135bd3c70ae0de0be97b4dbd6c5d7bace67c80d716a8ee48d880f62dd654af933e58b1f59c14cfae09809f35ab7bd5b120b3434017088e02fb5f36b7bf956fc743ddaeca03b65b40af165f7394d5ce77f4495beb92c38c48b09d78178360cc06a92c14e0a772503c1cfb8dc2650d999d0c247b8e3a6226b269969581df80884ae0549e377b3af59fc8bf741106c504810e7a095059b8483915be636cc0f0d6fe1a156b75a5e09b10d3d32439446c3a52367235710b2af7ff9b62bf37fa5db98cf4656e9efd970779b6a6a1b96323e3e2157c8a400fb549bc205fca084cfedb5ff0749b954566c3baa0c3231db4d6d2457e2dd96c64f1e67dc6644e2d838d010d0c827d325bbb35ff80669a4a0b270f2119289f4eed2932ea54cd3458eb1cd8935f208c03acab39d8672ac73b09d9e58283ee505a8408fec2ea52fcb1f284bbffb32602a56fad6b26897bc0c97c3f6b6ade4ace77ce74336c24720925c6f334b2a51f8382d14170b623c4c06652a5f7ca88f3b58eed5cec412568d1e4c4908056e598ffd9cfb4fa880b5b6b9702dc0c284ce834b7379c8373933701d020780fddf06dce54101bcf8bb1a30f5dcf1dc649c05266da46cfb96070b98cebb2780cb0db2199798500a01be6956c74dd3ecf6ff94d355543d4bec34a473cb4a936df9def84bf221fd8215cc507144d2027f08ac45a5fd71d471b134d30df7d01e9687285ba60cd13b438830471d49debccaed31dcf6e595332926d2650ac15d85bd43039a01d0262f721cc47274353fc720c59601ae8248ade29cbef8f4f574df399c909efa0401564334b617e8fab10973c6e57f580f54173de013404c2809e7139fc222ddcfe0b4fd40238b8f07aa68f0e171bd15da4e133dd9c5a457d52beb019958eb4c631b8312e6e05491f443a49127a0540d505080a5f206b8b5b660eeeb9c2c073e2801141b69d61a0f0af4c364c59d7e32b22a135756a005ba786431bf225ecb1637216f041cffae573a41ae44c933073276e76ef034d4041aef7cdd33be279a52fa2032c7ecc94274c76f9f3a357c45a6c343400a24875ee9e4a14f2341521f4d686c50b4c8826c4f42e4d259eda07288076eff2a9dec810fdab5a74e1aace3a7b15162ed021b041a2fdc4e59ead290be11f4060cf8cac3aff0ec4842dc333fa5553c5ab9a90636e17f17628af95241adda31202fcf7ac977123f43aafbcda3506e43cb5b232b38ffe28db158cb32170ff20aab2525f32bb847c953b17d39429a844029ce864118984cfb39a0ba7a283e41223faa78d53e0dde26938be526d9a4c4b6c1676be5b0b08aa02d723fe36ef3bc3c37b685338795829a99ebd3365b4673644481f0ddb227b74db913ef281df81b6151337b94da3b3460a2fbdca8f2c7580d61b210f25f9bf5bb2741ebff571328526279e8ede50012f028c12500dff43f25c7855311336c41870caf0e255074a6166a36491607dd6a5b49f9c4c8c0bb05a81a3dccd521ca56a3adaeb7bd017157b7fc4df5e397594de36a38a5f8de63206562d15b2b33bf84a183816dfb165f95af926b52e37b20662fc29995ca6f3a68365cb00b6d51a1f5664cf35cbf37de43039266fbf4cbaa54710160433ccb193e75040773a389b3166ab7863f440be457106b8c6afb678c0bb19bf9bdc576fee31175207a19667beaadeaab6c5bedaae0139bac2a43284eeb4291b151ae7697dfca9c5236833c6d5f67a3a20fde004ed066dfbabf8a4ebfbde6a167d265a16cfbf3be820518dd41c691cb3736fa7d1a038c940ad4aba2ad12d75e6ce053d57f386c6f220dccf9445b420a0305af81b63655c847444462da2775add1fdfe31ee1e46eb233523fb84441821c88f47633c21f4c5068260361701cc29b6f1c461f55b5a2adfae8b7f2d0c94e28cb4a18950546a36ce79b137257123f863a256be8973716a77e6f6ccd6e8cd7b822baf39ad2006fba6092122d0d0286195b7202caa38593e69c0851989cbf27ed7f99c749f869395064e753ad959acf0ca7f33c5bc921c0f6e2499f41184a2752530275acfe64ea72f26a56834679f041af2463dd53a84a61e57d8357e2fbd642dcb1b72ab558edf9638e0ff7fa8285a3a82a7595ce0628617f8fb4465fb3f006ac25a4ecc8e5dae7c2f09c0efe0a3c6d208c5fa48f0d348900aeefd786beb0c3cb8ba1647d1e3411e9ded7442ba5f9bc792b67a4a543996c9aff447470246ebc5b635e7a6859bb5aaea06ed856912b2b478857863eb57b1425ccc026875a1a3c32155987cb08ebd46b40490064d7be63b56c91f6081a60d612069e8b40021b7d66827d24581e65ccd31d33a2f6d506e36ad4f6da2b12c762a4350dafb405e77eeb35dbb23caa98225a2bb7a61355e5071d6c57eaeb2c322eb7d9d8dd678ea461971f79a07ad771d2cd15f4734560d01ac7643bf96a4f6702f74f1c1cb02dc66771b67f6188c19866dc718256531d567d28d59fa016a66e5407d25ea54351922c0c8a2def66ec9efcdb20aa709354192d49274e60bffc08f80c587b70d9345ef138de2ee8fd4d512d94bdabc473fdf6d083654412b8d33eb23bf0c20b1a4e6881842913e1b965eef19201f2424f824aa4c9b019df3ebaf47070f21b194f0b5b50b9afd8b48234fcbc6c5934d7fc3dc0ea5806d35ea05751b59252ec07a248c75ee6af6f9e21e28cb6aa225d639071d2bca96a8786c741546f8d3f41d76f497c655ee4680606970636458ba558391f92b846e7affbd8f518d23e6e820e1fd3d62f277f92e0b22f53c745ac4857fb35fdf597b9d36039129190f13f96b18ef1e0825c6070a003dea6b08fd4adb090e7c556c1f58b7029fa8f5d6dd2aeec5219dd146e405b64ec77ff7a8757ebda4e06eed44e7b052076f51f1898a6253ab2b6fdb58d71661254ece514e0889efbe2220829e2f8f866cbd1aa745aca113ebb8315a1fbf1d6c28ecfa41723c971f0dce61348f832002a8d0738f511519a720fa6a18a65d7147e7cc7c72faab46321d17d85443c8f8e261ca95045daac6c853f2719d17da026da13fbd6a8112f201e1ad947523bcb84d1fbe5b3c24c70bd62e5e359f86ab4922471c7d05c35cea2d87a199bf7eda12876c4a1235830658358f78acccfede92a5cbf4b1adbc37bc398fce80db2f173ea9333badaef67d5316b59085e656ca665552f83c4bd3946965cce75a9e8482617a6572ef21501b1531879cc8ddba73185969ab036b61760b602b42549188ca1ebff58fb9e47d68a35928927aa329fb4a95d82962b9c220db97b1e9b405d34ba36d51d1b6689cd71fc3fcdfb091344de8e27ec24f8fd41d406206fb66413c87b649b3429e5ef1979a5b3b640fe6b34b0b615ec174cd8229e738222d26210418e8d06c473f75e9baa1080c1475b31ecdc9495ebfa261d1619be8872dd96980176ec85111f7a7aa91af218a26d5e70fbc0d85b1dd5e5f9596935f541229c9f9ebff0a933e0ae824f99622ea8c340123d4e058af189aa1fb449262ca39ec2fa638e988dadfa7cec137a490d8457cb4c7474836835c0de18c4ef5b6ff3da7e26f594ebba87066b42d2fe77fff4036143c0616ce5476fe91f451fa94da8a3ecb210a83d1c7fc9b79fa7e0cd5cf38d630d7c17e2548052a155f901db0a32cbf761af50b4403d76591d6e6bac9c513bf893b730a85185a4d5e2733ee33c846bc1c4e2880dd636ab59da13f07974fcfab8fdaeebace6836d25c680e6d154394a79db3fcb2e038c80e0d1162d8276d2ba147218045129dfcea9b0d55f9c9f35d399ce6eb61e0038678ea39d559c2ffb3a60ceb04dc61a8123134da37d49ad7768c0c6f8b5e55736e85eeda9fc7f3a6e6823a6fd20c50d02505be87fbed6ccd574b933e412fce7ee3cd861376088791c1083eda4e2c591ff46929bf88335f6a0024c01b6697d0155fc2e67fd1d8941b019c88c7965ae187493ebedd0a31d65ccd4b604bfe9bb9eaa59c6ea635a425bc2dd006418d0418b825b9f3c28bbd7bc8897a48d196874463d83885992b3a4a9bd8a1fea53e61956e4ecc3b6d9070cc130c4e78cc75d5b47d3ee04956afaa00b342f8274b8235a37db7d8da22683e0d0bffcaaee4e751b7bc22298bb5d7dba0d0123891ffe110430b7a29ebf1b4712ee283b62b19d48d797375604fc42e04df31b9cf5054cd44fc72d5b0fa7528236cb00d1c696387ca6455279677b340484341b25148c4a99826cc38de8df666a86614d3c2a2b670ba8d918f4ba24bdfe961e52a8fa47e88ae0d8ce605d2d701eb93eab2204e6ca775c09db93979e78d80c14d8bf9174184e580713e2b04043b20c6210ba1a16d1ce167e3321e444f95348de086040f4a8ab73db8b2519f5262714f1e5908c3729ffea115578193a6536a2bd197dcfc117e724902b404686e3919d04bb1a0ee3170991b852b65a09ddce059698ac6f520d3776b41828df8bc65124f96b6cc59adb5928761904c945163d218904621a6ed09e2a6469583e6b0a5079f584ae2b88a14ad6042777f46a0362cf3746f9ff0a80e736b321af54c073f1cc53960a6334422ec21e9c9f70c7aacb6ef6a6d19c9102336397e98d4bca5451f1c7b414d61ef122b3b589788ca3e5b7b4f54a1427fc58afb4328aaa9e7fa36d95f539aaaacdec8095bc36f773eeb36f87fd113b455f8f6589389b4ed161f462dcfed4a44992ac968307e91be21e4297940db16c287d8a84156d7242c6393c8eeca7df85d56d304764fd533f62bfe0382ad13385b856a32e028b474a84c29679f703bd6fd81147c4034cccdcc5b453da22c094040db7887a7ac7eb3f804fbce91013ff640c02d5fe24b2eee20a847e2505e62d8fa6f0824aec1ef4a1ecfd1fe08d5d646d1d311ed64f8fdb310a450e651951131d0c73079fcb459d5abb6909c8aa82282ee1b9d85ee38c350c20e9a8ed9979e2bc57d4c34779e4ac813c2f2a4482308910741169d90ded6cb82a40fae99f6ee958512f55e4d8379d0001211d045c60e20cdb87e3113b0909b87ac2c6ce593fef8e8f8116554f30889882c930e7c80b2455f9e8c7c923c927a74a78e810d2114239181e36baeb0909f4b8d8a4dcedf341cd124ea83d84fc4f14708e5b8eddf14adf8536943b9033e91fe07b72a08ad253e175724c7715406e86910a8018a0943ad83d12d6cf2e6c5f6e618ddc9e09efcc542fc09facf97ec1f412e4ac4668d3c49776b090d36f02d6e8d1177e33c69b1300e76528a3c6345e2fa5e1191f6851baa1910605183e108aa5cde7888f804b80f62d9dca1bd01c064ff38f30b357f9d51d8b7e3bbd2f0e691cec98da58bfd94636b17c927399dbc21d86787c750fbdd4ec130f359f1d301440d638c155b287e74d7641ba6c898762fc257f7408458a3ab4be139b655e700f3fed9ebc6cfa158ed8fb93dc4be874bdf79ea752768f1a85863943af956c0bf319089b3ad58db6ebdbd568c9b5daf29966c3a70ac839ced3d055ee4aa18684b8e7990513665357051b7413dadcf5a319e79556ef44968c0db41021573a1a2de4005bfc7ea308f808173e53a5bb24392cd7a6e57b19a7b4a4e528edf82fda92a20dfdd3dd5178f383986c9d23245613216d647802e65cd7e379be1525e9475ea5fa91bb9c2ca00c533e979ca080d6c0593b55ad2721d86fba3605c9e894357f7064f9029df684911149fbf1dbb82179e9459a550b7e79c2297779ff7126676adee16d1fb0bfd7ef7f9901580c43b85423efb1eda8f27e9ebde99a494301934fa6754b6e27529c46395e9939568510d2be463c93323bc9a8e308ecedf443426007f836a50289166ca0b881908a165310d0e67018d5313c277d31bf8a44f59c7806880e45f5a218a106baf7f25edc953302965b8544ffbd08107743ea03140c2be545142cf1f8c61ebd836423fecdc35003b0984fff0691b02b15a8d7f6336739194dc9f4681142d97adb2b268b34ac950a888cd006665d31f2f35a264f5d7b92f949d20781331621b99a507ba7e0133b2b867df4f334b026ee981d508d030c7fefa498c4794015c3453e78e3017857c074f3671f5254951344961d80ff4f44ff6e7608eacabc8a9108b4f976bcc2f88f0ff85f0d0f0de86db3040cb633a2e70b246484bbecd8f61c8355f1f53db7fab72eaf7d3734b29ec55282b15d5bcd2631d86be95e2e7257f4ef0973e9cb2cdb41af1a9b6070a0792a43cbbd877eac8d6fbffbab7d4b919cccc2605347122d58a0798e2055af0836896d3f1702375465217b99a9b8dfdef4fd03c5832eb0490a4e8362f97284e74851a6b32a3982314463b44ee6e7b07d6184cb24d2a350e698f3c58e1114fea56580e0e541d4b41d8371390d23f6337563280516c497b205d6169214f5dcc87ddb465b526f36da3aa0c3fea23a742b5682217fab008b0de8717f7a851823bbe30fb5968e8d3e82e2487dac505952948c533512702a296817f751015e83001958382b2d4ca0c63efb808d10bf059552367a8649e67e9d2ac8b8f74a34414a73149611c049063ea2d7ddedd923c3daa1e4503e6c4d0d1db6226d32de152657386fc69fb67802e3deae9afdfc460f10f05895f58d2bf6581a580ad7ee31d3217521900c24d29255db1a21759884e847396ddc0f76e0334d50050f7492d78b695c8a6fa3eeccaf50ff41b94763467a97c5f53cbf91ccda3613ed767a60206a733a9f7c13cc93b703076513dc8f53cc7ff8de5f7a27a19e9195db178d551b58268f860fef0138cec1fc7472182814d02773d8ab03df13948251381288dcfb4a1c28f958129023d9218673d7c81d93fa61edea50f9d3ef81ab134e5e2c48a1a9944e2a049b6d09c53ca0c18d41a319f9671b4d2bd08b24c2c6385a9e96ea48e9c0070b71b04f779c6fcf9f514b48e2fe78fde432d8715b60d2cab602358c675352e4031c499498e9176a6b8ed91a601c780f441012214b65f3ef9e1e0128ecfddf47e696ae0ebf8279e430612c40d609520d90f5fbd3f22a5853f76b8ab06cf6c48eea46e5ea60698a0a05506ee8b127d0f7745803a547cd67fc70d12e3b3d5282b3b9719dc9d442fe9293cbc56088abf519acbfdacda20d75f86f2f87c6d7ebe5e492483cc3c8c417c3463b888fc9397105a52402f1bfb86bd6506fc788a8a53bb76e473caa98a71a6359bdbd4ac5dc9e534a9a575a79a58b63c18c2241d30a2cbac157ce9c460aa7a66e3e154022dd6261b79d0636278c4716282ad4e2b801902de31b22b3a17dcfa44f320394985736c8d57d7d90739d7852d5754dedc105cd5e980034b0a1b2ee323d34107d52104202aaba8fc1d094d8e52c097c3661862f4e8e19e13f36a5c47bdf9b30691f697e6a5639a15348676024bc752cac3f354053bdb8fb27bf4d36e307485052bdf40c01e8104e","title":"239. 滑动窗口最大值","link":"https://leetcode-cn.com/problems/sliding-window-maximum/","question_id":239,"issue_number":31},"29":{"day":29,"pres":["图"],"tags":["图"],"whys":null,"difficulty":"- 简单","description":"```\n在一个小镇里,按从 1 到 n 为 n 个人进行编号。传言称,这些人中有一个是小镇上的秘密法官。\n\n如果小镇的法官真的存在,那么:\n\n小镇的法官不相信任何人。\n每个人(除了小镇法官外)都信任小镇的法官。\n只有一个人同时满足条件 1 和条件 2 。\n\n给定数组 trust,该数组由信任对 trust[i] = [a, b] 组成,表示编号为 a 的人信任编号为 b 的人。\n\n如果小镇存在秘密法官并且可以确定他的身份,请返回该法官的编号。否则,返回 -1。\n\n \n\n示例 1:\n\n输入:n = 2, trust = [[1,2]]\n输出:2\n\n\n示例 2:\n\n输入:n = 3, trust = [[1,3],[2,3]]\n输出:3\n\n\n示例 3:\n\n输入:n = 3, trust = [[1,3],[2,3],[3,1]]\n输出:-1\n\n\n示例 4:\n\n输入:n = 3, trust = [[1,2],[2,3]]\n输出:-1\n\n\n示例 5:\n\n输入:n = 4, trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]\n输出:3\n\n \n\n提示:\n\n1 <= n <= 1000\n0 <= trust.length <= 104\ntrust[i].length == 2\ntrust[i] 互不相同\ntrust[i][0] != trust[i][1]\n1 <= trust[i][0], trust[i][1] <= n\n```","content":"096221cf5b628be1e73e8bcfe626c7347c8e248a04fb2cab0a66692577330f1937ff9e4625dd8f5c367421d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad25b7639e030929ca4418a3bae2b83edb6a88a5c6da56322f6dba7ebc9808464572752f6099443514af3c014624e43f731fa24ae99477d52003c5112c541fc14f06bde47175483d6f18333a0f284f368e6ad01dafdb34b36ec8f727f0c7486c05e740115d88bf9285e1f05f303ac3c79934c340dd84e970059b40ef0e22f37dd202838ff07a3374b4bcfbb45289680680718c3aeccb501faa04d83fd2c3af5aec087c63d0a7fd38ac14988a8248e0d303338a8e06488a98a9844a84574640ec7435a47e1d8960cfd258247a1d3cf1e81846fbd5038c38550bf0b4d4596551836f72b5c89ca252a9dfd7dcc9d7febe3428879bb1151be97131d507c85a86bfe278648e7abfd9eb896b2df4abd27f3973400749dd7c59a069fde2ef43113436a145befcc13caca29a3420e330567b96b87a9ae02799b31465e40daed6957c44ac6b0632fd84b3b95c68711e5a32d58d9322d44068fba4241513fb632d5f63e1899e316d06fa5fad1ab48f2007e31ef60ca08c6850bfffefc914f8c111e8b6a0a720715319b06b03f438b9beaf87ecc95543e2c8778bc23265ac2c840d5958d2a2e87bb5a5f2974cd3201a0535bf56ff55f43abbc81221b0722a71aa604ee16d7fd8ad644629ab190f6690eed288b020ee2c2d89e7aef97e2d3ee849e3c5078cc96ede72144ebbd9754f10ccad23d791a2044e35d647950cd839e9ed1371c1a1d66e52c587af65ee04c0e9622c0c54f6284c343009ee90f01a3fda28ff7e8a92aa1f0435df6a7bed7a6b2e2976c2f8b7b1150785f15401991cc0fafdbbc651670fd53c9d2d6741d2dec77a759a449a5c317a8f8cd61f0582cd41e521ab7ace126abcc2a04f0b89de1767b45a3942cb308a604e68cd1197fb64b698c5792e25f60d1a8222512c081f0ca0294e60d58c8f83032ae0714922ee51a021880f6575a3e54972af400dc8e77a2266395ab9bea275a4b6b895a1416bad90883ee10b11625d544eaea1414442f8f0392917b035841f5af13a0a357c19904149312f859cb7ed18d73d7abe9df96460e31470391890ce4a86d765549074b5ce7a713bfeda3286342cc22c9dbc7f58a695f8e2487e1658200936a7f356f38354864c421a787c2b8ec748994b58e82d8123382967bba32e927e46c18fd81a7175f2ed0e26ca1f88a24f3d3582f1c42da8ad534260f75624f0d4f5d65a11477988773f038ed9fb581119aa3dd42d604f50b726e7cfd30d07b2acced62151fbbc4758143541dd0bfa59d8d2f493a4dd383616e2f444f853390960f8c23722366db1b2b5c5c7ef2882b22a97b00ad251c61d68eb53637f3d924781c3f83e7f19e4420d027d0684192864164c046275c5f8804170275d0098e3d56a5958c6ec2c333c1a7006cb88820768ecda1a93114301c121a0e9c21d2f0a6b17f55c00ba8878943788360d88e5a7502da079cd08aea7ca8b5941cf9ff334934b1d1b2c3f1159a9f03431a12c36b970db5a40eff87971d8a8127ffd8ecbe651550a818e3a2d78dfd474c7f448b15541685b38e319462c324163f3e998c6ae1d76feae6b0b3a2818f0874fc0e443ce397e7b1392206c4e215471c590996c5b21b202e80b8fa815b3ba2ead2c78b9b0ece5d241ceb5b7274b3339681ae19d9f22cc2aeac6ef408b0fdd8e2e8a5d0a5da843cb20849cec9f388653b12b63346653f9c761a841741e4cf6408e1e77ed79faa5972e9636d623d57c789f5a27c235308205c06396c875265b22df50c0e83ae3d44746532677323984113e4d274d19be513a6d545bc8dfcfbe6d4f1d9ac16ebafc0ff66d62fb47fdb3faf1e78fd8c85919b866068c77da3b8bb71b5cca94b8ef75061a119bf7f09e3633dd674fc99e61574993776c7bde49a8d07fa55bc0886289e9c3e57b680f6dccc25448fc214f47ee4579a5c720ff28e8a381de53ae8b3c81ae2b1d87bd99843e25dcfb874f2a0f57609f3140c2472b84dd3c60d2bb308981eed20523499634182f7d1a9c1ec240c05a55023a9ea4b6b1410c8c5586fa44be2efd4f71c510002f53a65d2a8981abd0435be9be4f4c2ab45b766edd46c3572d200548a57aa9f5b60e3c005f4794dbc7896e7fec8983a4b4aa0e512bd45c55647249a0f1f2a1182d823003fe732abc4a5769176926ca604a9e68edf9fecc34761369480011d1888795e08ffb61ed8947eaeb2edce38ec6788fe0df3b0559dae5ac79f7c2939dced9480828c284085277ff3ca61f1539373920efa956d21269e69ce0d3fbd23262918d67bd80f90aa8e62b72cb06aad02eb8b5ac88bf6e5f4afe87eb278692549df122febdfdad3eb2bae07aaec809309f5b77d78e48d1510317c9b4bb10a3ca89193cefd349e5511d3af3398e6767b9174215150d7a6593370ea57a6a3aff399730311821ed9e0bc31db32cf0906712ca190365f9e53006a4fa7bc50c023400cbbf1b75c9d853a9bb1d6f44d9d1c5814c6a7a22bbc5258efdcb6e503504172f01faf001751b85df952972404ff4910f83be69310391d0c0bc355350a08fd24d6f027f03c7573ac0302ee19aa4f74b3c8520cf2ea8732b3cb34e57cdbfdcef8c6dc8df023e4f4e8e5600080720b4035777af8414e2d0f2a68b1a8f4aa162373f66f86dcd86e0464ca751748367512ca6024b4dad27075346caad74aedd83d138283cd5fca3db7b6d4e5a3d2f2d255703775f96de2991d0b70b780e99693e3ce04805a61f4f2787e7c65a41aeee21b10204000364999a5b0745cede1fd790ce375b163dac13881ea82ff0519c6c0bd788ff73743f0258a23b77f8478fab5b9541b967801150dee13c0277a52bf72bc92af9752b449777cdf4406c767c35a88c70b24780c90f0d4546589e48e921ed83219581b3febe0dc829ad25d2a7834fd276dfd0f9b0d37f2b9fd66a5c2d5f88f8be0b8d6ca99c92051b0469157a9674d9dba8c14644253541004ec1c45a7cf92ed6573991ecc8a5aa46fce32e03b2aad4602c352ca55978eaf70c185df84765555ec56359c4022f944e45ef62046f4e8947307265b410d511e222c09e508b21acfb7878eb0028b5ba28e80621d0623f0f071cbbfd34ec577c01a86d5476e0942ed3996477eda6bff4a7f3a00a86855a41c0b7a9ace212da903cf177fd3eda5fee2a7c72d3ad6e2b029fa7606ad95f9d99d59ef461745747708b491065d8f487e871220d84482946e9052189cc08c9e87609f02f73b7df4f55580083c175be81a54421500f7a0900aa4887245583c5d3f7e944ec49c03fc54f786d1f2726c9301a0061bce1200043d3e84dd4a84cc0fac292e2a57c5669de0651a7737dc2545e1fde62bfcada181180ea42dc6f2a7ccaae04a3bae9421ccc33753a0031846245dee5cd0efbea31644f1cb9cd20afbe0d863215d677e15922da1eb68c591207baecdc72b5412a575a8a582d9a5c9d96465149f58b4fddabed531310b9bf525cf80035a71a33cac97e1b94a3a22ce5a1de0a2785cad6b75130223495adea0d21744fcfa7d07834571d24df2746b8b99226ed59ccf9ce7a7a5ef9c6da4a46b0b30204152476c04972c61dd3a3e15662591d898b74a9c2adf7703b123332cd98033d296e66357602aa7ccd71d15d2ec219a729f841dcc470271c655870cefc26295ff2024b5fce047b6c73bbe95c9330986be61f2a3b5bf42ff248fb240e2c8ab62c6e053073a22331c1681be4c4bf2096334303880b71fa157dad4a8c4dfb5a9a26381090ccc88e1b965fc07fec334bdeddd757f811c371c055d17435a2ea54dcdd7d074b595764e86912d390e032b5d6f7b8148afdfb56082872f130f73c4a6e8b9c3b18892a943ae1236284e0071f3d42c7810388d79e100a6973f37fd361c9162293b1ad01095f98e916fae29c8b474ddbc6f5126685d9f82de5ed9253f192db08916df1aa22220916b9f99f3ca644a8d3a37a82117fac298659dbd2238c40ecf8db5a32abe86ca85708a82680b1924fc35e46597359da0e95170704bc3934d56cd3df70f3c4a147b52666c8af2c8fbb6c3ecc89e2968f82549e0cb129e5b7d3e84c22ee9ea11788515938f29f313509eb4f0ecc7fe811e2e3124992503f04dc404b22932fe2d20ff850b1375d0c4d6defec09acc682a0e0f7495337905d751690448526ae6b3d29dad01be28d4fb71b13f119d2e2efa889de6779562caf1350a5b490ca018089ab8b2afe714efce1d16be675c2beeb0c737c66ef16ffe57b445ade53972837d6dc395b218882992ab26161a7e16149bf14cc0b8a695e1a7d8c8a9556010c61dfa2ae3debe28cd4910b1feb55779967f1602a312652b645d25191b7156b8f5ad98df762fb6db2a93013a8dfe0e8d887c7bfae7a6ffc1dcb74939b6feea4c422872dbe1bf40680870927f858cd730ad4f7dbe05a1f4786f3c79876288e4983bf5f74ba0eb99e8fcaa5eba2f8671cd07bf6b8855c180b43814112abafb9123f4f3bf8c30a5ab94367d43158017d730f1eaaa953e42b2d5b78a9a105950ef496c39bb14f60e6b7edcbbd1e1c42773e88e40ededee1bc63e1da4ac261213008e595b8f415b844075e9be3139d3c55bfa272af33dd8311b0cf39d311f3768501c9a0114c5f121608679c549cdd8d489f82814248ae87b3100c0ea20d84c582f18a02f1cc57ceb1ab37ab14d22e6378fb84260877017b6803bb92bc5d51ae7746691c13c3208926279228f3c18d2bfbcff9920b0f529a351e8c30cd5d67dcdb895cb9b50cc5d7a1f4de0f4f31b3bf1bdce2a4d8910c65b6c7a6d5e06c69e1a0111a285775f2c5135acce4bd7e88a7bf1919dced59136bbff20f127588fb6260a4f726e3b0c3a06c632355337b9fe1b75b54642cb5d9cbeabded56c39e99104c3d1713f16e4dbdf7574538c1c6bc9c02e69de3a0d301c307c10245364ff997cf38e2613dd040c859d968894b36c95aa6e2a3c3d9e605a6cb46cebe781af28de128e180b8579efb2229d81c0158cb49e5a19552ed674563d547d670947e2780ab93bd6592e104cada385975a7c276d3fc53239609ed20ffa9f30dcee660bb2213d0c4563537b4d7978d195d00ca958aa2057d82dd4ef7a82dad7dcbfc90f1cf5cc86c611547fc2ebf5e52068de83544fff5943528c9308a179be0f38c4cecd02d84a2b6dfb2de1f45faf39d5907c2d8c8a80e7b5dfad031e00ea099ddc9ab6117013baac473f903dc0b3c1e2c0c6d5affd986c4d6f751b8764cd850193080c88c447530dad43dd8ba4adf14b808b873f21519e0fb16667b84f1cffb7a06b93ada07e87356adfb0810a8cd51c5993821ca0c36c465ee1be95712e6077740284ab7d1a991845e84c31eabeab20ed768001bb025b83ecc93a30bc914db1a6b222f171134224f864abceefe305f65f077ba7601211ee712e3a60ecfc2788636c19f1adf281d3a0ef25102f6b19a917d6ff666c6b1bfc32554f2184f57f9568d3c21c5813f0f509abcda616b1359f24633c433808c0806491e6c8abd0591f475cd8e71a24e37c59d5cd43b3858c2e30d51336d9f4db80927bd9cb28f6dc223db5d502cb02f028e403968c9d3f5b047874216bf971a6b52770b1615522bc5526373dc6439c979fcab1af3a8cfa54c765a5dc1b4d2df59ca2c33c0372345cc054fa8ac8445d405b2a4a14f19f117a87d55af881b958633e881c5e76ccbc34dff6d34e1b4aa846d61dd015fdfe136edbf7e09f052e87cec1ead11244a0dcb991368a6e4756aba1529597fade59b3687749e2860b03232459dca2d3c92e910a9da827ef3c7c142ae8b5c69f250313205c2d79198bac74921c628a3c53956e6567c850401276ba1b10f1d4d9fa2e2e45064b337a061d00dec12e9be4fd38710888e84cd14315416293c1e3a5c45fc518cbbd8c7e8d671d1dc017260465ae1fd74e8a104bd17f55e73a9ada5b6f2e04c5ea649e70aa3e62a16a7fee2cc84b91ce52d120003c253333512b27a759e071a71ea83b3c7b398f2438d94d0a87009e95ea39235bffdb93f39ab103f223bea7e344d93c993ab876622f64e3a9d9959f3ae226cfbf0191425ff1e1369f0bd5e5f6796e5e79b05d7c468e244bb64df2dd2efd5903f52aa2d20b1f6ca3848fa0bb2723a3d667f938e39a962467b4c1fd244b6ce1b1c6e233aef8bf3241be60654d4845bf647884b04fe95887419b05ac52a50119941f558ef8acb8bfcbf551a1b701abf22bd429ab4159a18544cb087d56d965d843fa7605708a530dba720948274e0e4832a16f702ab085b0ccc579bf5751f11d9b79703379b724060873c354daed4d1f202e5e4a93ed1d4605bb354c7098e62da42d9e310e36118a114b4b7cb3825c217433bfb2e7b365fca33172931e87008fff67281fef44cd51c50b521f96b31466efd875abe16df60565706825d19e01726ca2ca8a38832877311ced05c3c984055035489b61db3be778a3b2fa957aeca1e02c77e441b846e8157dd7c3a9473b417f9acd485bd4bcdaac6efa95bdf860f58fdf20c371e2e6588495feb8cbefd40070b803093de39acb6f0f8ffbf635f9726b7d00c0843c820ee5a3616eac5682e3ba9849a1105f2ac397b8bc069e4865fc684b1dfd9bc196c3ad3844621984dadb3c234c837ab7817a82afdf0c9ade0dc82fc122ba4f2cf362d8659def46b17abde8688131f348a38bbcb1e9bb4fc56527c0e1e0715fd647aae900b4b545c91fdce3585746ed28eb63118d97f12fd2de27dcdb3af9cdf7d9a9fa76d95f866db3080bce0d03e1fc3a3210cbc1bfcd85a476a284b2e3aa09df8867421f6fbbbc308ae9ff57bec3d3f9a9557b0ae4cbeba512e37995735835503e575b3377525c49e6b3f44817b5ed512adc67e3fc628fda51dabba0826fdbba6a50ff0744b79be02f60d970079e091fc3125dae2b33a715768ac086f5e1af094d0ff0da8c90e8b13f89cfa957eaa070c670472617e4c375aaff72fa8778f7ec1a5b01517cea954df2f5f0e68625a8a81321ff8a281a9c1f05e342d04cb68c226214bb8e35df9148403f3f0037c6ee409af52f8b3ecef4db6ccca091067ffd49e51b8cd6a36e282e836f510a6d7d2ab01a9ec66415e5597821119a733fd4c4ef7453558fad6fd6ce8b3b304350fd1680bcfa9f2bc1460c517ac8e3f5a9ff5a2061f331008024e940a9dbe8284b54ef680c041a604cad00cb6ad612d884a3dbb060e3d073d7ef04065f527089cbc82e78bd2e09fac2edb73ac0c9e918743934021b71049f273c68585515086f664e8ae8e7b4e10dbd0c52be3150108dd3adc932181880a4638b00bfbe79b6cf187433fc15978300d932d423e4c1a517f013f8a05d810dd7e1bb4d653e32ce66fd806bf3bb69bf58c7faef574e92441e047a567abe616811d8cfc4daf339321cef0340a12b0478786fceec080c81ffe793e9b8c3350a6358fc1c8568729d8b090051e410638612ea1ab3647a4ddb02bc69b5221949c3eae8c59cf8a98ef59cda51f4ab534b96d7fd2e50cc8bad0fb48844ddcfc471c042e4100c9c9f64e819b0de17d93db19df97527cfee5edc3ba2c0600dde134204462b6ac9493b8e283073a5ad8404c4f3603033f074c93032b4fb4544a7aea733486dc3ecfc1c2fff68614dbcf5cc6ae6b8e992821ce1eec0deec6aef1a799ff1a3a400967ff9c49f82816abb3ea3ecefba0a8fe2add845a3dcad98fbf31283397e8b39f4d39f657579b3d0e6f4fbe3285a132c1139bee9d8237951d774dd03642b2799314983638fb3f9e6b6cc557c3f3f8e9f5d8b656bd37ba1ad7fb6cfa9002494cfc4885058edfff1eab23b26c14c7a73e1efb5a64c35f034632f8a07f4bdecaec6b94962734370249615a40392c60415d3af7b9e0068a831b3c08cffde1448548173c7334354afce53a088f7f46f97f87e0822ced76f366a12da85ca09297835eae38ad9ab350ae37ec42a2ba8172837b82817a278be2da1745f14fa417f27520e9e24a02fd89d1cdb6b9ff4f543b74f8eebef09734a51c4124e7dbafa54641eb76bdd725a7cb1d9eb78297f3642118624497f1d4916e2b15dbd0d51a29918f9bad81a2becb2489e1b0155b77cd3201fef1d8d57dacf6590fbcac23bf8f34e76ac726ff37d7cbb727e587f1e20d8149aa515a12832926d4c704de40fcbba8498b6bc36bc2a3c8a50e60ddabc6d97e58cf2b30947631e3353391dfe6acae0c4c30cccd3eb34c3c8e4ad7201579591d8547f4f6a130d13ef3dba52812925be8deb2099d0e1288f4216bd2c40d10dbaf46bf8a3269c7a83","title":"997. 找到小镇的法官","link":"https://leetcode-cn.com/problems/find-the-town-judge/","question_id":1039,"issue_number":32},"30":{"day":30,"pres":["图的遍历","DFS"],"tags":["图"],"whys":null,"difficulty":"- 中等","description":"```\n给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组。\n\n每个人都可能不喜欢其他人,那么他们不应该属于同一组。\n\n形式上,如果 dislikes[i] = [a, b],表示不允许将编号为 a 和 b 的人归入同一组。\n\n当可以用这种方法将每个人分进两组时,返回 true;否则返回 false。\n\n \n\n示例 1:\n\n输入:N = 4, dislikes = [[1,2],[1,3],[2,4]]\n输出:true\n解释:group1 [1,4], group2 [2,3]\n示例 2:\n\n输入:N = 3, dislikes = [[1,2],[1,3],[2,3]]\n输出:false\n示例 3:\n\n输入:N = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]]\n输出:false\n \n\n提示:\n\n1 <= N <= 2000\n0 <= dislikes.length <= 10000\ndislikes[i].length == 2\n1 <= dislikes[i][j] <= N\ndislikes[i][0] < dislikes[i][1]\n对于dislikes[i] == dislikes[j] 不存在 i != j\n\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2b9c123385f0604131437a5b7c0854a288274be8fc0a0d03b4520385a146af371c9dda651bd4b838f921b4efb022fe70696a969bd1e10621cea0848e126f38f76e8f96ad09d336b035cff5b7a599502dc1460bdfd86d69b8c5872d2a063b9139ccf6eb2099c07ee7d80ca8109f6e8cd71a4d3a522d145b0c0fb34cc637bd727b08b160252c61ccfa1e5fe833399bc8bfb381a06847e88b0b7794c743742409a8e6e77b063361940cea5e5bf5041c598f58ff525cc862cc917416837f2b739d14cf77542e9b8c08548acb35137091bfa8d13b7a4d31a8956f1abae5fcdb9c2b5234c4c6a9483f4679a56a403142e1f20ee48ae9c448c8197d1e57e5323f789a86846ca31efe19919f982fe8d779f61b24aedb72c1bbc945b656151bf02b7d89cf163d725900958717b0f71ed44cf54966e0d52c6e2a5a1f2f820f41098c0d3c1e5d010c3510ad54e24a518d554ef48febdb74bc8279d959585e0e5863b8952aa5ae28d11820605a64e6fb6960de171221d7800a4fbba74b0ea1755eb06920db473e95c68712e68d2a62e1ddb72d5d8be92b55146ca566a7c37743bbb2916ca9d6d1bbfe40b654436160dd0e53ece3bb4ffccf8e429d101ca67e0a72073106599b79c0dfdbb3838b4f4907b3fbaed340c052071898e13d8691fc600c39ef4e4b3673f3b8dc0264716caed375c652c4c57b2ba3f5c036d3b26816c8c688f75b6a9abd3b59e3ca61be8b074776343511a526536052516414f7deb305426b2faaa3e784859f5fd573626f240947c953577e61c2216a1e24b6792a747f4192755eb563960dd990309f427c9e9130069dc41524ebd60c09741861520263e0e43d07c6116ba29ec05236602aa57128797f4c38e6863809a71d1377a983af01dd023911d3b9910bd06ee44e867e70de0b0304b25b9ba305abe766eca49a813c12751e14d3fb50b37ba8e08a72e93d0d1738dff7897f541d44fa37b2a80c4605e63f3807de8db4d7038dfc121d86f85649c47017e341b2dee7b94942b099d9fd8914a326601ee173c5c4eea85863e00d4b6b895a1414a5d90883e651e04573f3a63e926b81bf9f55877325f6b56116e8d41db1b044bcafd18a32c74fd32ef26b8244fdc5670840cbdbdf141e1250f889d6ede8fa91a2df836b0d4d95b4ea68230bd335cff3da88992561bb72dfba18936681744659635f3b4431f00fc106174e7aa85a26527ef2c92404a83fd564bf24c0ad33923240c440eca01e27d524735fcdf19a0e6a5c3593a3fc700871b0f0d6b2aee22dfa3a37aade3ab03ed9c87d02bf5f400ede06f7b35f0b3f1c47b48e2719a260cf1f3f89ee1649dcfad83f1040417721630d4ec48fa493d0d6815ff43213bc7894541a16d7a581ce8fb95a3a98837fa8aafc3a1011cdf1e40838e3a49fd27366bdbc7c2e86bcaf8f64688911af6b6bd5682542436db2a0289b598455adffc1bf9370c21786547e8ad57f249bb16e0eded0681ab8c3f098f272e47573693cc38576e5324d63d39b6ad47771d6b9fd4bdf0d081355aa1847ec63a9a848c5ec3dd087e91fa73a587e617d64d8c1e975e3f45a426e57ae0d730dd40d7353f1f88c38fb0a1b341645d6c3b8e232dcb7ca196262897dbd70b3e8f6985e16a00b44930e527c2c16032bd1ec12ecacf06505427abc830acce21774345b0d8dcb9410c285217f859e0a8d24214e7e898216cf6835f37ac8b50bac68391c658d56f836fe6bff4a5de62455d6cde5a5d3b637149b798731a4d096ec517c6a96553448bc72e3ba86336be6f16c04ecf07ed79fa9577ce64c5b621d6aceabfda87c23967e072f7a2f09ff4f38e60a914f200d4185d9b12d2f2e1404c6dda02c4e1dad81ac6d8464a9110b3b82cfa081dbe68e6da0cad564e326b951dc3894399747e2e0adf2e7640b9869e6e0b81cd6faf7178fbf0e5ecc63a52f53e5014fd031a69db24c79ce6b669bfbefcee239b40d8d5ddf3fc7e01035d09bab8ecf4e39a58872f6108f69c327634b8da1ed5f1dbb46defd9510b2ccc72e85920b9c55a4e96c90d2d13d42cb7f54122ce340b4832a57c900cb4ffa6a033ce4106dd5b3cee0abc656503dfbc2a3a0e7456b0008c8c5756e9944e3edfffd36450026c13b5ae8a99a16b52238bca0db312a3e872bdb28aa75653bce7c0e940bd78a1b18ffad73ed0a33873ef3dfb0a7a8553852ff55b372f49c254178fe38594d0c213b5c1c6cae07ddbbb83dcc79d111b346fdc3f08cadab92793c7a94cf732661d1730869f2dc47f6d3078aed8de165b376ea8d1a8ec057f3d75ea0e26d5e5cf86578e093e56f78f9796db291400995ff5dd751edc9d7c7e2cc4481512fe059147e64db338725fdf6bb04c91ef600a66a8aba0bb58da6472e698353e50e617a36e84eb22b1a81c68071be6bd4dcf7d613aad05010b6a35f68081cdb67fd6b01fbc0aab88d10d43527b1c9382c0b0a77e60835d79da68bdce7eaa412b6fe2b275de4b1c7394384eed56cd94bae1f412436cd4ce50cc21041e8f5463ab111e0affa361b485798873a9bb1104cfc90136a17db94ab2587d5e48287ad935f70d9f4687aeb3e6c13ae1a816cf196a379b5f96cfa6c55adb8d997a50ad4e49feb346c94ede223d7ac8f3acea01919ad00e1092594f9152f65c23512e8228e7e49467b02452536ae6032193cf4a870ba908efdb8953eac99b9f9c7e54c74e48ad384e933f5001840f4042aca3f4518a9a1c54ec5ac715129cfafae61bacc3d2a7f99c50a1a0eff68179d7e4b5c6a755e53af80a3a60eeb7a39d89c85085c765c277a7488119ee87e75bf9393c11fa53e069ce1fc8bccd7c178013d8d9b7b1b79b3b82dbf60be5627b312395434dbc4d3dda56181ac67cb65a365419d16d849a8e88cdbcf0d3a7c05424cc242d49035d4e532e3c1b22fdb700be3658e9da60af327cace4688a0c5e1f79b0a79d7bbae365ad2300b5a183ccbe2e7ad99c158e7e95f61c22346d3648dd01b395830d3f47b7f4566587b3e4a453ba30d992ecc5fc70a69d3dd865a1c7501382747ba330cfed1fb93422fd1008ce674e132e3789e3a43db64729e4e6816918c9f66d70d116df68b8a54d843d8477cb8449918da4322d16414f17859500fa89389f7ff9d2e9274e8150d73633ef06ccb5157e335dfddc87814a04a290e00cc0a0cca48458da7d5f872a604a2ea0a97348ca7acb772e4f87cca85f91724c2ed02bfce1d57d1c3b9faf68d22bc803a6638ed72dd089198f8dd9e95480e624d091815fdcd39ee42d8d787577245965e532fafcbd5caf3efc28601248d3e91f53e41c955925a507b9e5a55c4da4be5c2ce38c533fe88e8b2b197e7954bc09e32c69a6642168265ed4755a7aa4801462d81eb7582b439baa453b942543b1c5dd694c148cf2305b9b6d3e0e7f0ee062da0b112018d0ac5cbb208745a483d829605c8ce247fad3527858b338841a590a6c55c5b908a84b072f0765cc35c077607468698268c52acf7043deee2abb3b5d5f96bc3fc898bffea9bfce4d23901edf12178ae22506ba8b478d8c29bf1a7385bc4a84771e5445af60568e1ed1c75de014bb38cf692db0b7645fd8e38a44a6c389ee228b772a8941d47e26302facdf58797cf740d6aae9b7a8de2f31717c8a1f815d08565aa6b4a74881a461b7ec1c871d0345ebf476c3a4007c62a2c35b4d392cddeb569f1ff16b50ac7fc384249c32c596975b016a0eefc7b95ea382797c0e17099c0039694d50b00a4ae62f09fbb8c5ef0208fb05bc3cb8a4ac9dd7107243a330f0e4628f94bf20981818af227de7f9d11aac1eaa3ee394434c74488659993abe958816edb9a67a9a9b14b22df03a9c1566d723d777ae167848ce019e8aa2318b7cf55076b7110210359e81481abc357cbe52547505d48454e1704eeb7117fcd25121d5e0785bf3959aa8898cb7fb705f53d5bd65dab6d04d0656abdc57225acd981b674a12f979909978f671c494e50f50a29b21ce8d695f72367fe0c8a70f7a60ce339781b48c4c463e0ed27ede26b1a6ae33822a6ef3c99073b0277ea2e7a250f91166decbdddbc5cb63a8758ef782b2b99e38ab04203b3d62ef43f94d783bc89c996921b545414327528503eeef35ca39b334aff60c1a7cf41649092bc2d34dc5058418b3fa8d55236602a7b5e44ae80f8c851b7ee35ce3fff31c5ac2685cb294f8bdfe66d6f7e7337743e21d28ec994d0539bc887038facd5d59ab7523f2723f907b92ec522fb13153b548cad333f132ff52dec3e2ab4ea8fd2fd6ba6f66f7c231c2283670a80a37bcfd8ed583d05977ae53c9644bc7ec66425b9a164c9c8654d1d8f67ad246fbeb6dde5b290741e89383a20475edfb387955925408d589a7aa699d2299f3744e1adaf5876c6715f52ea51223b2d44642b4c2406b9a1e6a9c64c2681ecef73bffe344aca546cf7e719745a3141027cdeeb6142389e8581e7dbb2ea26275a2392b70b1c12ad188be718c00952edb1cce84aad4e0c3df4695b8e2f725d7200298540b950d1048e1f85528f442c3c38021c2b89d19221eff1918d31b09497174f4a27a916e43efdffa7950b56b1f4a5899e2c9cb43ac0b9ed2f61ce67355290e3e48cba282eb48e2881c48a44d27c5f9ff04a0a767c942326a82237a4282bf5dd470db6a659b57a379265ca59460f6517a9a6e2f3216eb04e73f29e4678ea22e61589d6aeeef5674a09e9bf46515cdd857de224222373318110d477e622b079937321e5338e926463bc431582ae3c861ac7f538eb736193de35febfff3b4f6deb07538f8fde99a572e7de4bd87e8e718b6020a6416c5e1d33954abc92c0c84c7137edaf30374afda818e37beb839412208b1253c7abb06a04ff98ec8eb63c19c421232fb20ffcf286c6942aa4d9239feefd4d20ebd4517bbc9084fd825cf7a8e0f2531c88836e81d347e32b436f4c5fa0cd7355987eb693be9e235f45b3d4c80ec9a30f3cb2aa3498443a5a37e9ffd3c2d46a51df6e4bb6821bbc83431d0f0d7668618e9d68056ff531cc0c14f53ca3222909e17bbf4983af09aa16a824b38e75940f6e1ad1f6faa112efd3f8fcdbeedab9a47046a3301e8ae7998f726f0c369fbda8a2a451f4bfe65b77983e02831875e5cc3280bccde4e487adc4ada25d444ad214faee691cd87f818935d089ac96c2c91201f5dc86875f107fdee1f5b02163928c700bb90a4b15ded258bb30ea1925c6819240fe0a2121d10a938425af19d5987665aaa0aeaedfdcbd131e69a54bce4a3f569788c82947915bba6bea270e0c492730706c0646406ffaea60ac225e8944d773c183c7e0da24ad790033376085681a7ac1f4a676894b8f1fa90611e4e5f13fc0f9349e44a6f87bc181098fd5d8c210459c48af468a91302c4684e691b5e2fa7c6ce8a0ef4711ee03623822164a9d540ac9423a664c617e7a71ead0679bd6eb76ec70121003f272ab90ba8404e6031e6cd92f5e19f37630496ceffc3d95370803dbadf281d3e4aa255f392d42e011c7fc26603919e232514e62cab62ad973d3c4430c53d6f54ae481e944bd35aa077916433808c0806491e68be4df59185a73eac85f75a26b5fd6cc6a89f8f12e3bc8133bc8a9bed29231d98266f68e6373f29049ea5ea4569f51d3c0dc6b124b360f30168771e9e1742de3001022f914657f729256f3c5b5cab1af3a8cfa1d8931a592547b20f5c6f08f7d50237d21bb1e878ad5591b1e13004255a4cb5e7c879e0ca881a3582071dd1b4c7fa5f37890a480355137f371cb1d935ab1b14174f1f7e09f4c6887c68abc811c17e59ff6df728a735a04e6bb0ad6d0f3b856b0447963ff864055732a1f95f0809d35bb0a9da86ea93c3f5b3b8de795e46f7e133d417f2c4d9fb07e925f3cc51600d0222334a64b08301ba81a0093f2b3ca610145105d2550665140939a7dbbebb47d1747d0e42cef0b5d2a2f939aadf0891d804a96bdc2548d6d1d7d905674176dfa11cb55c7344fcf576db647c7da0f3d7b57919221c025982227816d78e506b905c48310d0371b1675766f283424b91cc471b91b903a316835c07730cc5d088258d7b4be39625ba7d7c7e586b11bb268a0def944f63a843d971a683365d6b497dce209ae71c2c053814c49b5b51c940bc4ecf83f271272ea0c2515a4394b8b79b0a026b41623a638edc54f1129ea85c9f2ae3b31b58a00f01ee39a962467f78eb3775c23f5fe89b176f7bf81592cc3714f236245bf2737cae31be947c80e9b01e415a27a41a7043bc7abe0f1b7c1f305dfcc58d6f920cf03ab4159a1c64ccc077965fa59d543e14d780b957900ba253b1a3a46532766a1267037b094abcc8c79a30d03fe56d309397a7db76e517332c35993ba30177e611a2ec796543b05a628513699b420ed3cde7f554e50c4560e4312e8dd2274267dbffbfc9965fca3312ff058871eeab3282809c058e21fd81b4314bcaf4108afd67ad5cb54f21f627e4f2cc6d35c0a07b2c2c67281317a540df24890d388760e751da1218e5fe72389b2fa957abcf4a2603ea741f108ee506fcbdfa32d0844748c802b1580bc94a06eb3dbbbc649dba09174e576e4f77bae8e94f8e1c5b77000b8600f37f2fb9c450c80eefb31a945287f04c4d775bf15d2b8352ce309ffa3ba9849a110096f80c3b1a148c8056fe673627cb490d1cf98ad455f1c4bd1898f636654fd35e59d33ccfbc10ce59d428429dd25a13d7cbb20d16899b017a107a6c22ace7ebf48f3c4efe2a0f903c9493a90f9b23816c74aa2e273ec860ae351d0e30e1205b967b97f47c8dfae23cf9720c6f47d9ad0dd9de0a93a9014c33eba220bce000ef9996f7c44b099c2d6afc376bf84e4a6e95dcdf07b145a2ceff36296e6fe51a0d592f9f44e180af9cbfabe12aa79cf3c4435537d090e606a591615b2a7d84853b5f7516e9534afb529cac01ef0b3e3cd3a95ee1119d92d59aa9bae2f6dd9610e9e5235a46919d53b4ea718769bbd88a5b4fc416008e5cc95d6ac8335decfa457fba96bec70472617e49e5faaff72fa871f8ca83c607c5171ea8430fca5f7f09a0fb8a75067e6d5790ae11f08be79847ddccc62483eb184f05b61a4fd9dfa9ab10346e62308d0cd7bb68d1fea48f69a45ef2a813fe7524526c2af971cbac297aed2879a2089c66430f2594d091cb74cf5697730ee1325a0d1c309015fb0fcc0cff1d10437292879bb71673f77a295d2e79954b0659c394e8920c36af1947ca5c7d42384c4ca99baf82c1bb0e67cb51e633b1e51fc215be11140b6c2c4c40d81839c7a28a77206fdf1ebbd22ccd4fe2630146411413840d7747866105e5c17226a16c9b6aaf8c64ef54913ea3e4f44cc91b09a7d544dd4bf699158b9b534a0c2157333ee3f5f248a1c985ce4502c26eb1582160223f99d384157e4e6f98837896d2faf6f40e26c80021126c0dd5e718fa1aac5bb3aa789eef1c7cfc1eb26330fca0c0ce46e0b11372b8be14b428fbcd79da9a183211c1557fc0db12e2acfc74f83821ac3d63fd46a8d76f4eb8901f729e531afcfbd05133b547f6c753a04223194607eeba62c733884d80a2b0c912b0e1af7e500ea45867cbac90c47e4509e0921d453c44409389fa73232ea7fae7a6686871cc5d497cae8ca6b8cbf09edbee560221dc24977a6dedf60bc2eb98e597c9aa22d2921f5c4ef0b7352dbb446aec9fc320675aa115b694261881a2448271df8258cad35657a079b54e3424441714dbc5ea04865280be205155c4dc11e350d3a3d488646bdc44cb743150cd0b0fc565d252e6c02a7d8c9e58af23a0a6fadbff966b367a7396d62dc652acc27cab362215a5180b1fbf06f0f822380f76933f5a405b8ce8c4f239db1a6b76156cdfff8a0e94b4092152d20aad0eefc1469e87176349a1bf9baa028045219e49a99fcd9729f7d91485da37bcbbf54d70070a028f656307900aaeaca2ff402f190c43636c44e577b6ff75226e3c0bf274395c6f4a010406485fcedff21015c4a0397c649d81c83c93fefe9ab1aa1dd0ed374ba2775681cf9547d26621e9c318d2dd18413df469cfcd243ad676d6167ccf79ddd28ff36047f42c7c3df6def21f6f0e00d1c55e6e293c4c8f40decf2f6c3c9bc2d2dfe77a799327aef7a0e0494f64921bf4a95e88433910ba3a50c87438a5a6dc558223d55954f7886bb36a4d771dd8e35e5b5deb0feac0ac70d34a13cbe9b57e9cbfeb80a9a385f0864250ed71ebcc072de44e36704bb584b1f362e898fabeab7abfaa33fa6130a3602c03549288441065c15d38db4172946def76540513920b421ee4297293fac82b36d85d2a46bc25b13a27101844bbabb2debf7768059a95bbdc9e4995295c160cd7a04bacf0a4d0f9e55a8a76529a0cd85e700c97165b0abc82e07e94e51d843d39909d25f584b3c4421489bd3a0f0cba5e43f231a669d0d004923b802ff509431a5e6679657bb148e709af289259f82493ebebbe3ff617835c8e83f0419c1b0397b2ea1e280a82cc6c673d1af4c1dd893e0829af9f57171f62e887a9d214bd82b0a5232453ba1d90a4f82eb8aaa8320bf5e52181244791bc52856773e254a613665dc37358a098e922886ee2792e6ab513c46bbf50d6f7ef27a39f6f5448c8091bb944cfc3f035faa44c6770a7b5588f4d4c9950d681d3781dcf9510e6b39ffc73774d71c3f98262028fdb280d1b39a7af8d87382d12173d57b9bb12993e37943d8713ba39bf8e868ec82dcd02fc0067e6b7d1f44e40e11c8b12b52fa45185f39a34841125d1bc95a7fca064acf905b8e9a1cb3b65280d16d36fc65e9ffe33ff051e36644bea00ee206bab0f15c3f0d471bf8940cdb7ab2f11467cc67b63f21c58492d6f33363be54cd9f64141027590f20ce190faa33fce49b79c09e25a691f6df521de71d13ac3cfddeb05e7afa69c026998a09cc65228a58e22813d80d97e481935757b2ad4bf4b04e1c1dd9e3c29182faeba7ee9a8bcbca092b873b548c0998c673a2dac3436c876458e9616fb52c153ac7c2db555fb58e127a6fc5087aa1464dca3aaa200dd704c2a6c78168c676afa2714c0fab5fd91b126ac6329bd74edad0c92d1335a2e38a9a1beaa810816e0ab1df28ca67bd21b3db7c1d587a311c3e6e08feb52e11eac751ca3ab8a138bb2f5844470c4e915391309ff5a75f505413b1959703b129cbdfaad09f79decdc73386e81a77359167040427333962bb1d2db689c2b287eaf1e99ab99d8f325847ea678037bb741023bbab602d14d8c5797e442ca0de6d21e4b322aaec14e4798ef90fa0dc3957d3f027c9108da47d5a4743f2e66b3703003f749d77ee290df11ff6f7bd30a7480d11826d329c01913a25c51a8ccab2d7cb98f475ce0c8c8718df49d78624f70c11a6d359d109779857ae9278fea16e21472400cafc47a85c074fc57b630d0e796e689ec3a0ff3981a24686680cabf3f8dff403ce7ace3f3367242581cd623ed85f368b4d043699b531971d54e3d4683849104a61370707c6603c289e6511366ecc4b5d626a0a1d574daef8ac4ac415a7b4c935f93ed93b059454a4f411aab0f35d09f94481f2915a277200989816e850d11fdb9a100a0b32c7bc23222e2cd8c91976e838d440ae06d47a3dfb9e25ac16ae30b3cbdcb8266351c583a4146dae55541d732ed0e25f99b752fae699968e352568c0fe72d4ffa4d6b5d252ade46fee920c4b904dc255fc5dece7416760310358f728ecc1d3be4ca8e3b43fdc3bce11988ee03728a56cc742d888c4841af4e3d5e4ef02b56331a12634058af3c7247045ba784dff90ad92f8a4d1236c9b18f584ad647d10cad60b8bf6f5563656f0f554a8fa1272a2fd0cb8973c51f46217aed3835b941c1db93964c7d781c2513891574e38728e32be838395eddae1998e86fac19e3a9286b8d0d6b04da98382703e4228967168c8c84d51e1666743f1b384d85f24afb864a5e4acf1926812f8759e779f822e734ea4529c9eea6dfd1d871cda737d712726e05955170efda1c39939e024da57ef00693f445ce190dc58d989935fd9abb4c7834292e10c3fd1da1d1b7dc4687af69c022eed28977b98cb2ff76ff38946a10c61727227d2286d878bafe52b8c0490baab14d7fa64886e371b9e8568963af5cc8c0d0673d773fb1e0fe24ee940b7c129710b6b80e88960ffc746009d8a51119c9a765586fe336d61d9392728f2c37d9108728b5c1578a408e11853b0f020dfffb448567df4d749991117aacc78ed0191704ddbf03a577a085fa12da2020becec2d0b48f35ddd65befe37b5ae24a0b3a56a552e9eb7c6e5149178b2b723b64241edaefc90b1b8bb710642f7f019b09fc0c8a0a6149d93967203f16e695f6b6396cbf6719259249688a64a1e1aeb9c385bbac38dae6111d575c4b7746d176fb862428ae5917e52441912d4dfe4748978939689a2a9db0c9be945695093aaf1a4ab19bd158aef2b507e4b79c447de37dd2d2f6c469d917a868d4c22cc0097c083fc2c3895f3a6030ea4eddb7dd6eb701e563215bfb3fc718294dc8c4a609b77ef1fa67efdbd7bf96cc131951ce0b4bd6dfe48c736309bd39ce62ef8013a9364d4f6e88f6fc65657c7a88ecbe4607f2876ebc4e8d7b101a5fb3fbdb51cd256b5fa9c6c4764375299cf3be3a6821f3872addfdff658d3518bda85442d463a154196f0775053ee0f261aa0dfc38d72f5ef7432038dedaf0f1462ced2ae3507c24ebaec324a6e04413d53b3fbdebc93f10e29f74db0ad631886b4f22be96fa3fde7009171a4002cc7200742f89a3d2d50b585c1a1b05c6653c515e4368092a11f18104de03c4f11459ff9c846ba161ea1e3da5eb012583fb76f41962f87e96633ff36a9ccc4ee9c8ffccd0417d89ac1c8a0216c5a683e5d39180bc5e109c4a51dc0d972aa532b8693b93115de1325ac530ff2b37ae295b10abc7bad9a26a1a28dca1561e78f3a96ebbbc117cea4b9fa39357605cdd50c0cd7e6ec3dbf5af48e1dbf337b979f17db2640052485775c9a69dc3986a8a4438e0c1a48241f16561de0b126e573f66d0288413bf313fd667bd057a84b3ab43bd9059bf691109da8b927ff5fe8f562a156debf91d5faa1561e1f7c92b6cfc54636fe97347ccc0362ffce848af8bfb1e3589b933545102a1c60a9831f03ce4d2c5fb8cc88e280d0e5ff5315423a7cb0fe19d5e5416229f3e298629e03872798bccea9eea1ac5d8dd4d2a4ccf366c1066aac23d46bf8a09b6d93dd147873c29787a215e32732694f2a3f3f60d82863fc8eae9df8becd41d90a9361e77755814938d3e3764b706efb47d2b39db4de442fd3a5062558e525f1405304ab9802c81faf932772c0689252a55148f06528bfc6bb136e9cd87fcae9f19a1c2ed6c5af63545d168c1c7fcc2293dc6fe6269e1671912c87a9f6098617abbd10d690f6b67f88df8375d54881945a96870f3b60a01a870a9e879c9695f75714659311e286ce1d8f48d2a966a3fd6ba600866c520057d70009","title":"886. 可能的二分法","link":"https://leetcode-cn.com/problems/possible-bipartition/","question_id":922,"issue_number":33},"31":{"day":31,"pres":["图论","拓扑排序","BFS & DFS"],"tags":["图"],"whys":null,"difficulty":"- 困难","description":"```\n\n公司共有 n 个项目和  m 个小组,每个项目要不无人接手,要不就由 m 个小组之一负责。\n\ngroup[i] 表示第 i 个项目所属的小组,如果这个项目目前无人接手,那么 group[i] 就等于 -1。(项目和小组都是从零开始编号的)小组可能存在没有接手任何项目的情况。\n\n请你帮忙按要求安排这些项目的进度,并返回排序后的项目列表:\n\n同一小组的项目,排序后在列表中彼此相邻。\n项目之间存在一定的依赖关系,我们用一个列表 beforeItems 来表示,其中 beforeItems[i] 表示在进行第 i 个项目前(位于第 i 个项目左侧)应该完成的所有项目。\n如果存在多个解决方案,只需要返回其中任意一个即可。如果没有合适的解决方案,就请返回一个 空列表 。\n\n \n\n示例 1:\n```\n\n![](https://p.ipic.vip/nrmqt5.jpg)\n\n```\n输入:n = 8, m = 2, group = [-1,-1,1,0,0,1,0,-1], beforeItems = [[],[6],[5],[6],[3,6],[],[],[]]\n输出:[6,3,4,1,5,2,0,7]\n示例 2:\n\n输入:n = 8, m = 2, group = [-1,-1,1,0,0,1,0,-1], beforeItems = [[],[6],[5],[6],[3],[],[4],[]]\n输出:[]\n解释:与示例 1 大致相同,但是在排序后的列表中,4 必须放在 6 的前面。\n \n\n提示:\n\n1 <= m <= n <= 3 * 104\ngroup.length == beforeItems.length == n\n-1 <= group[i] <= m - 1\n0 <= beforeItems[i].length <= n - 1\n0 <= beforeItems[i][j] <= n - 1\ni != beforeItems[i][j]\nbeforeItems[i] 不含重复元素\n\n```","content":"096221cf5b628be1e73e8bcfe626c734748523970a3d4cb45609426e2012476b209e2dc8c9066ecde89f32f426e3ac57af2400c3906714dff32ff523fffaef2ef2326f68889bd2fc1b378fac9d98506c7ae664cb93b3038b24aa68dce2b0bc885a36c60766f89f2b3934097bafdfcbb47bc50b435109b080f7254a0c88279c4f99db1d7dd7e3c9b69b48c7f62dd068dd76166abc105c2a14882c663dacbabf525b2a743420a3f944e5266b70ea5f1c5e03abdef978061b68ab33ea7b5ef7133954964bfc7348c54ccb9d730081533071a321cc5d562da288007282c72b367392b6aee10897d3662777ab46a8aba3d1fa4f5455afd0ca2f3a22299c103e1907aed0696b366a0db159d39c98b649331c73999bb66fb424d80254b98046b5c704bf0d66d0c40aac81a211b83d6b27957c49ea971250c4df008ea71492e412d35ffe4d40ecd2176f2f68d8d04599a4ed01ffefa18ee6ca869510bc45858f5c5370db83f3fb51b85fef0ea1cd80e6edede5c02bc4e41da34721151ef16d3888c2d43916e814190a4e91a66338a17843b25701d7540f97e6a811e6872079d532014805bf87434666328f36d4f11b139edcd351c0a7d3d9a85afc0c463a2aff720edaafe747b8a19423c4055df853662d386c7552e12ced8e83bcc8f74bed95420b2eba49b83715b477810bd9cad525721f61cd95c3e61ad2b426ef9d1f8c3cd1a810f0b32d1f1a209511a019db19edfb8ae87a6d99bc90c37805e91e4eda98ede7c89f5bcb95d3e0ef85aa3e7c60ce83deea38472c441956e31fc6c92f75263844e35d527752eb9f9e9ed13932191f51f920656bf662d6461d9c22fdc24f7693c36a389fcd3301a4c5ae95faebb029a1e3655fe095bed69ab3da876b14b49e447d2917390642bca27da687f66d6826f41e83f2b10b3750b77bc632ad37cdf464dddb9b0eda0c7fe47a0b06c3d3c4aa61696160ca32739b7c94c7d3d837ff964f41b10c1fe63cc8c6ba6c70b7a12d79a367aaff9648426c329564239dc0581acb0bfa4d49bd16a686d9e6162a84e8406e4d8156ed9f9028da30000a029cf731b7ed2ff5699851bfd20cb3699135d18d578117158edbb8eb0fae2d70c4c8c7b0f99de32c74b2367a4d13e76cd1069364af00de321d879e96365815c2d5d0b97066326252424a0b6e55c7b4943e696480e18138d2b64d155751d79830b83337a406be05dca8d0e98ba1c7b01fcf4bf9c5cda87bdcc785f12043f1a5089979813ee83821c369a49e1bf90f3da7bc52e293b95a257381b7858b774d42cefa98d5dd8af0968ad70fafe96253c34a80201db4bf0098bee345cd3d3dbccb82e0a372cb177bfb41b24a12c961c88142531dce84ae9997a5d1ad4d0006fbffd5a6d450bb8d55d4551854d29bfd4afdd4d2c76058393f759ab6fc77503581a8cf5946e8ec0d0684f22a2d595485f53a7db94cf55bfc64ec3dbbb18cd049d2fd6f56eb23d26016c15d0ec00777a61e2b9032b8893d6ed69fb9fa781a6e555c1a089b749eedbba0144cfb53f7c3d6060fda11c6ce0e375582428db09bea2cc7a7891befc21c4504e21535714ef64a54c3cda2ae1454be539be12788b5f96a8c812b85b8e0914a4c78811e8017322f45cac7b0c42c6e1648c3ecce46cc13ad38793f2ec1c942984490395f55093d0181dae8080e2eb43d0e0817bfed5fd701d2c79286ba13403da00a1681b878688a44d8e9ccc73616b805ddab3ad05a62bd18a1ada7bd16d42aeb506b74ad986defb876380d2d2e10edae44ca7580105a4724b7e9df1c8fe48919cd68674ed09c2f3ad0b04029c41011a77c5fe5464f6a1a63736873a35b025f1f22542e0b6ea27967aa17f41631a9953e82f0275f4c224bbbf3fc597e7df795e7398039d7304b40b580c78b8bb99304d9c68918e966d9679c7abc5f25e0e5dcad204f1050a62cafe4c761ef938f07156d943fb074cd4263907a7b8a559a289f50fb20364aecbcca9d8a0ac1bb0e83438f1d5bc9f362036f5d5095902d52d067d630fc10b2add07a617ef1f339bc086d47be696948a85a66837588092584183763b78b07f79cf6e866f07140b89f648813ca5ae9c9f974f6aa5a424c391940dfc8903f4b037f7bf5b3afcc491b9af844a773301f6bfbb0bba40fba8c0f394a9c6e859c340373f49d8158b76bf011b7e6f005e6d444992a488ed43615b816b28805e05333780a0482a59b3ae41fb70d47aaacb17dff88cffefb89adf4d26ac43e4058bf1b8152c068c72c2a4d505a63c2785636be8d0d1503885b6009c0bb1dd194910b6b65108b01de2f3b46e0d90ba9e33ddadc3b125a70655f28f6f23832cf24d631561d1be09145a20ccfbca8f9897ce546a8dd54e69bb7b8288534993a6d1604f136f623a8860807ccca92f1cf9fac2ed6eb0b767614fba105a4dfd8d2df24a8304576325897a9dd641d8d8651640e13e9571fe6863e9e81e1fc35945809daa011bee6767b92773092d8aac4677825f03ff9862a7516d8cb86241cfbc0be02dc31c122054518a092039012f5cf3463c7e3469f6f546be6c6d21fa0e94fa3dbbbef3af123247eedcbf718ce95f9e2f9a9e238696b1af3d42e4d7559e737dae679b189ff4f1bfa14c67f87bbda9763aa696b5a254e0e5d76549d09143aa57d69d6aa22cd0bcdf43977d58ff22ece960d88e0beb6d4bcb9cbec8c1ea885f0b73c0ef52e3908657b139e4b17482c4132a5e251021b244af76fa6dde562c0b17cb195e1316e3dcb5c0ab4f0fa7b7102a9156c8784f25d4f96de9573aeb720b6dcd3acd9c4d0656c3a5acc6ec090171154b780d099a9f9c1179c5943f0f066457d73b318efee1b23034a0035429fa7b36140eeeeda782fd675b348d7fb0483ffa3f21f3b0e093eb62f441da66f8a4c84e51abd399cb4e7ccab96b2bb744cee4e9e321ff91b70bc9fafaf54bd7c7c905bfbc39860b103b046e44d415ce1f5bf0848febabd2396764766667068f38882a0eda35661263f72aab8078f43d5a20374fdc1711dd57268739f98f5fecb48fd1aeb6df939b93b208addcb21260e4e127027ba4563c05714ec5f769b30c24ea743da6f78871e42f06773a351adcf580448ae84d28d06898ad90df6389a632ae176eb4de12158c42c46e804014a403669132d1c02e13b7dcf2d0d536d32f558c1536e0c8e7b691d9d9179b2efcbf844ebad4bbca11b794a32d776cf4e3f8a6c851f464b77bb012ba34e5667fbb12061ed0f8e7a7abd9cab808a905be68f808b8e63ad4169d5b7909caa0442d9115b607535989023588d557542eee28d07d65031930e43a393c691db1d8a5aa61a1a86c400da2f5a44459d4469014c2288f4af66c4a529276751233622d576ace83da5fe5f0f4e8f2a6afa5f9abc9f5d6f45145773a2b8399ca953bc7055371b5d90120ead8aa9dd156266b698e48f7231c8ec3347e1239b9790432f5a2944afd758ff80437ac5582ec3e63dd33a8dce3e75545c9889a7ab71d7715dfb48067a004baca82a9c4ba6c42e30cddea88f83d6fa62c8fc9f85dcfa99e9f5d1101defff177db229bfe4faeb639286a29efc19d526758bf41aa5b46e9fad4e2f9cb76891836c1822644a93b4c51e47f03f86ffc647778a32ff7f689c9b352b563951170a7e243c5fea60646258545f0517003e41d25779a027faceb369939dd6e3121cf820bcde62b6feddd1b41b8fc3a22610326ff49fac15268128a40009f2aeda76e3c5d35f9a1be6680fd61910dbac18266be87050de510355bbcf3802a760227303eb37bb363d8675415e92010b848be0d1a4e2edfafa09cd1fd65334333b8072ba329e6e5a6f66469f83af631597eb556f2a3ea34c88001bb1254619ede544a7a9d399a696bd98a227a41f605cb02d0fb0df245496a7c9b9cccd98fe59d278145783176cf090c1fde7a6ebbac37513116ec30f381c250f86ad705df48893c246b70ef43b02af6da46254de2c3af4867c73e589c8bd72ea22819740959d6f47632d13f58dcd569e0e32123ac9d825d31c977744826bfcd6b78f7e60a77a77e8714eae8a9e65f3d22626c018e7c383a521a390cc984390a5750b080efc71a1239773d4eead3b25340c869b1e5ac77bb54006465d614476788cbe97aaf886a58fd66b27aa111db58f57d909387b84df2e92fa6c788f159be129f8131099dfa0bc82b0c5166074228b393efb5a8a7cdd6c32e32d5beff80b4b308cff849bfe90ddb5426a4e4f5ebff7e4dc5fb7e14520345be63f33123dc86ebf1b4f9e0aa1d6278aea61135b42d851b32449d3d6d9bcd320ccfb28241577589f0154b3d029f699b168745b8f03840cf220be34ac5966ffa90495c60e303dcc12af54178fd1b4f1d5f27666ca2b7e51672749304972bcada973d50b9e2d651121ac1edf2d5270d1db50c1aac43193ead1cddbf7ca9a9ca82d0b7c25388eea3b602aad4063c5efc65372fdc00b775f1340367fd8dc51413eae8581e71d7c21acde91b601ca4c3077f82bee7de84cf2bd7e6f2c2c1399186a299f3657e98ac15d732d288a4eb254cbea3cd5018845d880ddb2fdf3bd21041af61e62594cba2404538de985ff40964cdb691b781fc9937f1c74036eb09cbe21c9bbec66ae1b85a8fc13772f612cbdb71c5dd5112746c919a2e04c24dbf1a9b32a92fd00e8b752d1942635d7e80c48c13fbdac36aa56f5d1d3a0d32c125d15bda63ec6b65c3281c218af2fc6190a55266aecf4b13278d7f5d1106bf501a0edbfdf3b8bd57cd16ec357ff6a92a82a975620b3dd4fe0966276f45a874803b77daa8f130099bde175eab0ad34aebd16271c3919b7774fc925b74aad60f687608cedf1d89b3383193f0567cab4b35b22ee97db2f5f9317836c587f450a5294d011313ba285775f681473ac880299ace02eb5d68a83d28128b3f346de670b9ece73591b7b74110c3a06c632351a71fae70768a8121a8f5dc5beabc9c86445f3b004d2d85b3f16e4dbdf757453ca5339c9db673dc1680a7e68367b005d077ed5997cf38e2613dd040cd3d4c5828fa366ba985a572130924a4b46b46cebe781af28de128e5e449436f0fc3fa8cbfc51cde8dd0e7d01559f094c17547d214615e2310af075d60b6f5e0be8e2d29b145d73667b92682b0097c825fa9f30dcee660bb221744a45201c2e032d0398e88254e00d966e5abe7d82963fa8f0d7dcbfc90f1cf5cc86c6115429d9fde8e43762a583034fe25951788c9308f33cea5a6a8acec013a04f38239057d2c161eb52d3dd1337a6a0c0a7f59cfd533443a61a8bdbcf97103c32bcb04d5b9066eae394a08c8fd0fa85982f183d30558336cecc069962099ec651416ee317ddc5a8ada70ec3dfc86d7c43910da66c7bf07d11fefbc363d2a9a26e9a256b8fb9ee03a6d51c5993821ce9852a0158b3a2c66c6e256865189ae67c53cb5b08f54536ddbeba29ed24c555ee501583fd9b5630f2de19b1e2f471ac76550a4abd36ee8a90ae44a6434e35f36c1258a077756e76f1e769a7056c19f1adf281d3a0ef311a293e43a642d0f53346791ef0592bc1d55230c006f5032f88b7941569b381e7ab16ca27d51e6d3c8bb7960708cf596740abfa7f370140f7e10f3bb8271fd6c67df7bbbe6a7ec55075c6acbecd9d2b8b846aba996f6eba960ed105ed3992029088992f47077302795f8b7887a5271ab85b422cbc9da9a9fa4eb57e1617b7b9e76ed8aa4e933eaade117732b6cee68b205b163a1f8f19f5da9a0b59434c67115ae7840b2ed4db01fbc2eb1d642491170576cc9637dcf5d386bbe934ce4fd94ab9fdf313ab5d552402f9af06484f323bdb8c41584c7bb614ce92c3152afa17596045d860a816633604f892c8a4db0d7d481b947d9b3f67bb55f5fd8db0793b0f1ebfc6898f9ae4bd85486d3098d4c33dd2cb35abf5952596ffffe65e92d142390807e1d1a684a09b95b6f2852e25b80d63329aecc00360e8198f829db355172937328549e80d725ef848f48bb908e2b2dea966d20a1b851748cc566df51382975c3771943162ac0bc90fe2993c868864b439c15c23d40cf8998c89fea7efbbcd469f0f892ff470abe293b538b7f11da08764f6125c06ff95a93740626554479f5b802d34528d1bea10d262b2b9cdf90d5e11312eb137de0845f70c9faa300db550926c2a40b0e38a957fd6e19a1e808d5bb166749778b8ff63e40d58d3f4ed3e6d0f1860bcf76945d577aa753a5ea2c6321e1cb084c87c3f7724de5a7066e5945aed8bd5fc831796f3516fd255a14fda3a85678c25eaa72e9fdb4a611370633f689e590af6643cba60c00be3738b00842a83af8f4e846f2f2ec0a91218e5a1d93482828e82da87af20bfb78c3e5b3760ee7966f8fdbf659bbbd8e7b429c2e49dc507ce3dab2cd4c3c3212ec6ed29334df27c0123cce92ff432de611c5f1fdc581b443fb08210643e73f5abbb904fd66bae947d86279b287aaef8e27caa11d85ebf86a326ee6d4c6619ac46708972c29ab491c495991b9dd64d4d51d60de29a785f68c5095d3ff8dae8a30bb23a75a4234c225552e1183b3ecc5fa78870917baeb5581f6cebd2acfc455fc7bb057b1a21ad137920219e4a6b77b23a97771be041547b7d6460109bf57ebbcf73d5e1bb714ca3aeb57ff90e6bf5ed214cd5695afded6c7bac25fff58e982862b0fd00e95363559226cfe9349ef6de411707694116ac83adf2142e1535411760fb2e46c10c6a4eb25e44a3c8248fb32ab8eb75c652bd76c93d68863f05d30ff441e4a3eabc7868228837a5b6510624f6f19340ed69eb0a0fc547dc7c4191f5c529b143a5ba3e5a53dd5811c682aaa62b5c157a34f07c1fe7096dd10806d0006da2be717c257f056e1e301db00b2974782bc114316d48dadf1778a82a6a20aa79503e7047f1fb8b600c4130dd36d54fdda4f0c19183f09dfbe5df854e5f16c99f7175dcef41fb2571e648288f131178c730564eb333a8cfc6135d16a0a862e1ca06c8358112983e84f43cb1b0324f426b5c679ca98e3e21de9de83db40c0832f32d1ad405d0e5ee885d58e72536f04240c3792bdcc8c6ebd8232ffd374529674df13c479ce3723dc68231daa611a10cff3177ec819c324270ccfb35695b541fb14103a01319dae860a1934cf78d304ec120dc17be2ed88b9e057d37d5166b44287c4c07b05b612867e401091962d87041aac688c4ff5f95b5af216d0089aaa6c147fb232b33ed03a2071d3f0febaea8abaa0120c15a81c140a15aad0c5504a8cf54f6610c2a0b6062a3c60d2eb42896eaa484d176b395709f870c66005ab049162abf8d7df3956ea4a5f2a9190465f4ebaefe939a85d11ff3f6a19580d3c5b3e4a14762115d2bd5518d8a41f7f8d00b2b145ee3e985415be9609e2c68afcc8e59e7ed6addf6b64d86079a59d1b8db308951c1c5cc250ce4f1b453723e32ce67f39267fab468865fc5c6fbb9ffd1ac53674d3f2ead3808093700161161d4e0c278a1ca5ce199b98fec306f8cd936790f44215768bcd3c2dc09f30a96b80638a0074be91e548e10f101be53614cd029bc5186202959c6fddc26016d14476b1126956250f883232336cd884368029c485e15bfbf10ba0dcf72f0994b07887a51c2dd5db73bd1c1dc194bf8af34f776cfc00156ed421328254d59ac1f24ce571a23e0bad85deabe061752aa58ba4f0115371377caf4b5490077abb7ca517dc7370e47f585c70ea6879fcab65080de9fa5fe229f3614ecfbd7cf08e42cdfa8c2a4e734a544d9e490c31dc2968fb601abbfc5bc9c8c1eeb7874e070f9b1cb4b143ab99db4f5928a0f2e82a3162b8de9cd2e7b60ce7bf81ea0dfe618fda00bbc6e76a0f5c8af5739470df9c47af03f41ac96663ebc7e1606ada746184b5db399320a96cfb3212a820c4740bfb5ffb30a68f9716f35c918e2bdbf16364906ef8d8ee1f021fa3391555da8150239b258ed802fdb3cc1a1d4d8044656bf50c5267155b8dd50a7b7f4d54e9dc1410713c5d55e2f6537c784f701297c08e8d7b9df9b0e0aec52c43f01a923153a871e11a740bc26bc9ac2943ff495a5cae20be542b930788601af5a485f847191083437b7a78cdd2ef527030245eda28d3fae78fe9ee0051c817f431216207da072246c43262db307f178a7db6733a33e490293e6190bb84098ff8622800b9ce2199a578a691797172e3744c13a46c9fe78f0c635dec1b55e6551552220e4079ba727a020139373657f41f80cd9958ab187b630bfc69521964ca71c15c616027a637ef6c1a9f1b1b3f097298e79301943c5306130de400031669bc6ce52675ffc9a370f472615b727a14c94396bcc8bbb2dd04826fb4489ea28b3ae5ed00e7597522de866bb3ced786c34118d41b933b63951adfe591515f71ae4e837328acd85e40046bfae771805a4ec29ddc20dde3c076c945f1f197d146933db86fc83cc8fff5563304ccd5f4553657eb233d65ac6300e921c9762ae34d587adcc6ec1d00a51eabde1e0e1b6ca760bf499e5586a9fe8e958090879c3075397515e8a880508656374809a6972fa21409971a8af0da6d1af18483b676e8a8b513742367fa76792c7f1cdc3a0d67f93c5afa58783ed83a65e93f37ee91206d9f490ee140722a3cfd20c0bcae5d33efecf7411b711523d354ab969deb7b01bd701caf794f01e326c1415e2a38be10c4d0e818eea953b5ff0a646a0f822c4a8d8647550382e209c3c5bec5463bffe4dc75f47b85473d6cf79d7bb40363506b465620140f42b5154b2f8a2836eb2d7782eedc00bc5f3d8b53fee9984eddf01a4ed28d4c0554cdf466d9e183abf3a75f7ec13f83a1d24f714c109eaa17f17e10dcc321c7af1e5e2c3b33d1ee015a7036291a92fe96ce5a477671a0f2aa4fb60d22667f5d9f2aee3f00a875d0f6fff3d7375af634bda341e1757a2f768c7f876df0adebe483b6eb97bc91730cd54a5ab79d94ddec858dd4071163cfb945e2db03925eab85edfeb4e633b1775362a00255e31f4a172d19374e2d7cd64acc193136a9037d9078eef6cf183c31a96e9111afa8d17225c91cdaf2d808900a879ecb2318843401b09ba08f76705715a256ec379de95c103ab4a4caf3a5c51badbdc6d71084549a9e98f50a29c6b1a816fe60fa63513f39b90fd90d8a5ab802c14e5f806b97b8241d8a961f47b4117411e41af46d86bddffa02319041cfcd2c055e071c595fad0c412a44304d43c519ab3e172f49fe0b1f9d2f377f7b940180435010659585e22114a9dd2c8199548b953ffe1f00324bcaec83917e681c5fe4053bec47136a3376da722d03f3fa11219a3f81c6ccc5cf54b29b6b1c68b2e54fad3b9b5f0f846c463ece672cf544c1d9a4be6bfd418c2f731925495aa06fd7ca1c89cb3dd74a908b01d5b4ffbcc0841eb32e99057278f00a1a32eeddecb2cb6ee203230245a93a80fe71214805982066b016b2e25c7a7a6e478bab015bd4a01aeafb88b9019e47ace3f336424a5652ca49f20d7cc39c6d1ddf6b52c970c0ba6dc27285c6f0533653d14952e7b20dd211d6b0181185162234459120afcbde90f825beafccd32f73ed9664fc130f0b558e4e3981850a00ad3b6971c6b3843dbcd1be14d8a5fd09b04534e2ab5c800082e2cd8c91976e838950efd06c97a46d4f171f944e030f58a90ad2c2a7b8cd7e1596de71b5406623fc8e30bb3e300afa382bc8e3525689dd41192ffea99b18759afe969a9820641a741d75eb164b09e492e2e650316b86ca9cdd3f702fce3f767d221b441ddc0a43f61f129c30df28087cb56bbb1dba7f704a86e3def24456ad3fb896b3400b37167ff90add1adf6d13e6cca16a599b87c6d04d0de41eebaba043811b5a15ce6b55637eab342abd62f1a9b2c53a690d6099d3674f6752b95d9d1970530df180a3b31dc71f9dde0f8a598aecb8ecfb4c1963089c1f8dbd7b61e9c859e38431f50d72120b3860215a41b6e69f1b384d85f6de1fc21e2b6e9fdaf265fb0769066d89e163a4fb9118dcaea7cf414ad1cda737d712726e059551747bba18dd63fa539c141e4477d3b4d74eacebf1f91cbdc0da4b19e95c616c7b3423f8588485e66ee687af69c5f04c739d97ae2b160b3ee7f6ac555e9ecaabbb073a481393ba5ef01a6c13f6e2bc434a85c88eacbe4b4ca685392534d61c0c2b802e414e99f3f8e7df24043c7aec2d9623a17b07629eec6650096e35c0ddaf7eb867138f774af82d635528275809b54958fae39d108c5e74d7de925849b4e4966ddcd7c84116abed175e3013b90b34b17c9d1b1ce802ea8a2464dbf23b1a7cd12a9a261a3fd2db78216adceb8ae84be5b0b4ee550d72bb235f4698a93342709663a4529fcd0f66129fa31684c4f1d1cf822205edb913ef2c59ad0e3500f34b75aa4af5b521ab8d5931d79be8b7d0b1238a49860a85e11b0f5b7a934e38d164954e7c48081a6550204e5418904665f2f563c9078709cf0a2144e2e267dec2dc15161dfdcbad3d902cb5ff84181ead7c65b1cfe40779bb304d3000b7b6aeed314692bda962fc7f512de9d7b7b5f363fe2e174b25d1e3f67c6aa72f415ef26a17b6fe70023fd248417fbb3f2e736c544f3d71e1b4f75de3986f43de43839270bea01e9de0e101b043f9ef5c6a6520022547ddc3e09ee782cb157a45b7343a9d7b5e21cceae77d09ed14370e9753a5402fc9a7cafa3af80b6c5fd95e0526db8c5a82c8effe818001d00a9216499fb96237567cdd3e938332afafd4bbe552deaa3edfe94b78a73751472520ad3bf27e95c10c1dd1c3236b37328f5ddba26e55ae84da82fc0623ab59a507447b286c3e43793acdb0be72eeb7a1c7dd192f9976cf1a5dea746aaca4f9b165ba12460fa779b85a44faed46dd2131b8eb326e43550752640797419cb9d3b5d47044be89da6e9e4b1b0c8c8492ccb0a54d15603d746d19b45331b1b3fdd106324ba976744a661677c973e8ac9b079e097dd970821ee50b8122d0d4cd354087c529ff0cddce2921108fce6ed68fa10f0931a8c216bd68908ed79531022d32d1ffe0cc760c3eeee418f411e592411161a0ba5d44eea3eb73e56cd1334a341b22471da48fb147fe92e9e02c8ab84078f83a178f25cfdf7648805a0fa9f98bea87c34d9c706734b7f8fb44616f5ff4efea26e057a1224650554d7403bc3d0e5db4c77bc94042ac44a3d226b64302a07532164e0d0d889b32c445181b1113133fceedfee5ae415fe323a247726736dd42553efbdd4e67ed41065e066913fbbefdf28931eb4da73427e4632ec31abebbfcdf6c27a31b60431e08fbfb4a829378d5fe96536b0b2fb0f8fba7126d3c7b4f24c827d24581e6582865060aca59d4fe26c93aa917e5c822be32065e0e60bb613b97ac3a31ff2c3677c7cb9e74305f20c0d3142f6a42d2a1cb485dbde71998b0ce32e53a07a8a5b8fe755b4336f4aa043932c31fb2a105702b70f5c4ce9798e283f9c3c2dc992cb66af3ece030454d0b2ab38242ed303b9d6d249d65f8508de6548c363a811a5d0b89477a223d6185f2149694b7fa3ac4dd711746645d43f4dde719b1ea2af4b553cdee9dbda788cbf92fd1e0d5cecae24983bf0c20b1a4e6881d5290ee1fa7af0f29d07e55f7f825ce3cabd0ac529e1862021b7a0ab82939f9d327b412268f473549ac5ad5e1f857f2ff0b1f95ea0161fe6924fec3d9131c743e6d412b421e28fb66f87f5a659a7472744a251730f92b9e761c98f329bc1da99ce3394250f8d2c36458ba5587e4ddded1698fef9d5e91197233fd10a1dd1d835224d92d4b10056ad71d10e04b435faa093a4a87b0546d684f72298b9f9bfb2ce09f7947d817b7a792226376f66711a98a5b1ce377bbfca516d95fca3071eea13674c1c7dae79e36d8e34c1d74e5795c4337b1b7430be495d87a03227adafe88c882c2a4712e5229266416a3e7fd9debd18056dbc215224de70ca113ebb8315a1fbf1d6c2dcdbfe0321d734c5e5c47041d232002a8d0738b35e039a355da0b2da539e4e6335c2c765f8ea2c71ef62830f289ac44952ed580b8fe13ffe6e5c09ac03a9c9558a3e4607d6b48488c700d5bad10244066f747d4a93e15f803955f228e35966ea9d2c15a6c3a5ec9f364b92edc78b683684e2235a556c8a5af0a69de9e7f03a08eb04079ed4179d99eedb17beb90de2d461f5d9fa5bd12c760f04536521dd704233cdbec27002eb068b66afe8507f1dbc7c79bc1c05ae72117584c4c5b209869d9dab1ef0046cb21eb9380702cbdfdff958b5cb0a858635dbc773aa30d0b4be32cc9e7bce6d47fc380ea1405d34f33a9249047bd89a34bd388a6ce9ead32a51bc1bd17816a248e1cbf874898615bae75c99f57760dce416761fed39e1837519962aabec4fe34de370f015a3c9ac1a0fc358c638c2376d8b1407ac91a45f7a4d0807b26993cce72c5b824d7e788ccc654cb1adbfdd06d56ee62e81b4e731545fadc1391919dcc7983aeb7b32185802526ca9666b2aaf108e9eaa80246cf99c8197bc9974ad5149742c2863296cc556154f7237ce69d489e6ce13ce56d3e4b131c4fc4148df66769dda6c16de4041032036c074411ba0fa14bdec551b7aa13e4f891c416db5e7d26ce32d284d26f31d821e5ee4bab0be0f49f13530c1c8e6912dc83a56c152b4c74382ba665c518552b1493c677211594dafb96238e199b4399d5f8e9bd4cb6239e82d8561d8c5debb0ff1072635f0518066195e5a7761022d045745d18c0037395ee3a5828b48be1ac4934d282d49b0ed3dba150bbffca3b196b56b1309431da25a15ff3d5649d07082bffd2799d9cd67f946c16e3cc7f4889d4bbc694d4bdb024cccdfb3401f0c132e87b55d07a8ab90b1f7eeb6c8a5e827c20f1bdbaf1ee8677b0675b039d23382246fb33853d9e0f558c6c19c343c0945152f47ce4f536968fa744bab491db4ac13171284050d822edd33bbb6c297460eae4b20d2b9ed15169ba66c767380387d3b58219006699e9ac8944f11beddde43c94d2aea58868c7e72301b435a04f3ffbfe7c64867af044e7e641e0adc46d36becb0720f0c0f4499d474dd5532747b82e2c301188702da421496f3ae0ebd32ab9fb34fbe2d0026829bade6baaef54e5943358e399efb1634f90c5d6a1d88018de5af304f0033e1aade53","title":"1203. 项目管理","link":"https://leetcode-cn.com/problems/sort-items-by-groups-respecting-dependencies/","question_id":1309,"issue_number":34},"32":{"day":32,"pres":["模拟"],"tags":["模拟"],"whys":null,"difficulty":"- 简单","description":"```\n在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。\n\n移动顺序由字符串表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。如果机器人在完成所有动作后返回原点,则返回 true。否则,返回 false。\n\n注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L” 将始终向左移动等。此外,假设每次移动机器人的移动幅度相同。\n\n \n\n示例 1:\n\n输入: \"UD\"\n输出: true\n解释:机器人向上移动一次,然后向下移动一次。所有动作都具有相同的幅度,因此它最终回到它开始的原点。因此,我们返回 true。\n\n示例 2:\n\n输入: \"LL\"\n输出: false\n解释:机器人向左移动两次。它最终位于原点的左侧,距原点有两次 “移动” 的距离。我们返回 false,因为它在移动结束时没有返回原点。\n```","content":"096221cf5b628be1e73e8bcfe626c7347382248a04fb39af0a7771247d060e0f0dfd94642bd18e5c0372ed5596684b8bf24d65cf813e07c2e763b522b5efe922ff3a6f2898da8ff0062e8db59b925f7332e96ec986ae0e9120f437cbf3b6be831436c0446ea79229203f4815c0928bfdf714bcaec084752f916f6d5b19831aa076394751750d135a1cf979f611cf64cf6c175787197c2f30b4cb4025c8e6ad111c0f294a17ee8f727f007093cd7167012bf74e5eaf91bfb73e9fe96851f60c185eb770fc537fc86df09c650e805e1472be20cf595b228ab90a7481c0313b72a29fadc71498f84ee3a221448cbba3f8dd4c556baef5e92e2c2e27a01f310a1fa8da4384ac839946834657570ef5737f7b560f20a828a13a4799ffc7199e8b70815701c960e6c2a6fc45ac721802ca297c82cb020e9dfe72cf8954e8c0488467b2124ebf902e0a516ba8ac47da0d0d881e2a1e5d010ce0915ed26ad0d6550c15d4cb6a1ab3fe943c8673063e05182e80f27cbff371de554b6d043bc65feedcb2630b89502a453182df1728cd0a6c070339b6323dc291bb7cb2b545ae8c6b352d57bee318731f6b8cd4dcd717189adfd95dc6a5fad16d91bc584d6377d90557cfe48177fce18a4cbc171e826008502b332b559159e4d2caab8098418ffa416857b519d11f7303e18c34e0c6d711723c51cda4c5e714e2b33ce29e269731c0b513e5bfe5d4f1b14a69c93a876ed0b0e5eb1139aacfcaed3b71cbb2cd0242763dbffa425f79bbc1a2d9a1540352b3ffc6b97c67633b0d098908b2811a387c3ed30b385f1c2cd7f9ed97bb4e187b6f6b984c7735a55e900f20f344f170484c80741836e7717e54aab7e1bfb5b48060f9e13f25f7d4c0e5c6e0e2d91805d31b1e3b374b47220ee19114d79fb22f4c4f8a36fb06d36e04eab551c433b421c2fa7addceb90cde1177ff4d0804fad0d28f657d4b62df167287409ef3c8d517d05e839a31cce265d91d4470a4579def5640f1239bb0d648173724f40632c29d7f708ed01ace9c6994744a591be9926d3788c46780f400dc8e77a2266395a84e5cb7b8ff10d24c54a93f14e15da23a6488851ce324a24113427ad729216de9c6ec963648bb6a0cb0790a444eba4d9a73b526f3349e7a1aebf18446083a819cdfda2a6245017e233c0c0b23cad9c5143724a0aae810b40428557916aa8457f32252de32d244cce48cfeffefe7e87cf91a89e0a2ee688b9e999848739cdc31f43aba70b81048bd6ce1fd00b9523ec0e17584f08d367868fbeaa7de1f5024a4e9fbb0f8e4b18ee8ac1dd6bc410cbc43e7550efdd92fdbcbdb218c1649dec3c89ea5008f040a67b9258fc6c24efd63f7205ceffef4aa3773530d670f11d2ffd89406d131e1fa76ddfae083de70fa20500e42b2a07c0472818f1f90baba3738089ea1251dd1964e3bf592e7c11c3aadb36187099a68f326a97a611b65e55d238b997da955bbfe2f083db7587ce67f08edde215387d21f08723efb9db3c5f095cd69e460526102f68756f63e4a5ed18f4b1d1462a3fcc2158a3645554ad382267ced623cf5c7cf2ad688d3f325869c2357173ddb8478e1e0b11bc89dafa90650e245452872ad858d5fa616576b1b1ba8f7f79f0da6c6f96f266ddc1b8d39f2d79af6526afa093dd10d240c00464233b75ef264445689beceb2ff8b6eaad25c1d2d1b7e9cab179707044b30befc6eaea2c3d2c44ddd29ae1737a8eb7c7fb1ce253d6d06a5f311955f6bff5240e7277b35464560ba9e506b920422a6684f3aed69796bb05d3544b371cf8b6881ec2387786d8bdc19a896da255684246e3b4f5bb0d2e2e5131d3a712839770102fd6328e830b54d060941bad35e8a94e8b649a5e7fc464a98413423629c5da9080ed617456a3988838109fee764888421c917ef75f21409a5b4e3c68fdb1361862ab2d3c77dc092a803ddfd353dab6acf516a9d5c5c8d6e9dc4c55f149a562cdec389bccb50d43eec0dd3549fc04c7ccfdaf78994120eeac171a87bb229ab17292297f1836c79fc6b89948177f6cc8f5191e7579e0adad5cb5fa3ea600be338013f72be77de04985de924c95fdb683009e6214ad695c4e6a4e254401cf9f196a8c14d663029cbd57e6e9943e0eec6fe2a7d0337f03a6be5a99f31b50512bdb9da31311b8e37d0228d59662fdc7139a90bd9881b13dfaf58f40b15b43acef3bfbda0563262fc65a571f78d295365fc0e468abbb8fef480a9e51487c7b2769773b58316816279f282a4a48641d1d903060c3d2385576d0ad1971ce9b574bd915509f5639262284cd5d8a6753bbbaac55ff78f95d3fe4b43398cd031e782741995a35334a3578f7b2447236616b81f9ef368a8b7f4900fa54db34a215a9725d87ee02c86220acc0f6d2aa3b5e5789265f48bfadc3ec76aa18c582509e112e3200a74088d6c2bb586242f9bcaa896128979d6a13e573b7f39af129dcf72749a5f21d1df47e6ae5b5a1203dcf6ea2adc6c39e2f2cf3b0349ccdb0d392eec3ced4293c3ebaa6508ac5f8e590aadbc457bbf16b6a5ae63431a9f7629ef07451057e15883c8d05f0e6db70613582b433721d18d417dbf816b88cdc8229f2ecb49bcd139f8a43cb26c55adb8d997a50ad4a3cdaa646dd2f0af17faf9f227d9a0706cec55b3506c9fad5b3e1d837b55ad2ae077346c7b02456c70ae2d7d0936a6b52cb697a8faebdb67e8ddf7b59f842327fea0d384e933f5525d14a15664ca201744e4e9ae0f84ef35400db4f0b36caaf7006a22b3fe4a5b58be6874d23a0e46405f1e54bd8bb2b83483397899deab736e391d723f40c7429ea27e35ffd3b9bb4b9c3b029ea6fbcad3d5c3444775939a6f0f26dffe2ff265ab1717e916394a7c9dce89d8f82686e66ca66c894f842dba1efe776377545396a2bba1c64cd3039ad8688e9f32256904e77bd5cd10ba1b0e41873fcd0f2181de8bdf25225e98a61e7240dd3390b4f19d8df52e7d4c01556796c7e390fd6e23824bde4a65b7fcb4e51f239ae19fdf82e1938ab98b6c9e77c054ff0fa2e516720d9ca3c6c991b58129dec869661428c2e95c844a4ec525a96fbd72a7c3279af3069d2e5d938f867184df90c134421b9856a637c8e57dde2ddf60e7e46de8dd73c09cffdca5d9c092aacd7d92b25381c8c3cbf7509308b4b99a5adeefc73d18a859625e53967703f71b18ddafe5f77df60aebba43d43adaeefcb827adee63d398ec777485e4289508b5e61558353d1f05a86c69554c7cab6a908f46553f44199f45acd9cecceb993a569de448f2da8746728d17d694ab3598d2024063051da5249c349bdf3341c444cfb8d1f359decfced08e104e09a36133ec82e298c9ccb304802558c36643e0c7c136ebeb57c33b1b44ceca9aa6faba1e18ac3055bd61afd2a9b937b55b3eab9aa9833f8e93661f357897fb257b888d70ff46155d85baa3c1c40a4f9d2353c9a13cd4ce022e9603b143116d6c9b9b1e4d3e58f113e0c963f8c29daa82093d9e3fde6958c4b738546767504662860c7d25537b5316647214c3d87e14cbb05ecedb896a38fb554f085a69a3a42635cbb44ab5d86e97e0013d9ca2138cae1356702b1e9992825b01ac44dfd68301398623ad1b2cd9dc6727553559140061262766ec4f37765f635f0773023741822c38dd3af790fc34c4f295b75b53ff35b2926aa8fddd8ab42ffbe9bf3b0d326d989da55438a939c4007f9284cb6dc9c5d35f9a52e627559b1f12dbb2632658e82419861c523d93c63852dc715f7308f637aa2d5ec075523bc601108f9bf0c4b8a7f8faa320884fb6541e233b8674ba62e57f276f7b5b8283bf786ec4b12f7f2f30cd6ea2242efc4f235da8ff6e8de993d9b28ea4fea46bb456195cc36243e58b6d1bd8a79293dfcd88b20d91333007cc4720f799dab9eec6befe843070583c80437d14761a9ab7305ba49599da47ec44a132218547a46254de2c3abdc82873bd8993f230e66c9dde1acdc40a1563645df5c3881f9f09225d60d9ec28d51aea2e26c339fc9bf8d93b60bd7a3aa7270bfd83d7709d976174855d9c8dc6ec66ebd2ca8c3e98e5275d5c24e16ca124e574ddeef61125340c869b1e13817bfb0f5246142f006b34d5e0f8d1b6c3ecc89e2968f86c079fd27dd909387b84df2e92fa6c788f5cdde121b55c17d29eedf1c7f9ed19273130e6717cb4088356f76c32e32d5beff80b192dd5a7cdfffed193e6682a0e0f749533791eb2036945445228e6fa9c9df953a23d80e916fe69549d3333fa8fe8e17e9570ae8e714f1c1b49e5634ae7b8b9b2e705c597161da54d5c2beeb0c737c621a43b8113ac28ffa07c09c2006dc888b209a260d4ab2e5b55285352c9be4c8edce8d2e1aeb386ee106801ca1d942ae8deaf21d76310e8f3b84c53967f1602a3122c6d64146b66021e11eab0e8e3960b2ff6ec2afd01378def0ecc947d2fe0e0bc80dd84ed0b7cf583a3685f287fc0dba56a68082db8229ea69770ed6557b40f647087ecd58e10b60e681a9d3349fbaae1b3c26a748eef33c8b5588c50cc7fd20d2c5a662ea0a36e2110e94bf1aaa73d8bb196176f461ba7fa668239a29cc65270e38ab5e2ee013e32ef0a3923c6aa3dc3b2f9170d7024b82e2db9a31280d88746f7545e9fec40106ebe4597f20980d42b9befa9f6075c94da09b83e6b823b568e463c48159891e3c0006fbc7e70f3804559d89b74c7191b41756de380ed0a3d89b6d7006bb502dae3f8966fc3803edf66c812f26c92b23dd80f65c5e57aa591792beb71c64350e460a794000cdebab864e2aef405c5c3532e1cf1be3db2e505a745f52f8e154c8927ddf11d318845b0bcc2dd6e7123f4af342e49fa981fec49ecb8b343cfea1a1693a3d70a340a57204027fcdb1896a3ac6bf0829b89c29177bebd2edc6415d4b17c1f5e7638444f734083603a5af8661d86a45880df5ce31c526f486fa3db655e9c721eeca9df534f19c1e29662c3ff6138e5d330ffeef6dac48f80c28120ffb3b8680be28b77c19c145b2e441d5aae07678090869446c5c38f17e42e41246aa647d614bec866947f78f123452bd0083058c6b793927fb0cb8893c18a808657fe965cb35a89a7c1a52f302d5df2a3e0d3861cb38385027ec9522ef66047a0bc24e8c3de8c8381ea9f97c700481489149e7ba59d64970b7ec44557631f1f6bc9a76109027cd6dac8563d1475f791165df18a50d687c9095b866cf55dd4ac227f07a9560a07689453e1cb6bea5a535681ff2123043c465967e0fbdf1c009adbca96443349a9ac5c39c524e4a0dbed83ceccf9c4817b5477294dc67284800a92361a83c7475b8743b5dd02132362a76e1a5ffffa9c744cf1395ea45506eafbbea8267f318b76a4e7582e259c484ca39c3c0dd87200a9eb9975784ee38894fd9ef21806f8de03a98009dbef57147f8356e26cd62bfa95465752d3901754d537622fa2618affd4f816f1603d563df16edcf7f04edbd5d92cecbab2e6273daa7cda6c333408614740282ac6d3b9f7a62ded1575cad7fff733b6ab86ab6075aa0990443dc5c9b06132bd230b3eb3778c54c9d8a8848195073ac0596945631bb68296b0661be0a025abd9183bfe034539b9b4078f970d7667440acf1f77813358a5f4127a843fc976fb1c9e4f6c1ac2b98d9ca5f6bf2fb71811e3fc2a83da8479fdadf2b871d6211850561d66b1343ca821f40d059db0de362100e407192349548800aeda9b5e140059240b05ed88502acece03bdcbe5123328d3185a38ef96","title":"657. 机器人能否返回原点","link":"https://leetcode-cn.com/problems/robot-return-to-origin/","question_id":657,"issue_number":35},"33":{"day":33,"pres":["模拟","堆"],"tags":["模拟","堆"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个二维数组 tasks ,用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务。其中 tasks[i] = [enqueueTimei, processingTimei] 意味着第 i​​​​​​​​​​ 项任务将会于 enqueueTimei 时进入任务队列,需要 processingTimei 的时长完成执行。\n\n现有一个单线程 CPU ,同一时间只能执行 最多一项 任务,该 CPU 将会按照下述方式运行:\n\n如果 CPU 空闲,且任务队列中没有需要执行的任务,则 CPU 保持空闲状态。\n如果 CPU 空闲,但任务队列中有需要执行的任务,则 CPU 将会选择 执行时间最短 的任务开始执行。如果多个任务具有同样的最短执行时间,则选择下标最小的任务开始执行。\n一旦某项任务开始执行,CPU 在 执行完整个任务 前都不会停止。\nCPU 可以在完成一项任务后,立即开始执行一项新任务。\n\n返回 CPU 处理任务的顺序。\n\n \n\n示例 1:\n\n输入:tasks = [[1,2],[2,4],[3,2],[4,1]]\n输出:[0,2,3,1]\n解释:事件按下述流程运行:\n- time = 1 ,任务 0 进入任务队列,可执行任务项 = {0}\n- 同样在 time = 1 ,空闲状态的 CPU 开始执行任务 0 ,可执行任务项 = {}\n- time = 2 ,任务 1 进入任务队列,可执行任务项 = {1}\n- time = 3 ,任务 2 进入任务队列,可执行任务项 = {1, 2}\n- 同样在 time = 3 ,CPU 完成任务 0 并开始执行队列中用时最短的任务 2 ,可执行任务项 = {1}\n- time = 4 ,任务 3 进入任务队列,可执行任务项 = {1, 3}\n- time = 5 ,CPU 完成任务 2 并开始执行队列中用时最短的任务 3 ,可执行任务项 = {1}\n- time = 6 ,CPU 完成任务 3 并开始执行任务 1 ,可执行任务项 = {}\n- time = 10 ,CPU 完成任务 1 并进入空闲状态\n\n\n示例 2:\n\n输入:tasks = [[7,10],[7,12],[7,5],[7,4],[7,2]]\n输出:[4,3,2,0,1]\n解释:事件按下述流程运行:\n- time = 7 ,所有任务同时进入任务队列,可执行任务项 = {0,1,2,3,4}\n- 同样在 time = 7 ,空闲状态的 CPU 开始执行任务 4 ,可执行任务项 = {0,1,2,3}\n- time = 9 ,CPU 完成任务 4 并开始执行任务 3 ,可执行任务项 = {0,1,2}\n- time = 13 ,CPU 完成任务 3 并开始执行任务 2 ,可执行任务项 = {0,1}\n- time = 18 ,CPU 完成任务 2 并开始执行任务 0 ,可执行任务项 = {1}\n- time = 28 ,CPU 完成任务 0 并开始执行任务 1 ,可执行任务项 = {}\n- time = 40 ,CPU 完成任务 1 并进入空闲状态\n\n \n\n提示:\n\ntasks.length == n\n1 <= n <= 105\n1 <= enqueueTimei, processingTimei <= 109\n```","content":"096221cf5b628be1e73e8bcfe626c734748f20900a3d40987a09637f20146dacf34851ebc96472cdec9c7be126a0a557be330cc8912f5ad2b362f921bda5ed33ff3c666096c78ee0002dc5a98cd0497725e17c8291a5419d24ac6aa48de0efcdd0e0378e9a7b1dc1c6b9d8afc0bbc8bd7ebcc3f2c2ce2e00fa3f520fab239e7a9ad419793b7c193140c6ed67c90fe621ee1c538111540b3292cc4c3ce0e5b101dafd712f05a4eb43276440ffa8741a6622aceefdbf543e3ef30482f4e1334e1b0d179c3bc5c61ccaadc55d68e873770f9d7f916816418ae06f4cebaa3b532f871b3f30ca1b348c6e47ab9f305a230f04dd8aa42e3d28a6e7cbed08ffa4c2c728239808526a2bb741c6aeaccb8f5f323eef8ceb15986fb60e1d12c222868f6d955601c0886caee3c72bc45a7a41f047248da7743ff3b165a3051badc11ed77dff7f4be0c3286c085cdbf1655c480e961d2a3051084565559f1528fd853805699de2ef9728a3dd17c03d25446a385aefcc16cad514af5b2ef7ceae33b86d3348ecf066e1c980b05663162ec02e5be3051081321cfd988f65bb806e0ac25b5e48621206437440319c08d7d31f189affd36cdaa7d2e2aa7dd8c486d79a720557cae29179fdff884cb53d11896e0846293f1252924cebdfc5ab46f64de99665142f847cb2162e9e99d21f8ba4c96a2b2b27878f7a43c60e7c65defd4ab24399ad7f99a462443b4fc735f95ef44793e9e29a4115ce86f99662705f984ec5ace3c6c05a8305267d95a385cc4c5e019595bebb0d1a70645239ca61b6f762120d46f6445e705a50cf9692b2de362f1c1e42da21655ef663fc4d1aab21f9f1457090c3722f5a12cbb10cb6f9a9b4838963ede4302effd6d3fbc4dad9df08163c710b5e766e3e88e5557cb4d69aa9296771870aebae8c687d71eb04c877fa32baa47aafba90448f2b19b16a6d66f4b6998f21156808952813c76dcaaace9179eb3ac8ac4e432ed3209c46679956abdd595cc22089b11214247756d16d73eece1c4fdf8f03abc150decf15260f81ca5650086f409c7eef9ca12bcf3f00141597d63fb5e701d1576d76bbac50a12ad4378df373c57b1dd681ac8657b3452cea988c865d12bd0c77953175650de856f305b374a229cd321d829ea43b593aeed6f59c7256296368414a1e6e56ebb29a055467a0f48732f15914333010c2e25cb24373b44ddb234ca8d0c38591c2b306ec44cec5cfb248d6f1a8f11369fd9e039756a73ef6202be47b024bf83d520ceb270f8db0de1f1116cb83c9fb4e1a1febb1c0eebae5f73489c01ea0d87e51e74e810c0fb8be1e9989c54eea1cd279283156ff1bc57b2fe228cb52468f4299e16d2340d5f3eb98f3fad2e2e7464ad194b28db016b82653d964f7e290de50cbfcf9cfcb7f5ffdb61acf8d4ff1a6e56f1955e7916167f9f0fe8bf8bde2c130026a578a37a3d728cf65df5024435e82322cefe565c013ba93713a53d360f809333700567f10a7b24434f4ebaa86c6737695c467e46b68693cd515ab0cb181da0a03b166c7ce0d4649f55d90d9eae61591edd434a6d05c0c58cc6802b9ab3ef2ff221443181451cf4dece45695b3c0ae1d7fee596f23768d849957a731496a3029a9c5d4900985c6d1712752e1158008fcea9ff1516415bf8340ead68ea2c2818215bb2e88c0e7387867333a32c3a5d0691f371b728896f8178bcd3507fa9272de14451468c2dd008e183b9a05cde974a22c752a341ac43bcd4c361ce5dee70d51d9ecdfa5c198f0fa76fc4d8c764c2b2803600ed77d683da224bcb0d46d4182867e694c31c9183baa7e4ce5667e632f5ec094f5af471a5312099ba2b165a67b658102f6211d61059283ef3b5241374581f239f4d2e936132ea472b622fa8ee13d5469f6d28ff85af2ade4234db27118cb40f13e38a9b1dbc49ece1c77bc2086c8ce49dd939c00d3d213308b7ccc70559c6d788074a10260d08a1badcf517b1a4e08d37b8c2481435c9cf74068e5dbc592509b8de5de6ba873a4289f032f28b4fd96407ad44580a5a37bdbfb8e4398e84d8b09fbea04ffe5a47a5749adc8e5f977ed6353b89f754dbf7b9c2e0c739d2ed147760160045d92db9df0c6850c0b9cae6a00a09b7d1ac555bcb0f8b980e9c66fda6907d4cdc71bd95e35fdcbff584513f772df5ad56d2e71fe3c579a5ba9b97d68c0e504e66b4c826696d7f9071693404e9620ad3889ab6b2b62945247117602732d083020a414590ca47ede17fd75cf24792b193363c97c5737959d01182f4dcccd04faa31fe0917fbab0e0fa20e26593fe2bfebb5098a855ea9f5a1a34dbe396b3a88c0c7b883f4f3c4bdbeb425bec00974b036d376f1bad46d7bb32e6522b702d866bb3fce0ba04d921f535ad69888bcc1d29aa7c236ab176e736437527fa43ae0516a5d68a45a56af7d1f6ef1faacf7712918f516b2513e762f15710fbfdba7f2aafdd013bb7c615c0884b17d6606ac0c1d7a95d3f6bf5932339f4acc4540e00d6920d3378b46fe1685c5f47c9157dac9a00f5cc0545c7e0699c4a61ae6d5edf0192eb69a7d897f73af1152a51f3caf62cc3b9d92b5237ee0467849f7f11870f18548e5cd957961608f074203cbe460ef092d497f14399e6cdb7643584f02dc400df824fc465f9b52de703cdf70f75f1ae37927b9034bc28e88fa9de8782acac67d7a098d9306e9117bae6d7365fa42c4e41b59c61959dd48a1b1a5af65085d7dc4e506b99334459e4e9c574d2ad605029b896b960abcf3d26198ed8356702847f1b890347277d794c6980eb3b70c66cddae17114208097a422b790598008f847efd7850704cb411ebf1193c1241070f40a9a0b14164e3d7f37a22dc76a145d7fb0d8cf1a8f40139ec83bd21c6ab728c71895884e226b238978de5e8a25224207460cd4fb32b1ecf037dad9eaca162bf4e56935fc8cfba70bb37b8a352240b6aaaa9b8492bccd0d009cb1d5f22355e3e6f2459080777c1fcef82f17d2f9616f44765724c516597f9100b52dfcbb5dec8cb9165892c25c853c82b7fdfc59f5b09500f3114469322c3010d4b280775fc41cde5038c2ea73c83631df00c1c87d47c55115c7cf12b4d4b68b4e69d3d9266860d4ffc17ac4660fae436f8d162cc8ef397f5fed6b8fe8430d7b24e81d1c3046bfcad7884f50c9172602985917c94e2f4cf8b630447858718686f32fa5dcc423d8b55961e75677d8d2cee29d85c6bf1b12a6bee3c8f7d67b99caea687af6ce9bb894c28ed39cdcc011c2d042e92429c978a89b0ae3a478ee4876e76e436078dd258386d9d711b94c08caf9ca5379cf10249f6dd64811539175ade164e621415d6a1a3226121ec4d7e345e2668977bec901aca9a665c149c6c24d6033b1b5995ca8d9da7901318a55345d221f292928b5d09c7f187ae9999d02a7fe0f7cfef2636a18309c737bbc4c9a80974404806a19434e2ce064eac061a89841f4eee159ba2c95e6fbb8b97937cc64c5df87e074c3b4788b4e339f43249dfd267543b62585762d20c723d43afcff3071e618e52a6fd5e16a24f0e55fbda6155160394f9353a90950e33e13a37e9572ce2af426aad6f52135a6df98237222fddc755b8072a2fcebf1df71cb0e558456773136e0c734237373d50e0322a6b566e5fca8bac5d31a757ed2e963c254ce14443501dda53a7737703b12f34231c6ae3416038efa7a0a85e096af4c9f8025b8058a54275c62441499006a18a0d0997030fcdef542a6baf6d4c9b014d4fdfe52902bb7d223d03f72abb2764d55f1e11da1c428f81f4c3b3f2edf5fa10cd1ba7494e6174c337e961d7201d1b2f0bdacaaf7f5999bb15264530a704eb7e5dff2ca9b04022d9296e6c1c395152fecd2af5c3c2dd7686b09ad224911601e3938c9bca38c475ee9799e66d2db5101d7428275490ce75d691c8e9253b1f25877260bb8622f2fc81027bd52cae862c6d8e6157dee99f714fdcda22392835947b46eed3071465bed0f9e29455614c875489ecf1ad2a0fa031d822ccda47c174122d29bbd009b3ca6ab6f40a4e4f987e15d9b725f7590d602fc640f8a9c93d906dcd87dc8b645b8b2e97b56e4c6b8ca51e2685981ed521c63398dd6c3eea8faafb44551a4e0f0a4d7b57abd037f0ab5834c31fa7bdbd0c5ee83945a9d51cd0346eea58b1871f1f3647783b118fe889e40bcae872a606905bc5f546aa926d40cca2fb1e05791d61415640d1ee958cb31592bcd309cbe8e987f28accd05b13599646ce4669da7794ae54ac963d330920d910ed0c0fb7e4a3ded974abcb4b77251ee7c15d43da9b17a1d4aa281b78fe4499619338da51b83a38e4c07ea0a54e29759211ec2203e3b38cba8de4131cc94137491c436c5a264cd5e7980e873ae27767668064aa92093808d2b119ebd99e0f12e9fdf5ddd7c697b2b02f346f26189de83075ef4da93787e5cb4c603271b5744f0540175cddd443460393681fa6594962d1e6c0ff06b92d3d13ab2186c11ecd2755ec86c1eb70ab4c3629fe5f768c1a4f5c4d062aba41b449eb058c3a844cb1461a383a273b2b8bf69a26e7f3899530a69a9c1153af9108d089099ba295ec5e5ac48a98e2ee2e1d31c9253032ff6bee433974b7e0cd82bb3c2cb5be0783ebbc4fd65a5cbefe4922517fae3b24b0223da127c5627b4613b4a47f837831856fff58451b70168d9ae3ec33618e6072c7a94468cf29e0234d8ab99fb27c2964eaee1b4106818b3d9611767a75ba426dc3148730de1e8b1262da50fb860d289e26789de06d8e42b1e373b44505cfde545e34f91f5c61e13351bdb8d8a28272ddce42fc5d82498a6324b6416c401d31b244a39bc1f977721ed5ae38064bde83d04902b3b8f3928b4583d0c791b56432e196df80ba1917c526212fb219137d514249c93b4ea557a4cc1e74e29fa3f4b08db4ffa36ef49eccf3612a8b916080e85def395c6c6b58a3ed4d59a470f271f9967d1d72fbb0cb609a844b4e98cd5295ebb683f4e1d9dbc1d6645de77f4b899c199f894032270c7576e75b65efd8b9f526c88ec92d6cbfa6d2e42818be27dfae41f3265cb361607ba2116029dffbca951ef5fafbfacfe4dcba2191a837c147cff5f0cd46195101f5d6bbdcf854afe6f73117a145598c7529dcaf7ba0ee8fdf8fd3b2afe5a3342152a973e34ae7e07cf45171bf39641164300fa1ae30562903b8f9b82a0a6624f0e3427fb1d3539cf8d24a1e8c3592589ff0250b70bd3691c6ea75914b388f67dc3b13a2a3600a44615b2e38c99b860fe509353e02cabe837250cbd1324cc0263b26490b20714c03a9e7eef5ed6ca1237b8b4fef9f432cc4d7c52ab44000071b61b955167ff9fbbb7b8b5aa4fa38aa9a341078c2233e76b112c9d21b7027ce114adbed1b479c4f43d1cbcf3e5302bebbe090a59f651cb1b228d1d90a89b561790ea129bf5e9044d1d3346b1ba5af7930f7753e2822ef7a05dffc11fe71335616cb63f8cef16bf6d7d806e299a3e60b22a07cda83a9596876251410496955b8c1992ee22376decdfcfe2c790bcfd9443ce72dff21358a8ab81c4bb56f550bd335bf03a8dcfae191cd4026a008590e3912d3ef9acf302e90f40eeeb82b47a32f3d4180f27591ff5455390e00b35e48e76a70e7bb1713ff389010ec5aed5b057dd1d6d39bca978c42cc2867bbcd6fcfd2e732c3e2ae8203b13953044f7407aa4a4d8b4c911c57ef8cae6a26674ab9dee5b19966f93f2b728c84b6c08bf19c26739ddc25b4266123209cb9d918d4a8bb7b09f36b7e17d5988d73cd109551d35641d7f6713f7f0f84f72001021744ad952a0349f5584cdbeb923863983016f38a5eb1523c817e0e87d1e9ef8226352930f201ae5b1fb1268be8dbeb6ee18fd26003d7bbf27f2c4d1b629a5796d85e8aff52daed3ab24208389474cb95464b75219f8991cecbadf4ebede65b23ed765153320f49d1a37f42a2e5cfb33b5d19614d872e8c3e0c06cf01a582c658d7d881b2088237a902c8a14c988459fc471c82b97b07de936450eb646c37f5fab100e914ae0107b453c2fbd9b995f9e6cea371fd61884f9f4cc2be95dc49859158a2e0c4009689ef6ae4895f1d4f200949e83cb8564b5efb55ef7e43c6b384f7f5304e1f351abc28e50042e9e92917f7aff312a9025244fbbc89f012ccbce51be1e347c4325ce002bf893de5673dce97b50f026b232becde3739fa3fcd4c5f068267a3c7fe321fa9263a137dcd2f176a8dc968bfd7ed8cdd35e3ac5126b168c63df85edc48d067d1ce5e92b6396cac77602868804c0ad8413c8f40c730c49c0669ce0ef7ef9a17d162da24d8a8b66adbc820b285ba856c50036664b6d637e4dde6898cbd3ae19416ab5eeedbbff71cb896acb758cf5601ccd2c6e9c2a74f53febbc003ad94d84622bb3ff93db09ca4ae4fb9fc8fe46c0894d8eefc373c7803ad631af5b502da1cc66055e6b3f926d43090019dc6cc3e65cac80b5f85270f9d119084d221799bdbdfc3e8261151b768ffffa3e064ec275e1cfbdad6ab0a8f0eb17f834d2a7053cd2a3d15f4f81be136b731d2813a457296a684941a41a5d2301a5700cc7c47414b82373467fb58a60975ea0a0652190d7e76c7ca1cccdcda9df5b86f8567037de5546f7a33489797750be10a28c9f5ac09ff3c08128d3a8b9a80425e5d6e9c1ccbe93698f7d05b1b0b7d4022978796e9fba38c3623d20ce97e35f4450d4626b0d30d0de6295c90142feea606a21d2a9c8b2dabc2a00ebc3bc0034d083e2f17ee43b7c9b0e1b42410dd102230d7cfbb917fb3b6a20e16897184881361a7b68a35c9c326c6b363e799999cb3d05c991fc63dea5c43814e2488f0233d17e399b199e3f122ebcbfcf9800982a267065a29bbfb75dec0e241fb9992e4b8197406f99fbbed59f963891f5f660f452a09606a221e0eb295a34117b8f351469534b7872bc1c76ac099e3cd3a95ee1119825318f9d0fd2f70d91a06ca136688694dd32733ee1976de81d5be9abe74164ae2c08cdea1f424f78efa1ceae93ec63509735aa1cc1efeba7aaec62bbcbf4e0c2b517cea954df2f5a2f79323b1b51d7fa1c35612953505be688d66f6cc620a7ff2cfbc147b8ee09d81e79b0346e65c4b9f8134b09752b248bddf169165d323ae1c1138caa0d54faad68cd5a0a29a3093c6a2a273909ffa871ec3f9794c2aeed59a13176bb9808a6034165db49f0972727bf457d88b97c76a266f2f30c69a659c3907cf208d25e3db6ce48cd6219f8399b3a7f83c00b0af7ca91e2d201e18f72a529f580df3c2d9c440c0db942e61a3710af5dae9a125d0fdfd122a141f1c21317ad7727e66111a1a442a231ac9f0ebb8a00bf5195cb93e534480d4fe9229151e9fbe25c54ca5bf34b2c20a6b258e451077f7678821e44c6363eb099d1d185dabc87d5a7de4e6f9886aa36d2faf6f02e5668d52046edb90566f8bf4bad8e174e683ebe988cb82a7613547b3475f9f3e1f684a50999c4742dbfdfb95b5969c3c1c136fb822c5271dcf8400cfcd48d8fc3fd46a8d76f4eb8917f728e532fb81f82f5d7e0c2b6c6f3a635972c13247ee8c66732584904f6a5c9b0f465fb6b550a5158e3efb8a4742ed179f5c629b1f8b165a43d1e26a66972bfa2a23c5c34d8ac2b4e0e8ca6b8cbf09edbee560225c8c1a79e7dcca71a738ffc41617d6f168320bf5c4ef5936068ee608ae88b2286a5fe22e580c2444a9493c492600b672a6f068252054b75de9492a072845924bb94e286506fa040c5e5d8d4564704140158612fc9707e4691506d0d0ae414c2429704cfcd0dde49bf2735b12f095f96cbc4de42b093188656d8973a5e174215c04cfffbdf173199371e5b9693ba1b87cae86af0f38f79b8c9e5d18fde4bcb4a6243f9755706ab7bffab33773f2017432861af9acb51c335e1ce0c0c4aea73bd067d00616f815dabf44df0077ba6dfe44697115e0abc24ef802f49bd473299f0f1a2d6fe20977edceb1465889c3e8f0726a6f85ede4d17b0d4f4e119f9b089649f8b810b182f212a8d4569a36f03db096d56cbfa7f2b7a973aa17b44221cf6ed25a1d03d77d904932289ea3d69a25bc6415765fdabc8d7da02baadfb2521c49efaddbded0f957b5eae4f2e3966e62bf2bf3db267df0694b02dcae490f8c15f6bac13c801ae7f1029847da0f47d5434e7207c20f7285b065f883748e8a20ebbdd2adf5b10982403db167c8c757e89aecaf1e8f7e6d1f7a7823fe49e49c2896178d1c15c6515f3a36e731302910413f2a42bc5498b8d7a054f8aea61e84bbf0c11e0d05d2839a3c7ef885b8f6ab42f027be6ebf97064d2782173b3cad2f91977ab0c906ec6c05bb3f5ee2f173a95bbd80e1d6168bc676e37c5fa1e16f1d5f8943ece137348ccdd1a653c46d4ce4e2d82a1ab45614d85cd3d146995f0e6473473d728ad2f293c2f1f658661366c627000065b80abc4b9133b2b501d85bae3ac522fcbbc87bc5d14174fbb6ebe7662a6bb3b71a5e3795ec763235c8adcce77e92ec0b94fb194f999ca606661b79d2ce3c893ffd4ae2c83ee28ca39d80942e1fa3c8032c26665bf436bb8161690a214fef60022666254f24773091643a820a93dd3296ba3592b5ed1d283ebb8b0d7e77fb332db3a9459f9ddaaeae54ee295326a408833910051d88f9d48aad576e1b38d3dcab18567047b68a2f66fd6d1598606f7afdbacc94a4d57dab9173c68b7271d57a9b8b73c0a32104813e22ed92eb8127a0cd8e8354897b2f23255701e75a5f9fe26e06fb0b1f1623e444514f1548d0117fd61941cfdc1ad3d949b88c6880da3f27e963f0bfaa25e641fe7475c9bb24a246fa9a86363b17555e9b80629e6098db54278c2db53b25ae8cc5bda06063cd1b81971a5d5f69590920e4190faa52a1b9dae60550be73215b0a9d9d0ad96bb24780deb44375f975db5799cf458945269410916613dc1999b6d0932319b7bd49e4a75e581bc7fac896dcd8c8bcc49a8b9b9f1f2e833d54c55bd7de77b0dfcd476a99720a812d2ad7650435c6c1d75318aa95497b29c54947e6484dca2a94057fb12e86efc9e70b8d33aeee254277e55f9855413d8360c7af5291b289705351cddecbad08b88a06a96243cf8e0681368a7bcf9a565e143b624f3e5b08e0e07211ebdd51d810a5a129a07f440617580dff01df6fefc1ae3215007ce3d1d251b960858bd1eab6458ed1fd29b0bb0e7720fe3004657561783bd71d30b68185a9b0c0a5a8c9f2ce817e1d4fe261c824d83a4458c6ab256953d4912d41707fadd97564aaba6cb49114ad37da8241ddc71357d3f0609b51ddec4f51577fcae6064a3b562a44982ce03e4aa964a9cfe32bc406596acc10498f7c8a1025c55dde8be29fb09bff60833ed3ae6598088ec23ca9481fe3b449e21b6cfb5ca59b78a58b6e211a0e2acafc47a85c074f8060783500782526e5c498d32994e308ce4c56d1fbf1c4de03ce7ace3f3367242696cb1677c25a31f04a3609cdc82c8a0c1ba2c96c2f77592b07271407ec6b3766d121543f44cc4b5d622f5249230cfdb3ff78cb68d4a7f77aa871df741590498bfc259ff2e5037af10aceb6d45327745bb29952ae03d95194de3454596397e60771617e8cc15c2ebc4c9513e555d87a35e8d733f049fe718e9bedeb6e7839be92d91d768455544f367a85b011e9b149e0f1cbe8d744702dc891449db1f0ad989910b1fc2cf3d00d418b08f349b556f8fd1d775f304643fd70e083878c7fe2ebff77d060a6189883fe3769de7ef304c59d87892da9ccdbb8a00d9a3205ef785f02a8ebf46b2e00f20a758290a092badfc35e658032f5d6e830284284d6018aeeba50715cf0a141e6a54d1dabfd11a5977f4ade2b59fad3c21294015ee66e0195d9d1970530df1843332a8e25fe98b4bffdc1cb998e86fac1d875c0d1f8d0d4a145a68fcb763e4b73d77a0ab3860215a41b6e69f1b384d8086ce6f421adb0e5b8c86854f937de24d2943f4e03f75acf9bbe35896fbc61da6f6071736fad1c5c1755d7a1c3996ba5708f05a1002f7e080fa48ba609d7c6d5199cf9bcd09e42b3f21174d6f31c176de51573edb67504c768d73bb2e125fdaa7724dd36aea4e8f4e27a8eab393ba5ef48e0c96f6d60d9329f5fd8ffdcbf97e96808b853092486c2eb4db64080cb7ac32efa1352c2a58bd9312052a16c09a3956349edfe5b24ade6d1cf146da76eafee9f6606f93ccecf29998ffe28db158bae6f61ff6ad5f7071a32a68432d06c17b7d125d70157d9e01f6c809fe5b39a04e1ec1236c223f3e2d307979472f1af78b7ac51b981e9e2c19d40214ee550d72bb273bb3b8ac366290d70025060be958b3375b434681755724f86593023c0bb3ef2c59ad0e3504672b71df6b4474f24e88cc1577eb88c546d4671df870ca95e11b0f5b7a934e38d4b6354e7c48081a6125019f545a7067a10245d2cdf2f7081f0ef083c0c4b6fe338bb044beb86bab096468e5fe26babaa9786184cae6a7996aa28c752376176c4ce19266ec7cd14bd8d5b88dc2f3e451c3fb2b33bad4b14255f8f945fd852a063b43a3bb55f25ff3ccd54e6b4e9b77ee100b6915f1b5068d437c5cc59ad6b6d626ea446e992415e5c1f52e6eac6b461002f0a129b6c4cab2e74f240a445234fa4d7e2ad15d8f45cc79cd54434eb74304319a6cf64bee9d1cfe4d9b4dbb44c73ee97b32798f7ef6e4e0363ee6926d6a9c523682ec0c8a53a7674aee045a34d70a0b5e2e584f3d72c1657265a469aec73e02055828953602afa3d3bb992a638de5dee41bc6fcc2473cc9a4d7404fdca8fa13d88b1d54dfd6eeb761979d7d0ef9662fbbfdee203f9d708f55f18e4776ebf39dfcaff0cfb941b996b54c4f665b0665068754c646c5dc7902b5d4b0f4be89ba6e8ecaaf495800026d14651db4004d029b5df4d3a171b44db6d2d22a6c3375fe52b6b71973e898eb0708bd99ad2006fe74a92122d0d4c81115c2900d1f099dae3961723cacbc437cd55afc71db63572caa712eb52112273bc6e4b8371c92193bef606d063640b6b5b53595facfe32af7de37104d15a7af75fb26579c601d1442dac2ed74cc8fbd94ddc3c6d9278b3107d884ada224db598bea87c34d9c706231936c0e60f0bea8058f9a86e101d321f497454801878d0cdf8926c6585d84760c65b2c1e250b6236773a487afed08992992c445181b1113133f3e2dfed7ddd1bd202392977cbe0f6119ecdc5bdd48a12d4442cad239122bbffc402931eb4da73052c0968b34e24106b4f2a34fbec678ac2021f41693fc1dc01b60df8f96598f0128fab5b26d3c7fdbc18822d700a1e7882964b4a86a59d4fa53edcffc1475d9562ac2169fbb411cd49eb258df32da28d224f1ab7ad181cbe42121305a4eb787a67e4d7949434dad07eeac1d502bc34e74975d4728fc68f0fcc57b7f171d0d285a91bc8e6e82de215ed951df3b1655570f269904bc698dfd1ac89d59fa016a62a1141d213e41b22972348cb32a654e880eccd7fab2ad643752149691b2dece60894450b2f0b907a0ad87d9320f2e0045238c5b5f2933ed4b383df726155b8ef77d3688b8b455e072bc486525eb5a857dfc6c73faf102acc19aa8df5488a7bb2fd7073aff7a5c3c3cfd87c3f49723abb391ed69161e49343d68f360d509b30f8952f3c9561ef288169855142db03b52424256d98f9a74da5451661ac7a5602b690e556c28c3e82cecc94ce018c250f8d2c36458ba558391f92b811afe6e0d5bc5cc76a6d825351d9d667743295dab01f0dad719f0c02a570e0db8abefa54397381bcff73c4e1d2b1adc455a7b01ec572077522616520332165d1ebf58b7078f4ca103d9eefaf1746c11c714e084ea578f577c45bb8ac1e03c7b94e000a407abe4c568de13630b181e8a78b0466097dec22937b41277f27a699ef57503dc3681d35a424980a14bb8315a1fbf1d6c28e9eaa562eb334be98ee5a41d232002a8d0737fa11983adbc9446e4fa873cdd3da4a70b46312ede72c9313dad21864c79676c3ce256015fe6e5c09ac00a90cda13fbd6e9447b6f4a598d6950278486dafb9cff824514d344cdee598625a1d9787cced83577a5ec9f364b92edc78b683684e227415763cf12b9d99ceeede63a5ba51f7edb985193cdbea444f1eb59ead27de982fa71d236460700537a7aef795439c0e7a61346960a8b36fda71a3a5ee80361fc080fb9285d2ba2c495e046ccd8deff3c946b25f556fb775551c2a7b0ad0de7850ac4c866c0ed73aa7996e9d82a99bc6bdc62279371501b95a5b71bdd5ed383a37070b74d80c7348c9547ce85ee1a9bf9cd6cdd2f1c6da0781fdf6c66bb162cfdc2f6ce1b76d95aaf2834e1dc12876d51bf638330ed22afdcdb8e54438c1f8831c61d608bd38e771640cbb4d4a5915d841c1322b7b8691c542587ef4b669bb3bf1b8b51a736d31d6636b8e08fe3e9d6f3e25a4431f549297f3726795f1bf77b38ff019e647af0d91449324b40d2a5dafe5bb8446a7ce38cc6fd258893d9a1bd7abb56761645c213d56b373cc62961cfc14c85ad463cb3992bb62266633b52869a825b2f857c48936e7fee6163ce474fd61c472faf488f4c6ee773ab447054b9c9a3ef5a62986f34a791e8d24ddb44c92b213c62db4467e79ed31eea3d86adbdb487ccdb6678a3bb09733fe06d95717e1c1b98bb7bd44cab1f000d408b23f8a5cf4e9ffa437d1e65013b2e7c697612a9b97c47231b90a9ebee62ec4fc9c3133c7f14b8bb44976370ae9ddda5d9fe7f716c545d47e4fabf1c1403ff1cd49aa964969e9c54b02ff80d60f898c3a70ac2440326cc6033e6461b9ffc9bd0c30674da0ba4859db9edeca0ffa6ce3dc90e145447e17ea7d4c6e65bb60af91ff9cf37eca710091ed3606143a584d3c1acffe033ccaa94ed02a6c71c1e74b5311030268534008321ef329f9c053ff8a015a6b31e5f2e7001dbde581132be7836020876bc7c2986dd9b800f7b948a835589051d9228b2ee13667b657bedad192d282423c988140b6545693309dd77e06dd6a8780b30838d4d4192649ea598f5581d50d0a30cd22e88e87b783c9b63a13b4f2fce6b82ee63c6b493a1b6bfa1ddaafb3a46d21e77efd07f9599e4d62853c3a2d6724d5a38e3ed12cc283c5c949e43e49a1e4a05f26ce072d318bdd4065cd74dcf0b541fa9509025ca3dd0c7a20f7fa77b9dd9041f397aea0d5c7815c81793c637e9e0a2f3280991241f184c6b7867d5f36987b957c2f7e77c65daaa57a0dfd098896f0c46507a3dbdad2735e9f8585c04c791849d75d01114e595924d344c482310fda04a41a90e7d23b80d0dd9e6327e1724e566c1515ce6085252faaab07efcb1290def28101cf0d3b58d1018f3cf065a601b375a0eae8117b85c58f955905697e9830264583aab7ea1c125c0df0d6c8132b2e1506ce6592a2da9e7b4f3eb34d0a7794e6edaa83adcac1b150ad884f492b10fe1b7f8891ecde0a2a27f3cc5e1e2ebc5c2858e9a607837e10376810ffb6ef653b94a79c0b0a637a5401d63cb26c925bb","title":"1834. 单线程 CPU","link":"https://leetcode-cn.com/problems/single-threaded-cpu/","question_id":1962,"issue_number":36},"34":{"day":34,"pres":["模拟"],"tags":["模拟"],"whys":null,"difficulty":"- 中等","description":"```\n一款新的在线电子游戏在近期发布,在该电子游戏中,以 刻钟 为周期规划若干时长为 15 分钟 的游戏对局。这意味着,在 HH:00、HH:15、HH:30 和 HH:45 ,将会开始一个新的对局,其中 HH 用一个从 00 到 23 的整数表示。游戏中使用 24 小时制的时钟 ,所以一天中最早的时间是 00:00 ,最晚的时间是 23:59 。\n\n给你两个字符串 startTime 和 finishTime ,均符合 \"HH:MM\" 格式,分别表示你 进入 和 退出 游戏的确切时间,请计算在整个游戏会话期间,你完成的 完整对局的对局数 。\n\n例如,如果 startTime = \"05:20\" 且 finishTime = \"05:59\" ,这意味着你仅仅完成从 05:30 到 05:45 这一个完整对局。而你没有完成从 05:15 到 05:30 的完整对局,因为你是在对局开始后进入的游戏;同时,你也没有完成从 05:45 到 06:00 的完整对局,因为你是在对局结束前退出的游戏。\n\n如果 finishTime 早于 startTime ,这表示你玩了个通宵(也就是从 startTime 到午夜,再从午夜到 finishTime)。\n\n假设你是从 startTime 进入游戏,并在 finishTime 退出游戏,请计算并返回你完成的 完整对局的对局数 。\n\n \n\n示例 1:\n\n输入:startTime = \"12:01\", finishTime = \"12:44\"\n输出:1\n解释:你完成了从 12:15 到 12:30 的一个完整对局。\n你没有完成从 12:00 到 12:15 的完整对局,因为你是在对局开始后的 12:01 进入的游戏。\n你没有完成从 12:30 到 12:45 的完整对局,因为你是在对局结束前的 12:44 退出的游戏。\n\n\n示例 2:\n\n输入:startTime = \"20:00\", finishTime = \"06:00\"\n输出:40\n解释:你完成了从 20:00 到 00:00 的 16 个完整的对局,以及从 00:00 到 06:00 的 24 个完整的对局。\n16 + 24 = 40\n\n\n示例 3:\n\n输入:startTime = \"00:00\", finishTime = \"23:59\"\n输出:95\n解释:除最后一个小时你只完成了 3 个完整对局外,其余每个小时均完成了 4 场完整对局。\n\n\n \n\n提示:\n\nstartTime 和 finishTime 的格式为 HH:MM\n00 <= HH <= 23\n00 <= MM <= 59\nstartTime 和 finishTime 不相等\n```","content":"096221cf5b628be1e73e8bcfe626c734748e23900a3d41a84f0b774c2134766b2a9ce16c4f888f0d7d43b13eb80f2fa76b6e65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dbb5049b79b730c3e5a6bec05624820f74b997633b3e1271aec285a471c309213a5cf68d6eebb39276ed55ca1c1081ed344b313160ec2b9c279432e2c4f98f6d96ca476ea8a40823ae94a55c6017763326a1d17722707ef8856f1e5e11a8e6f97a21376fa82eea484ef62402588f71f4546ac876e291642880502570b40bcc6b4b2da38c0b76a3c0313b73919e6bb431cbae45983a6f1aaae4d7c993347039eceda443104a4a8d6a6f1f42dae602f483e9c7640c92f2d10ee15d5449e11feb129c6ea21adbf3af47a2d408af3462cbe8049a98a124a93f6010975146e2901a5ae4fbc5606dc83c4819ec4752bdd034464d08358e7771d84c0d8575e46f0d7c66183d101989428f83565e4ee282f6f376bfb379d954596325565bb09700a7ac3bfe181e575160d03e8df6df3d3321fde8cd32abeb150cc42c74ff083eb0f782415ee27ded29fbd14330274c068db8426f403fa129d4cf251fa2d7d059f7a6e0d2a96dfe00783828c642cb74332110a9c8ee3d946e70a83d774d65402706e65a6cd8d8ab8099518dc8646a73bc19ff1e7306d08f38eec8ff2c703d4bcebdece901efba18c15b9e3ee34f1134dece792c6558af6cd0228564f2b3fac4171292c1edd6fed866a89e5a0ee6d8de70cab2c8c496b79fc163480a91b3bfae0e196779530bd9a85d1ce6e8eef62784dde21e24df3f1d4730b7faf5aca210ace43dad759d3426f768d5b53a443c04b2fe401cd6c60cb4e688b7b3876bf8d23c31cbd4d1e6cafbf0db2c2ed2290dfc784f394d23a00971a3bf332970438d31dd6ad756212cd86ea54c974d84ef17b0d9ce7edf5e07ec195102ba98c8ee285c2e2ae5570b8b30e4fba0883cb10e95c25fec893fef540c4af92e88ae2768a47a8efc8f52487e329669059ee271f88ec713cdb37b96404b593ae596773167611cc54f8addbf7d667b6837937eb203dba425b5264d1ffa9036ff1eacac45629816eacc080a552f8f03ebfa7f15592cfbd4c534042afafa82c3739f2b8a49a76b8359ff913b41199b929a888cf2dd2977440147233d31092edbd9c03f34389eabd93db51224555d27adbf5b359be7029d6b81a3c4d86353335e61ac5c45d0e5cfb173d7c3a3f10165feac3c9470b933e62c27d875a99b21f90a30a5b548e28bbf5b337f8387bf8a417087716041646a4fb39cdc69a37c61f0857f24ff3470f3b364ea908202d37b69ba97d8faff0fca7b2cfd29ea5a45b9619af5552257ecfffba1f2fde9e2ca6c4ad194b58ea714960851ce53f4e6a8dd7fcff5ccf3c64e5fff992cc9907af38df56f1b71e4a96162e5fb112f9ce4feb44f27c434ea57b906b96b67c766e0c8d35d88bd28987bad57aefa2d2004b64d4be64017e5e0145186f61e076e3ef89abae1d398e65ce441746331cf8671ec3c6f65d2aa67d47662da9cdf49f5380b0f72a82a4e05e9088162c5cf13d396cd35cb7e16f18897d6260c865f2640d340544466c9a866ac9198a37a050333ff0617332548ecd5b8dc0cd19dc4174e538e47b97cace1fa9e771bb1274c880b5f521d1a1102d3cc3de09fd2a3ee99f36876b7240297da573626d6a095788eb8422493ff63bc4c727f02e0b36c8d6c7f9e515634f846e4efe3d953947e59c0c2f5487c089738becb80eee3d46d2ef9098748f0e2d8a89fa8e342a086bd58f37bd2dd102486c40255d49411c2f4f34e29b97710190e3b8853102595d2deccc1d6f7b1639a77658917f610026f2c9188e80c5f6421448eeafe676577f2afeb3b923ad4014a61bd83e795888b8c06d3cc4e67c30fb765c03ebb0278fc8a87bb908a5a56c6748eb9b4457195932d3f51767820facf6f549d595249e4f79ec7fafbc26e5699decbc8d92c28c565c017e74916c1f3631e6d0242939d3c43dc6d9068a24dcba2f67c796bffa27cf05e2b15aa607662228193098057afed7b444ea57c4d8017627174c129ec8e571cd94ea7679e343d72ba08d1022d5634114057600d3f4b3b7568f9ae6834a8994d0ac556adb0dc94464c526fcc6607d9cdc13cd0b258e783b8660d6df41eb263bd330b068e2f3f2ddc7d1fcdbf7fad6bcccf990be7426878c0be374a5c9623b7238a8d75267298594026761372201133e42494c4a576916f9f6cb31ba4e896dcbbc3c3675036bea803080a4dcedfd67509da8d8b00e48ea0971b8f1bb4a345e1db0f94cfd0a1c4735b6edb89ee81f6c70a3ce90e12a7f8dba1414dff03caa4a6fd633744f252dfbbe05c397252e230ab27fce18f07e031fe329a69998a0897b3ab7835699559e70d607601e44ebe091886da8950ad6bc6f1f6e1336c69f3ce393b961d08749861af0b319a91a3e7ff07bd5e37d043b02ce648459352055b48dd9f66dcc0a40d8dfc0a3856e2b953d69a12220ce022b2688ec3e9b87512bc4f8c550aebbc4d32a11194a9e33b5e0798063ee31d0d005ed6900c5115f894a22bbc0748018bb0a2516cebff6c6dea155010ac348464e378139f312292a35445b7a8c99760a244a3ddba7e3484f025e208bce32cc464ef932ec11fcfd90077e18bf20ce2903c8a2feb98a8e087808a9c6afb9c5f63b6b221a690095561db2efecafaa58e69b383feb2c7842dab7fc596ec32b1be0dc2b39c76707b9e6562d1e27ea5fbae67bacf542a7f99c0303024d5af9307bad5f76a66918847ebd926eb1abf915d4264c94e2210753f7dc141dbf94935fdc3a9f10ece7547dde0f0cbd5cace7140389ccf364861aea467a430ec35ac23f7b5a3a1521f7c97a85f4761b445cb2380189773a77af8918391bb387b23110ed400c61777be2223f6b8e9c148f11043fa33e1b6c655d89f1c6c0a104400abc3d77b7788f38d57c17830274a103bc3e1e19e98fa742b6c3f39f6a947db718cd221394004d2e07971726f5b66358ddf8ca022b62fda53c91771d3fd945932660a3117ab03ac21e25714ee6d599b00d081599f8345ee7be6d43fbdff4b9168906c6cd072cd8cc4927b5a55dc13fdda7241bb5eb11afc4820f572dd1ba88692e982c4cbb8b6d07dfada539dd5c3d9e47ade18f1e9d41fb3cb812948e71a3e741ddf3656d6685890b1cf32cf5a0aadf30d9d69929ab5f562ad2aa275544cc5b3084d02d548f5cc3f5b363d87ac40e7a79e8b8a68aa52663a3a3259c217c30e7578e69ab039565b64ef3557196c588017101c2af36a6025714a061d6c9e02f10159196bc944560a5c34d477e5e4d38d4da1ac26a8934545523e5c3d767bf866585deedf3b6c6eff6f55912692c3ec4b133b123d00bad76da5c12dbf2a02125ae7589ee16c1a771ad22472e0ffd1ef2405a18f31048519c9cf870549534403b2970df4c1336aac072788b63e8a669f9294c55e57b389a38b71d9575df86605661b4baf942bb163afe5073fe4f4aa86a0daec57c9e49f80c0f1754e6d178e528ddd5d118aa1bfc33eb65af7c0b4d14a89fc0f350d14f73409e1b58788c36835f34916bcc4a9ad9b5e7726979d5cfa480045bdb24f8522f49e751bfcddd588ee9ff8a1aac38960979fa3ddc59784bbc4a6e114dba968bd5e4550861a742372dff771c31455bb4b63076009e6112c0da9d4a9ea31380391f863ed1184b4390919d641eff99a3f8c64baee10edc1566e8ca0b944ffac2ad8cbc35460b7c63ce5e7fc9a2eab1bf3f36bb3b8870fb6d60d7501535e016e34239517e963c8b2f6bd22b622995beafea8d6e0501f15496e94aac0b9cdb659f804c8fe39abc7df5a738d103d1423551b5c72219265c0f6d4b0251fbcce315d96635012462f5e31d87ee0b88408de8870791a3175092c376ab18886aa59a1fda0ad4ed9eb7ed90c7e1310a27aca0aa69729821fe29253a8ff5b09b8e8604c1e54e576cc0159ac1b68b6dcd4f09a4e574eb15c81edd3ac023966975beaa5ce2eaf647b7313c4a53aebb25bdc89233e11aa1f54c1d6af509c4a5777a2774e4676ae5534c8ce9e8f3ac637ea20e71152253b2d25198a880e1a44d474cbc9c3d3b28ef7a744fbc1c175634ee2932966f6622db546eb79c1beda424ca6545ec3bf35b15d59a63d9cd853045eeccfea94122e277bc571bb298647ce6d6c22e3eae14b3094beb25001194952182f46a0acafcae433f6e9ec5eb4ff8ddbe9ec7b575f3d5b79c1bc1b529d0c80d72ab8e74d1c597fc853930b49e0d4d887d522d9ee282415767fa80068b0de2bdf94b47e7f5b9b03a523fe0f8536be5464e78a0580cc0d2521cc0da6510b843c30b8b8d7103be74f056a147d595f2e5fd4f38d029315ed666968ba64a5ad0e3802c1b021ebd3b00fd7b0cda193c0a0e8a2d85d242c7a3dc2983f019059c49f2b26bc7303aff5b5e1a2c1cb566cb7b47d0464bff5353c8bb0eb6aaea3f554c32c49538a68dfcc7b8b0d32829aaf96712c99b8b276bcb94b65460a2d0160c573d10ce87fd305d00ead0e62116a790f61e5ecd07dffbe1050a47f60534b5c1172bc544c9e2c64eefd0802d8c0f2ef8a96b6f4768c331aef67e6453b528a0d57297f6227d6d11ae599ad2b8c410dccdd1b496616ed0450c63941c73279a6cc179f1caa469b7500956ffe65899c355396d781ce5111a80f01c818abc14de6b814ce8891875dc682a187f7503d10e4e80cdd4c411e10a731a5258567c853ad03fd9627c3036f86b532839f6961ee0fad410df77fb2951c0adfde9f1ae4afe51ad7976568506c4dfe3801974af14ae926e1ca6f85b98e95d976d1767977289ffaf70863fbd2c12000da10926971624c4302ccca007845f0897719215a3affc076d0e1a534b5858c948fd477e3f369d17f42f1e473591b7b74110c694eca32661e37e7b1037ab14e16857280c3f8809436039dd34997d6086f5aad8fd7776e51c35a13c9892269943a447e592c2245324a7ec89931b2de2e5a93500085dbdf8592b56ab5986a123263d32c0212bc6ef1e588a602de128e180bc636bab876fbcbad3f87a99e4b33552ed63d103d0735214c15f4210afb7585466f400bade394915a04376634d47e6e509e960ff18230cdc4660bb221744a45205568033d0384e8835cb444d9204bcd26e4c57a82dad7dcbfc90f1cf5ccd58b11497f81bb8bb07226deca7e4fff1c0f1bca9319e63cf65a39c7cedc0ef2197b37fb0782842faf5a9ad43937a6a093eaf581fd402469a648ce8f9ac55e3c03a2ac4e718376eaff94f3c18f8aa8d78c7957453c55d3648bcc4fd76259cc83511644fe17c9d082ada70ec3dfc86d3d429705a32921b1064eabfaf36d8fe4f23dc47b49dfebab0a8cd51c5993821ce9d6214e17b3fbec2520253a2456dda3741a9f1e16ee4c27eabeab03ed24c555ee501583b4941020bc8d50b1e3ff22b83f4d057a9736ee8a90ae44a6434e35f36c5715a038302a09a3a969dc784619f1e8bec895a0fe765f617611ad0f82ac607f29449a7301066ecaf565953c81974f4957dae809bad88c16b135c40e633c437d4489c66482f6c8b78e160f4408bfb54b7db802109a8338a3f8f12e3bc8133b8da2f19d9268c9e128f6dc223db5d541c11bf73a9f45c6c0c076120e7b0f2c169261b7822761aa4b5522bc5526373dc65bfb9782caa5ba108cfa1d8931a592546132f59ca29d651852344ad054f18a9b09310f092a4255a4cb5e39d39e11a8c4eb582a71cb420a74e6f979f5f6d34e1b4af36cd6549615b9fe0e73dbe6fa9f093c87cd97bc930817ef9fe0cf588a735a56a3ef5f84ccb68a42ae593c04bede48457f2a17d0a4809035e85e94a127e0337c0562e89fecdf6543390a5675f9c973388730d4e917d3fb33a8db8ae807711251fa9de74d37041debc9a784b38b95b6db8f023179dee3e63b5f228fe8eb08988eb7bb561e003634bf45d010725eee8902156c99525e6f36ae82149f0ed0b64b83ab5bf356da74f8d1ec5769e751d85da5a54df98212e80893b98b58c0260d453f3633373823a11ae97cac57923e767b35db716ddd160d8b5b9b9fe16d685ab79ecae287a716af2cfad9a20687209825b922682f7fa0a99cc5cf38e6258ad7530ba48c3c05be53bf7b2a508fe4b2979267b0f71fe2e273c51a79e32eb9893ac7660bdb9d862c0f522594b0d36344fd71a5612beb2c2fa3dae3240563b6fd9ea722a9f0be0c5c8035410e0708b072388ca616a554c415dd05ba1ae9b59445cce0373e2c2f391431db69769f5a75e457a36df6cf68719f58f2bfe8298813e6509bbfd412d3857c94e7df92c01c274c65bdf5f3283e6e5c1dbf1bc597038a5dc4dcbdca13ba8980ba60dc560de8d2edf8cf9e6155f499c022af94fe4023af3dfa1ab593a0b84e8cfe8cc04a019bc1e9e1133d701bad630df6b400d82fec624adeb2d21bde03b303aef2c20047c9fb3951821502a42a97b8cacff2351f83f8805d0f0dce69bb8da5982cf0533a26b0a4edd84b9253fb50e51a073f10cd74632da59128856a8d749ba4573a63ebc6b4ff65610179c5f9c0c321f79ee94a9f363a58f755bf0277cb3701480283bb805023a20c4f34feb5fe3a0eceedf72cf62e317f568e936cd44f86f8776ae002baacd3d70de4109c8a61973948da5be98177aba2a7667185c596c62217620a83894a80a5d409d87205fd472149c80361c867e94bed3fd2897da40ea91c028c66bd0207cd0df56fff66242b7249118a2690b5693b25c6df56a96d6fdb0e0dc665db41639de2e529b040a49f3a5a69d95514d04d1dd4435751102372b35dcb45cd1122210ba59d6420e7b9e13c5d5e616a0be1672e0925038a4708e787b5ef74209c4f053ac014705d037593aaaf3f726a79a93ebe30eed18ffff6c9cdfbb6f99fdf5e2d70f7df326e98a864a14341aa181cd8461f2654ac5176a5df3eae9c2e1c6788c21cda9056d5b60c8ef168829861bfdc4c692d335416cd82ca6c00781b4073e1267861c0656fec6ab9cc9ed151369a0268bb783fbb574e6d5b002a01e2dd19a6a5f1b9dd7faae85a7ca7d20c4cd54f0aef23c229b9996c026ef68dda","title":"1904. 你完成的完整对局数","link":"https://leetcode-cn.com/problems/the-number-of-full-rounds-you-have-played/","question_id":2033,"issue_number":37},"35":{"day":35,"pres":["计数","枚举"],"tags":["枚举"],"whys":null,"difficulty":"- 中等","description":"```\n给你两个字符串 a 和 b ,二者均由小写字母组成。一步操作中,你可以将 a 或 b 中的 任一字符 改变为 任一小写字母 。\n\n操作的最终目标是满足下列三个条件 之一 :\n\na 中的 每个字母 在字母表中 严格小于 b 中的 每个字母 。\nb 中的 每个字母 在字母表中 严格小于 a 中的 每个字母 。\na 和 b 都 由 同一个 字母组成。\n返回达成目标所需的 最少 操作数。\n\n \n\n示例 1:\n\n输入:a = \"aba\", b = \"caa\"\n输出:2\n解释:满足每个条件的最佳方案分别是:\n1) 将 b 变为 \"ccc\",2 次操作,满足 a 中的每个字母都小于 b 中的每个字母;\n2) 将 a 变为 \"bbb\" 并将 b 变为 \"aaa\",3 次操作,满足 b 中的每个字母都小于 a 中的每个字母;\n3) 将 a 变为 \"aaa\" 并将 b 变为 \"aaa\",2 次操作,满足 a 和 b 由同一个字母组成。\n最佳的方案只需要 2 次操作(满足条件 1 或者条件 3)。\n示例 2:\n\n输入:a = \"dabadd\", b = \"cda\"\n输出:3\n解释:满足条件 1 的最佳方案是将 b 变为 \"eee\" 。\n \n\n提示:\n\n1 <= a.length, b.length <= 105\na 和 b 只由小写字母组成\n```","content":"096221cf5b628be1e73e8bcfe626c734748020930a3d43ae4e066f7323046f6a2db9e079758aa3327c548832950f2fa662a2e03f12d0f35741cc7ffe416f30d677f2ace36e048899632bd6b1998e073078e8788380a2039a31f426c0a9a0a3801632dd0663b99e233a7e0477abdfcfb833db4d273247e6cd33e4ba8a61e819b47341d1e0a98684a59a36a460ce05a03da096c26290edd7be5a27c1b02b6d7bdf93e7fac0e03544c2cfc7e83dc15d600132e088f9105520371db56cb4b1194c2824d34fbb0c5e890ef2d32e20f0233c33fd2398f392ebce9163ee6c0f620b1bce81c7b939f5a24a80fd1f13f5b1c984f3310a7cdc8fee46651945ce07464e24cfb453e1daa0da38bf2e234c778d631034c2b3e835b86d950dd9c08547bdebcd7f9467c3fccc4721a3188b3d6b2750287db6c82e3f9dfe72cf89542c9e6ed523956d0ebdc98e6c0f7ddbf36b999def02eed6a099cbcaa7bdd6d64ee839da5c61f583f7ef7482bc7bfd545a60075756ae963aa4af0ce81b1476566aef3fb0cbde0d09e50d29096d95a56c15a0737a75083cb5330af15ee849c703c38343330565078288841c5f58e439998e326bc4fabbc1aadcc0b8e042b54b486f6efa0e53eb27e54dbca1a816c73b77fa6063e9e1f77557d922d6b344c1c99f35d1d924235cda53d697743eff63c64ecad028703d4b08ccf58f72e3f665c3ec48a1545fc46ad6c46837656ba262e8108646db7589ca5b63869b90c9510eef1c8b020ee1e0f19d5ad153bbdd85db9d710943befff58eb91d4b5dbdd24b6dbce4a7f8ba4bcd5498256f0773faeba2ba66097940615d2c6945f756f54e1a9422fbc0494c9e2c1209eeb4007ac4ecf8d2da9fef1feab8793eabb8d9a4bedabfa60cb4d0082d392061824e3588cd29add586701343eabc6d8891e4932df45ba668988a14ae4ea2542201d72475dd530232c8565f3ba6dfa8e61390bb03b451726412f536d70f2e3fddfe66f2064c6b85801daf177fa24188f78e684b6b1f9857269fd77a3cd3c379b6872bc85915260f83ed6d513f7d43b647ec9aa228ce1e0d3d3292ce12bffd193df8d8b3fa863239e21069b98e1ddc24b84304536c90cc7546780f8db07812b20174b7007c5026e64cde0b92716bdf593919a39cb6265615e8d4c69f73433563674b45015356ebb299255ea3796f8600fd5b32373318c6e06dbf4e7faf48f42ca9f0f349512f44b029fa8d0e5cce866bd7c3b3348d8b7a5baa513ab960b21c42789561fe22855328f927cb6576579c724fe93c0f88565f41d2d89fe8c380ea988af232a1ed70953de3810838baa506998be849d2343d97ef82d9977de92271f742b3402d01af5f8d456a1fcf9eac8e98a5d1ad884a38a7b5d0de806a199e9f7432a2d8305ad7a595e88c9b64f33b6ffb470ed6f289e36e12682279e061f6ea1039aa225445cafd68fb66eeb1126ae723a9454d1c58fb573184995a885ab6c5ebd490b6707e2393b7edc829518dda1e07543efd90b9d4eb9bd579e655496008df824afdd01466b7c7578e1178bbfdf317891d655245e44b5d66812c0a4812497799a9b78620f3c50414430aa9da429776649c394f2efd0cfc36fe03445cffe0a63ade2b1b370a807e92e3f155b5a26e1764408e43b4b826a4af84e7f4f72c30d1061e043e65c0930874b060453ee2f989b03622816d52d2d8d1daf71127f523b9c12a22f0a67f02a221564484bc03c64c00f05ad7ba279b6b012a69814f3b875cac8c4c189e1d3982ff8ed6e4d67106f9098749fbea3a6acc390da8306a6e15b43e5f07a9e1e0e166e7aed29347fdc0522ba47b1a393cf322045977c181d7b6c4defcf6fe72dba06c837ccdd4eed0764768bd97faa6992a2a392c601e6b7b23618975a80b1f39ade9ac9ff7e6b176afe7e365d607b778e4d174dbfd47004302348a7c62c478a0b8be50b9d995a53f7694308451ce5e5e73caf98f4b82c6e54efb20f3e65cbdcea0821be5bb0e9f4355bee1406be034451053894497df15f7500bc609982e1ab8f3a3569556f14c39ca1bf1bde843d8906ae079f15beb5864a9636e8d28427b76d328d496572cde4fb5739c261a708a191891878b9e8a6ab8cb9e3f9f8ce3be463685a4015d1310a30890f5781283fac66ce3420adfe228b6b60035be9bf432312a8c2ce12989786c2ae6be9be864c2c1452bbbf0499a7209dd66c5b8dd91c11d3114826ac62fefc46c74248232d6807c345e213229e4218ec79b5b926dab6da102a5e58cddbdc5c3456d37968b002a0e89474703f9b413e7977fb883e1cd21ee72a6f23fe9bc4a95a86ac359929d39e8e3524a338d3c7e871354f8cb7677ced929835ba4a1e2a7bdd320c1497e807c58185a8b72a877a1ced25afb55ab08f50c8020e6caa6f6212f01e87f8f7570374ae501e9145ed9f2d92baf2ba7d3a5940bc0be4965e9b41a11075b995db00a358493a3e1ff06b25b2bdbac3589e96f42946c0c9fc197c561772ef705faa10fbdd91f03c41a5687ccdca9a978c7575b616fe8bf6ad02359cf117dc6f6459f6f4d66ffd6de00892e319f98d6dc609d024d14c5a06dd506d7c0a6848d85980dce9f344fa44d5d62e417ef8c537811a331279760e6f76b1068533e861c256c6fc59e534a469d3c2d34824b66c9a32fd72dcfc53476e786f22cf49d0eb727cd906c1a02829f9268dc929af7216dbc01564350f11e8c44d088b54914ade14200161446f678b7decf59cbb662bdb2cf3d71330fa4a1b6faf072510ea93e5a85a7d55f5b8dde9142a0983cbad3d9acf5c2d16d6e3774dba918341f375cb5a1d694a3eccc05bb5876f9fa637a7677b21beedd15283842122e40b6a4b14473edfdf3732bd177954edad41381dfb2fd2123031e12b02f7af221ff4ce00bee1abcd414e9b8d7cc161e7f29608316af4170c9512ebeecd5a42ffd7408f35d8e9dbd07f01e0f0dce4d7c69250d110959e9b99925975473665b4560c1b48284dda1787d270f7ca8820d8442e6a12f5138259fab7d111f7714341d1d0f14ff9e6fa501b15be7b769130d59116ac9d2fad467d28630025ceb624b9a2acf8a5d8e6fd238e03b2aad6107c24fe4904e51159b0b061644f5879b59d751db487db8418e18da4322d35219eb5e555f1f604a6a7c306bbe321079ab0e435332cf6dcc6a760e9f7fbcab1f15a74f77071ac3384aa81c11ddf4cff77df609eb7cfd6efe4270fcd9276a549e1e2f5798f00221a522ce3a4b3f58353d4205ed203a560367ed2bdd895e106d184ad807c0cfcbcca2a5334cb7e448f2da8746728d17d694ab61c1c20f4b63051da5249c349bdf3341c4449192b0f39d46420b540989fea764ec9a28184c98d28920eb76adf13ba0e254025c812a61d153989b90727a490a5b7281a3399ba453b94f540f129b75f6997962c69915a4d3265f7f2bbdad6429ce8877bb4b507782e8b2cccf4d17952c0a87f07e949b662e9e4efe15543e659bc0344d3e14b447b49968f8c2a5f5db4779a6768b0823c88540546f2b151262cf0c60254360505f066ed0161aedc1377a882595873eb75af1c0aaf1a61f56c9b87c73c67a57cd0264f2cb1177c90d4ca883ec9ada034746de803a8c626f1eb60e8632b6312cd9dc676e1335511f0065633e1dec7c3739033018401f49375bf85728a03afa8dfc25dfd895b75b53b673e69a2cfaabdb969a28d2acf05972492589b5ac5468d228b900728f84da76e0c515e120df38b99a6cf4823741ded38c2e9aa15ebac58b0942fdad11a69ed3c67b987c8cd0ea750f11c60142cacfa596f6a7e9cfe05d9552e600503b7ace21b632ca67702f2606b5a967c3e85c259cfbf5de20c84d90c655e8f4932b58c5633245566d72317c5ee17ab182c213ea81101a89e1593b657f27290e65c8178690ce70e7e833775065488c8aba06c7bf110cc3c98c85e1d6523bceb0604076489a35882cdecd0aea6bfef81bb5ac3c08fdb46b3e4b55ba2cdf691a9a61199585acf8f1306c3ed965e6b5cdc75f03fa43e379a8c10da85c747127cfa43cf6b247fe860d1713b43951d5ed43f52c4a7c48a366654545935430c8cebcb539de2be52bdad4fcbb3be2b3a1433491db22e63493fe83afafc6bebb1940461718462a7624edf066a9aa0c4af856ca98d9aef5e81262a9e72cd10062ee78b25bbdb4b0ac87aed834687e39cc387cfd468304b62275a62549f9f1113375d8aad6d5bf9fc0e6752a43463a9d723710940325000a5a49effa979db516a573e2e85bbc3f52d27b60aecdcf9916ee62f98e7c4f5f541cab370fb5c7dbc9ae78cce45d56fe4d7628edb0029255e810b546b16828d5ad7ccd5f9faa7c00769102ed0a21efa385bb8cd4103bd689aaf9db264f3d405b80af9a6ed51aab2e6b3fe54fced42a5b73f7fe5edc8bc42ca6e9deccd1f3ca97b5992f35752c0aa7ea3250ee65b5f23167c6537ff1dc19766903421951dfe57540058886a9d51d4a31ade6a8b53fcaafa6d433ad8be63dc221550000652c1da305653a9b3343c46647382732557ab629803e8e05bf6bb84cd5e2d1b0afa08d6e3310a0611c5043b46e7707c5a6cb91469c0ddc6a64581fd79223067e0132969cf7758cb2fa3aae1f82b2935b662f653cf3f222478e161966c646f6fa1f6adcd886b62afdf900d7aa538cef626583dc5836db15bdac36aa56f58396b09c645c722dc5d95fc6ab5c4991bf4eec7c9d5b65112677ec8fa14f789ebacd0a7afd00f58fbfc23bf0c501d125870fa803d7e67e974b20c8a674af822d65f46cc9012cad05ebc1544591f4b530a7e3a449c7d84369487c4bc81634c232b542a82fa58229caa59fd09c72841042056cd7b4a2716ba8978d660cda43806771367a0a06c7d062313ba285775f681473ac880299aca361e0988c83d4ab1886bc72db231ad2e47e59542930190b7b01cf4f35582afaa0643be1465fcb268cc3ea9a86644ae9d6419cd03a3616efdb93303a5ba85a13c9892269943a447e5a2b7c453e07379b992eb2c06156d5161a8c87bccbdbe622c1d127573c3083600a08e76cf6e7cce666d653c04b07c67affb27e87c2bd1e87e5db053b3727d679567e1b286f1250b04e6b8b3cab0b625e48a7fedacf1f405804449d462a609ed20ffa9f30dcee2044e0213d4a0c6e1c7c426344dde0c11db44ad22940f23ccec57a82dad7dcbfc90f1ca1cc9bc6017e7f90aea1b07226deca7e4fff1f0c008cd908ba72ea082bc489851bbb066b3fc70e98ae2faf5a9ad43937a6a0c0a7f59cfd533417a643d38fd98a0b7212abb77710eb2c97c994a08c8f96b5d7986c4d6f3c139c368b864f9e2c599ec24c1c01eb5ed4df82ada70ec3dfc86d3d07db4ce52935a40606aba2a36dd0b6a765802431a089d040f1ff1c5993821ce9856c4e0ab3eb876b732527241b94ed7c5bd14d49a61825ddbeba29ed24c555ee165ad1fd9b1079f2911ff0e8f567ac2e501072ab3ff4a090ae44a6434e35f36c1258a071302723b38369dc784619f1adf281d3a0ef25102f6b5be80bccb0322d7719f57b480a6ed8e36c8f1681974f0c1adaf509abcda616b135c40e373c48250883cf31dfb28df9ec7431437589b55f68a228109a8338a3f8f168749a1371c8a6bf80c03a978c6dfe952b279fd5418457be7c9f51d3c0dc6b124b360f64168f6cadeb6834e41f1070c3345d7d40ec1eb6979fcab1af3a8cfa1d8970ebc1542f66b8c8ecc66c560b385c945dd08ac8441b0f092a4207e19f0b2ec99e4de6d289720a319d1220552014851b6d5f8a82f536c359d94b90386eb5a8685a2402f0ad1767423f24dabf555a5142b43fe39ce03a2bc11b594378df7b94ffe95d43e5c3b7b2925a6c3ab71fb60adafa62ae6839460881fa95cb2d421f201e763c855f76fd168b73d016970de3a1a267cbdba4997edc944150b3cb2e8ab0e6c895f0e9cdef5838d075764bf4ee9841488eab0f47457ec6dbe18fca52d31e9efcce54cf641db511deb3c1b26bd43f1b8652cb31a828de470f4783f8d7e15558fe51c066a8bf55faa017eb1f830339b452cefdd3b596fac8d0a268e5608d799962cc52160cd66d70d05657c437989ee123013fb39b87f196c814b762b6dee337d53f823da5396f7a1badfdd988db31e17182971da04b47abee75c04e96bff06c625e73b44d1447a4771fa20ea0bf3cbe4519f477a29a515860ed9fd38aef7576f0826ef9638adb963967b4c1ff3b5a2fedf894ac25e4dcb51c1f973e1d45294c952737cae31be901871fd940f515a33544a5413cdab1e3f6af8ac350a0820c93ab28ad0a814159a1c60b9e46292e815b944e25c488b44ffccb3aa8839ea082d8a366e26470f00a306d702cbc33e5970cab5fefc7bcc527552c0873c35493ab4d5326270b4395d3156f40f457123f85b228e77d9b31165e18903b4b4b7ce1c70874267dbffbfcd82bafa32c2fff52c81cf1f7653314fd139635c5064304bcee0f4caf983581c80771ed9eb493f495985a58827a070dc866b88abb9a31eb553a185c1f791dcf289475e72389b2fad335eef4eb6077e941a349f2527e969ce12d7c1331c5ef011580bc94a06eb3dbe9831d8ef2df74d26be4fc0584d3d4a8e1efd40070b8034073b7e1b66f4cc0aeb862f9aafb9545d4c57508c21328f1ca68dd513e2c388c31bf9a8a5f5044579d3ddde42d87f8e1511a1d714021a38285e61514331f2317a97ab7817a82afdf0c9ade0dc866c939e81766ee2bd32188eb73e642ae8b619b1bf348a38bbcb1e9bb4f8c2b73c0b8e06c5f9303edef34f0860ae314c1e31b163dae60b96b089a9cf16cd78214a2a06384d6ddd9a9fa76d95f866db3080bcd00cb32156f3f06b05d5a5b6a20f1661e1c2427a04638c984a3cf7e2c9f4f0f2cc2046f5314609dadb1314a567a8a0abf05f2d086f6fadbfcfca2f191d36e2e7ae7df2a54988d70a05958a5023ad275242c5193bfee1119820759aa9bae2f6dd9610e9e52738c405de42b7ae91524cb8ec1b0e9e6051f58b286c4f4e8f824a3cfa957eaa070c670472617e49e5faaff31b5d236a3ec4c6c01123e91d605a0fdbbb4d27bfaac1a51c491021a9c1f05be688d66f6cc62483eb1c5be083c93fdd0b3d4b94208b5504bdcce61aa8a16dd48a0df06bb65d323ae1c113898a4cf49f8858cef93dbb01a93c6a2a27390cfb5905b98f92c377faf99e5505838edce867338691ebfd8130c3328bf04c2a197c76a266f2f7188c965813908c56f823ebfd967eb899f64fac48399a7f83c00b0af7ca91e6b6f4c18be2a1b851112f78c8381059395956002ee3406f58ea8f26e8386ad5d7969640c1d7603d76f7e2b58541205647016c9ebe6bfe42ffc4918ea720a0ac4f3b99a70540e95966f8d5fe3e223e68859697f88155224c95ee31fac02767aa840db584b7ed6c1575a7de4e6f9886aa36d2faf6f50e87799501b60d29b4415f1a1e990e936a7c0a0f782d8dbf527614ba94204a33c157a636ed99e080ddce8a09da7e1cc300d6718a9189e6b769bc152b08e078ba83797288176b7aa804bb83eb46ca7cd9646122d58232f2e36631a30c83b29c8cc6c3312aed200ee8867c7b3b8327f862fed20ba04790604887a52ede69b5287161443144acca33ff477fffc037dc04d1d3ae089caae3e13cf582e22fb861da049b01c28538176b96d08dc9d74db423f0b337379c2c4c61e30eb68745ebedaf36df2a2226126974954062c4ca87281b0efecf0ce2ac626c7adc19fe737817ed3f59202ce424b0516cc3d35cb81a98d02fc7446f47fc496c97f3f389f9db9f5a18510104e0168709b846fc1fabc32d028e32147ab5edde24ba40e2883a194b71d6341ec690e976bb0f86674bcad67b097a84c2c9094cd875e45b7a7a5fde6797fc45a212fbcaeeefc1e7fbcb286d9c98f0b7629c4cbdede370f561a8d2fc058910609ea47c77aa518909c4b4999c09ceadb276254a078c621625599e653a5bcf5c66997f76d0b1bc6de5b2b6802f485c53e2a500ae9d4b8dcb20f08f251c53a35aa070c3a9d251c8a73b32a9f756c2bf7735f2a481d9f0aaa21dca71bd87e9fd0d440ae7781ddce0973595bc31fa1ece197402142a302be573526acb682464713383d7c98612b707e263ea6e874cf6f4ce8fc3f92c7db6475fcdc34a64b7343c806ee458f61d479a71a0f910c34211d9a486bc7bc35b9943b8b8823eaa2ceaaffa4078c146de66ebe","title":"1737. 满足三条件之一需改变的最少字符数","link":"https://leetcode-cn.com/problems/change-minimum-characters-to-satisfy-one-of-three-conditions/","question_id":1859,"issue_number":38},"36":{"day":36,"pres":["数组","排序"],"tags":["排序"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个整数数组 nums,请你将该数组升序排列。\n\n \n\n示例 1:\n\n输入:nums = [5,2,3,1]\n输出:[1,2,3,5]\n示例 2:\n\n输入:nums = [5,1,1,2,0,0]\n输出:[0,0,1,1,2,5]\n \n\n提示:\n\n1 <= nums.length <= 50000\n-50000 <= nums[i] <= 50000\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347c86218a04fb2b870a545626520c013734310ec8ab1a6ec9ebd627f465eaac46b8280bc2d829199fbe23f761a0f8f223fc3b6776d4c7cee11d6ec3abc49c4f6d36fd32ecfee24fdebd7bdd491c6d2a62b6aa10d90bdf9b2e295b80a45355157dfa0ea4ade3807535aa61475bf51cca27adb7606db39cc4a514fe41fb07cb69ef6e165f8b1e6f0630bdf24326cce7983c1f291c4900d48e4052074b9f22f53a46a34489d22559210c378ee3684b19a17b03a4179e4d099170240ca6fe47f9b0ce2cb718ffc0e71a5ee526b0bc68302dc587d10a885c75fb3436beff1ae6e2db911664f17986fd5188a829961c332801a2ec710f49600cfe11839cc4c758f78cf74c133ca428d5104a83e8c525b7825184efb1675ac0142d768c14f6c4fe7a0e6607267030e8b44192ca4e9672f05de626c8ca6b06c3fb9aaa5a258c084540db556f70046c1c383adb00fe5a03e09ace45472406fe6b63f43cf481e6af85fd3040aa2943f4279da5dd9dff7c3e81cddc3830e62a05057ab949fb99642e59e50b3ebadd9f51988967b8b346e869f49ee806b88b43574edd0aac138d116ec7efb9eb45634b7da44fed017f21c558c7cba2bfac12b4ce02a001a8d8fb5f4820035e767ff222d8866e2d4b3035d1c9271b7bd844d65233249af32089b5dc63190227a8a9bfaf09bdd2128bc121e943fbc854e6c65e0e89ce0ca9695de75293dad578f4a806ceedc6376dd9988643c99ce6b9c0665f5e7d97a7a8cd516ee4233a79237f7e5637001c6182c6d71e7c020daa513826431cb6a1f3cbee4f613a792ce74d2349a51ff60c49904796ff35acfaa86853c0defb03b6d6af96cae8932aa7de5b99a8b4efa999ccb19e1073ad3a496410182a044f869472a99cf55a6726f81d07acbf7c7c70df81ad6a9f429ad81bb9cdc14bf15218c111430eb7baeae1346a2f1ec65d2baf31eafba2be33bf1884c06ac38b0de7591958fc32954d5565fd22ba8cda4d34393fe30837e19f6e768cf31bc2bc719655545a13ca11a0d0e6a7d04d9ee587a6eda1347c5d19f1b039cfa924be2f6d1af8b40dfd38bd69b9b91fe40370cfc9d38f3029c32cc2be8fa77511a404769739747021e955e704bf6cac24fd34389e9ea4145627c6d4c58379522e6d775f49075856f5a39803786a9bc68433f95b06243304dce34f91436dbf49f32aa2f4c5a5fba98dd214940bee9bb18d10b3f929f33362fdb1389960993fd63f2dfa6fa68129fb2026a68770ebabba5b39548d8bbe8b4a4f4ed6ff9cdbef8ad1ae88f315accb4752f84e833e07b8850d988af04bd90b3786f46e9ea50d8e260ba063c01c3b8e2ac7e9197f52b0bec7c5aee109e1e3754afb95ba9fab17a038d6b34d96b88c8113fc8095f8843d539b0490cf8e6ef0abfb6c386aeb825061f1c4121cb1e6cd924d04e5f246eb678a28af3ae5397c7402cb1469b0ff07b11de5f3485204f3064aa91702bab82039f5e07f576b5d650b6c1293c1f61cbe77293e2aabd9479874651f938409bd74c2da94c34bcb2a090f4aaa1a6b00f1256dfd908e2ab1ece9b84a8dfc7e547066f7e10ade793ff6270b51f2535fba387d63aa3a5513b7236f773cdc957d163f970abdc5e875256ac118883ef1c4a0fb6144f60517db3f3208027dab54a9df778c94b43c04041596ed5fc18a6d4054223ad5a58c789a954b168df37c954c737701fa8d60be447fb26c90cf13cd373a6f3580d9549e121524e11998193a91db8ef3c8d3500c159b168cade48bee5e7d64ac5d3a7ba070cc8c8b1c75e6c5690bf1f07cf7bd6f8de46e9fc7ac861eb2b191ec5f47050d47071e742ebd122eb8489f075e3201f6c8c1640f4b7214aba4a545150ec0ff9b2be267c2793673f9dad3393a4f5902c9ca6488880af814cc50f32119a8bad1c78cc010709921b4d1c75ac59ead2cd2c130b8449c47ac80190077fe33abb7b24c7dce6b6099d4e4c2fa0cbf0b8a55ea0ac5d53e35c39fab88c64e378941bf6598282b8a2f2c1180f78e5d955635fba8cb24dab1d179d9975ae253c8b451e4a3d9730be120887666fa2bc49e543cc74d95781a69161f21c9d95d368b9fa0863c7a58a5f5eee1cc2f3d1a4190f11132a10891ec9b85023f7e2584765881da9659f6355ac7a1bb6e0a6fd01ab1559e303b2e83133ee251c3c07229bbf0639a7911d040d1bbc088c136191abc44c426edc459732595181426106d49704d318d7fac8dd867fc16932efa2bccb1b7b5e8ffaa24635ec9a2527632f7195846ad8c43808a13e4af9f9728b1149baf40e9d6e6f0f05ca3e17c5563e386f39bfacb1e3ce90f1098e91337fa92439c0efa8ba5ec939270e60e238c253d15dc8b4a967ba6d7df65dd5ead02f00493cd7887edf5437137a911a51c2e0517bb189a6643b1add74dd529c29a89d4d7a4f6601298bf507a1a11c7697503179293a3dffe28bf5b2ffd295f99aa057fe80a00e99f88ac9c3057e95bb9ba6a1b0abda3a2821ec4f1bd27f933f12c064425a193299a1ee4c22240c4cf7a9c486b69c4fad21f87e866b2dbadd934df112776cccdcd152c395b284037e91f4887a34513b628d0d82250cc4d950919ff5b0bf939e97f877e6e016cbd40664907a299363578deacd3fa74cd67fe8322f827cce83976e68df219fd55c222ad7e34217bc6ddbff01bf0f5c4d76230bc7330503a4b7ffb47662f151266a5843b1b474b759f30bc90886bbde36bcbdedb412c2e9e0319fe0041a4fdbe7cbad740386292d4315acd5fca3db7b8e3edaeeed2d1524b3a52d561fc951d2a5eb699d195bfcbcd1086584cc4f264777c44a81bd7d7150a1a40270d41bfadb36c5feec5d4732bd1768d78dad4138dd1a9fe332502161dbc2e4bf810c04cdf22eb35b13aa68de7cc81531a18765ecc4cb7191dd0057dad9cad9c6dbd605d916eedc38d56bb05bba853250958abaa815f26c8e1d008f617690fd61913f1e3feac94e069284b293bd6acc28c4ac8a02b49393b8da860271f52283b29290e2cf951b04602be43f7a0d2ea9759045c0e3f2546932205eefcf89d52a99f24e864efed36d67baf3042f369708a55a1f473057e924b5e21079b9fd80ada3a86772df35fe878fa237ecb2e74d30620564312701d0d3a08f02577f41b0f6d5b30ea6acc6c580e8250633399936b8ee1ebde48d7a682dab96c30547bb850a72d07c610a27a287039ee0c43ff763538c1d840748e50ad232e8bebf09ad8c045b0ffbddff042ed1e60b23a15587fcc0d9a8aca8dfebe7b04cfa511ffcbfa4e3ad94386c7b13ace8f0112194c5eab72d564948770579517c09c9ba31ed7e5e4d38d4e64c124e2f57f3726023789ea5117f4d352c6e13b6963f377427db0fe99d2077a3e4a5408db825edfba3be47220460acb00f5ef21444350b639159ed0ba831b6bd0a64e67987da2c3f8716d28123ac2d331a3a83527f23246f68a59c049d3c78baa076c3488a78270df545df9490a461f47aab02a994aacc01a3efff5a7aab9d1c26d0ca5bac8a9f3e0a2c0a64b0d8796221ad40b0d0ba1d327f79fc6ede86765a2fc6b1d8c5717a602398bce7a36fc4510b3e9471cd8144846de803a977e6f1886e116947084bc1e47c3abbb9397f1fff3fbf0d406baf2c3e4b1c3a9d3989e8871dfed089c3c3573e3506c95e71205f9277d068f2f360c1c6ac5417d22e98c9baa70186beecc1db415c5dd094042d62a665b9a32bd669fd212c8e9586eac6f75a16f4bcf1c95cb160882a664c08073c543867fadf804eda2d7708c8b6d6260125b6f373877c5029a34eed9bb904fee161859d5ceaaced6563421aac6216dbf9ba7f7438249d59960a5a9894222fe036c5c0234466c1b7b8f30a8d9991fa7c90c76e0cc366351334a3d6939d052eea0a30ae4857070003a7225281a615f39d4f148c996aee2f46c38fe846147754ba026881de1cf1fe961e4f61ab18f3d26d5b54e00466fb42fc96719935d10bcb9a7fcfd3d6b04d779eab8d5c8553fca4fee43abc50ba36142722adda733fab154d88a362310ac1a50ecc242e819425a564cc1df830c8b006ff3afdf985cb436a55fed4d29179fe091af410f9e398c7b3dbac2818f8bc68f9f1b544119285a2b723aeccd5bab931fa55ad9cf8deb43448a5662e1b138815c5b8d3db6e2500a70235b5647b69ff8cc6bb6c83ccf39f231d4bd2bb2e2287fa6d6e9746f52523b5f0523c7a5ca94f150a3c48b17b6adddef97806d3d263936cf42518de19d04afd6068ae740275b5aed51b32447f0d6d9beea22f7cacd92b8c9b44a979a1057f06a1d79bcf19e3ad45cac73d547a151e5af7359cc493d81cbbc5feb799dfe60065c345f5c9ef30b8092c5d3244e074147b7aebc4fd533a0274215219f3744e1adaf5876c128410ce457692637522434187154a1e3e6acc44c20fa9363be4a3adea05c98c931519facf2453e0737b2db371d2ef6f891a7466560cfcbcfe412b93d03118c0d8acd10cc1c76ed90cce9708f4f3932f4695b8300475f471e2b9454ba72d5089116875ba04712113a242d2796e3901fe8f184833ba2829b125042199c19f02ff1e28a96084fb1eb9e80b410586ad34a4e30b431eb0e6566d7bfd0e1e23672c3b941f5fae207c9353ba740a58fd7baef3a70c93070c62776a7fc0053a8d2eb15b0acf004e4301939345d86d4b5ddbdab3e0025d4f4256d8764c448f6c1d69cd32536118ad04b3325c5ea23c44e7611179b271cdc78e92c947b997f2fde358c9a6c61bc5716be91de0f84024d73b46806d4e4bbde7dbe262511d94239a4e28696d62bcd65a7a46ac92ea604499d0a31777954af39195544318bc7f00922f8c3a74c4c9a038c7b093932006589da004b41e3d73612684f3df9c540dcfe9b53e8d69693cb8750fdf920ff791d8fb121171b203a444178439449480e1dfabb4111b7070dcb75c391ffb5873616b09a19d29e0e7155b092903b745b8406749a802232be3a443d532a7d1177443180d728a08e3b13bc565ec4c49edecbf632d1d12d572e3088605a4fba2aa2abcda738d709a4180b8579f4af22e699f84687b49e304e4e04d6741072067d29055aac625ef03b83466f114de8e5c1d6091b27257081757719e5c71fea8f20dce56645e76c094a4e3d1c3f18070398ae9f43b45088650ed875ce8c3482999889f19d5c15f597acc611547fc7e6e8fc3726d689311ab10d1029c5ee05fe35ea01408acec013f20a39688209d2d17ce752d3d43437b3b0d0b7e595e6793443a64893a59ac5031646eeb74d25c534a4e3c6e5df94bce8ccb22c0d2f167f16fb0005ef68a4f77e4698f48b7fadf7ef6c3624c9437e0ed9b2c177ed2ab58fa46c13fde8cd2ec1b0a27ffe4b239fabe159a6934917d0d655a6cb6c1d5df2bbce6b75686928569caf7458961e1e8c4c2cb4f1f47ab9249110a300159efd9c457defea0cccbd9822a471095d33c677938a8dae0af30e1d4eb1110972a0257e6f6ef0d22ba1785b19a5e8bfd1c88ab249753b3e5fab16cbff2e6c711bfc2344546684a028c63081c41b4d488ef909ee83e21fb16eee0e637505380093d425c3b2c8b58e160f474caab50d2df67d42d49812a3f8b261759b473b98a6a7cfc612978f6daedc3f3de68100d603be779f59db85922f1246365c6457d625a4a8397fb44b442ba77f26377e8950e5c39f9af8f975d8fa00897ff0df074936bcd7ed9a44561c7104bd4fd08ac8085e5b09634248a4980a3dd5ca178281a3146525dd180a62e6f97a9bedf94e1b1dbb259a58d01db4fe0f73dbbde99f174287c68abcd6545ea9daf6d73cdf3e092dea925f989ea39741b3433549b68d4b4e592a1f95f0d7d57cf74f9da069ba712f6f3dbfb5d89f754a456f08763c07d3f321b8117391161ad36e6d73e211463816f35b0bf1feb3892e4d0a11596800241315d3d871b1a2fb32110199c22c810247002fda91a6eba31d804a96bdc21e80600657905674457584449946ed520ecb4164cc0295d2416836049dc037c03198382bf57524bb0693058cc65cc4370f1e6b6c71287166bc55a67da71ecb75526156a53632953244ce54b78ae56b6a58f38089f482a012a95898d0e30acf3e8443ec7c210063e8a98cdad174fc3f9a931186517d84f21c9401cbc6ae7e751266f71f213cf6760aa902bddd60eb580ef237edd94f5067f6869aa9ef2e5cf08226bc2f99dfc42c29a2c3e07b1f7cb5b195b73bb9b1b60c1f842f074d4545ae2e2ce0e31bbb44d309c90ee85bb5375bf22e2295d2ecf8bcae8a1cf6cc9e7f70e55eb6816b54a102961e8091a244a8538b4ed3c1eb52beb932f1e38ce3ddf4cbd038e3ec98763a190916d664c4e679952ebafcf9b511ece394cce959936fd097a6ce84c05c1390a69a619cd9b5664ae624ab508bf1db9f3dd7d8feb96e5ec1c7b8b53e733406de34229de917ac42c70a3bfed29527ae50836dc3c783796099890017f11a4ec003dbe1dab0ac3c581b1857f692c4b46cccf381f068f70e5205fe5f79d550935cf44bea031e321adb794724afa20e6bdb0bbf15fd370428bcdbcc807a0d8e8eaa9699a015c28ea0c056fdbd8d209129b1f514c18587fe84bd934535f3503d7bffb5e23f1fdaa1b736ae38657400d2cf268a15ccaa2420e714f1b7c2df46f0451669889aadbc06ca4f2598","title":"912. 排序数组","link":"https://leetcode-cn.com/problems/sort-an-array/","question_id":948,"issue_number":39},"37":{"day":37,"pres":["二分法"],"tags":["二分"],"whys":null,"difficulty":"- 简单","description":"```\n实现 int sqrt(int x) 函数。\n\n计算并返回 x 的平方根,其中 x 是非负整数。\n\n由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。\n\n示例 1:\n\n输入: 4\n输出: 2\n示例 2:\n\n输入: 8\n输出: 2\n说明: 8 的平方根是 2.82842...,\n 由于返回类型是整数,小数部分将被舍去\n```","content":"096221cf5b628be1e73e8bcfe626c734738e3d845c3d428f6b0b6073212a5f6a10a12dc8c9066ecde89f32f426e3ac57af2400c3906714dff32ff523fffaef2ef2326f68889bd2e21b37dacfe3de1e3fb201b80f74488b6ed23ed11f8dc9fdc319a433e9e44a41a8d5fd80854e551251fb3ea2aeea91763e95686e67fb27c824afba4450780c2f4f1dde44f63bda6ed24c1a6dae12792b3e97db4205e7e786111e2b134829cb8e59670b778208165a7e41e9cd9f18317a169d57a35d379b3a762d90f811cbc50d0ceafe2c20d9ce9ab8397f905f1643ad09e5ed2d0f642d29cf81ed5bb35d6730a99a6e2f850b4c4256880673d38eda65642d4ec03066a7ae2d308b6bd9a3e139a213e798851dfbceaa0c4b24e176fc3ada145bc525b08b78ae5701c960e6cdafe647884d141ac6247999c90d21582bc5cfbf76e9c1498a50a3134abc9c1204514389af53d10d18c78ed7eaddc1b2e08469d35bded5450a11f8e54079748c8979db5a55641b55569e972b98ac0acc1b37785849e83d9df0d43912e60e330b4ba3a67e1ea07751b2791cd8420697ebb712c78d2061cb32354e0fa480414a7f319531dae83719aad3d351c9a8caf6a55dde014b3c2cd268e14ce0a54ffdf9838a13b1f21432535a665234d554f146dfdab483976b5353f3842c9846bf091c9e4f53ae64c6d61672226a120a620a7ee5cf65e9c1942eeb75c959cac75d2eb9e417aaae22e61bcfe68be44763869e93e171ca67bc935116316a7254ee79797d52edab943f5660c1a6cee602602c6e0c56f503c8f0287c0f16a87c082d473ab6aff4c8cb6e601e502ef54f21629711da0249984996de11c67c469abc7072b8c4c9dbcbd3efa1ef1be1b6763f473b746dc6e0d4d90012d02738d69ad381884085b47c869c19ca166ecc5fc5d2d45e282cc84ea45e82428bf31681d7ce66f95218e811770a09d2d0bd60747762ee3272ac6599f1fdd70cd35096853fd5de65e81d476ca9558dc3555cf79b2a361cdd83fe911c84f60d0d87bd441df05b4fac5edfc392e60158cd52184a40af66ed9ca72ec61ae2bf7cfbce5af7cc64ad4d1611a6d328b1648a02d08a558d3c0085dfbde92a8c2e71d3cac5863d4ca16828a07a0f654fba7899769425f03a9c4f2d2e0f4dd0d7df13d3feb772562f6d77414a0a7f57e09198107a6a87cf8a1ed15810333235f0e357ac4d588546ea00a3c1dba6eca98ce8229a30d19496a516bfededac150f90a86cca73e561e54b5bfd10db9f448a1979e19f06b89bde01061be583cbd3451933e9b3d3f4b9f2e9fccbea76cfe82035ddc96f573bddda0feac2ed10822f79dec0e492a21f85231829b83a8983c75bcf8e46431de5abacb9b861323741d68373366e1d08dd3d839878af4f7e645a85277f0448c66e62ff96350654d6f0aad16e1b5de48d7962d9cb170192e6cd81423ed2f341cc64a8086bba6f32784201d93362b4f307a123e4cd67959a7907778b152f87b41837f5cf6b586f49a3a4c09cf3d79e4b9c09581f66dad52cea6a1560b3ca6995136ab9314f48f33c082744ab244c03d90c6ed8af8f0485e1d2bd489ffe7d754464c1e806f27332f50b0d4ac4786bef617c28739f86be79a4167463002c7f5171569819124ac8f2c25ecc13aa3a732126d9cc33bc8d1aad9b020142472b9ab33ea2c1cc0b7a7716f98261aafb431e08307fafadf53babcc120cfa817bd51044145fcbde39a6160fa606ecd67e940175092ede419653ccfaf05051ea2249dad7f660771a36129f749f0aa3d2a3ef7658648b753a628670c69b863077e4fb6008ecceb3673bab7b44ef7d6a611b7fceadd6a34338513f255c3c066ca96266a139f816396c009381c90258771a49aed4fc525277d7b1e73e8837e13e49728a8ee6b68bb4b20ef5c4882df966f7729d798c5c06e3e3f9b1f1c16f0b99432e6e11d50d5c4f85157681f8ce4b8d2e68fc0043ed3db78db8475fc3537899d4c1c3de13b40d885be110c4c22c35c691aabcdf4d16a8866ac915814e2eb22e1998f38a697be7774f210f7aecee8c74b4ef508bcda6d97091ffe13d6dda784e1f2dc765711f9e80799b03c356bb95b82fa61e8f978ab68c8636675b97ebe1f0c22009034a94f01d0aa2069ec497a82f3f733a87656487f1ab5adb065ae182b6621f6df536b376873219124af5df7e02f3a91932e0ad5debcfc957ae5303781504562768ff609f72dfad28794dff1b754e2906f2fc46358c7d8dbdd869c515af26fa2bffbf9fb9e1dfaf266072c69057b2ef038ccdb2650ada5909bb392be2ea05ed618cfe07ceb16ca8a266c99d6a2239cade9490bc49acf0871748faea7b75fcc4248d53a6b4c9a5bdd720d0597d9a67592c4a894cba7699f21cc8715ead02fe339bc36ba3eed5417312ac12b9272d231fbb33a0a9c30069572eb20c4576f7f326a8e36d1182a0524f2d12f458f3652bf8eb92b9a22eda0b047228d45521b2df45ccb0465a0a031b4c4eaa2f9efc3f125cde9fcf1e7784efc76cff66ae2b4ceba06fce05c148e5aa686285b36cc0275a0ab8c59b5092bd33ba9cd4c76a9f284615ff9267bdc98ff4e3dc8ee83f67868a54119309144eb45dd25d95040639eba43cbb46913410160b1acf4a0b0b12cae22c6e26c001795db5003bf2da4bed7b96d55230cce8b934bcef09e26fcafbf0d7c5c891f02fc8f7cfe26010beb683cc396b7dfd48722529266b8f85381e6f4d6b8b32bb96887a8dec62c9d3c2752c0ebe0139db85fb022b1bf87f4dd1efcd1610bb9fc94be0d228f84b22160a2014325d5ac45faa79341c167bb49dd77b0d1b50dc44d1b79ba945f993ab5e9e2712f7e5f5c4cfca867646398c9b62072da69d7db129ee5b21fb443d5d48ccd19286ee30c3a03b8c34934fcd63ee17fe3333231d45c2a591b1ca4c8a0387d878d4fb61296948eb7b87cd4bf5590a02df729f5746ce88cec5256f11ceb4053558d75094f5bfe1dff5750e44085c67cdede390fd6e238206970e65aafcf5ef1765d5e5d3df90f3939fe18c659e2cea54ff0fa2e5167244daa38b80d5b58b2386d162633e70d8c35c844a4ec525a96fbd2fa7866bc9b606866848de8d997084cf8dd0192e1c9156fd1dc8e57dde2ddf29a1e420a19973ca96ff96a8c8c6b8f2d75792b25381c8c3cbf750ce08f1f5c91fdee7cf6655fa0f6a170aa17704821c11ddf4cff77df60aebba43d476daf3fcf56ee9ee31d882dd5d7485e4289508b5b4500c606f0c05a46e6e180d7bbe6bf780505015736ede1489115b769a997a16ddae09a49bad053ecc448594d87a8d8a5b12064b1dfe0e9c349bdf63148608dbd1d1ba178acf8389fd1c365dab287db882ba919bd2cd51d26b589b665efd8e973eb5f04a8b322c59ceda818cfaba1e18f11a08c564bbc7d1dd5dd74077e4deec9915a4d32616317fbde1216fdcda35a02b503ecce8e08d810a1bd33106d5ab2fd5d5513a885dea054f14659bc0344d3e14b410a8d02fa0caaaffc85d31fe76bd2e10d6f1317e6f2b151262cf0c6025436053162a3a14c3de6c4cd4fb54df9ec66c39a71d520e1d25e5ab053ad9af60fc9e6e9fad4e6bd9f168c5d35a0d657b57dfedcd1b45e267c6f0a90a248632b6312cd9dc676e133551594f652a3355f12f7a2206734e1e3d003e41d25728a03afa8dfc25829dd9e41e53ff35bad76ea3a1d5908b7adee0f90c10326ff49fac5468d228b900728f84da3aa6838742d752e42c4ccd7a449ee1186f25e839049b1c5012d4836b47fc4a227303eb37bb3674c0750f11c60142ca9de0c2a3f5e681fe14cc4981491e333b8072ba329e6e5a6f3b6c9f83af634499aa05624570e744c1545efc2c3e5cb9b016e9a981d0b696a0cfcd27f5054a019a7025f09f647ebcc4c2b2a5b28abe049122112d8f0b61e6859586a1c0beee8a3a5d1135e95f6d5e69078be4541ca4d8d6c54ceb4dec3078d415f06a1d90783aac8f7c28cf898ef220ea6cc4de4e938b205963795de4cf884dd95b7005649aee2fc255c06d6e826bfcd6b78f2928ee3632e03d4eb297d779becc4b74855d9c8dc6ec66ebd283ca73d9ec68161968fc7aa12bc57e98e7a2293e1e0c869b1e13817bfb0f52461466463b67d1b69b95b6ddec85d76d61f82007828f1a904d387084ce35b8fa6c788f159be129f8134197dbbcbf82fec8582e3933c33c35f0089f56ba2576ea2d09efe50b543c9caadbd5efcab9e6682a0e0f749533794398032c09171728b4bfc8c8ab1deb36c9a5409b3f119d2e2efa889dbb5d952b848e714f1c1b1ba0371fb5f6b9e0fc2fc5ce1d16e34d0130c4f08777ec0bae3144975cc44202b99344c5c56e4e0cb9a823b8812b16dcc9809b6337890d15296643300300218cd205a515d865afa1f728d3491db1393ccdb021ebd3860ed491cfa18eeda9c38e1585b8f9ea9221","title":"69. x 的平方根","link":"https://leetcode-cn.com/problems/sqrtx","question_id":69,"issue_number":40},"38":{"day":38,"pres":["二分法"],"tags":["二分"],"whys":null,"difficulty":"- 简单","description":"```\n你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。\n\n假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。\n\n你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。\n\n示例:\n\n给定 n = 5,并且 version = 4 是第一个错误的版本。\n\n调用 isBadVersion(3) -> false\n调用 isBadVersion(5) -> true\n调用 isBadVersion(4) -> true\n\n所以,4 是第一个错误的版本。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f21931c3385f243423d7847585e26598c9d2a6cc1fd231c0b8153ef1365dd67ce65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dba7058c27ad68cce6a7e19b5c30dc006ebbf1446a7247fa4f14415d9751b4cfbcbe22aa14b6fccbf732f72792854455720d11561ffa67f406fc68df5b17558113482535a8c08478cfb8fd0463772b0567e4f32f5e4a2c87ac1960494df6d492253b7729be5aa87334bd1d75378a15bd530fba44a3db536bfb687821b174965f144f9de67f40ea9232500382dedbd950f0c530a98d6d1185e2c6e392066f34c6fca756274a6e9c6a661c42d5ff0dec9ee9c774cb3969144fce3e136d9a869360be09fe1ea7712a812e4d0bbe3366e6d4e62f2c67449c56142bf6c6cc2e0fb656e2ed009283f80655da8b689a10679079a4ab97e6d6e9739bb6ce01e7c0ad8bec2602509655c48e8e705c6ad783f0d4768bb97ada5b5a4b095f718c97018dac1dca1b02745b40f43eb0e6d22718e50d20096d95a66a16ad5053b05005db582397e8b712c78d2d58c4322e4903988e40427d32b939d4f11b1abafad95dc3a4d5fdaa4fd7007f202ac16b0cdc83e76999a19e1ac50270f846412f31767773fd2cccad8c98e1f865c19a46012d9f7cbd021c5dfdeb43fa9f8c3f194160a7cee2aa71d2d466f2d7478d6499b9599bbe7f44394acb33c25deb7391cfe995770dc0bbd99c626ab01d3a84b481b7e0f626dcf3b9c9afd6b142044186fec0877e7743392b1f8f31a58d17147d38ca0f31421d2adaf8f2a6b84225747b769b516b3b85609f3325f344f15aa0299da11218c4b52644cacecf143c2fec3ceeb95031abadf56d796b741cbab816ba83f2bcd0ccf549b9a5708c93f5434325e10882cd8b0b3676b866f632aa21c0d17cded7a80ff53e77d17e0b12fed2f8bc6f695063e836708f7a95f7c4d42efd5fb9bd3fccc264ef38445e97548beb535cc9cc08fc8f52485f11945a3090f86f30d4ee779ba528e747301ce90a1e8195ebbde7419a5c5e58be2ff7869def1124ce392eed1e0b51759193519623d61193f371c0780ecc80b98754bf652fc5984b6abc8652e5ff64bc757405e567d906b86aae33ec38248d9d99295815f2d4c6987369186c5c5f4f026c56f5a39a116067a3cf8600fa592f0e3322f9e248b04d4d9d48d21fa1e0c4a7db8680ed339539f69484a614a9ffee9d270f84956bf15de46bf7497ecc1feebe48ad0a79c4880c8398d30e0c16cab6c7de791933e9753a05164fb18ee8af3fe8bd5605bc43e7ba9fba9b389b9aec9760943f81e181d880b404bfa967f8b8462fc477c98d4553d8237f38527e2e072750c79b61fcc59edb5dbf490ed433aaf4f9af6ea8b5df8fb95a3490867cba801597b25f814a5e81fc542c591b87c371662041d9ef237bb44ab01bac66bc6fb0a1949602b265b8fc06bd1a201fb8f7d137b4977182fe6532b08134945a92eafa3148291c7695ca77e67a65a6e93c23ab1b8c9788444a8553ded616d9c583519c99c5bf2ba8cb00e00a6fd385862db93c71f335b89f34571b3acf855bd52943e34c4165a12058e0576d2a56bb83a35e49809fecdcaa475e7c5853bcad834d6e1df558d73792411933cd1aa51e46bc055d5817f5ab9016747484b9b43432e798ff875ba8f1791d283abc19c9a711cfac2b7db0a103b8162f6d67888c2fc14e23f17bf2b42a89652a386ba758ff0dcaac8c4c1b8221f715a3d4cc7dd55539fb2cbb4bd7e7fc807d3b18b43c7c66d12fd2d9e209e1e7d96408e3d771e286a9644ee64a59601648ceadd6a4403b9cb24d14297703a4111c8e48a70e52371dfbf5d865187070259ead954e173cd1fc8338e145cb7a1972f8eee2fcdeb2fa79e6afcc32880be117d952f00113a885d7c68eeb104ba7229ed9c776d493951ad6db36f200d0cd6d6c9f79458f4db7c7f24b17a36e23e0db8b90c35ee508ed30c05799f34371eedbc783970424e9db7eaa4da62b9f152c36a3f3b2767ad36187a79679c1d88776b7e543bc0bc9ef07e9c4a8545d812e517b78ea2bc9815426e34f935e9f391d7ebf3f16a69383b9ad8f0e645b80dfefc6e52f02084b82e7100a9d0b8fcc94800f3e7d3e85514780f2b659c9265fdaa154de4a03f973ec61d64e3770e43154a87aa98d5c69c2f706f15c4db67290ddda2d2e908cd2fe7e8170cfa3c6c99361c294c5fdbbe8cea3e960f9445b37ba189244fa3cf12e35634d6e2c48fad1f30e06c4f6eb0bdf8b85374b8e2755ff576e7703e864932468c60532c03423f37f73f39dfc5a4f52283305aafa13becb3c47d7b01d7dec13ca610e6d632601a00f86fe27aa9dabc14ea40499396e16c2719131ae36ac220a81466d6ff8b5a761d629b1baba8e72842fbbf51d694fed12ae6f5c315b976c31a7d4647cf495eca218946685c4705f76367da608b79772699a0621ccdf57ccae5b5a1203dcf5eaaa27a8fe3334b37e030082db407678a96ff76893c3ebaa3708b15fc3104eadf8036ad859e0e0ae7e5e1a98042ef507585c0fb942b8e2d05f0e6db70613582b43372198cb417cf0ca2ec59991229342dd79bc8939f5b93ca34607e8ec8cc5eb0a98898dea240ebe939228b696d87a84e03449bb65bc066ce0f81e2f56f31255e4798236701a3e50166c79e0607b0c73e2ed77ffde89b9f19d71bad0b3fadba02328f1a091cba67ff5494b22b5405c8f2a4410b6a7b6468bf5711611e6bee723f4d45b0048da9861495dff1b58d12b1f15253b5e4fd791a6ac39e0392ef28df8731d3f1f736b4fc15ecdad3674bba5fcb94d973805d5eff7d19cd78f05525fd9cf2b482af2e37dfd34ff1336a00a6b2e3b9d83c6d9f53cc3a33fc070941d8d76901efe3e2d23540b96f6f5e5ca01c3479a94739de73f69600bf560ffcd56f5490602cf7ed6496487dbac846119549cb004335a9a1d91b1aaf5848d6f2444085c67cdede390fd6e719f06970e68a6e7d7a3176ed5b7dadf9fa1b98dcb8c659e2cea54ba43f1a03c720d9ca3c6c991b5812986c32e60736186e24d9f604ec525a9329705a7866bc9e443803d0790c09c2fae9fa79c28045cd116d737a2a42b9f37f54aa7a42da29c2581b6afd1ea9892fbaa8e31d3e10081bb8c87a2048747bff58c478ae3cf7106e779620c1dc2384ae1535f89a680bb7dad20ebba43d46a8facb0f164ada7748c93b11426d6b04ad44cc3a3470b7c720c0da46e6e10023ced39f7c010103f59049f42819093ccfcb327568cff62f2da8746728d17d6dde561c18d0f46494b068f249c349bdf3341c413dadb9db659d683cecc934d3600a33a19ec82e2989b89e751d26b589b2f10a9c79c7fa9ed4a9a770652ced289defab71e54f81a168921fe9b98b95dc65b5de4deec9915a4d32616392bb5e4374bc98353fe53037783a6e8c0c84e5b94655dade2689d814c2e9e4efe15543e659bc0341f3e09b40aa9dd63e8d3fd908e092de324f4695882f86a54322b505e318a0c3b0f4360535f646e148e97285198be128b95823e6de0184f47516ba3ee171fcbb44afc9e6e9fad4e6bd9f135efd3134b6d361e9be7dd782bfc3fcfab830a248660f365798b926722081f51594f373e5e408f72772b685435760d2a1401921762f310acccae258c97d9e20f1af93db28727a1fed69a9b2fc9a7a22e59610db5dbda113a8161f64e7b8fdff076e3cad955b01ba02757d63014dfb3592225b3704acf59170ac392384ca7146d2742a737ed7326933c405f952b42cacfaf9696f5edd5e60fc652f00050677ec737e86f9e1a122a6600d6d1fc3744dbeb413f3935b517881b10d62c6c19e7ea6ea7a981dca58ba69ae761a04b0908f96241b0d76a5d96fce3b98f98cab201862956428a1320a8d684eec48cebbac33956456e91467f54714ed5fe30078ef2d68c02bf1ae92047c047ac2e1198783ae89b7c21accec6a629ea37eede07dddf20152f2109f58ec15bd95b703029ceeb68c002a5223c8a63ae9ff0c72a60ac7a3bad371aa78ad82ba59e7a5eaf5d9c8dc6ec66a29483c277c3ca294f6f61ae22e86cd97b99a7e9322c3457ac9b1e13817bfb0f52145d6848673fc3fb9f98f2c3e1c88f3242f86c079f8f5784097d37d79a2ec9d06c788f159be129f85f04d1caf0f1c7b3c85a2e3a6bdd6a56b4088356f76c6fc92d5beff856335fd8aad6d5ac94c7b33a640e4331d36762699803345e6e0f33ccbadcddd379e1714565f67782b358b4a83f203b20c925218ea45b421cddfe73aafd737d3d1f21b8670b879071fbe62f81b88b78814fad3fab1ef1c5763ab5be56c5e9654e0fab67b31464baac1e111e43dda766","title":"278. 第一个错误的版本","link":"https://leetcode-cn.com/problems/first-bad-version","question_id":278,"issue_number":41},"39":{"day":39,"pres":["二分法"],"tags":["二分"],"whys":null,"difficulty":"- 困难","description":"```\n给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。\n\n你需要返回给定数组中的重要翻转对的数量。\n\n示例 1:\n\n输入: [1,3,2,3,1]\n输出: 2\n示例 2:\n\n输入: [2,4,3,5,1]\n输出: 3\n注意:\n\n给定数组的长度不会超过50000。\n输入数组中的所有数字都在32位整数的表示范围内。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f279d173385f25055317d6b5949355fa48dc8c9066ecde89f32f426e3ac57af2400c3906714dff32ff523fffaef2ef2326f68889bd3f61f26d0b68cd04d7e3ef66eecfee24fdeb15ce047074a2b7dbfa53bd80bdfca6069b8e7852f091039a43ac1c1ddc3101df81f7d0e8c339e7a98d53e443853263341cd289b3f9837de2b7b69e24a4c4a74b0a53f33af99a15d7436741417a2d14e237842f892701d5c26abe6e1773a35609309e96460f4051358ba67f4546ac84cc89f55118e6608728235cc61522c909a0a7ebfc611377f8cbaadd92894fc7bef9d2147a7b0a0fff1416f71a4d5cd233d3b28a91c3f0f3ca8e05a87a4a29c5eaea9cdc3c5493e2f579a879f61ba10fd0dba9cba26ebf27dfa0c01afd246c1b9d44984421922e4294ca5c32a379cef7fcebd5de4c87b8957b81a569a9c1201becc1c68cb9a8de700c5f14f3e710cec8a7ad046ec39da99d1588ed0cd76a29e976bf99d3e1400249ace90296ab767140d4f5947f23d87cfd33a2e0bbfc08db535a44a2da16656b15405da6f1897ebb712e68d0b420da2d0bb22b8e3187615718267adf75d5c4b750ac12582c8b9f5419144abf2a221b1821b273fd52b6d66df4ff8a374872f69655f000bcf69a987d5c2d69613c95ba8a2eb56d599177019cd8d19f2cad005731f65c1add7e830dabb3fd59313a23cd09815fea3cfaa67798f63d5388a58f7bdd2e61b1eb8c0cee03b44cf743ed3c9bedcb8c26db2e9d99b8db2cd7d6d0996a2b2be351b64665029ef6ebbd86e1d1541ce6bb2c81c12e9fbc5a57eefb397f223c35a2157b4c358f2903cf75f6286ff3017a7bc92ef0801abe87c146005ef20feba67326d03634728b2e6af6d1193ae8d87a2dc968495291cb8006e19284e508d31dd7011dd932ce349a4529c902f4b1583c7cd47f35105e811560ab5adfbef13422c3ed4562fae32cdd5ac8613bf09aa11e7535db3963c21ddf70c84a23579ad53b2ff8976496813977b119ff1753ef7e079be962ade781b3f3680ed4586b02a18ad189f8fcc58f67f723171d5fe5af4fb6bbb4a1408abd3329c63b00e3c7699049492424410ea3bae2e77e4c8f4b9315ba7869a27bc775626e57ff905975741b45afe81e8e198473a218183ebda2a664a334d203b34010fd23777bcf3a03ba9e225b80b07b9df51d5a83cb73337aa22be2bddaae1e0435d81dc089a21e85c646f95560929219ec738df1dc138bb52b31469bf6dc5f22d9b522acce246bd4a1ed6e987157c1541d592c22421183a3b0a7b770267f02636ecc52dac07dcf0304cad0c4c128010ebf540100b187db90efab929a47a82d60caa0a00d0ab9b3a7c6552782d1c730488c16e70345052dc77ccd879ae7b737454992737171d4af3b17060fd0b5c977e1d2dfe8f9e7b6fa8eb175f96f83d630c4898a57d2df542a1d705da64c351e0b78301ddff284ad00792e6e37b520bd7064aae160d8eb51832f8ec755a7b6367137c9dc4fd9c54b601710a69ccdc2ce775144bb5ca6abb1358b0feca178826695147ec455b488028138ba0eb9b3feecba1489de37f617b6ae8c205cc5532f50b0a71e35c429d3a5d722c9ee0c540ca6f70235423f09ac5fc965fcfd87c277edc18af16f1f593fb6473f91b1d14ea9b0f3f40440da2b229a5ccea30bdc9fc6f6f901606afda8c9ef846406ec640798db23f28c1de1445176ffcdf3285183c9704f7c876b209793b3cdc61b453cccdf0735fea2b6ed7f3f1a7fabd3613be75931aacf69e2885fc64a56437538f70c69f841748e6e64409d4d87cc0a8aa4d63e341776d1960cf92f4ac5236502b3d5d0527638d4365aa20f635386c1eb883ec3a97efd9844e152be0d671cb9b098e25fc6cbf4a67be81e9986409f85aeaafce038b17fe16f85afb07071d7314497b01c6e52995772b499a3f4533ec5a3fd1e220fa48ab8e099ed30ab979512ed0a245bcb0083201495fbc7b91249207d6465bd6b6285b3d4015f9cc641383658564a04294eae33c2e04ffbf7cf24f390fbe353a1bea0220dc0dcd6071c155646dfb8806e2c8f7e832a3715cd3dc32cd079b1fe093d728afcb393f4c25044092c89d3f5a296f3da6fcafc40c149baa538f69321730c9f2d7a60fba8c400c0b9568b29c7a037ef48cab48b777ed11f5a3b64afdd72dac144ca0af6168a22785f519f7536f620745dddcd231f802a66502ece3e33896dc8ae1eda6b1dbe720f85a5137b914933d833688a4fd9bdf9ac1c37a7d36a6a0020c1e47d5e7e6a1835e455abbe5b3bf9614bb1ab79f4afceb09aeeb39c5fbd9b7f15a89e5befafe323fc5131081f41e2ad59870a9ce0e06231d345fec6cc7bbe06f077e6bda339a1effd3b407eb17fe328ca84d02dd062d45cfb6ac2d12b81d2d1b28bb189a83f51e6a4cedd40ed294a6d4bd46b07e6de48e251d2a6c9b6e840810b293a2c0fc009d590cf7ac35abe47c6e916c1393fab1c07c542fc100f899127539ddcc9c381ecfefbc33c1f726c68eb8aaa190219834fdcc225ac7e352906179ae300b5757988233afacd4c7709e3b7c15f6a3a40a84d6ffb18499b15054e6f74a73eb0c5711b836428206f18945ffb92ea381ef097e6c0766aa7689e76ccc95506b6e9d033336a14168d0932ed822cfd23079fbaff13fd290378525ed9ba9d3b54561f932ccf5fbe563189f732c44fdb5dbfa707a2f14346a938b3b08754749913086ba8469b1ec74dcd2c263e9fa0f0010f38fc80b2830c47d53e0efcf2c1bbcb6cb6ff9d125f18ecccc751041b092f32aed24bfa34a4a63dcd4d7fce2c5af4093393eee913966292e9369b2ee556f1a0d5a2d18c0a1e5d98b2b8cfb3172d022ec4190a71de65a2eff0600010e1cbd0e6ef008f64cdf15eb029131a297097e4bd6ffebe8e0088a1e87a305bff37d776945e7329bcd37ef630602cf7edd463f8bcb9acb6c214281b11974509e5099fc89bc9fe7450e06410f228eb9edd9b33d6cd01fde8cc9103b4707d1d65a73474058481b495120a0368a2cfd61ca0a75d0ddbf5906430e332c4eb52a06fbebfbb8642fe9148ce177e00cea78873740de59719d70accd530f4c98405f1204ad99169b9052af0d40f81b9d71a65274aa7379b75b3138203e1267116f57d298b890216a0b726a976a9e356856d86a2e45aff323958b9be62db8982ed88c42315140bb5f942e12d31295682b593de00f77fd623731eae24c53bc508c1820a8faf0a7c4c175ba3a14233da12d9a8e1914f0c5a85bdf6e187f437707ab92074a8e474a40ddd64aad725302ac077f8894d5a9db0a9659911e1abcdd0ce306556b579f6b5f094b2a84e59066d19d2b05795f212d21e644a2ef0fa3da50016c942877d15ea39c59cab589c2f3bed1845ddfb317e762164533c601e1f922697a50a23016a2f2b9961f68feaf4c5fbfbb053f368296f28485c9f23f4f2cf7bb3cd5ce023d9e2db15111244fb180740d6e4d9e04acd830b6c295f5c25c79aa6bba737282f86a542b6e5312308a5a25771025231e2d3c4786c46d1ddeb212ea9cd41470e05506035160a3bb0c28cbcf37d69e6e9fad4e6bd9f1298b8013566d2634b1e7805201fc3fcfabc545768673b67862d9bd7d44133551594f3763741da532372242635f475e537b0286596ae969bfcea85a8d91d2ff0f5bf27fb2db27edab8ad0e56686e9a22610326ff49fac54299c7bb90b6f8fc89f38eb81da5f971be90d5dd650449ee1186f25e83904d955030ad29b364be9336d2157e373b73635c95f0f11c60142cacfa5c4b3f3fdd3fd5dc91cf86334737bc05890f52aff9ef5c882072966dec65e10a1f8e1c721d77493ed6ae5eeb12859cc63337d5f444e334f43e04fa18cf302e8aa351a94fa5120527c171e0c43c11593bec17bd1e9024256554c49503a05f897d7c672cba390e0e1473ae5996045494bb6378838fac304c660f8f81b83933206cdb5580c4b558f2ffc7516986416839da6ccfb33741ed66ed2bfc1c45e3ef941fa62a8f711a37d577315d2a508d3b168c08b010513b03253fceb40c32b4b695ea34e57457da8591ffccc91b739ff1be62bfbd4eac233697b4bc8921adc1dd78b56060e5b6100f690513f4f4e717764c8ed663aac2943f3c6048d09fec6011aa02c3dc2e8408937e143b94500975b5f63004a091e5a632e891c3de40847cd74aa897ceefb4dd2211a76dbaa124e7d1613474200ca94f752b3d8852c8cafe9e59db45c8ac5c9b11ca568aacb2be86b59d2603dfaebd2a2328f01aece310f4c4263a33105aab8eafdb551808a5e59f0331d62a0f59564c668e96bce41a5028cef2e5d87440181dbe623e165d3f8751669315a0780ea03c7a2c5dbe1f599c2ab5668538f4bd178bb9bdf609e3143b9adf01b3f9a7f770bb9382c6d64146b665f3455eaade890d9597bee8246b4526385e624ccc6387bb5b2f280c4d7a31b61f395891b42356fdbf1a56a684e3fc07fc48c9e7ead2e679405a1f42a2a682cd52c88adb272f5ea4be4e5dba1fdaa49bb029a38875ec14989158baa8cf796a0ee217755ba4b361003f43e6f1ddee98ea6059c09c13120225096c73e65314f28bc9cf7758cf6bf7cae16c5bdb4572f3c2d55a7b7701486455c2ad20fa2ce57248fcd9ae900dfa340aed40b8f2aebd64528b4a75bb97804906ce845899cd9f9f589a268d9a6fa5e2c9a871105d542b53ad28a8ba0b44c2d8b6575dd332fd2e70fc64f691219862910e657e01ba7ba46dfa832d80c6ec1a218edd0eaad6eec30958833822d7cf6800b727aac1de7cb41ca9e120d363a1ab7b2e72ba663d12fb510a50386f4d8d85d933ed1a88a4de0721beaaf331b4bc8891edb6dee9eb3fc91e44e4badedaa3640eec0ae87c868159d5e1868e90f72175a2a12cf55348e38ede34f2df8e1dcc1d0d98bb9c055873513f2521788a97a069c6b848c05036511ffdb2105bf1a59f7fb8e441d53f4b1ce7896a05f4f8cdb51a0ebb180c8ebdce1c2c25d5ce1414bbf85159bab42153d0f436bea4f50e0d98bf923c68edc1baa5e774e338418bf0cdda443fe3541be695fbd554e09388ea9faeb59ed9085dbb8bcf4d07ba7cc5ec71391c099b14c6e3d149e88a0a1965d7be0ea3cf825e49ff55a4ca0b50ee5ece78286a3e8a184c6055a1588229e6a929f42930159d647755818244ccab95d0a3943d5ccd457153975d7b5165fda8949e080f22e93cd759e2ce4d64e5340d4499ead8354c12117e813f15f498bf23f360609475967fcf0d8258f4e2e5559f2f5e46d2191d955f64c242e04481415725739abd6d0f4db5264c8821bd7abfa4446aafd814b97147c2c68379f065a55a9a7a118ec47031f619be06e3028ab3d4b37b17ba4ed612212af484db69d0f38da432faafb9a747062e08883fc8ce6193bf0de0794831ae5e96d11738a65e16df321ccb9455563d4ab3055d51c6334aa63b8ccd5c52bf276105539c263f1e2f05cffddc40ce0ad88e63a3faf72ca83835e6a48251b3f48a4d7d6af8965861e0aa5fc9f9b27f5c4a9fd0e6de15c9f0952e7aadf6a5dcc325b60be01f15caea7a4c9feb46945fe3e21720f5ab5c2cca0057ac3c467a7895e199665775eeaa368d7a3422a660657d44a028b7e198a9b7a49ed42ff0fb804dd16687aaebac0fe81b1d10ac6680db1a80aed90b8139393a7f25ab27133090f0101ff2972d42ab96038d4faf362471f4be888c9f2e44f92523b0cdf97c78f8b84c4060ce4d84e3eaa6d1b0c9e95e11ef2a87f2f1eb71b6f7b8bb3ec36c45dd856b73963a6a84a552818cfad10404f1312d5b46d5a5e79b530d793f6052ac52b58464ed24d95f3d540ac6a9cf59cda30584635847f91116f986af5dda7b25f070306b3c5bd9299e5938a645afc1289b60eb59629e6a1a04cc8eb909963cd9f47527b298288baeacbb0c6e8c5c45a13f777575ef7c1a7445dbc4699e3c6971c5e35504d850a315133629120d8d4ff2891cfcb55a60ccd4f9701148c0b64d902939940793e5ad28e6ad73f876377a7706fec69de56cbce55c635181b76766e2f3822f818f46aa803cd2a3d6f3fdd7068cb510b8a5bde19049b2bd35b6a0f3e762bf057e47e342bd00eb74fc928ee8aa5b52a3b5f2a58fa10b75c6b9c5fb92cd3ef76d45b9dc6d27b625435f508271ae1501cbf0aee886bed0741a630f7da1c4a20b9e1c9a0ef7524b5d16ee463b2e7bc2467f78efa77026cf3b1c6e266c0bffa4951943306010d45f6272bcaaf5ea709c909d613f91ce03b46ad04358ee4acf4b9caa851a0810bc4f03ae503ab4159a1c60b9e0f6f2dcf4d981df0274c0dd7650df4610b495c0c3f174ca1267037b094abcc8c79a34a03fa5595332b2a35f93b2446268e07e8e2301e49610b04c796543b05a62851709fe62bb93c861b551c118a114b4b7ca48b5b313c57bffbfc9965fca3312fb91e870fe0ac693b0aeb54d15bcd481649ef954531a6b23581cb07b75324700b6a95db51584dff8adb58c27e361b08e90ddcdf843f1f651d836dda7da976c4e1eb9c7aa6dea2603ea741f108bc477ecd83ac7d3e40769bcd4f40cdc7dddd6799dbe9831d8ef2df74d824baaf5195e4d4b8cbef834839f4464039b7fdb623098ea6f634b43c7a3a458dae75cc5a9eed6165ac15baab9ed919f155116ecbd9abbe2fd43d25983c3060fdde85d186e7224f2b4bc0a38f352317fb3fe3d428ccaf8d49c9f4278826cf5c90df8c42a435901e31b169810707c93bf649ec661b2d7751348a30a3b7581229d1dd54b94969cb0d0dc775d743449fdfed29b066a48a325474ed542bcf4d3acc42634d1a09585cf34186a92b92cf54a6c8142aabe2db76366d1e3034b93e28744b1bcc1204aec0a7a80032f4122277bf1a04060db4552e0ab3cba9eb51e279dd3b57615b70130d6045102a40f8e8901d5ae6961b57dc1be9fc70400fbb1c077a0b9225ee58199e0713aac8fb6c25d93546df06358d4710fd507ada15688a8ed3b8b2d4436289042d1a47573db4320911d82f30d6c66347e3b7495bf01239da4a43e05729e7dcc2f1deea50cb50331c1f16ed7a21a38a261681de06b9cd21d149fe7c04fdeff9392f3fc7904b5217332611cbc0479ac42b49aa4719a5538e1749c31bdc17ba16d88abdcaf29bd93a5a442f7147069c56633466e82606154fd64048adfe872b7a22d0b7c993ec0aaa9b699b7265cca091ed309d063b3902fda0a0b38abd8baa00955c46bc6f60bdc824af0001c1c4b946363437a0bacba576bb1427ef82b4e257916bb3870253005ea3472b2dbd924af38842483b47a83b096bf1d0aec18b5c430383332c321d1a570d6e5e16c9dceeb8a842f50c5dae434f81600b792de991e572288557ca515ffb7a2f9c9bf63398dbec15a551fb4897c4c7bf0d991c02b333527d49b2784e3c2dfd67f09c6ac08d688c6ecaf5c3574dbcf96d382d0b6af1276165095d43120eaac1a4e0c9a972aac8b6376bc2a184de23fce29ee62b60d486dcbc6cd96ee9a578409d7c04eb50399772a511de317c0f810deb22a2424653a15d6d0ceedec3ffcccab474a2c47928ebc99c84cac5b7a509a1ac1a3e47832edc2e7c7369aacb38ff50c3f25e8f1ad0e2ccd1a2272fd37fbe672fc5c3509bc69e247175ae1c2ecf5531e520311dcf4965a6879a25e961f79c5f3d135cfb72c4696cfcc4effec9bd066b7b507b007db6a1848a1c279a8affa4628009ce491e97a0d18758ee6b879aa9e7c350dd46a0693b0664ceded78566170dc2a6918124c5795de4b75015c9601e35b99ab5e3938b13164f157273bb86a0311331c43ca229de8ec141a0ae4be3501d3076cda470ff343c925a03a10132d99d316595207a1ec9cb6d5410676947612c10f73cfdc6d85f7e60f335311f4e47bcb489e806d40a83fea2fab743afddc7bff03b1faf3990ca2dd3722fd705f7fb53c7b31639bcaf18ea54aa67c4084557add551b5a3337a25cef422521d818a40403625b8ecc642486346b7e6d4a7895875ed03b41a6efe08607c936f5ab514c021e218525288741a707f6dc611df68e7ed79d717f5c6812494e96d21278ca787b827fc25042c5fb4edc16afa31b1d0fa2c1c44efec91c8c2b857a4b5ba8ab0d35d6cb82af4d33476ef78025092e60427eb0eb0f39224be07a9f136dc02d70c478c1630682d95473bc9f565f0d766988d35ebb2d9b7b2f84192743da167949b57e9cbfdaf0dca3d611e58707be445a1c62d961ff35d47925d50787f6a858fa9f6b2f2a8f27bdd02774b0c90601a608c05344068909a9e436c56a4dd784041222fb521e2069c337bb189bb3fdc80d316ab145fed2301994baab22df6e921933ae51ebd80a7ca03dade7af23910a6f60a1a0fc107e4ad797690e785e7008f3e37b0a38b6149ba1a51961bcedf46da0a524a065d1433c49bf2c397e8ec6e69677cb70d000065b80abc1fd87ef7b51cd80fef698e7187bbcc65de8c0e68eebde2f7266433fef51c1919c88724662ee2adcce77ecfc62194fb194f9693a6c3d6e3b0616cf930a239d26f0d9462490618453ba1d90a4fcbe8c6f18575d911004b690a214fb8284b6a232547703663da37349d0a91dc689df47f92aef91d3e5dff8b007e3efb716ba28b11dece91fdd500af7a1875aa44c67757515588f480de9d09330e29d1cde540433e46b2941125803f1598606f7afdbacc94e79a33f8c57392ca213ad567d1df398ee86320d17172e59bf0ab27a0cd8e8303c1323233604b44f5021183fe6f4994034b5770af48511b541b9b1f2b9f54049b935792c718f8cc3dce95373dfd7de8caaa16ab2ea67d6ee3bb24a246fa9adb367e5b061bd2db43836089f154278c2df76960efc7de97a0372b8457c4ca7a5d43745911448a0325aa52aeb6da20acd776f28d9f910658a00c04ff178e9fa75c7ee465d342ccc75ab7421ed36e8b66479d4ad2b68d933e19e6e80cb1e21a1c558baf9ce9b3d0c1a7ee9a8b9b9f4b67ce78128114d7c336aadac341629a7054a3616f996d113ed8c69b080cd0c01a3321910814ad4604846ed15d76aa4ad3a2c7b672d972aeff711c25e222d906123e837f8cfe46f7b2e31a137be7b48afb49b8ad0cab2714a0f60184058f68cdd3324815293d1c6d7c06fee12a58e1dd158a208fa129a02f11445b114eff489172d2bcfd21110647b18b8a03f4678fc5aac5886cdbd7f250fbe807777bd4300465756178769e107eff81c3faf981a3bd9ab29dca7c1c08a52b9e3fe3104458c6ab2569539ddf793a0d32a9c56121c4f570a5ce5ab134ddf50ff388780587fc60d61899e52c1f0304b79d7b4a7e0e7e30d932ee3f0df117a8d8e023c31d40428e6d7fd545913125d451deceacdbb9f7b0328b779dfa65d10893c22cff0d04a4ed41e25521e15baec12cbff33a2d1a43638ef047a819490bcc122c41412b6e759e8da8ed6baea666815719f3b5a4898d0fce6ac23f7f226a6b80ca2f6598116f8b124258dcb52c970c4fe39a753958450432373a598a2d39259f757e7f048c6177a4f982dbf3e26a6006cb1d85683b3dbc26c44e89cedb57b5e71fa190d74a04f1ce563b12fb96b09d145fdd01c555d05d7dc8c39782062bb6e6b68c1c5193b05ea813fa0a06803f70f914ed558c7f89330a072ceae2b272176190c068e8f68aacfc4034965f65a268181a791386e1f233d43698b0e3b82a1bbc2423922769e6c044a245b34ddd31388ca082a0a69e7ee306084c52ca7a4231b973a6689098c3a5656fe01fc1568c804e68cb7e2d7b6f3ef325bad82bedd586656b4ed190cf2fddaf5f3c6b2a776155a4a9158e314f57f98bdf4362c000221ac0a09b7601fe2310c1f3364ed92236bbd275a4a1371718d8539cff33d9b1567973bd2f33dc1b0ab9e50db6373983952941625e0e273c7557b36c277f05229414b38e84242d2f50a77874fbc94c06a478212db4a9aef21f64efe83d8fa7e0f9873b1a8a7e9471c3852474588e119ce0ea38b152ad4e9f253823746390181c455df5f286d52da970c150ec53267e0511a4c2b80cc3a3935fd9abb495c61694f60e798bcb060a66f3686adc9c5f04c768d73bb2a560bbaa3a61d25bebaca6a1af2982ab6a6fe4bd55aac172752a9c61bf5ccca785e3dbad385a8879092486c2eb4db64080cb7ac367f6134c8bf5ce8a786145ad347daf8f6c1a9daa0373d6f7acd43e6da76eafee9f6651b175828a29d08fe276941696a32175f435ffbd07062fa6c17c94763db7d178fd0157d9e01f6c809fe5b39a04e1e44603ea6ee2dcc92ef1c13bf1b236b2b00c9284d8b4e3945b0b4ee550d72bb273bb3b8ac36668432379117df0d3a63d29e426680a451c48876f732592ec37d8c59ad0e3504672b71df6e00e0261e887dc573cfd9600001225b5bf71b27411b0f5b7a934e38d164954e7c4c5cdf5574a61b011f254341065137fc4057081f0ef551651612ff73ddc7e26daa6ea969746c311ad0cd2919dbb5236fe403adaeb7b9452442e3a919a506920c7963eed9512d5807b6a75363fb2b33bf8185d6b188fe435b19b05f120e6ddcd436cb168c154affabda965cb03b659c0f7ca8636b45e23f22dd7a8b2812f8642f40e101b0478ccba93f62d496c4471976c18e1782cb147bf566d52e683b1e4169dab3384f290163cbd31731756f4d332fbfdcdc9fa80fdc1a95271f597aa2f8fbcfd290a581da4693acba9806d2c7da49ca5747669aeb404f00623aee6abbfc1b2983772026b093dcea50ee06a0dc1dd0e323cb33d3aeac19422d069b72eef67822d68e69a4d7404fdca8fa174c7e59445b474e63f512184cf87d325b2f1d6eb0ff99e46b1165ba12460bf3bc887ec2afb8412824154c4f665b066506826033638558ede3c51440c16a597b7afaef9fcd1c5446f92024cd1055cde7dd19b45331b1b3fdd10256be8973716e92b223fc33e97cdb020bcd98bf8006fe74a92122d0d4cd354087f52576f7452177180c300713f8677ce0001f4484c3999dc589629015f68966e4bd439806dd6bee20fd7544e46221f49735facfe64ea3eb73e56cd1334a341b22463d057ab4a6cfc7e92028cf3981791ab8a63c01f92b430f51f8afa9f98bea87c34d9c70673027f84a9464e99ff09aced3b55014276207854811572c8c7aac41c10f1c60e2ec513435f714e302a07532164e0d0d889b32c4405c4fc413f72acbd9a658e439c30dbacfaae9ce9dc119ecdc5bdd4e67ed41065e066913fbba5df238e1ea5f073052c0967bc4ee2a5fb88b1d67026cd0a63e694ef9db9353f8212e67405c5e6b55fdfa2523cf9c7b4f24c827d24581e6582865060aca5d31ae86da7ac9540409362af686ed2b445cd00ae78c6882ddfbb220101b7a61355b742493905f0ae352a69a79bd1d566d2d65bc02e53a07a8a5b8fe755f076294aed06c16b31c436071920f95a111fe579dd7c7ece6821c9d78522a33e9a464a04102918ff9fa016a62a1141d213e41b6b98651b9722fa45a5cea59432ec67cc180d641d3c4963c6e60894450b2f0b907a0a8c34932cb6fd191f71cee9e7882791b48392504955ecb03a982adac20b1a4e6881d5290ee1fa2aeff88505e3784f9e4da2c3a005d977b2ae2432a089a9c38e869c703f1d3777eb303bd991a47435857f2ff0b1f95eed1203f2d721a314b8138916ab871eb46cabc8b6a1224c6fd67bcef8ec6a9a8d8a431c0bca7a499b2a07742b0ba93b0f42c87e710083eb0d744c9eb815b3eefec4b054da777b8e4f51d298257e3295deae0457fc38d1484be635b3a097affa6e017bde93ab6797b4cbabec814cabeb78803c0f3b772c3629332c65c0e7f5f00d20d08f5d6dd2aeec524ec7187650097bec65f472c110a8991a7dd584735131377c7b81b50f15d7b0787c7d5b7fbfd1a25de608b9bfdaa37f69a65d77cd968853af8d9a3dc555d4a43d40b503d1dbdbc248293c9fc40df13a3528e7e317a886e511bd3c9a191fd63d48a1ee8e06da0aa4f5160e953e60fd8c568e748fe75911ffe8e93703c1e83bd44499a317c6008f1da95f1338beebbcf59b1186c5da4401042db436279f9c0489533be8e62db8837863cdca3363c3a9da6208dda982862b788aa13c451573c05fe1d480e9e1ec394da40b5d1404fd5b520762c4662ec97b57af004b26a845e69983f686f8c532f1a4ea5d462dffee27cd3192380d92fcfe49c68574066ac3e4cfb54c5c3f25d65d1e6670a702cde343f13ccdf194677d3c5ad0706daf4008ac1f5dd569d9347176f04718bd59ad947ff6de18ada1b53bca5cf5aea04b63be6f9c0bb224771cfbc675ed5d95e431ae2344229b134ac6350b905653f4a66b72dfc18b249a7c47e9a352b20b288506df09a779a973713da4c84eec059860f1d61fd183571879e8b7c3bd926591111e2bbd8b5cdca0a80168d08506237975b712d4106bb9a4f02b3751a7d71390db242535b325250570040c3f3589a8fad659852a21afcd471275524799b2d6fc10bc13763ff4dc96b178c5c4c1e7be30b247700d42c85753c6d67444d3bb0577b50178c9a8677a7ef67b422d65528285d2d2db57fae131635ce36147d04462d61f4010a873a8a3e1b11f830a1f7fcfb4bd8e0f68d03711d4c8d38021f42a9704e13f6ecb475eef9dd12f5495653c7162104b54ac81453ac59bb72a9f5ea185dac76e33c936846cd6c4cb9d0dee2a233de3bc","title":"493. 翻转对","link":"https://leetcode-cn.com/problems/reverse-pairs","question_id":493,"issue_number":42},"40":{"day":40,"pres":["排序","二分法"],"tags":["二分"],"whys":null,"difficulty":"- 困难","description":"本题和力扣 [475. 供暖器](https://leetcode-cn.com/problems/heaters/) 类似。 **因此大家也可以用 475. 供暖器 来打卡。(因为 binarysearch 现在 down 掉了,可能打不了卡)**\n\n```\nYou are given a list of integers nums representing coordinates of houses on a 1-dimensional line. You have 3 street lights that you can put anywhere on the coordinate line and a light at coordinate x lights up houses in [x - r, x + r], inclusive. Return the smallest r required such that we can place the 3 lights and all the houses are lit up.\n\nConstraints\n\nn ≤ 100,000 where n is the length of nums\nExample 1\nInput\nnums = [3, 4, 5, 6]\nOutput\n0.5\nExplanation\nIf we place the lamps on 3.5, 4.5 and 5.5 then with r = 0.5 we can light up all 4 houses.\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f249d123385588680b0adb2d1c6c0d97f6cb6e33c7bddf1997b34b506c338b3331bd78670589ebf25f42fa2f3ee24f12c696dd5d7cefe4633d0aa8b91587224ab508f9aa8018b39f409c7e0abb8c06b23cb0074a6f1446a7247fa4f14415d9751b4cfbcbe22aa14b6fccbfb0ac7259ca8446e5d0f1c5ddb69edf534fc68e56817558113482531b2c64118f0e78b3013310b4815e861c2e6c7ebfb88781f4b1744645bbf59250bf2378adedb3088b354ad4cfe524027e067592e16d72d0a2b139109f0d322899b0855a0c902387f958b415b5feceb3ea5826e309ce4ccfa93214cf1105d76feac82259614303732a8c9433c14650baa5cd0fddec405bed8af1d5068ed35eb748c5e144d8d7d1f827cd8e42619c34d6426d443a8828c59ec21bc977203c4b065aa05d8269d61cc20b7510fa1d44b26022286d40ef382845ccda8d19c7c183f05d8152ad4a83620649dfee25375859d7be84758562e534d829f26abac0fe719176d9ebe35b5693242f6fb60c7c385f5d8cd4151d860ec3183f250f754fff7e34fdbe6756e8658122063a5ea2d69146f8d6589ed7a7183ba8a68656a62572db533ee9ce8ba728b992327669c6f22668a43ab9477a999e9ecb1b1861ab1295001551530bf1c1eb2aeb9598c29d2e4db131dcd004948e6f8c8bd4c433461e23e2fa0011d8e66b60a52930d01aacea3a50fbb64dc0b93133b1e1b91eb474b5515b78430bc8b3a417078341bb630536e52794b57be899a09753364f18ab8ffc3db0afc0e11e8efbac12f8798b28ec2737e155729b6ecef9deb12a7e4a6799c58cace7fb61739c4ad6843dada133ffec44d3c2214332f64ed2336ad992c45792e4d352a58e1fa57e0c8fce8d0cec1c16d5de7114663e098ac1dc502391187f7ea0b9962fb33d809618a1875089b349bb031988ee227441670e3d3e9d617c6e251b8513b2c55b624db4c48bb061ef755ce83a57ac3622ec2b92fe6716d519a8da4d61195b50e1dd5bb0a07bf5b4aae108ad2c8e30051de95eea7c2488a791b4ba322b889d9f55422d53561eb58bc82f66c16d56be510e05f62d911eeb66b6d7360dc50bdb82b460568aafe2be2b0e81537cc9b30c753d314f26bc911b8d36b5b4282d9c947441650b682c7ebafb2c4a281d57b5308f2a3895e3703d520d0cd93e4bd006aa560dfd856db36d266714818502a4461b55c98435c1d54f97c0e7d64da9d1209a644d545ae27c0a536963572c273bdd925279e613746d2fc90002f5b069fdecb20380b267f0038345f67a6657bf79b6ae304def17d0aac4a0413c50ff0f84d11101e3ae64aa2b477e362dad444ee1c0893e7943c7d2255373419270c8bc3612e7d59538460c8c57add723e7031fd6339508daa5334a4a07db9891eb8b65f818fcee4955261c3fdfeac30e6cca84e14ccf269f78938af68a2ab6c4c1d6de15e3e9d75eb0a9123562d352dbb555d09fb9d00b4272df4d769567642a0aaf79dc5f49c6cae09761f64f2c12ec75a16429dc57f8d1159bb3b0bdb02cf020b46a60c6802d42a6ef48849ca58613f3dc36215ebd2d3ef2e19cb11b5ba098db3eaae365fe24551294c9286b762a43751ac8f80a9c5f59f379acfd87c2655e5198732f3cabcf64b78f80935dc0f380e194b483088b20aab042e6c21617ab4ab07f0cf144b30580ab3c8ad12cdbe29b86df965b3a2c3155ee6dd00a91421b305cedf78a8047a0024df499452c6c536a5976cb5b34a211b697dd74a0afb2ca54bf6c2ff9a6039269730685a15fb3a424ae5b46e12cdcd8be81da9a6c22571ae276d2a436288d1c1f11a13177e3432772e0ff25101ed2d924e151d41b8e5bd003e2e193ac4f19f2c421dafa38da46bb621b7c0a97015603989999805f4c5893fc3a3219f0734a83774cfa984989c867566c64a987f519a22563985d1e3343d846acc73639f484d805591c4d659d147b9ab54351b4a169f7b55b93f840e8e9e016e7414acb3f2a3a7e5de69a477922586202d3891f2ae677ae351889b9676ebcc8e5290e454870be0e606efc0ab5b738e2b5c7860fa28cfa55d0ed94da2449532219c0babd1d4bec2e08afa929a9df8e08dabe3436a3725cbe879659d62efeaebf12755c6f8433878eca99a37b52d30bcbbf1f49cab8c2fdd2aa459650ec5b4dc6c95674b88e22c61c351cfc550b35b332d4a579a4c7298cf0fb78a8d75277996524420773059233c05e420bfcbaa6d9369b36f9522a7c59fdc88ecce4366f356060c2d15855e610adba21edd8a74bd83e1c80cee5ba4ff18e7b15c9ba852f59c771a3ae4f596b0ad863a538e227afad57b76ecd229be60a490c9a7becce81eca7d9f6958075a8b599177a2ebde44d7568a18f00582cc70a6e6f3497d309913990f2f3f02b9138f6d4797ace062d635ea94b7fd50d7ce277d8de92a7d6f6ef9c66dcc4e93c4fed0b66cb23fbd58af098ee7687092643e9df2a3c7477a2cd41cfb85277901dec798081dfcdfbd33c032f23c06431dad9717970ff5cc134fc7e36c967c4c6bc5dedc1580ea6898daa4d438c23e2778f9cbfd26c389ece3ccb2e73b58849860148e2a157aad5cdf53940801fd6f15f90be092171c1f173dcf4b000a08fde1287826c202736e800126d5df55f3b3516c5028f6e7b62fb4c901e342f4f0f5d3c7d58af234ce32077361129570396c3b4d72fb457a2f2b2a67aaba3b3f76434da53198b58875a8e96ada3d733f473bcb5d0ab7fdd173570aa50d5389a8da5c44b1dcb670af8c24bbc5e6aeedfed0654b3643df6ce490d8d537efb1b3f9a3adbf05c93b6f928d7016096ddb71f8835b007e3e2a5f2fa5cfc9700891eca51428b83c992dbfc6976eb89b825826504b33cb4a76a64ad406892c9c7e8572f6a3b190923f7b233c0ce33ac62f48bf2f11382fa1a77abe7f769076e9c09764ba05a3a9662ec4cfeaf3bd084bfcb99a2894415c64467b62c8b982bdcc679da2b0c3b42c6fc74b1bdaf47144726bb4f3101d61191c5c5518604fc53c06c09d79b96740be7807592c5fc9dfe0cc7a860bfdc6f6a96e2ff2368fd46a2fa3a021836f19d20c0a8e11d8fb177d52f018784a75bbebb401955dbfc822d948e86fce237fc32d4af505005f412f7f1d302b0bd62d74e71f0f5e4530f141cb51570cba76633dbd55a95a6a0d359b0a04891c43dd314b53bb42942c27cd10a27a2a6432e00c61f5443f32f8e2404ba75193302e93fef286f405963036105e35e7628fbdd3b09d9eb00e865270c782e5fe69565873da35412880dc3fd253096eaf6e1b95fd8699b16c861ff00277fbde7d800a181652d61b60411415c8ac8f05a6885a474a085c3343977af4912cf29b585114b85328c70bfdbed6ce94d4c1a9bada807cdfb527e76f354603f202c1f32353455d8f0ad3345f0321bdff64ef2167e307a89696532157194e96fe59f8994056e0591be0eb36e838aad1f8cc050599defbbb3b84403ba66a5b2220200963b669a7699d2d6baecae8ecafb6a466aca699eaa7e9fba2c68b4720bc97300fd610190782d028d3a7c4cae7646481f37f2a8d6110a93e2281f77538cf6214a7c3a886b25d671795bb58f9793246968b439f25f483561fc7cc391f99fad2f2c9cfdb2692f1fee9b8df9dd29f9d8549d4ef209b3511460ff598d5f70b0a9c37f7dc27b7e4cb8a8624caacaa62597322b1cbe90661c802b900728fd78e37b191d3429a55f56a0ead4039b4e1186f25ad77409b01501cc58e6a56a76b22374aaa7afe6231925f0f11c60104859da5dff6eee681e11cc615ee41725a5ce806c93b84445a6f66469f83af630dddf205226f32ae1784170a837e255ea5b14ce9fc9ecafddeb19aa32edf054a5cb02d0fb0df6d1296ee8de18f86d7fe2ac8031a07cc4720b5d695f5ee8cebe88621464320c37b6a496064c8fe7e1ca4d8d68c51eb0cf33d0b9847ea37198d5773b0de0159e5898ef220ea6cc49b4999df3d1530301ca7978814d902391c25dff723d464ea6d6e8239b982e2dd3060c13b3bbb3464eeca97019d50d5e541c7324b6e5da2705e4569ad582ec9cdb0ba39d931e50cf21c783efd98b5c81d0dd9a925bd47af97d6bbeaa0aff04257176a3605614c5b86e73fd7935921d21c8c8fbc305724983cd0d84a821d25b354d6e93158786d01431e1424f2cb6e5b56b70b805633f7b124adfac5d2cf82f61f2a77134a5e554ac9e592b504cc67310cd61065452e137ea73500319a239b51aa9102e5775ed33d2e99c7d9a36dbf01c4ce311f45310aa92219b4b8cafdab5091875258a44d5c2beeb083728021f774cd45b40aace5304fce00239dc5e100b80392ab26161a7e16529af601dab6bc94b3a1918fc4106801ca1d942ae8b0af3cd72f55fff6fb0234c5763c02a3122c6d64146b2f19347feaacf5e3851105abc62afd01378def0eccc63829f0e6a7d2cb99e0317cf385a33142356fb798c2021c7b708f7f96a6d730ad4f7dbe05a1f72ae2f7951c8b24692fa43243c367513d2e1660cd54e90def64d909ed0dae016c137a7a1c4ee6ecfd72d482d5b84af792f3456f2472bc548814bc64397a9bc7774f314f28bcd8b2338ca6f02ffd1b89b0b51b63346532e2e335468f5f762a804af69b056a8f8cd4ba2accb741d6aa0198ef212ecec66d72bc15bdac36aa56f58396f3d331126326d3a623c6e50873d3964eed7ccb040e5c6323a9dd8b4f78ddf598442eb8528aedbf9974d9d535d166c91dec6899a13b9f2749afce4693d9370ef42587014db72febc1544591f4b530a7aae011848a1665556a5cf42330df29b602bd2eebda64d6fbdb9dd5778a333f0567cab4b35b6ba8978d660cda43c6616536714e1789ce1d2b7fb8af775f681473ac880299ace02eb5d6d8c686d47afda165cb7e0a95e4070b4e3e5e110c3a06c632355337fab14e3be1465f9872cd91ffd4c86419bcd757a9911f676bcedbdf757453ca5339c9892269943a447e592a6a456a072d81d82ea78e2d13994d4dc8d8c28e89cc22c1d127573c3083604b46b43eaeb3d4fd66de74cf5458831c90fc76e6cbbd1587a9d24733072ecb7446315433740b46993c1b8d75db0b210b46bbd084e6701227663fd43b234ac99a46b6da3090ee7a16b2736e6045201c2e032d0398e8d011b4158d645ac53cc6897a89da85d5bfc6001ce7e686c611547f90aea1b07226de83384faf161001c5d144b634a7132e83d4ea13f20a6b2dd10782842faf5a9ad43937f4a0dda7b8d5b9533943b762ce8f9ac55e3c46eee508719023a6b0d1baa68f96b5d7986c4d6f3c55d3648bcc4fd72e59d1834f1200e31cddd482ada70ec3dfc86d3d559e18b07b7ba44a52a4a9ac47d3b9b201fe0b2289aaab69c3915943b9a85ca9c5260f5cf2c18569617669242592ef214ed6510ba61706f7beba29bd718719a71315c7b287527cf9911efeeae467ac7612441bc036a0dfddfd4da6186435f36c1258a025305b71f1e8308f761556a3f9facf86edbc6a44576b11e84282b0606c7010e47352523c8fb031f979cfd01b441ac7f547fe80f56dff60895d6d7006764f94c8649ce6d9d6931b4a475deee62478df333a9a8338a3f8f12e3b815d6fc8a3bed79266d9db24f6946b7afdd55c8404ea2eda1487ac9925551f7e0f3f169771a6a8367a804b5522bc5526373d9156ffdbdacab9e375dbfa168920a58e547a2fb2c9abce763258345cc054fa8ac8441b0f09630c01a486173887830ce4cef4582b71d51a4338aebc39dfba9c19124afc6cc406fa15fdfe136edbf7e09f4c68878fccbc89554495d0a58c3bc83f1f5eedba12d792f3935eb81b3c5af68f400e592a1f95f0809d35bb0a9da827ef3c7c143f8bf28e9f38035e691864164ddefe3a921173911653956e383aa741087d5ca17150dbfeb3892e4d0a420e29502c5d409ec732e6ebea321641c6f306810247002f939aadf0891d8017bcbdc2548d6d1d7d900b5e4528ae44991bc75247c50420d514b7955c6e3215dd856cda25873f2bf57362f7209316cd8a10cf585d1625393c7b7d66f559a638bb1f963b2a727cc3766f9f1744d630ccf0a4392b15f3dbc7a192c857fb23e58de3449a21923db9246f6079e4ba91889074b515d4f453c30306a4851c940bc4eca86d6e4474ec08751feb6b07b543eedd6fed6602f52debd5031d21ea859ddb927538a5cf3df56380d4c22423becffe324b29ebbddbab38bebfb600168b2f21180507fa753ecab831e901875c9b40e815a9345ce94836c9b0f8dcb5c5ed5aa1890ad6e420c212b06b59a1c60b9e46292dc856814ea2095722923759d67d01527328174066bc26602c9a94abcc8c79a34a51f949c97273333ee37f65086ec34488ab04177f6145518ac55a7740e86f0538cde669af379e310e36118a114b4b7ce1c70874267df6bdfc912ba9ee6254f0638743a5b32e3d12ef75d65e88431741eee70f1785983581cb07b75324700b6a95db1b5846a1df98208730627716e60cc4f4d13b147206e5289475e72389b2fa957abcf4a2603ea70db84ff4415fd7cca0683a406adfd8015bd5f1c7db27cedbe28359c7b39231c561e3a97b84ced4b8cbefd40070b803402e9de1b66f4cc0aeb861f96f6b330cd1847d8f0fccbf242bf82bb6bfd8cc27f45d5f34c3dbb7b41cca2e79ff7e7532f4dedefb86ad2244364bd1898f352317a97ab78128c7fb8a5ed4de4b892adc33a13d2cee629d21daaa3da107a6c235ab31f348a38bbcb1e9e6658c2b73c0b8e06c5fc146b9f929ebc80ab14a99f8725746ed28b6494ca7dcba2cb7a10af8d063e799999cb3d05c991fc62ee358218c4f41eeb3262f34ffca919fede833aad2f7a0fe46d0be2e0c4b71bdbc7edfe2e309be82d4e3fd187b4ef0cba19412aa79893a58615b6d1201616a594a40a8bd931b6ca5904a00dc67e3fc2bc1c7179ffda7cd2795bd4558d05359a19be36629c24b0e9e5235855d0fae237ae94176c3c09bf5f1b409564ab88fcdc5e8b12fa8c6a90cc0a070c670472617e4d711feff3bb4c33dafec5a71114a56ea954df2f5a2a3d227b2af5f69ee994c4fd14c7ef726c923aeb1625423b1c1be1f358eb4d3bedfe9084dfd764b9f8134e4de1ff701e6df0ef22b9766f61c0f25caafce51f9c5dfe787cd92399ac6f0e727c59dfbd44a8cac2c7d00eed59a13176bb9c69666753b09fdcc09686665ec7f8befd382325b740530c69a659c394e89658d2eb7c62ef69bdc3f84c48899eab1781b9aaf7ca91e700a1e18f72a008e4515e48cc4824ccdd0d96102b31e2cb1c1fdb022c686fe12353f21040a7d13833d2c7a58544e5a2c23549ceaf0f8ec15df4913ea3e0602cc99fecf30074387a4768005e2fb28fb834a2976a7500b71d852984cff7a7e63bf4083175023a38628172eeaa4bccf23ed6526a36f4cf86e9f0c102ed7dd1e36c08be990e936ee8ef4a58b8c93a7797a2ce00c0ce4271e6f37798bfc4b0cdaf1fba5a8b88120413d5df31ac42737c28411b2cd45d8b26a9939f66689f0a347b87be56eaec8a5405d76402b70723a3150729a1803e28c2c733884d8436558ca4c475ef7f800a6458d7cb29b0c03a21c9f766d9b0d903c5a43d1e26a66977ffa2166cd8103fac9cdb3a18827c9b747b8f3b66c22508b0d7eaf8cc11ee97cf78e1f3dd6f168320bf596ef16731f92f046a3c9ed606a75a26e18260e2eda145f432e16e958d79a28656a079d52e34300072245be1be51c246142a141590204e2171f0d3a3d488646e0ee4cb7431551fab0fc0418233e6a19f5d088a19df8746223e8b6b566bc67b57f6d3ff6256a8c0de0b93aa18aa914425961a7dc02900c31d783fff305cf113d8b63939b484588901b207b7e57a8df4d90f7ec3a5a0f997037bcb791ed00ff243d68c0a0a6eb60524b7a1181807cc20614e95982bfd51afefa54c1769fbfbd852eeadd4ab34c72493cf2e90dcaa0aea95fc298696377fbb3021d2b6ce6da6f81a1abc527217c6206f2a627cc064008cf780d64d6305902be1acd27767704f86f7827523f9f16b72ccfaf11e44e95d5eee95fad47a5ff56316b02a32bc091c3ff023222fa0ee43d3e42cfa5c0296151491d13c0655530444f5eb29539e71c13e69f67a4a89672018cee5ec14016c1b57ece2128cf13b54cdbf0519de0dfc128e5fe5373a07450f24747b55d7e97e7dded0fce117aef679f9b1ba68cf7ea41ca3c6b0b175812d21d81fc4f9f45a3dfb5647b5d35f1a713465b2c337f1f1ec67fc7edcdc30cdadfcf3ac0dbdfac403858b99bde6e72a2fab6b1e77dbc599217ec9779220c04fa4502d047bddc2a99a55cdb0576b14f2dea4fb606d4795222addb7f00f525b1974003775847894eb4bb2d3d8581c0a254cc7173f5aec82f47f9551c994e88df0399134a5a34522c61d78f3d116e6d20ace59af1589d91c4f902cd30931ce65773ab4ec658fd48c5112a21b8482afeff045c6919a6ecc61263d2d63aeb87e0fdab26356622ee5e00991b3da5c3502501046c0e75cff9308200fc74cac81afb8d9cbe869b031c8ec80e231c674ff6359c848dd5a3e5d20deff7c1e5b6f2bfaacf1cbbb606d0735dfd677c83236251a4bb9c1b4491d2b153cbad0f08d76958584a41c90ce7dce910805ed793c9f54e4b515c6cf2f8f4c746051fc7ebd2d54453afeb47f1b12fa6fccf383f7b5c7015f6574ab7094fe9b44aae2c51f43b59b5b075711ea0dea4c868e4888e4ad631b3f9f5a499f72c85a2012b911bea571b046aa04716520053ce5d25dc1b49c097408eda40bf856095c92a65a77cfef4b728ed40e37dad43192465fd745f729bbbcc94dc0074488a70f3db0773cd7ff7acd569047e3565e4e40895170ea9e29ac6d690914bdcaa39943d3e1c881d10cc56483a1dc2c4179dee2584207432a6806c8858c9330acc6688a07aef4efec159d752733830fa814d2f820624c3a9960916487e2e17402b2710035e1bdfa46eda7e","title":"796. Minimum Light Radius","link":"https://binarysearch.com/problems/Minimum-Light-Radius","question_id":401,"issue_number":43},"41":{"day":41,"pres":["排序","二分法"],"tags":["二分"],"whys":null,"difficulty":"- 困难","description":"本题和 [719. 找出第 K 小的数对距离](https://leetcode.cn/problems/find-k-th-smallest-pair-distance/) 类似。 **因此大家也可以用 719. 找出第 K 小的数对距离 来打卡。(因为 binarysearch 现在 down 掉了,可能打不了卡)**\n\n```\nGiven a list of integers nums and an integer k, return the k-th (0-indexed) smallest abs(x - y) for every pair of elements (x, y) in nums. Note that (x, y) and (y, x) are considered the same pair.\n\nConstraints\n\nn ≤ 100,000 where n is the length of nums\nExample 1\nInput\nnums = [1, 5, 3, 2]\nk = 3\nOutput\n2\nExplanation\nHere are all the pair distances:\n\nabs(1 - 5) = 4\nabs(1 - 3) = 2\nabs(1 - 2) = 1\nabs(5 - 3) = 2\nabs(5 - 2) = 3\nabs(3 - 2) = 1\nSorted in ascending order we have [1, 1, 2, 2, 3, 4].\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2b961633855e9b86f490a6d594a1f47177b6a20079dc775081d103e7bd46ab345588da281edfbc3ee33db5ebef22f870696a969bd1e10621cea0848e125423ec30b695a81ed310b036dae6adaf8833488c4a21307eeba0d1eef85a374f49afbc2e78750a7b23a3625870f52afa26a3b84677510c2150f170e3334dee01b74b450bb660241b45c1e03c7bd48bfd3a6e76190761fae32d564e2fa5821b407540ecf6930e1f703b8850b05ddb1988b09dd1529c0f4b93e04054eb69dd48751d9f9120f0d0ebc299512bb48987bdba0aded0e150eaf9dd0d39a882f9a3de86ee06095ec481fe7b88a827b4233f0f3ca8c26741673a4ee702832178558c5c073cd2932cc3386daa2ddae1a44498dd08b10d69fcf70b83ba1a884eae85d303f6e92240f3da0c308a4c40dc6f16d51cb4759786601edda7d2af512fc61700148f453c285530406d438218be0b5aa2979611143e12fd7b5db248f45a6a345471bc931aa169be6d1834775871f83eace7de2b28e50c3f085a90a74a11a35c6475dbb407f99297f7b910dab32e4ecff7f6e805a883436074319531d6c4261495c8d147f4608ec0e833da77200a6eb16a69a9bb891082e7ec1298ab9a77b48cbbfaa4f48e06a6241783a9d6f54dc153a5e1bc52dcbd391e5ac7ef4bd2a28d0a384f4c95ccd39372e3d164d4fd4b8378909d7f540bcfaae3a44f800ed1149b18750c5292ec55535516b8ca3cfcdf0649602a2f5aae201e2e526b5141fb8d8009703477fc99aead97d847a85c0df3efe8cc6e9dd0a7dbdd7e6b130e76eea4f496af18b1a1b638d90bc4c07ca81623deec7d44899e0271b6c4557b66523d7d28e1323babc06d413824507a375aa8f15af1c0b9fe84d1888e7d05b4481a33a99ee306c30a391fced7a5248462a27bcb5161da407208904097f13692cda62b1b5f7eafdda8f61792f44cb802262055e432d20d50bf064df014d1c6f76fd37e359ed641856d764186dfb1d71e95e673729bf889e03b0b17ff43c3c28cbb450685d0f0ab854ede63480ab92efdc8d9fc1a31c93861ec51e99fe67245be5cf851e1467a9c44af922809407ac629a7bf275c4b21f9af10a0b03fb0b3df8620c522e94fe2769e4ad7ee7b0f5cd7c4b0553a3b4de682c3eba9b2c5ed80b913580ffaf0e2692a42d93cd088c7bdd26974b47cd9f25cc728d527220b26103c6e5ff81ede474d0b24d3065229298fdd1258ea02f731f67a8cf771d77c3b9f17d6f2302fd8243a168cb4d3582f1e649b9cd469605b787f5c7f345169a1433aa1c677f6459db56f16a2420454a70bfcab124b445b3aa643bfa967fc5da9cc53ba1a0dddae96757b3942722f0d6e03808f2e6839544ed164c8963cb6643b3060c66c3a414403ecff393cb6061fda370408a5a88e627bca8e5a51d464998f9199057bd5b132cd05388666a2a958521d5fe8b2a0289b5ba55788f02d062559e8d120d172aada770895be4c3a324df3d5e0f0767759d722ce2b061da7d66575d0175ab1c654b51f62bdfef5268a3645514acf4470648f140a8da0d572b58ab79d3cf2e4301e5f04a8fb679b78449306762efe1738be410d637ef3daa533ff061b310347d9d5bae30cd08efe15607c8f72907ea5c9f4b241de74b24690245c7106192925ddd417e388f0a3f6cd77aa8d04d7eb146f025d16b1c5a204c3a53e71bd8203a9072f40658a9725099bbaf351f9b50bac6a2716689540fe36c0aea1661d821f3985c28ed8f2d55f21fa21ae4ac2ecfc9465390483317c4ed016e7dfd5252489c9026ded9713edfeca672988711021011089839ceb7a450e3547071e7433ac133f934b9c295f2922f9fdd065136c731cafafa173d2f96bfdbb09e350d77c2e5ef5d9d0ffceb4f941cfa1cf348a19d515c46af22332aaa6cc017f4f105fac2294dbc64ecc93bc16d0db083d9d5ecd5e489a675b63dffda7eb155fb4347ce3bee1888222f354b43d8a12969e0455ba81d2d6dd314b84e116d17fe656a05f713ff0bbb73a1fe037d8b7c022d8b3ec7cda9062e251f9b466cf6426fb08c531072244bd51d1cb223cb110af11d62f5e2ab8637689f8f681c1d0030e25b09da5e37ba2ae6a1ea39a6f0ec6559ab0dda145595a6fd47107fdebc13cd0b2b6bfacf1322f178f0dd32ba97a6c2ae67009800ae1841932e0af77d40a3b933ad4d0beb19d551c67f3469f71f8822a7056f13666422c0f31442b830aba17011d3dcf50d0299da84bbdad9ae0e3a7264f7cc8aa657d32f7af94982d57945618bb425b557a8b5b847873cc0767cc5722be2043d9b7bc1a0f0271190aeabb12edd64f1997e5071ea35dd04b0e6d632612ad00cae868aacbf2d41db352f5356e77ce71da38b41cac220acc0f296fe5d4a17e9970e5e0baa47d8b2fa9df1d694fa512b36f27393aec2505e1d92d4eed9da5c520ca3585862f5b727639e95dcf973b69d348219e9e198beb534b1e0390b3a464f23730d297997e030082db407630ec2ea7399d8baeeb3541ea0686110387df037bf259e0e0ae7e0952d1486bf5734f4519e67292e2d05f0e6db70613582b43636ec8c74179fcd76488cdd56add039c02b2c17cb4e96cec165de5b1f397a50ad4a3cdaa642494f0e211eabcbc7590a03c03eb1df65d39c6fe5b7b78d35155ad2ae077346c7b02452536e5603f4273b78231b690ccfdf1db3ee8d0eab5c7e8096dfeabd395e92ff54c5d0efc6523d0785f1cb8b9ef018de4301004e1bee664f2d1402203e29e2b0b73ff6517fc05022166751718fd8bf3e575b8733df2cdb833375c32571b09eb43dabc4e1fd593f9ab5d8e276194e8ed85cfd6ca534c7d8f8a681c2ceeab34ff7df01964f3113d57379dca88dabd3e86e66ca66c894f846ef550ad6a2d6a1a5f96f3feffca518a4dd2952b9be67b7f2c0cee60ffcd56f54956508631cd463897f79f90603a54d2aa03281892069db6f7b38dbb266a101650678abfa6d1a92b719e55c04a34acfcf2ac17ab4518135e0939132be1a6659e2cea12b05da2ed5f3c599ceac6d491a59a29cfc37e7d726d8ce951845b55c56ca264b405a7866bc9ed2cd46855dec0d0348484c293332655df02fd57c8f87d972dd460f6ff6da2dd6fc0d0bacab3d491b3a1c45792b25381c8c3cbf70be408f1f5c91fdea6813555e70f76501ede244c8a5d538efc81a230a571a2c743d93a94bbb1eb5ce79333d188dd5d7485e4289508b5bb3f58353d4258c7203a104c7cab62d58b100e3f080acc0b929bcfc5b0be3a4794e41ab78ed2143c8d07cdbeab35c1df5813004958a52cd73485df2348ee449292d1a873decfced08e4d6409f26f63a3d2ea9180a3e751d26b589b665eb6cadc2dc7ed579a3b5b73ceda818cb3f44a18a35f5b973cefc38dc712965354fff4ec9915a481630b2a79f3ad366cdbdc0fe62b107e8cc2ca8e820a9607c9c32f44ae0e3466049d4dfd15929ed85357bb6714dc2bfe2938d02c405e7c3686e846bc31d7f34542ce9ce1aad3a7f20b96cce0ebc690ffc6443e4619a9972d2ed611390b96d625ea9cc5edec666f9df3733b8c6d3ca913214e20d934ec421c8fe3ab9ea8534725958d703f84ab469a8b49ae1ff6967d1ad2fed095f39ceaa1a5f48560ad94ade2c399a684c686ce14feb665926a4964851b401f71eec3b62b7d068b2336071c51d143790de28a9ca8793668cec6d270b9c7c82b426fe62564439a1f86669bf4d61b445a7992ac854a132e851c94d73c079b9f60dc89b6a471f8279ab27cdccabe49c9e157082822302600452bf04edf298d8693ff18f890185be1c3aafcf25a2b3fabdb2063a48ca6f25f827cd19673b8a9897c23fc286f7a07347664107f87319dc09b2b90ca3f46e1f40a625e378fdc83b8021db5b6c351d8e52b61526e5349642306d58fd4f94dcaa8b3e1d46639f3b56042788c46f60be769cc3fe362c3c41ba9a7323ad573ae894a6aaa29cc66f42d154099d2e4c99a64584da17280c8d2ad2a25a329c12dd9e646f150131f29b6e724bfd17bb6f40a4f72b87e23efb139d558176823fa51f8a90fb8326ed6b7dcb453b53b8d50fe7d2a3795257045c0dd1ed43bdf3dbac280b5bfc5b6a218477bd1e6c3285014e6f442462d8e81578909fdeb2b1bb43cfa27b713b95243aa3c8ae952317f246f5344828df5f36cb4d11ec004d530e5a82a9acfc5ea051925d86f52523a4b3de623e592a3b1259fbfc30fc6c6ca8cfa8523663f5961f32ed62a29dc32f89807e7996ea2b720c015e30a14b4c9bedfd450acd64b7e1103239e4907be8b7bc8d3ef75350f9f6be43898458b51c7520abbb366c8ea4b4f3b936b9e066886b4ddf0b69779168a343d2754753a052a2b80f9c772925ca4611813ab10dc9575660390cc3ab9a18265aeb6a8cb9bafffe7f7b148765f635e85b56e4088399c824b47bf0565a5be1a3d361b005158b6b96f2667a9e2f0c2713205c84222b529c1402447f832f6b41fb6687692e5f48010aa2a6b0c873067e46471372f2346ce75d3c8358950d3410faf256d0543792f77e4d7c97fdcb8d6bf5dfbaad449732bbb4ed08817b3abb7fc5265f48ba8e728f8d5b1338c3003d569f052fc3597a0b9bed9682bdcd01ffa99ba118c4e14cde51b497b35ee0466c82c53c4194caaff04518ccc06b21468ac0456b1cad0b5d3f6a882ae3e06f87a1f99921d01ee44b920e08b888db3753067f7f71a640380b2249d16417a7aac4f48cf14ab00d830bf105ad553d0a30f26932560aae75487ad2b8b0b8f2e71fa803e7e70992e273ce2400f92e384b3d000f9860fd83ed6530c8f82294276551d15894b9ebcc2ee507d04cfaf303d49fea71df66a022e36fd8ced4f6ebce39f2342f9e8ad84dc6812ac5e2149ea2f78d882cf923cfd349a3bede47221decaded4fb3b26fd8a4af6adf3f3623b878c6f8fdd73e910796f4c7ea3e2455cbc5dd84b3fd978771bedde947fffff71062224d5624c3049297d4c770a7e98d032fbc36f5dd4c7ac27b7bc0c576ae65b7de3cfb6f934ee82c40ca3775d4400a71a890bdc9659f10e74b349677bb920602ce3f7cd8e10f8d7f4f5d0e4e8b32ab68935d345c8cffcce6c2c5115ccd788e9fb4fbee6f12017905c57a67d28eb8f749dee8ed99ad995bde89c3e2c48b170c06fe5f574fa6262b33072147c1d0caa8b31513503adc4b00c02abbabba0680fdbe73ad6da943903cf68982cf4d84f546f19f8c5f78116a314419f019e074bfe832e656f3433305a9a86eba602ce4a28695ef9d16823a4d659d442e3dd632c2d5333755ed2f16f72009e37f08632d76f5982d64f083faa6add002c2a63946ddf8c247b4114d049ef9d15c2c9276f0afb54657b2b9d61a4647f6ea21cd5520cded167a3f86c430afdbe8b765b6c47244ac0a33053d9588606eee468077eb167e272c32bf0ac4c617ed6980d55d63d6322b36190d3d8ee3cf1603d5509de62d8cbf267eed7c415257a3ae4381aac4ce681a3556a693c162f76a6ffe1ae866687121fa4f697993ddac59cc0cab12cd37a8150f5a8de427fcf1e5d698a1df15c84a589d3fd985146dc1ee682ab9e1603caa80173f7d966b39c5f2cb7676374eaa657d48f40296a3157d1510ca241198dbe737fe141c039b937f7166857a39ccaf18187d02dd16b148ea610ef5568bc929c93f95e9470220f052d03ff156cd819976037c2f5f27a44084ee58dcff2e145916a1b0efc94c8849e84d40c08fedeadb40fab82a39cbbf21ad2ab55cc78af5c3153efddfe7caa7abc1f89478e4a3a93b8ae8c400bf7b686d6c04a56cfb5868626c23c1445a38c10c0dbe9f43dbc577c19a6ac031932794c9583cfd160ef43d2e63dc53c7c147786f0809f764c5f7619776f0892b83692707f915d5a8f44653ae20d5b385cfa3a5e88b1e1dd264420420e29502c5d409ecf38f7ebb47d0e46d69762ce5638477dd6dbf9b5db15c403d0fbcb4ea76d1d7d9056744528ae44991b8e5213834566cf47dada1f177b5791c0649470ca6c27f53f6bef7e934fc4ca5e94201c58627c346a7166b91ce8308853cb74523c7c8f39389f1844c454d7daa4392b15a4938eed8ae2368069988dee44fb089e14ec68212478ebbbc3a29f74a771cfde53c30306f9af36940bc4ecf83f275b35b350754c8e244bf002a0dd26be164da67ea2974f5868ed98c9abf2753cf08f6eb049c99a962467f78eb3771f6cb9e39eb623b8f1fa081f90514f4d4845bf2737caaf17e95387419b50e415810105f8797f83f8cdc3ecf98a1ff5cc58d6f920cf48ab4a44a1d70b9d467368d357d50ca00f4034d77413ba7b085f2704035e23e50c7037b094abcc8c79f40218f3439b3e7b666db72d362273c35493ab4d1763610b04c7db1d7f05bb28593cd6ed20f635973e5a1c03a0114b4b7ce1c70874267dbffbb5df65bfec6461ed61c912f18020281ffa45da4dcd4b0a40b5ee1151afd32fabcb07b75324700b6a95db1b5846e28aca20c263365616e5449d9a955c1f791dcf289475e72389b2fad036efb1b84a3ea741f108bc153b9e8ded2d6e0538df89010880f1dde46eb8dbf8a91d8ef2df749124b1e014d09b86f6cba3fe4030f8296a10c791b60c0384eba24bd32f2b7306c7d45f8e15d1a16135e314acb1d2d40ca9461a6997d8acef1dd01432b43c7e35b08d89d1cfe376447247d1c0c161235ca050ecab7a82afdf4fd5905e9c66c638ee1742ee7f9d6f8fe76eaf54ef982d8938e862a38bbcb1a5f401cb2b308fedae385f8e03fdb77baac75ea05089ad0c92e962e048fed5112632fa3843f62fb21d97c7d1d96f4fd31eeb0e21fc464c0b8db66711e7bacb04515c75682ce5670237c9aa0982a22e0c4b6ff2bc2d8abfbc05f4cb87b7ed4e180af9cbfae95ae335cc731e7c5b22462e336205570ae6f4de261e9fed512adc3cc9fc628f9317dab3e39a72dca254198a4d59b69bc02f6bdf6140cb1f66b85820ae2633e9403bd9bbcf88e1b3141f0ead8f94d5e3e30ea3cfa957eaa070c633087359b09e54b7ff38fa8a78beec4a71104a56ea954df2f5a2a3d239f1ed0806ee91021ac13505be688d34b398371a70b1c7bf0e72dafd83e79afa186cbb4761d6cf60e48d50bb1ee5d750fe26876cfc0058769eff9d1ce49ec1fdd188d37ec7c6e9ab73cbe5b5d41edeba262879bad5d35d436bd7c6d8327a3c10aedf5a6f696db70dd98b97c76a263c6062929227d97e07c7288d3ffa8827a9cfd82394cccdcceaab3509ab857ca91e2d6b1e13ea2a43d01140b6c2c4c4028e839c6a25a77a42b0d6edb66e8e98ad4c74202a4819601593587e66111a530a7e23568ce1f7f1f14ee54513b877080c9891ad9a330100879642c500ebea49e68e596e23b8462434f707b25ce4507e34f7099c1d027fe78d3b0e7df8e6abc12deb3926856f02ad239728556093d5173fdba1a0debd36e095e5f6948c93a7252440b40c07e46602727063dfe14642c3f9ee8aefedc3735d7514a650cc69628ad753d5cd0591b815d46a8d76f4eb8947f13de531b6ceba56143c406e64216f2e0a7ec17556a7df7f7f38cfd103010cca010e1af7e500ea45867ce8804b46f6508b7625ce5ad8454169d1e26a66977fb36723899b15a0869ee0e8ca6b8cbf09edbee52c675b96496aa6cbcf71ba2ff7851f2ccddb68320bf599c50b7352dbe603fa9cae354039e7284c3d2473f0091f46486fc619daf128062543d848c9694047620fb34db936206556ee180d135589415e036f6901ca48b7df669d00594d83e3fc77573d2e6a05e8d088f2f3b721206ffdeabb2afa24a72d0936dc366580718fbb792a5a7fafffb5f17009cb38e3b93d33bef02fbeffa60f63dd9b8cdd1237fce2fdbca06f399d073962b7afe0e053219671267bc948b0f8ec24284f49e48a9ed8c475d02e9145468115c7bf109e533ce92afd5139385fe787d05df41fbd9bc57b22ed41527e3ce41e18a389e50e1cd6faada57e0e3ac8be9f92525737300b9fcf49c50283a83af5e1be57a8dc439128d86efec28822f49da199c818f21ee91002d444d25a49428436c347616785b98a9225f2373a361bc7bf8d37ef3aadf3a9481c4fefad97dee9f95de8e3f0d8f18d072df178a7db6733a33e0e50dcfa0f74f94d93ef8f24ba00a8f13492509f5313800a6c3c52d81437c9b427a3ba7c99c873f9ec97a8bbe51aa85e3da167949b57e9cbb9ea4bca70244c5e7720c759a2953c960de54f788f15503e363f92a5ecb8f6fbb2d87bdd02774b0ccd605f2cdf407d1742da969e17291bf4dd654012766ee775ee47932952f0dabb33d0c1ea38ec5d1bed2e01885080b22df6e976db73a95bbdc9a78b34da9333b63951e8b2577a25dd1ae4e837328acdd7a254da6c79b0e2c93224f3544abc1b879946c97535197d1469638acfa4cc96e0bf596c54219d4e4f552bec75f2508c01b0e759995baa3b8638c9bbf2558ecc1a75edf4acfa607e66e7e735172195c96d2068ebad97cd7ecfc62194fb194fdadce884d6e9ff3f3fad219539c27427be62490618453ba1d943019fadc6a2dd6fe30a2a4b690a214fb8284b2c6c7747787f2d8e3766d35ec69a34c2f47edff6ea51365afcdf456577a97160baa14af4ce91fdd500af7a1875aa44c6201f1819cdf4dcd585146e342bfc88a60405255eacbc2612fd283fcc213d3db8eea8dda1dc3af89e5992ca213ad5679bdf3293e8720ad17172a990fbb00da0cd8e8354897b7e76600244b4353bceb72b53be034b5770af4851581b4ed54b2b9449049dd617c28542829c7880d13f73a830e69be36ba204a67d6ee3e961f613a8d4db75310e484f80f1489e6098867e7aa66db7294ac5cdd45224cda570b94450b698f7cf9feabac4132580963532da6eac13ee684b2a01c1c30491f42d821a5834ac99800bd60c5f3d9f05bff71fc026a0fa3f8f4830420f84de5279c82b4c9883e55e2e2107037607095c5f113450d7cbcebdef4e805a0ef054020aa4b711b3bc6d908812ffc3be1111559b903c78953325fe005ae10943ca67d5777baac30f755d7ab548b7516dccb5e031d91687a8af698419239c4e0267f6bdc9222e253cf31c2ec077eeee7162d069be608db3f17f1e5b7af7bc83e0e70f9f0c55a45bd600fd2c3be017bbd6feffd4ee638d08ad502403bcf3c9d5091a52ad0eef7e4f6d0c69ff342179ed752da7ebb44898402c3327b7a77e9be24e48692a6959592d001558279490a238f0048036a5f990490ae2e4e75b5ed1fdb7dbecd36f22f175be59028f67be0e58cb3851ffeb7335d035994258c3a4bdc30d397b06b192d7301de70ba8c40ea16a327197058c97bf47c38d5ab401fdbe61994606260618122c8d4dd82d3de14bc70f78ea1af99278248d319fab06df6928dc3819e1e7a6aeef5d7a8332f0c2e763fb8ce36b01abdf254b4c2bfe5347d05eaa89674235584ac661f50aa4b61ce1c65d59f1be57b9d3f60b032688e57f8d0340afdf62284f5f12393a2a52c828782bde745b7901c1070821234c580542a73730af4a8a16730aed70e11af1da61dd7c399c7c435eafc638bd5a7060c5e2dc965e31e369b97d943e5693a6aae77b33570804e8434cddee42fd44d168be5bbc81251dc75e835a94302f1822c0f0be6326619af46acff28c96d84034965c6d966a2c1b7a03b1e3d43410c56138187d2314a52e3180285cc1cc43a6448045df02058e9b97ad8bb677f0050b7b46c4404a31814aa95385512d7df3b41fa816a41c18270de93e76670c65f75fe5f55bb6ffe215401daeb0ba74ffd0390318577d1319b4e35eb77a1273b5e0cc1b1fff4a7c12b5ffab11a130a3f00254e4b954a55efdf216e5946a48309e0eaf916acf63c18d81c41f3fd05f432936db33b9dbe6f2e29bbbd59d9fedd8c060d893a696d4a108b385842e7b05b9778320743d8cd00db6abfe63741f775f30bfd364f6b0edead4adaf7ff278865248ecffcc32d5055f2fd37bd036991fd6eeb7b4ae26f1e4d0b459646615af39c74aaa36c38fd4cda51f4d5fdb1c23139a732b77356dd35f3586a2054dfdfda276c3bd782b999772a04882775c923a2bfbed0a946b207c3742d8a4","title":"822. Kth-Pair-Distance","link":"https://binarysearch.com/problems/Kth-Pair-Distance","question_id":52,"issue_number":44},"42":{"day":42,"pres":[],"tags":["二分"],"whys":null,"difficulty":"- 困难","description":"在一个 N x N 的坐标方格  grid 中,每一个方格的值 grid[i][j] 表示在位置 (i,j) 的平台高度。\n\n现在开始下雨了。当时间为  t  时,此时雨水导致水池中任意位置的水位为  t 。你可以从一个平台游向四周相邻的任意一个平台,但是前提是此时水位必须同时淹没这两个平台。假定你可以瞬间移动无限距离,也就是默认在方格内部游动是不耗时的。当然,在你游泳的时候你必须待在坐标方格里面。\n\n你从坐标方格的左上平台 (0,0) 出发。最少耗时多久你才能到达坐标方格的右下平台  (N-1, N-1)?\n\n示例 1:\n\n输入: [[0,2],[1,3]]\n输出: 3\n解释:\n时间为 0 时,你位于坐标方格的位置为 (0, 0)。\n此时你不能游向任意方向,因为四个相邻方向平台的高度都大于当前时间为 0 时的水位。\n\n等时间到达 3 时,你才可以游向平台 (1, 1). 因为此时的水位是 3,坐标方格中的平台没有比水位 3 更高的,所以你可以游向坐标方格中的任意位置\n示例 2:\n\n输入: [[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]]\n输出: 16\n解释:\n0 1 2 3 4\n24 23 22 21 5\n12 13 14 15 16\n11 17 18 19 20\n10 9 8 7 6\n\n最终的路线用加粗进行了标记。\n我们必须等到时间为 16,此时才能保证平台 (0, 0) 和 (4, 4) 是连通的\n\n提示:\n\n2 <= N <= 50.\ngrid[i][j] 位于区间 [0, ..., N*N - 1] 内。","content":"096221cf5b628be1e73e8bcfe626c7f3f93f24931c3385f35f5a3d7d4a585e065595832559eafc0a2b0ab97bed3764d463ff891446a5cb38d746f23aa4faee7bbf7166609ec0c2fc0d268fa687d35e703aab6d949ba3009b39aa6addf0aaa1c0502c821b68a692202e7c107ebed4dad714950769beaf36499e0e357b956eee711c3993e3fd0033681ef86bf530d3ad3aaf818be24a4c833fa8c0410dc0e794211f1d184733f2884847eef9330817477f4fd6c192273d7b3fbd599a6436892f7707bb17936e0f8f72afe740ad4ae4babf5ddd79f3d8ebcfb9632b86a9a79d7896b7ace00294fb6be0800f4bb299a1fadb4e7358aed7c92e26382e9403300230a8f6698690a15fef1890fed102cb435e5bfcd7b311ff2f974b9fe3c5079a855ab15d02f68f52ade4c42fc9667d4aea7223b78a733aceb64bb6c14b939c42e121b4620fa1d44d0836cc3568c85ccbc0608fe2fb3e560128d44cb92be2b5dab0d15b47a3e92dfd823b6bde90fb6a2b7de9ea242943b764dd4675263bc775eecfb46d21b1bfaa084997a74934a0706675a2a546f7fc51999d71b8945904c3505b5e59feac18da327767f35a0fbf189af8d95dc3a6c7d2a96dd3007d2d29c4530de6bbe66f9da2881602ec8a77beb6a0de8cfbb2542ded9f8383dcf54dc1977c032c81527b9ffe9217408489b4ec602e142aa79ab3ab0ebee6268dfb2c04d398af469bbd6d453f44ca2dc25cda759fcec5964403c5a7f79c6379b3051d8ab9b1bce4c0e097d329b0aa1fc34c5a019595bcae3d185c695e28c36e9edc6235264ac95d5e724f50e2bf9f96f33a32261e4ff22d795ff644d64e3b9422c3e44e7191c2420c5a933b90eef2a5b4d0ebb524a1d1765df694bdf6acbee0bc6c2c9c71146f757f124e1ebdcc04a0d6885b1552c051fcf2d86c222dca65a66da84ca1ce1680decc51c35229eb13623ebd8bf3e23b7b2f1cdd571eae30fedfa2a839b11b89c240d58b33c1581e5afa0d92ae1167ae568efea5444b670796533491c76c3cd3cd7b938c2aca5c17333b86f16f500349408e64ee868a28c9370c0e3c93c811b9d637d06e4a76959e528e20d915a6fe4ef9793eda888c83569a562ffa9e8d84761d9a1478a438767002e661c605847eae38fc3422a69d941a5530cfd6e69a72562f6d48514a155854c1b99e1f5266a6dc853ce653143f302be1e068b54d6a8048e812a1d6eca5f4b081d5009810cf99948c1a92c0ecaa2a0c84916dec4fe676d04a52e111e1a7449a3b79dea50a84953cb4794ec5eb94e01f6337a7f5fcb3c9d6b0b4d0ae09cdbe7413bb7bef552ceeda0dcf044f9d8522540a5144939d2e8f1005a44dd51c3fa12bcff815476fb38dfcc4b3db8dbee80312e1fcd4bcd472ae483ee43face0f5a667a6baf78eb56735b9b27dbca8139883b133290bbba8250bc9523621384c5b1587bc0439eb4b6c8e134188a8727a1c5bec98bc3275ebc10c93934e108a73b9a933dda55770c3853165a7e2de32fba9b9fec6475ac70b066a2569c8ebf0753c654cdeb45ed94e581f2b4548f80a020b46aa1f6102d4076fd2ae8c0ca5eef1924b81c17e5b4365d5e507c24d30c70a0a72fc9af437f2c5fce3f4e0a1d6a5275b6a2b16a9c0ff9c0eb8c8e74d2642d218af09f0f0a8f86971f9041ad1132a043e73442895b02abec1c718795538fd995ba4ed491c240773a3bcf82499c12228f88061d80351145dcbd20a94153eb105ccdc74951e790200dc6ead5febfff2704422adfdd9dbdea7c7b4363eab759521a8ec9802e63b2fb9324562dc01efdfea3b29bddfc4de4c940efbf4f34e28bd61130c2b1ca79a9df059470e204d2b037433a9120fbe8d389996a995374974652c6b72149aadb46d1405fdfe9900e06ffb7b1351fbfee6395deca06dacd5fe64cd04b766cd3db40779f5a787bb908a4c5cc64abeb99354b7ea9a499acf52689e149546ce4ac73ff261f189c5176bae3f79f0bde7a7810dfe55b912863c8f9f1f76b886f7d6e0384890f116ed71e75a9d5e6a1ef1aca33805d836d4a2c91adbb0d547d8bd420d0ae4eb05cbcf6de9d4639a00205bbe48f41492e90e9803c656bc97a52db2ac1f445e31085281c48f2d563b7e77fcd3a3f51d4fd9bb12c236615e2995f5d7bc3ef3b9597c0e8d65948d620f6fed80b958ca7b9600e5afaf46ac9d3ac17978a085b7f67099681203fd426b52cf8310467590ff28a74f13ecf1e32b96c8a0a1bcf2f69aa932ab14100cf941f906bb3c937279270d277213e0eae52417d5b2bf5adfdcd46509c34506ab0b3a3550b82bc52c2c835f5ee6f2d15aa2c25b5a46fe87c5a7f4d3393df5361396d61c22e49f73a802e0a2a9f9809068e10235b7253d15f6885eaf77a2e2d35dd458b035f1218bcf649fefd8737c18b912ba2be8a298b217836f5299aff87bd407c29492c653f3c5295b8cea0f476d7bcdc63ddc873e47327ffc1dbe9d9f66659a1228cc19ef4366c4e4dba3663150c8b914ff000d5efa991aa8f1527664b46f99688fdeebbf75068618dc104ed6bc7e00b824e02433d39a8036c1826fceaa845c87489ee2de510061b76819362b4e3730e5cb849655148e2afaff219b4209fa114ea47b7e83268eda0b92f39aa571b0c5bed76c6cc0a4b20bb6b3fd7d8df43f4ca941f046219bf10163249a6c4cb53ff86222633747007175e124775031eae773b9dd8daea59e6ce784a2fcc0e54069b9f3dce08f40fb4d5c49de092ab1bc8df53c411872cde9251404e7f7a163fd94146237dbda635543f0294dd16d524b736d4b0ce8d7fca230ec2e7797c9bd7c5f3a1e656444c95fcabc063ae6c2b6a95790361984abeac0ddcbc54d07389dc6016260bfb7bb11942688eb976eb49e97582b604802f0494fa949d0014fe75dbada66b3ea99f0cf0e1f7f294089129b4f5fd9502f86e2dd8c21c35a09cc598caea408f32bc9ed664b6e67e0d399067cf4b88c3297496e6a7e6760d4aa8090d1a8514125384caab80e8e40eaa0295c341fb7a653161c4e3d3934170d17e456ba7992428e667e80b5b738657a69543106ec265fa4d588ee7e499914e58b65b96acf1fea2124ad770ace4bd1914660159b32072d5df69cb057eb7cd95373ba648919c85723e64319eb6e594f026c4d70711d59bb09339b175b05775e9554a737554ed0420a479de42394ab9bde1ab2ab0dd88a583d6f4db569ad2e35da128f4e2a6432e22354fe413a32e2cb4d7b935d8919228ff4f095e4c352a5fcb9d2fa71ce1b7d95d696c7c137d20e7676082b3ff3ea3d2cce531d3de2b431b7133437f6617d25718c9bb5639c32f22341fcdd688c0d2b1852ea174d761734e9a38417a7b244445a175f1147954ae19004d899664a168c492ade00f2b1cd01462d4861141e08f1dfa00721a2d3db9b1a941219ed117035d00145e2c7f22bf0ec3c21cf956cff0850f64d6027091b0a15cf2c428726f01046f68a58f25ed0d0b9a03b5cf7ed9c3e9e825b19a5684622222ecdb569e37ac99d2f4dadeecbedb5afaa5883a69dcca4cbffa0f69e4a0fa299170bd12b370bb0ce29eca3c7c9ca6c63a0f04d168c42226ec7ad8af37434c74a1788cea2aab2524503969854fa5f0447908a866ab6f6967d1aceced589f89cefabaad780638ab8afdad39aaa98c4a5c415ed8c6fa65645639c19551671e3dc70cf3e53a55f6c227d08ec272e22b2d59dec373f0e91d748ec23aeb4020015ea4f037bee5e802ce2f25994d90126ace7ed66abc002b594d71c0882a6ad6ae4cfa32ea03df2ee6cb0a7b7cc0b84424e632b696f2f0276fb1b910beb3419ff1cf87ea91da9dace7c6cb5c3ef2314c080417a2970b301920056a4257633ede544a7f992caa2f4a39cae6bb005065cac300fe2c50e5496a7c9f4c6dccae344da651a0ccc1529b5d99af5fca6ebbac3755a576e974a6b482d0381ba721cb4d4d69c0ba567a1690b8547a462548c2c27f4cb3537e5848ee30aea6cc4de42918c650f49645df5c3881fd9463c5d759aee2fc24ee16d7fa839b982e2dd3060eb505da8310e84a01fb40e53f9fe43d51d4b7b73a277684676b65536c0ce9d9e38eb0de63fd5107620ffb8abcb3213ddb323bd74bb97c0b6eaa5abfa6050156b120b6249589cf83dd2ac5b15fb1ca19eb41873eb3762a9c624d22145ec6882872f11386246390fa9eba1c408ebd273852a926dc232bb2d9c555ccda5dc1d2e6c106e605c7ac4edaa99b1259dbfc301c5c4cb83df9c207b345b42c72dcd1027eb0df8851feb8260412a72b43589aea4b7f7b2dcc86ba7d04170260b20a75c0181ba7bced5ef761b0fb167e4058146a955c76f31bab14dc5e3644e1ab9a27dd7f87216dee4b0917401892c2e2a555f3d063f2a88e2c45a8c5292671a378113fb9a77473b9ed92cb8aca6678880aaff80acfbeef29176b0aca5c5c4b30700824cc5ac012b9562c6306bb9a2fb80400550defb58401fb986adcf1f692faef2a4b709eb421166f62dd3b92688674496edfcae1ab0246a09af305fdb665c192e3d5acd74fa0fea4dd03df7008b1f6f366ebca8802c6659d4462719cc6892ebd52f2f3b07c07fc34ba2e1e3ce0502dfdf314746b18dfb1b81e7b6b332fe0d5441d7bcf1ece01372cbaa86110e7fc5856a37c0da09497c03e20057c53f4001e3ae2328c695d3cf52fa1223f50af4300c0f37499dd5bdfc503b8f0036c0f53b664e821afc4d8b898bb04a3067edd11a4f3c819e1497076b7a70b44f4ef916932cd92682114ecf53d28b0d0f9f257694e34e81fcc4dd18ea797a90dd223d3788daebec1dd0c7453d13365efe2307d822ff09a66baace73c9e4c2cf822b96012a136886f1f60f28e7d3c8694e960c84276e776b5e0adbdf546358ecce3e112f477ce5db4ed8e2a420f892d1ecacd779fd37bb1cecd87ace599d80f8b391adfcb249f499f2f8660b3e62b50e1085e9106fc8a4a54e7d99c3509a97153f75ab9f9a6f5e798a137999d0082ad87b172d1c1761092253379ad766d98e2613dd4049c39dc59c92ab4b8fa6660379628b330e0af260eba0d3e66cc412e25158924dd6b525b2b0f45bd3d4e342335830d63d18694e57214615e2310af0759a076f0c0bf5ab84975a5f663e37af76621296844ab996309aa1340be464374a0c6e1c69516447e5e1fa11b458c4205ad83c9d803fccdacadcec8c5b14fce6acc611547f90aea1b0366398ca2a0aac0d4b1fc5d704f364e65a3383d4ea13f20a6b2dd10782842faf5ad392396fa6bec0ebb0d2f514660ae241ce829ad45e7314eebd086d9076eaacc6a0d58f88b59bdd2245286e1c971f9bb146d76f59dd834d0944ba17c1c5b8b78d0ec3dfc86d3d07db4ce52935a40652abfbfb39c6abbc2bb2202f8cae810a8cd51c5993821ce9856c4e43f5eb81776961417c2ba6fa091a811e08ef0836ddbeba29ed24c555ee501583fdd21030bcc308e5f3e06ca4591d5c33f81cee8a90ae44a6434e35f36c1211e62538622fa3f060dc655b19f9e1b7cfdbe7bd2a1b746b1ce8538eb02c297756f721484215da886c95318186461630daf509abcda616b135c40e633c43380892c530c4b486abe7441f4c22a3b55f68a228109a8338a3f8b8683bc04b37c8b6f880db35d9986db3923817b5d5418457be7c9f51d3c0dc6b124b365d7542d123e3a84120e6181008bc5526373dc61eb6979fcab1fc7fc9b413c875e19a5c6a6af5d8abc7071858345cc054fa8ac8441b0f48641155b9cb0a39d4ca04e5c8e7542029dd590a6eeabc6dd6f69c1c1b1eb63f82159d5cb9f21336dbfae08e404287c68abc811c17e59ff6df728a735a56a3ef5f849ef3de17fc173c49ff864055732a1f95f0809d35bb0a9da827ef6575143890b592da76571b6d153b304d86f23acb117891075a9521373ab648086c54b71214d7feeb852e140a4f0e3859065d409e8b7db1ebf7325b0882ba69d557154e2fd2d4feda891d804a96bdc254da255431d556384534b344cb01ed520e8304289c47c7da0f3d7b1ad884648970c22027fe3f7fa92c9c0ac4913a94725d1625393c7b7d66f559ef7ee90e873d2c3431c67d349f0848c444dec08e392b15f3dbc7a1cfe257fb23e58de344c873ca69a13f65603cadecf3889f74a771cfde53c30306f9ea7ac74edec6f83f271235b84d755da4244bf002a0dd6abe0b4deb37e69744583889cbc9a0ef7576f0826ef963c9c9d36129f793b3245a38b1b8f1e276eabffa4951c3290a191d17f1277be0c95ba941ad76f830981583354cac1e55a4b8ecf8bfd4f035b6801985aa20bc4ce7140de889459e1d037dd45a9907a2462f70d7790df87b09562702045e6ee8682437fdddefc08c30ed1e51e70a9b3b352e70ee732c5b369748c3ea04457f284550cb961d7551b836577080af73ed68d275591c47cf521f042efd914d377232ede7b5d731e2bd372ffe4cce19acff3c505abb119f1fc506434dfaee0714af8635c6994ef35d7739512f9dd21b5546f38a962ec22636075fb144ccc6842f1f671d887add319c33f4bca9dc20f9fcab6033a750f154e015629e91ed3d67056a9a915447cebcd2e122e09ef2a91d8ef2df749124b1fb1784c693ea82abaf580dc35a3d73a9e1fb2608c9aeea24ad3a397d45d1c5399f1f85c76165ac47fff8909800e7105772c38ae3f313cc0968bc6f793ab8d68cd18bad3344304dd1d08f283e17ee28fec50192d2d15fd38448c06f8f7bba0625ee30d8758ff873a153f4972d9a1bf348a38bbcb1e9bb06ca2b7b96f1b3250bd647e3ef34f0860aeb4484ef580e1be421eb3154d9c9a8229dcd28c4f3269ffcddd9a9fa76d95f863bfa5b429a454aacfa212f01e2cdca8df7a876fbd9bbf8800982a267421f6fbbfe7fc5e3b057fb989aaafd117459f186b3fa1eaa2189781624573e1f4c3368100409b2ad9a4417f2bf186ed567bfa062cbd544d2feaa893695b61114821655aac2a22f3b903247ca1771cf121afc6277ae152ad6c0c2b3b2a744560ea88f86d2e8a124a8cfb85beaf6399539136353e89e18f8b636f38724abec0337525931a3d141f2adaea38b70f7e60220eec74b49d54b40fa648d21a4852641259b84f05b3c8efd9dfac8f45713b4124bcdc467fff41ff748a0822c9165d323ae555f6ccab2cc55e7a2c2d99cdcdf629b90e7e127df9da9825b9dad263436a79bce0d096db981977b70605da6fb09263328bf04c2a1de893e26232f2dc68a7eb6394e8920c36ab7db67eb9b9d3fd0d983f0c98c436dd9c167831e2d201e18f72a528d5e12b6ca8d8a5981ca9c6728fe2f06bc8eb4f229d1cfe9532a203e4954314bd73b756d181a416e2a231ac9a7a3f1ec4ef54913ac711d44c4d8fece7d1e4dc9ed3cde0da1fb28e6c40b69328e5c222ad955c219ec596563f54bdb510225abd57d173cbceeab846ae43f66eb144bd058867f5c7bb9d5173fdba1e990e96b8dc0a0a5c78c8ea7693243b4105ca52702277e65dfed4b0bc1e8b6c0e6bb8520063a51ed44e62e37cf8400cfcd488fb476982f8d7eb8eb955ab829ec39bdabe9055d7e0c2b6c6f3a635972887c57e2c165373899d8462b07ca095c1afae54ce345897ca8d2260ea2509676629b1f8b165a4398a46a6ed339e06f2b8c8c5c8a9692e0f8c66bdaf65aa4eaa0242e1d851b3ee2859334b256f78e1f3dd6f168320bf5c4ef0b7352dbe646b3c9b1320475af6e093d242eda495f066245ac588cb028386a42d101a6435b2d2245f21bf81c692806a14a59131fc817530d273d05cf02bdcf4ca6583f0cd0b0fc0418717b3e4ca79ed583d9b721206fadbff966b367a7320e3195316f882989ff75255c0cdbe4d1a43d5ac738aaf7696edff92fe5d5a60f63ddc9c9894704e0b0f0fed9616ad2553040a4e187f31a7a965b2c710ccc1d3e51cfa381cf60606b73338bda39bb7f50abd37029d929c7f96dce75b89bbc8732250dbff06db5bbdc7936fb0603fcf34697f87b0a29cb11aa876930e44028d7a4a082ebd490ddb13b09f565c7072fa81d343d8e04d46cd3bf2dbdb085c676b0dc2470019f0a8c2ccfaf11d47d99e9e0ae3bc380e8fd05404a57e01da2eadd9a5d2442a3147c91968e0f188b73401028127c9d6ce391d8270eb72db62aee9f67f4199ac8f04776cdf3349e737961d2ef64e4a64b13ab53d7d670724eb4af2483a04531fc4f129a5205e860350a7c7551c946c49164cf3290358fb8b92df16eb692d5daa9dc6cad6950af3a8a0facda5afd95b1b1eb071928205b3e3450b352b7bfc4b957dcb1af10a457","title":"778. 水位上升的泳池中游泳","link":"https://leetcode-cn.com/problems/swim-in-rising-water","question_id":794,"issue_number":45},"43":{"day":43,"pres":[],"tags":["滑动窗口"],"whys":null,"difficulty":"- 中等","description":"```\n给你字符串 s 和整数 k 。\n\n请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。\n\n英文中的 元音字母 为(a, e, i, o, u)。\n\n\n\n示例 1:\n\n输入:s = \"abciiidef\", k = 3\n输出:3\n解释:子字符串 \"iii\" 包含 3 个元音字母。\n示例 2:\n\n输入:s = \"aeiou\", k = 2\n输出:2\n解释:任意长度为 2 的子字符串都包含 2 个元音字母。\n示例 3:\n\n输入:s = \"leetcode\", k = 3\n输出:2\n解释:\"lee\"、\"eet\" 和 \"ode\" 都包含 2 个元音字母。\n示例 4:\n\n输入:s = \"rhythms\", k = 4\n输出:0\n解释:字符串 s 中不含任何元音字母。\n示例 5:\n\n输入:s = \"tryhard\", k = 4\n输出:1\n\n\n提示:\n\n1 <= s.length <= 10^5\ns 由小写英文字母组成\n1 <= k <= s.length\n\n```","content":"096221cf5b628be1e73e8bcfe626c734748326920a3d40bb75074c7f2211766808aae07a6e8b9f3a7173bb3c930b2fae5ba2cb0013dfc75646e2b344dae2e935e02d302ad4d8c4f61d20cda18cd05e7179e7728bdbb11e9136b520c3f4eca18c412bc21c6cf8953b2433026de7decef068d9532c3759bec970aab3c660fc18b36241cba3bac4c6b0d625a465cd12a03eab9d88799ecaa9f50b624118edeb95321d0315481af761c2f4caebfb936e1d6c01a9c4e17a323c60bb13e86c51fa2a0054956af4546ac470f49c712b837c1d72b70ccf775424978f074e82cb352371b294a2cc2795ff6fe2a2334ab785a1fbf1414d49acf2ef280220cb22acf58d42edd70ccc820775f30c457c600ee3735a71e9da832b128239811d92ba1ce8d74b14beac6b8e5488e6ea292cd0d28050256495cb0d119edc6ac09a4206729a0ca61012519c971328516ba8ac47dac9d855483c65d1cea0eea542d35bda13bb9a11f8e540797bb78f75de40584011556097973685ad2cf5dddcf75a64f1329dffde3f38e50d1acdbe1fa46b30a14559b1542fdb7a2294d39012f1af2d5ad13305650597a34c794d328c04d6fb341bb8d1d07dcfa5ccfaa850d00d5a342aff7d0de98ae760a9a48828288110956b0b5f04332942935fc81781a2e5f94eda966c192d93717b532f0492d52c0f0248e0bb87a6040a352cb62eb33ce7982e8cd3752bfc99857f443d4f0fbba604f8f47cbdd3e11b0083c8c9e3adca68b289024c66313513a430157f5e2a5405e6ccdd23f1e4907c7971300b295882c6cf24731d28a15522275626b6b2ecc9f2786d254aeb5fa0adbb33d99d2524f554d87099ecf89e5053ffd2727b9fb7eba3b4a08567c4dcd35ee98bbdf3a97a6ad3340e3c9e45620315270d49b9b3e7110e33e291a601d912681dcef2ea6dc170dcfb14b6a47582b194735bbd78ff550409d8d8c39c62467262f63d7eb66994f5e2d42eed961f0430f9e966d82c467a8855bbe15464f92f81a5d77e28352edbc1a7599c4d728eec1cc2b97c9642655a24e8926d378829019a1ab4b00afea92472bf939ce82eb5c426d8756be03f0b943bec55e942759600fbba4d475b2f8f03fac0a291f8f95e4ece300a38967b4b09e970f50c985869d21cb883edfbad80d5df13125ed0046282a7a7a2c9a0ce5ad880981355668be4428a705810193032caed4aa64e7faf48f42ca5ccea4984a2deb127f78d5b939793f93993b7874a6cbdd634ebac20eb778eb6308e3573c06e95bc636cc9393702b4754df6eaa8d415423d715f93f2fc86d19e83f509acf65452f3658108277d4ca29b9cca49d2133daad380cda170d70a71c24ebe6510c463e88f524a1bd59840c6b3fb8db9e6c79aaea6c73b3619ad3e53d172fde28a48d77d3a521c51a7bb787cfe0400d67c1068ab96e4eaa55361fec81b3d8a337c2ea17ac5843dc639dd30d18845e7e0c4d847cba3641a8f4ec66856f7889062d2ac36fbe42abb0c05f8e6755a5243adb1ed9feafa9f599608620b67f4e52cf74af8cb171fd71d9dc2032645dd41d088d9ad3acacbec09eaeb622a4ab215edd8984aaad67f645a6ae0e7e975edf72142555ba33074e074722945b43d0bb437fe8fff868f621a360cde40424a93af97459c45f427722427d5cb27a7951befde8ef69cced7507bf0684b3eacf08ce16e6791621b9a93dcd5ff5d4a6eb25948c4fc7a379258c6ad9e904356ed09d27cad7093d839cf270b6e0299db32bc516bf35b76e72551d7edc04a5713f3aef911b544fcc310020a573dd86b4b308d3cb298fa6f7c9f855c578aee35a9a3dc2b6e982659294241a8dcf8d81a1a277d2213753b1dff7823e916934e33024dbcffb1063a2e0624c9cb9b2d4a1fa3a68460bc59a0232235bffeae82c0e48755a1efec64d506b769c438943997472740c491ec1c709020a3c8c75adc908f26d1e1203c925ac777629d5f638d6f9ecbdc4f14af5d23f4ca8a9cc950db0aec14e256a6e284ba381eaaa6fa89de7a08842e9e2129b132221d8cf3a95270e05e8991be7aeff88d4590e457a20ad4f905cdeea848668c28647669f32bcc8b571fcd4fb2779c180272bf3914a3918bbe89862d4d5b96c4efd7f42c1e294b81e51016890d87d778358030441284444c80eba35ae33a5ad2b2ba6f006de129b24a8b330a168c08382d866fcc6830baf245994238dd65c1b9e08ac13c001a9978c71beac75c682482321a36136d76634c0c8370ab91d874e3159804fa37f1b6aab5eec185265342ca9d487b0fe01a636aa1807a8d8a22e78285961d821499a446d3f208acf7fa2e593427589fc2e2ecabdb6262ec7b46ad9164359af65fd67fe70eafc594562efc5e7e8d5d522b708a6eb477a2edd142d0bb1bee76ec684b9a4e033fb0f7e3649522f8a6e78e30ca77df904a2c03be1add3b0e7815d06c2bedd46461c2d4e3dd5d9d1fe68b3e573b367faf1ace976f749a487480935790f25b091c4f99b8ad38db3630afa199350a2a82db407678a96ff73ad697bef82b08bc44a4730aadf50332bc0de0b2eb2d5e07981435df071d105c8f1dc6feb3174f3ff645471d795d3772dd9f412df0996bdfd0bd63cb0abf16e89527fdb067f86c55adb8d997a50ad4e289ee6c23d5f7eb43edf8b632c3e57010f00ef74d6493f95c262cc23f11a52daf703d773a46012d31fb673b4459a6a831b6cd91e6dbf13ee8d0eaf3c1fc092fb7ee8784a033e800085bf44d2ad6784457b5acf04891e9794954b9ede56cb1dd513162d0df2b130ea4423d9d7e4b5c6a755e148e95a1a73bee7a678dcff86e1d255f743e4bdb58ccb01a72f79ab5eb57de7c4b96afa2af9c9986050975d9cf620637bcf432e467ba1f79bd546b2e119d83c68ebd758fe671c33e8947cd63ee1eb43e3023441096f5bbadca1fdf4189943ddbf2666d610dfc7b9fc65dfc630602cf7e9f0f6cce88cec5252657ceeb1e39409c1397bbf7bd96e93c2c175d1e698ea5a2c29c3a2bc842d7434fb7fcfda3176ed5b7dadf9ffc938dcb8c26d179a400f404b9cf3c720d9ca3c6c991b5d36cd5c37f7d536996a152c90b16cd77ec3cb12fe4c93e87e20fcf4255dec0d069aee88dc1332e4ed402a84f86e52f9b7ec44abace2da89d59ea59612c6f6f4f702d6fb20e1e971c6e0573789661b8356f4ddb421c449ae420a1b75e3ae712044686b712686331d547ce7036874d851e7651719d332b95695459cdb10149ee28aa707c939cada7466ae528541041358662d6c001193f5304f44bcc115b60760f939206448c6b7243daca48bb60521dac074cba9ef887d2399b59910d1abdff00dd2d575f6a9f667c08731d88cc996cfd89c6a8ef985e216e9666e39d32cb99616714844122cb36fea9d30a422c44651dd8b040de931be4463f440ffd03e9f1226b7c5e8e001683fcb8bf3dad2d294d4a9d7cbbf4f87467250031ceca0f651689ec219d46f68a5beb5ddcebada01677f2c293d02ccd262cf32a5e4a7211b0eb63b331cff54b59c791c18dd18ac206adcde0eacd94c3c4aba622519dc15f25b64e055ffbdf6f919d8697f1013aabaf0c2ff93a20d29f6fe8d9d934c168148feba884b25d5119948054f0530345b68d439722f9ba5a19c8e1d7aed491e8bdabf5b160bc89acecee9099be2a334117f2be65b4444b54941b431972d5ff73d63a5cb5666d24700af923212487d59cf432210891f348e026b9b6170e1fdf4e024fff5fa90ce1e84697df3a2e84c3e34088c0009097d40509928663f882b79b61f03181b16ff6ca9541c4d2650b3d0cf6eca84609f94ec91a8e9484fe2de17f9d11a1c6c3a0c9304428f8813322c1a7cfb66bc504fbd138b7e9dc7057833d3a17016b11686ecd27f5084a9b3a9aca1f5ce1c3106042364a04533be348ed82a708dfaa705b2232620a24266bb0bb91a77a8bfe91a0815457541ca4d5d644a93a8809e9c23cc360f8f21b89993d39efb64d30467ca12cd9541bbe55d231daffcc9b4e574ea94980fdd8a7060a4c864ee76da908dc3979344ad1f360f1f82ddbce66156ced0a12a5ec259904070361d12c5e0505a2386eff90dc8e7cb72ca658ef7dc4ad3b2834c42d1ed8841abe518f95fcb0ea8d84f8527d14693906496b5796fb3dc4be5701d61fbca8be3d57258335f0d049ae0f279f68d5cc12516c45edf381d6b188ad4ce6b9249946c840a99a73e9c149f8c9bfc7d86c4d643b7b1b21e29dcba0f75db4fa863e90aff3dd94a94ed0b683f99642d6495cd97685b5548da63f203b22ee2aed2b3eb4e78cdfd343a6e34a7f251222b7690181babea3c1ab26135aff4994638621d55199383bcfcd5aa0a9502377bb0eec3b06e18ababba4fe1318d44c1d7c1c5b5151264dd7ca980ca13def5b546bbb6ca789193129e853bc7c15026789afaae4b5414c9baf922d3049252284e90767e561bb47d4bb468388347bdff3a4c189999a6870f3e6d341681f1f82a5ed25260813dd3bc096fd1aed0f3dee5c8bb7666b3b7fd55fc7e1e76fbcb805bac199e8aeef4eaa3bc83c814ee30e9f50cdf996adf9eca82d7706a04b654451f83e65498da0cbef0cd04191392d650481ed774f314f28bc9cf727c9a5bf61ae42e1fcf013277d247fa7e33559d645412a9060f69b056a8f8cd4ba7cd0b445c8ad0198ef3c3ed79d6d658038b1ab73ad5af2ca91ffd47e152a6fc2a143cf9c5c3281c24ee67c8f0b0043263eecc6ef4f2a9cbbdf0126f35b90c7bfdf3b8bd57cd12f871dbe2985a32d97403dc8f549a9ad2d6dba25d14e1af263b8eb544591f4b530a7e3ed0f84c55374012452ad771dc834a418a726eea52985f7dbd89b33834d7a4837caa9b3092efbbd8d660cda43c628237077584fc0d0496511f0c439182d1c38a0c447d7a4b327bcccf2c686d47afdf3209f2b58dbe4271c562b741a113a0e95497c2e37b3ff4e6dae111a877585c3a6d4dd372ca0974fafd8127116b29488303800c37939c9892269943a447e1c642e1732547ec89931b2d62e4798495c89cfd398d2cc22c1d127573c3083604b46b425ade7d3ea7bde0f935311c664ffa823b485bd5eada99e4b33552ed67404780028730815b07459da35964b457461a9fdd59b395d6323f048810960de924fb0de669dc4365ef06d3d094569527a036042c09e9f46f1149728298c6e878b3d8289dbdcf6875b1cbec5869d3b7e7f90aea1f93426d6997e52e2590d07c0df08af60ea0964c68b8e54a6426324d11b82cf26855a9ad43937a6a0c0f5b0c8a8017a43b653e4a59ac55e3c0fa0b10823d535eafe94b097a596b5d7981f083b20369b25d98d0c83270bd283511e10e30add8bedfaa766828c801e7853c752ed206eff2c52aba9be6d93f9f26a90256bd8aaac039794581d9b8559ee8c770f4ef7e3c16c272c21651299ab735598175ee70868ffb9ef2ee43fef55ee5015dea0c93a1abc914db1a9bd22ed7115444abd36ee8ad6e116a64b077ba76c5b58bd25202123eaa975dc335d19b8a6f988f9a0ef635f7d6b11e80bc4b0683f7c0abe304e483a8bbc2bc634d2990c445b88945da384af1fb81fc40e633c433808c0806491e69aeec01d41122289b55f68a2615ece837bf6aaf1333b9a5668d3c5f180927b9f847af6d46b73e1d508844abe6d84519ac0c06b41457a4a7e51d039a5a1276caa005529bc443d3774cd15bf97c4e09baf3a8cfa1d8931a5db12326ea6c4f6c06e5716601d891aa9829b4a584748782301ac825e71878f05a18889582071dd520a7fe6bc34dff6901b4947fe77fc1dd015fdfe136edbbea69f443bc29284ffce5243a4d6b88c7ad97d191ee2bd3ed096bade1cfc5c3c44ff97495c7a001f95f0809d35bb0a9da827ef7f29467cc9aeecb5250313205c7f3c4d8cbb69920c73fc5707dd60287bba05097d0ff65b138eacba92044d0a420e747a065d409e8b2ff4bfa2601508d0ad7f9a281a2a6fd3da87dae36e8029d9f9874ea7475d3dd01c276f7eef169956860a78cc536dd014c7c70f7b2e19d2942ddb3eca6474f93f66a92cc82fc48353db3c0e42257d75382966e859e87dbe5ab12b2c34078d783a9318468156dbdaa6702919f3d988a3c3e255ae219884f86e9a739b2cb876732565ade0d998845ea771899101c30b4abcfb36dd0bd9ece824275b35a44d3e46a46d40fb0ba0860cbe164da637e497471c60e09fc7e8ae267ea3f927846ac09ac46133fc85a85d1f6ce49bf1e276a6faae490586361f4d5545ed6263d1c91be947c80e9b48a450b47a41e9197fc5f4acf2fc99a00feecc11d6e5209c0de70417e69243854660268a14d504ea570c708c530dba34465361464a492fe2727e7ff1c7a39ff730de4358bf52de3f2b717bac552c0873c31dd5ab45532a225f0a8fd7073356dd622c79dfe674e171c73c58073ba0114b4b7cb3825c743b7dd2baa8d16bb1e26927ed5bca0da9ff353f0eb20ab51fc55b692ebcee5d09fbcd67cfcb55f2073f5a5671bf9b5b186cc8e9ba02c21d795f1abb6ebadac4365c294de502d739a670dab289da36e9a0eb2f70a71adb58e95777d7cef7076e0538df8c4f4180f1d5f818fc8caccf4e86a18b26d86af6b20288ce9df69fef9f0970e3294073b7e1b66f198ee1ea25bc3d2e773ac4c121d019d6ac337bac11b0afd5d41aa10d5f71c4d6f9ff5499052bbe3c3729fad285d6c9aa2e44311ed6d4941f2317a97ab78133ccfbdf4fd48a0dd5669f7aba5662bd628021cab117a107a6c2688178bd1ca3c5bcace9e841df622985b0e977759303edac7ba58e11b11fd4aa160346a428f66301969cb36c818b2793a02a8fddd4d9f2d076d95f866db3080b87460eaafa6f6259b0d2cbd6ecea22a289afe3fc46d5e72b11112cf4e97edea7e37ef7cb97b7b6283b11d3cbfabe12aa798973557b0f3e4d5d3368160005aabbd00b58e0a305228f1caa816b94b917dab3e3cd3a95ee5057d10744aad6ef7765982f5d9252768d4654b50133a715768ac0dbdfe1af091f4aa4dd9b8abdaa6aa38ee704f18a70c670477b3db98575eabf32d0ad72fd29c3dcc7ecde2f0fcb375d04656cc0f0ec3906e391c4ad0ad6b22aad09cb3071c08da4374b6ce138e1f5d3f39e7e9feaa85c8f071bf16969db6fda696a997eff5509a31cd6b150282c886f4f2168602a5faa15093e1877ffc7a4dd1af4","title":"1456. 定长子串中元音的最大数目","link":"https://leetcode-cn.com/problems/maximum-number-of-vowels-in-a-substring-of-given-length","question_id":1567,"issue_number":46},"44":{"day":44,"pres":[],"tags":["二分","滑动窗口"],"whys":null,"difficulty":"- 中等","description":"```\n爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下:\n\n爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1, W] 的范围中随机获得一个整数作为分数进行累计,其中 W 是整数。 每次抽取都是独立的,其结果具有相同的概率。\n\n当爱丽丝获得不少于 K 分时,她就停止抽取数字。 爱丽丝的分数不超过 N 的概率是多少?\n\n \n\n示例 1:\n\n输入:N = 10, K = 1, W = 10\n输出:1.00000\n说明:爱丽丝得到一张卡,然后停止。\n示例 2:\n\n输入:N = 6, K = 1, W = 10\n输出:0.60000\n说明:爱丽丝得到一张卡,然后停止。\n在 W = 10 的 6 种可能下,她的得分不超过 N = 6 分。\n示例 3:\n\n输入:N = 21, K = 17, W = 10\n输出:0.73278\n \n\n提示:\n\n0 <= K <= N <= 10000\n1 <= W <= 10000\n如果答案与正确答案的误差不超过 10^-5,则该答案将被视为正确答案通过。\n此问题的判断限制时间已经减少。\n```","content":"096221cf5b628be1e73e8bcfe626c7347d84248a04fb33a5cfdce8e0203e5fa5ba126cb6b71e6983b7c364be6cfbaa5dbf2242c49b6414deb063ea3cbfe8f124fd2d256b9ec38ca1586ec5a48498371574a73d037164857edd3ed52860577de73373814965a5db6569b7dc8e2f3b003ab421c1c6f8cd0924f93c410e8301994094db0c64384d0e3355f42a832e942af128487ee87c68447cbfa72b3eae9aba5e5c1177121ba3f94420617df993691e6c29abd9d1773c0b60a404eb4e55f02b119dd34b900d6fa00cc2e82f34f821172ffd21acf31771a7e667482e04add3f1591ba3ee2097e05aef9b1f479aa9a0e1d2414d49acf2ef243e2e299716310a29a4f27386a7a39a7195477d7f0fd47b5876d8dbb528ff17bf4a92fdc51c858b71975139e58f668ce2c7222cd0d280502a668acb3b017259c808c148809d72eacc37d50cbee24b021c2195dc0ef38e6aed4b6c65ddc692ed8a503fc4471334025f9fcac379993b1bbd8876253c141e2b8fff729cf99e4d9dcfb7b43bd46aecf88661269c502f6f3187cd150cc42c74ff0921993f35c59b984fb9b34705d96f5a416cfeb41c1c78582063b3f7adcdc5d78f03cfdd48b5ea51b66c5c6055d60c53fee1897af6fb844cad0410a16a086f013329649b79d63d6ec0eea135d1ce253656d847fe97a79e98e1228b92e860302c2094a6bfb920bec0288bde17e943fbc448e9c44d266674be6ef33642b556b0e5f4181290c1ffc43b65c3743ed3cba8cfbffa427595d7cfefb0b33d7b58c6a5d6e63c472f64399330b90248d0c7ba45d46d504e7853c8ab9f96f33713121e57c7214a65f447ef4d199020cbfa4c59a8c06f069eec070094e8a3bcd4e99d34ace14251ecbdbef98db2f69d6728ba71286a74480f88f125cf0c9ed586741656d855e7c811083645b64de3309917c0ce64d1dd950ff11877d35a0a25d9d0e58269414561f70470984597d1d8d513e050b1ad30f8d566e530444d9b54b1c55752cc25829a38f8486d2d9769249dc0483cd3f477a5912acd7816040680c17c513840856bdeefb3ac2bd12e07091591f304b5f132d2486d75b29452933dd503a0f06cd47b35f684b08d92c4417bae97d6f86169c61614ef14150a3fb013c76ecc74ce56c65a81405bcb38345cc1b299bb11083a2a2d6236675e22b481e295da41bb45685ff4064c0d5e9778eb698fa1d8d010c844c3e987fff9484468b94d9d435c6029ce134a2534f8c92519b941d5e868c44943e218fd819c3387a07337d90eff990a7b6bebe093f41d7616a5edc6b1e7f2b3aafbac1bf9bf7b35ba7fc55518fcd03ef3c3e31b8f0e56dff9f890b736891f164d2af340479f455f5b127b625f10a29f84a4eca2825b350f3a60110add33e69669f72372306cd77d3a415829366d8aeb1d9cc34a8d007bbd92de322bca6cd6c612199eedcabe4c14fbf062df678a11ae3cd833484801df3868b4df04a413efca475234e507628d141696ba3516fed678b53146ed1a0b59415d4bc421095702a079412dd857177598cb6980125ab4f4d9228a19545050ca477f718c020d8c98e479838db9aa2a3736b8c6dfb46f846bf92357f8ae096efc5e628cfed623768d6a2934fd191a09194ff1e711588b151255dce0b14ac01fa923673349cdc33fa3933e6b057867781b5c89cea22a136fb1aad598d8a2e947897d6a551a2cdc91879720148da4223aae1194f4d1a94d07b409c1aa26d14658a008b1a1abda1ac526964d7b26f8ce08787bbdaaf6dcba9d4468be19cc14c58ab7ab0b7d2cd7794632941ebca0e6636eac84534388ca14a5adca2a7387e1c4b5f8d41ddac5c719292f70071e753c1efc5608eb1d964018224cb9e1b0380d2d3b0fc7eab72e5f06adb88b6d8645a720293f9de443ffc3a7f576e7a1cc1a8a19d515fc7ff22d30a493f0c49cd91378952c99ebc442e391a820d0dc3b3d9a61cb4b6c7387b909df12017ed014a35d22c1f589b8c05ef4370eb84e937b9e2e7bb8becedbd72d4885f3ad659e75b854cbf08d3a7367abf729b0417a40f37b3512a60c39db3ed57569d4436b21be8b1df387faad74af3d41d09d38c95c831ffc94e269ef9f58760262574fd691d37e17602c76b9fce0c95e1c98e74880607b1f7c80fb0300cb3962e9a58538b7302e780a54f98cd08e2cc628bb7d643cfd713eaeb0674d89fb2f3bd953c0cf50a91b283a0947dcc2dd7bbf4ea45615f5fbf62083ca85ffedb7b0cae664fc1b4051b616dc5ae86fd6242b394d6f2a48abb2bd4955cbe1e2049b88c1325194015bec2f666150a3ed469dfe29c1b34683a855e65bfab7d6594c52ee93f46e6dce94fcfafe6a74c8db29b378a6b3cda6b8f62def677d875b55177f816ab2748dffd258df57be01f020a3c36ca6efc46c7215891097212d3e39b5278c6c6489a0ec70d416e05c4a4a9b6c0f9c1bb183534d3e10c572f04a29f8e987baa41cd7343ab7c13cc0945c1ad34b6ac1f41268dc337afd57a2836a1c25b88e824d47ecb3c329a97aec99c92d16c5cd1cf14ac1aa6b798271f89f4a7d6bd1e8dd22a0e84291d8b0e539f0342465cfcaf517c39de2edfbb8e4086485aa5ed74588176f8657de6096251ffd6d0dfa09db90020e1e2d01cc61330827d3249ff027c51f795b97031ad3dc43e975bcfc5c36faeab304bfcf03ed6ddef0f6d5022ee6960c4a1897d30a6e9907545771395d9f2e414872340accb76f666b0be33930a8be864194ef4effd3c3572e33a6013bdf403fb42a14c87242f9eef8221283bfcb59fdd305f38fc4c7b0da93395b5dee1ba9bd8e7c4b7ed1dad8f62d61c614a05b54c7f36452717d8dde1c57c0a6e1858084e805cded540891eca53a15ba1f8e2183c878e1e6c0a310839e8e79ed15239f2aaa3cdf478d18da6781e8b3c5cd2e307d20688a11824f4eeb95de2e38695ce767c8a35632f3a2c46fe55b97e6083d5e0083c2d8776789e791922717690f396427abbcdeccc4c70b61625657f3e62dfd18f6ccb78bfd6490c3101855173c615c116749cd38e942df39b72de56d6301ebde09553d71199d4045c0ba908f0754fb43f1d602a800a021836e25f60d2e9cd47955d1b7139426e8a704b58cda2fea3aa940e5398e56961de72cec601af75a5962376d7d767d026bbb2722971952c382f79774ac37566cda783345adfe28938b99e61ab39c1fd88960337553b85eac2d0fd310a277266a1def32493ab69330e7d043628a52a61225b5fafc9fc1c17488203a6675ad228d993a546f224de242d5de9499fdbb7e06e6ad48f9dacd3b72cb588494e13588910f09084b5ae02c8d389ba8334ac4559b9bd1fc59a9e58e90ce674ecc06f7f6623c27080a4f5fde1ae4cc9b220e868eac36f0ed5fde6b7d10c5cbfc8cf1ba5a488a5303855cef99839d53c85b56e49abce25cafa45b567f24bddaabb5240fba02c4c0af0a506f482b82943dc4ce1a6eaf1a1a8a98078976be979ec7b1eaf3f9afd02ee92631d221596a7d34ade57ea833eec3444ef393e780d2a8c6cf48305e0a1d539bfad3dc1b212815c8c55b8b9ece660d2fc9aac6f4f66767813593b48f6d20aa05034e10c8fd1fb81c8fe7a9afa15e771194b973f7403f45a29542a93af8907914e1cfd7aeff9cff99a6eabd609b9aa2e3d39aabb1cfa2ed1ac89166ba6d4b5588177b0873c4ee7efc135dbc546d266508dc222f2fa5d7b3e1323f2b97c8700293c5dd09415ec02c597f9932aa64bcd11fece45667b9aa8d55fc8330d9fcf991b4530ea72d6b3d0b803ccc3b65cc756118bb018a666c602d62620e2474e72c52ef191ef7a31a72abfd02c292f0df80270c69cbf55d3189f8d5d42fda5893eb50ead198297ed268357f5f4d77304e41e27ba68ec73ceab5141aa9ec531b417613340c57e91a8a87c162cfe51f5e527b594a780fc97fd6bbe605af99162f86574eb992131c4e27c711d66ef5a741dc12a6cf52eb805042e1cf223d0637b07ba96771c16550e78edaa0c5550710951cfaf894e32266f7178a72c7a938cf356d3d48cec363e2d72ce9c468245fee1d2caee8299804030346ef2269090d8e336ef3b1d19461b20181bd59115137ffbf9aca0b1fd18f2dbd53be96dd98eaafbcfb457e17770f064b525ab1c331d1855835f31d92bbbc047eed32584652ff4ccfa966b600415305732b475f4e82941b418c313ce451a915bb2d61b02d28a0b45e4d3c97e4ccfffed193e62c6f480f3ad0646b52ff4224004c016daabc909d9749eb32ceb557b1540b9d6760ae849d916d9562cada784f110549a32f05a6eca398e705c5ce1d16be67187beeadc74cd65ca431811b9a02f4a00b00e8006dc888b209a229d4e47416537e5f1cd4f10dc7ffaad38af999edee1b6876c307be2ae8deaf21d76310b1feb55730d07f5f02bf0f2c037e3e6b665f3411eab0e8e3960b2fabc62afd4567f6a673ccdb386a9f98f2808599f01b7cf3c3ec63427c6f92bfa538294637d777ee8cda30bc437db314adf4273b6136ff2c88adb23bf5f74ba0eb99e8eabf71a600c86cc045c00cc051d1d1d7feb7a0a45c7713f519365a03bd702e01cca7c2fe0dc1408f4e6420508ace7e4f3e4f5f969cf7758cf6bf7cae008ea8a541697d602fdca70d3ec6051c00aa40fc5e81c74931767fb01926a82238bf35e56551a99816a476a9741ba26fd258452b5116ab94e9f42da251cedd2b3b85e843e6bb06d786a6b2b2682267f2da186f1e8bb20256e5e5d4d44c82d156fbe9308b779e4323fa3a8d9d6a63a8661695abf421e80926c026ef0ec8e9556f36f502666dcb3c50ada9db83bd7eceff48c8678c54a76114bf85e7dbc48633e819231867a4b4af466bb9879d761c15df6a39232a250a3889cc1d2b00b295674fa788df6916b55c0470e8154d1f7c221cf47c34ae28edd45a22c6c9defff3d696bcc07ebd355726eacf563f2edaf30ea20b07317ad56046f9e413d617c793d35f5b19f8f09756e9f15f2ce4de02f9e4dc364e3045b39fd31321d23437bbd7459ec81e3d525273209a4ed123462c4e94644b8928d32e4d3a69815dd72498ce6cb67f59fa22570ad0283e59f798968e7cb2ebb891cf8d839165f48466bd77a1a7ffa12e03255de29de2e09d10a6968f3645c67827f7664aa9971ae6f8c681b8b5eb9fb4cc044113b11f72eee9fa62f45162b205781253000ca0ad326216098df8b91f01673cf3268d9f334f39f1f296171fcd5c842ff6dc4d7464d6579caea36fc31921eb34ff5c6cb6f231260508665865d7f0dd218f742b5c70cef3da422190fc59d17e242e044a3719714f35a8d1d5f9fa6ba331688c77c091533ac6c3e926874c031022ad04057779a9a68b13c277edac0dc2ca266e04c9556243ee7ee9a4555c6ea50f1181c65436942c39f688b33ce1cce1b98df5b8e9f789b08320dbd5378a94787635bd22b8699346e1d1187117bfba752ded792013eb269b99b5c875b86f4d1e19832cf48b9a70aba8fc6685abff910f66f570bcdfb2341d5c47683429d5cfbae1a62ded0177dac8ffe926b6a1bfa76968a032934439d4cb906d30a62808098575ab43c6fc9b8584b7073ac0575358640fba8fafa5661fdfac3a82d71034fd0c7b34b9bd0c8dbc0d474b480dc01c65b3316686fb00458414c676fd339549661fcbb083a9b6f79129b6231fe1f21f8cef867ae2b0fe8a52db323a5977136aa00a3ca50631a1fd5c4566fe81c9c7293272375fc09061090fc4ba2523eed9d6634bffba3311ca04206cc49a0184064230a8af38df9ca0421b20b23a97d24cb9fd9d631ef1dda0df0c38deecc9f0c04f44e5ecb99327de3a1518b9c55f849ef39a52ba17720ca894513232675a9da3c5d173b70af3b227a672281877a9afc6d66b571f202b653c0490aa33921c6d91501fda2f3120c80d5b385cfa5b50dbfdb34fb5fccfe886eeda9b98ef1d4fe1092e5b8494942a2d971bc7c9bae8192d685f0ad804cd532d6d9015f71d0a9091cee1ee35f55cb14f958434c1871f885b73253d7b5791c06494708e3c27e83f56b051930fc48b7b94795d612c133c7b7d66f559a638be138c112b69318f24388f3244c454d7daa4392b53bc89c7e8cfab19fb71a4c3a4019218db6987762a6046a4e7f3889f74a771cfde53c30306f9e6709442c4f0e53f49081fb84d755da4244bf002a0dd26be164da63af2ec062529becbd88aef7576f0826ef963c99a962430bec0cc244a21b9bac6e232bac4b3347be97b4f4d4845bf27378cac49e9488715d540ba54ae3d4de16f7f83f8bdb4fc89b113f5c149dfe30acf03ab4159a1c60b9e46292dc548ae079c5c1870803043c56713572749427a4ca1267037b094abcc8c79a34a06f648e4212e3770bc622c4c23b81deeab40172731704dc79d544c788c285170d6e620a43cc574014943c4110f1b07f1ba225e663dffd1d6f316fcc07e6bfc04ad77e5bf2730099147de4dc5480653aeff680de2dd359ccb41e21d67244225dbdb13164ae2c1c6728f3f6e6b0bf24d90c1ae761f3a52817bc075a37389affadb3febf4c3326ce618f943bc1e3bd3ccb55d3a5638d4c5131c8efaddec22bbcbe09837a4f2df38d470b1e518ca8a9befb8ba99006db8135b59b7e1f0201ec0a6f424ad6f22335897cf6ecc139ef1612eac4cffb5d1c039f543442a8a9cf5fa54c56a2cb23c3029bbde8d9886b13f447842d1cddf4e6a6aa967b79061a8afdf0c9a89448622c021c94261ee6980219efa46e87abde868816cd962a38bfafebbbb47c06e27c0f1e0715fd803e0ac6abec817e301c1e3484c46a425e66a11d6b6fa6c9d8b2dd8db2af9d6c0d9feb3389d10d11ee6450bc10043e3eb1f2817abb3c2d6afa421ebcaf6acfd7ad7ef674f026fffec4bc3afbb05f38ac2c7a9064f11d3cbfabe12fd30c7375962286b0b4038235913109da1a3533db5ed0c00f667e3ae27dbc64594b3a79d4185930a33df1c73eadbee0547b32058df52568c5618b40119e75536c081d0b4cbec455e19f78fad91a4ad70ea80e757b18a70c670472647b1dc13e3bc72bec82db5a002714f142bf8842ab3b8e7ab9b3eaee67d20eed84c4e9c7409be21c332f6bb6b48659b84f05b3c8efd9dfad3f7034e8d5c56828124e48243f726a0c11bbb0ed328ae6b183898a4cf49f8858cbfc6a29a3093c6a2a273908bfa815c92bc69227a95a89a0e1725fc91c5767b3c1fb19472483323bf15bfad97c71d753a6230db9a7490391ccc73c377b7cb358fcf9d6dd0c48399a7bc6c7ba0d27cb41e3c3b3418f72a52cb1140b6848b960d89cad22e28a7341bf59fb3f227839ab05d17726407577159d7295466111a1a442a231ac9a7a3f1a81e8e006eea234f339fc4fd9a72543acfc72cc50debfb34e683592076f55c192482559840e43b7763c8138515027cb6c8390a06ad9be2882fef3e6aaf3d47fe23c71f5524c3ae5e42c08be990e936a7c0a0a5c78c8ea7202706e8450ce96e273b29368bf14242f8effd93e6e0d1730b3e6fe05fc12e40b29f2acfcd48d8fc3fd46ad05cf4eb8947b87be539b4c4bd500f300c79293c21495972c1325ec8d1065978c49820016fba710e79b8a145f06fac3cfa894f5ef27ad53a23c84c8b65150f84b62329d97fe84d36908a1cc3c584cae8ca6b8cfb46b8fca9252253871e65b7ebdb79ac74bec04b3db8fd687b45a1c48407731b95e046d9c0fc206a75a26e18260e2eda0019066a2eac4591b0386c6a55d806b6114e07334be200d21c692806a14a5913498d544b4268210cc913ff8809a943515cd8dbfc0f1806722566a79e88a9d9b7212029e2edf96efa29f3640e62c16541d72783b32c790e6ad2f9fda4745adb25aa9c6938f58e2fe8d5b71463949087d41256eae0c7ac8e6177d244637ae2d0adb35a3abc71267b8d18cb93ec60660a34a5d5cda4832bd039911814e51da9bf1d9e383ce263a209390e14b4e59172ef28bdd5903671960f077520b85255a480e54658c79aadc37e4d6f97f6e4cb2f52001a1b84cf00c80f8aa829edd3bb6fa8c902972bce6eb0c9942e89dceecaad1dfa6ca04b23d433d2514953f936ce472537b7bede9964a1195e7f50c7d59615ae78fe9ee0061c44bda981d8d6f605a5b384c89e8d072df178a7864d6eb8144e109c99637efbcb581707cd678b7d238e7da41cacf7cf524e580a95818c5f3cd26412b17007ce47340d657d79fb863135ca6ce39253c3c6b92dc250b993d8dab1de6cad4e50bb10833ba611a9593b3e41278da5","title":"837. 新 21 点","link":"https://leetcode-cn.com/problems/new-21-game","question_id":867,"issue_number":47},"45":{"day":45,"pres":["Sliding Window","哈希表"],"tags":["滑动窗口"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。\n\n字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。\n\n说明:\n\n字母异位词指字母相同,但排列不同的字符串。\n不考虑答案输出的顺序。\n示例 1:\n\n输入:\ns: \"cbaebabacd\" p: \"abc\"\n\n输出:\n[0, 6]\n\n解释:\n起始索引等于 0 的子串是 \"cba\", 它是 \"abc\" 的字母异位词。\n起始索引等于 6 的子串是 \"bac\", 它是 \"abc\" 的字母异位词。\n 示例 2:\n\n输入:\ns: \"abab\" p: \"ab\"\n\n输出:\n[0, 1, 2]\n\n解释:\n起始索引等于 0 的子串是 \"ab\", 它是 \"ab\" 的字母异位词。\n起始索引等于 1 的子串是 \"ba\", 它是 \"ab\" 的字母异位词。\n起始索引等于 2 的子串是 \"ab\", 它是 \"ab\" 的字母异位词。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f27971c3385f366503c4877594b1b57b4a2267bdcfe01350a815bef1340d776d0890878afcb3339f117a67f0772fd1954006d8fc0d1e0536c8da98c98497c38e078cb97af429d3bb46adef5acae815c2fdc4667bc952a64300b73e7d0c6bc79c445242807face33e6ff9867fb13ae711ca8c7feca89337ee72493219b1dd429675e07fcf18df6ccfc397accb4f323557428206bc3d32f5f602da6b91a724e4ee4f993101e703b9b58976c35ac0a770097179a72038366a2c65264e6577937817e90471b648ee64077e8941c521d82dce1c65cffe4309d9e6e0787e9f1ce93346635f1efa57302476fb2684c2943ddd603c69fe9c558cf2345d10de7575b54dfd8932df0279c45a7ffc63e8d8a41b6503ccd8f6191e4e21dc14e5944ea48209b95700cedb65599c36aa3917de123be780382fe4b2c3923b9c602fba08543e5acc5b656262b13d6d36eedd47d04f8724a6a952889dd17c933174c6a3f6e0a7ab900697ddd434a6d18d656f628a4832879ac3caae7f61c631816dc2f57fb0a0ab13f0dc1740d953d69c305d84e58667afcb4241e487de52ca48c335ac6ed84c13c608dcfc131eb64213f65bb7775a1aebb10b4d0ef06846f40acfa9d263f5b7766ca20c487445446f469c495480e2da075bd2f389e0d4943f4aa8d28004160a5cfe68272e6d168c1f649945d9a8c669a99774f3f48c735dd5df9609eeaf496441ec38ae59d6658b2082f8b9bb2bdfbf127e1d1b8ce9fdca559e6e4ccb4cde435582f670556e422cbe4027f0a09ab5937277d2fbb94cac8c8596c306f2dd2442b6e9d1cc11f45a85096fd3d2bb0801e0ec871e8c4c9c0ca14222fef1ec0b74c06a88bffa4a1e7bc84057c8011456317d0909897351977b1b119ca186cdc50ffc4de5203c05a04ef41f505a8a44ebaba956481181dbe7a6a6bffa099a90b1a523c97221bcc6afdabf9b670d924c8ac4087d50e902c2f308536f2ea273be760e6a080112d52b494591891f87630f2f87886b229d2671a021880f65752184a4c8144ef81a52ec61ae2523dceb203db61b20dc3fb7ba1a5519c250a86452cd946fdfa0002526ed042aaae680f1b26f9d640eef328969904149312f8591ec8108e55fd975371264a17198eb7f40f9c0617322d6127655a11be81e8787d0afff5ec98609c4f295152e49431ad1934a0017b83252e09614f2681fb1a9a35c05c096891505929f3356dfd941f97708d33eb2e20e57aa9b420fe371249ef5cb3f291357a47c7ea93fb1d532ea5eff575694fb18ee8ac3ed9bf7b07b95bca90b73f5ee15d084748c41d3ea2d744547bf609bdb4a057d31f0eb628d0e4187b7ab1a7c7c9b8cc8a87efed8fa6bee7d5827a339f8c5eddfae083de72e5207a1b19fef1786cfb440ed6670a75a9c38c2011ca6cc7e11106aa387c7f9bb06a25f642b16f86416ae875297f6f5db265bdc8048e39e7c269500cc6055f8a152d847ca894facc7e5a794aa182ee9fe4d25ad6608cefaaa0aacf4999425dda1542881fd605a59f8003f85a423a2ff220255be46224e5c3e9133fe0e4a248b0f37f4f5d67f3f404d24933c02acefb665d46833b485c2eafd2c544ecaaddeedd82615dbad635d3b8cbd0e29b08df1f7f8ecff6b37a18b01f4688015f560f170e3ed6d4100ecce934784a19fdb641a8d3671d1f377289a33daf0ac3371cfab775d5107b177fc21bab4892b83ac193fc12ce1533abaf5b9b39969bd1922d53957b72b2a9d4c2b98d5d66b01ccb2cc9667a688cd68813f7f231bc1bbc87cc6c5ea6894b6b6678b46d4823aba869af92a5f1904651163cf68c967d3b33772906f2562804a7338b9a6f24838fe32fbdc1a88cc5d9aa2c6021a4a58f629c6baa153535bffea1becde7a35bacf8df66d50eb476ed3fae3d78de828f9d988a6e4fc77db4bab379b7eebb4a91f251479016b4670ac16731ee611228bb6d54cf58439ac5fec3dd36bf098f5ddf3fc9dd3236dbb6a691e84d15a0895ff9108872c1307a826634ea6732ba5befffb317b2ccc7ea4f200b9d69a5fc7693ebc03e52eb74551320f440b6b43657f83fcb4fc861071ae43640dba0f5e0abc55a4720f0c685aaeb786b032bc9ed5e6e9b68e2f3f0fc18520232c73b5ac2a4a531ba1e3dbe9cff322d24872bcdc73bf8a370e32a54855da8895b6acfc00bda6e4e885f94c7dcc289234b4aa82cb7288a986a2a40a5506405b3f8d8e9896dbd0cd09a873cd964d1269147fddbf2848aab894d346fb1c25d0d6bdd4e0b74eade72f4d020adefbdfd648e4ee9a4204924ccfcf243a1c1795964c888e88cfac83c3fdb1119a0fa1e1fd99249800ffeada8ee919067eb0c03a8232d3119e96cd91da9aa8d47b43e9b6b9136e5a45cc893cb23392eeb63b27e741f46e232e82e72d4dec1249016a7dbb29e31ffbe574debae3e103074956eb90a379793a3fbfe28bf520bdead02a6e64b729174219ef29bc4687e2cc221fba3007805e4c6a81412c1ecbd33c038f43f06442ca1900c9809f4cf3d64c5c37d9e54686bcdf6df00a8e6748fdaaaf83aee0b2443eacdcd152c3990b4faf3b8300fd990367db3404154ed04ee0aeb334da1587f842c83e7017e611f608e5d6a6f29a0bc1e3960e069225afd7f38b385778a028ba3080f928db447e2fd649d6ebeb6d4bcb8e1e0933da986d1b63639f70e1f03614bf114e5d02f332c6a9492381e774172a9339ba9877eb300c778d2df5b2d23ba031ae586e2242a04fa7c7de1e5fe3510b9a5cb52fbd21bdc8fc1dfb0d3ac38637bee25a9beac4a4857d9dbcdc5e1dd994f86293cfbb63b4c382dbf515d611414114013004fb287bc5b772b59637929d574a777d9dc0e8beca8fe2603021627b33769fe39f34cd502e801843bb097e7cc9196efbb7670e84c98361dd21d72b892acab64b449619e55e5cfb067bb1096a9482a0a5890aa9c7626eff414c2501c6d3134401eabbccec1ebe9046f5b5f61c2e52afa1ad1e9725372678ceb1d177917264d5439434ae408ea57d1378c072a8adec5031a02511b7300bf4074e0b891a70672d943fec6c537bf6f79b72d43ce6a719254afef7a0665a44359290eaf86d80cea3aa94020d848e851de237dd22e65fc052f5741307813392202e13b76ca3e0d6c4433cb4bcf457d0cac766319999d66870d748729f4c01bb4d775450b6cf13e8d687fe547fc6c773a398f687eab1d0d5f9bcc2b229422cc2f40dac48f176808ede592ad89b246a77176d488b59f9f2e854269edc1b077a2fb5b52c5355d1c83d805df59116e8e5b1a81e18e8faa608b1ffb0773f6d85283261a156bf91a5744d0dc08375da3a49c544b45375d3462995cfb9d06d39b544e15ab5428c93ffeaac0077f2c49770dd99477ddb233e577184526cdec565d21716651930516bbecba82106aee9e4d68a67c8dd6fb7c40280b20ccc33faa9a2b27c50e47e68459c449d0fbbda00c46f2e199dd06ef2401c82342417c1992e849a431c1c84563d992d197dca9c40abcc8e1dbed96f1ffadb42cbd02529bbed6101609bed1ca7fc298d2a7235eca814472e65d51f225c70f3d983ef469b0633ba2aab2ebbed41a4eb22ce581e94b72c732d57e689c13fbd4391f11190f7d22225c8f6262290e371c057b496d15ce3e66f47fbdc8ae3bdf9edcf91f32f832f5c866aaf890aa9b34cfa7e526433e6f87cbfe1d269528e90972d4aef076e3c5d333d348f43b34980401d9a44a7125ba7c579b015001d498386eee2e693647877ee86268de7d060aec0142cacfecd0f6affb81ae40881cfe05523367dc72ea3283735a21330ad383f33f44caa4497a2137b30cc95d5ee02c3c17a1a00ae0fd9b91f8d7ded4e727f5054a5cb07f4ae48a761a96f58cea94b2e0fe44d2295349983c5db595ddf5f38ca5ff94755a5f3ab81d2e613e64c8fe7e1cabd71117bd77c32039cf1dd561efe319a0bc301ef6b55019a4f220ea6c829155ddd7635d22365db6c3921f894824120bd2e234e71cb82c378a62f5fcb78f7e60a77a77e83206d5c9d726b7902073f8569796ecec66ebd28cc5f83a02af81aee153f2678a1eb57c5efdffbda6cb3c3fd7a61ebe61897846142f007a718afb8185f791b8c8832978f46c42d1cb57c4092877848d6bc1ae6c658f4595ad6cb65415df96f9f7edfe811e2e77249e7174af08c618b36c2ee37d55a3bd455e2190a2dfcefe94dda26321070f2fbf33794398036945441160a7a89cc9bc1ebb7b9de108bf7c59dc7c4fae80d8a8339c30ae8e714f1c1b49e56309afc3edf7aa55c5c31d11ff602126e3abed37c621a43b8113f14bb9a0744a8a7b398dc5e209af2995ea216b1a600b52c4aa6689b8efdbe1f59986ee1068019858c77ee5d3b40bd76310b1a39f7d79967f164be512243f21473f66422911fab9c2e3960b2fabc62afd5372dee14f8882306bbca9d8808599f01473361903f4c59eab435163e7edcce832b9080912801c8ad22dc2266fef80e0eb5f9b4d0231f8555561a0eb99e8f9a743a338c8798558d141d415d2a4d2bbf2e7ba697f5cb34b6d3a03f43e2e538de985b40a15db09f1fab2972163b1e4ae8a8f265a4af0486e1fb836d80e6566d59ce9e2c93770da8240e5fd00804af69b056a8f8c97f26bcde354c1b35185f26f288dd65e23935ee9a465fe17a7d79fe8f93112266897a63ec6ff1a328981069d28ca001f112b77ebcea63278c3e898542792528aedbfdf3b8bd57cd12f874ffb7a83ed758c6120c8a632e0d02d24b76dfc5508fa7febcc5442d0f3c83bacf88e49849716271c3919e4230edf34fa41f20ca58f2985f7dbd89b3c8cdc9096af542d74e1cf6e3c12ae9361857bade7ae98ced7031599bdd71911b1e9f8d3d93a4ea23886e02eb5d6d8c686d42eb8be709f365888ea30115a291545047f48823b2e7937fab14e3be1465f886ef797ee9985645ae99d45d5a556320dcedbdf757453ca533980cf2261d7723f2a59297e457a0779949e01f3903b13cd0d26859d96cbdbe622c1d127573c62c6331f4bb977c1e781af28de128e184e8872b1f76dcccbbd1587a99e4b335a21d6b3fcab92dd8083a54af79945b0469aaad3b32d03045cc1a1e1d8831d80858f2e7a25fa9f30dcee660bb268324a4d72597d572d1e85e8c0189e58c4205ad83ccec57a82dad78efa9a015db1888e9545152dc4a7ba9a7226deca2365d55943528cc14da769b8146ad88b9308d857416d9147a8ae4cdf2a9ab77673e3baea8db5dcbd1064138c0b82cec9965e4f09a2b05c38df28eab8bef0d9cddafc9482464d6f3c558521c89800857e1082d71c5b02aa5999a4e6ece05c82929b656e538905ab6e35f70a52f8fdec24ddbef27bdd6138f5ebab0a8cd51c5993d459aad1231c16faa5923b20777f775addeb3549d71657b0402ce7b7b629a565961d941547ccf5c0063cac98569ba6b222a43f5c1060f470e6d99ee201e8041a7dfb651244a0753e7666edee3d94704f10f1ffb7d586f2a1630d38380ac26882b0606c395eb07347493cc2bc2bc13cc897520c0ac1f540abd1a646bf79814024680b3001db802d9aedc1f0b9164a0908a3b55f68a228109acb79f0b08a7e40816e3bc5eff6c19506d2c033dcdc223db5d5418457be7c9f519b818f2369184d464d168971aae9201ca7464e08bc5526373dc61eb6cab5cab1af3a8cfa1d8978e39a1c7335bd81bfd32d50196714ba11a8c5c144494a5a241200f783213ec6dd47a091aa430a5bdd520a7fe6bc34dfb09c1c1303bd38d654d008fdae1d229eb9a7cb04608edd8af5810017b691ba9a3ccd27125eaaf45fcd95f8d74cd6173c49ff864055732a1f95f0c8dc66f371ced36e923c71147083b2bb92281839205c7f3c4ddefe3a921173915e12c6261e6999445b355caa551c9eb0f4dd6645033f0e24502b1c47e38076aac1f7325b0882e82c810247002fdadca5b8c84ec84a8ba0c21ccc3e5507d5043b4c28fc01ca1597075dcb7b6add048cd2463d7657c1ce28d13e8d386ffd362dab2c820cdfa91094725d1625393c26574cf559a638e95ac26e2a7928da6b769f4a01974ffddaa4392b48d986dc8b8fa217d10995d4b70cd53dd7a16bf5e7f38468584e4c02c762d07518c076c48e54698a3dcf5c4c3f9dbed6ad1588c5f16bb8e73690211b9a17d2d039b9161f4f0a6cf09fc96540cdbf572da165cf013a3ae2df784908e3d9c23c747454b1501b3ffaf906e3e385c9cd789d930356842c9b019f3be22db076be906404ba3d506920504c21973276fcd6b26596036df9d6644bbc59caafe21db4830fad09407011c1827dbef1df88c587abc364abc7f03c126e6b16be0dda9733875dc7ebb9d015b7b3b1b543c35636fe1735204751829690a39fa63851b66170ef38905199e4d88a06d6ccd0b55843083f632470675051fa4565b1b87c8334981657a2e2f6739017da4b9f8aa3132a97d6af88fa1d67cf38c7e2c8a5ac3d6adfc3ca242354b76aeef281f965dc305e1cfcdae5bf0bb539bd688e4a1258bf50ccadf62871e952f16bf3517e84a7c76d2e456886ef4259c1efc7a01dfc97bcd754c1bcc55e9124b1b215c188d4fe82a190613ef9441232fab2be3c098ce8b461aa756b6011c588759c409ebe3537a547f2e690f400f24424638dc383e97e9e402cb23c3060fd8ac483c1e876442b4b92c6c3796654fd33f8cf298ccc9059d48a489a6edf7f90172cee629d21daaa7cef54a6df68fa4cd948a38bbcb1e9bb4fca6421c0f1e025119351ace23ce0c012a651d4b0515e5cc728eb63118d9cfa6c9d8b6988e925849fddc7b4fa3a9c118e3dba1221ce000ea2b36f7c44b099c2d6afa476a2d0f3b1ed4cd6d93439566fb6bc7ccfe1b855b7b6e7b7f648321bd3cbfabe12aa79897316355b3e4640333e101140b2a98c0f52e19602519567eefc2ecadd1f8aba9eb03a88f31109982d59aa9bae2f6dd9610e9e5235c3125dae2b33a71532cf8c86a1a0fd4e5a1edfdca597e8f524ef8ae75fbaa90dbb5a472617e49e5faaff72fa8778a3ad1536440507b9ee048f88a2aecf70ebcc132cee91021a9c1f05be688d2fb0cc36096cf6c1a4206ff5b4e0879aac1e46f646619f8134e4de1ff748a0df06bb65d323ae585474cab5da4eed8ed8d58ef3d34deeeca2a27390cfb5d41edef9696663a8d5d6565963ed879775713d54fdcc142623329504c2a197c76a266f2f30c69a659c394ec86e9064f68b7ee081d96599c48e99ebbd7208e0a67ca21e3c293418f72a52cb1140b690819058d3cd9c3b66bd1e46b5ce82d8aa1e0669c4c6accb8398a3d512e2d8a19baddfeba9e68a686f20542ae6458d8b4afad7ce0b002b52e2ef855541ea76a02f66882523fbe8cf68d2fbb24e871b9b64f1baff05866bcccbc23407e1f6b979403f30e566eb8d69d1be69be4cc7c5c6545fa0fa74222e0172f11b6b660d77451516aedab42f90a02dccd3ffae834241d08a110d6c425c2852db88e0b46cf279ed976dae2a0752f1115b9312c23cb05b5b4dd903bf7d99221963052d275863232129639edb69f4bf6e4b96d7328e1d9a8ac449a4c98b6c2d87698315c9b0c3cfae007abc3622db4fd23c190f90b13966f12df63633808613d3e2d7a3bcd0418cbf09a9fba3605d628b073ef2f3e53cba39bbc8133d85f872180bf5c4ef0b735288f10ae8c7b87b5d75e121546a4b6d8e001048314bcf17d9fe7c20380f9478e34300072245f25db74e696b4ee018595a51c84405273a3d488646bdc44cb743155f95fcba0a513f386c09eadbc6fdd1f469613da495d366b367e3210162a3216f805883f54f3e4b569df7a8e1711ccb38e9bf2861fce305e5d5a60f63dd9bc59b1205ebfcfaebb71a299a143f17f9e7b0b34a209671267bc948b0f8ec6d661b0de084cde6c877963dd52e1ee35495c23ab4533ce927f64339304ecbafdc55a05bb586d57a379f152d336fea525dedcee3034592d5e3a8300f3b85bea1ce69425930219fcf498147c5a829f8eba057e5914c8773e662fc84983fb794a298ac438017e94b28d444d2090c0ec238873c222f8da5a39269ad6446555fc7a28d3fae78addbac40123baba999f2cdfe7abba6ad97ebd5656ca3718df16733a37a4b16dcfa0737a34b91ff8f24cd1da2e90dd902995a0697517e580795473bc9f565a392799bcf379eb2dfa2e0984189433db04d949b57e9cbb9ea188f3c6242607136e66fa5d35ecc09f5531d851911673f04a3a5aff4b7a8e1d808924e221f45df2e004a8c057d082d9c96d85e675f95932407403723b47dbd439d3c33b1d1a12e83d4fa67814445ed7055cb42aabf33f6853f8827d212f39ddacc34da9333b63951e8f344030fc01a9f951d188acd85e7008f3e71e2e6da6154ba7c03d34ad2dc08d7067b503e406163d1acd88dc2a5bf15231a20d25f00432df958bc56967ea4ce06944aa161de78faf5a3288e824f38bef8acb32e2a20e1e3365e2084ee762363a7e398ef3d8787739dd1334f9693a6c3d6aaf92c71bf73cd68dc265eeb2704564c1c33a8c3204fcbad8aa2c06ff311004b28447241f9781b2f6d614f603f49f03734ce4fdd9a6698f57992ece4543d14e9ca433932f3362efda941d7c291b1904ea729117cb06ec67757515588f4d49bd0596e1b38d3dca7040e3e57ffda6a3c867f3f9560233fb3b29c9d9a9633abbe3aefe0213ad5679bdf3293e8720a972337b495b9e564f288c3c61add732d22215010e03511ceb72b53be034b5770af0e035e0515df5a68cd11498a984eca8c17ec955280d13f73a830bbb1e36ba24de07d28b1fe75ac0fa9e59e7b2e0f5f1392c1629e6098db54278c2df76960efc7de97e12e30c35ad19a75131b61105407ce554ae45afebfda2bacc67fd8a79f910658a05841e002d48ba5423beb6f8826d9ca49e62269d0810fcb8120e8172c0b5696bf2056bcbbe87a369a0d2b8d9099177b03272f145e05cda356e254808577281cc999c3d59442fea63fe8ae7aa3f8d9500c14ce8a40c4753b6f980c3e874b0443e74b94c13ec1024252708348a97a64edaded12c21ebf84ac6e83181e834e0556f7a7f3232e2c3dfc282ed249e8c54d62ee77be609f5c68d4d8c0d6f99db6e7db0570abe06131d94bb424679c30eb8ec59db0c130d43dff091a68cddf9197365007ac75b1661b362d05ae2b4d23ddfbfa11b8e778f5bfe5b3ecfcfc5eceb755150e2d00064c4b5f231b4baac201a15a882efb3e87f86481","title":"438. 找到字符串中所有字母异位词","link":"https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/","question_id":438,"issue_number":48},"46":{"day":46,"pres":["Sliding Window","哈希表"],"tags":["滑动窗口"],"whys":null,"difficulty":"- 困难","description":"```\n给你一个字符串 S、一个字符串 T 。请你设计一种算法,可以在 O(n) 的时间复杂度内,从字符串 S 里面找出:包含 T 所有字符的最小子串。\n\n\n\n示例:\n\n输入:S = \"ADOBECODEBANC\", T = \"ABC\"\n输出:\"BANC\"\n\n\n提示:\n\n如果 S 中不存这样的子串,则返回空字符串 \"\"。\n如果 S 中存在这样的子串,我们保证它是唯一的答案。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84cd871bf055483c4f5f59422b54a2822750c8f505140a957eee1342d547cc891c64affd193ae60dab5f297adb147e626489d0817acbdb474d5918878a77ec7c9490e18962fc3cd60464434ee733618c49e7757ca9e4ef6d15e7914e668f53aee1bc8004459124d8e130aa5a298c8d47777be3a3fbdba756a341e63358c4d0cc2d1f623b31b3ec4101f8e7883bd2a4a581aea0f748205444f58e791f7d3fabc3e67b052dae1db564a0a563d8a992189e7e8d924e852e1ce6ee09eaf3fa74b45aa19ca9476682bd2142e4d9fe474e267cce1929b3686da6d16563351507c181b6416362e8a24b63b0684d0342c2df03de8c0775be4cc3cd1650f03f007b9a878c6ca022ff0faa9c8c04e9d55f3ee762cbeb089d81a3188c3f5c34976060e994249f2c7306a8a71aa3cf1ed166f25b54eddd0f6c0c46d8ec669b83f701dbdaaa88d0c9879f128e6b8faf789abd500963537482bc7bf662544c3b55698d9607a1ac2ee11829525160d03fb3cede2809e61906096d8d63a294ad4f40bc7127d85e0c94f9bd1ae1932c6ee6322d63c04c2c427370319c08d6c6081b8ef3d17bcba6f4dda865dc0168172bea5808c6850bff134def0e986f469535515389dd7951e720c9928b9bfc43f15453e3cf8f73be1ef4d8fa382be5206d4aa9b7f3ef150a7841d4187e8a86c53deb5ec5ce4ae40387e1cd870d8043b28471e6b2c9c81139bc2d7f9c7868b30c37437d25bce4d724edfeb8df92d79a420a4e9efec0877c535b3b0f018434a28d0f03721dda0c235c1c1fe9fad6b9b9722f7940795debe631917b724c079222edcc8a9f3cc2421b9ffc0301b0faae8bcbe9a833a3c45d5ce0a1bdf590b5e4b06e1ca7701670744f3f400984cc3ab2d58b6f1557c752dfcad6741d2dfd75a4779b49a5c3f8583e48e36394b378136403b58ad1e11958212bf4b89d0ef622232d54ff39d10d73be0d09ec02b68ef7fa219fa20850a367aa1238d18ef058f07c7dced7ffd283c624ce88439b40575529fd9e513964560ac56eacdea55ca11658500bf8b334dda53bb72c553af8ac30f022a86badb81ff8177cdbfcd7be09c77576afbec9f36578c4051dee2413090ea910e567cd40e85ac17749a1cfca11255fe89b9b89140a1f082069216d523fbf86f77a742af3f0fb5ce8164f286151c7a13dba1f37b42bbe31ed6c3c63849ce0b310fc4bf3f5cea464d4d7affb1365febd07975f9d33d21a21f669a78302f90f10a5a75ee38db251217f8c8d8c8a427343f9d59df5e888cc9089d53bacc86950ce618a0c0a5735af5fccd8348c3279dde2e091b0038f1037ae58e81f19872bc6df197f75b081f0c4b9db8dbfd7c7fb61fdc7b5d564ac480cf238aed2f59569a983f58f89493696ad7f828b13a7bfb3130dcee09265d0571e91ef77761e044c06ce1ef7426b8d15ad2eee3e7e6b00e0026a92fb07b11de6ea4b5000dc075f93152fb8b32438f9ef655a646ba3a2f390e9c29f4ea708510665ffee2de55e1757a7c7528f195eb3fefe0e8911495142df467a4a812c0a8f9bdd77bfacb5ad2df3c032db92eb218e5ff3246cd94c4f62a3074fe257682b66b185b354ab2c7e6a0d22aae7db9d1ba5c4dc42296fd518853efbf79ff76c79fa1a13d2180f0c1d524629b1bb2e88c1d41a755209f2a36fabf4461c240e75b3af1797c3b6257db0a3018922206c458aa10dc64c16f069e7b62a8468200b689d72fe3efaad885816ac2f3986c58cf8f0d6590ef73f9a4bd1e8fcb37d3b28a7326755d23ed0ddf80f27a3d90152ef9621c4fde26723bc4d10190e1ca0b39fd56c450f134d321f7e369612068345a41c5e3124f7e6d967194b7321b5ac834d162ee1fdb827e17fce701246176c29790e697d97284219ea04ef34d09154a75323f4edf5ad3453d50ab34de8ecb413ccd7f71483b4084220f921e8ce9c686a816ba1c5c87c17a37920c0fb642e6cc132df60dd1456afc84c6de7d9dabf5b98a7046816d642e75a945f4014f3948f3b20fd34eeb625975d77482f88a604b954a7c46d93d0fb3c52c09ae197bf33a43d4b9255f90eca67f2682f20e63a58d582cde19fd65d54271573004652bee7e1ca430a103d8706b9ec958d2cf2d7806ad6eb61abb908b42e0cbda9e8322c0a8c28f62bb07a89f60af4bb070bc3ac1937d5a05dc50832bd3bdbfcbfaeac571772fc688771c287294b45fe286c452f12d8ce84a9e51687ca83609366bbb5f932c9bfa5ace1de87246065c19a7e7413cc1b565aadbf5082b02de793aa50f3629a646f838dec61fcce67adcf565563fd8adf9ff4c5203ed92c1f89c91e2ad57dec13c761cbc2f0e1dd67468bff6329010d19de50db2e8aabbf6fb41c8669ba2ae7a04cca8cea223f18e879a19be8b3837d4d943d19abf94fb842ea2e0874940bd6bd7c67e8863b1102549863b00b01899294fcfe15b6581ac5ae1680e77450927c285b1753579fbeeaa8099839dbbd5ec4a7c50f6c87fafe60d451a70f6fa6eb314be45f4ac3ac685dbabd49cd26563eb9f48c5ea48f3a9bb5d8c34591354e19e3aea531a7d5cba385938e5f71e5f64858e1147c10a43a8472ef79148a301091a30b14f9fb919762b07066401da3a8123575ca6b275dff401fb3834d802fa5a93c099e80bd45c0c16b9c70b287c4be9ae9edb726a4aad2b41c0cf61c060a5d50139e4414721848159de14830d3c9a867b64818887a85ec7fe8d2e0712622a6efa1714d54717324ab145285bde45e5faf1a4aba2452c93b84c0c6b2e59a3a7b5728cd26bfa445445fdcdaead8e0d4844f86293cfbb63a573e2e8e71bfd543631115551b3ec2b2fb1f738b8df31370c715e168bea22ce6bf98815a0f404b0ddd4952a14bf0008939ac7e8568f9978791a23b79140102eb00c4234ebe2d3af7b8dac14ed6105ac432d2a902823fcb4c24ce4c5463251b110959e9babd3296645c66716860e3a28b94f0a0697b262053aabb2f8d68c7a22b753833b8a95f001f701c330f210c0bfe57956e916889656e99b7802b644a4f5215230386c3627d33280452c842fcdec570f92bfc7be249f773739b67adfc730757af4d7b0906898ad91ce13a914e2dd65be863e8e7906d2d50c40710794d13721f202708d52b7ad5200e785f31e65ecf5b630fbf7f691d99935196e2c2e14ec7a84684bb1e546ddd70f6c2652a864a8d12606c7dba182aa278576ff6b23944ef2a85706ba59cadaf878a74e5a0a48bbf5aa77243d7aa9b9c931987674d0160177a88fe5b52d136441883c223d04d1963aa751ab4e58e9eae639a20f73b7d196b02e83b5574749d4665064f1e88e08e6bc6a7292a445e253921c473acd030a3c04a0279a6286bf55ea3ad9d5559460c5b7582a2db300b9422ef5618109a46fa77ce1a771ad22472e0ebf0ed110cabb532ad64ed409fa2608b90fdab2012dd254cc6b429b7d1196cd207bd15276a37d28e734d735dfa30a9d727aa95eec9da5b64ad63f43a54828b3e062665521236c60c3b0f6960535f640355de8b4b19d9ec53c8c18b6c7ce03c48571427e6ad123586f51afc836ed1e8196bb1b03b8dbe521b71281692fcaa7801fc3fcfe2cd5e24c867fb3131d9886922567b160d073f6a6f378f32376b423810571708770f865761a027fa9de72596d889b71506fb68b2d32ceca2b2d9cf6686e9a226107f2ea491fc013cda7cb7433aced6bb22eb8cda539a56e17753911510f1b37c2a63a96c48cf140441d2877950c6342a3a0ae737ab3f74cd751e18dd2b68cacfa596bfe9fc81ff18c652b649777d6fc535ff6090033b171930feefda064899e7446b2c38e759c14452fc7e294a81a002f3a9ce99e1d2f486a274874c0d14e42d12b0cf3f7ebca7c9b98fd184aa449e6c5c53cc5a20a5da95a7a7cba3eec368130175e925381c254e9fb63750e1d8dede4bf805f569178514aa2e11906b6ebc8e757ae5d2a4d820ea6cc4de07dddf635d22365db68b8802d9157e1e20dbf107d246b82429ca3ff5cd9da57e60a77a77e8714ee7ccd723fad6317ac612d2d987a528b8b9c69336d3e06102197fd65ba1239773d4eead3b25340c86d25047812dba43525b146241633199be86d9f58be5c8952979e346079f8f57d909387b84df2e92b32a788743daad29e40e418797daecc7fe811e2e316bcc717cb4088356f72173b76e13e4f3103375d8aad6d5fed193e6682a0e4235c53d2916cc0b2a0d48527ea7b69586d353eb7b80e15bb13f4cb7042efa889de677952bd3c63803591b41a8221ea4f0b9affa058b9b501fbe3c7601eeb0c737c621a43b8113f102b6e67c0190492a80dcb204a265d7ed7216117e0752c8a300ccf6e6dbbadfb386ee106801ca1d942ae8deaf21d76310fdbbfb5764962d5f45eb462c6064582e200b341aeaa1f3c9960b2fabc62afd01378def0eccc6387be7f7a1ecc0dfa41b61f3c9e677162e45dbf1a56a680870927f858cd730ad4f7dec40f286636d2078d53188fffb7cbda3508aeb99e8aeef0aef7dc871c016c86be21581aa9efebca0ee217755ba087e5151f47d2e4e8dba8bf84d911eee6d6c6715dd937e541b4f28bc9cf7758cf6bf7cae5282baf01b6a3c7471e4f83e40c70c1279eb0faf934663868c8f90009fe30084fe0185ef6f7b83951662c13ff4e262aa00b4cf96eed37c537666d0e36acef555328cc25ffd568f4d4f112677ec8fa14f78ddf598442ef1148ae5e99e778bc97cc126ad1dbe29d7e67e974b20c8a632e0d02d24f425870100f67ba88959488adeb530a7e3a449849716271c3919b7774fc021a144b973f1876a89f78d99d73a98333f0567cab4b35b6ba8978d6651f069c6282336380a4f89d0002b11eec0310b631f6886880299ace02eb5d685ecacd47afdf3209f2b5889ad34114f707f0a263a06c63268791dfab14e3bb3030b9e74c2c3e7919b644af49a6d9c8c1e7853b6d5b2140c2cbc3255bcec22769438467e06647d4b24523c86cd2ebac0611b8f415fe9d8d09fd7e6708482551e7b78d7604046a565f0cddc85689e52a43268b646ba9f39a28ea73fade9de0b70057efc371a7c072e21355aae645eb93a980b34745bbde9d8d219080d663fd43b701ecc9b41bd9f7d95a01142fc653b1d4d73487c4a634498bbdc11e70c9669149f3c9acc7ad9f0fddcbfc90f1cf5cc869054172bdffcbdf93c72c0ca2a1dba1a0c00c89b1ae62ae64a6391e4c013f20a6b2dd107d4c16cfb15c8c87079f2bec0f4a7d9be1c6607ae5adb9996d557276cc4e508719066eae394e6c3dd9efc99cc6c046f2145c864c2d04f836c0a85d947534df81794cea3a48d0ec3dfc86d3d07db17cf2935a40652aba9be6d93f9f27f86242090b9ef71d8ae5524ee8917f2af6c4e0ab3ebc6252078100e56dda3741a9f1e45ef0278f7f2ff6fb924d845f57a1583fdd21030bc9104fff2b270ed78144460a026f5a090ae44a6434e35f3255c0ca0667f6f6df7a974cc636c19f1adf281d3a0ef300b2f225faf42d0f53477135eb07301066ecaf52cdb6881c50a587394b14cf3cdbb16d85bb0710e5d3b2322c0806491e6c8ab9341024044e6bd0d21e5604486d036f0b1ab6b33c11a11c8eff180927bd9cb73dcdc223db5d5418457be7c9f519a8e886b5b05724a68169971fed37528ed03015fbc4e0c373dc61eb6979fcab1af3a8ca94fcc72eac010492fbbc5e7965013532f76c054fa8ac8441b0f092a4255ed8d5628d5db4fe7d3e723693f99175202f8bc24dff0d54e4818b62f994f946eb4b0572b838afc82183ac285c5eec5675eabdbb3870f83595a56a3ef5f849ef3de17fc176763ff864055732a1f95f0809d35bb0a9da864a06932407cc9aeec9f250313205c7f3c4ddefe3acf3b59911653956e653ae20d5b385cf5545088b6fac7654d5d0b406d1f7b77409e8b7db1ebf7325b0882e87bc94b0b4527d0d5f8bedd1d9d5796e9cc07c4375875995f5e4528ae44991bc7520e830428c76dc7da0f3d7b5791c0649470ca6c27f53f64e6249b578dc458c07f1153636d376a747aa71cf251a71e873671167c8f39389f1844c454d7daa4392b15f380eda1cfe257fb23e58de3449a73d769ec76216031adaf9cdcf63ae33497de4ec3514fbee7629406c4a0bd79731924a367755da4244bf002a0dd26be164da67ea2974f5829f18e9da0f27525fed13bbb309dc89e6822b1dabf774d29edd895a633b2b6e16351c37b4f4d4845bf2737cae31be9018701b140e815e07a08e9047f8ef8acb8fc84a056bb98589abc669b6ae5051cf9c6169e155261c45e8133e1472f70d7790dba34461a2746420d66a1267064e2d1e883de3dd80614f952f23c3f3f28ca72211359c35493ab4d1763610b04c796543b05a661177885b465e773c5752e5054cc45220538a49f7568722ffab8b3cb2187ef7469ed77c919e0a71a7370bb119f1fc5064304bcee0f4caf983581902db75324700b6a95db1b5846e28aca72c27e361b5fe20bc5d4d07b126237cf289475e72389b2fa957abcf4a2603efa6bf108bc153b9e8ded2d6e0538dfc50115ccf9d2f465b8c0c3831d8ef2df749124b1b2518493feb8cbefd40070b8034073b7e1e4260b88fab36ae2456b3345978475cc5ac3c74b65ac47fff8909849f3550b7f91d9fea111ca5b06b23c3060a0f4d8caaced62041c61a1d0db7d6c59a919f8c53f9885f54cda9e5d914ccc3afb447fee11d26d8ffe74ee49bce8688131f30ce6cdbcfca0f538c565378fefe83f1adf45e1ac28bfc80db74dd0e30c4d46be7cb96a118082fa3fc9d973a2a06384d6ddd9a9fa3ad55fc522e6465f8b5202a2dd637c07e499dfd6bfa876c1cbe7adfe4cd0aa6e4e1f23fef238d9a6bc05dd84cff9a9106002adc2d0be12aa7989731635103e5b402314595740e6e8de4817e7a80526dc26adaf6292935e94f5efcd3897c41119820759aa9bae69228b615c9e1b7bc3401ce06c76af7b7f90ea86f5e1af091f4aa48fdedee8bb6bf681fd12b8db23bd223a5b17ef835fbbd572fa8778f7ec477101517ceadc0bf2a6d9f1af70b3a81378eed04c5e9c5c4aeb26d923a4b731336cccf9f046218ebec981c9ca513b9b46619f8134e4de1ff748a0df06bb65d323ae571133d7e18a36aacb8caedd889a3093c6a2a224d886f9911e95f9747b2aa290d41b543fb0dcef3234695dfdd109263328bf04c2a197c723606f7d30cb9a299c324e9820df6ae59e7abfe59d6dd0c48399a7f83c00b0af7ca91e2d201e18f76b1c98115db691bf8817d3888d0702ee3406f58ea8f26e8386ad5d7969640c0e7d04d76f7e2b585412162a2e1a85a7a8f1fd42f51b56be376544cc91b09a7d544dd4ed2cc50debfb34a5cc0c6e22b0472477f150e521e45d6363ae6ad0580277abc87d5a7de4e6f9886aa36d66e96f51d66fb1021c2e9381177e95e5e9d3a663e994e5f7bcdff5eb141c06fd110ca73a2b684c67f69c46539596a8dee6edcc734f6e14a95fcc2e37cf8400cfcd4893fc32c96a9c5cf4eb8947b87be539e681e9055d7e0c2b206f317e5963eb3203e28c2c7338848a4f7f59984f0e5bb9b62aaa05c65690c306cb26fd50cbc05e850dd3f2e5175cda6c9d55996a66037fc643310a256c67ad311dcc77382afc9819ad4119a6879a5fe0783812b353d635f0a80b86c42b93e19b6e2b83344f33e7ec1ea2aa80bc0e5ada8dc794abf0339d1636024f67075adb798ab793e7c15fdd45beacb2806ed6e31770c0641609f5a1e443e32b00d43a43660c142866046c71beb3fb60120e606211e485cc6a2b79a22bed61d1d748","title":"76. 最小覆盖子串","link":"https://leetcode-cn.com/problems/minimum-window-substring","question_id":76,"issue_number":49},"47":{"day":47,"pres":["二分法","滑动窗口"],"tags":["滑动窗口"],"whys":null,"difficulty":"- 中等","description":"本题和 [1423. 可获得的最大点数](https://leetcode-cn.com/problems/maximum-points-you-can-obtain-from-cards/) 类似。 **因此大家也可以用 1423. 可获得的最大点数。(因为 binarysearch 现在 down 掉了,可能打不了卡)**\n\nYou are given a list of positive integers nums and an integer target. Consider an operation where we remove a number v from either the front or the back of nums and decrement target by v.\n\nReturn the minimum number of operations required to decrement target to zero. If it's not possible, return -1.\n\nConstraints\n\nn ≤ 100,000 where n is the length of nums Example 1 Input nums = [3, 1, 1, 2, 5, 1, 1] target = 7 Output 3 Explanation We can remove 1, 1 and 5 from the back to decrement target to zero.\n\nExample 2 Input nums = [2, 4] target = 7 Output -1 Explanation There's no way to decrement target = 7 to zero.","content":"096221cf5b628be1e73e8bcfe626c7f3f93f5dd1497fc067cf81bfe088cc83fed16c6dadad1d3acdf7cc4cbe6afdac5fbe291b87a12b05d6b838ba3abfaac724e231e5b972beabfb1d37d2b6d3d2127d3eea7c948db2099f26ba2d80e4aca1c24930c00b6db0963d661f1272a8d4daf071d009062b4fe1c16aeebd8560a40eaf3b77c7aeaf8cc4b39536e047c90eea37bade9b62db9ac6a44748aebe6b22f03e5f7a132669d6ed2f5155c11719d1d80e16d787f70c543d1ff21ba63169ab43343cd3489d075aa10ef1dc230ad4202a1bfc11b1357a68ceb35e2892a6690f17ce83e1b608cba36bbbfd1126f381c40901dc9fa271466ea7e7c7b54be0b2c8892e3ec502536050ae5ecca59d8e04a892b61f4765e56de537d252124ed67e409471c1ac280b82086e25d447b39f8e16bea96001f5de0a3796072fc022581fe34bff657be3f333603445d9c16b999ac7ed626c6614ba8c8fd75b8bc4601ef05c49e982c0db74b2af78ee77b7d1ac93ede9ea24c6f3324df782f75a64f13ca5c9318fbd2295494f4dd8d85f52cb4724ea5c8f34312edd97a56db89b45c238e689fad3362c41755f3f8e36d6d5081bb8d1d07dcfa5ccfaaa57ea025037927a829f327772cf366864cf47ff9b71be88e4e0b9bf8c1ba863471648047cb40400eee3aa449536c2fa930d06cd005a1ba8eec8ba05493b6ebb343ef40f12c023bf0d4e9b5342a4d2e7b700a3695fd34592e9d1917e07060d5f9c454ab33f0f868aa2bdf2cc24ececb8fda5db9e7e0b7a81396b37abcde5ff523cc460a0df62240d45d46d5e5e7b53f7b89cace7381c2d1b4bff26785af462d84d19aae41139c4ad6e5f89d31b23f88c0cb5c884b793a0a42031aed76dd7d7c4c6e0ded33418d31b0234134d442135e19119d58995257d62870aee601be493933f9462b761cf05269b4e3b46c90897fc318599ae3d515f76e98ea0f01bc4f203bf1f3b2157f325c50d4aa20e1ea314d2c7f77edc372edea82ea1676a1286cca2d91595bb593b9ab61800fb4e54ef1281d2d3fb00038cc1eba1cb0089625e58a866ef8d95eb113bd22624a356e99fe67254d16ba046ac50649609befd0813586ac003bda22f0f0d6eb69a55acff78bce784cf20951e804fe224d859b3d463080cc3dede47541b56e48bcfe0a6b28cf68fc13c5809bfb2fa3b394cb25aeecdc7a0c52724a17dcef255c735c82b3905630d730937fc0e8d001a0b668356096860c686764aa803ba71a33edea13cd735748d79d2f33162846179429ee99217684a1ada8ac8612f1e273041765d0a69fa3d7cb09531ac1190e5324cf116460bc846beaa5f0c110474b447aeba4dc71495cd52ba0d0894a98c2610404f37a3e0a34dd69f71366d010cd164c5d326b23230305284606e180d03b2b67769ee4e0c9971103bfecf9d225eb8e5140298e43033566dc5ec3f60fa0cf65fff6bbf6f8df3d4c55694ad3953c11b9e2043e795817fc2c35ed1e36b2effd16976c79fe3fa0a4f280909095ac721abb5f6ec2e0fab0bb39d9417748f1d9583513b17cb02d39bd2ea7f8ee1d749ebe50c005cb1537a3e788d6310fddb9de32c0ac30baff71ec18db823d7b969aac5b8ab650746a863fe90acc6c53f127172bc7058059db0960fdd0db85d25636b99de71e7ce47a386cbd9cd8d930109b270452ee4f899b22722d46d20878ec2cbe213002cbd6f5cddf47e748445c1a69fc73953ec5b95bd65c1183db15fece5abf955d97fd31f3973a59b6ce9fd4b2d1a273844f0b33fa608d8244c606d9eb3ac3adef1f71573d2b785366fe4fe4105c3f49347366f26768c247d03404abd3f546b1a1a277d2213753b1dff782304a71aa299aa84faddd8653f4d701fb54113ead1b16bff8319ee68e095a434a2ffa098fdeabe79aed2ea64e90cb770e93d8c147af693849cb48b4d6fc77da4b9b445b6cd974089d750658a15a7610bf6483dd270ff85e619688e3650ccbcd5a3810eff56af1d8429a49d3163bdbecdd5c12b4b91e115fd79e66b9f515306f3b8af390aec3dd395cb23ebb1d65dd8a757ee74e4b67bf1a2d86b0bc4070d0c44bf75eb0ec6d327cf4a83990e399c0b6079a2fbd7a9c1ef1d0c06ba9f86c2be591f692eb1957509ce528bb0fab84940426ff15306d0f702c833cadb3f577e33360f801cf22888676503da711c9a0ae2ac1934e8ac59f20b17a43ae6c4b0ac81561640ff57ae73d798ecb0b6759ebd83b3a5f2b0c8fb67fc4002da43f015a239ff22c3b1a9a0e1e391294c7dc7847c773edc175040a0b46c818c2121212f96308915b38544d2f909b9dd3cd0c93406589ffdfeecabd3a6a914f3de5d5fdbbd5303ad418d245a6da49cf22efa6a729279583a6c88438e74a2ca1cc8b2319366a915e58d61c69ee12c3717e879ad7573364ae014e81d57dbf2fe28b826a8d6869e38efbe5c51e5a815110e479e6697e6a12057fdecb169b63251d8f45297a0096ff90b14ff93a58d157452aa2f97fb0f0151e1bdc7195682d6c56cca64a1274d2e27d2c730f34bc99b686fb7b37ddc26433dbbf68a5daba13da480d4c0469f266a15f79eab2cb7d6f2a384bd965d64c2f46c6feb246616823a8769c478148a3d1aa167def8651b445011821105606ce4bd525d6c912e0435814a64e8982dee3ccccd2e74c183f10ffa9005ae26c1b9afdba06f0ffe31d9f5d8de63079c73207d3b5166f648732c1f2e6b9ea03b3e7b4171ab3d87b98f68a8e36ac2d2c1612f06800215f984ce1a2821f57c52f4edd83d1293b7ca62d4d305d488fcc85f74d272753668d766e68ef2a7f573d8ded1eed28d4d812e30ef93ffb2b92ca47ab2db4c60010a58063bc2bccc1c429b81d81ab71cb1ee54bbac3cc1b9bf9d5e2364a4b0754a4cb749e32f883e897fb153fb9d92919b0779033e02cb09c6087ebb351732e3e6b022fd77cd2de05a1610c17e5aa5ec0b07680da2ecd4414588f1a355dc5e313b6ea2af277010580f7dc2e2afd5b83a60cd0f9b4726f9f2beec5a6185e5959dd3b9dedec4c92bdd7eb304ab02e3ab527f49d9e09490c1e18c7ad2912b33797bcde05c43f0ea0da22aaa3289600bc20d2d911bf4ef1b6578f114648d857a6d48d819b35c9abc7d1b875fa56842aa7362bb4e1d36061913751faa8b2fd3e39c1d64046f61957ea6396a7dda651881621ab54b355e8b37ff04c44e508cf4084dd93f885a7ccf55ff777d3917a86e4e98f29ef799ef2b2cbd02cf177fd0f0a5fad9ad2a82a3d7f69128cd7005a0a1fac99559fa471a5c62772892913f7d8d5a4a4fd3e54ab54f570b970750bb9ecfa71dde48ff449bcd234fc4810d191853e61b6a421414c91901eb3567bcd1f89794c5a214862817df2353be89df75a2a058ca69491b829fccdff5f75b7bb94e729828ef561b3e9840d3997f70eccd54f694630b7fee1a37a186390fba00c9d1920a485d4521a9913dc72c8ae2ab3d238f8e3c8d5eb77e146698c33489a59773c741b3492159657d0ea8eb57ab32c5f94d64d024367f5d5d2cdcc3fc894303232f4e4464d7c3601ed6ad12e8da8a7b6aca7f46431130fad54f798ae719fced21d3f81a2296bf72efd3134b6d725bdde7d31d4daa7ac7f8c646628a32d73d2c8d9d352956615843653763741da532376b0b385f4b58543e20d21666e43ab4c2a8258b99c7f01e07ac73e0df73b2f9d6d9df4c86e9a22610326ff4cbed062f977cb91d72dcd1977e82ccd3529a4fe1751a93046e9ee1186f25e83904da52034f8ccf7447e968437a03e037aa1c74c0750f11c6014283cfb896a2a7b581a377a252ab491e333b8072fc7dcc6e106f2f089fd1ee2d03dca2497a2178864dc84e74fc2c6c19ede544a7a9d399f18af4dffa27947e00219a2d0fb0df245496a7c9b98f989db60d9e6c1a4ecc5b3db59c95b4a0c8ebeec36b13452f91487d483f64c8fe7e1ca4d8d68c02bf4da1690b8547f06259c32c5b8fcf0159e5898ef220ea6cc4de07dddf2015636414f5c8951fc86c705d689aa366864eea6d6e8222bad6e38f637da72e36ba360bfa90d76af9c461698510d5c3cead28b8de83867bdea009021929fc79eb239a739deea63b343d05ac9b1e13817bfb0f5214517b556171def6c3d1ff85ec89d07a68e57107d3ca19d168317b8fdf3f92bf202bca15daaf7ad25301d7b4da8fb78e817d61752ed65b56f448c315a73c18aa630fefab4455239da28090bd85dcb47463405b6a93333716d55065450d1c7ce6aeddcfbe16bf7280ba71b13f119d2121fa4d324ab1398c4d3cd9651c1b49e52a04b3b8d7b2fa058b9b5045b0341571abb8ce2cec21a43b815abf56ffee395eb6413f8fcde609bf29d3e86543572b5a1380e644c7eda288efb7dcc1a75e6008c61dda7fa58da164992718b8f2b5477096721656e2406b28300f41665f3411a3f6e8ebd84e78df8778ba44638df213ccd6317be7f7a6d5d7d7f07567d985a331427c218ff1e63f3a7b25df7f988cc72b874f7dbe05e8ba7e2a256d8d40cde3b226f5e7508aeb99e8aea644bb7d84348642955cc8059aaa9ef1b3a0a2643101a04bf08bb23194a694075e40148615db09f1fab2972e6b7b4f7855287a0746b0267e78f61997647f35bcb4b5bae66002dc46cf02147eaa4af69b052cc0ded4b263d1b700cdfe1c85ff747bca950a62af24bde53da15fdf8396f3d36a38266897a63ec6b65c71d4903db3318f4652116822a1dcda0605c6df98442eb8528aedbf8873c29939d127c448ec5a82ab7e89562086e36594917f63b17187074bb766ebdf4945ddb1f364aee3ab46845299bcda908773efef49f87b8c5fb662358d4045771c03a9cd5c68712698f3f60fac12334bfdbd1fe94eefa981fda5cc4c7c9ae2a636af775f681473ac8802c286e02eb5d6d8c686d47afdf320d66d58d3a7260b682e39111127068877622776a8f60b6fe84650c426495e18127cfa92410ac3687c9d898623617bb0c6ff0ecba387cc751dd568033b48a394e1b19ccf1033f4340491d67287c929075f7c4f2099551892c8fa87156c4b800ff82d51116a8d48db3b87ce5cb090fc76e6cbbd1587a99e4b33552ed674567015254d035be22c0abd348e03221f5384eeda975a5b276b3f987e651e9ed90feb962bf6c4660bb221744a45201c2e032d40cdbaa344f958c93d5a9669839601ce9f9188c2d20f13facc406fa592d139683a01b78c560df4f83af6c0943033cd64ba2ec4ed4d7464d5479a412dd10782842faf5a9ad43937eae586f3fe97e6793443a648ce8f9ac5031646eee5082cba66eae394f2c9dbc3e79998210c3750109d6496d14fc76246cc8e135b5ee379ddc8a8e0e656af9a8676175af10ca5691f8e0c586e2d13ab2e5b37b152a4cb792d15ba86df3673571998e9cb6c8a92292d73b5e7be9eede34266ee9c5cbee78c6621f7780dbf249351906afdd33e5f178ab6730df7b5c9ba6cad3b761d607abf7443273a8122ee888851a988de6fb98a2b09896cc367beef9a36175644430f2bffe6b9f7852ded0d74fbe9429b15e0c795e60c5dd4e834c9c31b5c49c0fa06e788e342f27a804b6e7f0d364b8fcd6bc4e98eee9e5a1f4a41e5f00d67abe78c364ba71a3e71b9fe5882ff5455360c1ebf416bee414aeb8a2113f5129216ec59f9620766cfd7e1bec990b741c42bf60d4b6ed0d0e624ffe3a7ac00a63951234677199d4b40b94c942d5bf7baa353246740b4dcc2929f60f63f0e4f819599cca5db93294f98c02e5a911d461ff3e6e2689d96d32030b617697d8980f335c467da65ac3576b3a1475b2637fdae3b6f4c0b17d5a071565542b616c99ece032bc724584c5bd040bcf9f24141cde1b08abd534b1458b101cd131fe17c89b991c00a22495a8a8cd7bbd9b7b2d21749b454b9c256acf79502207fb66e147c19fa92d26336340aead6b987949a9fb0e708cadf2de2f1f83d1c41d6a079c30c044f629cdbf7bc9a0497538ea8da419b625138d502370a6ceb445abb6552c9388aed35ea024d9dfae0f891d474ff70993866a73fe815aa50a566469413b7d380e1a083bed2e931c223fd4cc904fdf0fad43efe823bdde148904b6d6196bcd65371020b7424fe78e64f0d26ee1ab077c229eea7a4ac2d386c2b5bec0cb641699550b6ce6616f329bc036d74f6ad9af03cd9b6fd060e","title":"Number of Operations to Decrement Target to Zero","link":"https://binarysearch.com/problems/Number-of-Operations-to-Decrement-Target-to-Zero","question_id":198,"issue_number":50},"48":{"day":48,"pres":[],"tags":["回溯"],"whys":null,"difficulty":"- 简单","description":"```\n二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。\n\n每个 LED 代表一个 0 或 1,最低位在右侧。\n```\n\n![](https://p.ipic.vip/3jkqhl.jpg)\n\n```\n例如,上面的二进制手表读取 “3:25”。\n\n给定一个非负整数 n 代表当前 LED 亮着的数量,返回所有可能的时间。\n\n\n\n示例:\n\n输入: n = 1\n返回: [\"1:00\", \"2:00\", \"4:00\", \"8:00\", \"0:01\", \"0:02\", \"0:04\", \"0:08\", \"0:16\", \"0:32\"]\n\n\n提示:\n\n输出的顺序没有要求。\n小时不会以零开头,比如 “01:00” 是不允许的,应为 “1:00”。\n分钟必须由两位数组成,可能会以零开头,比如 “10:2” 是无效的,应为 “10:02”。\n超过表示范围(小时 0-11,分钟 0-59)的数据将会被舍弃,也就是说不会出现 \"13:00\", \"0:61\" 等时间。\n\n来源:力扣(LeetCode)\n链接:https://leetcode-cn.com/problems/binary-watch\n著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347187228a04f91f99075142254f0a00053bf0a56aea6410d1ec9878a833a0e65ebe221bc49a2e129cbe22b42dbfe7b231e23168699ed9d2bc0b2acca49b84106836f07e8edbcb66dd77f9a02b222a4c64ded2298e9564f144787f47f95a2d4f69bc518bcebcb01749bc1f3570bd6dc27af98f38ed3872373041eded3e965ccf149ddcab4ba52f1f5e6a04f7bdad90999bbed5c08f6afee62d447e2e91921a706046f2e293041d7b3fad5a936e378f077705bd1a985501b9426a3d8dde47230a11f627a6374a54c38052299a87adf5d179d4f7dd5dcad53e87806c3894eefae85547535daeecc92f392c26860f332031aaca6f84a793996483467b710ece505e5bfc1fe92cbf6db414dbc8884489e20a8a0f64d0d409b6a74daa05f9d145d04b21a0929cb5557300b3bb14b6d7f066e539d5039fcd4b3212cc3566cb9b83e002e5da4f3e7f0f28d954ad29f19d36357d90d8fa79997858fd6b300757670f56e5f82cc5c01faf5c073e1f6ab558a0a6a70cbe359544557f1f0fb4f0642c77f6042496f757c1f1e162ebe6756a53fa8cf90fa4854b467c32ba14dae8371bb8d116d76fa4d0f76d9916a0e56374f1024aee27e47d9fae9a35cd37702ef7d8f06c6b180cf447463d8288e9f469c3538dcb8f1c18e0147f1fd58d1ceecad02fb797efcea2cc20a7b4e00c88e72eea64f1c54bf3c45908664b9c6ef71f817ef45f0d129e8f2c062e24f68221e6db10142a772c54a9251a3e5c7c5655f4df844268326fb794bbb89eb961e84e088d7e2429ab4f3a2d473ab7a7f1c7c37c6e077c2fc7452c6d8a1cf01f47994f9bf10224b39d1f39ec717964b0617c0667ed8819a7de5bb347d6e2d4c7f4c2d83014d22c07350d6e4a1c39e3bc20d7a6a3e09ee38c0dc4a290467c77c304cb5b33e66005d2dce4860ef43777c2720b1be2def8896941456ccd2672b84897c6c4d60ade53a28b3fe0d064ef384540a95b80f3535cc9cc08123815096a5ace6a7ac5e2ffd283d70ccea36a49cf9c9cb64540e75d3d5a40bb60301b71ef77a2d885bb58769f627bb307ebddb33d028e29b012a01634c15eaea8434b102d8219f9fb68034b3ee9ce11beb226bcb1dc9030c35dcf04e07b8449e583225b0e928a8b51125215b4de98b6fae4f188e4b9bdb2ed787439f4f3f8b25a5416203030f3e34f914273824be12ea0fec9a5ff8f8cf3189a1ced9fab8bf9d6cb86f2385ffc810595639a32ec092dc341a4a72df81324acbb65e2b8a25b3b7145edaff2cacf9d716599d5c24fb08cc3ad2bc4be4634b76ddd570fd9d03ef3c1dd398e26621a9ae4ea2bae5aaf76c750b47a212b2bf7ef145567b0a5cfc8b6fa8e93dc0317e5fee0bcda64a34a0dd0319aceff877ba595df80a06337a5947e9d891f8c86b037220ba6af2f38f5945b15f5a4f404491cd625ea58b1d00cd6a2a94e6f1e72c75e1880987bad5dbcfa2e0f24b75a48231317966da88e2d64183f4939c5b85691caf8924b86066c2e67ebdb22f359176183cc56b51352b0fdf2184f8cc086fba11e4d03e10c62fabf49a1183d68fa119e9f027f1917ff876ed12567fc405250ae1877ef56682976948f9f50a73360690c11abe5f0901981c4dc7d2446f018b822f3c5a33ecfcf2ca89304a197cba0cf9b850476b2e389d5650a5b7b8db600cdedf8f0542333d5978d7296be481284fc6c92477579ab085efd6a9ffe730ecadb9bc11e226d039f16a72c143f62b88d38b2f253290d343e5fb4eb32f24682280377279caeed52b8b7b946b939530ceab37a4c938c1811f147f3de5528bd5d1318251c95a790e97a473f3b4f060376318611098e4b8c21590926fbf2d2640f517e118ca3a4741a3dfcf18210e16cf47a0044fbf0f0ffe08bfa7ccaa7d20e841ecf15e15df00307a5b7ccc9a9d21d409423bdf7c76ddf939415d0ff303baa7222c18e1987d363f63b02b8797ccd6d6b9bc4cbcfca3051bb2992841fbb9e2972bb8edbd4d706a72041aba86d9f2a9e17978a7d607aafec66fd407e46ea3c210ae45c6f81288c3a3dd24c7374e3db51a5deb1a43ea8254dddd630874d9b15ec94fb60f585566d43714c09dc83d4711d7a6039a8ede4da5e1c96e10f83637c781283fac66fe67307e7f528b67f9855c29cb753208145b7bf488f3d2d3960b991ea74f1c047295565c399423fd157f157520407934972872d95386528287b43ff2a77433110355f076cb028d2ba923dcc73d331b645edc2f3b4a6a696543c7481cf733c67cf670e6cc732f080b928e6b09c943cab19b49b47d1fe0a81fd3fe8eef3d3a91780ce84338f0e4b841159f8cd5e75c3f129b65ca4a6cba58ee62cde4e72846e581f7a8d56bc769cf8d25afc55a90eff0faacf64a9e6f34d71378013a439203d10b913b5a99ed2f5e62a8917aacc9e9d20fab77d78e880101030749465bd09239890a0c6fc07b4520bdaac0a97e774505782fb165a1f039d3976c5509e9baf7b25dec49b2a1cfad2bf32dc31d62f067b3ba3b0235fcf59c20e68cbfa7a9e647a69c4fadc31a4e849aed880f33aef04256afbc7d611c3a3f0eef19b21d69e0c30fdd76f88167c8250e1519b3d01fe7123fb19e290051e1e2d01c36f05081acce32e5425d417795fbb0130c3de6cc070a9cebe9a9c9bbf47e0d66aaa41bfb5e4bc86dfe0a63fa68ad0bc3a121b9cd08cbda18214ebd02c0b346a91b93b307c425ea5df465712f4452a83361709b6baed4687ed343f1ae1a0ec29e8d5092378b3d4201a0efc68d20dd18debfcb2df9a384f492aef0fb5a8744850d5d8e6c0e1d3868842cbb45438ff9a93eb1ede770d92f4b9c79cd0c805593a8a9c620a2ff9c833e464ac5a36b50a25493b90838f82bd01ddb3728576a34f842dba1efe3e2d621a5898fefff5c21fde518f997195be32277306e770d59e02a741440bc12cd55a3f9a80dcc9256801c9ea445654d210f2df65426563f7ba82a1fca17144263f72a6801f8c64ee65bfbdf1a3593b98b7d7dfdef5934a5028a02e842ff96cca0d6ad5d2afb689004909701e8a4258e1babe890d75e6ae600e8565f9369769e8d46b80b64f9a68079f8e97718c8fc48f3b3a109118a850c8ee7dcf24d67acde46de8dd358fceffc5a89d95b8fa822ec1fb11cd8dbc85a21d8c4da3fd8016c48c813555e70f275e4ecd3856825e1194bacfa732a559a2f80f914594bbb1fa62ffe6748ddef75074cce828e15ae0a31c421f3d4205ed203a104c35ed62dd815e43311840db4a9b8a95c4f1ba3a5d9de652f0da8c4621d945ded6a23b93955a081d0d0fa9249b249cd63a6b8404d2b8fbf05ade0b555349cdc523892173acd2bbb2d8c5a602816b2bd42a0ba98e9e78f7c7579a3b061d8b9c81debffb5a7ab85449c57898d3d7d015ce0818a898e0995bf19e3c5f3665e9a4642496c749f25204459fbcb2f09b20529d650687e2689dc509689e1eb146077727d7854b036b59f602b29120aa97a8ee820960aa6aa13d1d9f9e2b183c6e1c0848cf0c60254360535f646e148ede6e51dbf147c5c1ce236de0451c030325f7aa5e7bcbcf5a81b46e9fad4e6bd9f168c5d3134b24701ed6aece0755b925e5ab830a248632b6312cd9dc676e1335510b0a63362653a5747e27163b0d0d5b417303961628e120faccfc39dfce85bb5b1ef723bac972aaa7989a802bc4a0ec67447b20bacca42f79de28ab0c729b88da6eefc5c249961bb33520da5007d1b4563b2ce1302e9b1c504f91cf3802a760227351ae63ee643ac033465d924410c283e4dbb4e3e981f2478813ab551e22298c72f773ce66093a2b4a9fc0e02e06d0e4446b263fa917c92f4ff02c7e15edf148a7b1ae95f19dbb81a973fc0c4376b02d0fb0df245496e687ea8f85caad018621132dcc4720b5d695f5eecaa4e8c33c135820c35d7952620bc0b33752acccda8c4cea00a1620b944ead787ede2c3af4867c73e5898ef220ac2396de46dd966e15332b0ea68aca539c393e0825d8e6348e07e37744826bfcd6b78f7e60a77a77e8714eae8a9164e5972374cc139cdd89bf35a290cf8f41defd25495c76f43ff46e977ed4a7a13b516659c3920439817bfb0f5246142f00333fdefbd2d1b6c3ecc89e6826ab6246dbcb5f8a5d6a73c5d62e99fa6e628d1590e17aac4149d597febe8dabd24a262367cc766cb3018a7cf76c32e32d5beff8595c218df898d5b298c0b2606b405c7dbf733903b229a1daff96b0463c11183ff356b32042942d93d41390e7432d597edd5ab72848d9fed880c52de5eb211127755da1005e8cd006e85c6aee75759bc663a4fc3a8b34a87f67f1a0069ac3c8c6e7446db53e6ebf80dee6a25295a3893b14ef99e130091728a8e7c550b15cb5531b07b71fe298767a2f93e11b7f070264a888a9fc9eadd3cff7b148b02d5816cda22f038572c5ac082a9e6a0f98e07d2c43470b3935b7ca371d39fede8f45f1b1e52a38515ad133c4df8430de0031eb51e8bb6430422cd52c88e9f77df5a50ee1affba1e0ae58b60a8925835e9d128d59c7a69eb0e9edf4213e1bee42361d1df4526700d992d6ef57ad56a539642b509bc7774f630a7ce9ceb975f7a5eb2ea613c2fcfb132567267facb72340d44d1e238e18bcce563e879ed8ba2d8fe40984b84ed7ef2e7bcadb16308071fae93ebb44fc83d0bc8131502621d9a66c87f81b7789d45eef7cc60b4f19643ea287e046739fbcd64c6cb15b84aef08a75dfdd7bc0288e1da334d7a82bda360a88e672cafae8a073e009978838b62d4cd0832d5d71ad122418e24204a3e88095df3bf58712ce36d150e00d3eee304e13503bfc1fb5f9add60c081a9ddc3e5e3af2c579de02b499f2a0aa8b1170c694946539dc9ad3aab4213cc1390e269521135c7c415acd3b60955aaeef1373fc9cb4f4b08a89f28859fb82ddf1520089814546338e63d8a0e49090649e6b22cc555b9fa4a521416cbae8e982076d99da38669b7d0d2a54316c4b344833dad826bf9d3f04c41c199d8880c497a36795926813793040c0e94673d765222802ed49804983a4c625ad9776b59ffc47876c2bcdf0f58cfcb1d2ba91f3b7828c5df4a57fb14d8eaafb982e381c5df2a3e0dc9b119eaf8e0265ca5508f37c44a3a109e7ddc9808a9ceba9adc038431589329c59a09f6d9f0a5dd14554601a2c7cc7834c093b71d6d5f359242975f6b21d6adc65","title":"401. 二进制手表","link":"https://leetcode-cn.com/problems/binary-watch/","question_id":401,"issue_number":51},"49":{"day":49,"pres":["回溯","深度优先遍历"],"tags":["回溯"],"whys":null,"difficulty":"- 困难","description":"```\nn 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。\n\n给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。\n\n\n示例 1:\n```\n\n![](https://p.ipic.vip/e9jfjh.jpg)\n\n```\n输入:n = 4\n输出:2\n解释:如上图所示,4 皇后问题存在两个不同的解法。\n示例 2:\n\n输入:n = 1\n输出:1\n \n\n提示:\n\n1 <= n <= 9\n皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。\n```","content":"096221cf5b628be1e73e8bcfe626c73470853d846a3d428f680b494ee7f5afa5ba126cb6b71e6983b7c364be6cfbaa5dbf2242c49b6414deb063ea3cbfe8f124fd2d256bd6c5d4f60c2dd1e8809412155da73ec61144c917d450a23e0124585c33489e47213060d0afebc8fa7a004c65ba5fa5dab2880b4fa20f3a548a6fe26ff19f0e296765405768ad719a47c001ba716a068c6529014ec1d81a78f2a4f3146e7b2d2c6be2cc2b45662fa0ae1960494cc1c49e393c7a0f9159924434b6167a2a991bb970099166aded7068c279750ea77e9a621773a6e57761e7b533532da1d8cbd3b37a64f427fc2b25f7acf86b7f85cf34d0f7a7712da8cb0bacf6443ef3b551c7360752fec938771871d7d1b7f85d1fe52a806f810cdbf4af4ab2dde714d4e12b6082e7a1a03aa13f612d995b68e48e0e9f9ff371cf8c44ebe27e8a5eb5104c8797131d5176b96b85be8d845fc2a8dfb3b9bc86d6628b29d79d35265a580989e4fd38df07e5321e50682b55e4c810ccf518a24419330648b866b7a7a1027b913b455069d9ee5550fd4325c25861865a5af2c3e06ee5ed73708543062d67a3ef2478fadde73aaa8f225cc6edb605f7ea8ec8f933c654e5e9efbd5667aeb8951082d928c4026c62993f7d476a403f06d65d6cd3dcaa83805d8ee945666c9f19dd047128c48f05e6c9f20171327fc1add5e316d9568a649c0ab43dc1aad64fce793a89a44fea43b243a52b7d05068af5551d5a56aec43ce2c2000073312c55a56c193b1862114fab8bc723133a63f9f423612456ee2dc1d41df4ba9f6eddb22a4525b698c1c1e244bb97106cde204358fe45e24c079220cbda4f57a2c073369df5210b90de7214b5958f61d4d0302ee3d8fbd5c7f7c0d9143cd22c0938285a46102be0b918d6a9972857608e05f2a9b16c932df45ba668988a17ae4ea2542201d72475dd530232c8595f3ba6ccc36ccc2172a46c9ef3de019c9516272e31ecfd64d1064c6b85b81d7690e076e66c380ecf8de9b4977b129ce87b3dd6d57986822bcb621a3f3682ea5551385c43b445efbc9122fa140c0c0691e60cb6d92cdf66457ca3ac50a23bd431a3f241c07a20cb80aa8857b34723c9928fa4541ca23175ae18775624e567f3079c42ad23d83b09a4938d2e533ae6d7c4807e4f2e6340504a147254e18299275a609bcd68d830dca2b9f69469e15c984c6f9649c404aee3ee49692b44b002e24bd5d32124d3d5ccb8f1154ffc8510945a883fd62121d6714b118e3e9775c6ab0c8baf3cb4b0d38c9790877d72ad6c759ccce18aecb26664b3acf6545dd5416fbab67e1f64ffb98f1ac594d2d3dafc91813a8d051067a377c69e01f75f8f72571ff1a0aca986a5d2ab895a10a68ef5d4a76ff51719bc70b1b8a3ae18fc9698e8af366c80ea23aec94698d7cf0f447bb2fd4d2a91fe77648bb6929d3479c5bb3ed926da0cc86ad64727725381380cedf16ace0ea9954b379059e817985171a7f87e3c8cb241133340c1dcdce494cad511b15f2b1e2fabdc75984e5a1c80920f8750068383802be75a7d2b2dfa002863e46f1be0c4d41cddb7c1f203809b18791b3ff08677d7246df64c5151a3326aef7f4d2b6ead86b762a437516b3616abfdde970ab9c5e1462442c7198514fcf488fb6548fb2a1914b29b0f395c49129db02a89c1d32c7b792cfdbf4da2d37eca925a2d90c5bc35cfab027ca4bf03a5162e4c498ebb0b23fa7fb87b92eb18cd0a216d188ad97fd00f6378e4de70f2aa136c0b2f311cf0fe76f4048c250d3328047d2ad77068f45bb6bf82c86c5b8484746383ce15a8bfcb255c86247d35415584150b248b815e39245c08156c8d41658e34ff14366c2c8988e808d4a4fa439cc2f6757e77fcbfe62bbf37e80d4966a289f5911e6a790ef5c1813ee166de439174ad533adfedda9efbd37d81422ab2d6c66fd5908711d2e61a3ea975cd4d5b9a675b63dff09dc41449803651c2bcd3898335de5482078533ae9f1d5bb9aec9dbd70a42b1fe19eb60e449ac98a9cd79fbb253ef35b780a5a3f03574814982e674a809f8d105cdeea96162812f737b40ed2bc49e5d0ed94d81749e3517719b02169fb388bda4840f6558afcbefd7f42e22234a94fd1d2bad099dd1948c1e3e5b248455548ecda353ee345bf68fba6e206fd51ab27d80331b398d381de957c3cd5c03b8d2679a7b16de60ddbad291c2332e1da649c629f2c4606224a90d1a243b6b52464f26947c92a01da91d96176f840d6168260936ac9a4c32518dc25d1a6bdd4e054deddf5edfd12ca7eeaac969ac6feba11c8ece68f2db63a0e9425964f088dea4f7d10632c01219a0fa1c3cdf9257a802e0a2a9fb8b9347c90c0fb921003913d25ad93fb5aa8c6eb9109d69ba20e69265c7a8c3201a20eb62bc76753d4ddd2905831782d0896d8568c7edf5c01ba8e34fd47f60c1d4b5d44dc6f0502bfbd090b69802d73331b7c10ac09d6c1ae7626ac3fada82703976c056b89b690325b891814467e9b3df33a859f85577756df88668c7239d900b32b9df34fa452508eb918634cd8c76c384b85cae1dc1e2db5f1f6d789abf9e97e3f0ba3003de84356c9088829071988761c07926b636199e896c9005311e232dcf52010932cfe0095d2ac71c7b7c8d0105fbdc77e076a6e3502bdee8b923bef91bec53daf0f1c7cdd99f1c846d320773a0a83cee9003614b1ea05f1542254812a9e3630e171944f44fa41851f4c0b149b096d130503ac97901b4f0fa70750ea82770403b625d4b9dddbb46a78b31bbeecaaeeee8d0606c364bfd60d9bc1c1562730d5c5c2733098e0c96a15924f61c2551d846d28266307f393c5d1babcde8740891ec63adb7b92aaa269eec78d4d6c2873d46762079ed2f22aa216c984f418202d8568e2d337e0696e7bbb7ca44821287c46495fb3b256404f6721a51ec30d9a002977e59b3cc07037601b8c2d969708af098921ed8313e51d762dfaf4dcec4c2045675bad7ab86158f43f9a01873393892ab7a15127f3cbc57106644fa2eeb64e3378130218fdb4db689c5ca917024ba4f77ecba9cb1e8c351848ed368ed36df7aa110ac66c9d260a7a7c9760647a541580b05af96d934fe3bad7422e95ce243c9cdce6eebddb75b1f380409fef1b5aa05f21f7adb210e774431fc6fc76d4fa36cf48cc17515ad5c0d5144815d04881c718db59db630f651a5ef0e967f88b3fcf60dade43ab8c1b20921d7aa28ce46e0ab571d67606805e7205a400d67ac2fdd925f473f9c992c876173025d12993a5c9d8418b388c60b72ce589a946e9d76f50f5149654de476dd799b8f7a04c48105141745e5195551fa8e476469f32061adcfe2d6da8922fe41adee27a1c462edd13ce2c714d575550dce8eced8bbf67069a45f4dd972ef8f83d508881809ad91a2991deada2604552bbde1217d889560e8014d3edcf3ca8d81491dd3365287a62ece81512e9600f21506713297c077027218b417a9dc6fe58ca7b38e1433e37fde695882f823126f23475d35cf127d250d6953044e6e148e972851cafb41809ed51470e05506035132e6ab596785af60fc9e6e9ff0646bd9f168cadc138efd90d8324746eea8349c526d3794e31bbcb6402c1e66c3aa8e9896c4c1f0d7e51db532f2c4fab8f7b51711f1dd7e93b325fe641234ba6410141b9ee318b42917e05d0f5c4462af27446788b6186ff49fac5b67d2ec20bfb71f151cce6c004de85fb330e2c06595ed3327b1cfe35490c321b897c60b0ba5af8d60227303a772ef363689215c11db011cc28ceadaf6fba8d1fa18880eab075f3a3b8672b23a8f6e467366089683a2635590b12f3f6f70e713891d12b92c645ba4b117aea988b3f1def4d4e727fa0a4a991f9bc90c7fe0c93863541448226eef6ed2291a07cc476cf08295a5ee91ebf88a21401168c3027a55711dd3d47e1ca4d8d68c0db04d67c3a1f58339cf9343a2fe6c2cbac77b4c2b77e750cb016ea9f7df201563645db78adc4cd95b701f21cef066804ee22f27d638fcdbb79e777b8d7a77e8714eae85d82be5d836748e5d8d8d005cda2c46010ea63b6cf0abd1a550b40eac5fd04929179fe1a9a141069039817bfb0f52461b2000707092fb1d4c0ac3bcc85992e63dc5aa5926f71fb591bd3041e90f74abc228d02b4fee42b7843f29daecc7fe811e2e3e64cc792cfd4d830af73c3be33147efe90bdcc774aade9bbfd1cfe638230e116a952270435c9bc780d3c0ee52645b00779b74dc475bfc748fbf5a948a3e153021ea1b2b4013dc8b86b58d7dc38c5a397f045bc25f51d98e14a0e68f2a2d6af05baf8e3b8113f102ffe43a5aca4e61c8dafd5ea22292ba2a1659315a5288a31c85b8e78ba8b099daee406101d601943be4dea76f96634cb1aebc5767887f070bb8382c6d6414364c5f344cf19ae8e3d24d7ca38826fd113b8dff02ccd6347ba5bbe9aa8599a25e28a6d7ed3110703cc0dbf871424830d255af86dd4f68cbd078b80331b0acad8473ea361dcd31ffdd61adeb5f5f3826bd7bb84cdc06ab378452934e36243908312abbd99312faf28b8f3d828e9b0b484305bf14d411ffcd8b96276eb2eab989860e595fc24a551ab908c704605cd69cfde2f22371c7824ff2c8ef04e73026a7af150a1022b09f8c08caff08afe26fbc0a0fdfd555fa3901f017f43019103c4f8bdb86da523b8c0e26fff5354a8866d448f7ebd4bad7253b0189c052f5d68bb21497316d7952bf4c5ce6189813d83a84115bdc52d1a60c3ea8e0bf256afd0fadc4c930ea655791ca083238b4615f0d8d1922d19bb7ff8a02b8d321a67dc821b90b48b23c3173695c863ad1b7a5a8561875f3da6e2b24a0bb4c8a71bcea95a5ced33314988bd53a25b1e0edd3cf074db9276b6d9a76767a003d40bf7949e7119c9e4851b6dcacb3e39ec9958902a9b09bb96578f9b527eeee0c9c28c3c791903034a6de41d211d987de63581beec79650e0f655336a3dc06a1764136b690c234f2b97973fbcc3295287481f9c8a8fd3cefe37d7de6b127964c02f0f03b4af4b4581689350d727b5ce51a47d67d9e6d8aa7e87faca0a6155eb63f2959df657e4c29227bf9c34ec69cec0d1cf732e513ec9d4b4eef97c8ae4f03a17aa765bac6b2bc99c7181de8fef9bda8780e8a9182d7a9177f86fe5c25ef85345bf37791344140e81ab335f330e8eedba2d196631feef5442bbcb6b9ae3f0a692738e34a20e3eda9dda1cfd5a6564814ec18a79e60a95807873e0b6d6a9bfccba5a1e","title":"52. N 皇后 II","link":"https://leetcode-cn.com/problems/n-queens-ii/","question_id":52,"issue_number":52},"50":{"day":50,"pres":null,"tags":["BFS","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个包含了一些 0 和 1 的非空二维数组 grid 。\n一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,\n这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。\n你可以假设 grid 的四个边缘都被 0(代表水)包围着。\n找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)\n\n示例 1:\n\n[[0,0,1,0,0,0,0,1,0,0,0,0,0],\n [0,0,0,0,0,0,0,1,1,1,0,0,0],\n [0,1,1,0,1,0,0,0,0,0,0,0,0],\n [0,1,0,0,1,1,0,0,1,0,1,0,0],\n [0,1,0,0,1,1,0,0,1,1,1,0,0],\n [0,0,0,0,0,0,0,0,0,0,1,0,0],\n [0,0,0,0,0,0,0,1,1,1,0,0,0],\n [0,0,0,0,0,0,0,1,1,0,0,0,0]]\n对于上面这个给定矩阵应返回 6。注意答案不应该是 11 ,因为岛屿只能包含水平或垂直的四个方向的 1 。\n\n示例 2:\n\n[[0,0,0,0,0,0,0,0]]\n对于上面这个给定的矩阵,返回 0。\n\n \n注意:给定的矩阵 grid 的长度和宽度都不超过 50\n```","content":"096221cf5b628be1e73e8bcfe626c734738e268a04f8178e0a5f66275d38001030fda0652af3b85e3f4321d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad2507e2fa97c9491a0419132f42cddeba2a2891648a54a22f51ecbecb8e7962d212e3a8a072e436a04b3e258d4f20e81055a8450608228794e4c784dab4eae4df322b6755607a263280c43c7fe2879f082fd33567a101268dec421457e2c87acf5f2c58a6e88d6185a32391db521f49355f8999017b65dbbec27c969592217d9212a33139107f3177386e442470425ae94b7c399d3b622dea15888f234121a0b260115a2086ad28cef51661a41cc377c4828c8b57bcad8b7f93a9423234b7049eb9d3eecb32cb9386f8026d4e6be45a4d709a43866f0de0ab0b1a01ba21851c402a5a22dcf163d72b75da8c14aa6ba5a897481105bbab10e6e2c69d8df5a9895e003d2d4a2afe4c58a8b11af4aa893e1785297dbc29728bbd03cc93121446a2c7defcc1303af0ac31b27475946d83cb3c4de1516ee092ce73d80da1833c82f56d10f05b23029c997854ebe89440ac5565b7962fcb4001e487d20b0138e2079cbf48d04d3e88eedf930ea57230f59ba6a6ea1ac971282f3ee3c9b6e688f3e5543644c2906f67eafb7e62d82ad718cfc6e6a709919da307f10c3ab04095c01e1b74055accfc19b72e3f668d0c249b24196a24b96836e80b32b9302ad03c116d7fd8bc24a6a9aae90f55b0fce264cfeaee6d8de7026dccdb8fabad89e420940b3fec0877d4447380c078d1d9e8f3c1e7e1ae30f24421e12f4f8e1aabb6c1278497494546635b6569b2923ff78fbb50c4efab86650c8f07d78a5b7f4afb7beb76bf8d23c31d4d9e6d9c7c1c6d51536d1330238284a829886e6a9161839192754798c08ec6a00d493c00bba72fa2386146dc2146e04d94587bc69dadda2621b4f2ab6d1f9d95eb8b778e65d7f6800ba679a1d08e74f5daf449092fb2e9e276b80f07b9b2e1212a99dfc8f5cd0b94954c4f45b45af0716e343c3c290bb4941c185dfe2af00a53a171be176b4d899a8586791606db31bf8dda333079829ac00d11a1cd93faeb4504b0023820ff8e67b035b30e9d810a0a126adbfdc8630aa53e904997b9249f191224b00929c8a4b005205bade8eb5e4f780b2c283061177bf8bb3377f4e887c8c8483f9876534f92487e3149f77916a7c44733e2a6e75c24c815f501b25c31f4b252483d93408a440f330fa6780f474c71c46a7f81829a7bd67e0afbc5700518db0b68a425440facc9efbc588c9bd85d126ace1575de057802b0b9f9fb49ca4e54bd9363ebef783db8e72cb1770ff40b24037c961da8f6568d8642b6aceabcd8c9ccd0317fbffefaad940ac4839fe3f91e3f5b772a58adb8e936a36a0bd7caeba1389b2b2101609989f251fe2964c2bf694cfc13b0dad8e5e42b2126fcb0045dc275c5f830606284ddb23b85b2dfb99807fd2de33dda7266cb4843166a7e2de3fea83b8c3f299c27ee8736f6e3fd68572d53d4963d28d70da6c66d884cc47f709020b46a61d5503f21449c8108a11b7025bd70d1d9e2b531906c08e5fe5276ce3414050a12058e0414c2552a24044ae2aee3d2c5b3ac994cac7538f8681624c1fc440da22b2a290a30946927a15b16b046ca2ca91b95534f20e2e7fa0bd0817b6e76cf565f8d7925b3ba4c5971fc2931e7d95b2ef3b8bead101eda6619e5f901c04e4deb173bfacbba31a1ca92d99faa92e6bb2c0f557381c302e0affa178f85cc43e0e346b83b1ad51aebee70ca1620257b3f4354e88880906fa227f2aedae6cae97aacb985b411c39d3d1c4f7cad7f7fcf935c5b03e837eddd7ebc16c4a3be69aa2e5c041257dbadcff2f3023628642a7280138a5e6afb9d9eca06d43ade128893bdc18cb5c3489ad7d2a86b9bb89446dc67581ba936eb5ceb949a0eb5b64a61897520ac14d3ff17afe93df1541a53577e7bdf2a78012fc58991084148f94185fb681d6d7c93648bdd016d559e468be5c7222f1aca43a10c43be896c730e4b1d55fdbb86ce355cbb67bf1a0f75008ea150b1e4a51c77075ef9a3ddc5b8709b494b971a89843760f2b5209c2c7d36a03793d35e7e4ffc90577ff629e77eed4e1f102410111cd3b59e5aaa60ab73713be98fb3d2b0c8f03ff28bf4a672be7700ea30bdb9c1a15dbae75c50a14b634f2e2bda2a95b0142ff78b7b7194bbfaab77dd2dc4d090c377829609419d7a2bf3ffc62d332b045dbddf3b89da595553d4b81c35414ae0a8d84881e51a73e5ec6213625406eb771e5872381f26df2fe72a3fd5c5a46fe89eaa7fcd50a3ce90f12a7da1d07d39e50b303c6a3abd5b69378e0cafc75afd9cc95338d54ce397316d37d91f415b668ba90058d91a85e3b69bf57e40d417b11c44fb723179bc8897cb06dcffef4f411a9fc5711ab8d506a1410c046fd5332face93ba9815d52733bae627c9bd601bce736ac7e0d6995b315ed3937c6ce87205d229c60d6f85f0da66f34d42b9d2e1a07402a64e8e5920bce41251d89d784a67c3dcdf3284e967b0daaaf8fc495d7e7c9a88cf71b8af9d97cbfe80350eef96344d884c487fe600e909c43a4c9666709e3883c4087c403c60ba7a6c5106a1b432f0f29730103b9d6966c1892ee00bcfc424b04aec9721b2f72eee79dff1fceac6d99ffe2cebfbf8de632c9c7e1e4d3a7f6cfd48722f332c6a918c313c7f437b84319dab846caeec7ce1d0e35de9af0f0031e084c80e252ce77253c1edec2e11a4a0c873e93db76f5a4d6a757405edcbf9ff7fa3501edb8ef8b786f596a7ca23a2019e31dbb8375b192daa51b1e77c69253fecc0d24d463b1653872b13ccbb7ddb68b85e68bd2e032e11edda92c6f23b8f8578c82946d33e07905ebe7e7d7a7e48dafee8e2ca3fc54fd28c31dafb280f6904e77b918810f504475aae2cda4e0388e19d89642155c6b00830529e509fa7eab8c5a7036d175c270b84beb7ebb42077ff36d74a68a9fcb4ed4374ffb7dadf9ffc938dcbc165832ca611b107e5b75f3604b6a3c6c991b58129868a247d7328dff45c94504e9760fd3aef61a79641c9b606d46855dec09e3499c2c1847d265bc31fb966d89874f42ddf60e7e46de8dd328ecfff99a8c4f1b8aacd7d92b253818c868df714885bf9bcc51f94af9b1f55e70f275e4e8b7704821c1194b2cfbe7dea0afbba0c863a93eee2a527e0ee758a93bd5d6885f428da5ab5ac1546283d0c1fed727f441967a362cdea10103f59049f42c8dec7ccb0fa7c56dab601b6a1ce3b09c76ad689b635d1c50f090c5148f76a9c24b1df3341c4449292d1f359decf8982c7091f40de1a799182ff988ba3e751d26b589b665efdc7d136b9a2079a26061d888989c5fab11e09fd1a429e0bef9283935dc65b5de4deec9957eb877210322ba0ad206fdbcf6cbb0c502fc0e8aa84ab0a529d650687e2689d814c2ed20bb841542365df8667457718b40de09463f4cbccba8e092de324f4695882f86a06266c5d4662d20c246310681a5364241485973958b2be128b95ce3e70e05506035132e6ab596785b45bfc956eccf80363a2a52795df130922624ad4aa8c524db9799ba783586dc17ae24c25f3dc676e133551594f712c261dec327e25422c1e4b5045360cdb4d02a03afa8dfc25dfd895b75b53f03ce09a6de7e2d6d99d27c8aee72e5e3b75de9fac5468d228b900728f84da76e3c5d31ed448a03a5d9b111c96a0563c29e87d42c81419439185310b8d60227303eb37bb362685215a43880103849c8fd6b6e782abd02df852c8065a7621aa58fa72de2d0a3f4c05d3c2fc3044eae5496a3b39a80ac10f74ac792e55a4a644eee78799bc9facb5b562b46a0c35e3614efe9b2c1dd8f3b2c4f4e5cab9169b6d1307976d20b5d695bca0d8ebf7822d130c6ed314121c254ec8b8314ea4d09fc256bf04a1740b955ca42b54c22c7da6cf387da9ccc0b574a277c4970cd6d6204e49645df5c3ce508b46781426cea32c8653ea7d758221fccab7c82c29e30167957f02ebc4907fff8c613e8e56958d9dc666ebd283ca3e90a8254a4124e171cc62c33bdaa3ec632d794dde971e54c42f925c1e075a6b61617a9ff39bddb689e0c8d97b21bc650e84a557d9093826aedf2e92fa3e3ddb40c9af29b552198cb4adc6edaed35778703f897135fa5c8311b2385bb0611aa1bc6a4b3099a29f9baad1daea6863405b74df3f790ad65712383f2f28a1a8d5d9f053b05180e15bb176579d2667fa949df677c97784c77151011b0eb72a0ee9f4fcfca0518dce414abe2d5c37eea0c76b9a21ee3b9f0ef145ade93872d27d6384cdfc4ef66192f77a165d2c5f16afea31f2f292dbfce89996e710332bca1d942ae8deaf21852644e4acfb57698d551602a312714764146b66186658aecba19eed4152abdb2aed1a1d8def0ecc947d2fe0e0bc809499fb1b3bb6d1ca620e74219f90f72f2900399272859ddb30e7437df957e8b0232a632c9269dcc4e177b4b90fc1b9dca9a6a60ae47dd97dc05c99418f47c8ee97feb7a0a964233ce907775e47956c6b1285a089bb4fd0418f28682b17c98e33461b4f28bc9cf7758cf6bf7cae52c0fcb75673147733e6f93475d4001d22c946f6d105618f9dd8ba6dcdaa448de52bd8c54526a9d55622eb15d7ed60eb5696ccd2b6c91b386628d7ec7f90f77671cd831db57cfc020344723ea3c1a11452ddf598447eed10c6a4fcdf72c5817c9c6edf7cec6c968938fe186c89e876e89963708f58fc7c4df07da2855d45cadeb530a7e3a44984975f69483954f62f2edf25b04af426b5940385f7dbd89b338319794a35cabcfa153fa8c58d7b0cca58c67a232a384d1dc0940e6754ecc22317731421a7830b99f7ca2eb5d6d8c686d47afdf3209f6d1789e47b10552f74520c2706d629351037e6b10969a80224db5b828fee9a92301ff29a47d9d3523f4dcedbdf757453ca5339c9892269943a447e55222e4d30553791e22e8ef5656edd0511858d9fcb80cc22c1d127573c3083604b46b46cebe781af28de12c7565fbd4bbabf23b4aaef50c6a9834b7d1079d63d18692f6c5c5d3fe2310af075d60b6f5e0be8ab949b5a1227663fd47f651996955db3db3cdcbc6a0bf12d740910727d7c466c0a83c2d011b458c4205ad83ccec57a82dad7dcbfc90f1cb88ddea743113e90b3a1dd337296c4330ea7510007def25ab67d914a1786ce8d52aa6b3968900e99ae2faf5a9ad43937a6a0c0a7f59cfd53341e8c48ce8f9ac55e3c46eee50871cd4ceae394a08c8f96b58ab26c4d6f3c55d3648b9e0a83370b82834f1a1c82459884b387a70ec3df95471707db4ce57967ed5013ffecbe3bdcb0b62b902730d7a2e55ef7a8672493c54ea0c1604e43fdbfc6667577486b01d1a33d54cb1e06f31e4fb8f2b629a46a912e935056d6afb34275fd984dea8cb222a43f5c1060bd7fa88a98ed11f4310162f3701248a0796c3a60f6fb1b932f4607ecadb5d39ae4e12f1a332c45a042deec602f6c0cd33c4d0672cae565c96081d41a5e7995b909b5d0a651e37c807573414d744d8ec730d9e694f7935118404cd8f60a3ad06747e7f87bf6aa926177b51326d5efe1899220f3cb28f6dc223db5d5418457be2eda0586929270384b360f30168471adf50d61aa4b5522bc55263832c653f7c5d4e0b1af3a8cfa1d8931e2c01d761db6d4f0bc624f254f1f950699c584391b12093a597fa4cb5e7c879e0ca8c2f60a41239813716f9bbc3fc2f6c2553160f36cd61dd015fdfe572888ffa7cd052c8bc6c9e9d36e58b29ffbdf6386731903f18c10c892f39d42ae766e0cbe8f5b7f732a1f95f0809d35ff4ccea060bd7538187781e094ed6a54132b5c6e304d9dab68f15e3f9d1610c03c0468a74c522376fa5b50dbfeb3892e094c11066e0265194c9ec828e399b8655708c1bd7ee24d0b0022938ba1f0ca48d22bc4f8835d96471d7d9056744528ae00df48cf155cca40249c0492887d722c5b918331c613852027fe3f3cac2cd05096e242d133540d0f393c7b7d3bdf048c78a91ae844124f7cec767cdad7d87e7efd9ae4796146d98d86f3cfaf16a342b7c8a22bdc1a8425ad3865602cadbb8cc6dc20ee3e81de5b84514fbda636cf21c4ecb47a73126db850751af66d0f8b12ddd36afb580af236aebd4f5829a392c9bdef3224b9c660b52687ddc26c7cdd8eb33b5a38b9e39eb176f7bfea527bc37b09180606eb6e7884e35faf528f159740a21ce02122e9047f8ef7a3b8b58466a77acc01d6f56acfc513ce59f9ec0b9e462964c718dd07e14218708e7951e6340c1a395b425566fd7a707db088abdc8c25ff4a18bf1a9b627b262cb7387e4137b81deed0076a63601604d69f546940f27d033ed6f63b8e3c9731555b43c3553002019a8d75743b7db2eae7b365fca3317dfc4ad20febff767a51bb55d94ccd4f430fbcff034ce591358acb43f1002c390b6795ca17580ceb8ac1728638651316ad44da9a89760e701dc428d033b42bc0befadf7ab7f4b369258d41f15596153bd8c2bf2d66497d8bc548159dbc84bb6efadbf5834495f2967f9a2db1e97b84ced4b8c4e0d449707ebbcf73eee1ba254c06163761a1456b334597c23a9e5a96a12431ac0dffe5908852a15a5f36c3cfe5f31e954b25b2671a60fdde85d186e464443e0c83c0cb4e6a6ad230ca887ad985df0c9ade0dc8668f24ff442cf362f0608ee233ec46feca3ac462ff48e7cdefb9a0b74fc6227adb92e06c5f9303edf151a5c85ee342f6e3580a6ced28b92645d8ceb46ccfce3a938a3e9ffc9d99e9d05cd35543e91eceb66cc5942476c7da820e29c8dc858e7ba242057563be1667e3efd9d21979aa0c602cbfbaa492faf71b3b0ed3c6fa799b30b03ee7d3b1f6f8fbe2f6a4df98dc5cecb1405abfa3582ef64d2678e54a1d811f3c7a0bb71128adb0469aec6d2705e9fe6cae923294b941dac200eca81ed3de3b07334c2927a9d0d60849766f2e448d65783f9e5d34b965ed83baad2006ff6e67d23c38fd3050ecb4baefbb67218e5257641846b57e5cd4a2595791af599ab276ff02a35943a6d3bb790a6f928b003b354b5d0ba7468a190ecbe27ba09b1f3eca18178138a148906b86a2f7565bd348fe9bdfb4d287dd79c78ef7e07dd380f8db5f84b57a7f3df7cd8f0b027db68a8077602a12b99409e5938abfc3792f526ec7e3f8bdf75d35658f2e258973972be5dbeb10495ecd72ee461d203db2967436c36cb1a2e4859d328fc10d82c8706a7503b7254639f6ec7283c35a196b52c4462c169bd0eaa1a6dcfdfa57b1decdd4829c80b7a3df7c04676947897bfed5798b87db75540d2dbad5c11d67a400897f389444a9585b0bfd5d0b70da4f8253eb00702aef099356543efbc735083fb2bee88620f32a2685","title":"695. 岛屿的最大面积","link":"https://leetcode-cn.com/problems/max-area-of-island/","question_id":695,"issue_number":53},"51":{"day":51,"pres":null,"tags":["BFS"],"whys":null,"difficulty":"- 中等","description":"```\n你现在手里有一份大小为 N x N 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了。\n其中 0 代表海洋,1 代表陆地,请你找出一个海洋单元格,\n这个海洋单元格到离它最近的陆地单元格的距离是最大的。\n\n我们这里说的距离是「曼哈顿距离」( Manhattan Distance):\n(x0, y0) 和 (x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1| 。\n\n如果网格上只有陆地或者海洋,请返回 -1。\n\n \n\n示例 1:\n```\n\n![image](https://p.ipic.vip/mmk1kt.png)\n\n```\n\n\n输入:[[1,0,1],[0,0,0],[1,0,1]]\n输出:2\n解释:\n海洋单元格 (1, 1) 和所有陆地单元格之间的距离都达到最大,最大距离为 2。\n示例 2:\n\n```\n\n![image](https://p.ipic.vip/4qlqlt.png)\n\n```\n\n输入:[[1,0,0],[0,0,0],[0,0,0]]\n输出:4\n解释:\n海洋单元格 (2, 2) 和所有陆地单元格之间的距离都达到最大,最大距离为 4。\n \n\n提示:\n\n1 <= grid.length == grid[0].length <= 100\ngrid[i][j] 不是 0 就是 1\n\n```","content":"096221cf5b628be1e73e8bcfe626c734748625960a3d40895f0b427e2234606a2e882dc8c9066ecde89f32f426e3ac57af2400c3906714dff32ff523fffaef2ef2326f68889bc0e04425c3b7c49b4f703aa971879aa5419f27f435c1f4b0a58f552780630bf6d86eacd4c2f64a384f4d9851b0f85120a28e3e60694cf432d7268b9646755d0028451efa75fb0ff86ac84a157f911174013994ce4201c8e785351e2b374a2aef8d40540070b1cd79750034eb89f42659270af3078c3271a44c09393df838cbc6cb4acd9e66336dcebdb55bdd79d9f9e808230654b0ca37119d20166bb501dda07a8e1081813321afc3ed4f747fade6ce233d12cb22efb6cdaea9ed4b86b2bd9a4284454e7a02ee575b47f7dbb408fc33a74799dcc512828955a47621054a94054f6747bc5ed144cd5d20ad90b6d80a3a81c7997ee8c070855bb8127081950107507e956b0ef1b88562eba9e5887cc58b8d11a166a893e078529df5c6b13329fa3d87743a33210028a5cd7e99cf77c77fa5323b6ab863a5829bb55ca1511b4e3d9eeb1701f32e78de0339b2e670d19abc56b5a8610bfa51585450f7b028125f60e43c938d1642c7d28c05f7c08ce5e733e653233344b7677ea3828213b9fbe716ae8110a1430971293124589271c7d2e9b28395528fd37d6b438c1bfd0c7210fe8f38eec6d714703d4bc1b3dce50aebb90dfb9e2b8d3fdf9d11e4a52d171e238931af20cd18ead588d65962bca396f95ce05f7423f2cabef4b4c559bcf4d19aa58bc24168069e84bda5221853705433e76eb5d46209124bef5650756651f5a498aed33135153a6b30a8aaba708d0cc8cf30801a23dead72459f59c6d87458b6586e4c622328fd7477f95cdfbd9bed0a226910a8ed07bd6f7c784f3b4c1ea1cd2c9bd69e551546eb50c7f6d5571223c755a54c974292dc159ee5ce71c67530248eddae7f170737fadde2a40ecba703fb5136754c54f755ada6dd698825f75a3d4bf80f86a11060af7e88fdbd584b4c379978139ce4453ee3ff77aba329c6581408008acd615d2d794d9f6aefa0b40fe6b5d95619f65cb792e1893d2e5529fb883f39b1df30ac1c9904fe926b466b66df42aeaf17070368ad8452b6bf25ecbd85da699451954db264d314b690650f02d2dedd4e3a7455f68ea88fc22e12110b36fed2c1058bd82a63529461e184e8e59b7928e548878909826b8d771135498bb8f7b01ec642d3e619031b94d8e0932506a4a382976ab730e32721d562a49e2efb172c632fd828370797bd16f783c9e77a183bc8bce2d3baf3e6f1e1dc76ccd82515e327dc3b7cca8b65e5a08f1af7797e8191e7cbf22ad47a1cf72bcb7a46856990d5712164d5ffee86fff6f4e0cb5c4bf9a07d03df7191a751f06df6e09b1bc5afa6ea6229beb379049007779f7a5132eeffc66a6fb4f40a48dbae602c1f54c2ff6462b312ac06fd27f323a2ee888b009187021f8149b80a9e752655d6471dbf6bcc516db4843166a7938fea690a7049215121c42ddee1b6dd126b22c149177d8dcc56a7c2e8d7bcc647e836020b50444474518f3e008dadfc74b08bb7b5113750aad7dfb0664106ed4c31f3240856cf5345813b797c2f9af5c659c06c5f305819c694c8cc51afa48c475d1dcc46d61ba9a3ada00876af743fb4661f4c6d432d55a9d477a083b434000a34a1e65bf74fc619323c9cf18d1797ccab3d7fbba00a8d32c3fbd64d07b40997e87f85583ef446eae8e3ad07c43bd10e227293ce5fb3b15a220f3435f270b222b1199c7b667d7a85b8d9598989be6854fbdeda06279bce264d5cb039a8abfe2454af0355b4acf348551941f68295b84d3e3e7405a2fd8a238df5052d612e9c8fe33352413ea62a683ae91412d6f1b42b0cd5a72037359aeaaf91ffe7a74daef3c965d62eb54dcb3c8013c6a9b2eac889cd1157872c8fccc857c991892bd0fe23309d5f75e3860d93a91aef370d3a998542a5a75238014a4ad721dd378b548a184e9ce66811235615ddce62059562946da34697a7c366606badb02ca0007b43fb392747f80f30c269982d3384076922bdc300e384ffa63fbe7f43d69bba14a312f73d5f2e8c61659b3f1a6c5709c68dd9f0c685a7db45681701c9f36a6fbd5ee3eadcfe3460050ae13876d9a99832ba0725b3a2cd3d0e138e26d5259676640cee7229a20bd3a51530c3af79f8071fa43ad5e6b79ba85b2f7ef272bf70c9992a4b52fc0d504f1c27367f0c6dbd26d3b695f936b564a9fa3fe4bc97a3e4c3a4cad1ed0ece7d2f69e949cd8e234bda83ac34e7ba87961d8b1a93b64bdec90bb2f63ddffd3c01509ed2f4ee8bc66e65f877778f9f590896f27ad644dfcbfdf2e0ee678e4432e14e2c7347c2308f11ffd2b605ce1cf9398b6ba4910ab389aa6132689772e4247f751ad64e821c1ab8ca896d8e61f3f0f4e017aaf56510b68251703e11f249f1570ef9e3b37f7be9419d51cfec5281a20f7ff5e6849cd4a5c54f4325f0291413a2bd5cf19ac4187586f9d76df757ac0b492d3ff2ce38f441c5a66b5db2bf69d5294333bbeeab5dbf9530b695d6f5759d03571fc3a2a8389dd5f1b5858b815054f0f74a73e73176109e088d50ff7a06963335bd65efdc68296c97f65e91f39eaaa18e14f0f39b0c1ed837c465f1bb2df10fcfc50a75f3bff319dd9c148c25cba4a3e7ae838d876afbbe97ec126d8a08909fa9b48b6d2b70489f83aecf8f4f6448082e8951c7a3ce32848d0fe8869f4166b4050308d186e81dedfd38ff8d132aa60159e7a0aa39d4b758facc99cae9541e3e6151c45f6cf48a11345db785dc989ae9ce06bb586ae1f3437a7c75b61bf3f11401144018344e8b88b25778e4d4cf7931df749270dbfc308dc790fc061c0e272fb23542f220f64cf03be226b2fefb9d92918f207912380fdd3fc43d7cbe2223f785d0cb7bd7104bf433f7bac76ae85abee4061657009ed4d556698be98354c4733219581730d2e3c29399f05f2a783f35e0a245c5698fc22d3a4026d3f4737846739f35310e0f15cd58be6b9160aa6a63b7b4a41566577c541d11e03f65a7c1aeeb624b990af4877c806df717ea080ca27516ce52c993774915a531072551f69f9459c864da7241b865961bf86d22f87f1be76b5a7f186d596b7d3a5cb8172f971b6e0c575b500bad673d5ea219201afcec41ca9bce8931d3c23ebcd942450760c0318c707fd345fc6261fca927a6eeff691b3fc3ed405f9351903f2095c4f0b0f2c175adffb8dcfd73fc1479b6d583c9c325e60e626709201cf2c12023ce691927e458a716ade9a37d958b5f08530a12f52ad564d29c3d178d149dc596ab169f86c09ade0a6d2389a8916f467b305e0f45954fde9c07de9b517119a9542ad037f2a1f40b5e2c44743bd99646dfb915ee732da9b9995efb9a63732805ad617f9098c58f7b1bfdec1468e3038e95ae6a2e492d47b6fb54dca0425ef8582bcceb3bcb37adebfbcd2c0fa8e1f6b418837834a55d4d202f19cfb948e754cb913b5eafe8ffef8dbfa47981a68ccaa5c2eaa1c6844802bf970c15dd173908b1df26fc8fc6c0d56767acf347358f6c0f6eccf90b3b8af1ad6f53135aa2aab25c5c1497a96cf9782b459991409b3ff4bd6c18fac3d4a8df96d39ba5c8bd62a99fa3ddca9abea9006d1597077ba0ff571e398a501b3515717971c7235ebd496d30680bfd0a2f1aa9d98bc931233c92c14cee2c97b41b2f15ea4f0068df5c9624e3c67899fd3824a4ffe07499c11cb796e60f0a909260da86b5bf4bf20b98b058d5c99d47c7d75d09313d333739470bd24fdf1f8f9f9bf820d090185bd5c4a7e1c5501f15496e98d178372724b314924e51f37c6250bdac07a9ff9ac9fe8ae79fb070be0b000cf724259a18aaf4530a7c7f321d0271d01db5b6c164f6e42e5a524f4a4b650d05e6a6d4fe52c980932f440c65d0d51d7e13309277d338ae973d8238c2915987fc5a04bbe76746125ee644ee034a851877b0d1fbc995565e4eb15b81e4dfac070ea11bc0e067ad22c9d6fcb48c7ea502e9be5cff890c13fd01ba97a8cd2398201d0349e3226a3c05a23c60c8a7ddbc51b719ac51e643283990e091894f23a139ab78f80f96dd97e8809215f4f6d219394e24403eefdc77aaab3e40cb6379612fcc90605d66c01bff65b1cb69b85311ceb4b3a086add21e5d7e27992535fb46997cf76c32e3691ea9f846582dbce38581bf9fd0a360794b433299333e11d1477345281b7bb281f0d4aa079032ceb526cc361190302eb3c6c9fc5d952b848e714f1c1b07e57e4aabfdf7baa0578c8a143cbe675c2beeb0c7379575e16bd213ec02f2b15609c2006dc888b209f37cd7fe6316077e551d98ef09caeca694afa697c2ab413d44c2669c63e4dee528d7255fe3fefc5730d87f4443ed5569652a1d6b20106611a0b0a1ad96596ee5816ff54f3e8da648cc816a32f1c9bbfdfed38d1b61ee85b24c4b1f6fdbf1a56a680870db3985c0927ea51e28fb50e4fd2a37752cc52cc7ffb277b0b943f1bedcbdebe60af260c83fc01c9f41da0f81f8dbaae9f2a0212401ff1b653a03f43e2e538de985ec4d9900ca39286e1e9396220a640a21bc82f76596dcbf7cae52cbfcf013277d247fe1f82214f94515648018b7d5422f87c091f422ceb645d1bb088cf5457b83951662c13fbdac36aa56f58396f38b3d127f688aa66f93f309778f9201b630ca0b1b19367ec68fa14f78ddf598442eb8528aedbfdf3bcd9a2ed177ce11be709de637d94b5bc0fe32ebd03c28f47c8e0d4dbf77ebcc54549df4ec39abe3ac1188974f27173908be7b4f8538fd4ab026a88f388c8ac1f29b3383193f0567cab4b35b6ba8978d660cda43c661653660434f97cd003b11e3cb335f305d73b0884c99edae6ab58f92c698c97aedf361d16f5882ae73451b357450427e0681607c174ca2f83340b80c22cb3b91c3bbceff6457e99a04d2d85b3f16e4dbdf757453ca5339c9892269946b113b4921200427573b9bdd74fbd66f1fdd5d468c94bccbdbe622c1d127573c3083604b46b46cebe781af28de128e5f598f72c1a43f9bb0e45ffaa9834b3e4404d674563d547d214615e2310aa321935b3c5e00f5ab85b1701227663fd43b234acc975bafcd7edcbd324ee2725e0a05603604605d73988b9f55f142ee0a1a987c8d952aa8999b9dec9a0f6fba80d392581b3190f58bb07226de893101ac0d431bc2c708b764914e178ad3c048e2066b3cdd0792882fa24bc7cf1337a6a0c0e4bad2ae07340ae81ccecbc3be4a4146f3e553609c66faef94ad9d8396a58a836c4d6f3c7f8331c98006947873cc83025b0dad43dd88e9f5c347908b89237e42d31aa06a61eb544efdecfd39dcabee629a357dc1edab4dde9c585093d936e9856c4e0ab3ebc66c6e713a4a56c0a33348d65a4bf50576b2b6b332c724c555ee501583fd834575e9d451e1e7fb70b87612446cbd7fa0de8eb044f7584e3afc6c430de57075ffae1b6ccb54bdfba9372d5544733ce3639ad0f811b803cbe260237f5eeb2b0d063797df65953c81974f0c1a8cb04aff82f40ae770875a2c6e5f7146949e7a91a2c0c59f161c4c4bf7fa0d60cc24108b9328b3f1f8353bc71c3b0c755d4709ef1f7eb831478679cea83af94dbeb411c1165d69ad9de4f297bad004ed68259726f8021159f5285d7d4001a4125f08777629a1495a81a331a592543266f581e4817f18507d129454b38ad5440b1409634249a4a5457cce9507a1aba3582071dd520a7fbd9634dff6d34e1b4af36cd61dd053b2ac136692b9b49f06689ac69aa7815617f99f98c472c078515f89ef5f849ef3de17fc173c49ff86405573635995f8c7cf7cff71d4d55ca5417c096ac2a4cfb5250313205c7f3c4ddefe3a921173911608bf6e653ae20d5b385cfa5b50dbfeb3892e4d0a420e785e7c0813d68330f0a0b24d0b49cbba24c80e474a269a8187f0891d804a96bdc2548d6d1d7d9056744528ae44dd608e2f75c979288147d7c1253d7b5791c0649470ca6c27f53f2da02cce05c4831094725d1625393c7b5766f559a638e95ac233523c7c8f39389f1844931c9e96e1392314a2d582ec9fb60ef32aeca7e3449a73d769ec767a4a31adfdd9889f74a771cfde53825652b6af7dc25bc4f1f86e295467f7032155ad3f61f002a0dd26be164da67ea2971e5679ec9bc1a9f45f76f0826ef963c99a962467f7c8fc251f64f0ff8fe23feaa2fa594ac3324f514851a4277ec1e812c301875c9b40e815e07a08e90424a4f8acb8fc84a01ff5cc58d6f920cf03ab0817f5c645db11512d9c189e18b1524339852a59ba3f465e7f3d0b706aa1683560c994b6ccc72ff34402fa45d43c3f7a7bb73b75733abe4fb9ab4d1763610b04c796543b05a62851709fa020ac72d2662d1c0d8a014b1720e1894d235e7da1e6fcf765a0ff3161fc49fe5db9ff777a06e711d15a927f431aa1ee6145af973a8103911d9491dccff033d71b90d1714255d5e87e361b5fa144909a84761f791dcf289475e72389f1b5db2ef5baf725258d6bf108bc153b9e8ded2d6e0538dfc50115c9fa94a82ac895acd465f3899131c65dccb24f848aaff39dbfda4639ea50140eccaae03f4293ebfb2eb72b16334e97957ccc5594eda4e30e8141445403e76780cbef7c28f636f40284b4282cf7da5918054d4320924dfede414c27a5eaae0fbf0b1172470f43c802441c0fdc2bb03a8be963d294e7721cf93aa96f7bce448d6380361b7919797ddf18eecc7fb4e0a8c727c55b3cbe0d58967d811b59fc93db40ef76edd514373fc5304dfb0968e10f1e5346604df811c02161b3ce864ac6b9347ad3dc8c363807460961d334410f536c892567cdc2daca3e7588356a18b2b2cb5f2e6b93899e3f7d6a768517be0fe8d395c77a464a3c14595740e6e8de4817b5ed512adc67e3fc39a59317dab3e3cd3a95ee1119820759aa9bae2f6dd92575d01762bb6f26e06e64de687697c0c28eaaf959110ceddd8d8a95836ff59fa704afe33f88343a261ce48f44aaf078fa42e54429eedcc7d1e02f18fd354f06674ada3e7eb8e97917c7b50f0bc126e24bd06f09d2f9fa282f34c39c46680d3e0211c5cb639aea0f44b1791a82688d3e68c000f9169006d590a7027626db2c50492c634d30b082c6a8ad5990cfb5d41edef969662aeed59a13176bb9c6c53265670da882412e7e69f441bdf1d68e382e216a67be9665d27c19f029ca719ddb2ea5cf9d6dd0c48399a7f83c00b0af21831e2d201e18f72a52cb1140b69feec40d81839c7a28ee692cf58ea8f26e8386ad14373d645e196b50ca7273770a301a442a231ac9a7a3b7a31cf5415aa46a4f0dcc8cb08a665404d4f12cab16ebb23fed8a732076f5155f248a1cc376e4507e63bf40d0580277abc83b152fe4eeb0c63ea3272fb26f12b62386024960fdce1775d0aae0bae936a7c0a0a5c78c8ea769615dca0c0ce46e503b372b8be14b428fbca8deafabcc7b083c5ded2485534c85f900d2d048c8fc39d26ac90dbd96f20dc57bf924e693f915547e03216ca996d29cd55bfa8d7d459bfdf01b7fcd91a80c919adf485ac477e841e134c1c9ae3e940eec725ca52fd0dadf146fda6f9b7f76fef00253c44c2c1a287773af1604cf6d2220ed92d95ac4bf31315db272b957125bfa6c55ae8eab304068ced3cedbbe4984c9fc7b4075a26e18260e2eda495f066245ac588ce26d366a1a9d1fa21b08556716fe1bbc6720557deb37500835c8171f0d3a3d488646bdc44cea69150cd0b0fc04187126144ca79e88a9d9b721722af9eaab28b335e2375c48dc652acc7ae0ee2b4e4e4492d5d1ae379f43956c4acbf66f7fea4d7360b1d3d791a6f71f5668072a2c44f5af56f8abd75b3f373595a606b692ea0dd21ef8ab3f2f5f4961504072379f16bc3e91c521d26526d622f3f96dd97b87b2bc99102d21a3309a1d131cb7be0aa3c288ef2cdfd92b79278fa653422905b8fdcd40776246b7d61d1e6497a137d70b878260bd6f7b8861639616ff18e10d6051a572137f7062ed3bd373e5ee7cf516c1c58619a904f3e9a35651172adb75cce0b0c36b6a2d9367c0415b48b1dbfe4b256012412283275f5f1d672ceb957e78a3951921a7f192fc142cf0b376a31a1964b563db2200dd108c64d7d7549edcfdc230cfff516f65e1d7f2676573a2a3dea77d79ed47e5bd67ea105cde73020e7e8e4edde2f1bdf0e92cd4740f219223af726bd458541f","title":"1162. 地图分析","link":"https://leetcode-cn.com/problems/as-far-from-land-as-possible/","question_id":1117,"issue_number":54},"52":{"day":52,"pres":["BFS"],"tags":["BFS"],"whys":null,"difficulty":"- 困难","description":"```\n\n给你 n 个盒子,每个盒子的格式为 [status, candies, keys, containedBoxes] ,其中:\n\n状态字 status[i]:整数,如果 box[i] 是开的,那么是 1 ,否则是 0 。\n糖果数 candies[i]: 整数,表示 box[i] 中糖果的数目。\n钥匙 keys[i]:数组,表示你打开 box[i] 后,可以得到一些盒子的钥匙,每个元素分别为该钥匙对应盒子的下标。\n内含的盒子 containedBoxes[i]:整数,表示放在 box[i] 里的盒子所对应的下标。\n给你一个 initialBoxes 数组,表示你现在得到的盒子,你可以获得里面的糖果,也可以用盒子里的钥匙打开新的盒子,还可以继续探索从这个盒子里找到的其他盒子。\n\n请你按照上述规则,返回可以获得糖果的 最大数目 。\n\n \n\n示例 1:\n\n输入:status = [1,0,1,0], candies = [7,5,4,100], keys = [[],[],[1],[]], containedBoxes = [[1,2],[3],[],[]], initialBoxes = [0]\n输出:16\n解释:\n一开始你有盒子 0 。你将获得它里面的 7 个糖果和盒子 1 和 2。\n盒子 1 目前状态是关闭的,而且你还没有对应它的钥匙。所以你将会打开盒子 2 ,并得到里面的 4 个糖果和盒子 1 的钥匙。\n在盒子 1 中,你会获得 5 个糖果和盒子 3 ,但是你没法获得盒子 3 的钥匙所以盒子 3 会保持关闭状态。\n你总共可以获得的糖果数目 = 7 + 4 + 5 = 16 个。\n示例 2:\n\n输入:status = [1,0,0,0,0,0], candies = [1,1,1,1,1,1], keys = [[1,2,3,4,5],[],[],[],[],[]], containedBoxes = [[1,2,3,4,5],[],[],[],[],[]], initialBoxes = [0]\n输出:6\n解释:\n你一开始拥有盒子 0 。打开它你可以找到盒子 1,2,3,4,5 和它们对应的钥匙。\n打开这些盒子,你将获得所有盒子的糖果,所以总糖果数为 6 个。\n示例 3:\n\n输入:status = [1,1,1], candies = [100,1,100], keys = [[],[0,2],[]], containedBoxes = [[],[],[]], initialBoxes = [1]\n输出:1\n示例 4:\n\n输入:status = [1], candies = [100], keys = [[]], containedBoxes = [[]], initialBoxes = []\n输出:0\n示例 5:\n\n输入:status = [1,1,1], candies = [2,3,2], keys = [[],[],[]], containedBoxes = [[],[],[]], initialBoxes = [2,1,0]\n输出:7\n \n\n提示:\n\n1 <= status.length <= 1000\nstatus.length == candies.length == keys.length == containedBoxes.length == n\nstatus[i] 要么是 0 要么是 1 。\n1 <= candies[i] <= 1000\n0 <= keys[i].length <= status.length\n0 <= keys[i][j] < status.length\nkeys[i] 中的值都是互不相同的。\n0 <= containedBoxes[i].length <= status.length\n0 <= containedBoxes[i][j] < status.length\ncontainedBoxes[i] 中的值都是互不相同的。\n每个盒子最多被一个盒子包含。\n0 <= initialBoxes.length <= status.length\n0 <= initialBoxes[i] < status.length\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c0a525fc6e7d3d784a59422654a0842463d9fd231c0a9847ee3b6bdb79df883c5ba5cb3d35d527a9543c78ef08b89cbc122e1f76d3e5445d4618a6afbe1ea309484d8843d23ce10961654e0889f348f2b93046ddadebe9f6500f4c659e51a6f0bcb01744a62a35469a60d858f1a80c2e5d6ba3e4d5622487139b0fee2b5748e858764b718ba7222ea0bd8c5c5d1e743305aede7f23796ef896771d4224a8f3f478271b6eb527eb4f7f19a1b09e1714bb6f0180544073e6ad2582c39f13b809f31a5195e655680425a09772b18ba2cb077a4df4243a620088e6ddcf90345f34d6e9ae770a93f311b7f88d40f0f003e281e9c450cb38551446f9323a5796b1bb6da61ffd38b99dbc22e8c94af90717adf470c394f74f9a53fba918b8b27d5fac90573f804d5191631c9f42a574da9a771ccce4d1ab4c64861d55098a1d2268573d426c599346e3135ca5979119096714f66c15fb13bbd0f6eddfb56503b52943b764dd4675263bc775eecfb46d21b1bfaa8db55f49fb53ff5128e84c479eb970d19abf5fba925b07ce4752746cfea32b1e487de71aa18e326cc5cfb207effc8de1c231eb5e072794219e8a327272d9392469c446e29d6df6cda2e6aee2c354a6235910460f7eb40d31aef6ae4fa199177802f18c21d8cad028781b552220bd8a20bddc018bd639cc790c55970a54b6fbea99c036d35ef74a90c0dd9d4209c381f79f40769732c90c565e3101b860b3ebf297b6bfc24168019595b3813a1a7257512bc4a81faa2775262eab791e27732fb587d40e6e1c297e7849772e7744f767e44f34a006d333cba2784f9fc52138c6de0cb4d380b49ab86bf8d23118e5d6fdf7e0fa3a53f0cf5fc98d38285d451b30e3b708d6a9972665738f2dc9a9b16c9323c244a75a8a68852a97412d738034582cc210783eb58cfbe93a712125da55339932ccefa2b905b20aade6770102fb2ed5fe15bf5787c95f60c7238db7d649083500e7041dc99c4d588fd304ccbd5d9642625b11e1987f1067423ccf4286dd8542a22042501cf7b109f0a40bb12c7938fb8e0ef12f9565a4b31ce8077dceded5b526c45258af82fbfb4370c5341bec3c140f2a82fd9a65a127db159e4725e9e0be471d2aa5901d5af89ac3eca6a3c8c081cb3e4e26f68d6ca7d5842de45a3d033a0bc5ec74bd4c768248cf1fa3d0c081c3640b2dc215f0addcc28e7fd4e18df3347bfd941897568033f81521e263a68129f90f1ba5a76ee797b4b47a48fceb92ce1e4627a5edd197ff06387d1820f22519accd3ab0455600edd839fbcbdb21823f70dddcde92a7348d1124a251ff1f1db62bf7d91a5d7cb281d8c4bad186bbe10312e1ffd29ed84ab64538e332acc9f9bc7ba987d28fb95a34aa987cb8b019abbcb1323d0b8db4243fdc956029f799e4c1060ca393568519b665d927aa5a591e6cf45d3188997799559af22c2e22b64f62ec4d1be2e3005192f91e04713dfe9dbbc2d19bf456e65a6f623bc18975e63e4a50d0b878d85b72d69ce948e602083f7aa9384503ec3c6fd3b68e0aa7edfc854e97fa92f1172df8855edf265bf3436b6da20256ef6155246d9385ab45ac3673640334a8e6c19d399ac4df552874dd18810ff3f885f87362f808271465276b675b0655a0e4759f8a9e237e6d10100821ed65f81d1604728da63dacc598379215f25ba24d4c5408d1a1fa5d91ee6392566fb173bcb0bba10bd52beb506b75a99066f4b84c6c55600607fcbb33a5049d7b5c4724ccb7e749a7f2e915cd00674ed09c2f3ad5b04029c410376fa1a36eb594ecc89c4c77163399d296a588e0c9a0a628aaac559e4d84e1d488453a09ac97a2f8c5542278a5b0fd337c70a43bff14aff3d6f5d8dafce9b9f35dd37958888524f219f351fb070747eed8a1f1d3750a844eeae28113cdfff434a7be19480ac008286efb0364c930a8a4b57e46cf6e5299f5edcee23ab22ca655f937004c8437e694a880e64f33918462c1119a5ec1155a822434eb4d137ce08c99ad94b3cffa2f9290cc36cda7ca4f90cdc03c64df76681f2ec362b4ab015bc205c86dfe61071ae9067dd7a7f8e199c05a5725f9c8a8a9c7406b2017c9c7616f8f6de0cff6f1327c0306fa3c62eaabab3cb60319be9efe311c0d8c2bcd2bb846662aea732a9f08e2b5ddbd7fa75ff00a118f38cdcabdaf945a287ef3588070f5a6ecf7e3fc0e564d201e345a356c9215d3b9af3cd96317b83c45dbddffaba2a6aa593853ac2c010e268a647f09e8a8da54147fb9a6eacc0def40acff1ff3bc62a3a864d259e69d38c2c595bb858f1846840c7afbed6975dee7ec00caae92c1a7bbf02efe457fba665b255d8865ab7b97f9d35cc6568a1cf321920adf0feed5417c1da8138e082e1a2eb910aa6e64afacc25d12bd6f98ade153f3c527788cea33476163d0019f5a4d9ef6f8df9b85d60017b4c901c3845d1af8436ac0dfdaad4b3374db54849d682e2fb8bdbc446ed0b1c3276fea6884c3e0aa7108a75f9b5917ade4157b36c16a230edc74dd1c9eea6bac1d029360e2b8c818c1bda81283dcc491106360cc9e1230edd75599dcc52e884edc5fac852988b53ce0071be9f19cc4a517d4d8dca6752885fcf354bdb0e347c8a03c5cb21cb3146cefcb4a23258f6859b926f50a3817060e3e583ad51d3e240eaad34ccb9cccbebe956aa999a4f0cacc467fbbf3d399e9488e111452f81726de740224f592c303bedc7d3b29b896d360c1a03d2662d09a694e47be2475d2260e0f6a685e6fedbcd926eb1abf93424264c90b5c99a0e8c02fa65165ee1f3b4e392f867eb2d77d633e2e5a3203c3b5dc1e74998dee0cb76db1ea4ebda214f7b5989b580d654a20f54a49b848f70c892db37fb66ef99691918626bfaabdd840990f93d46d95708089ac8a44bf4e41937ad0c3987bb925aba57c0d0b699cacb16cc98bd5a757cc783d3c451b3dd4e3ffba99ea7d227f3c39f3a347db7882cb20396314d1c77571667658472148463ca224882dc749c91c59d9eea15a0a660d0a3047891d04f1cbf8967e2fe9148ed65f25bf6f79b72d45cb6b9cc150f291406bd0274b5e37eb19e682229358980779c78d799e34b2b76df5dd08d190ee88b9a9d7b8e98c33d6fb16d2c8decb8c41de18fde4c50eceb6fc3955ac4a7e0d4e96777ff9611da6e4c3e500fa7196c74fd47995a0a8f96ee3ab7ebadcaf182785f928ee73c8ea6e2539463f78e120735e0561a42391a25f487a0a048242b3cfbae6782d89933a7e876e60966cb5098d120a0035d51093e1632fd53b9759911e10affb9710d3c684a059c3cfb5c1f341644ae22f77a5c7b19886899c40c27b25976615b89e8236f0ed2ce1467b55ce99cec2aefb5756b45e6ad879aac1838e5dbd202099d2ecd05bed876f1e3349f2f5217a88da25c07c7af6525b252a1bc5ce27752c4066f2591fe72e8b8162af7e14ad0573f1e8bbdb28fdb3cd22b197b5ba930956f228e56549fff46a172e65515b279c0c7d2538725f4c687c6982976314c1ed129695b5450dec2e7b0f2a1ddef30c7684fa1ebdd720dae92c2481b43bc5ce1330164b12e09a8c297c8133cfe2cd4370cf73fa53638199346e0e352a4b43266f64608ffaa9d887d9c5ca8bba296b30d7028afc553d3ba14517090d7179a773ae8727b4ffd98d9a3588a5e768576627f483b15479c238a92a21dbc58e23b0cb9f1ad45cf46f5dcb4d44dda0562b6cad6a0ad7591e08c587381fba6069365ab839f7733a87214711db1c428980ebc2b7eee6c4f73fc70aee1a107f7ece35ee7a9e73476f286cccd7ee3711cad14c426fb861e505cdf63a94e3fb6df5a62761553835475c125fa817855b5c738dad9ace24488ba78af8c1dc83bb17a9606707d05a20a4c685e5c49ceba6de75585437907471612b028db03948ecd8ca9102ec19e03d5ed649e8271a997872de967c6ff889c5b779b9178da37c97a22009633709b497dd4cd70a35132fceeb4ccd0bb33e15cb161e567317f3a71ddeb248ed870d1711933853fbc641c5314a7d74a35b7e44709a5308ca210924e06ca160d83d80afe47560706ec9c35b40fa3286011e035a68547b3fc2e6d282e282b89dcd2724bd2240cbc77dc9092466849c61dcae2d31c150df8366a05612ecd78d978d8381022e623f8d2529e706cf13b92b66ab0718a0b65f583c96ef92b7b189d6b5136373edf451abf48422a7ace5d89b8b7b3c24123dc959bf184c9c0aa7d42d82e9402c5e46d5bfed0b21b5d796dcf257a6c7577e051222817f069f9d7afffcef763a008c74e4298b44bf54c74f2bbfa9602a7dc894af09eb67dbff6f57561c590a91f042c5fda19cb5bd7b06f20d68529e5cc07fbbd0e364992444f9d4a557658b7f5f4cea46652c2876243e1a676aa3cde8ff96587bea927fae0f7bc8a149988e123bf5f2d8aa869af0ded55e423ebf858aea137e0340420570f019f6a6fd33ae4fbb1eb86963a50042e46cb14f0924f2774f8c1b65516627299b4d77c2b77cb650c54fd3343a594532aae4eeebf97ed690d5a662fba0ed4b510a7ea87a8817b3a1b2fc5e4ac78c91eded071c33ed163331c267eb6e3868b9efe29db6001bb7ae2283e08a45ce715e95fb49345b73963f2b862536a12627d6ca4b0aafa546927b0f936ff0604c0a49d93bd7bbdb520f930024ddf43d6b895dce4ac0ffd69cd3253d248ad4643a04e8eb08fc43503d19921510d441eb1dbb779b5223d22e8e9066639a6b15b29c30bf21c4eb1aea507f91c1053129906f7c1d8d1c1dd19caefc94077d4545c05d8f7eb4662f8bafdd1d702af71895faaae80e2f369efb0e511fe7ca66ea02b089ff8cab883374c790a36708c79acd91ba1437c7311b258f0fd6baa0f51be65137b934eee8752cece2d3fad8d7a093c163b5fcd18f3d0ac0fd69c79960994f6309feff6957203ba31770cbf8ad561e52c5bbcf6653fc5918e7f932fcd6ffdad88781efadb76138bb492ae1a86fc1813558334e125e9d047990949c92a96d4b8f15cb2e4f11669a5bd722a1c45a9a7f6ce7235b1bd008305bd187929472b3ed8f91f0918e9261f8be51ba4aa3abc1852e1f0d9b094666326a873be5ff0e15945e50ac7521faa777bcc78de1b6d987aeebac282e689e72f075e4c154f95957bd19751175210ca78c315620039ecdba0a1a660ad6e16578bbc24f96dffe440cb135935a9dee100868a23691e7e94c984530a76bc23a10a1bd6015506158123ac8878518ec0b210100d384837977cfea3fa0437d51081c482c111023de88e28c9a4fc84e64f212e5f2092fb49fdc7917948be1f9ee4f8fbd8735785414d049efba0bc0de2a601fca565162ed62f1a4654f6cb13e1091e956128d2c1bcc86950a2f5eafe690aae2fb5364efa959a0e163cd92341e1803c70eef56ed50d0266e1ba4be7b33d49b8cbf2261affad6f23cf052235436ee6ff7eff249c8d5e312e0bd8ae6062ca064c783b14668533bd3c2891075576812e8861933a7ec98749ab79a85a94a54a321b3473bee0c79aa8505aba7e740f039c47e3a680b7746d39a4ebb85b8db893c604948e3f60f388828109a8371edacf1637a90707a86abb8c5c1738f8e6ba2937021fc9b159a51be2fcb1087958f67121d734c6459d66de4e6737fac4b1663f2116f726eca1ee0d2dc9efefd26dabf5edd7ef78e1d7c32eb9fa4ce665d016750c002bfc99c0b49135f6f0101eb994235c9ca12b687a31b6f3f89134331a3f85690ae961d174aa52995499f47e1b75d3ac5f1e0d60221d38fcbf0e3534fa0ccffdf29a0735a56a3ef5f849eba9043fc45791aff9b40457f2a568eda809d35bb0a9da827be69394132defc88cb3b03423b767f3c4ddefe3a921135de44539d272b6ee2445b225cb315198fb7f2c54c0252075d207a2c5d409e8b7db1ebf7325b08cbae2c890a14546ec7cffe8bc06080418bbdd7449d7d147d8e56615538be4db31bc7520e8304289c47c7da0f3d7b5791916ac42599242fbc36368a2c9305c4831094720a5e6c75797b7567a457e375b90e9b6671357cd413389f1844c454d7daa4392b15badbdaa19eec11a96cabd9eb4d96738667bc39716838b6d7d9889f74a771cfde53c30306abea659400d9ecbb7e69567cfd1e0e14d93f61f002a0dd26be164da67ea29709177ba3c380eebb753cf0986eb22690c9ed6d1afea4b3771f6cb9b1dbe276eabffa4951c37b060b484db774638bb74eba7acd219b4bf515f57308f4197f9be8bcadf5aea01ff5cc58d6f920cf03ab4159a1c60b9e46292dd016851bb2140d3ade6227ba34461a2746420d66a1267071ffc6abc4c537f74a1bbf1c9b31343424f636624d37a11bcbee1e6c2a1c022ec796543b05a6285170d6e620a43c97311c5a118219181f3db5925b0f6c00bff0e19970ecb32126b9008748b5ef777370bb119f1fc5064304bcee0f4caf983581cb07b753757e5b3fc69313124ff9a0ca72c27e361b5fa119ba9a84761f791dcf28c630b376dbfcfac73fefef88603ea741ac22fc557bb4a7876c384422f5ef4155c0f6d5f62f99dbe9831ddea79d38d867b1fb1fd0ce99f9938c954e34f146137bfeafe21431c0fdec20ad3a383f45deca21b7279eae202be80ebaab9c9800ef442457b8eafeb811c71320b2757e3486a3feac86ee6d0a620a98c7ca714158f13fe48d7acbe18b77e7de44862fdb3ffb5b4ea13ad872d3aa668b07a6c2688131f348eac5e8b1bbfe1c8c3673d0a3ca6c5f9303edac7ba5b90ba64a99ff311912a86fae310f8dcdfa719dc52cdfa00fcd98969ced963f8a0b9a73bb0110e4000ea2b36f7c44b0df8d84afac3fecd0b2aaaa1382eb290b4b26faf052c5f7f556b7e19ab7fd55320af9cbfabe12aa30cf731e3d086a0714666d221e3de6e3c34802a5fd4123dc79e3e9729f831ef0b3e3cd3a95ee1119820759aa9bae2f6d886f4fda163d8a1b46842b33a715768ac086a2a9e6455a4aacded08da1a261abc6a949eab079c62b6d2617e49e5faaff72fa8778f7a5092501137cf7951cfca7e7ee9d26bfee1a37c491021a9c1f05be688d66f6cc300d6db18fed5b7fcfb3d9b3dfe278049b47619f8134e4de1ff748a0df06bb239c71ae1458769ee1d21cb0cbc7eb84dbe172eecf88a27390cfb5d41edef969662aeed59a135e2db9cecd61602809a882726f4e28b419c2b49ec7773b6f3a20d68f6cb6394e8920c36ab7db2ea5cf9d6dd0c48399a7f83c51beee38ed1664290532f72a52cb1140b6c2c4c40d81c5d32828e67d48a18ee1f27483c5e2132d282d42197c32982a3b356a58674d00231ac9a7a3f1ec4ef54913ea3e4f44ccd8f69a755c1e80ac78905e90b249e688442063e5054f2d8a029849f4406e6a9540d0580277abc87d5a7de4e6f9886aa36d2faf6f53a36288465d299ace3d3fdba1e990e936a79d8aa5c78c8ea7696106b24958b13c1e3b656ed8fa61428fbca883ccad8c33654454e91f9c771dcf8400cf890d9efc729532ee37baafc002eb73b67caac7e5050e2a4d7f393c36631a338f764aa7df207373c18159270c894e404eb6ac4eaf01e433e28c5f02a219d83f36d25ec774151b94b1637cbd7fb36766c5c8508ac4d1b8ad996b91bf5aa8eaed296c54960036eaeed56cac2ffea41f3dd6f168320bf595ef16732992b400e19bfc32403cec6e5a69566b894916406216f819d8e57b1e237ae078e34300072245f21bbe533b284fa10317134ed23d1f0d3a3d488646bdc44cb743534382b0b604513f7b7d03e9cac9e097f2654220f5faaa1dfa1abd4e4762dc652acc27cab330640e04d2fffbe67202826ba4b62d77fdb326cfd5a60f63dd9b8cdd1256aeb0bce5f3612394553e3eb8aef8e02170c16b0c7bc948b0f8ec6d661b49a5c8cdb58d3bd03391550ca55497ef55d01734a36a990539791db4ea9105f402bdd5d679239645077a21ea1918b49dca0f6cddadada87e406f85ede4822f4c1d1a0b9fcf008302d0fc2ce9fda169e2a902ce66b537b083da7bf496e383eb59e858b10e7bce6ed25a49428436c3476167ccf7de9264b064577f5f96accc6ffe3db0dae84c156eefecd58d84b805e1e3ffd8e3962d2df12bf39a3366f045442ddcae4965db0edcbac170c54ee7f70e8157885c47960d297a44d4097f80b0368b9e48dd873cb7f1dee3fbab41d357178b27d4db7dc30f226e4b8470e0d485f2c818d56125e723dc6880b98d5194adace73b0a29144f3d0748b441aeb0ff9d54fab4a603aab9d4e21d2d2cd2a4ab3261c58596ccaa7bcf26845ab2b12e4b0ca0141808ad0d9590718fc422cb6c3fa93f51c91edb1e920856624c981e08b67396fb2d2c8097a152dc6869f1871a04267ac41793ff260643feeeba549236b9adb38120cedb83d3dddbb61d2a4b48700978ae91dfeb2dcbbca0a03cb0749d53b6792ad56f812bf12eb70b6e46b42247f4b87875287599bcaf0432a3c8c9093b81aeb145ad82e775cf8de2345933659c9963477b6c0dc8b463a74d9174a9b32468432c32483b676e9c867c394f266da94eb3c5d1efc5bdf5bc474324232e473b3f67f03a3409c64753d14a7faf3f6359bfb68e3d4491c473947225baa53b","title":"1298. 你能从盒子里获得的最大糖果数","link":"https://leetcode.cn/problems/maximum-candies-you-can-get-from-boxes/","question_id":1424,"issue_number":55},"53":{"day":53,"pres":["BFS","哈希表"],"tags":["哈希表","树","BFS"],"whys":null,"difficulty":"- 中等","description":"本题和 [987. 二叉树的垂序遍历](https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/) 类似。 **因此大家也可以用 987. 二叉树的垂序遍历 来打卡。(因为 binarysearch 现在 down 掉了,可能打不了卡)**\n\nGiven a binary tree root, return the top view of the tree, sorted left-to-right.\n\nConstraints\n\nn ≤ 100,000 where n is the number of nodes in root","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c18f29f07c663c784b585d2955978e2463fffe010b05aa43e00c74d447ce872661affd1932f016ab682478cb39bbaea21e1a1776cdce467c4918ae97b23c910e55698f7ed6d34f8da4e32a4dbea502d70bdfd66eacc2effa723d407cb6bc0969bd8a02aa33a790ad408370e335134b57630c1370f148e0334cc420b5637ae507d5e3833f8ada4306e6e7890b1f0e134032ce3fa7b5c99d744d88d589cf630f5bcbcffae2f80385dedb7bdfe7cd44c834c78444842b0bb2fe02a5e2f671b549bc9ee45b7180ac624ae0c4b87e543b7cef1922a02a75ed8f712c121310cde5db684a6122203a26b32130222ba5ef5b6b36ebe372c5015f1479e5fbe6e2460822a8fc329647b2f2c6029c8a779a511fc98f56aae8c62dc35477fe58a4b2795ce585577c894d40866f179e09e8799bc57501c1ead8a35238c40a481293012c245871437a549347e31e41b1cc970a142b1fbe775eb000f9dfb2e1d1bf795dee512cf168d48f300f67b867b4a3bb07be2b9f457675d9ee5551e06f29fb5a61874857fed1e34ef8ee5d4a43ee85ffce38e81e761558896793fa7866a6b0a863aafae7b4cc58b66a43a729cf4f0dcf94e478b8a48828cd3770fb414d2d3b6db18d1dab2d451d540371a30a1be169458c19c71fb7da121eca4ec8e60c731d49c796d6e519f4b403d39d279d3dc7ac12c4a7202d222b9303639268f4313c1b1790a547071710b08b27eb8b175c603d7c08af3a077152785a51ae9e80096d3266b98aa4af97c502ed5948e8fcbad6268c98b689d336335b5d31acfdf89ceb11aca2a63c8d1784d379a31b2484c6166595d80925e985453c3247580566a4a6d77d997c016961126a681cfffc53e6c8fcfed0cbdb867141f1115d66ad92a61a96082c1180f6ae359262bf7d8a572e9d4c5422ca4a9775d17b0a33fcd0e0a36e524f8e789fb761902245691073c43ec89c5b8bcc2b7fb680f43f5497da586be4cc08f194644855369669049dc3593de3ef79b5b62bcb6f1604008cd37552196046a07c00311be366714a2d7eeff859e8ec648c5016099bd110a3648e07d3af4f822c3987fbb9e70cb02c4df0c9cb8d3d4c8c6a198a7a0f654d9a739769a625c90796612debf483460b1f80acf5d01e5e4a0f4a212e3bce877bd8ef13f06b91cd853ae99c9d93300effe267b44d4eb146f90aaef2fba6e4bc87d51b9928d999a59616a8dbec88070da2b760ce46e46ef3487cf21fcb994a9f0e78e1ac0f88b6d2031217df89ccee781b22f6b1c6c6b9f2f3fcc3fd75d1f42b3fdd24e709b5691f6add8f8f27e8795a83585556fc18cb7b29c829ed7c4c9d4297e37f207aec3a7f01ffe3c2efe76548c3a37d021c179f0c52e958f6e496d877c2104246033b4395e80d90c34a9bd9f7134575acf366059fc376679893929f0774f5803ff91dd516cf6bee6c25426a812022ecc46fcc05a693430555dc51159975748ade7d129fb2472a315bdfdfd4c994c2e310b96e2a0439a0dd5575d017558ec750b3114e93ffdd2e8b04475e5de04b637e8636078ea8f8758ea4b49a02f3c33d135132aadc769b78579e1c652ce93538bf5e017460ffeaa13bc13318163846e5d7bae526d380e31552768d478a7d89dbf5be6a1d9f104692015d751e1b1917d1ec38ecaede641f5474b2a806d0ff145a35590d8bc88d11c59821719db90188202e4b5288a619cf501df351f9b50bac653a0d6aa16ffc0cc9ae8b5818a21a389beb8fdad9d3500cfa2cbb4bcfdaf2b775351eb03c7455d31ecaded92725bede0379c49728cffde36325814c100b201694b991f46547162f4d0b237405b5133bab48be365d0714f9dde1652a5b700ca7a3bf4f1509ddfdb902e55fcd95a4e23d80d59089999804d9c48b2fcb65cd79934d85520ae3e5dcadfcd06c098372eae7ac13c9d9f41580be2948cc50af2e4ade0043ed3dbea4ba6b67cd6a7099c6fec1c531be018b55f937c4c22c3ce2a1aa9dee4034888548c719bd40c2305b46aeb8e75c22b95dc0fd943bb1d5f22fb7b003bb61a5de4b93dce23f55ca77481f2fe04bb9a43056e932c96bf36a0316e60448d49dd5e19ced577831fcfa8ba9f45d6b292cc4db746f8f70e0dbc2ff1a6c0317f33942efa8861bb52238b285d833371d8d27d82aab516c2ae6713ea704d3a51529dead6dc70926b035ccc4b086a8571451fd65a378d3b8a5a5e368d98f8afde7a6e4c0e720fd0e28373cdb4ad3339245edf5f2838ba79e6a324480cf460a61d1730b64d4dc41c9dd0781e3a3f169a54de9a6368ffc46f1d04aa3d9545260f689ee88f4d20e3ced171199d11d38d99251a30ce1a9a9f8889378e90f13b72319301bf452d732a3ab8c6db90f826b9136e7a75fca86e026150d07fce70a687503f943a82a1abbfa865a9c67ede4f6e133aaf87911b28c53682010c768fd421bfbca8eb9b125d50702b7d42ac0a16b1cf76eae9efbb5cb52682ef433faa1257533dcc4a21b1cfad2bd14df31e8340773306500f4538e00036e55a1b36de0266039b6c1a15085823ca6b0d5f25a9f284616e898a817bfd6cfad8b9d835f69d8f56046e8305fd52ac042c153ad8539acb937a3575c622475520a991c096f6dc6bd5160739e1433f2329ca07c19fa43b3506c9fb04a26f423d993059b24ecb8a9d4888c999666e6939adb1b6db61d55604bf18971a784ea711634092feeacc38de9f45196ddf05acd8b67bdb9ff367512c6640cb4eef27c7209ab327684b2ef5c4486dca75faeab34b6e1feadd7c7d347653566ff6ee0a11d3048b59dd195bceecc27a69eaf1579aa96b92daa40b2e34d62212558010cc0badd1c578780e23473e53ce672b3a10eecb59c9755024e4907d18fad72d56c4ff70beb32943b839de5d4ac592317e78b00df46871ec01a7d9887aea67ebe75519969e5c0be6fb904a7a95e2e0b768daa896226ede0d00add1f4f073a6a37a989cacef2d508774c5863dde625d11be7f672537260b7ccff9dc4df5a61204a6f1aa103ac2dcf46ca3563d3dd9e592e76013b17468b1f04fecbfb87552fe40b4a469d28ed37b12ffe8d2f90bf0ad4600dd5848838849b86856a271c55cf42d46b78bb66a21acf6820f66d1ac9645363286d714d7c32407dd6ea53447a6fcbb309cecc696f0d844560259a936a8ce1ebda4dc2944d80bd196c623fe251c27403864dac1c7c7d7e9b042ba57d5b71fcb7254602bf0bb6e6d0fda6f4f68b2a82a33a6638eda75259d8ba9d9ea6068a57650f4d1c75b2dc5a7edd37673780f22ad06c306ca9771aa0cc8699b161bf19f13475fbeb6683300b1441f51b58481521dea18413a9994e4540015c3343964edd9d34f19b585416a5762ef738110b590b4b234a763bd7b95cdfa631e66132463feb01c1c821635c5f9503149cfbba83396bd2a4a2ed26b80194a54f2f602cab209606e6c10743ae290e8a823f4e8e4c00762ad5d32e671454f407b0c049e6c2a5f6cf5a7ee350a62c1d98d269546f2b1512268a4a605a3c291d1630116b86c46d1ddeb212ddd4823270ac1040574c0eecb14939cbe603bbd63a82c301259cf872efd0134b6d361e9be7805252b97389a5d54b68862fb6676d95f6646e133551594f3763744ee07e71650e3b1951171d3e0d97117c8a39fa8dfc25dfd895b75b00f33ff49475aeecd08dcf7b86bbeb61586645b7d3ed073bd25bf64c27dbcd9538f9efd35f9a1be4621bd6030bd2b75d6776ad7542971c0200de9b31188d60227303eb37bb3625c0680f52894d0e8f8cf1dfb9e9fb8ff718d907ee41653b69cf3dee3e9e7e53126f6c9f83af634499aa057b6f6de71f9c7e5efc2c6c19ede544f0e19ad5b4dea5cecd27f5054a5cb02d0fb0df2454d5f29bb58fc885ad44cf294b099c0870f993d3a1e685c1bac37513116ec30f381c254e81b87e4ceb8bd6c24deb4de8270bc15d8e6254de2c3af4867c73e5898ef220ea6c80a557928c5d157e641ea0918649980a5a5d689aa366864eea6d6e826bb590b7cc2b32a93632ae2554848ad72bb7976174855d9c8dc6ec66ebd2d2c47fc0f82d455d2cf432f471993f91a8f937256443d59b13139072f2255246142f00333fdefbd2d1b68aaac8dd7c3af63e4ed8c703c323387b84df2e92fa6c788f159be129f8131099dfa0bc82b0c51626723e9e7f2efd4fcb02fb6c62ac7e5be4f81a107cf2aad6d5fed193e668784b5b21c77d790fd1503d4d091378eeb6ddd0bb17aa7bd8fb03ca2e6c912e7db5dac9a3339d6f8ac7250a514841ec6f01a2e1a4fea648878a5c16e67d5c7395a0ba3ecf288e11ab53b142d58ab892460023c84018ab658b0b6d938630541c581127e14f054d1e7b735c2e48d6d6b1c017be00e5de699641aaa7253b31fabf2bddd39825ddb0d7a2bcdaa2c4b8d5772f2f571ecfb50d00844fc4ad2220926003a1ed712a46462c3936a7d53b2f01f6e0aca9675160eed2cddf18ba012810800b8be51ec32d75e5b6c4e96eac4e2036fd426182177f5c6c0329b74db852f7048e0f41cc7a89e4d2b1fbeee725b4f518613b10c47da4e7e4192c0116c36dee4aa3e2e4cc2102c4e7f4d784741d7fb330567af8149745653789b47d6a7f632ffad123e69bbe00856a37c0d10f4a593eed1679c9336ac40142a9c621508ce405a727ac32c55ebb8a92d9","title":"Top-View-of-a-Tree","link":"https://binarysearch.com/problems/Top-View-of-a-Tree","question_id":416,"issue_number":56},"54":{"day":54,"pres":["动态规划"],"tags":["动态规划"],"whys":null,"difficulty":"- 简单","description":"```\n数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。\n\n每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。\n\n请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。\n\n \n\n示例 1:\n\n输入:cost = [10, 15, 20]\n输出:15\n解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。\n 示例 2:\n\n输入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]\n输出:6\n解释:最低花费方式是从 cost[0] 开始,逐个经过那些 1 ,跳过 cost[3] ,一共花费 6 。\n \n\n提示:\n\ncost 的长度范围是 [2, 1000]。\ncost[i] 将会是一个整型数据,范围为 [0, 999] 。\n```","content":"09613612cfd488c7f63c83d7e527c7f9f538fb2e95f511ac086675266200002e1f120ee1e04ef31b000b9375ec1379d746c7801b7d7d4387f3a827f1371e35a70cdeefb5745c2b2281f71b226151dbbaeb62bf491b7de5f45eb131daf7b0f6c2162eca0c75b6942a2c7c0471e4d2c7b031c656263946f6cd6da8bf827da419af65478faeb180c4b4922caa3edb08ec3bbc80c007fce380f6cee2237ae5bc1fb1d7b3762526a0eb492d434ff8a06df2ec8a6d4e9f05037a3db1b506f9f1f4051358ba6711e2c50ecaaffc6e64e74d77059f7cbe62f9c11a2dcf2886be690c3bc295f9b43ed0ae5694fd030ef6a4fa87d7070b6aee8cce41652a6dce2a6a4b06e2b771e5da80dd39b60d2e53738a5b3ffb9691a56dbc2fff0c8b9da43de8e27afa0c01afd267c0a4d0489175173bdf287d8dc82f377259c60b051baee01df768fc7a65edcc1e82bea65f2be19ab8d000d3cba2aed8caa7bf128d648e8b5b5c52ff83f7ef77a08279d9545963255955b696388ca628cb1a037b9eb57c3fb0ead21d28e7170f087a86a64b20a3554cb15405da6f1898e3991de9962f77d330274c04a59f41706b3f8a30dbdf2619a2e9f4412c2f1b2916bc0e0b790f2bea610de680e54e9767388ac73778fb7d66263f5e726ff6cf46d1cba883ad428dce6169439018e33d7306fd8d1cc4c7f033710560cc97fae915e6b426ef9324bf31cb9813d198201a1723b50ead05f11bfcce88f2426a9aab91c15e0cc2344df781e1e3c49e7ad394c6caef85b13c766acda4c9e613652e5f0b5cd704cad5277f2a13ab6617264013ba9ff2c8d5776c0d692fc543235abd1dc02945a86e9ac81c2abe891c3eecb91b61cbdaead0eaabec3ceeb7410fab93f6aea2d85236603b8170107c76791c4d21bfc12a8fd69b701666d453d6c8d84f2f23d349a54c974cb9c11685d0c063d85f24e1156d0cb7abd7e33a7d2c23f954009539cdc3a08d36b23982c06cc68403fc5a287efb0999a30857ad6685fc8a488de09e9669035949d53ff1ed7aaea528c74f16011781c957500a53408775e3a39c2be4370b351b7e5c7ff04b89d06d4b77a1bd76b9b1df30ac1cf38c200b84e295e00eb9aaa5395b4b21f9af10bcbc2aada6c08a32c722e9cc7cd85bfe674eb2e11d97ba52c09397b21c011e1f2e5a2c66533db3b7cc77643afdd7cd5ceb3288d0bac43d5fe4488b37842ebe06cda3d4cf8482d2b009f245dacccfb157d5d6acf1225afdb6279457b03fcf1a22fa58a8ba1bf20b1ca7bf69e192875617428dbb964ecbcb87a2d5f95f9dcfb1b0d6ad2dc27bf15ae3596fba7de3ac67fa818811f0fdb7490c444b3acf5bb3b476fd67d68310e25f58d1e7c9793a7b11276d493641c79e6d3a6c010cdd339ceb5e3faccdf5bc4dafa6ea5e293674bae71dacc34a8dd6c90b46538cf34a3591c64d6786bb9398247ad2bb3ed90d12ef24f13b8df0a5c582040dedd86ac60e8c9f4b2554eb4815b87e7fb5db7136beb24024f4eb65d5e0f594cac91cbe69ede5ef3c15914c87d2158baf0e857607baaa8d24de54590eea78822266eb8049c82a6377ba98b6b117f8c402f1f5e1201297bd6030e020075ff95f66a136694f2f8cd4c544ecaaa4be90807c4d6f48ebd6a0e6faa395198964f1496bf6ae6b1aa30845ac2c5f53021b1919d3c126e1bad765085d7497ac0cf1e31a76315b0d87c9a527e884f6a8333adc089194d104edb9834990fa1ceb5571b1cd04116c30941e841394e490c2f42fbd38b5e48ec0dcd8770afa19baa6414f3928095404d64a42de3f7ef49f8b2959e6e45208c2ec7cfdaaa95a63e86f47611f70cc8dd4ac740d503d145d303e6d8073658135f5151860068680cf2e58771a4a80f3fc767174cb84eb33a939d7304a649083c6818999980ef5c48b0dc767e97d9c64935d14cdecd1a3f3f45b098342ebd0b913d9e6f715b3719e3fb34bcd65629f6e598f4991c7d24018b26623f5db87bbe55efd30e328e755bcfb4163d1d6c582981d14274bfa47db21298a222e1b9c346aafbfba47dffe941abbe8e4ae4f5b855a08eecb05cccda963548e09537b66d7ed380e5b2ae34da04793160d70880618af9f8a99a48502675595cbe1fbe22632074b81ed1c1d8f07a5cd9da429d3cbaa855f7f80cda153ee225bc398bb7a206ed504b244bc322f3a4afd91e475f9c0723fb6d0559a6628d041f3b5d296cc071614826ac53bc302a5e32a8000192523614a724f3f8871b4b5d964e716bd12374dfdd172495c2a0bf186f34154c4f6fe3696cdc1650aa78a8812eeb7899715ba19b69545e0d40aa5cf3efdc335215c9fdffde7afe5604fe47b79b393450794fd7ad56ac0c6f0efe1d173807c22e06e367344d4398209134412c635c14ae74bb16f4382076d3f9efcaf20d633cce4f7de06c222a9cd606044ae5dfd3b277826936852cbd92de822456c4ef3009d7d4fa5dbf2c39967943c52dbc45e9ea50847ddccea0b5ad4b64c3171c857a394682017b9b9a4477bdcb9e405aa4ce8554e6f6ccdb968c40290b60d3d85da37fc482506c39b9d33c1824307594027ec25922762f30e29e77d02252b8493b75d7beff5567aea154f1296108a51df7b0ea2330fa564cefe6a366e52029011065b6eff9294b4b29b0c1ef27e94db6764eb8a01a56cd0e0203e4a83beda34ef7ac3f3e0f7025425ff16f6f7eddf6124bdb682cc34494df952742c092e6b99883a3d6041438836a0ba6ade0729cabc8cda3e691fc0591b5b6a902f6e69ec1b1bf4a5a43575ef86b4952941dcb1d7f009052e188d98a7a63ae7501ef2e7b9255c7632682f4c9226b4b91475b592efaa349d3b0a8ef5b9f6d3d5d351403a97cf706263bcb77de17cac532dfe44394a6f9dce8fc0de3adcb254c025c40dcd63fd6daa7f64710703dff1efcab74cc94cd48c7195ee180f6904e77bd5cd56f5004002c73dd05c38ce95d3c56b3a5d82e3112014d11f8ba1adb09ae928700c08417acdfdeabafd6e23824bde4a65b7fcfda3452b81e288919fec88a7e18c659e2cea54ff0febab4209709ce796c98cb5cf6cd1c32b336a5381a60fd04402806bee3bf52fac867ab4ad2cd46855dec0d0348486ddba23531c8c56be529bb106ce50c44ae7e46de8dd73c09cbbd4d3c5a6b8b7cd3edde107fad9bed0dd7ace08f1f5c91fdea6c77a07ef46690a4ec27719820e0addbdcfeb60f649a4e917da769fa0bbec6fb6ee73d398fe777485e4289508b5e61558353d0655966947105135802389881e5d76170cdb12b397c7c1b0a2475a9da0188993874b729f6adf94a035c9960f4654055eea77c83ad79a7d06900c928dd1e359c4cf8d9fdd191f40de6828c6a8e2989b89e751d26b0ade320baf89d172bd9614d5685257829fcfcbaef26303db1a089721b2b8deb91d861b77cebd9ce915c79c621a650197872469c88475eb2b13728dbbb38df2451ec8314fc8ac68c6ab1c7bdc02b7564e14659bc034047040b40aa9d700aa91b2d9c24060a16dba2e2bd6b923063c234357219b4332390a2e0741626e57c1c47c5898e5388b95ce3e70e01c4857512ea3e20c7684e71ef2cd27c5e84662c2db68c5d3134b6d605bd8b3cf001db5719bb5834e748e7cb63a2cc8d57c44133551594f37272466b54f3776423a0f7e067d3e5cd247338a3afa8dfc25df9edae5531af827b2d327faab8ac2cf2f86f5bf265e296fbd94a75d33f828b900728f84da76a795a816e71bbd27109f1e4cdab1632625e53915e61c5b4fd2806b56dc29227e03fa4ab73630900e4611cb0150b7cfae96b5e8fbd5c814885fab5b633a20aa72ba329e6e5a324c6c9f83af634499f8406b3a22a944850425b2517733ede544a7f4f9c4eaf4b494a70ddf751308f86241b0bc6b10d3bde393cfd88aae1df86a56469f1420c699d9a0bac5a4f4d95f13116ec34b7d5a250381b01d53f78cb5c04bf20fe8274cf613e52b068d2469b1ca3a7fe5cac1a174f06ca8975489a4695b371954f5ce961f90082447429aa366864eea6d6ec63bfccbb7f46e1da77077e03d0be0829464e4c3687f9454b68dc6ec66ebd283ca7ac0d378761524b821da32ea73c9eeee7476607796e61213c234a85b2957690500333fdefbd2d1b685a39a9e6068b12207cdce199e4c306988df62d7b4643bc046cfe822e91a5bbd9ef0ecc7fe811e2e316bcc7138e473ca2bf77132ae6415e7bc5b623cd5bbabd9fe95c39d21271c727d9538794bdb4c3a113f1b55e6b3da9db053ea6680ad1eff3752d27d7af388d8aa24d02b94875b4f1c1b49e5634ae7eafce6b2578bce5946c56a4d56c4f08777ec0bae3144975cc44202b99344c5c56e4e0cb9a823b881ee9884b18ae8d0cd484000791e4e65503e783a420ccadb23bc21693be453ced60c5c70cdff59e3ac06cc1a4264603e416b5ff39870795f77538f826d7b88389bb14273b4c8a93015bcb6d8aaafb3fa11b46c3e6a89d43f65146d1faff8b5b81dca401c71f724d5b40991647087ecd58e10b60e692e83305bfd654309ecc1e71be679e25bde1653ee78d205305162066473beb0e1328dadaac65eb6e8e61d2e1e1fc14cf44a95d2e4cc3702dadcf6fba0780473b1147c7ad3169b6c53389db7b8b9ca621eddd01ee598b20a8d5c0dc3ca2e496616ef364ec52d53c51d4fabe30952bcf4079f1c6f96087c","title":"746.使用最小花费爬楼梯","link":"https://leetcode-cn.com/problems/min-cost-climbing-stairs/","question_id":747,"issue_number":57},"55":{"day":55,"pres":[],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。\n\n给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。\n\n \n\n示例 1:\n\n输入:[1,2,3,1]\n输出:4\n解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。\n  偷窃到的最高金额 = 1 + 3 = 4 。\n示例 2:\n\n输入:[2,7,9,3,1]\n输出:12\n解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。\n  偷窃到的最高金额 = 2 + 9 + 1 = 12 。\n \n\n提示:\n\n0 <= nums.length <= 100\n0 <= nums[i] <= 400\n\n```","content":"096221cf5b628be1e73e8bcfe626c734748e2b8a04fb2c860a406f254d170e043d310ec8ab1a6ec9ebd627f465eaac46b8280bc2d829199fbe23f761a0f8f223fc3b6776d4dccee61a268fb7869f5f7a25ab17ecd7e24c1bd17cac2e0e245c6bded61e630be4d56eaed9cbf96f0d4e7fb150a9ebbcb03d49bc1f35508a6cde67f39d14285a534d6e7ba675b947c001b75e7d06905425255bcdca3379f0bcf03c5a772b056be2cc2d6b522d81a1196f5040d9da9e18177a30a65a8d4e34923199b714d13b0e46aa0de7c7c1874ae4751fb17daa521b6cafe6675c0425ae94b7c3a1f5b403d64ddd2a3a6f1abde6ebe87fa2ccf26b80e35365396fce0059451bfd5ae1015c6d753a91032169448d633d3fc695e8308b6ca238dae1a447bde2089f036ef7e6048ba0a228b43f7014976645eb9e2957d9c402b2a11484c71fdd4df97568e3dc21612372d9c35499abe50eebf2ada3d3ca94b9128d4e8f9d4a5d68fc80c4c37a9fa972dd5858663e555e8d942783ac15f01a05545946d83e9cefdf3d1ee43d160a6f99a66a14a37c6cb05c34d84f1d96e5bf1cdfb22e78e731357705a9874c5975319c08d4f0271898c7de5ed1a9e8c7aa4fd70d5d3528c97d0cf5bce64e86a8b426c72d7af844712d3b737878c022d78f8da5ddf74bed9549312e8d77be2b3f5bede540d6ae8e1c0d4377a2c2f8ab73ebd365efcc4799769aa453919d4947307fc831d65cde649ed2c797742dc0add091734cb612296924e2e3c59f6ecf97e5f2ee878f3f574dc1b8f2e536712f671d55e337cbd90c7f373aa87d062b7c27babde6c9c45a60006623c9562247a51fed1947857494eb2e23a0aa1218dbb63573c8efe614b6b7856ce3f83c33e5d9f4ebc4d0fdd42b11d129033b0a74442b23e0af21d58b98e01f7fe452dfcad44a052ee96aa7509642a6fc179cc1cd68de503adb13653eb5adfbe01a7d202fea5b10b23fd3d2a7b0145dbcef84dd698a27cf581d5c3f83f8fb2ad6412ebc8bd777083f02eabaa4554ad9eb4758c221ce71e00a750664d9ebd9bf6a6906c97980d49657a3195f5233f7768c70a40c802f792cfa873f39a8d90ba7ff5bf9bea54156192f5d9f452dce998e8c5711a03b77a01fb3df8ae578c805ac7dae0ff2fd89e7fcbd4b1227470d5e06bf0d2207c2040ca2ce937bd8fc28372998aaea08b7262c554937a0af4dfc2c43d10cc6817b6c596348265775a45c994f9fab8bf9d4dfb3f01162380b67cd450adcbf1257bd72e4f41187eca26f30c53d3b0592acae6fe791fd1f791daee9e1646d65beb3cfa014c3b47f2fba42d2573fde1fb35fc1e81a8c1667dfc9ef56327ded0e7de55077c78313e7534918464fb2b0c90124618c88da0127feffecba1cd9fa2a27bd758f7e2d1bce69f5cce4c55076fe931ac3ad41f09ad6ab97cee7947762f1cd11309b225ecd2c0da3b64742be12bd6261cf54ca3a454798ad289a609e55aaf52e3d00b47876e56d17e3f7005d9ac7131d49fa781a6e59575d43d42acefca6bd6f50f85f3972783de14a37fc04b08b820ad553512dc04492e1da54aae51d4d1abf596d3f72d97f58a4c6dfb37f51e94fe0eb478480bf2bc9876e83c5f0f7375413ec49809fecdcaa475e7c5853bcad834d6e1df558d73792411933cda5fa180bd2033a03257b443ba709ba6c5028f3eed7bd35658a390787989cddf95e027ce7461794af2622d0099dffde8b085efd4a9ffe73ce143efe4aa2f1eafe4e9c699908237fa6956bf3ba4c630c393351bde77cbc58de240b686981b1eb5eb3fcb951bf513041a8e1e6e44808e3ca9347366f2b54bf287209acd408ddfcf5140f1992859b750834ff4d260480304d171e4c94e55ead97aaffde42257bc3dfb227706def63bb26f1a4d63e4569ffee9ef456e642646ad21ab768db3fac3b74cc9989bc8a8a4d57c640b6babf7eb5ce87489bdb5155bf17b24f0bf34f3fe954f085d91579b83952d2b2ccbf8a0ad755b934852b8f9e387bb681d6daf7254b85f015f57ae750bf514a38fdab893720c536d7b3cb20dfb1c55ad0bc600d05eef804d1e3a875588c3f517b42f32bd1af5a15d14da7659319157fa31e17af9688bda487305155b1dee1e0dd2a0e0da426994d30c55587b1cb9045514d6ed96505f2c9c736fa5e3cdbcbf9504903fa72d862d56e267fe83755b465aaa36460e3c407c4554c825d97e4d0c19612496e9322b63f4f46bce3258d061b11176d62754f199e7c9ab8d963f210b70b1644eecdf39f85a6ae6b3f6994c17e1669e5530b49f9de58cadd0cafe2a7e8678b73e8a22b8ce45df3d972651fbadfb21b0c1161338f164484306cf8cc7d7fcfe8288b50a595cda7bffe27da757e9b6e5528658751b27591dfd259fd54a13ff011a7cd70a4edf74e760f8ffc0877480e46ea04e73667dbd1c028a002aaf9a79f0cdabf6f74e88223131270986cbd0a2b9f9fbcdbfc07a05420fca018bee5547f914c3994c6bec574472ef71ff88523750df6c798281efcfeb02eec32ce00832e25fccc36f149d586d6bc7e7b36c16a2606e19b9728cbb259c1b5a19867d45448529791d571be9c9cb3eef18b1a08e192b010942c1962ac51c074901c2b13df7c942780e3207f6333638a73666a0ca1b405365ad76a1c69fe5f37b2b9778a0083a80c3a9d94a346ffd262b64c77fdcef8c6dc8df321f9f6c5dd6002b3712a68357e667e2d407b733621ccba4d657a292e8951c6b0df31899a0fd7989d626c78a54766cbe4902f7a6bcc26dd4b2a26c9af691a03ff7a6add5461426a3c5e19fdd0f32aed04b297454b52f1d2eafde2db8f4da4273dc88f37543f2eb16fbfc65b6f0a26b6b34383abb36773efd0ce7a1dff76934ad7eb008beca8fe0d1200363235cbb64cc56c844f9550fa10d41433239c942f761c1d0df62e03c388785010a4e0e7ba22eb440bee7a09c38f7fb72881a54c308ecb0f45d664758bdcb55acd543224671911f6e3cca398fe72297b3d34d4bd47ed670a21e787b4de1773d5da9b8bd7f2decc938421ce57a354f20fb09816790dd2f68b9aeafc812486d11f713e6c92921584474ed458a074fde03b2ead5a3ec948d29d417919932806155bf7b4ba57e064d9567ab550ac18ee502bf14419e8449cbfc0f8afcbc5ea08cf3eb213c598b8da8a1007ab6c3244b61a3c2f354528938b98e72bb39f071c5199a4b4be00b6cf6423864e8e1d54587e9f22ee7a96c6ba0e0fcce425951ac8a6dac49c1768c1758af28fdcfd72c51a48bbd78bd1c124dc0e634204313bfdd20723f2561208fbbd11bb102c24fd5e66c9dbdec2a701eb008eb1f5323ad55d8a9c99bc0c8d8ac382c10f264cf11c3ba4d6b6c8c893e85e826511cb2f1df3919866e2f80ed573471cc090d1cbf39034de59abcc0cad2b093754c66093da461b6326d21e77eed0c2e42101a18c1e02ab05c7f88f08736c482e809b21c5ce0143ac023c84a13f8b57b890a6c55f58be4d7a44cf0ee09463f4bfe67f3ca52da7748f20588ff878296fef8d96a65786a58afba9f4f0a1fe854b12b5950218dd1739e4f8ff549080a197c8123b97b9033acb3b10d95a05de6b90f175c5c5138cd792d82c7145f2b833a3636e2e99ed3a927eb78d1152e6a99d82511d1f4c7509da1f96f1dcd4bbffbcd89c924114ff9964a176444085175e34b71f03cd66cf9627a3fbe3cdb2a91a4566bbb6f4d77b5904e5ac49a493c4ea224d66d62b43725fde4bdb3420da5000ce9a0a1225e6370ab13695f41109b58663fba1b4834af214b9b05bf0c89f66c4ee7c0b3d0c393b12ab991dc812e11a347f7ed472fb32836e4a744c0adad7af214484aa1524455aa10b935456b0693819a4e559a7b9c899b8dee8d4a972b8564410f56348e4973f54dfacc2b08fc3e0fe4491665454984774f09bc5f5f38ca9a1e97513536ede0f555d7106c6b33f44ac99d68702f118ec3a70cc3aa86216d73710f4863d73f889dab76dba77ee832df78d6541363613f581933599063077425f25c442d640aad426af6755700fdfaf3bd6b140c08a350612843853faf140cd3a4a4f76af5c46464e935615cace83a234ee1aeb16df107215fe8982c31a37da882f7b94071c4fdd96adf7a2703e7a41b6ace4d99725423ffd9c5b13cb1eb39cbf1867eb3e4ca9c40715ff912931a4cf5e1c48285f73458683f4d744b4ec05ce36c634cc90c90745ef3da191b3780b1e525a143b54a19d80c6f62df5c1cc51a3db80d9e0e15174551f419554fe4860d37ea3bd548fb13f2d302fd038ee0023b9c19ddcc752acd64b7c221c2fa56906b7b479dbfded59260e8052e20499ab0df1c77902bab77ec6c5794c298567a60b629198d3fcae977e2388123d2a73473327362ba2c4c760805cbb6911338d11dfb974513a9fda0bba999b649bb6a4d380affef5fc8e517470435086aa6f5a9238ad81a7c50dcfc6fdde267b460e423b69d3fb70431d81681f6cd8f161f1ebcff03355af81d7f822c2b536a56740a5ecc48d1ab032c7c1f4695b28abe05674029f53bb35873fea3cff009e54f2e9ccb7ecf4ee423811ff84aaaa29de7e6e13c7baafb40fda668f33644b00da953602311466e9d1b530de8dc221ae1c9eb1a3392777241ff5f22441d40b5c71ce1fbbd94038d2a6d4b025b5b541d6fe53caad6f6683d3432c826bf4e378aa5ebbd6dba0da31490c6897a931c6c21d759bc22a96568f4d0c5e6824b88fe51f78c0f5e3393592528aa9efa42bf6d561d13f9c37be2993b605863620d5a622fbfa0724f463c8534dbf63ae95540c91e9b522bce3ed4998975872516a17fb3201ca34b94ae226b79429ccfcd0d19b68a9193f05678ee4c81216a88a8d0b4d8e0bc865626e304e1ff299002611b0f87754685a26e1db79d0aced2ea7abd4c6c28401b4f32d9f3a25d2ff59591b265e3b0c3a548366600179faf51e40af13129828c086e593812c57e29a15afc371620dce9b9f355e79a95832c9ea6d2dd1f5d8c4364e3045b39fd0d5f33da5cf55508f4d5cd19d52505821a2601692d2fa8c2aa5dcc871f049281d03ec43b449b29d00961b34e9470c3a8e411f078cbbfee86efb92a5f4bba1d1d25895c950d7fc212f1e4b8ba09fb1195e66356cd4486c06cb8646b5d13087c4365ef06d3d095f0a1c2e032d4ad6bcd043fb1acc761f9b68819766cb9483c2b9c94149b89f8fc64a7e7f90aea1b07226de83384ff717161fdf9d4dbe6cbe036283c7c041b75e3e7f9f07929f05af5a9ad43937a6a081f2a1d3fd006e43bb4880dad796506f0fb4a000788b4ceae394a08c8f96b59ede6c453c6655ce798bdd46d7301c98d6501544ad429096d3bdda15e9dfc86d3d07db4ce56860f04952fbfbfb3b93e4f265812c30a4fbd611a6d51c5993821ce9852d1b5efceb8570722527241b9cfb7c4acd5b13aa4c62a2f3e952fc59cc4ec4501583fdd21030bcd702e3a6ba63f16b131029bd2bee988bae0da65f4e66a9771253ab6c393a7889a969dc784619f1adf281d3a0ae360b326b45a51282ad602f6c0cab5901066ecaf565953c81974f0c598fa709b6cdeb57e93d8a5b2e6f387175c08b64c1b48dfd9f16095c5aaaae7568a228109a8338a3f8f12e3b98417e9eefec80c63689d002f6dc223db5d541840a947c9f51d3c0dc6b1219735b6544ca71eefd757a804b5522bc080c6a26ec5ef6d7b5e0c1f66ec4b5538952ead611284cdfc1e28e7d410c7c138e7eb9c68917480f7a650e00f08211329db40ca881a31c6537dd00453deeef7193b0df4e551fbe3fcc1dbc5caeaa682795a39d964c6599c6c3f2d5063de59ff6df728a735a1fe5ef11cbcaf39042b1442663ff864055732a1f95f0809d35e94fc9fd75a13c6c3e5dc2b5c69f25031320103a720a8ab63a8f113fd4585bdb3b2869eb275b385cfa5b50dbfefacf2e014f0c497d182c405d9e9a679bebf7325b0882e82c810247007dd6cef8a2c71dce1fdbeeb944f0471d7d9056744528ae01d5488248248304289c47c7da0f3d7b57919036d126ca7127bb6a60f3578378ee831094725d1625393c7b7d66b60cf438f45a8f2f20342cdd7c6e93180a911984a1b544223ff3dbc7a1cfe257fb23e58de302d521d720ec3f6f6063ecb39ecd9766ab71839b1d84574ef0b51c940bc4ecf83f271235b84d755da4244bb357f2d126ee4408f07ebf97021971ab9b9be5b9757df0cc3bb430b2d3eb2867b4dbe17e136cfae489c876eabffa4951c37b4f4d4845ed62639fb155e942d20eb100a855ca5002e3c1fb233e111a391e26da5d6a9e68492ac529814c5967719d57f1bde805b513f343999ff618e5b7be5b4e742e4268006666afeafe07006e4821bf1ee894258054eec17e1fbf6e250c59e95790ab8aacfba4ae970e14ecfcbe28027b7dd69d33b72b99791a4942cf1c19043ea3825a796f34f686f4d131a8f36235b611c014f1b7323854f85ed210845c0f17a5f91654ba802097c44bf2167033442ed0d4591409a0858733912a734950f116dfd8c833522a12dc3b837baf6cdce1bf9828f3b6e0256caa08b841b2587f97a7c7316f0835dfc6021545190264f505126b3bda357c19da19ec1c027baec3d4c3a6a69a493ded4e4d00e2acbb1c1982fdfd30ac2a257000ea8c3d980ecebe7b6aa305b6b6d1ca10f2551e7880dff0b01bd34f7ce073722cb893d6deebe46c0d7b1e9c84fc606e1ada2ff5d23fd3fa9a42d99b04c86b8268903de96ae558af4c6fb238c12b46ae3d9837d5164c001a2f28fa43b7df063462a4c03dc47615bd0d799956a6146bf898da41ee43d2d731353cdb0b42de1c69c0191241636d62d61dc726ab0c8dcc72abcb190da8f1f0733960101430b3263e756d1dcf1117a2c7a8a72c33f52520749e3b03142834e2bccc517a3d04b6aa15cc364256147a0340fabce19fc7652c45fbd22f5e9eb6662fb7a832dc8918d5f4aa9972c0ac1f5acd4a56ebc1e23c74ce78168b4a20d51d11eb6e67e45a32cfc0455543afcea4c46126731b7f6ae33860a944fdcb709524067417212bd9695fd0d042fc7029c9e7c5c8c32f3ac2366e276677e33c759bea4620c5a038daa032ac11d13363f58b9e1b415ae0fa277e58501a74a9c625fce05a19b220439f32fd031b9e10a25d94688fa4f055585ea11d0c0d22140212f517526102d1bae5b4af63d6b13d327abdcf951c4765f0968c713a3f14adde5a712467ed43ccebc780630c","title":"198. 打家劫舍","link":"https://leetcode-cn.com/problems/house-robber/","question_id":198,"issue_number":58},"56":{"day":56,"pres":["动态规划"],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个未排序的整数数组,找到最长递增子序列的个数。\n\n示例 1:\n\n输入: [1,3,5,4,7]\n输出: 2\n解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。\n示例 2:\n\n输入: [2,2,2,2,2]\n输出: 5\n解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。\n注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347380208a04fb3995067b6629472e032e2efda95226d4955c107bef418d6b71983dd2df8eff401fc5a93ce974ffa5f124f52a696a9fd18cf0076dc1aa84d24d6d38e6718399b2439021b427cbf5eea38b142ec00766b0883a6438097cb8d4c9ae77d84364285ff1d37bf6a78e7dea1fef1c3981eefd0c2c7312c244f438fa6ac67ff9e53cd8e04b69b1a43c326846459b13043d462cde8c52410144bbcc47780211e489cd10581a3ff00eb7314f988bbe9d7bbb48075aa50cd6f92218d820281ffc16ad365e5bceb9602b86b8620b1ec587c7b939fca36c8dff2f0bf8bedf85cd020673d38eda65643a6ec0304f491ce7b758dad985e838b0232e6b558e41393fc7b4e830986b9a201d9e8620ebf371f60b18afd246c1b9ca449a401e1ffc2949a2c82d1a9dd66dcfb979e8c0718a4e8b12708153e2c1e7e6dbf378958ff808d4c7adb3f6c9bf8110a5528fa377554ef184caf199121bbe41321d5c681d730a7ab703ac1eef1b2f56567bd83e80d2318fbd229549776bdaf957be4ee5ecb15428d97a3b7b7424d67de06b7a844c132e6f97e41b4afadd60e153617847bbb0987babf8e8b9f57fb5786f6141c00f51c9e09b71ffd2bc4cb73b1e8b6a0a7207382d63924cf2d2ec97808c5180e67e674bae19f9297213ed8c1ee1cbe012703d4bcc92f0e603ebbf00ec71a4e97dc5c548f501f49a89cec734da5de75b4c753643d2b60a12594df2dd089843ddbde0dfe640e06779b5d5a9d6a251d6cecf85d3e7215a2f671d55f708c7fd38731a30ab4b26275626b6a5f4cbd6496621742ef54f215aba1fe006814bf55f7099e03c12d6964d0cbb01bede1d057e2f3ba8646bf5997a6cbacda050bf983270881f8deeaafaa8401896cc119409339bc2ef5a9a556603c2ab975a09fc45f62d9f7bd20d54c04eca5e17d2cccd68ceb7969339144916971009c67be1aafebf73df21cabe538af83c90060531871d26a80c50ae7fb4fc8a66487d26957d3d4c9c4d728ec40fce9c409667655b11e198780a677403c446b00ac571ca7d73157fd9f255eed266b073c4709fb4beff33986ab299c3a63e7fdafed5a128c4534eacbadbfb6270c8192fef263508128d1fc966cc7dcc9e4bed913e5bc91b065edfa4998e05083c192c7e2c674029bda5d2ace267a6c28424d95b04153038fee240a14d47884ddb234c460823030c6e76ba5c48e6f1ccb45dd4e4acfc006f1233a5513a8a7eb12c45b050c5fe258fbd9a6024c9e1929a5b124b6f05024e1c6425a7c2db5f554c75348ac90ea1ec6cbf552bda297cdcac6bddbc8228dc7b76a49dd4c7fc0cc5b5bea151d713369e2ac7e3184a7fb0b7dac4adce8c8ffa0813c9561462d34d9a879cb34d96bb9fa310e79799cabb3d539beb3ca4ca688bd5fa3282a24b48e060c1ff103b96ead1874c06cef155cd678929ae07c7315c7301df336b80ee059039e5ff465036ca056887152f8abb3733fbc07d587f7a1eddf5c698c5f01ca04d2b1a0da9e95b9a6a431e8fae0293520a909d8113cf58573125f23d277bcc620ae2c8e81bd394d1fc38a89c20711a0fc8844eef256df541665d1b92b473aa95bff0384f4fa920e399e9ce8e3f183157d4594f03dff2ca58cd10a82264212ec2b256c18c14a15c423d1b1939ddf531e2b8d165157c77aab307f5e21a54165639b5c9a03dce9e2b77a38503ac0d21706d85ba03cf6c1aff74c9b629a268110c689769fe0cf3ae9e5fdc2b7261b3a5efccb4ad726baf17c013d28bbd85057e1ad74f7c33af12be9ff56376ac894a5f89cc0ea8a5c724748527501f4243aed6f9c9f6ab5303365e1a2162a56e698f3ef90a226a249c8ef618505038448ee2ff416376f0b5e5358439d31f4749a28fc98b8ba18204e4d88b38e266d9679341905f25e7ecf591fbd37907a349eae7ac13c9d9fa2fafbe0c60cd6aace1c49f7b598040a7cbdd6214884e20d1cb8b9dea53d326e328e75ab5c44169f81465d0f02b8de8fa50ab5ba52aac292c21a6f1866f7be16d888d877bdbf28d6ea9e4548709f8fb04fadca45c61813e587b75cee77bc82e32bc3d901efa1c5e349f635ca3fad68ac1e8250f279b9eb1e5bd5c3ea584c8c2546ca041e2d8c1fd2f76050ae13853d3a99e00b52238bf86c93c1b248e0bdee71b3d01378d3119e47ae1cc5f1775620cc06340864494fad5ceb31d46508222b8138a875b2b74b753600277325c212623e6019bc7b04c93789b6cb13aa4dbbeddbfc3c2787134a49002120f8944480ad2981cd6a17dbaaaedc632ed60adff18dfbb5098a875fc9d693334c5f69b8980802442870353f4d94f7fcffb2abb7ba595e1a6abee2de4427c9d42581a698a6ebe7493f8d062d054a13ff014ad00c6c995cf2c0030e47690746a0d4bf03bea3370d8c1f82aa80aa6e9ae9e0dea72eb178d8d5f762b10c46ef1542bfacfb1b79e25d53901b5d33ec0825f19c47968e3d51809186e47a91e86fc0d355fc2a3c9374489d6ca6ced49ad1e732e30cacd04e849e3ae64409cbe68df2f7c02b6feb65ebca1319cb8d5d1449d306a16e3aea40299daf89986b59f5d46f1f56a78eb206712983c8654d97a3ca9ffb3f90cc991363d1d0e0dc5481c0535dde22c7f26c001795db5003bf2de51eb7c95c0510bdbebaf19715f6b9640be81f3b2a2f7e0b410a5bfefb63c07f41e270b47551fa662165f2584a409ee4410161846f64990defd75c0b15cbeafd63d743ec74300b4e5fc724430a9124d8696c25061bfddb45ba1b72fbbc9e2aff8eed1676e3646c26fd399100c54b0bdd47b0dae8f2ac8034c91b847161b63da46f38f452c7e2f0a5f26a4ccc45b00b7f7a72417b519a528a3cd79dcf4c3bc3045701778e92029ab3646a34284e920b239a5b9e5e19b51241fb18e1cf14afaa368e8b5f5a9e5c07fdb1155dc32e390c46fdf9f4b3cb5c1b3be341211096fc1b88e3e94407f64564961cf856e055c239dfc98d9806ee40ec71ad2c573647764bdf813177bdfdbac81f682f16559a0669065a3667d9cb5a70a656668bb9f45b41904d6f5fb9b482dc40e83ed58e006e079b42249f765718f4ea1e24a055499427f2f04a9a8d808e93ba54721e57eeb5ff7205ec92741df040160431c5c1e0b200afa3f75ef2a0c5e4b3ff744cd66640abf7c6e1e8c9c40a3e1f6ff4fec8846818e1a404730f17ace731a8453971572507dbe3b2aa26c93b30d0fcc99538575b52e94d0f2b9d80529bbbf100260a031a6896d10f8c2b75ad256197d68760f9a9f287b8c6a7042ebd5489a6651319a0477b89cf3a1d410bb59ae1d10afed8014e9dbac8848a3cf0651068ae093a3a5a86982accdd6da9c18af6b9f00d59b6d59168c4924e205fe9cdf0a421b8cbeea65518c6118ea2128282756d0769ec74b1b442ed21e77e2c7f5ed083da7892aed0f7db9fef94d66241727c2d43ca0823d27e52544eea65ad65ed1ccb4a23156f2ed9fd02dec2529cd2a5e4a7c26b8e978a832d4dd4544c190f780d2b8f409acc1e0c5c297c2d1a6890250afca5b1eb0a1bfa25703e092bca795f80337a4b9032bed3b16c55915c1a34648ae4544d4f1c9f98221cdaa1241bc6f9681c54576867bb67862d98e262054705917462d49741da5327124107e15055e4e3e1393196fe532b38df725ced495f952499c73b29a27e7ab98d9862086a7f76b434925899fb254268765ea7b3bf29ef076e3c5d35f9a1ba0275dd650479eef16610fa87944b13698d0280699b16ee29ab79a54f103b9b351eecb8d5acede6606043b33090e441bcd881cfe044d4871fd727d883aa8edf9a3e6264631c3813007cc9ec2b549e207fdfe3a90c5de57414461325251674df49de73bf54f4a9b0a890ff91c84f6bc8dc4b94a1e6838fa6e29545281145bffab95e9f38ca5ef8e266858130c93941c6b1b85ad0556d9d8103b8279de14acb929820dcf9d63aefe6f1db8ee504e3456e570c30176b01b74bcd3cde19b5d73821510e6c298ea2466eb368b70c2ab2adcf6dc9d827ea517fcb240c886211e11931951c9c541c610486963a270574561a25606edc8b98638ec07e52ffc124531fd8bb1c81e35dba307be54b997e087eb9a9df97567147f330775635b99c63cf0bd5b17fa1d9582bd3f4be72765afd82dd01d43ef46af872c0a3959583a1bb8eba1fa0adae07b942f9347eaf74b949f7755cdb2e91b0a74ffd4150b4ca1978cc9cc1a33152aeb03aeffe097b07e321b393ff356b3176e942d93d50585e7470a5b4ec651b0084bdbcfd883e922c1d32e18227a79b4066ebf3c946a5cee681201897ae70fa747bd74c74f0ebbb366c5f7674d1abe649206629389d5e2ba9b7620881010ef9fb18ed3fb95011501d71dd07a9397d25ac61e107e621d9fe62fb8b49b669cb5abdca7aef9c2f3a46f7f744abc062f6e40883bbf8b4b44920a68bdbf2c1937302b5c6ab4b95b3267a9e2f3ef4c3810f5a794dc92b6270f13a9054f39ee7eeb89513b152cde3188e9e240bc8a30b1965a480cc507efb84ed306a82987638947041b3a250b2b91d99015f3f1af8e30a4889c11454013bc14d422fcfe9f981442b1e4ad8986395f57d7a6dcbc7fae976e6f39a7a9ba86e66f30f3d238f576008d4a8d5db9ca46394b7eb23526ad233b8c352af5d4463da1ab76b1742e8ed75ebdd7c2a3802b1d2924c2e57780f30e3cd38700e93ec302081e3467fe9fae5f6ed2e7884b42d12185e495d23bcf85079b52fc0cc329cae63ac73069b5dd239dd0e8aa6de33fb2882897234fc46fbbf7b6306378278e04363c0dd8a29a70f7ee4bd47e8c4587bf8f59dca39397d519a9597f4537939ef0172afbc48d1543961692616c7822204f89d0006f54e485311626501df9c540dcfe8f68d9bfabced59136bbff20d17e1588fe73355228206a457452bb3b355e29faf8006ffb6c5fcb268cc3abd4d52a57f49a489796537143a988d65f7453ca5339c989226a947e1405551955550a0773cb997c9fe75539dd040c859d96cbdbe52285815c1e414b921d4b4baa6c85b2cced6d8c7dc87462b51cbafc76e6cbbd1587edce4b2e5555ad655a3d450021005ab03143f03c980b3d1f45afee9cd5536f0d663fd43b234a9ed24eb4cc30c1ee1d1abe2165376f201c2e032d0398e89c5efa1f81730ed821ced45082dad7dcbfc90f1cb383d4c6585436deaef3f13c619bc23046e57343528c9308f33cea5a6a8ace865ca00a212d984982d66ee11ddfdc7037ada0d1abf5d2f4491e43a648ce8f9ac55e3c46eee508719066a3a594eed9c2c5ce9de56c536f72009e37f08532cd4859cc83025b44e317ddc5a8ada70ec3dfc86d3d07920ae56d65df4f2fd0b9c36d98f9e32bca61278f90e177f7c56143b9821ce9856c4e0ab3ebc62520253a2456dda3741a9f1e45a6087c8cf4c752fd59c548ee1445f8b4af6b20c19146b1b79822a43f5c1060bd36ee8a90ae44a6434e35f36c1258a0253039236731c215c5c4d16e143a007f6474e098fdcad466db4408d3a9a6e678fd91c9f26630ea09f426038aab801341b081cda616b135c40e633c433808c0806491e6c8ab93164a0908e7e52422df5301e78325a3bca15572b5682ab5c5f180927bd9cb28f6dc223db5d5418457be7c9f51d3c0dc6b5e0478487545d071b0a86a20f243196df212636469ca1ef2c7e480ccd42af1f3378931a592543266f581a2ce2d1858345cc054fa8a8d085249096e122eedb6256cfa9e07a890a3453d71990271359bc724a2ecf94e1b4af36cd61dd015fdfe136edbf7e09f4c6887c68abc8158479ed58ba463f773514ba3ab0fffd78ea506813d3c49ff864055732a4dd0a4d5cf7bbb59c8e52fab6c075d0ab9a4bb9f634c4120157f7503deac7bdc563699585a9527233aa65d207121814b2ddbe3ae89620244054b7a0425776adecb3d9bc1fd389e8c2f2e9123c7dd86ea3b3c6b4e39178a60bc7959d08d031db908ccb2f0b869df3dd272cdcb1982eb3ce5edf0023dbde00709d300b54ec1e1489de83aaa5c997e877f9c1c23042c3d16767da17cc36f8f7d9f46c3be81de4aa3be5084fec03bdfb4ad3d013ff0d8c767666b926a96cfa72bdb23ba76da25f499a4a8123876075bef22b5524194778bc16330f01a9e026c49f99a97fd3fceb0fb37ebd75cc7394be226a28b06f96a34d29e92370e4c3d20e9da341ac331fc6e5d22b5a36d2077efb2ab37061d5af92f276281d667b3c8ce8ed60ae8ab6626a069c70ad85fd845d046d7c076bdb62954692949413cbf3a50f4105d9f0aa63f89cf2201b13a8399814495538b4ed3c1eb52bc9d07fcc9afe3dee2c9fe0ae5d0959abe6d702cbc13e497118e53dfcbbee817bbb482b452cf5737d1d0d9c5c2867f51efb5ca3a8498d34b20982bf912869d8b9e4393f384e04d0fa8d8e2e50b3e5316a16726f49d15db2ef06c42e5bde01fd507ac0c84fbc20047c9e50f5094350c942c9cb8dcceee121e95ce834d050ee947b982939a2fe7562701b0b4cddb649c5dfe5f23c1e6aec529a6fbad2777f309a44ab25674d382ac77221621c8dc190098a982af22f69ebdc052cab7d036dd6bf3bd1cc59d80fd99e084523ffa4f053ee4eea47f5cd8a0f520a1262666089ac1349e14d7a32636a101adb7dd951de04816248ed3d4d99225d4e93686f9e2451602524302ad80adce190710fc94996fd20646c026afb349df8a6e8722ca7673959426e51ee54119f83bb4695ed2c965a718f091b3beaef21bc47e31cefbaf2150d259a1bf62b2d146f607c9f5571b03a87ca82c55c89c39cc3f8bae332ea62d7b184e3b3ded765f9278d808589a415ca276dafa87103be8fc6a01e564173a260f85463ed087b0f87e168b4c0633c0144b5f1d7d9aaea63c61707bb811be3dfbd0adfef8ffd0f485cd90f97b2f64ecdf3a6099a27caf7c44a7212cdf5d302a4f82534eacd115889636376bb6fb1df9ba58ee9c0696da678c9c62aee84247053a7d03cfb6e1622574184153e216766dca6a68ff60b5efadd26129973d70bd662bb17c5481c4a994d47d5ccf4a360201f85afb9d6e24a6c5564acf050ab138832fa685214668f8d4ff4a2bdeb484ea94fb5301ef76","title":"673. 最长递增子序列的个数","link":"https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence/","question_id":673,"issue_number":59},"57":{"day":57,"pres":["数组","动态规划"],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"给定两个字符串  text1 和  text2,返回这两个字符串的最长公共子序列的长度。\n\n一个字符串的   子序列   是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。\n例如,\"ace\" 是 \"abcde\" 的子序列,但 \"aec\" 不是 \"abcde\" 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。\n\n若这两个字符串没有公共子序列,则返回 0。\n\n示例 1:\n\n输入:text1 = \"abcde\", text2 = \"ace\"\n输出:3 \n解释:最长公共子序列是 \"ace\",它的长度为 3。\n示例 2:\n\n输入:text1 = \"abc\", text2 = \"abc\"\n输出:3\n解释:最长公共子序列是 \"abc\",它的长度为 3。\n示例 3:\n\n输入:text1 = \"abc\", text2 = \"def\"\n输出:0\n解释:两个字符串没有公共子序列,返回 0。\n\n提示:\n\n1 <= text1.length <= 1000\n1 <= text2.length <= 1000\n输入的字符串只含有小写英文字符。","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2295102e8bf3736e305578596320559db5276efeff031709804ce6334038d12f1bd385394d9ef220ff2ba4e9f225f573696bd5d7cefe4633d0aa8b91587224ab71899aa6098d20f426c1eaaea3831431da0b72b08a3b2c3f047ac0bb8bfe3e53a1ecb2aa1a478e01357fa28370f13813e69dfd0c26701ffa4df710d664d5431b498c1346263386fb4b21d22259f8a97c2f2768daeb21505b2e98841b44714ce3fe9325327a0f8050b05ddb1988b09dde50830f7d830cc5f62332d7ce9a72a202cf7d692f93a70b76a4ca202070869dafe90b508577737ff3d62121a3f3f9882d713f0c39bfb04d7da467693941d6ce03dea5e9c77ac81b6d1446fe3c117d9a87be6f820cfc3ebd92b51de8e841fb3130aec77cc0bbc845ae4d1639f42553b2c92c199bd367222f16b4f81ed46cff587de2df086c0c74d8d16f5cefc0c78de2d5d1e6a3edb861150cca1336225d9eebcd9b2c81de3dd630055b6b0867e6e62ac4d310a2503830127ab863baaf871f7baf3646757ad8d74051ca5729f87b62927156c9cce269f5ed716f8543042d6f80e9096d177ba666a9ef78679ab09958a6e1d2b8f75ab47e41614cd70f6df3e3b97efccfa843bb2f1e814a097318323c789369ead8d8af82a94e8cfc6e6a709918e33a7236dd803dcacad33e731a5acd87cde73afdb33ce79e3e803ec4a510f6b1223a0722b93aac15f519daf389ca4c66a6a57f9d6061b034298c92897a3d19a57753bbeaa51f07ba8e8d4d7c78237e644f3a1a238e32a18d0f0d751ec20d0544db94327a180c7e3a31101e53d2e9e6b3739a1ccc833023e9d44f618cc340399fd90c07acd0a28cf6ebb02ea1f34e5ee197bdf590bdc2b86b14ba7128707575134d0b95cc2ebed69b571343e550ffe5d951002ee845a66eb94f88d61594f8cc51db5119d813683fb7a7f3e00d582f18fb550da733dcdfa18a19b23ebac757e167899d37063fa02bf3ff1438f36ce7b5a51501765ac85373cbd91344e28c1a87c34ac20a5f2c6edffe083d152119ac1b82a2c272d27d732bb944b53dd24b89d06d4b77a1bd9428ba3a86dea86a811b3d8edbaa7bd75bbdfb6a124b3eb89642e8f528b0b398cf78834dc319e269df1ab88304939231553ddddfc2afa5ce828f20610f6b6939b481e7794c03f2dadd5dd5104d366452e49430af2437b039bd39e96c4a22006346ba25f048c1ffcc9377daeeb6f1154ffc813251ece356d5a623fc4da5a5263d85aa490d01ba84d33b381cd9955b0b828a9661685b773e0d35364069e72c23b7877ffe4592f43f5ca075ccd93e8f1962d5c4fe45107ccd3c7dc047b84639c752ff8068781dd0b6afa4a6a4c497885d20a492cad7a45e338fd736b430b1acb712ee9997f2a73746a6eb2080c84ead106668226c08fc643e9dcc7fa123387c2e4322d9f15fc76c8e163fe737a2f1d8d8479aec6a1cc305927413b3c18273dfd22195f26c7e925ca3c51f386e35f9a06c7394dad91d8664223a1aabd96e9b62581f9ab40d91500687a9831cce5a713e2fcb0e2463d86f26f8c5d31ed080c6fa119b90276f1a19d141d39c405570ae0845d65d78bde4efc6fb375c1efc37ef87f88d8e2118311fc25d0058cde0cb5acd0f92256b2f23cd8a7aead706add78eec98d5db1568af24156cb3ade77aa49106c8ca1560365b3ba4cab13bce9c1f7d90b000a1032f6d6e888b06cc7603fe6ac7b407af68311c6a965ff836fe411cebdd227854b2abd5eebaaf7566b01722a6664cfc9d5c3b39b4defff4d01cf3dce20a29a4e50165fe78936e386f246c8726583bacf305159cc154473619401c16740288fd8a2d8e3041203741a4c15e8a9aeb72148dacb440f898683a23628642a72801d6172a0a4a81bf9407d5c88717d266d45c915ea55e30ddefdaaef1e762009f4c2eb8924eb4fe8449bdca515eb318974c0ac17430cb4df79ed1196cb4357dc4b3c181820ddd55be348c0fac9e0074bb90f9d6ff0649b6c415c274e94ca75c7222f1ac853c1fde37f3a9ca03d4bbd450577498779e7a7ece19312eb2880ce2c6ecad35e23342ddd57a9a1fc54aa18ba12eb6c01c532f560b6ab80d008c9d8df9bd550e663b93994d00c46380b0df884563696feb480bffe3cb1eca5e34cbc7e74b4425da7fe84ad56f0579d61854a94aaa8b4b6be7c80bc9584d9d5097e4f8c4a4314a6eaa20bf17809e56abb76cc68f90bca7beb1cae066fc460c4fbc1adc55e573c56e6b260b376c16f6f4e11e09a8dbdd42f5e7cf66181fe0877295a5e2f238e35aaffd3df95ee6396dbe35593606669cc7d3edb6fe6e6dce94fc3f55db74c8d42b936b4b244749e2cd6b814a1ae152127170ef3982094937428a3edffe329acf527ae6255936b1fde063d641feacf69457a16fe99f4d3065ae5eef3c0f3128d8202db59d62618cfea8d45dc67189cd3e1b74317eea41c9f43d24d7496fbf8a159feb0a0f574d9fb3e23fd6727fa3bdf8640353d6894c761ab36fa43cc1caeba77b08e511da4320adf5037bf259e0e0e3725e5498192eb94253183df55492ae9511060fbe2c13582b43372198cb007ea3d73388c0ff229842cc53bc8939b1e93cbe462ed6a8d9d1ea58d4dccde32a24c6b1ac1fe9b4bc3acfa06610964ff5463e94cf5b6679832914e36da57f796c7002542c4b8460325f73a6a831b6d683aff1923ea19eeae7cfe04e62f6b1df84a433fe000949ee2e2aca781759f9e9be0fc5a171061be6ede46cf393407823d79365121ff368599d754b4d636f7414fdc1f3ee75a97a34d88df8731d76516e2d09e977d7f95935eeaeb9f603de153097a6b4858de49c2f0975d9cf2b4863bcb77db129ee1f64bd4470043bd9d3bdc7c00ec59b37916ccd1fff64ba13fe2f50581e0b9bbfaaccca478a12add87895b532256904e77bd5cd56f5490602cf7e9f4e229d88d3c5682e49c6a2032f189214888eea81a4ed122d6e085c67cdede390fd6e23824bde4a65b7b9b1f05274ffb7dadf9ffc938dcb8c659e2cea54ff0fa2e5167249ccd88fb4eafffc299bc32f3c662086b927cd4a43c534d414f752ab862f99cd4fa9131fdecdd025f9cba7c1332e1c9156fd1d9aa0298b7f9160a6aa3ec29d3380b6d5e7d8a4dbdbe589385d2ee9abe2838bb7139e58dbb6855e8df581461aab5a731701c5775fa84c449fb886b467dc0aebba439d748eeeb0f769eaab698cf0b81039caaa5bc04ae6a3440d70730140e5736e42057baa62898548442e5504cc169a97898bb0e77f0ec9f641f281ad46728d17d694ab35979a4c0f065701f361df60d48d2f088a108c8cd1b709d69b8b88da5c6a5aea3b76e48be2939b98eb51842e1bcf290ce18e9f62f3e503df63524bc089c8d6bfb21718fa1a199b21ff9b8a8877c65b5de4deec9915e29c745f7762f3f9646088da25aa1a5077ccf4fd8dd54f0ac97408d4ab32d88945359e07f51e5d3e3eb1c0344d3e14b447e09963e5c2a0f5dc0925aa6aa0691282e56a45742b5f127ed20c34601b34415137274ecb9f214a98f419809cce655ae05506035160a3ff0c35cbb44afc9e6ed6eb4e638db43091c268026d3b1e8a9a804f1cfc6b8af3d7185fcc32bb313da4d56735393551594f3763741da532376b427e5f0517003e41960753e94781c78125c2d8d1e7201ab67eb28b5a9ce198d4cf77fbe9a926012945f49fac5468d228b900728f84da76e3c58e5fdf57f3625d8d7a449ee1186f25e839049b1c504f91cf3802a760223753907ec64d3ebd7512118b401ac28bf5edbfa7a581a220f318d6451e776bfb3bc749d46e576f773b969885634499aa053f6f70e744c1545efc2c6c44c7e544a7a9d399f1def4d4e727a82f4a5cb02d0fb0df2409bca7c9b98f98cafe44806c4e529e0920f186eea1abd4bfabcd265a4b2bcb064567710b90aa6c12f7918cc90ab630ba430b8547a43f7e833710b4c63c59cf838437a447aa797cc24759e5bdc5a2e345c98235f34b709bdf0c6ad1128b6ec0a83fc9394c3140e2daa3157fa57144aec4de2f780bcdb120cb58154bec2beb1731663edea8ada3bfe154fa65bb0d73b5ee688989346e865ca4b781b24e9097dc92eca09115d3fb15582c0a5b5c5badc53ed1a55a15d11695827febd76392f06c368611547d853db6d753067dec8afe44ac823125ccb4d412cd2bdd33f4a8e34c5b2a4aa71917d86d6c71fe182679adb088ccd43719","title":"1143.最长公共子序列","link":"https://leetcode-cn.com/problems/longest-common-subsequence","question_id":1250,"issue_number":60},"58":{"day":58,"pres":[],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n\n一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。\n\n机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。\n\n问总共有多少条不同的路径?\n\n```\n\n![](https://p.ipic.vip/61uj0k.jpg)\n\n```\n例如,上图是一个7 x 3 的网格。有多少可能的路径?\n\n \n\n示例 1:\n\n输入: m = 3, n = 2\n输出: 3\n解释:\n从左上角开始,总共有 3 条路径可以到达右下角。\n1. 向右 -> 向右 -> 向下\n2. 向右 -> 向下 -> 向右\n3. 向下 -> 向右 -> 向右\n示例 2:\n\n输入: m = 7, n = 3\n输出: 28\n \n\n提示:\n\n1 <= m, n <= 100\n题目数据保证答案小于等于 2 * 10 ^ 9\n\n```","content":"096221cf5b628be1e73e8bcfe626c73473853d84c0a528f07f6231776859580899120eaab71a6acaa2c327b76ceabd51b4230a8a962459d2b221b53ea2e5ff2df533792a8edac8e21c268fb58889556c788e17c5d7e1897bf130c52760534a0aadf3a56330fbdbaaf3dd80a47e56154cf81698693f5a99aa3da4f20db30e9d6da839a8e0fd0c237e1dc24cfb0ff868da5cf9e52ed5e04a4c96a71e3b4208389b1e2b3e4823cf61c2e6c7ebf48a671f7d07a8e1f977022f8d1ddf6cb4db194f2b3dd34ab10e7a970fd3d12f37dd202d18fd21a4374b4bcfbb45ee630ff597f90adcf6c05fd0fb309d9e6e15b6e5feeb9d0f7df1a4d5c9233715248f04312f1da8cc438584869a4592477f5c0dc95c5575cedbb432fa0886f1491a52d6efed703e5b3dc2896ca70b4d46ba60143ad8287cb7ca39309eff44cdaa58e4fb4789568b11528e95261e5c46baae7bedc8ef548fe8fed1d684ec8876d363cfd0503814e4ddafea3bfc8227897b283e140e25bece7fabf973fa6c4977023bc65fedcf8861268a5d077f3a83cb1428ec2c74de091e80330adc98a772b5a77906db6d5f487c5e65ca9383bfe201ae842375c1d5b4eb45a9fff3ab55e801403629ce630ee29de44588a1950bc63375fb4a612e19537958db20f2b38b9bf91adb0913a184c11da7069fffca0919d7540147f5b9cebf41497476ff2b73b65f0ec43eb2514b861908cfaae3a44f80ad06e91bd0d782ce72619ead90e2600ccd3d4fdbaee1e0f64de02d536e52eda5a13c517fcfb9e6e0197c2d433e56cf12cbd8167f150da66a05256132bba8d4cbe05a662167c1770b64d81b1edc1345ae4fb1f09bf6162c1208e9b41e4116722b146f2f3ba86430f9846d0353a59cc9bdbb32ae16a7a73437534b2f2c3f23708abdf6775627d03c8feda30b254ab546c939af26c3c149dddb990ff53eb06bd60b13f3dfc8a963434d61fd1d73987394c7f4d828e953a29733dbe66bd22e40579db826699039db57e79781d280ee9e9571049cf746f84657bfceb65e975779b6b94b510825132b2a93de27050a28d6090c0d12547b8370a413a62c7e2015059a3965a01dd2ae7244b3a64182a09e57ac7aea67114bf94965c40323007b37564ebe7cbd4316f841b4916332ebfe899890d7470d5e02bacecca5f5e69f88060dc8d8fa25eaa32977687af0b6a2555a27aea06ffa174832a46a817a71482e4f260a75a5418d5e4c1b031a91e3ee8f010f8d896efc71e469ca446bd910ec8f4bbc3f75f3880dbe99d1131417df810f5cdad48770655b0b7f565c1e0c29f34351e0967f26ec3d72e09165e0818f02ec94d2175882f88871e20873fc49b26a2b2be35f32184d50b39acbc9b0c58c8fffba87296e29414fcb3c82d13da37a2b7215942f775f0959b2e02039a31e19ce22067ae7c78b7678afe01c5d96ed7f605949caef3e71a84df75ae525e926b8a78bca03c1e36912884a9f7004a4d2c2328f9f6a9ff02431fc9d175cd99cf43fc096b9f6c47770d92107553969c8edc052fa1a7f89cb4492fccf1ffcfc108a064bbde76e476c71810009622a4ab215eed18845a0d792f11624d98466f72868e34d6f59af1844e2514a2871b287b774a5046d693437aac6db9d26bdc7fe74285dc91b8c0df2d6b6f64a5df02e2fdd1f3b03247e450bb5b310bdcdf71b79553ffd9867aaf057121d3875b3af17970b7ff0b0776e9141dbf3dec81d15e05999f938971f22be1ff7afbbe009d771c61b621cc21682113580d581c1ced97216f919b948f0c0feb173390d9f306971d202f3dfe8232783e00c4ae89711dffdd26724a7621605241cad839ce5624909014e233d75329a1e019d4895105f172ff9fdd0693749733ca8afa4761506e3fc892ce05fce770958f8eedbf1c9a0f967faaff4068421c917ef75fb0711a8a4e3c486e312678f23abe3c757fe91be26dcd8093d9b6ecc71609c6d718f5599cafa7414a24221c4f688bbe551f531e13ff654baff4d71c6d9d49d9f1521e8fa50ab5ba5289d272d199af1b6677be04887bb8479c0fc8c70b1e971a505efc405cccfa963438a106a94c2b362eacb1c3ebc0ab710e1205f2ba1634182f7efb8c2e3010d35af9f83e7bd490f6709a8987d18c67483bddd854f656a6fd86505c3c6c414f35d22d1c6e762442ccb72d17ed7541370ea0155b560a9bd5266c5f607c6644bb95f96d8eec28a2d497a8b21993b8a9c44266da1506439741459212e33ef25b8c5a9689049b96f8018a4c0beddbdf9c34f713bad9b011d3d8a585609cf901ff7b87fb980e2d73aee77a4f41fe55e098fed3ce8dd34117021065e2879346262cb7856a093560094ed48d56afac8d8f3e3cc5c8e453ee06b347346e08d57b3346e07ce71db4cae3dac5943c00f636fe8a4d2e24a8eb12d080eb913b56e53911206e158d3abc4bb9d17f0bd6c64e9b73611266e9b7eba08109092acf9f1318b5b3fc4a13aa3e554759e712c9cdd89c6767e22f334f8842a7a23dac0a020f16a7703d467bf3cc793b8b06a07fc51c70943eefb5532a256aeb7ea6f175e964e7eb20e373a9463e1567a7d9a9efc71be9c9cb1eff0ba0c0ed8a3396aac4f6a71e530ce0ad6204fbb7a7da50b89c9127d6b3b62a258654836a2a61b354df06a005bfe5f00b380438b2ba4a9241c9e9eb54ce7ea870024ecb7abfba380a1b168e69099cb2967ad0cbae68da88f76a79eead6c1ea4c3dd48a93c4a963ac54500fba2e698639440af99af14390f5380f1aaec7ae6cbadd046f2499816e535faa2d67dc2a030f62261b58bbcdf3a36fa9337a8c81f83d077618693f00880180f91d7babc993eb1ede774bdda6b9c19c84867e7264a4cf21482dbcf132e329911f2df344224575dac6cec3b408a5cc378c6c894f842dba58b16c2d601b4796f6f5b1980dc444c2d06999b57f2c732ee77bd5cd56f5490602cf7e9f49239c889c8a726f5880e31f3d5ad515d0e4affc91ae750e44085c67cdede390fd6e23824bde4a65f387beec5b13aee59588e2fc8e8d8ff726d160ea59ff1edf9e443d5ae1a3cdc9d5cec266cabe192f717fc2e45c953764ef25a96fbd2fa7866b9bf352813a1bde84ab7984cf8dd04e5552915bfd0cb5cf3d9e6df54aedeea86c70b57d3e3a1e2e11731e6c73cd98b879abc5c30d40c607bf65304db2181b23f0cf61c0bbe44ae47f69821611b3fdcbdd70f6cd62208a63ae1f6a517e9a0f2ba05e5c6be770eaec459502b5881c5c1f1785b17ce4a0be4c71bd1994bd6b5a4259c130c80c407a042505fecc3321df741219dfb537b3133108f2555fcae9e5c1850fed21b65c65978461e75506513cc5720a755048c0e0ce2afbfa5b16271c364f5af317f1de5ec9d1395c54fe725693029bc0d44b1e1d343f16a8d76db60853bd57572f25986ecb5d8bd6a2901b8ef927240223f5f93079dbdd2ab4515e779ca1a383d74302923149deb43bd58f067ed947d43f919bf25f5d8789a59773c74151ec7204593f49b58627bf77aed8233dc6ceac8bb738480a91d3e2e7f697c2e4aa8d315287de5c25974f0851f9c4689d889394ff053aa0830214f83903dc5817eaad6f68ad597cd5f6e8fe81202f01fece6093081f12cebe28fb1683e9446ea1f982f0cbdf888dc7b1b31af78ceb8de2f3c3b787f6e24f91a714fe622735985d1f2f139de52fb5212fe270255c4162a316586dbaaa1845ea9f6beffc14863cc6c81b4170cd2a65619a07a9679df91edff95b4e97a78675fd9821d4c6ea5778aec107c2085973b263f3793ad3756c5e824458e0e5e5d6b6f7f1d5fb12c678e8055f60688001f57ecb3a1320285cb5a9af634499ca496d3a0fa405821c1bd62c6c19eda101e1a986d7b88fa1919766a14d1954e36843f6d324198ca780f7db94cab05ed2605453c5472dabd6dcbbba96c1bac37513116ec30f715a2503c8e3631cb5d899de02f14dbc740b945d8e6254de2c3af4867c73e5898ea065be39969007ccf5201563645df5c3884d9c12250f269af023ca08e43820cb3aa993c7ce2a28f4723ae87c4ebf86d765be976a74d618d0cbc8b928a283d68f4ed1fc20581169f071ef239a73c5e7877b657426ac981d1344de68c6e6c8d38d991915d3fb147f0406447f59b2cc3ddcaf5a21e81eb99e5189dfe61c6aa9e729d03757e058a1840a2cdae1c73b3e84e88de709dbf472a8229e70c8f74b9f925876c29bcdf2a7d612774b5a51fcef8aa2b22891bcd91ec6c6ca80c9ad2e65275961f32df60525c709fabd2beb866a88f2ee399c278446eef6d887f323dbc5232019767f8f0d6ebed11cfe7601edb3c7f35da263bb2039dbc66423bb8963c6d9474e1ea8a243d3fd6765592c5f02806cd025c8b68fa9bad795e2100b71ba37be40a988ee52943159e1aab53436d23a0c2889526c2d2e474169551e11e0b088afd50b6efb9637b14472d9ac4188833832f1afe49285d5b1553beecfe26703662c89b8f53e42087ab87f8f8cac26bf327dcb4be8a57f6f685c9478c0fe983bffdd4baaebd1bcfabf59f572c73d8553c1028751c4a4ddb1f1afbe733817f60e7b430ca1706702d8ac88eb448404dc36206e03d8953e1f650667f293dd7586f99573a458e1fcfa13472d652de6fa704fc8101168c518ab9b48408f86d4da7adeb141c9fe5acbba2239c6c74b628f15bda636ca04b0d7c3a19d3149683ddae47b94eb76328bcd64b03ddd4d1a5f6f26b9cad10e2c95a698592efe07c4aeeb9674c5d5749c238753b7298ccc7e97086f86f566e0947d24e925e6531ff676e38f5d4bd7bdf97caff2ad52aebd16275a764bb77f03c834f103e93ba59e3285bedbc49b7e9819760e6cc3b4e8716ba8978d20438843ce64666238404f94d0113011e8856b5f260f73e6830990acbb04b5d6d8c686d43ead886ae22b45dba023225106741a0c7e56bd78355e37ebcc5511e1465fcb7ba6c3ab89ff4e57e9c841868d097116a08ba43b745eca4244d2a37f72be7a043e364e5e1c234f319b8a7c90c16256c72e26c5ddd69b82b26a8e9f0d147071d0334b35fb20beb3c8e066c438a4180bc636feb930e69ef35cd6fcdb3b720166857c0578183b2d4658f83143be21da0b21440ba1e5c0925a1f3966769a6f39609ed20ffa9f30dcee225bb23c7431545d1c2403632998e8d011b458c4201c976eceba7acb94d78efe874859fddd8ac65c5d65baaea1b07226deca7e4fff594314c3c108b93ca3146ad88f8e54b7027a21d1498b9e05af5a9ad43937a6a0c0a7f59cfd533443e218b5c5e7c5552146aab5733b906beaf2e98a8c8f96b5d7986c4d3d79018636c5cc0b871917cc8e024a39c9579d858287c47eb3dfab227942c166cf6975e44502fb83fd21d2aaa12ba72e2f8abfe245c2d54773c3d75ea5cc2f5420b3ebc625696b6e240393ea254fda6e04f2047ffff7f47ded69c955a71e4183b3db106b96914db1a6b222a43f0a5523e979bc96d9e010b8430a65fb221253a0343c3a33aab243dc784619f1adf28197f0942d5f706b0095429fb07177135eb07301066ecaf523da6e819f06424edabc09b6cdeb16bc35d5156375432615c0907f91ebc5e29a16112308a3b55f68a228109a8338a3bebe7c3bc05a759cefbb808f7b97cb25f6cd393dffd55f9957ae679f5cde8ad56b561b4d454d168f6cadec771ae04b5e22ad283d1d3dc61eb6979fcab1f2108cfa1d8931a592546023a1d4f0802d5c084f4cbd4fd08ac8441b522377597fe48b1e56ad94066d050e9e9dd318c88cba4e1af26146d9443160fe6c10aa46dc4a6ad6ea76315d3d89f20109160685731f889ffcdf1c8377705ba328d61e57444ad278bafaf45d43dad3bcb6a5919f88f33cbf20b7ab24effad59db253000f2780cb9cbb7655f8d05e3b951dd5e814d3f22fabcdaa2482ef3c33f23650d1fedd802a8bb1d6cbb6dbe3c1ec5804c9b584ff5c520c4453b846bee6c589365f20484ea7248d180a04c738a984d55fcacb8db7178d3eb701eea7479c8858dc5a129a99bde12805cb1bb454d7e25a9de5008f50a566a93a997226deb09dfacdc41bfd11f26cb909d861777039ca6d7bd05c01ca179897ab787941ba988be49ced02b56ab4d8a649ca328321bf79284a1bb3fd1f272fb323eb0042e9c3cba65a678f25cd717c3db2a1381fbb4e759a1fbc8e5591695f9e79adc38c54af97344f39adcb0e0863b3f36c44ec761ec1d2c27037a494bc785329fce598ad32afb2b9075f803402421817f0657b8fae48e642cb15d602a15ba7775bbd4536dcaba3b1d698a112f8cc55d68236dc0dab85c10c03bb328ebea24486714e88357878d9761ba93a13546e1717486bf167247fe399e2858234e74351b20b8558767ab51dc4eaa1f007cc396cf7b3a0c1a1c05f3b918ba96ebfdeb54842e737a75299e2d59332d6f0c5bf416c227926067c5b4c5fea536586aa7d8627942747a4daebb6118d0fd7164e14a5e31e58af95f01164c212e7e3caafac1670dce3fe9f828226962e650150ae03d9cecc235d775e80659b34bd6f9aabed8c62a9ecb77631eb04b45cff5a7fdb82a47e3d507d8cca150799b5be","title":"62. 不同路径","link":"https://leetcode-cn.com/problems/unique-paths/","question_id":62,"issue_number":61},"59":{"day":59,"pres":["动态规划","数组"],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从 0 开始。即最左上角的格子记为 (0, 0),最右下角的记为 (N-1, N-1)。 \n\n现有一个 “马”(也译作 “骑士”)位于 (r, c) ,并打算进行 K 次移动。 \n\n如下图所示,国际象棋的 “马” 每一步先沿水平或垂直方向移动 2 个格子,然后向与之相垂直的方向再移动 1 个格子,共有 8 个可选的位置。\n\n\n现在 “马” 每一步都从可选的位置(包括棋盘外部的)中独立随机地选择一个进行移动,直到移动了 K 次或跳到了棋盘外面。\n\n求移动结束后,“马” 仍留在棋盘上的概率。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f259c1c3385f76f7230696b5e66115584ac2460e5fd220008b051ee154dd47dc5882972a5cb38d746f23aa4faee7bbf7166609ec0c2fc0d268fa687d35e703aab6d949ba3009b39aa6ac5e9aaab854d6fdf1b6eb79a2c203d0e6bb39cc1b333d54c2c2859f1cf7ff5b6c4198359e336d62768346920316bc42a8719768763e0d30a884e253d5dcfd82079f08ffc3959772a276cc6f6207a7a2ca6851d787a89a9f4f2bfd9ef64973dea7b45f60d119d7bbb48075aa10cc2e82f36cbe4f4e539fd45a19ebe4762cf278d926b2f38cda0f3b906eea04d83f5372ef8bedf85cd020a59d28fd964661a4cc030484a1fe0b771e5df8dfdd42680e4d10dc95c5a76c03506a5386d900adbfba14aaae90896268b4149cf05e8dd1ec36057a97ae1e6e9943b58d5daef2206d12c9158f421815b0c8afc463704cc352b8b1c278550daa8da91b89488d44e9f0cca7da8f430d880d0f776838574f851556a2e566e8b9639a8ae0fdf12135b587fd73c93d8dc1f1ae9142c085a88a66338a1405bb06332d7540f97e6a811e687e9d24332014805bf87477a72328d32d5f71f1995f3d259c5a8cfcfaa4fd702653b2aff7a03e8b7e54da385a88212a7d82ef302750f310d6f914affd3dcac8eb7438ee94566658c18e30d551e5527895f0248cbba96e6cbaad8c236515667e0cb4892509b99769a996f806144b363e014807eebbad1fa1a3cb9cfdae83a57c9b249e3b2ecf2cd9f63fe91ddefe583ac3f5163cda3d4c139d6b9f397d0424a8e873b167f1bf80f31511c18c4f7c4b5b67f055f58805d2f6873f65ec34c2bb827f3d2686c162c1f10f8b5236fc9c9f8d2db8fef20feb16535a8aae4a4bbdfb08d2972951f4a4614d040283aec8038d3b38ee0166ce752dfcad7433c2fd569a464ac4c95f51781edce61ff520eda11763ab4a1c6e3166c2e23c9571d8bf6436fa0883cb11691c17af3823ff95b2761fa2299a2204daf7e8cfc8b794a4b06957f179ee3413ff1ed79bd9f2ae37e173a0682d6565008668511deee83802be6240d18099bea31b5c432d15578b3271650a12ad50399ff79ed7902e5838d82559e6729caad6116d313af3c759634b30e2a9c1ed64fc642d69e9f722eeac3ac441d1f8eb3c3d12d60470a672f2c0b0929dfd9c012373eb5a0de30b5302d555e1bafa75ef2304add0acd48c5e48fd9e7e9d8dc7dc40088f787ee58b892939b4975a2dc14c136805fb1276dbc4fc1ff15b75f2fd8ef4888f091057879cde093e21d6513a4ddcbb2f8d4b39ec4ad29cf9963fe9d63831c34bbb7149793d448e22e3c80fe82d59173f10771e35bbe6701c24efd63f72149d7fded9af2cbc1e0d67449dc85b8a1b21eaf2154d44bfbf7bcd977dd3a94d3ae394680eb068eca559cd7ce13465688fc5a009fd476669e8595a429962a74ba688911af6b67c65b27454b802728e0d06723b82d562e3f18b56273eb5613efd40abe30761c2a643dfebe56735f5e5a1189682b1810456b22d0611754bbca48a5125ba0ffdd238626535245df454f568f12248c98c374bfa0b7952cffdf1c1e7710a6f64d96624f9518622fff0c38bf4a0d7352f1fcaa3bcb2619290046efd2b8e232d09dd5156d6a8541b37d9be1f7a66016a015478f155c7106180608d0de3ae2b2e56621627482ad04fcd416460e5c16afc4b431c2911d7e88bf07b1352e6b638bad30cc4c15f95dfab628b7682c3a6ba256fe0befae9f451abf103a82e28dcff2d46b2bf8059949cedafeb37a39079b306a7ed12bd6dddf2526a4da0167c49a26cafdd2672f8043131e121e93b391cc48442a284014267e3680fd8a238df6202b6d1fb280c02853733c489ac7fe724674dea9e43f8239d23a4b718583cbb187aab009fefb8b0add65fe7f9063be5d3df1efcdb1f3f571098547e9d1a6ff7c56fa09a3be3150c54ca42e52f90361e931a088b94a7dcd6b719acedec0de32bd2ca157ce2bc5f33936f9b5a8b9c64f2d8c8e4cc1138c7fcd1166458f90eb5702b975e4fea528b2d4e92c99820b896aa4e95b5575a267628c155e7a73cd29eca3550ffb41ac4a9e3601b6316571b1154125c2ee170c05949c94eabd411f6b15809b7903c743a2b1ca984675476edb5f04c4ecc427e65e2aeac7e4584b30dc71c27dd66e0770c51b55b547ab987068e2e604e66b4e9f5f94d3dfc8983f497a8b21993b8aad632778bd5f7c307b375521141ae510b9c68054934e996f8107a6c6b3d086d0c278513796a60c2f208b636409d6921edfaf7e9dbbe3e638e44184fe3fc1b24f9faa41dd9c553839eae794bb868e1c5e85237bfbcb557fcffe2ba96ea887e1abb1c52cde6a7dab675818538a6d9b7691fede5cef59be2bf2318fcd5181e6f3497d309410a2262e1b3fb910a36f75b7a1d054d634d4998dcb51dae1266e89e910766f7afac66ddc852f452eb0a507d72617b6f100cebe751bcd776be7cad4b5453065c357a6996b2513b7a09d4467e9b3dd22a870c55a63426cce8164c8019e90323a9fd73bf9492605f79bb208cca170c380bd9b61d65558749988cf70a8b4908cc9f0850e0df9bff0c621901f498b5de84c961419fc680af90aeb92171c1d0a08cd492d0932cee1396327d6007a5a8a021be3df5ddf70a9cebebd5be7b806bdd92cec63dcf3d7c3c4feb1f018f0f7d1df6000817e166d3b5b71f667552c362569b29f3a3d6f4071a93198b2846ca4e257f6d0e35d2e14990301d086d71f2a15d47e46c5eefc0610b8b1c873e9d203f48cf2e5b3e391395c6c29c121501edb8ef8b786f596a7cac614b6b4d35736fcd3d3aa489f5d619de6f9cfddcfc72f4a39989c784810f3fb28e560a15164e66e5a043b9d8396dcf423ceb2728c25c71bff50c163fe7a6471541696e4e0bcdb408a0e95857495ee23296909f526d9cd0de745060fde23930f37dc84ced478631195f2417c06cf5cd8aeaeedd3a77d794808076adfe1e381a06223d946cc4665baeda0fe0c44ffb7dadf9facc6cf87c5269e68a501bd43e7e55d3c44dbeb92b9c3fac368c48a2e346a71caa012d04a20c925e021e92fcc8a6b80f852d43a59de899e60848184c16804369156fd1dc8e57dde699035a5a82893a008bd9cbbd4a8c9dbf6ef9a7dd6fd06c38486b0992db5668ceee31fdea6813555e70f630e35d90a7fc16111c0f4deec57dc0aebba43d43adaeebaf775ade67396c7f70e20c0b4288808a4fd150b61781205f13d3a7b5735be3698901b1b36595fb568c8dec7ccb0b33a569de448f29ec81330c152ade9d048c19b5f2f0c484da5399c7ade8833058b11d0de948837a3b4a0ad95674e09a36133ec82e2989b89e75194240a9b6e17b393d17fedf0578a200610cec681e2e1ba5713fa13229721ef9283935dc65b5de4deec9915a495690d7f23f4e33029c2c738bb114b3e86e8fc8def1152d76e0d8ec8689d814c2e9e4efe15543e659bc0344d3e14b447a6d631e5caaff4da7250e360bd3b1dc1ac231b212b0f1226865e6925184a795f646e148e97285198be128b95ce3e70e05506035160a3ff457b9fb406bdcd3aedad536b90f165c5975a1928754ad2a8ce29118124e5ab830a248632b6312cd9dc676e133551594f3763741da5327e25167e134444545d41cf5762a037fac9b5779a9bc1fe141dcd62cf810de7ab98d9cf6686e9a22610326ff49fac5468d228b900728fcd9c76eb89920cce69a03940d6404498e7182364bb6d769b00502191c93e02eb21712760eb29a63664c07309118a40119eaca58af6c9a1abb35d8852ab491e333b8072ba329e6e5a6f66469f83af634499aa053f2b2093018c0425b551175390e54fbaa997c98a92b587b355887e061de3796ccddf2e5486a9d8ab9a83e0fe44d2291a07cc4720b5d695f5ee8cebbac375134c44e90f381c254ec8fe7e1ca4d8d6c852bf50a12d5bf102e9324ff42c3af4867c73e589d3d80aea6cc4de07dddf20512c311fb986884d9c157040688ab84cac4eea6d6e826bfcd6f1c02c60af3339bc7107ae97d73bac972874995df296c6a56de0dba9ca3e90a8680b1924fc71a123d13c86eea5726b600ccc9b03139160fb45525a14411b3375d5f0dbfbb6c3ecc89e2968f86c079f8f57d9093829c18c2e99e76c3cdf6ed29c52b26e5abdb4f0ecc7fe811e2e3139892529e6468304b23f29c92d5beff8563328f2ea9695d4fb90e56b2acb8bd9538edb860285acede2949656d0b65577cd24e73a27d81af8aa25eab6608cf3be199101ae48c6d9d5acdd20e7e721051b777d830a52a712d16f374590a2ce33ec0b63b21bda46963a24d1cf7fa2a8520e7d95182dfda3486808771278","title":"688. “马”在棋盘上的概率","link":"https://leetcode-cn.com/problems/knight-probability-in-chessboard/","question_id":688,"issue_number":62},"60":{"day":60,"pres":[],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n在 \"100 game\" 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和达到或超过 100 的玩家,即为胜者。\n\n如果我们将游戏规则改为 “玩家不能重复使用整数” 呢?\n\n例如,两个玩家可以轮流从公共整数池中抽取从 1 到 15 的整数(不放回),直到累计整数和 >= 100。\n\n给定一个整数 maxChoosableInteger (整数池中可选择的最大数)和另一个整数 desiredTotal(累计和),判断先出手的玩家是否能稳赢(假设两位玩家游戏时都表现最佳)?\n\n你可以假设 maxChoosableInteger 不会大于 20, desiredTotal 不会大于 300。\n\n示例:\n\n输入:\nmaxChoosableInteger = 10\ndesiredTotal = 11\n\n输出:\nfalse\n\n解释:\n无论第一个玩家选择哪个整数,他都会失败。\n第一个玩家可以选择从 1 到 10 的整数。\n如果第一个玩家选择 1,那么第二个玩家只能选择从 2 到 10 的整数。\n第二个玩家可以通过选择整数 10(那么累积和为 11 >= desiredTotal),从而取得胜利.\n同样地,第一个玩家选择任意其他整数,第二个玩家都会赢。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2792103385f3677f31437a54532e54a18c2d7fe710b3f0987cab7ab5e61db7220ad3962513d4f02ff460b3e5f06ee02c656797d1cce04620c3abc49410683eea32ecfee24fdeb15ce047074a2b7dbfa53bd80bdfca6069b7ef8e2e0a0435b837cce7e9cd09243ec382cbf515fa2586bd46755d0d117c1cf376f636f762ee54d3088740252d5d0806f47ec880355e7f25771418a1f14ce580bbf294771e493dabc8f479282f63aa322cb0a1fc171f5aa343ff5268cb7dfc905c3982412372aa20c56f7f2db1810959b8cb353a7f8489afeb3f9ffb5e0d10a88130e7e6e6920551db4144612e080a27a80e3e0a20a8d8796b362e5cfec539791451cfd1b7f65edbb425ff2593a837580382e4cf75f92f2fade563cdbef7aa2cba91c37a295aa50cb48e4863c54f449f695ada8479831152af951630524eb0af53d1c2dc6b8cf7e1d1cca1efbe5fd060dcdb6d1414cde6a3f31afeb334856f33fbbe902888c0ba1279b4a0672b330567ba5f87a6ae317894054f5159d8f75e5cea692ac05863ab6757e3f2e849d1ec4c6a876a022d5e8feb10551879a167a6df796992b0a46da7fed6b8c565b56c536f79d70254c12730c52967ef30a66c76b73f437f6c6b1d0af976a88fdecfe58c39e9f6220e4936f6be111558e3f542e6bf8c3e3b427faecce2b870d3d368c9ff4b864099b54f9a997f806144b36dc7118750c0b1d5ff16069bcef2f43b4ed87616dcc991f0baef74b3e6ed908aa2053e7d4cc6a5c509931a75545215e96792e463223e46f6435f4c5253fda99ea1f13a32381076d32f7153f542f64c24bc21f6e14c59a8c06f069ce03b0094ffa0beefea8712a0e557997c11bcc5927a6909a873ac104b492416371849b9a17089bef5544e26f32888f6b8012546b77af6339b1ac2f55dd0f0890ffc0376cd46081cde17413ba6ccf9b491321529dc96f4ddd538cd5295a433dbc765e0084542af70b72ad1a408ae6d774193cfbcdb398fe11c1f90aaa9c97097ae29e65b14293b83c04d513a6340af51e3bba32bcd310f2f1d92ca3db5e524d15c417ca3bf518b0cd50390f241e47a20cb81a5bb54b67908ea4b0e6fb08644e8c465e8f28045bc7f98578b2ae51f9c4f2de1c7a54d0c3682b8dad30043470040232b38083ad0dae71b370db2aacc0eb62407564511a18768f20361d01bf94efac48dc2e4eecaeb7dc4098bc1a6ee7d9a9ea7a24951a0df00fe399760be2f79b056e9fc23ad510cc3e354b7f88a37724ffa05258a475e42cefa9feefa8ad79384e72d8bfbaed427800ddffa2e5ee013412ec31efbbf5f0aa6d6fe2ce77b28dd28f35d479b405f5bcd2844d9d8ea45723200750883fb2e6e3c5dfe51f7153bb06b88bbb49c13fa94505b13ee30998c902ccb52add4eb004d529811ca6cc7e11104b5edcabea1f12b6c990aec5dff2ae023b389969102dfe87a5fdc0983307cafd0c33a909767a5f87e3df4942076cb8eded0ad84cf9cfbc795489be4abe7ec3c04c075325559dea460d24a7835fdf20e8712575066e24679668d32218faec0749bbeb89524f1f3311e6c28abd9499955639c315e25fa3638bc480c4f77f3dcb939e73b17381943cdff559f1a99c4dc702442c01ab131f1e5a5fb6251fb2906dd03320d09564508bb74a324c1d433bddca23ae579c989674e542b26d0ad9f97cf822f7e8186029d042d4967898323ce7e33f34fc0bb11a16b1722ad0b16a73a95c9b52c478a7a7193a8d2ccb9887a699138cd02fd8995a2045f3fd9545b32be3fbf81ecabf323846c5d4c43a96dfcd5462a95751310161aa8b773ac500d5222245f2a3b6d945e65a01bf527156d1fbb8ed41a5f741145a0c2ff425b74deade511b6ff7eaf4160958fcbba8aba9406fde78925c266c37c9063ae9bac7c2a5e1c340b909c4ab76b3b759a25177f4089d25b64a614934506f96b3ce643fd9cca1872b6354dd57564c2f53abd11b357ff03cfc72834f292ab8bf04d15a7867ee413af7acd3843449ebdea6424ba56e0fcaa28b0effe2caab40a925dafed6d92e8e13f54e57450342fd564b480045bd615cb4be0660e34e2067339150c65446ab8cb9e3f9f80c2bc7420683189955a0c2be42a7529fd2a71000ae23745eca8aa2e0f90d42e572ea796a447f03eb959a0e1b809fbdc228c3549ceb66871db49d79d0ff21f383d5347dccb9735a74ef80d0da1a2b06cd38e85e7e0bbaac2e06efe470d59a01a925ae07f8f312b795e75224badb2bd490889f6ae4f1a6744a3b87b8d931fe4839752a801d02c4046f2ca0aaee2876d11a7c9ac09555d277400f2b214fcd87f1996bf120da000d3761775763e43fe4986fe62b2def8980bf95cff762c198f30c265eb64a3764285416226abf2fc229463f2a3e7dc3cc864a792596065c711ad6f9994d752c3e0cbfe202f5f6c371dfa6a1fc18b721e75347ceb5bd3bd586a9906e7764b92661593dd91cc405e22fa36f88e397205d7292a81d84376be09d23fff1ce9c163e7b06be4009eb00930a4e634ec702723e09baa35c1a857c385bb9360e2b8c8901f4e3dee2c571d6d437460d6a23679bedf7dcd9c932e980f8d0bdfc176baea7de10a10c4f68dd2e24f86b9cde32a7098f0a61dfff5a07f80d4384daa03a90925dae4522f3a9d7b17e265ac6d1e2c3b426f0ff303f3f5c4ca6235b1720848396951f85d442c001eae4466a6c39bcba660b44254059d4a7e8f3f520bf92c0ca3c5e534131de6a8ea18f5890166ad0578e894873bf59755e1ff99d1cb9a8c5d056b64b031d9f148393dd381b5f18541238b0f9dfa54f167577e6cb319ded21b2813433f3c43a39c5ff306adfea6191fb5118a26a6d579dcf4c3bc30446f177bfb25209429a92fda4bb116db4e90e49ed6cd3f1f7d0d638b30a74f5ffb532687edf6bd23e3510ad1588eaf9b09f035c9cf6b4d6850eccc8c0743efbba01a9f445966475f61e2a08090f1a26b402b0545a6bc12887ee84f9df1fd6691cc130966dfdbb9c0c499c921ea63be15b30f645d99b79d33675c67563828ed1c6d62307f70a1a113cb190f8769ec06f37be2c12e9bb6c16ecc9a426c178f10042344fbb1a854ed431dbcb7289be243cc2f7bd42c45de092661431872133f290edd30985e810d456931ee72088ae4c51f93e7d9561da840741f0cc7326dcc48549ab19d8a7d33af6373e05cfc6f7e3935906977911d215b98e42a20b23b08f1a3461167780671a2747b5c83a941aa4d61d9b3a29fb31f845b6b0f59327ca6fa557bfc3761394614cc5b85d1689563f525584a061ea5e004945377bf8767e1573444d973166f6d1837fca1870fa5a94a454b015d074d9771ce9d3df391616b179e5c29cc16fc9dde09410c4a5a07d6b852de9037e9471e4530f803fdc8277e4eb33f6d55909ada837b05d5ed134be3068497b06c2d4c3b4592f259fdad4e55e65403f4e102e2fed0d29ca3257cf2f8aed139f02536ec2159637334a6e97dbb3dc9f14749e89bf394dd8ddb0b94eaecf4ee9adddcab841f50a6f15d13a74e1174faea469a9aaf94d20f38a4b90d31d63a1ce1593fcfae6c74ad6949d6e3e6f5be392f1febc85b93070b20c29d37f40ca5e97367a1ffb1fdd6da80abcfb0803af583e3421a3976170b3e875ad6ee0b853d3758e36941502bf4950bf67a1da4220d0b1a6fc4acc364b598f4cb5b5a04c4ae5d877f8cf34a2b55bf436c14e53edd15b7985be78d3d7cdcf7882d96bc5480fc863252feba286059620feb7afa6e17883a404287430e8fa6ebc2b3e0edd3ce5d47ce078ca5b3fd0df67c851ea7e6cfafe6254b30c4813608c38affb47bc408f4ec3f8ccedf45538c070c17047118574723bb75cceaee7797ab7850999b0a0b0f13255d564b8366a1df996c83b81e1209752a15547c7bfad6bee10794bddb9fea0b5edc368ec6d6449d068406c5cc3fe3a41945d22c77b5de1f3baac6ddb362a629ad9053989865471e649b59644fa57d80c8d2ac0203a21ec42ffae847c46f1f0002bbd00fbdcd4cb4e2344360bf7437c35eaf9904170276c02d641a0ea00f6dec8cdcaa6ab611855ff457213197e39cbd412f85d71bdd3f97f2828ca5c993a41665631736722354240342f9177a97c7038d596b618bd07e9cb33c31cc1bcda879f70617ded5b9b5c9b4d159271b410adff9709028904ae9fd7f819d4749cf82f91d0c6f1165525466c9e3afa2b13b95b1dc21c5ead082d29923570f5856dc28db22cb71bb35d432a1e75d255862da5c8b2d847b88a6bf8f5ff78f4d037f327fc05a6dd98d3da0dc8a2b3665f35e8a6ba73b39db42bfe02c50e8432189dbe109d166defe725f55300c78d4a34c89fcaa9de1b6d8c88767214fc24ed166aed2af6c963b73f9b1fa0438d433536bed46692a21467166167a45e6b0aca6c5427dee825eb25576c1f50e85886c72b5bfec80c7d6bf5766d985a33142356fdbf1a66a294b3392b7040410b4378ae00dc00859edbee7e45bad4f1716fd40678e2d5c5c5a02c50aef7dc871c01695058d5381eed8adb4e1ad627e4f904b361003f43e2e538de985bb4c964cce7a272b4e86c7330a62067af9d8833ad8b7f3668452cbfcf013277d247fa7b7701486455c78c51ea3c94b6ae9cd98e96fb5e30084fe0185ef6f7b839516248e6dbde236e318f5d1d7bd94741a376497eb7f9ed5147dce910fa430ca2401456330a9dda14478ccfc826e2eb8528aedbfdf3b8bd57cd12f871dbe2ad723f10e8d9651608e4914b58433a22ac7ee12ea4d549cd013302d9d63790286183bd08fadfc8926beef24a86ef32dbe2f499c1532566f5ea312d19c98af5f3677c1cd670b21ae936e867d9623626a5f0a464cacef8a214df6d7adbbfc681387513962ed1574f2c686d47afdf3209f2b58dbe473591b7b3d570c74499232711564f2f00d78e14d5f852f96e9abd4d56457e99a04d2d85b3f16e4dbdf757453ca017c9ddc7027944e162b594e2e4577077ed5997cf38e26138f4158d0cfd8cbbda76e92940d7d3c3083604b46b46ce8e74407951b9525dda770ff015ab3566372892b6e2ac3f7cf8012ebebf8d9c5e4dba62798a735e244ccf4f1c248025230d3dab8c1f86e9fe5ff0e11af58b530dcee660bb22174180074497c4d2d47debbd801bd7284601af2160a5dd04b675518244ac89c54091154d6cfd055300976ea831873ee8b65ff8cce20569165f872eeaf204e048954ccf8a518a0284bb3039c3265fca73764580a3018479bb3c06fef644b00639d9ce4284db9b50bea2d78136717025008525fd0e6aba4fed96e4e4aed11dce50a36929ec954d345686d0806c64d4701ca90c25fe12c899cae0c526f3504ab335736b27ca7e3482437b5a6ffd8c13346846342d7dac23449019f84e39a999e4a2cb2a210dad8398b987fbee96cb9240ddb7e958836384582f7273e85332d778d12f8e6b4a608a62b07276de40486d3863accbb9e15b5f5b7946413cd1acfd0dc51143d1d7f6569c199c3d7d750cd470ce86c6a1be473c59ee30f5ddc51a42c52e0badf7766cc044265b613f2709fa7a6edfda74f49c438207d3b569bfdccb42bbf55ad08a0d63a22fd0c4034828dc219f8684d35192dbe495aee4e53eab22111d92e9e03fe58eb77097cf0dad587c9b0a74dd2256d8fc765d7f9e433fae2afb7009e075f3568760da34b40b94c9e2a5bf49ba0401167439ad1fba99a78db3e126581aba3ce90e696046974564e3c8f6e210d9cb9d918f8b4ba573efb434916d0b38d7dcc13b065da6152dace613f7f3889c725003f2c4580972c3f441ac33db0faf46b4ff3400647118b463d1644ff4ec6f4b7b3b795a3c5c9357db2126d8773f8e094be6207090389cb8c999affab894653fe0eabb42a8e970fdca0a773c8e8959f5af97ad6fe7b0f8f8993eac8a6ffead1c1572bcf747645fac4bc47539246b8e3c6971c5c1a664cbd398e0e2607fe05a8a6c356ccfb8282388239ba04f2ac83c18d0f835d74c7a2c2922c77a00cdd0dca98339d84679637ca582fd53bfd998da0fe80d0b9fe5e9f0e892dc369abd191b92980f000bf837ef0ac1f1f87ed8f7c1f5f120660ef862badd9b714c969d866ab3f752864eff39ac7d27be62b83cd4ad41a1eecb723820488a9bd6b645d71fd423711eb6644bd43f38963ec1919ee37ecdc06166ef0c48be1ac3e22a2c32db26d84de9626a24c3075ed90a821021260cee8b639e9f3e9518acbea83019bf3577cdc5d8942fc0784749529daba2698d34b77357d663066a77a04c76f3fa058c411e5963d7c21b44752508950811ab10f1f7fd82903f3640f5929100b5d69ea626667e381a586dc3eaa607b7a8039b4c5c6b50bf7ea87dc05d81262eda5a6fcb9cc58229180bb6192f5b66e69e613aa5291ecd88911d4e1c3b95a79ceeea9ba156d3a39c4333f9dea368742c71139dff59224a8599f52c1f9a07372b56685994efcc34fe307742311659a8b151116abc9c4248b2e395309b212d1c88a3c4f3e14e50252e66fe52d1d3f2ee4786c08a784038942b574bca9593749ebd895fd5d7bc6af247b0e3fa12f772d18ab4a6953bc10ac7636cb4d6e667d565d1c9fc47db8feb40d457ef0eb072613a259cdad9bf4531ff905e63e25e7c469fb77300f2c8c1aae9890675f61549316eb26b8fa82e4346a25182604e4efbf41db4a2f97e5981dbf3123bc2a1e16ac331a976ea03ae67d8c88ee7052bd76aaf401b5635fda49ae478d18357b0b4d7df81aeed3797d46c19939a92b19eb6045e9e30ddc27c3f946be6dbf63d515113deb0642d00c63c326fcf71e275ab374ea43e22ace847ac4960977f7f883373404603662e51747124180238fa2a3df80a80f3430d9eae40579713e725dc9f69679025a0cdd36d54ffcb9f1c3b48fe081fbc4e586665919f2b37d47f3ed7efe2a5fff4b0fad1f3e5b09a2352a89934789f56c2e3ae8d77d615ddb06fa5fbe9a27b1fa1081b30e4740734369b1904aae8516744a3f863a0813f32c15e001cbc92c1de4e65fa0f521bfd3783374cab7b4c1b96722896a7f6416427af0298f802b2a82dc119bc237f244d16209e6e5f80c2635c1ba4b791a3c1c13c5fe695c4ff089269a935eaf2be89049e824916feb755f6c8fa6de4eaac18ce39cd0f978dc89f1e331dc8adc9a4a9bbe2c3423ea1a06bf17a3267f01aabeaed46718beb2f5a826c27e2d535fc7e3c0a0f66509ad0db881158c06ee3d1eaa220b07cb136421b38df53cc42d30bb1d96eb9c92df5dbc946bb0850d7c025e82463938bc9e77f19a5a4d0850a9371769c7d7afeba39ab4d11ed1e3ae97bbdedf8423498cf3a33574c332ce882387cb8260367514c792f84428a172c27757f251159097e23091f2e237be5dc66296c6ecbf44bf504f36f3ab351532b7a7bbc42fca237bea2847ff23b4029dca3112b5a61d147999edf93b6c683a7e4a0e30acc0bc26bb9a2dd9c4feb3864d5ce987153a6d714e2848f986e5ac6dc56aed976dae2a0752f1115b9312c23cb140634ddd1ebc69b5221b45c2dad3ca9df5aaa6cc597fc1f5a9744a8cd2fd3f66ccb18309a1acdf4549c472ef4fc1380d978d65d037b0f01ad937bf9fc75b27eee150c517a2ca5f0df80149024c2d65e14a0786281465a4b8bb06d1d762141034ba39a38ed79d7a34ffa0c469682abffc9643148f126934fde1b331e6de82a1e960ed99beed8c10f8443689a0d68f58e95d859a88eada55dc70b7af898464cef4d4b55ed1bfacf5a1e0d60ffe8f09f34d47499dffaa41103f72f1d00e5d280bf39d22236cad7b62e574e7064e6da647e6ed4c860c07bfa2a2a51d6341d4640e8f77e4e4431985a07bad9ae81c63bed4c898087c84f0fca5a3384091192c39aafadefc166fe8386935d362b0f8ec6d225e0fa58b8cfbe44c997d990618e753cbbf5ddf0b5fa12cfc56783b51f183df51b145f8878a3638d85b0b332baf0114bf8bf5325e93c6e1b27e0921d1e4e48f314c5f5544d3d563c50283a86dbda8f25beed4469628fc75f586e070a09dafcab944aa5aa8134b9c0b9d090800c873aa0935228bb28c884eb064577f5fc7a28d3fae78fecca5524916a1eca1dfd1fd2fe1e3ffd8e3962d2db83ea788327eab6c4f1e9bf64139b056bff28e3f960fa5e90ebc4c8e5700800a647907844e32c9e965b49266949336a185d8b7f3a95ba85e3da167949b57e9cbb9ea4b983570194d7b73cc51a0c664bc4ca71c15c6515035352ed9c6aff3b3bfb21fcf55c6ede5c80fdddfed34c0e0ffad733b5b80bbdc6f72ace0bbb0c56ebd71a116c09b77372bed7022826b81145fed23019948aaf36eb5e9be5afb6edf270c3a65db733ef422b6996633cdeaab1baf742dba854f7f29cd008f3e37b0a38b610dff5c51d45ac4d212c61e5c527544207093c3b681c2e4fc562a004c9d0d000065b80abc1fd87ef7fc5ad84eac2a8e6f9aefcd6dddcb1d7dfa8ce3e76f667c99a6675064c1ad24662ee2adcce77ecfc673d1af4c1dd893c0829af9f54071f9218839d26f0d9462490651033bed9c44479be4c9e9852bfa111d5669476017db6004257064053c730a946371890a8f804cdeba2b92a5e41d7314bb8b0d7e77fb7a68b3699e4a08295310a527b3bbfd63e75bbfd5da9c285d10017696a1e3bf13096e9afcb9b35603f0c932aa9350ffdbbf4604ccf2a6d660bd0aef3ecae5a156af1a57fa0d5bb69077b2d247b1f0ab27a0cd8e8354897b7e76600244e94d549ae2791dbe650a1b23ea62511b541b9b1f2b9f5404cfd65c8d9b59e69c31ced16d32e677feb9f267a249e7250dabf46bf107b8d69e5f300f435cde8948956089d24e0d8c2df76960efc7de97a06063cd1b81ca791b5f27591a459a1946e452feff996be9936cd88d9f910658a05841b24780def70c3baa21db0c99da408f43269e4aca22039504db9c8d933e19e6e80cb1e2501c5e96af8dc399d0c1a7ed9a4e14068dd157bee867824f2af1643905b08611918463b8a813fde8bf0f305d9dba3c68abf6b100c1b4048e9b3daa49d7b01f9443622308b11cfb5f36b982a76fc57fd48ec60ead6840b434989d62463e2828263fd23b21c865e2f66a60dd44be55b85a7bde37587a311c3e2847acb52658a49351833aa5a129a0665744155e1aff0ad078dfe8fc34131f1be1dcd448f46dc7dfebd48e388585f273e1c207777bd43004657561783bd7547ee281cba9adc0f1e99ab9cdc6711344e13bd27abf75121dcee52c43539ddf793a0d7fec972664b7ba22f1c614e4798ef90fa0dc6b1287a532d551a9be535a2904b79d7b4a7e0e7e30d97fab6d4ab464e78ab42bdd014e5ac7293cce44dc757380559082c89fb0ddb0328b779dfa65d108c18778e71a18e3ce08e05329987dae9278fea16e211a0d2a0f54fa6ddbac8a698ee5fae7eededd5111496f8d61278f60c1d2463e7c7c1b9e7dbf6792f6f0b6a45530ab9638d7c902cbd4d51b0f8851b9df203a85560c10567c37691cc639723284731a3f068d081636384b5e1c45fdbdf80b8b19afa58350f531cb1f6cd819f072f2722538b9955fa1092a5d532c74c3232794348cf37b97dd5606cd82737d9ead04061e75b0b1529c11f002c359fcf80654b95ad924ac4f432765ace4d7c5473c8ea935f590d69ebe1d1dd5047cc71b2b4a321ef0bace5878ee1d5f16137835df7d12e4716985844bcd2c9438822f72f587e8d0abd31fc36c5d623ea2672b69871ae055d6222a289d8a62ce17c26d104857fa7f2a75610ceb2797e828efd8844b5040d299c51be1a27b2a641361614d8cab019f36764af8b7fb4d71e403001ec196ae701adc2309def3315311f6d22b4a18da986a4b2e9e3b93994de1ed3b5c140daaf577afcfd1c849cb135735132861615f03023e5975b06f0977220c22e3620346d2fba7f21289b07b099ad022b9abda59761c7497a52770fb1c222c2f13d2be3f8448e23a42aca1f162af38234adede3e65bc76b6fbd3e1985c9dc897c65a2b060efa60d636c03bafead6bfca083d39c4754f1ceb1c2d16537ab60021f5f816318fe4c22bf8dcf6cf1a50c7a04ab7744ca73932ede10dab69286e307ae848038ff3054ac40362f8b9d855ec42d12809420b3528fdc454ee8ce1294d23cc1a8f1c6729867afad5be04e8818b686545bc7c7d257c8cd50a06d7e256312150fbeb05a8115259c5953fb14d08a8174a64c451f368228d8272ee473ebbbafa2025f47eded22d7ebb5da3924453d8c8165b78335fab2765f2c57bbb116318d9f19274b5f72aa2b917a89dedfd8cc09497e221c87ae32dd47d8e2204c8cf87bdc4d68d235a6e9ead31ebe2d8add2a26de785ca1307bd357f3e154cdf82e932da7654c98bf72c1f7c93a4561ca0a9250f6113d376ecba754e2966a84f498ecd907f4e80d2e346508e2aa53adbb1d4fdb3b94492bf1d5c2bc8b097d9a06ad93ceb863d3100771e99789946fd486b4d03c1b33befb51248e650cae9eb8a3d55ccc5e54134f85363d64630bdd5edf3a51d76ab69ddf2e4d02c79f00dfb74d75db3fd6880cc1342eb55d487b5e1319f50e58b5041532fd3208ce33bfb3f3d2166b949bbcf401e51543fc590b93e8adaaa9dbc54f0e062cfbf789653d085a22f266f64e613658c0f1e2c9af8259bbaa3f7315d883f321f461f5b383d7096f548537fecc1b679c8c19cd26bacbc796c6d94adcb38583dc0b3e7377da35fc3a729232f38045c71f2ace6e1e0e25c59e326db9e0646aff488177965612f6ab317ac6bbc60a31a80ae5e1588e49538650069f56b210ee37bbc101570fa17566b778a775946eb05f3d307e97513ee6b33bb35d7879f4eafc155c713b644f6a128cb94f49cc6b2bf9114706f06184012e6117c16635c735814a0ab0788dd049f9162c53e31fef4a1bff972a0e2ef725497b42e9fb3fb5990c395a02b6761151698cf23d218d6b5a08957d3cce6fc9fe3df9b7767e09e36267aaa079a2f6b4932ddb95f51dc5eb6b896c925a7c93bb45789550202ca64c686a8f69ee1f5980668a24a9f7290fd0a8fbd65fd1be19206d567e8eb239a12ca6a3c62cadcecf1ee259c7d39873db5283f12207b0af4f37351c0d3eabc2f1683f50839a02f2a80cdc4e7e5e7c2f01fdf834339244683b42a7ae2a419a4accfc081ac86079684f3244d6b4c37ab81df1774bebef6534f178b698d64c250430a235b4431aa0608602e1d64c613abeb23c63315912977995785381fdc8ae892e279de4462511e77309ebc52f8ab2e762a6153bce44ed5369d8f502d37a6076fc68b157a3134c403bb8fe7ddc52043dede651c388b3d9418625ec6a64fa50efee10f159d63ff2ca91f36d60e55baabc80a24195f71e2f4f1922b2fe0daa16c56500c941c5fe62598ff65d5009d376855d543064a64db3ee8ec17bfd5da22bdc8c1ce2de328eb9f3e16070c336ca3299c08abb69082bff6620067a22eedabe51a8c5ddfba54a2fc4ba51594614b3b52cc3d23855d0b218ed3bfeb5976cd19f2ce9fa657fd9a48ac4465a2b447543cd97e067859bbb28387574e17a9ea245fb77c0693ba8af52c1da886267eb0640847872bbc00dd196d37518c17e47549f8b551786065560c78de1544726af27a5a9cd5a4b3b909bbb55c7564f368d6d97216c82af37cde4af4e6c612739b46482b35e5e9eb109d257946ff0d68653918219a330ad06f4374ec8725ff97a649b19b8d0a2d9fbd85540dd622221b90af5450849b46d2ce5062e9b491645e45c19d769afb454b259511637a486b89e622bb0770db1c67243e4830983c67f16dc8c1dc8fa6d1a8f7bbc31850534ec0813513f1aa662629fade52e786cce0932986193ec64ea2d788eb3c0bafc131177bbe4c56c96ec6d82667043455ffa08efb298a17bdf7aabbbf065d77dd968853ad9b8932c845d48e3d46a929324a70073e366ecefeb339bed9aa1e499c3b00ef2a9afe40819e06de0f285302e84da4a6ec2a03ba0a61e1ab5686468fd75f1bc6d728f09b465a993bdef423a100e549941bf21934bde894c49b17bcc5dd4f032925064824c9ea3fc62f379c1fa235478319b4199eef49442ef2d01e28621dadb83a27e399dd9247dd39740a012763f78930afeb1e16ef54632e6cdb482fc14357ab308ceb74c87efcd5d0d7acf062adb6bf384c75b6c051912df35228df95fc20a39334f0f12e9af0f8177d526fe1055a6637e63d4128f52d32cad7994d403c7be0b5db1b8b9624d5c7b602fd533a48b20f21ec10a4cb01f49f6e97cdc529bb03e9051bd09e25a7609e24a9b0c41c55a601d93316b95695cdf077cfcf7deabb3488fa4b6f90a153225ca27da48c3c4ac57feebf12b20aa422bcdc65364e95ba0ada7e38d226639b0509ed1a5fdbb4deb2926d911e0522be9c5cdd8bab0c52c088290dbdd42cff6db768d6e170f9f6d85d2ed6d7e75b432230a0faf2b5580c5d6dae5c611eb6fc1ae63f33cadeb7c39d3a38232fdc5deb3aea627f4a2fcf1b79662074d4319bb284ad3257c02f373fc62c3b819a5ccca152a06079bb4de1e1ab97c35371d24727927204d7a61fe828c908803ff1402802e22cb5fc4433d9d512481fffdfc48a6809c54c48f39cbaaf6d9c0fc6ae4bf90fc90a33ebc2be131ffc755f2c547c124ce4fb7a524d30b825a05fb6aad6c07a33c809804df8276b14b317b6a8c915c666c5ded9aab6b4fea2efe8d52475c9cbf5d842650f269f2ac1777dff4c744ed79f0a35d871bc8fd090e1ff51676c5377dd537dbc000a0ff806d6848fa824d4f567f872cb6f39eaf9839f45b1434e6dc6035ed81740bc9ec0faa87f509b5f88d0f8945e002771a4ef39ca143a5b64fa7fbad60370dd5ac63b973638da661ecabdaf55ff98cb6d0e369bac9e8f38aed085a4b5210e6c3019d236786403fa6908d171ce7ce79d5846f6ed6a85c7567c6b172486658dd4729912772962e5cc163ff69297cb536bddf69715f12745eb391602baacc1d797b9950c3b664863ddc35d92aebeafe2c349e307b81553a0dc8481895e18eb549ba083bccae6a85630f39769ad8361746fd22d92625a6bdb3fa7e266c3cafa285e5d66a4ae9f820e69d1b283cf160249238b08fc132a1db683a3b012701fe615377d9a9d6fd5970f6c06e564e267f81bbde20547e048fc219272800fe206ae5fe6a7f90c32ce7febbf165593802c616d11bf0ad2fce3628dd3eaaf366dc83c5068721c2664a2bb66ce2ab14f2d107a78cf6d1eb3af9c90db2e081435779853f30763b2d8da9365d1f9dd8a2c758c17fabe937f134c500f10e4884045a9035621ba133edac81c7b2f232319de2222f46d2453873a3ef6337cb1dc65b3cae17b7d174587d92a5dae8cd0b6efe7c06100bb6d87de2ddd34803b516cc4e38c9d4bf90a4ffd574cd3e007de480fd3884cc39e862e52c887d87b8484df8b951428f16ba01400c5546a2d0919d9440f2c0bda412754618383ef89e3550864024662302b7eab49688f8233bdb54dad1339dfe1e17ee220072dc15ca4e40ee924b5c72ff8070f626f4ba815dfc1559cdad20b928577183451477b096312353f8bc55790e738b764d7d235567f371b3792e89d494a552733c403b4708a6e05fa3de83f309c3c6e565a44083cff4bd32635ce1223fdfd9b8b1b9752bc6f9d5fe40df23e276756da134a5109cb41d602ba9a1d360d74c9b0b8342fd2d7d684239cf50c5460640b10c2e7a4f25d9bb9c37a6d802a9160d1299c67ebdd79d2de030d0ad53efc14f65a93c31ce3a27e3c84ab5c8e498fc35317dfeb6e338769e845cb121598c80af4acd39a77f7446113f8429d80c04a88495d290582229852516d35c8542f93e0a5ffbbef1d06d48e89dfa74aefdec893eff8c0fc3e4db743cc27d84093ec82216eb52152fcc9a6360f23eaa861518f5d5ce25003aabe573ccf30362acb7fc936c39d9bb6518e349dd554ce464d5bbf4f97c994e14270f027a4c89287c1e28f62cd1f0571d8b0f0f93ba5361b6ebfbc316f0f07a99d87d41910625dc9199121614de2ad8b9e688b79c9a3d84ad9709287969290ff492ea9c47c5a55ed8cb9b01a9356076f9b207596d523ce170f0e1bd82f1136cd3053a50af358f472b18a17c370bdf3e0b3c6a0ad2e328b43eb336f8857d6f89b8f7afdd6efa60f405ad50758bde2ce9fa0ff7ee2f9407360c3ae4f6352bb124a70d38d676795432fae021d84cb31ecf26294374364e7bf771facc9376231a42f32f9a402f88f686c7c48dc3175e67b5aec7291c8877958ff22c04012953a747f2dcdd2d6c32c0c11b5740c9eb440b416ae611563d04efbd8b1d9625003c880d93485bab66afc32cb53b24154e0b2dc066683ad0cf9346a615f3f8476fed210e27116393e3f2b321bab40b1486074939d4b70ec11f7dca794f920de1d26fdde46199ec37e88fc15fd3c1b4204401ed04732761f23c2043cb90e876a1070f7eec67f1e44764653bffca1ecdfd288dfc86243fce2586c7481a6069b49e322dfb9cb83829020d6847795574cf01811309e555c61bad5273236b8d43e587a60a72963aa1f0c15cb0c5e18dfc2371e35aa25fe611246bbbcdcfff43a47ece3bd24b3bb63b87423356554308465556db97b6142051c1fb6deb238d291cf65805ed1427c846b6ea4d622c42e660e4be6cb4e730322b6530bc70e550446b034bd7741da7017496bdecbb382191f4309b2068591912af4667a91ae90e3c311e5a7a300de73409726ae73033946788258398922691cb445a392feba287941efe7a729985d728adfb6d17d8b6f994cd23991c3ee9bce5976728bf51266e691e99d92b6603ba66b13bd89090d76c71b8d5c97601966ea439a33029d25ecce1e6ec3dd878915db93c8c669a8f7e7243b8815b98229e83f2c4b9ddf2d09ac7c8d787bd6e6231900b59bc05059c5ad2a9eae5b3c8662b370826d1b4efc95885c661c904a3ac951154d14e9fb15a538d2683e78c1843adf0ce30909269f56f7d213b206d3922c796286c3fc0f56ebc4f293ed5684bfcd10e4e4b407f23fc5f6f2f65db3ac16d53e7bbfaf50949593102a337273c47c30ff55443d64c97093b4c6da07fb57d7807ce01a7ba4a9c60b37120a3891278f6b1273aea1c54de7327867f3dc8956a5ac09038a2a6306cb5bb0b7cd92647ecfcb665c84778444d50f90a66defa349c17a0bf2acc02eb0d0aa7e41c2948e9225764c086051b066ddedd228ccad0ca890bdc6aafaa1bbd5d0a2f98ff3e9ff1fed8b11fc117e00c727ff7992e7c3ae4c7fe69d4298cbbb19c8334b38fb900c05d208ee1297db4d6531263e273a9d0b3474ca1f5ad07fcdfb979439b2c4a591bdc8751b77aa5cdf2eb43d5a69b84be05b436fba0bbc2e4f2ebc3b703d3d843b7dab48d341ff5d657b921166e4f22eb5878e49a32f27eed069f7f6973a1753751cf4d7eae8f63c9ae8f56d98b990b987e9d72301be5a463dae7a8b6ed3f9c0a77ea62ff77a9192a703770a0f37148b0c97095e72fbcb8ce5d52cdfb9a0ab126d7c745125df673966994e69577875fd96bf780fe3cf84dabdbc6c25d468f25c1901bf228b919ded4b798c3c9acb21c45e7197929d5a92e6b802496ec6ecdd7ac0ea4c3388e08398997f444ba69a50a033642ec53a1dcc278195d0ac0a5a3eb2e0d6f2a9702bad167b185f610243972953ecf3c4056e180687d27d820ef5b42249df6d4d460730db97095140630c72f168d2f2041a18bdb0cba1ea35a6a51060d32b8e7155c1dd94052914ccc1d731a7f85acb32a75282405eef1c16a6a4c52dd28663664282d6c5ef2dacc0d75d6472b21253ff5dc8c7c518a266ad596f30216817fd3a034e6efbcdcf3b8cee514e7dfe2b57f930dfe92e4a3bb2c105b5f259a57f023adeaee33d5ad3561d06c16a7644d6f0e94e3967dd9f030a42434c213da1cfd5cbf3ee8d33c4f8097d6726b6b4f2822a47d933b1b3efd633d69fc17e6630232cbcd7d119bf0b449d3d17506fc80461b49b04d1ecdc8b4034d4177d99aa9244bf47ac6df607c7bc959f0a415ef35e5d549b33006c6146b1396c24e463e4ccac26cef527acae1fad8dec82918f3569c3a8b52c8cab8f6a0d42fcf941c61c748aadd301ef3901d9c1d2888e5ad7cf3d8b80a7357cb42b194ccff672d9e65215513ac8bdff09236a2fde4949b4a631c5f8daf8c1c92869550fa203e162ac8fe98650d07e756109aa9eb044418464d3cc89b33181a76b0b27d0bd4c6cc3d57e61dd43a24161a82d03b9d9739415915f5bcea2bdea3d73201d18404a4d0fb0adcad09385d9f96e36763767dd7412d917e9597fe18d35c8c3256c186e317f143bac4e4064352af37601d276bdf095366a59ae63a09136d7c0b79b3802edab06e62152cfa06a27dcdf58ef3db126d25d0179ee004cb6ca59c935f44c8ea2a34c00882afa063c2703c9b95a4d18de9b6713d6fc1f571de0b9bcb9fc19eef9958af9239e4a7ff3c8f93f796e46cb4e96bc7697a199d9ea8add8320b32bc5fc4f0aa481bf257f143422a19ac1203ccf00ce48c80dd33f34c578ebeb53264fda0efe4a6e265273212202533acc829f7329b53f04db11cef90c857f0352715ef582eb68a40a8700c687460f0e9e72e1e67a49714bbcd91baf4beeac6b70b1056d7f8302fca2dc19960ab607683aa813fe18aabdff4ff2ae890a7ff34101c2eab0c4027b1014986fa16e8861529bce5c7c2962506c0631c3c6fe00666c9ac830d340b1c96244ac90cc415d2c4d5f31a083573eb12799c492d369b9d6190c0fc672ba2301a950f755602f63d0bf040327a1d3f456586eab171941b1c83a05940a560480c94159f9defbcf15a923d6c8098e23dd84ec416c3fda53ec45326bf51c3ce983325dd799458239e87d17f3139d69d0ab06b9d21dd26b053fd9178bddd55d92e8ba2446196a15c8f0929721d04a5603c76a5d9aafe02acf47dc06ea8193c285a4b2137f68661f5c19c3532fb114c52cfac0a64674284f1eae70efb26994de3eacd66667469b3e1a997e8551b75e567d722b3a8e6e4efe6411aae99157cf10cc43e6d9d065a04942500dfe0d71547c8d3feb92debda6c6e170a9d53cd2eed8ad8512775a189c3d2ab03fa402e979eda342198fbd05ec230e8de7b56540cabb5c67223f1e6d385022338e1b5e9aead750cdaa7beef072fd5b4d9ecd973308a1beb3c18dab6ed913e1d10b70657894c9a7b24f2f35ade8bd67667d1ca051d433927621986bc75ac54cea343158ccffaeb0b0e6f577046b2e7d25806cb32b62f42998b931aef54a73ffe6393b7ac7fb46e082421b9f8f7f90acb82e7859ad6411bbf23e383f2c959fedd13f5c18a79243dd322eed0935f641f2c54fa3fc7fa7ec691b21689df2d70ec297290b6fedc24bdffd8fb2ed6999f0e8993d564059b028d66115d0420abd5cb8b524738d1a543caa3a6b7dd46e6b2f66beeebd21d47362b5793ccc17bca3647426bf9a73fa5bac61cee08dc8726172405417787762bb3831f7a4f29b77a468c340f77a4fffdccbcbf6a7b2da7ae8e1fc4f9037ae31b6f0bc8c8edf2067ce51c99931cbf57866279d48ed54c9b7c9fcbc116b9ad40974ef9b1af44c3b2452db8a121d77586ef009147767f35b1567432164bf70ec7ef2ac9670c2f8cafbff529c9e321986357f569eebef45fa2982dfe0c2752641e02d24f7551cd47324ece6c1693a214dd9192b67aed49499ed8465ce0f2caaf4b53aec9ce6a1b51861eaa53c9e74ab5ce9369f61bf0be555f4d1a9ca7c752d367fe6a75e004849b81770954ad0dd5d397e8330bfdd3c6dc16e558e8dbfffdaea918fdaadc44fc37e2386551e7c098ab200b6d0be871ca9f1cde1145bf92d2392b997dbf97252482e09a4f65591a7e2ab4377a300356b781d9b2bd30fc43c809a275c0af298e80a1f1752a1fd504091c148f09629381126118e5d9c6a55a29af6eca43ac18362bd33b337eec35b1d57afeb75122d3a9b4e9462f5a768c445199180b9d53daf8b8b35adc59688ee37b88247719e74b199beff7c02ead7dec398cde4c47a6743cc4fc7445bae06b0872fc8418b10a9d30327d9804e6f8e4f10237172ca01e1c3ccf9239e04b6e836a25a7a714f67cd51191978d21d75ed58a1969ef784908b1cad1c4b3d1fdfc949c56bfc9d629f7162356ba17ee04548fae71a08b1534df362f80caac5706d888534c264e619e60ffc0823cca7e6374429e895b7e690503548754743047df6ac7b62f57b62501508287be91aaa4c98c14441ba92ee86eb23be24870055ba5a93c4c23a52de0d8c95d32a90532500b12b6e50ac1f3f75680d052ff881a9c4ddf6ba653e0cff8dc1f7c3eeaef31aceaa334e36d888dddee387eb0ec4d7c10fdcdf84834df8bc9e5e5c4c251d4fe5901f3f2c3eeb19d904be5443fe562ec19b43196e743ff9906a10bb91c2d183fedcc5a78bd9f27964dc769e66cf75aae36b69419e8badb80efdba42a6e436b53d61c5a3fd8371055baa9ce6b40b60aa4419fe6ccff3a4a49a3c2a36143543a1955af8ccad71bee343aa459f643b53c276cf1eec6e4514fb6ddbcc15d88c6e99eae7fd357dacd064e61394461e20570aee162b5dd8504d6aafef7a3f1a693bf6f0988a9102300c0fcee1ca537af6ccf4b4fcf12c4cdc1d577519d23a31cfbd2e42cf7f325adaae29a4e2a0c81b0ba35155749206e1e6ac8cd9c9b5ab96b1f1fd0e9c6e832a048d2b4d50731d957dab6cff0aec132b51a7e498c55f1f67dbefbc369578d0b517b7aed9fb6dc31a8ab17380d52eebbe9eaf4a91fa14c40e3d7b43e0ff597df4d0b8200dcc469d4faded2f33ed359079b6f25ac06a731d2796186a321a3ede89435b71805adaa5298b716f9de5e5d9b532f61b68140c07591af1a4dcbffcdfe9ef45ab25af2b8dfe934119cfa077620ed105b9f3ce005e1a26ce342c3b313f59e5762ee54447221ec3d1ec9383ce748934c34318aad6e556ebec85316e30884f24f92af32193e50f3902b2c124db99004f4fed59dfc52e82a63219fc8022b988532feb2f70a09a8a6062d5ce9910c0b01efb858589730c958d4aa8832b4405b6fa4e8dd059efacb3ed0abe625d793b7969fa5ba906c08c2e0b3eb07ffcb866d7ad31e616d6ee54b948053f08c8535aa831f2b12715c750ae27455558a80d355f71013dbd618e820640372c67175c8a261127825ae9a268937da804836217668f2659b3fff476a3ed9cb115e27d32eb7ecde51e83e569bfdf114367166cd350250b12eb3cf7578c1443954300cfc64f908a1a691c51ea5100110b680734ebdcfe9c970f8679a2ce6553cd5fab280f0be79a6d27b37d43c7b56ebc4a57325a6f76d71ec3c209b731952468ae2c3f9f1624964b1bbb5307b8c4eeceb2a2dc0d2f635aec935a6cb57ac5d289b8bbd445b50e488aee4d04195bd0c69c890ecb7de48cb8c54340f89acbd8b207d63a2b8fbbb36bdd16b09f645c006b31a354279ef2cbc45b5f0972a1506e7fcfe3ed4f21cf7a7a5ad1899456d9c4ad6299786a978e2ff64b628f873cbfbf1bccf8317d7b03ff2ea40d06ecdbfb8aa3f973692d73688bb7e0253ecc2ac79b3cd6d3457e4057948e4c99f5922e584ce80c6de3048ab34135637801cf1837f5d42de5d019ab05d1c6fb860fe801c57a3df980ebcbf78986bac54f4ad5de1f9d0afee6606cdef1058ac060d8cf8e50801117d60ea10d969a907dc1d8cf6eef04a0273029bc5d4304b814e370896f7d586a0b89a36e88e578261a03ea1216c213c2bfe120abac6ec9dbd7cc1c86658477ca22a3e737fdb0597901ff6969749054c76c0d0e898323706b7b47eb66dcab5c126fe1e1ba2b8d1f0fdfe4c6f20276f342864fe50778919f0ca3ba6c80086663fedd09aa33155b4cdf895b58712f293b7f9fa442140ee45651cba81bc8833f0721363bfa7b4b99fe16a680bfaed596a91629be21045d80851f8e2b9d9b3c5d95d9ad2e6f0c894205f9a12389a7e653b42b49fefc910c6a1f1cb9d6bb4e2c56ddb6079472ae1aa563ce2cfe7f3e1fb4bed3cc7e93950030986f18ce859269c6dbedf008a18c80b87137eda657ede48088d75fbb33390eae4aad256e3e77b7eb6e503e28cffd69d9b0e8f181e9570ef925300a8f79fb6c9983245c69831cdc73e2efc7389b5e80957e7120352e4302146069ff2deb3b7d32ba2c4516eee07da95051604bfa95be3549ef64fc7946f295d6f5a7c362c4344bf1502ab54b57366120018eab9d6ba57911381572855362d8157ac85efd79616fcf8125b9f9084e9ea8ca01a8496ef1fdde098e4f75513cb19ef4fff6502d3b6a2b782551c8848cc53c8bdcb8ebccdf6456279adc6fcf64d2708ef132aa2f24a79035ee3bffde132729db753505b2449c3bd6b2c8491a293fec0a352da20d1be9fa258dc03c41941c86df6bc27c13700667cbd49cf5091c8c1b44b69cadbad134a520b2c6d42f7482db3c630a1026fa3aacd20c34389716b5703ac9124ee6f0603b2e5c171d1362b9aa059e87983a97ac294a34452493548dd0bdacc8cb9a7d9cef7c3c7b0128c3eac4ccb16fff9e511672dbfd278159b4da08fa8778e9f1fb3b6f4ae1e4be3c3deaf22babe8ad1bf8ad2ffa0c10f1e197724669951d6f4bb0f9693450fa556e0546917b7c46c2883adefa5863938e338c069ad81848317610c56c609032ff3eadd8832e9989a641f0d3e4397dadfd7f75e5f45c6d5c8e288f33fdc06d1de13f7ee15ba9a8764ea85c1c619349f9e330c77e62e2288754ba317cd62950e4bec35f8d68b206be92a5ebb963a06b12cd00f6f813556c2853d2c0f6dd690ec7f8d0c5941c058467bffb8af37325d16dae6d58105714009c182953b6d9ab016f2677891f266077c35842fbaac43232d404bb1067965459dc8cf56ddcfc3bf8877eb9e8e3dc40a29232ba4d600aab467ec1f5e66fe61ac1916b680d5a71b0081d90e92c7076645c9c6b64af23f6b51119177e7ca83a0f73f37804bf74d982239684107d79a0e55571a5e9d3e4278893eb45cdaa2174302c05c81684ad7498533398f37d06487b0db001d214aab78c3f0e145f46a74717973017bb078ce5555bbac045f9109a3833c1f2891bf1a4c13b5c1494f1f657059bc5d2d8e5c9419d771d825b832d000fcc1575a1f37cb726511a91dfab48d50d095a2fc880c8308f5d361be31e1daa5816c07c6c866bd90573cfb82df2275b8beb7dcea70493c458127fa5a91577c0b61e831e7417c5c891159bb6190681a8223ca914d5bcdf8f9dde0181ea20662800caec778e7ebc3088b69e63b59fba5455005259db3c9e7f713b5dfffe92c89b19f43534a4efa4edf007175ab85f6a392c13106b0d1f0a999ac2515722d625ceb8f8c7182e701db17efc6c9b6f9288bdb42961eb7c7b2ee1c3dac1b1d895ecdbdebcff2ea8917d05e5bd3d818e2cef004742ca92e544ef44646721fe31a040cf03c63e540568c86e2af53e0370e85735806ac48873b9ea327d79d36986ee0712fb6afd64925cc41847b0b97746b044d9a63e28884390952ee0af9bbc8b29c6ac74cf071c845823e638c4ca9cc9cc70a77babc39ff4d847b6e4c78bf8e2cca1ed20b5eccb9d75a723e2c25caedc3e1472ae6f94249f1fa6b4480758d7bb41d95b8ae550d25c2ef1018d291089719699f97670e4d907c9d349d7e3c9ad0fcf1ed24ef020e30479d5b98dc8f4bf907dfdcc458f17a34ec6daf889566e1f244275328e0bdcaddee98f8e63967696c23f408a453d3d438c7abcc6177c68c51f7ff4b542255fd368220cf443ee55d083b316a25fcd7cda5d37d47556d4d86876636e4ee9cfcdab7e6817b9f7d43e25a74ca9bb5d681b001da3529545f4d4531a09d9896d455a635b3aeba53624805944e0ff77fb6cacfdb5162aaf555a1e13e1fbefeadd4c2e131e494c4a1dd4faf0b1650e95165bf27a6dd45d373148439801a0c43cb62c6c110f36d715dde49efc81c48403a841b746bbc7ed9facd196153d244c00e67dbb503687e10a90451e1e52cc67c912f3f4a82c3c8984b4c201ecfb6b997da764085713f5c736d9484e45c2bbb9ac1fda3df20dce0f568b33384143e5d3a5494623a9c5dff512346ab7159fdf016ec996d5b9e31742c1c940f86997ad80ce64f4ad307354ff72ad2580663cc77164edddf032f54bfc29e9a730a0840a0da49655b9850c019cc9a8e6b0c74ef473864607f941717b7437cb9747514fa03e8ee9b4015c79c137dadad1abded259c81f08094446f6ccb76986e7619cf9f016d8433d71dc99d48e12573f0ee3c115913547c3c25b560cbc00474e9c4561b22ff2cc6d21d5424ceab3b13f56c088b0b2b67d53e4c7b459a75222f4c8559c49cf16586d3383d2444cd06be8a3e373fe3748c1cfc7e11a1e037f745cda4c9cbd39","title":"464. 我能赢么","link":"https://leetcode-cn.com/problems/can-i-win/","question_id":464,"issue_number":63},"61":{"day":61,"pres":null,"tags":["动态规划","DFS"],"whys":null,"difficulty":"- 中等","description":"给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。\n\n```\n给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。\n\n注意:\n\n每个数组中的元素不会超过 100\n数组的大小不会超过 200\n示例 1:\n\n输入: [1, 5, 11, 5]\n\n输出: true\n\n解释: 数组可以分割成 [1, 5, 5] 和 [11].\n \n\n示例 2:\n\n输入: [1, 2, 3, 5]\n\n输出: false\n\n解释: 数组不能分割成两个元素和相等的子集.\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347186258a04f82d930a676b276a35031e3cfda9522af59c9092e660af7dffba08f46803c2903e14deb929b72dbea4fe2efd717a7794d6cdf604308db5888f497623ed7288d9a41d8b35b568ddf2a1bf884d6fdc1c6cfaf1446a7247fa4f14415d9751b4cfbcbe22aa14b6fccbfb0af6259ab644407f0e337812e055fc14f064c675146db11364043386f44217f5eaa41a12102e4a04dd61c2e6c7ebfb88781f4b1744645bbf58152ff13f8d3c76974e1b2f3ddf3baca07ee0405ae8ad8e5e2e70a33d20d9deebcfbb4229a3a687bdb4091ba2f32197dc79e195044aafb14c6b92137634e5f3a573024679826a590741c1d50ef197ebd27dca3673177ed93c275f97a2926fb132fc378d9c9b26eeed6ff82c2eaefa4ac08ee8449d7f1413f6247994c82e159ec655cf9e76e9f07c894fa813629597162c507e95ae46ecc4fb6187f3c9d0e193ed8e61d176ced7681017d5f7a3e815ffa21984513e3c3b102892fc7db8f173ea744c573cd656bb682031622598500e773187c3150cee2d43ff0909bb3222da98aa56bb9c7d04f6675a5264f1913a1d596de614838c2478c1d5b407d7ef8dcdeb30dc4b213c6ab75a6daeb89811a1edee3f926c439a3f654f665e2309fc55a88fc0c3deba34c4e328154dd340d7532a0198d7338a96cc612f0d2a85bab39b10bcc6048bfe2de96ddfc464f2c65e186469a669c93a68f490e6c5947a0a1c2d7f9f7165b12a0185bbb5bfe7fe24eddebae88edaa0580b5a89fde28e7d42513701368337a948b6aaaaa8a87c08254032b485ffcbfa796c2d772fc544206e8b11ce2c49af4353629afc16c15e0c9eef10c41d684c3ebab19b61c1fbe3991600756d1776780db9b816a1f0d69a181c3b438293ae114761b595c9625ec0e9d86913f07007d766f411a1a47d97ba934c8c3f16bd7f5f68daa75f5db7d1e9b15e92a27ef694ddc810cd6687700adda1cd897f5b076dfb0c9c8510ee71cc08f08c6148551b4ac1ce4854d5ea4749ac0706fa2ee5f85435f6946a0fb8eec34192795e20c7ae3f4b5c1efe6c9db6d433d0727577a7bb5c9a3dd504b0f370d67810f18388ab569b632fcfac8ca87911b300779124744123e76dfb068952a225fff3ab041b4cc2bab044135ed316734a3267cca66a512abd91dc79482cf3ccee5ddc394f295150e5a831ad2b368004b203deabf3ed8cbae8b311ed49d4d0c3a741dbd4aff3146ffc8108965db939eb2020e17ca48b23f80721a49c5de299935812638c88a289784743fef49dd4f08cd69689ef11afc55f51e2638d0f0dbba72d9996c64bed1c3786f481cda07cc43171dc53b25e17c448f28e614c10fba8ae989ea7e19185672aa9a5c4d69376fa0f2ebc70b1bd90b9fd4afcfad5cb6f72f18d27c3a66df388d86c0c4fe4836f61e5da1136b5e5deaf4323d2f242cd649c1bad31da3278550ce4056885df07a41ce7eb4b520bce075dba181087b43e35facc7e5b6957a287f29afcff9c5b950b6b0464f7eb23dd421472a6c75191136d90ffde0b8936505f7bef46795c863611622a43bbd2b3c8f0038d9c207b1b3ae5887ee1277ec0427b7aa10158e8626929589b86bb7363f98ae1531cc195dcc553a58682797e1fe24dd7278dadb3a90a649b761bb4670341675231568fdb778cb3b33f11092fa5e766fb8a607656062c135e68f0051687b2151003b9392d4a4b88ba13c14f1df25bfab40498680e07628675ff0ef5ad83781b90113283c048a5c6ab361baf74ba20a4d096ef705767b8643a6bac71fcb7853a7ae7dd580af6f670ef83ab7e56e47978611a63c0bdeba27c235220285c102865a67b668e30f81f156f3faa82e8005e53024898cbfe4b4b71cb9b098eee5fce7a2164fbfaf3fdd5affb7dc2ade632853efd15f84df12b13aa90e4c8b6f71a53af21b2c5c65eda9fba03d3d8073da240c048629c6b5c8042b6cbff681e965c2dc3c287a0e952e72be23df3579ee08ef9b889fed6ca0f49b1f915c87ee75cb85f7e003f3eeb4d1376f8879aa37bd8d142e0dbb848e04acdb946d6a2fe4e0de912e294eb78edb7990357ef0ecb4be26b3e1ee8077cd691ea0f2e863a7959a4d6ecc9d62f132a49b0f61132aa07a5cd95830e3f69058b605287f1aecf27d59cbcbfd730142f8f30da2bb2506610df7b0d81e74514d3afbaee619a713419ae0630780204818fcf27f802a64302294b5af034534f3d1234530961a73adb9eb13cef53d331a682322c7b163563c27861369ea902073e82436104c5b41cf0847cba8fe0f529ec69bdfd36ddb279a4ab44c19f5b2d33c6e397a5838f136a862572f9e47774cbfa29bc45a9adf0a7becc2dd6657d92765e177e64e410b3fce8b404cf2d31fd63e1220fcc1d2972f8a8af3dda2278541346fb2ae90041d8c1df28a002abc4ab5bc43935eec62de82c706d59ed0f8e6a489ef51155f01dba5818eb6988c9bd6019ff7d6ac0d6da857d3356e493706ce2ee99b7a4ac4472deb3d039a96ce95b55786cd88968c4189eb009308ecb3be246e0fd2b1c74cd497d36a7bf109463e1567a5a9791ca708eb89d84ccf3ba1d0cd0ab36589a4c484fe724ca08cb1c4da17f7cb82481da237d54276cad786a7028a2983df08c58682478fd7403b88547893ca6a80c3a9c9f9447e0d665ab68b3acc1beb2e9e28c0aa687cfb62b1ffe2a3c0a55401fa564175e3d4a36a9e26e0f140b67f678b0ddee6fc28079bdb8ef3e591dc0590db5ddcb717319aa11428582f25e6e84ddbe5caea20dbbc6ebafc7f2d0655bf3bd20e475261b2d5ababff595bec3cc16a4565edef25b457e51ba1aefeb193e33433f0a4096bcb0495eedf0ec732bd174a677dae03a83ff8afe10330f2911bc3264f036c84fc02be922be3aa6a7e4e4a85923177762fd4e980b10d8367d8b94acab51be5b6e905dffcea26aba07a2a9613e0b4b86a08d6226cbded22cec1e5d1238442ba7b2d7cdd8d8054d535562cdec1ee718f6c5724c536bb5e1103960173c6154045c48fd00ea43f439b30b22acd6cb3f06036f047a1d85436be6bb88a50451d341fac8039900a73aac6426c9e39cce4bd193664f14ac24050a6c3924db18c139855622c77aeb65f4224ed62e7dce07076b8ea2177b1a80e7b90a189b1e58056b4a97559c397441d7413645adcf2393ad9ad508b08423d9977f30575cb26ab0c19003947af02a673c27f9af689fd6a35d6985b77dd808bae6075435731748be20fe88d6fd73d1186595d68ac9c304e6c4de8499e2b3fece0721d5411f2eebb710a4133d06fd477ec6fbe0c3b62ce326905d6aa38449f355287534cd5c0a5265a4033144f061f774182a06284c42d414dec85cfdfa325b7d62acbf10df6fc2c1541f1c3f3f13b3de60b8cd258d28290d55dd6194c1489db9cbd13c49e3c2ccee1400a1810c019336c6ea9a0a5d70a7c75f1cde314fc8ac68d9c71f26d01bb346583e31da9273086a18b404b5cb6acfc2e67f08abeb5d98a0280ac5bd3e54732b0512a467baa885e660100a366e0a8ed97d1ccbb05ecedb896a38ca5506035132e6ab596785b40cbdd23dda874e6b1c41ee007baa616d361e9b2206f0c74283cfffc25863c366b62c2cc9d067a69ca197e1e1f1caead80da2f0e6f6b8deadd39a988e4efbe03f8e3f3642718d8dd09d5b53b673772aa1220321f3cf6686e9a226d59dd931021f91c17fee0c90b4273212d646014bf25fb416e8c17a98db2524bdeaec488bc106ae500bd79c304cf22d717f03bf76e971319475021188540f99b4e6c3a4daa481f008da52a0490f3a3bdc2eba76d83d5221330bcc8faf3705cbed406b6370a411935455fc3d6533ada5048d831622711a6c4e22a86cc3c5f374b585766ab49d353a01192c50734f817d9fde9f61828f0319095928254b7e58f0db8ed70aa894da92d80149ead920751031a07ad727afb30a47cb6a46de523aba8f7073202c1836b8676c8adec16550205b36290ef5053d8f1eddd494dd0566fc008176c144a875fc13121cbafa09bcc07eb8f93a4f5386712ac3b11fdb59094129e87d172c45fa0b2dad9ba4ec73c466971fb074446ab592f29f3352bea944de68cbcbeddcb88ff09f753f4a5c717948013e9bad65dec11f3e914abcfed332178e373cd4f74ab01724b557d5d222584d69004e27d6a9b241e6727fb708c917a12d61a07f12bfac0bdcfb666d7845d4fbd3a628604f5935c6702b0ac8574313050028a5bbd2edb801bf32d4a814ff3f0c9d687bb4cbc9af38db2b8cc024024f1249be494ae7f4fce6e75690831d0bbe290966bdbe95728274e77e891bb041bcac7c47974d64c895ac09e36ad1ab2d16542b5b5ed4b3459292efdba8b3998ebd452501cf1d8623e8858521d76310e3bbe1022bd87f5043ef4169764e146b3b753411b9e5a5e38b0b7cfe8b2af2012596c50ecc947d2fe0e0bc80c1dfa31332a6c8f03d42663a96fda57a61135acf64afa69165e30c29f74aeff46e6c3b249b79c5febe3ba1b619e7aecde4aeac5fbd74c82aea1695088e1589fedfacfbe5ba216b55aa4b6a4c03b76b7c5393e9cbee488342c37c2a6c04d3ce77141b4f28bc9ca530d8a3ed32ae148ab0a3563c57247ffa9d7014d400087fd204f6932f6a8f8cd4ee6bcda445d0fe1c98f26f6b83c94a48c13fbdac72ec05fdcdc3be803d127229c5e17b92b65132cf9703b507cc181d6c2a77afdaf34f73dde4914472e4788aedbfdf7fcd86749f7aca4eb22983a72cd00e74c4a671b5822d2ff4348e2b4db726f0eb096fd1b4f51a8d273ce441308ce1b599df01ce8011cc39d550ef0223ef3d78134e3ef5348ffb9fc105281f9dc3195316eacb66e8019488f084a3891b51c4b7a96729c198e18eba1b1cc1390eca047d49610f2178bc5542e404a79c467bb4ed93bed391c8a28c039bbf9589477ed29724e3cc0fbc2206025e13daea2f32b51643d7f7895c1f43cfb1ef42968967409feb5380e0b683dfe7fde1c0f17251f26146a1901ea4aeafb787c5db23a4631799eb3c7ed62d184670f466213d0fed5a954bb897c628baaf23abc4af1987603cc8f7cc861ed6d9f8dac7e7f1952ab689da67d80baae2832e1b285cce90eff99813b3888e065fc06633f6745fa2903ee4fbd383afb3ea9ba7c52d7819b2299e7caf9f778a086dcc4a7a72182764cab343031a6ad4cde954361576c7b61951da8b67d485fb2c55b45af56bc3a32953048b68cce6ae17b212478f0d9c3265fdac2a684e3930334b948ee760fd5e4a28699aa4dceea55838d32dafa7e7f5c1cf59297b5cf4e0a686cb16fa3ccc1f9e211289c7710e09e30bc0c5fbf8ea01d11054c13dc26be0239ea36c80f36d381ca90b7b37b777a6d97b2d1e9a484d8659d3c655bac62d1c4ec0be8b65e385980e7c1b0bc5de04928016e0ea40287fb558e160d026cfac476556d4a83656d737600f9d6282ddd4fb2bf3440a5532de63eac4f34dd1ddc41a0f1afebf1b6cc56abdf6b736175645482328e3feb8edb32cda299a4a2c791efa3257473d89a72cc568abc10e5e1a99b447db8cf442f8618d412d3c5e384e95ce27c5af87e5931e045c45f0bc5f33882810d6c66ca3aba4633bd513759da2a28ec03e9d9e6bb3d42a7cf6964d8419eb319651cededc2a510836043058d13ca1a83768b1615522f513263f6e9353b6929fd8b8af61a6fa1d8931f7d7006734bb81e48f614b1d2f76c054a7a0c844485a442a5f55f79e137c889e1eb3aba3586e2490010a62e6f26192a5dd1d5418a764de5cdc15bff71373c5f7a29f4168c6cf9196811c5ea39ffe8c27c7734656edba12d7e5e3a31efc4c1649ff864007367e4ac7be80db74f759d8b30def3c213e77c2e783cb70515d2018396f4590ab77c11d73c2431e996e366faf015b2855e1710dc0d499cf7b03491647661e2c1906cd8333e4a6a43e5b58cbab67f3470a4166dd96adb4c04ec30bc4f9b011c02c54339c5637107aa744c231c75247c50420cc0e84917d783616d88e64896dd76c37f56371a068da5687c242d000185b6470727b607be859b631e901e86e783c7cdd7c6cca4a0ac400858fe1220115f386ed8bcfe21ebd23edddaa07d1019224ad3f6f602dadedd9d4c374e3389c9d12914774bce277dd45c4f0f82f274e69b80e200fa43a4bbe57ed8e28f25303e12aea9e4f0303a3cbc9a0bd3022a5d020f92588d6c5617cdd8eb32a3546b9b189a722bfedb44959e97b4f4d4801f9743f84b656ba0d870cd203a367a53749a04a7f83f8e2edb1d7db5ca09e25daf9648650e8000be5b44ed30760638d18961bb35c0e70c6700de6686c1a2746424920f22e3e62fdc7a7ccdc30e00123fa4bda3b357670f3367f4b329110e1ee00562a2f0b09c7d8017656dd6b0422abea20e769c5315e1c00833b4b4b75faed555e663dffd1d6d520b9f77260fd5b879b1d70671b39bbd505b90a9aebc0274bcbd70a5ea02a03880297bed60b00e61487f483471c0ee974b6b9969729e4560805b0a3d0db5a835cfa52ec151b3509d6786904a6862887469e75a2af5b0940ebd3a7fd4543017a88ae94de6efdd2e583da004519e724e2062498335a113c662969a2b5228585ed1f2421e1835c027ec948abf0bf822b2fb270f15851c8a33ec63943045dcc3cd7e58e00375cd97e9d432cd64c30a87a5d4342338708818ac3163d07354771da7a7139f5441849c93a67c254ca49de0bd3b762a425ae1e329064a23507f722f45cfe653e2c76531f870b8fb65e1327d6fb5c9f4169d42f00d842db435e90d8e72b866ea789265a47e9550dc84d0fd5436c791f1c6ab365d742f418cda263c69c2375d3d58c32120779196ce905411f706fa60d61c7e0d6cd3879b628690eb978632b7366d9f4b650037d1ad734d24cdd8df0d59780ee81fbf6e186537819c5a17258d4ed66c3254bf44a33ae1e2f590b9a3b2a88b14487ce6f2a2ce0f175a7812a97b361d5d122efab07d3fa0b052943271a99dac40d49706c2d44ac644325937200b45bdd88babb2312d36e65de3e1ad53243f1b7b4c1b9643c8b5c47671f5ab7766ad7b642559fb75383a97bd405a35e48a4feb376087c5b758e3900575c098c8349ea8d2a11f35e7ad940de657fbf74f97fe506add5a3462723936f5c1e6946275d8f160f0311b63962b59d13cff9adfea028600ad598c47f4a44f48ce6984d57cc8985ef05a004083701d68fa8b494032acd53a5e241ae53a30c7deb15679d1ed0001b036f6785c42825b924aee49bb8df4d8e9779bd831660eeeec8272e5bc68329b88af5c7a836f32e4302ebbfdcf4cbe69c9674d7bbc084161a82968ade51236476418856ecd64cab8aeb7a57182cb5f4e810758100a25d34a85ca9733178f5d0f0924da63c9a47f5bbc52a8f4cf4c7f1090ec3e67db0a7abcf2ff76061fa2251d66ab1c7e9e85a6eb1fa6b09e9e3e9f301656f396b49261ea1feb225b7b2e43a026e72e4174d83cd1b7a107023446173066ed031d50a9ba707279d0964d61d54af11d821b26c718913f929a27cb2812ebff9bb9684a9c78d494b7cc1f69b4f4983c5ff3e7ccc88a90fa79bd56b49c56ce740c206c9584ff017d322625ea303dfe1e51452c266e47f76c1c30a54fc4f2e2728777eae370109b9ecb025ed816e8cc72049328d21e3434ba483d6b7297e58b0eec5cfeaed1e24d7687173b3cfe16df2b4e3a783da005fc2facf6aed1c788bf8afb71b945de7c6af928040b73c84f32852e0181e564bc8d0a5a9ffb0f84ffd1b01e30186b39f142866c1b1dc7b7741b69e4e1c49709b84a90e1a3cc026a407c66d4814ebbacc41b1fa3c645a4580b8bef0405a03a030f72766b8aa2f236036c8f8795e2a78d7ff03b0f5e537f9e014e0fda25a676803dcfc02d5e0d3798d025428f5fc1b1de49a8af0d93b17893590d01bd05d10d536e4fb53c776aab6b1be29250da931aa04123aa0b736aecfaee32dd5c62b782881996c433532546a2fe396ad8e2f185c484cda9b34c51f83ce16f4a8ff12b9d802873ae760f596e93fa880e3acde10aa1ae95a24d41093080e07d036ce472f3281a4a5db19cd247d55986d344b9f0fb0631227818782597512052f7da27b25425d270c8be26dd46340e4f4239fcbc04d76d7dc348b417f67c901d4416ad77966bc6147ce580002075ce4a60c5aea344cb01546f02a6d3b250e4c851af3fb39c25222c72e711d2fe445b4bfc9da9ad162b04f51b93d4caa1c6e03fbd8f3968f4108487d5e49cfd03389562718169f6f5d29d84d280e6699d9d3186841b8ce7c570b6e7bff60f8099d3f7ae5c1f46a958fea27ce5650a06252cd0ef8bd79bea038903ae71ceec6e38f509bde7af53401bafd4d024e9057ada6703cc7898c289c23f6a8096a2ccd8c15909739ab4307fd943b6f19b593eaf54b33d8a7c1a6bc15e786ec599683c7e519c23d971ffa6d9f36984faf39d75bc9ef9428c0d7026bb0b4e9fd697e2e99f226022384f924a2b678ad82b2339cc6e4245fdffa06573f6813181c40b47f834e876e3b4cc6250c52dcdd96697a97874926986475fb3aa88447430a2187279c8ed19d63063c6526f01df055cb99caa246206592afe4493246fcce597eb041deaf290dd6455a56425cc917ef14756fdd50b2ffec900f5f10034a1f7c032ac4a262a5e6b5bd59d77021f1367bc81b260786aab194fa9a67aa90369202a0b212e3011a9b3ea1b6925bb7c7755c6b0fe1087d4b31f84de3e466a7b8e02cb09e0614b67994caeafab501ee510b54de338f2bd17e04cf1fbb6f0cf70e9c68801497e3a864fae3a42ef62ea67d6ee3f262a28367291e9fd39ea687d11ecc19a402751a72c17e8c201dc5c7de97a06063894bfa8330565f78242f40b31912aa16fecd935dd79d7bbcd8d2c27d11dd2541ee1b809aa77772d75a9171b38a09cc08269617ce4c479d4ad2b68dd76e62afe31dcc991a615e8bafc993e299bcdca4e7a1dbdf0b4de4bfda7980443ff054020aa4b711b3bc6d908812ffc37bfa9edc7d1cb7c91633e61892dd1ad2c100c317e0d46f9e00effbc56ff139b1a27d1768ab9b41811239937fd4cb5ac7cbc0301c7bf59ea0f84abbe903ac7118b6e7148826943a5c55c2daf6ea1b367e6807e6e60c0ee5c151c07bebd168f27b5810125e00ff55917dc1f2ed21191b5db19dd956fc7ac2dff1bdcd38c2c0e87aa8bd4a7766d47e5128266f2a7e93013da789c3e8ee83fde9d4ecd08632451fa574c37cf231441693e629694394c4533a0d36aa972e37e2f722f4c606ed79d5d30fa0dc390596a435c91fddaa47535041acb77b4a230e3b7c8a3aab3660b464e78ae77ec0481011d1387f9c0e91283eef5dded6c8b5b0ddf37dc524c9fa2181088ec24de01a17baa60ffe4f21ba19fbdf2bf7af23604a0622c3fc5ab676074fc5384d13136a377bd8dfaae531b2e3598b4b0aafb3ebc48d56837ac53f2267796ac0d92b7add1924ca4f1837d59f2c970554c9b0277c4a5f047c3f2559926b7e66cc21442444854b4162245f500443e2bde244d65db4b5c371be788b6e6cdb1af0b51cb498d1652be177ceabd40775214383b352ae5ef37b94de13495922c6f94c762e65d8d41966f3389d40b206902a33e59e3fbe10a830f88a81f0633170ce8aa44f47ae55544f7035d7b019d5a654afe982a18e253e68d7d444d4bbf4adf5fa1eade862a9840b1fdc428810f519f19e492e2e650316fc3cd284d3fc02ed9e8c7ca160f93b988ee03728a56c8e4ed88d878503f6e2a0eedd4cff3f78ff75404097abf222497bf90c67a3ccadd6a8df985e17d118f8d6a6656511ff9f35b9baa0047c41cee8219dff2b2c81fd11a5972260de624a84f9835bc6590aa32765959d81ec4b65924b04313bc036e3d0a9b2edcb9ce2ddd3b7bcc35f9d9d9ad9d8a467cd036dc7f9b9d1109d8b753aabd3369aa8d5587718609a88197fed3f2d1b2c1bf4b63e8d73e33d5aad9ae36c8c10276de732a234db52d87d31415da95555434fafe686cd16a56d8f63da492f73081ea88ba2198bced60ba4abe8c9c670bcfa42328599445e32af3a3db3c85f09c7268276e19a6c80d73724479022a4a6f42afb226c839f62459760619ef9c11aa564af403e3373044eafdf1e53472997c223cc1a873a6fbd69b83cb3a74474621db59fd269a9bb5a49e095026cbae8126c201191e263f52a2835ccc263900954bd5e0664a223cf1a498af326f8395fb7deaa0643a944463d734df2399ad41e60be46aadfa5f3ca5d826be7e07a8d17a790533475b6f1fc52e7fd96486360006f94110b8a7efed77ff321fc7edec3a3c0d323693b29b59ef67a2eb4b3b0f7c4bdab1782bc141e15b9365f349eb61d1509fe60dce00e0261e887980747b7a200160f61f4ee3bbf3a44fda6cce0499e8d4a1554a394fbcbdb38504bb011b71867554f137fc4057081b4bf2e5c2c6132a33cc15562e6dcfa939928e1994fd7485d4303dfb138fd981f71fd94562b26749bd7596d2cc751b77716a54a58ffd6998b9d7729bdf81c32635686e01c9b18fc35a52831b50a3ce5a75dee85d0fde92581539cc71e1c0362db3eb5e167f93f39676ea401f4de484555472c85f5ddf62507395d6b926c17817831fd51bf176c53a783e1ad1cc8ed609b8ad55269fe747b1f17b7903efbe4d0cdbfc5e08be0132eab97ec6685e9f16b4e4840f54326d6e083236034dbd1a571767ba7b45fda0623aee6f9fa95ae8c793c11671615dff759e0764debdd1c6163fe7372a7c1ba3b9a1bad16f44d822d2ba9d41e2004b99a8fbc74a6b7c604ed2ee96d15718c85ad9f60fcb682a315f9cd13fc1650a13560a77e9584bf4cb78c54c30d0781ff7e9a66502c767826455593de3b465d0f03ccf3e3afe3abae9c844c2acb0251981857ce77fbd2452f1b556a90432b27add97042a1302276c835ca87eb01a1d99ad24620b54a9a5e68594c9954157c01cabdd69bfadd5a5893adbf6dbd58bac712dd663999dc58966d512422eb6e568335995ad9c3ab53974946416b5653170ae1ad1fa343b7204bcd0334a547b26067ee50fb492de27b9a1fb3b2ab3fd5e3db2abd16b8e91af51fd7d0b598befa39608c9548730f2ff4e71312cee423f1f6111541025c0a080d821574ca4d36343626ac860b30d823431c3d0f637907206e28b58491c6fd366e5181b1117576baed9c6a843b9337c2b6d5adaeaefe42db8183b1d4a82b99437fe00ad86cef949666c763bdda7e1b2c4b28f302f88ffb88b1903f74cd4337ee88a88aac7b65c749ff7c4383e7bd4186ab5429d3d59ef24c827d24581e65cbc05034edf7da0af13ed7ff9540408027f06826b2b40b9819e37bc3be37ab8b080101b7a61355b742493905a4b93d2e32b69994f275968c34c00453a07a8a5b8fe711e433724adb25d26027f204554728bf5b1d1eae3cda28349c2d24e392cb66af3ece030710494822829fbd16d2784404f839e41b22de6548c363ee5ef7d0f1943eec23845911660c610a21ecaa4dda4d457a46c3730a8734cf6ce8d7041f799dbda6da7391bf83d758420eece424d175f0904a54092d8981685ca6bf7eaebdc74ea60611c503808df5488a7bb2fd7073f2dda5c3c3cfd8357949366ac0736cd9def6743dcf7f22f0ffac13f32c18b59f52fd3bec05c74ef7d453fa65e2c8e6d1685d6ed670d5f1b31187c8ca13045cb77353b12a07742b0ba93b0f0f8d2c36458ba558391f92b802b7d4e6edbc49974a6dd70a7b97d6617232c19be3061b826d83064ba265c8adcb9782690448bbeb3aca4f240846281ee56e4a870cf0bfb090cd655b7f642085a8bacf3529ef9e4510dae6b8061ec6472d0a1770a962f271c35be6940059d68b7e744b6f39fc495d84fb7a36adb3f6fe9a312e5c10a92fda324e2e7fe11e1629fad2fa79e6dfbc4cbf56bdfb3520d13a7738755f4b312592e81cf1232a2bcbff16a8aee22eabfd59b4982dfcc66d5fa006d40963b42f6be70600b0961efa54f257f5dd605225fba74a4d9a37d9d2c02eb86fa375db6446823be99ce55fe312c4ee5d0236210a4023c9e83bc50d339d03af3559b5fa397ff8f415ece9368c28490f28c4f32847b0a8b8e07b87617c497b2e297f41f6c0cf4d5ff81a080d058c515c917e0af4002862b018b98dcd87a8be72c57edfe0342b238e833e9a4c8c596381ad9b489ff64ad7409e6997902a0204428e4b5b1b6fc77bf2af31cc40b0fcd807465431db100eaf004e967702df0fbc393b36ea1d52b00be7ad25bdfa45d4badd60c33b8c81e11b76d3d91a059d0a7a2ff0c859da52bfed31a13e4b03a21a76ed351bae5f73f1a6534bd1f1b22a906846c6b859b6072ab517dd2dae77b645712995cb58dd0f986bf1c602d2b373195fe9b9f0ad93788b1f3d3abb8471dca0a9c9803405bdade9a0ce54e673ef4f241cd25457e35688cf9e356477834078022b5b1a756c9b706b0c901f9781641294466b07c22d555112b338e59feb576f4803fb1b71762b52d7dd39faf0ae48d809a2ecde4bf7a5087db40143fea06079189922252d607b0b565ad0ea4bf1e20e6346d36161d64647c91f6b18a873baa3e4be168c2e1075fdb79e820d67ca352dc2c5e19b25d31b9418c33e4fe3466cf57251efd775e49f92add8d6821434fbfe107128ff4ee37b3d0354d7a0098d438b21444c04c46ae8edfe08eb35d4d1a1b3e5d7eeabeccca9a4976e45200e54255a3edb7a43d6f110217b169d82478d7e729989d1b4f7f04069606363d6527c1dfcd8cb67e06ccd8206e9bbcc2e9c488b1a2c86a5afc7129a2f0a6bad416cad7672051358b4f94936e85ee2b0c5f1ef8eebd3d0b726a1573909fb1cb8f3dbadbf58ff4ed84aa9fd5cb0b440670fb51d4507eaa3879bb6a08f0aa1d2a5b19f1a4eebca9770d79da09c17d1a05ab9298f6914d38f5333d31828cfeb8babea1074c0d4e009dcf1c8e4a549f9861bd0aaa20f6fa5868777840f169d22b9ef077c784774968d192d280423c98814d7f6e5dcbcc24db803fb5614b8dbcf8e8d5a5e853b9ce991b24f1a489dfd1dd221cbec6c6720c13bf16d5774933cc3e5638ea999e1fbf6a1dba4e6f303d15534e4b922a921095387944c0b78fca4cae11c2867d567427effd97aa4e5341b40e716bd7c996e8a955b598013d645322cd1309b488d259fa39c7d1cb129f9e36b7d0e07993419003a805cb8817afe8ec8e46a5689617d1c2907500ab2e617e69b2b88d599037caaec5ae98efbd7d74f5d35581ea207ab2204eaca77512fd593978574e72616c8839d593540601e12ed84425c890e4f08bb1b1fd8e53a713631e747db5547d0e5c10aa596d113f6f442298a4c2a6295c0cce60454a6e1d8e789aaa9b081a99c33ba4154fa79ac5582ed46cfe3561aa97c9bd328dffd0a53b031befb506bce562437a6d0b0f1c324dcb0458b9051aa05cfa3173e00f480fbac9906c8b3fa8b1fc2c2bba94212284c78560e530a5265f4b3b7ee4c40f40fa727e320ef1e29a98ab862e206473bfc76852cf72bab3841e550e0c791b7f347b03159d358659359b0f1f7f81ebe9f965f6061b3ca5852adcfb31d3a8a0d34b6bc9c619ff9627d708f1e3e28f65285b4388acace3eaa06d8f562e4ff80aec5c7e136b63ea1e6218192423f156a8c6ca43b970dc127ef7ad3e8fd8e3a89fe9a821aaf41b51753bdf45ff4387d2fc4844e23270fd9566ed3c6a7d58aff3b2c3f4ebe1b7e2cf8a53837833084a347b9671f801459ef8fd92cb90a9b3280744eca106fe6edaee212990ec1831517d9f23a2787c02c844fcfa41a00e37a042a9afe34a8e0f90c9e254e48a978c1a2a5cb06b45da9e1acef2dd1c118353c755757924291e7563e0b572a5f427053584e35cd85189c4ce3690986e382733ce1abf242e3cf7a456ebaa6e89263de951f8e8d5d72f2a5cf22522a0dcc64b411735c329b04fc22b57e15faf58425a3534d2328bebf78c84e553a1d4e570fae5dd5e8ff78755d4cff7bc0a384607aa3db8ed1701f7c75d498ebd162ab912c2e4de2fea09e56c022906068e80fd2551242525874e8a84e09f4bfa3a4a18df34bd6020eb30b84b21a597eaa17cbce9c1e97cc738965c974b271b00033edc5871db50869662a472c2eced064","title":"416. 分割等和子集","link":"https://leetcode-cn.com/problems/partition-equal-subset-sum/","question_id":416,"issue_number":64},"62":{"day":62,"pres":["背包","数学"],"tags":null,"whys":null,"difficulty":null,"description":"给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,target。现在你有两个符号  +  和  -。对于数组中的任意一个整数,你都可以从  +  或  -中选择一个符号添加在前面。\n\n返回可以使最终数组和为目标数 target 的所有添加符号的方法数。\n\n```\n示例:\n\n输入:nums: [1, 1, 1, 1, 1], target: 3\n输出:5\n解释:\n\n-1+1+1+1+1 = 3\n+1-1+1+1+1 = 3\n+1+1-1+1+1 = 3\n+1+1+1-1+1 = 3\n+1+1+1+1-1 = 3\n\n一共有5种方法让最终目标和为3。\n```","content":"0961351fcdd44c9dd275f1df845ed5904fbd308704f820b0066e5027573a011801120ef3ed4eff2b140a9073ec2b60db79df883c5bafc93938cf15a16c0679fc30b6b59d1f083b77d0cb4d7976f7373c74a4f4446c26f750b145f54b1a432351b176965d2ff51cd5e7b7c7982f232432a23f2e43335ee7d06dbdfdc47fec1fb4755cc6a8f08ac7f8982da03cd80ee230a296827ed9b4c2a44f27d0b03b777894f099b08caeafc950227f65fba77010591944649124247a298d5bb45435ab017a20a91aaf7700b85eacec7b6bf274772e9d74965f92fa07238efc220fa399b9061b2a3f9550a2458bfe3322f4b9ec86ee060971cc8fd47b6d1e4d5ceea4cac139b36be3db83cf3bb00b234c4b8f47343fc69be830b26fb604d8f49782cfcdc6dc14a1aef86005c3e78dc55a7346df7522b7a2702ac8b45eacc14aa19f60e822a14e0c81fc4a30342287e10de9998672d8a0f9b8b891a8d975882be59c3401579cdcc45351b8135fc1f45b5319900fa05d7e9be47dc774495c1738e45becf8916232a7502f5a3388f8143ee42d50fd090cb33e2fd39d87775703215df73226560597a340415533bd3ed5f71f1b99ddd074ffa7d3d9a847df007d3d28c9440de680e760a9677ccb50ec9d6afa0a530731186f9259c5d1d39c839a718edf676b448b1bc1337128c48f17fbc8fd3574274d22203a60f651bb24d49f108536c3bbfc74c97b3366418a65f5220c8b1b265752a5b40a074455fedb79b29a4f0e3405705ab434013a177e0505e8e606978abf842311774582b9832f8d810010751ed4e3b2efca9d62344a056ff5b8bdc5eb4ec3efe33cc853988a21ef427097ec2f2cd1875160b6d507636d05723228b74e75e8927c1a68601371691cb5b4059e86edbbc189998d3404a5110e33f3fac98c0ee7afb45f7f56d9d4a5719e4cb3f8148bcbc047c0510cd8115606b5acd1e0267a2c16fe562f99e592cfc63af637d6272ef4404ea390352e30a21cf0d81534e44008121fd2455332956d107355d53efed97a8680c579ccd19fab80f96b531c5eaf2a17a8a3cd56e87047017dced05bc5f1648c4d14169cd100b969b331d08e568d030689d3afe828a72676c6c8efaa3c64af6a189b7828404f81709a4dbee86158e55d46b5f3c522395cec9999af120837352f7d2866561e711792234a669ee78415f35905233322f9e36e914e40b448c30e663c07300a720d23fc9311e399aea11b87e4ecb93f0f8d896fca5be544db4a5cf7d72f7eca7cc3f9356206b89bd02b2d14de8bcaeb791913e1b2c0c8bac0eff1ecf575c9e02627d325fd1fb52950f61e488811e67943949ec4f1fc01da790ce8ed239bd146ab0b86414b10debfaca2a4a6c5a1887727a8b8c5d6a75ffb0b37b26690b1acb712c88395d7a63957afe82187c440a4d5f309465689fc6d0d9cce7b6eac987c2e8fb83a7ba90bf75bfa2ea264f6ae9d8206cce47e1ac114927417b9d2d527c6d609fbb32e2cf7c7742293c9b1fa681a321c1b1c0e9d778bedbba03b0ebe1eb6d6de3d290fb56f07b0b48115ca5a631f2fc9182e5af380814c0419fe4661257cdb7258a5dba3e43d008004e8a31bd689af329af727aa8ab8ab7b495ea771f7dba8b6aaa4fffc9c0fbdc6ec612441c61ba23df1f793fb4a75f9181edc321a043e65abb9047ab2e2b1ec64266975808606c8ec154e125b2682cb8532c2a7217d939f02ab2c2e784e89861a23c2b43604f3d1769c2d792f2adf499453ccfaf05051e51474dbf1fba9dabd3909907e9420a2d782e04278a201f4366c8f70d2ba841748e6e4670ad8d27df6acaa4270e341778f95d708d0f5ce1905117d183477213bfc6f2fea159a4005394290cfb1070d2c0c28003b76ba9be6226f668e32f16f790153f9dee3fceb80fb55e9ade1288500ec17e073f0031daba6c12b1e874a76c675bfb9b95a7146228fddd8383da675c777629e7c778f759fc4c55f179b5220fbe188a6d553fe0cec11e6559bda4c50d2dbc3b6973329ebe870ab6a882ab2012c039df29b6f78c77c80a5a37bdbfb8c719ae553ba0ad5f405cef3a85b52862c647a70d624cb905734cc4da84d9f283972b90d1588bc8ba5a583326a5483fae1e9da2f3d2748a8f21210a5089ffa96a0203d5c1143ba860f2802df33cbd9b59fd231293c8c2ac428be576b16e97009860bd99c1934fcaf43fd0014b5b8173a3d0747d2dc973a20bf108abe642778bb515c2b7a29642d2a21e826afca9c559049b16cb826a6c990da87c12ccaf8f00d0600292d8a5f6ce64fdc41c6d33b80ed91df67877ce3a73923359a75a266c929aac9b415014124593a8cd02bff807d56b8ff1712f639e0214e2d296700a96c9aee65aad4f4dc07b84ab37f27588605d063e973f8515f81786836b6bde6638259cce8fddb30d823a996533d4fb953fc28196552973752cbd42d2f969de6805d9560818b23572b6413af129d973426c80629859103cce00e171219dcb8bf21c03713afbd997e030082db132335a964ea68dd96a6b14f22ac5f8e5943ebf50b28a714e0fcae131f4ed00a6fb75415441dae1fd7b6d956246db70613582b433773dd9f1462bed73e93faff229842cc1afa8931fdb16ff60b55a6b88dd6f74d91f7c4aa622485f9e245b1bce333eea07719eb4fb3096cc6f50f7a65cd7b45b600ca77346c7b51106836b3603a0c26eba83ab6c48dafb69e6ae1d0e5b59cb52327fea0d3cda7678e7d1804a40437ca36520ef9a0f05bbef2240d54bfedbf11a1f7402a62999070611e82680a9d6f507640755e14fd87bcbc75a1337a8c8db1730076413c6b4088109eb70178acddf5ae50992303c6a6f08e9790ac050975d9cf2b4863faf82fb121a75130bd0e70193bced68b95bd3f8ff82a8c22dc02d756f363e53e672e5902bcbfbbb1ca4c8a0387d87895b57675124e9a7bc8cd12a5324c7fcf759f4b3cb5c2cec825214483b0363569ef4bf2dfa3fcdfa73d61105d0e29cda9b3ebae3b6eff50f4174ff7bcbd893d1e8ce39290d1ef93ee84c82051b0507ed54fe2a5462b27dfef879ac2b5f266ca9636347166d8c35c844a4e8160ef6ffb66e9c21f88e441913c268b8da775dd91859276625a9d56b34885b671de799e32a0a139e1dd7ede9cbdcbe798c192aacd7d92b25381c897cbea509d5dbcfd874a93f588355ee75b660c09ce232e821c11ddf4cff77dbf4cebee43d13ac8f4d6b827adee3ad893f75d7485e47ad05ce0b45b5825174205ed203a104c35b962c0c044103056048d68e2dec7ccb0b33a569da018f2c7873d62f017dc94a361c1d40f4a402f1da5249c349bdf3305943f82efd1ee59cfe5e4d08e4d6409a36133aacdb098d289ae1fd23919d5211bf58b9478e5a302d7680f50d4f0818cfaba1e18f11a089721efd4ccc15d8c5b14aadebed85be3962e0b732bf3f8297af38e58bb0c502fc0e8ed9c8810789d650687e2689d814c2e9e4efe15543e21cbbb7e303e1fa947a4c918afc2ebbac05c60b05fbd1425a8f86a546f2b1512629d493470112e531b3415199fea0211d8fe38a1ffbd3e13af1143197b4ae3bf4c7f989e1cbdcc6ed9e4002fadb03a82964738387b69dabed3521cfc799ae5c05e6dc97cb639628c913467136e7b594f742c3a4ef132643e0f7e420559557312dc056de46fb9c8f42d9ed495f55253ab6db2db27ecabdad5cf768ff28826107e2aa09ff85475d27bec4d7284848e37b182960b8131a0271490504ccae11d6f37e13956de48051ddfcf28198d60222703f637d67720887b495d894e10c29ba599f6b5a19a995d8811e4074d673bc422ba2f9e0f083d271f97d7af684488a30b79263cab4cd15d45d62c6c5dbd9e54daa9ce99e0c5ded4e761ba574a54f36241e38b241a96e88fb9c1cd87ad4dd2723007cc4720f399c7f5e6c0aeeec33c130c6e971438552550d5fe3007a491db810bbf168b690b8547a462108e57738986776ee5cdde8969ea61c4907ac6f52015636400dfc38842f346700f2dcef634c84eae3d15d616e7fcea945420e73a5dc27b446b0e7aed0a35a4ee0398342b0052d6e1d8a9e0fa0b2c685f5670bd3da1e70fe9114b0efcb1b4ca2600dba12db467a31c03536e547a699bfb16492c06496b59bde83cf48d593ac7f323357b4268b85b4df8bd0bb85d5c8b3d89c758024ae8a8f6fd587c7028973f39f349d71fa12938eb7914bbb947197ed8fe9787b994c7ef35711c527d9119534e98c4e0df8de5bc237e315b44f12ee1062ec70b3b7e955268a8c9debd23da7fc5c271441c4f08b7240fb3e5e2a0ba0cc1e43715bd679a8267755682ec0b60a32ada4c803918f3cd58acaa531cb24df229551182d3bbc4d0c1616cd02570564626510f4276bdaeaf42d5399a274203e54ac5d6097170f8f652e493c73b9ce9c7edd3d7cd9bacbc2c174a270ea1e61644ec66bbf22767c87956ffe011766e38403546d3fb70433084858fcb135213afc7a3b722d94d0b54ff31f5579445e1b47a73426f996ddbfeb248babb1ef4a2d6a6b4c50aef7dc835855095128759d7ef96adf9eca82d771bef06651c03a07f7c14c8bd8ca12fd04c8f39642b509b8e314f391c7df194b920c1a5b67ca5529fbda25462292d7fa2b762149b585c3b9a4aa4de513fddc2d4aa009fe30084fe0185ef3b7b9e951e319472b5e263e705fc839df3877040612dc3af3ec9b95c20abc24ee67c8f4d4f116227ec92a13403cd88984e2eb01ecfa3b7916ec68675d124870cb72991a92c97342081e832b2916363b12dd30146b73ee2bc7e4591f4b530a7e3a40dd4ec065a672964b76a4f9c4af14ae926a58f2985b1948a9b7a83507105358bfaf41e63fc9786661dd359ec282336380a4f89d0002b11a2c3380d685e73e5c602cbedae69f0dec9ca86983fb3fb6eca660bd2e478590a726e3b0c3a06c632355337fab14e3be1465fcb62dcb8e2a9ae2e2ae98704968820766b9f91d2640979ca5339c9892269943a447e1c642e45774e38d5d07cfe8e6846905777cf9087b6dbf83fc1c13d577860f829363dfe11ebec9caf6c8e69c71806c678efb1259d81b004fad4e5013e4453fc74563d547d214615b0745ea527980b2b0e70e5bae9e057035a4c7f947b09605b7d893f1b861877d9ce1daeb0d7dae7a8a6ca8db15d7562d709dd0186e317a06202f4221f7a6978729bda5b494566b37e55d0eee1e02b0c9d863f1cac59301dc0c65cba73a440408acec057b74c6b7e9e4bd4c127fc1fd6923537e8f58df4f99ca9126604e31cc795b0c55e3c46eee50811dc34bf9cd7e1cfc7d3bdb9d72208661655d3648bcc4fd7261c8a8344530def179e90fad2f45b8ed6d2473d07db4ce52935a40652abe0f86ddaf9ef36d42d2691e3e55fc1861543b9821ce9856c4e0ab3ebc62520253a241f9ba3205bcd5900f24c31eabef97cbf5b9600a34a3f83fdd21030bc914db1a6b222a43f5c1060bd36bccfc4fb16e8435f1ff36c1258a025303a23a3a969dc78464bb4f9a7d39da0ff49757d6b11e84282b0606c395ee23655533c84f5239d75819c4f1d16dab65cf9b2f543fc35cf0e2d690e6b7389fd6d91edc8ed9b5f4a0208b2b95f2bf77a6fc9d675a3f5f1606e8540408192f8aab87bd9cb28f6dc226ff08114d619be3a9741dfc0cc62380b764f1a","title":"494. 目标和","link":"https://leetcode-cn.com/problems/target-sum/","question_id":494,"issue_number":65},"63":{"day":63,"pres":null,"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回  -1。\n\n你可以认为每种硬币的数量是无限的。\n\n```\n示例 1:\n\n输入:coins = [1, 2, 5], amount = 11\n输出:3\n解释:11 = 5 + 5 + 1\n示例 2:\n\n输入:coins = [2], amount = 3\n输出:-1\n示例 3:\n\n输入:coins = [1], amount = 0\n输出:0\n示例 4:\n\n输入:coins = [1], amount = 1\n输出:1\n示例 5:\n\n输入:coins = [1], amount = 2\n输出:2\n \n\n提示:\n\n1 <= coins.length <= 12\n1 <= coins[i] <= 231 - 1\n0 <= amount <= 104\n```","content":"09613214cbd44c93d26dfeedb25ec28da33ab1ae2e3e8635064c41275c12031000fd9942eb5d288bb6cce140bf665b833ec2fe4178e85ebbd724ee3aa0f9a76ebf326f608fd7cef70c6ec1abc79e527278f46f8996ad099327f626c1eeade18e5123c10e64faf1446a7247f96a364f70a0bc2e647bcf1908f8075303b40d9f488439a8eefec9404c45a777b5a276a0722a4b42ea5b49a9dc0b618474ea9af22054751c2066f9dbc2cf037084cd51620211c38be613540225fe1d91334b974c3211d24a9ac8854283240aeb68f548742d997f9279154b90ea685fe78d1097f647543e3fcd93c755e0a61d479698a2d9f54c577baeeefc2d171227b52a3e0305aafe7c84b3a29b65894640600de14b5b5bc5d68b19f12a8744b4fbc93e8d8a779a521dcb8f5cb4e6dd24c17b5d46c84d22b586702ac8b065aac0548e9e64f020a8540c99fa4a330f2282de0fc4ad8740e5a8e498b99489d74db12bfabb38394f9fdcce951b88de1dda3d3a4a661250efcc16cbf600a26631f77c7c71eaebc0b98f94e50800085a90a74a11ac6668b1543fd8783d96d98a12fca52c5ae230274c068dbc4d7d7f31982ed5fc3f15bbc5d17bcba3e8df47df3384a58d28f6500ff88cc35528a8b430288110a049084c26382d7517aa255917075b308a585fe1bce71cc9069bb7df1006d1005a48b8b796fe22c2e49373dce66fd2e19d0431d8821ff9ab2a1c19f51eaa749857de5d755852d5a5172d92dd640eeb198b51c1b9c2567028ebe0b8f7afd099418f8140772923a4de90edea9f4be94307f2f4ee8273c98bc81308c0fafc94b16213b0c9c19a6d7e36af72589a4eac5e795a42728fc37f1395ed0187433b2847723228df7503f5992c5c36384c2e7801a8a43c7c134f757718471a9f199ed697a9244e48488288f6abe49322ee72a753b64599db915737469a498ab003c7b0a272561269f393bda44f92a6293ecfdca1b72cb80ab715dd84c939910228f72a5dabddbad6a37891fdb757426c24138efc170bd5e54b32ae760aef12829dc9e51151d095b0c44d9e6defbc9022fa02dabf5bd45cb7b6ce13d06d4b7ca3acbe13b110b00b369a0bf7f612495c6adc44bda26a13563ce8c62bbdb036a1b38fc569990cb84d9f6b8244fd933d4a0c8f908b6d005e09abcec3e8a7b3c2f6ce8f661d4cafe4897b2f02b25a9f8b933337d4ec62baa1d8d135ed48d4fd8ff0d8e3ecc27fe4028ac2a3ee48bc9e8cac48739cd10bfd3a8c53be3b6ab155d9fc3799521fdbe254a6f88a32755cdee68df61f7108a5eedeb0d0feb19adca62fc5bd6c3ab864e85734f1da3afec2ff028c2c79dce4ed908f2483181bae54c71f2b9729e5ed127b74b2bbe6c4afc08cb7dc0137eefdd498d96292420ad8b67f3165558360ffc0d9c5467cf18d16c3a073f0aad16e0649e7ab4f6bc5fe111ab0e4db804333effd78fa65b831a333ee33474203fa1d68b8ce07b11de4ce619f9ab64c7ee6743fe2df145191d313287a33e7a2765393c1f6118e44293e0da7de4d9b62611395bb029344068692823ac75b77332cd60d2968de6f35ffc7f315d394d1f009b09c234c1a02f38e5ff32878df4d4c52a02273e16f672a5697859353a73148693c1ca2c1d39e3fb5c8d463ead0827eb37d98cef7a640198516478f345e6b3e1a1102d3cc3dec87d9643c4177a28304d7eb16421858038307377eaaa6a792f68665d90e481754c5dd0da617009207eefd76bc3c783103de41885fded3ff5f50eb3f45dae2f2a4e4b93436a577b42caec8bdec576b67b0683d68b973c09a842665230594cd89fa04a8bcc4274096254d3f86c9cbb5fba37c2d5e370d52300963867766bf2ff6343a6c149183ef37524b2a439cc7fc525274e6bd23e076ffaa173339baedac95f8e7a45b69250ffa32f5309c01be345f25d92a04514f5fa8cf1ee53e552b13ddfff42a92bf0c52c24f982d6ee40f6ec63090a4bb6e6101347defb2ccbf820dc25483088429a49d0c72b8a3f0dccc254882ce14f653e472ac507719f389b03a03ec37e980ca19eeb1ce48dbb867e267e8b761f4acea5f0be1020c256bbc6dd0cd32305fa20cd459ae5f2da26151b21566e19fc355483cf9eea6a9d7486133340c3794fc4001bbd92261d4b189e450305ee40e72ec58b2f63b553ff4efe40cf2b871abdf89f60af4db6c9b2e2f8dfa3d248a1fcfc157a9533e374e4af0c79374a247bf064cb8989e38d593c3fdfbfee4c0e774b9554f52ac1a871ea967a84b793619272a40e0f3b0414f8ae1ae50c2cd823054964548e721686a19ef78d3607ecd0e20843470e76549f3c1a05a0e1f676607f2fa5da3d62c5ff1b05357ec13ca610e3f267203ba08caab3cccb7b7dc4ef657fd6d156bc235c131b336e2675dcc46673b9ef4e262836ce5e8b88e6cf63483f537694fed12cf3d0e7002c4623ea8986127d284a4d41c8b7a99c56a57307f28a609b79772699a4271b7cf2accb35b4a0929f6f6ea6c937876fdbd91374d5482980f3f36a975f72bdc8aa5f96c08f775a4590aadf5037bf259a6affc7e5653d6502ebc0700101fb311dcf9d0160e71aa0652156416797583cb083bfbde2ed3faff229842cc53bc8939f5b93ca30205d6f1a497b80ab9e299e26a69ddbeea1cfcc7bb47c8a06619e04ff75917ddb0562f74cc321bd023fb5d346c7b02452536ae3d185f73a6a86c9cbaccfdf1db6cad84bfe7c0ae4d7785e19ecbbc7da17d185de9046b87374217ade9b50fd4a16e4059a5edb46cfe8d3b6b2fd6816e4e73e4424ab73e0b1c405f2e4da989bca066a9197b9cc837efa75c7b672b49d855b4ba1874ac80b9985192221f94e9f78dd3dbcc404a21d0d5014863bcb739f46fee5c2bf40a134c7ad3c48386ee30c3a03b8c2fc606ca7eb61ebf7362761a5f9fa591b1ca4c8a0387d878d1e53238697fa6369a9818a1490d02de039f056cc6c9838a702145c5f24456149250d8f5a3fcdfe33f5f54755c7acdfdc990fd6e23824bde4a23f8aefdea17279bb7889ed1bbd685da8065df61a501b15ba9f41f68279ca3c6c991b5812986c3627d786790e91fcb0300c56ce76ffe60eec838d39c06d46855dec0d03484c28dc1332e1c911fbb1d81e563c32d9c2faeaa77c2dd73c09cff84a8d4dbb8aacd7d92b25381c8c3cbb300b5418cf5d41f93efcf3d11b7746e23428b3354f9551c9ebb86b900fd1be29043d43adaeefcb827ffab6e8dc1b95d7994e461d308f1b66e197872174bb95d3a0d5135ac2f92955e443f52048e428d929489b0f76a2ddca907a794d33b58cd5796be8156b1af0f38064158a5eb008eb1f573018407c2c2fbb0159f9c9dd0fd02285cf7287ca282b9b2cbdca51d9b2842b1665efdc79878b9ed14d572483a869bcfcbbfb2485db24e47c53da6dcd78d5bc61812ad90bf9515ed9d725f3e66f2f82a7d81c77e9101503ecce8e08d815c17de3149d5fe21d3d5522eda1ef654197130d59434463e05b847a1d42cb08cb2b19f0036c924f4695882f86a542b7b6e021fcf116035584a535f646e148e972817d7ec1283dc806a70a9551b03407ba3b60c29d6b40bb1d13bd1f9556b90fa63ccd31c416df39f102225f701b86fb4bafe0a7a8676e64a6d9493322047485153401d63741da532376b4225750517003e41d25728a03afa8dba6a8dd89df60e07f975b2d968aee598c3cf25c9a0ec7519186ff49fac5468d228b900728fdff076e3c5d35f9a1ba0275dd650449ee1182663e8314d9b00500cde86760ba7236d3d57a279ee736fc07a0011039cf10f66085f4b256d212f980cd56fd3b0fbbd21b71d8359d4fea9c6dd560112494499aa053f6f70e744c1545efc2c6c19a9b53feed4d384f193bd9aef63a57e0321bc2d4be0a46d549ba78af6c6d6b7fe4fd238131ce64720b5d695f5ee8cebbac3754e3b6ec30f381c254ec8a3541ca4d8d68c02bf4df32c5fd015ea62108e577bb9c9293db1f48eef3dea2d899152938b2b04637b5df8d28805d902202629d7ec33c81a977644826bfcd6eaa5237b8d3a37a85b64a48012af1a51dcd640c71a486e4aa0556289c014ba6cf38f194afcb539b950da5d2b1e9ae1ac86402e8ed62ce83c8ede838c8ec7b492196a491e2a6fec89d3663db638075b17cd1fa9a3b2236ee71047a8e130d03672e15bbf843b3b3568403b11b1ed91c9e65b71b4ce34c03edba626a9f62945a9dcef5e654a6ffabe9b8868200e4e39da6637179107436f4952ef6f60552a6d966fd6465cf974a59752b294fee795a73ada7ecada784b36","title":"322. 零钱兑换","link":"https://leetcode-cn.com/problems/coin-change/","question_id":322,"issue_number":66},"64":{"day":64,"pres":null,"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。\n\n示例 1:\n\n```\n输入: amount = 5, coins = [1, 2, 5]\n输出: 4\n解释: 有四种方式可以凑成总金额:\n5=5\n5=2+2+1\n5=2+1+1+1\n5=1+1+1+1+1\n示例 2:\n\n输入: amount = 3, coins = [2]\n输出: 0\n解释: 只用面额2的硬币不能凑成总金额3。\n示例 3:\n\n输入: amount = 10, coins = [10]\n输出: 1\n \n\n注意:\n\n你可以假设:\n\n0 <= amount (总金额) <= 5000\n1 <= coin (硬币面额) <= 5000\n硬币种类不超过 500 种\n结果符合 32 位符号整数\n```","content":"09613417c1d44c93d26dfeedb25ec28da33ab1846d54af1fcccdf92542190f0c39ff944424faabb392dd26fbef1761d77fee86056dadec1f3ad61ea9633178c907b7a89d1c2f0f70e9c1467d691588a8b20587006f75895be93ed5286f646f05bace4ae5843261caacdefff86d3ca2d73d9504a0f9b2743bb0624e5bf614fae823029ae3fd00326012d07cf62ded6bdf6cd3a644dfcaa9be5c36d4ee722d3ad79ff6e7cce1220ee5a68ae57e4792d796db210c1afad0eca874d065bafc70c3f2d3509736818f02e0405ae8ad8e6608728235cc5c7c2394b3e5c4e994145239b0dff3dc5ce0cb3e9ab862008de6dce592094334f3e8a4590e4679a86b6e0742cdeb02e6ade4dd43cf2345146df03e3a619bb8b16e8d38fc3f98938e03eac37afb3b2eafd149c086d646ae4a1723cb25419cc534229fc961cf845ee9c07b8b7d9e107a8d953b385746bdae6afbc5ce598ee0cad0e4acef977bdc53c8da722715e2e3add23ffd801c8748343d18102499e07e9be377c77fa5dd5978e63fb6cb1bb4a40bbfc08db535ab4f27a14d696fcce453b8c71f0a27c87d3ce5c200b8d4a693383184a1c1fb20b31f4baaa128bd8872aac7d2676de1590c622426d560d166e19d7cfcdc934d85061e886308750c321e40907ee9d2e3b68098418ff37a674cad15f92aadb4485491641b55b7bc95e419206f3da4706dab5f509f04ec4210dd4f0af48bb2ef1e80ae1cd81ac8de4d40c48f2ccfcbea3b6ff0a88b02436a2d320ee068536e5e2a5c4ab2829d09247a58aba3c13709208e0f9452a7aa904ae94a5145718c73faf484b94a21746569946b59e0f663fc4e00bc21cbd14e7491ce790b9fd60a02a4c2a0b4e9e68f15adfc448aaeb1db47c5fee2d8361f16a797d69a181c3b43808cae11527eaf85ad1c965a6a00deb5ea338e2bb8608a1861a9096e75e3810903bd7157b4720675c426f7c362c11a71a7594b454ed42bf753a28b33d8c866f43b4b79a15dabddbad67be63e251293c0bfcb1e95b5519e756382ee0ec284525acfce81ab5041dd8588ff851cc32a5845a428b8c05238d8b305d1a81e9520530e36f41425bd10b90626c96e7939cd82888e5584442dfb948fa4541c970978b51bb3d99a30d79844a9c8ac05ea3b3f929c8004552aef104d07b60a1f082f6a0a676104bda8c9794533112f02d85ab68b90f551e98332b815d832837b44cce48ec3e2eec3d17cf43f6576082ad3dae1b7f1154f1233a5513bb87bb0014d52fd62388dfb370dabb0460e1dd3100717dc86c8e44c1827c0751b312f343f493723ce297b270de527d80f72c99767f6a947c44a7a60909fc5daff2ceb782fc32bdf6a4aa65f96cb60e79275fdd0a5f0faede2fd6f49d4aabeb1befb19483ecd318ed7f7b141a69af1809e7234beb57cb09511bfbbb1331801be81ca8e1d02afe84d591c798ba16a70aa39ea1fbd16d9258be0d3c503c8d661228b099f2015a4dcde20b99b5eac9d00b91d02f9ee579fb0aa1e537148212610a9210a753c64f7ec23ff5314719e0389529f8c4c400cf34f5b77332df5262476e16c1ed8cfd51d156c214ec44a12b8d6dfe120088d0c9bbe27f9ce2efe0035875703476337034cb52df9a4e5e1806d9ac5fc518ea48160481cff4ddc18964119f9794ffb282d14e7cbb0eba2fad9687476bfa1b83818092c87ea56db4f968ae9d7bb027046b3040af0b8fa8145d7056d155ad2dc1d8116218c04fcfa77bd3d7b3009df76b452c7eefe7765ea3c51d8e5d2a9ca8434328774a43aa8ec98ec504467bc423744bb71c1be8a366de4c65f0bfacb7ee590ab7a76ef7d6f8fac9d586e1016dc9c96fcd8e0fbccaa31d7e47ef6798897a9c7710e3af3eca1cbf12a413aead276f0bae42487d5457b157ffac6c8fffaacfa6dc8a7d2183dfa25981bb5fb071107598f9d982ca5bf29cf5e26559d3e1833ec5a3fd1e220fa48ab8e099ed30ab979512ed0a245bcb0083201495fbc7b91249207d6465bc7bb3f50285658dac86107dc6d976ca351d6be98357d60abb37cb1007041ed6e7424a34c74b76e83340cc8556973fb8707e4d294e87bed710e929275cc5fd747aee0a65ca6db13370d684b15dc9c9d345a386651e9aeaf8e0c5dd5aa459e5c652f389df9d78069ffc2486d029c7298da35517ebe8ce206b725ac5fb2e6be06f1df258e204c93fc7661d976cf8819fd537d780704938fd27caa50b70602a5ade36ad792cdf6a0e3e889e86df6414c49f95fd306a026a861793619276306e0fbf30e06c4b2ae4d968bcc2c18c45814f86e626b03da61a03611834974cc346dfa6559f39dfc5a4f52283349a6fa05eead752bdbbb4e57a843b1280e60636519a10899c06d9be09df64ef61eb3396e16c223d465fb64e2224e9c74247e989f856d96629bc2d9fd7de860ed9ad2f5f5c738ee2f1c7b08bd3a39b3d46e67d79aef915ddb358ade70146f3676e11295d63f26cf4875c0df1483e715091b0387dcea6cd07177fce9993a53009fdb21242ae836f92ec18ca6a23e08e01ac01e5ee5ef033abf16b5aefa7e551a890473fc095b5910b05082ebcb750e6df356684856432a2189d06b30f09161dad0dd6edd16cc10f3c077f5f67aa3051ae4f68a9ea551fea3cdaa6462dba2e250e0f9a63a8da06a19a800fa477794f95b332a833a18e27fae232f6c32094e2c36f54a325f73a6a831f2c0b7b48cdb35f5d0aee5f5e7092afee39ccda74eee2a1840f40477e0781704d3e9be5d80f524121ab4a9fe17fb900f7f2ccda93b3053e44257dd3e617609052e149e8eb7abba35c01ef2cdb8335e26010d2845c95fcdf9277ab386eda251907710f7f6ecc7d0d0c51f2375d9cf2b012de8b73ef968a05821b50d3e503bdcce89dbf32183e661c92fdd00d631f350aa202b231744dff1e8b8ca17a00387d87895b532253f41a42f9a9f4abc07521ccf3acf072d83c79b8b716f1acef24467149d5fd8b1f38796da752481afeda1655d2a374ca7a13f4b974aa20d583a38b3ab651f1c6906390f220c36c1588c71924a9f6b42b9580d9ca3c6c991b5816dd6b872003e35c2f847844541c5e006e079b42242f65671b25caccd7e0448bed087d992336d5dc2133b88632df26be878fa2159e8c2dd73c09cff84a8d49df7f8cd75dbfc0787c88084be1ece12f1b6865690f5881f55e70f275e4e8b775fa81c11ddf4cff77df60aebba43927588eef4f169f9ee73d88ef71e3bccaa339541b5fa085874700d50a3742110053ee66bf7c010103f59049f42c8dec7cceb993a569de448f2da8746728d17d694ab35858f7412340500a560cc4fd2df3e41870bdbdcacf352de8b9eabc7307f09ac6b33291f515d32242eec50aef807a1e4590050ba2875f6963bc3df6c1c3f30331ab7dd7fb9ce39a42b0a2855e0439ed940195c3fd30448eff8cee23f10646085846af24f5c3e096e424b3fb69605c8cf274bad13228bb51989659891bac15c70928b9e8f7de05150e1588be6b081232de324f4695882f86a546f2b483862cf0c6025436053024e6e148e97285198be40cec19b6c3ee0115678102decaa4261b6af4afc9e6e9fad4e6bf3f168c5d34e61302d34dba7c0780bf6fa4b0645b78643a830f4847f1ad9de193f7b738bace73adb1dbd74240b300cc2ada4f8f4429e8f0f36fac03a9d5099d8f80e1de259989727211c0e1078f2436d0fe0ad90aa6e19b6546cbd20f40a3c8680f07be3025ac553ac34e2d97b96f93c2482e93fe83d6b9351594bbb","title":"518. 零钱兑换 II","link":"https://leetcode-cn.com/problems/coin-change-ii/","question_id":518,"issue_number":67},"65":{"day":65,"pres":[],"tags":["贪心"],"whys":null,"difficulty":"- 简单","description":"```\n假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。\n\n注意:\n\n你可以假设胃口值为正。\n一个小朋友最多只能拥有一块饼干。\n\n示例 1:\n\n输入: [1,2,3], [1,1]\n\n输出: 1\n\n解释:\n\n你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。\n虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。\n所以你应该输出1。\n\n示例 2:\n\n输入: [1,2], [1,2,3]\n\n输出: 2\n\n解释:\n\n你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。\n你拥有的饼干数量和尺寸都足以让所有孩子满足。\n所以你应该输出2.\n```","content":"096221cf5b628be1e73e8bcfe626c7347182268a04f82d930a6148296200033502310ec8ab1a6ec9ebd627f465eaac46b8280bc2d829199fbe23f761a0f8f223fc3b6776d4d5d2e00024cce88a9252743ee16ec9fecb4fdd743cc00b6e43450aa9c448fdb0dff17f67718fab6054175efb3381a0cc827a0286604945198359e336d5024a3a4417dcf16fedfb1cd668ed4df9e52ed5e04a4c96a71e3b4208389b1d3d134a03d361c2e6c7ebf48a671f7d07a8e1f977022f8d1ddf6cb4dbf62a1455994cff5546cb72e59d730d83791d70a713cc70612cb1870a60b8c618087896b7add20a98e156e0a11246ada1a1fbf14d4278aec4d12f390e25900f32173fa8e0648899b19a679e4047730fd45d5b43d1d0b004fe27954685d1c50fa488408e521dcb8f48bfe4c80ace594c44cb5522b5ac7322efba4094c04bbe9b7aee23b54c0caafc4a301e2392e20ed1bd408e48a0f9b8b5afb5d66abc2ad2b334025890e4c9961cbbdd1ddd161dbce69022bcfc729cd072df5247540334f272eded92603391511b413384e21902f7204fd6090a9d3028f597a249b8b07b05f9535b5460fdbc2b1f406de52e8b842367c7ec8005f7d48ef2c230ce732c2273b75359666d211aa5cbe1299f6d64973e5549676f3b0ac47fa998dc07157a13c990410c2e9a7ebd290b9e0e0384501348e2fe656fc796d6e61ecab83bc29e21a13dc48413cea72d1f1a209720a01dde1bcfe74d18de60aea19cfc530dee0b4ece87e0f5cc5aa9759ce1fee280bc3f5444ccb4f3e6346e2f632d56d51fcbe0377c2103a65f0b217b34b7a2dbc9c45a6e06562ddd4e224abe1cc814449f6b9bd3172aa7871200c9b92d6ec9f6dcd2c7bfe103cbb9433da89cf0a88fcab78004718f224562031525124ebab0708999f55c7026cc1181df810b1976b361c0dc194c96e914bcd1c755f3bd9abc4b4d6bdd989bbd231848039a1c29cb55f2aacb9373d70ac99c6d85c020963c21ddfb0a97a30876ae768dfeae79485f35967d159cdc6f3de4c377a89b29f84a14200281c96d501f594c8542ef82982ec61ae2bf7ed0ec59eeca4197f8cb9915de0a8a65b5290c36a255b2aa4d546d239278f8e67b726116314ab26917b0a6b3dda00a1fd840cd45c18473d745b3dbca3e395edfb99a8d3c0b0f2c2d6b3c677c3fbf85d97a4d14feffed51f5004d0a6758f588e6f11378dd03f244ebdc8fd9e7eee7d67cf30e8afc97ec7bb59e81bf4971b7d634ebee2ce47b9f27d8754bf334a05014f5e354a4f1aa37794bc1eab2f91f4e28a8f0c7b0e6ddb9a8e0ae07f8bf793bbb78f3542ef1d818fbc1d7178f3160d3fbd990823b5b7028cb29ea5a46ae6497ea402f56fcf2c9a2f2cecae2ed5b49d9b56cd6a675f6001fb17a82b8ab9a1ff6a993e8a1d435908e7e9d8912aa90b0313606adbe283aea97733b21e1f6a6a196adb060863db94eebb075dcca105bf45d08ad45c172832c4496999008d3de31dda45756925ca3c51f386ee06508567394dad91d8664f78c8aabdc6a99467b1e8f870e855c0792b28003ff597f3b2ef62b247bfe6f3be7c9cc2dd0b1e3fa119b4a7c435567e2c806d25030e0200649c55f53a43b65702f9fe6c654e86c67238d8c7f9edffabcd19dc4164b5f8c61b67f8ecffabb511ba62045a133526c0d1a333fd0e428e18be46a1e507aacb107f6ca1a541b581fb3cb8114cf89047db28a038a092147548ebb0b2316139605cdf775952d793119d256be5ec2d8f34f4430b3d75f2c084a5713f3aefa18a54bf6c2fd9749342db6ded8f915cdb38ec86e7e80864a7a8ac10c103327b6b870b2cfaa899e4141113e9e8fd5f7c594f3ebe629ceb7379525908fbf8b720231f4d4a4f2c90f2975a690bd267870f063ad60ebc6b5730d2077097033863b2d0be614ad3c945dd1399b78c28686ad9386676729cf2d7c0110d4daf6208d51bef50a19b07407fe6bd344f5f0a7e3185f85dae85cbec3b08d3cd9bb0e914093c6fb393be9914539963501e4c368a879ae2bb0102216bff1b15c79ed5087be8c7dd4d68f71a6e4548709f8fb04d8eda8767e8e0a6c776de728e89c5708c14d92649f3e067f860914839089bc92840a7c559cc7eff4fa21383c4b81d41027b101bbd997bc073e7c0e844a7b8ed0875ae91954ec90b6572f6ee734b269963219128f3918e840dfc67d0dbad343985712d15ef0b8d784c10320158041c73ac6c7615325843619042a6e4a574c37977cbc92db62d51b813af31ecdbf9fb9e3f88324674bcba36c7435cc175b5fadbb7980bb38e4bb8a971b8f18a1b246c4c40588cd3cf4fb303d5e9ce3fbef96ce6261ef7b469393732096d36bd470c5c7ecf9e3cc47825724e052157e59d2338721fcfeab0afe24f716b969928c09a0a6a97e3467bb45e40e587716f74ea2201a90d98c4db084459bbfec51ffcd2e489705bcd9a811cd60fc702bf8c699ba822fd71027722e9ac39360df04cc6bf3fcd7ab573271c256ae966a1509bb87874a44fbbef905a959da56594480680868c2119ebe253d97f137c643260ec398b90bcbb259ceb8bd994cf0567a549b96e771aab49199ebf8bd340dce9f344fa4415549e701d009fc364ca94871b31682cd0d7e55166a967865651aa18e2b354ae16a1170fe5c0bb3814b8b2b83a919399ea28745c6d068ba5dbfbbd9b49ee9e1ae03a69aefb60c17f41e290a50731fa6431472154a3683ee7b3c161d7b3325bfb5caf4c2974fbd87e431660bcc65035b6a57b7ed6bc92914f4a4a53b4d0a3003ffadb235b8e5eeafeff1d15b6c3b7aff6ce597f2a7fb701db2caa4ac892926b431dbb8375b192daa51b1e77c69253ff6ea4999a51f98996a4400ccc771c170ba572bf36e5a2e51ee83a5c1f93095cc1dcc2cc905d707b514f4142d29546bc6fee9f0874cd14dd2953ad0e749583404a051d5c756951947508e339f54229bc58c8077146c93e31e56149850b8a7e6a88af521241f46092a8fa8b1cdd76e298d619d052be4a8fde55e2091d49591cbb9ddd9a8c42cd268b811b10fbfe5502743dff78f86dfb5896e8ac331743e73e8e95cc34a53c562a73cf27df38e6388ba06966155c3ded07584cf8d833a35369156ae1dd5e52ed07e9032b3ec65a9d1738295ff99b6d49ab8a7cd3f9ba97981c88f8ea3508941f1e8c90fc5a68e3a552fac849be108b2a41e3611ddb88aa37da540eba743c421dae1f3b8ee2872ff410132cdee406bb0bf08b5aa500c356f0756ed3d3a00571fed628a88595c7a590cd80bc8c2c78bbeff7f18dab000f2dc814621c717ca94f83b8d9a411c1d4d14a57fb6349bdf334ecb44570f623adc420a57428e1e2e09bd7c332421415d340ae7169b6b9e2cf091616b18b37128ce08fd9dd8064c12445919dbb772d5943be754064525cd00c0dc2c487f5eaf0016abd6baa60d6bd1b94d5eb37c86cbfb6660262126c3e0354f0687e268d4c74c26cd35ad5f293e7b86c07336795dc94ee0c249e5c2e6ba8e096aaa2fff727282f86a546f2b465869c4174a254360535f643c51dd9c234ab2be128b95933e35ac0643030a4aa3ff0c35cbb445f39eab021e87ee4534f157d340016d2a1e53442397ae7f3f88e283cc9310fd2a9de55c40a2f781f1c9f48794feb28624faa1f88addfcc0b883f1dd7e9e9400f27c2c3a885d1d11309ce91259b29a27e7ab988a856d8df2882610326fa9b5ac5435f828b95237dbd18838e397960c8131fd3c77961004b4cb722e73a93967d4581555bbe57842e72a632542c174f7772793757c5e8a54168380eb96ad8da881b35dd807e90557703bc93cee32d827142b0509d1d7ea2d10fae24c732b22a20ac91d10a8571119aae944eee787e28cdea7dde77cdf054a5cb02d0fb0df6d1ac2a79bfcdc98d7fe54c9031a07cc4720b5d69594bcdeaae3907b405e3c97077f153e64c8fe7e1ca4d8d68c63ed1fe030588b14eb3000d67f33efac7c73e5898ef220ea258a8a0794df3d1573685dbfc3951fc95d5a5d689aa366864eea3a26cb27b9d6bfc67e7ca73d79a43400e9de9f2bb191613e85419cdec8a023a595d7823790f3420b1924fc71a1239773d4eead72633404c1e0576e8167e60f013d5e52093364f4fbd2d1b6c3ecc89e2968f86c079f8f578b4c6b708fc40492fa6c788f159be129f81341979ef0ec8ef58a0504316bcc717cb4088356f76c32e32d5befb200126ef2aad6d5fed193e6682a0e0f74c8333c0fcb46690c025220a181d5e0f94deb28fbab26b83f4ab72e2efa889de677952b848e714f1c1b49af6841fc92b9b2e705c5ce1d16be675c2bb39ac737c621a43b8113ac28ffa07c09c2006dc8daf75df77bdcab745349653c78d4a34c89e5c586cbb5d9c6c43a0b71ba1df765ac9b60bd6d493af1bef51429c655554ee2417f6d175b27330b7d5ea4b0b3c9c65e6de78f69e72b378def0e85886c7bf3fbbcc4e6d6be4f39bdd1c0790b792b89b4eb623e4d33c630d7909e7ef9517bbe42adf47c6f2b789a7e94e4fc6febf14bf3e299b384ef0aef7dc871c016bf41c81581aa9efebcf3a173235dfd45745544bd70265a81e9c2b5409e0887306d3050b1c7774f314f28bc9ca43adea2b72fa0108ebbb95d2f74287ff4b9355ac24d55239b4adc9b056a8f8cd4ba2ab5e30084fe0185ef6f32cdc116258d7afbf836b746ee83bcf3d33112266897a67788e25c61cd8708b27c925d54110c77ec8fa14f78ddf5b2442eb8528aedbfdf72c5817c9260d253ea29caf665976120c8a632e0d02d24a36dce4d08bf68a78412118df4f23ef4aafe0c8c9e16211a394afb3209d97cf119e775ecd56c8dfed2f29b3383193f0567caef995b6ba8978d660cda43c628231c380a4f89d0002b11a285775f21527bebf345d5e9a67ac8cac595fd8736b8b574e22272dbe473591b7b74110c3a06c6691f5337fab14e3be1465fcb268cc3abd4d52718bcd450d9d3403f3ce4dbdf757453ca5339c9892269943a4439502168117c0c65d5b37cf38e2613dd040c859d96cbdbe622c1826b127a64886b50469e6cebe781af28de128e180bc66b90fc76e6cbbd1587a99e4b33556b9a271317547d214615e2310af075d60b6f5e0be8f8d8de1c462c6d24fe3b234a9ed20ffa9f6df6ee660bb221744a450a1c2e032d0398e8d043f10c917214d87f819034d6c1d7f6bfc90f1cf5cc86c63b547f90aefc9a2f3df48a3e0fd5736922d5c740bc72ea3925ce8bda39d84a2b6d815ea8c763ee09c9d44a78eaf594eebad2e7793443a6488acadcc5187508aa86473fc423a4b7f7e8c5c3d2e792d6641e2a7013df64ccd64fbb2b0a98f84b15109e1bdd96b2adcb47908bb3247353a645e5242ba44f1cffb3946d93f9f22bd461638ce5f845de81140bd6d459bbd629537ee1be832c0a253a2456dda3741ad81016e91e78ffecff7fa8769610f32447d6b8db3a30bc914db1a6b222e376501033f436f38a80a244b6694e35f36c1258a025737576edfd69c1785633f1adf281d3a0ef630835225dad42c5f960703912f53d094167cab42bd13cd2de4f101a96b047a39eaf0c9b35c40e633c433808c0806491af8eabc06d194075a3ab4268e55357d3fe2289f8f12e3bc8133bc8eff180927bd9cb28b5937773e1d54a9957af569f51d3c0dc6b124b360f30168471ada87428aa404822ad7f26373dc61eb6979fcab1af3acbb31d822ca5837e3266f581a2ce2d180a71089506b48a8b0b4e415d000215e4e15476421aa16e3c019dbaf718faacb9580c3ed5dcf98a80cef322d6d9488f3b4b83a94053292ad3ad1d40a0968c1cd152093f68e64ff7f7901e4d9a1e183c42ad3ba3ad8d652884c8ecedab1d341a3bf315b858328820a0d0d1cc42734b1be3b485e9ebebf9c973388730d4e917d3d712a9ffbc2695c13833f2151c94b9fd8004400a8587b3999bc9851a26bb0c4932a8ddc71e52e92eb482a6bc570003352c8a44d7257a78f04bc3afb80af9b2f3b168d72cd45bfecb0783ee1ae50162803d145f80c96451d85a6c48fd7362e7629a2f","title":"455. 分发饼干","link":"https://leetcode-cn.com/problems/assign-cookies/","question_id":455,"issue_number":68},"66":{"day":66,"pres":null,"tags":["贪心"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。\n\n注意:\n\n可以认为区间的终点总是大于它的起点。\n区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。\n示例 1:\n\n输入: [ [1,2], [2,3], [3,4], [1,3] ]\n\n输出: 1\n\n解释: 移除 [1,3] 后,剩下的区间没有重叠。\n示例 2:\n\n输入: [ [1,2], [1,2], [1,2] ]\n\n输出: 2\n\n解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。\n示例 3:\n\n输入: [ [1,2], [2,3] ]\n\n输出: 0\n\n解释: 你不需要移除任何区间,因为它们已经是无重叠的了。\n\n```","content":"09613515ccd44c9cde7bfef88e5ec8bca03ba94db3a9af1fcccdf929652401171efd987226f39a5624643ce83ca1e9d44ce7862078aff81138c020a7473e72fd1954006d8fc0d1e0536c8da98c98497c38e078cb97af429d3bb46adef5acae815c2fdc466fba95632627026da6d0d8ad77d843643244e7c56cf1b38760a670ca35108228584c405672a55d954fe83c58c4c2c12d1e74093397c14307cceaaa20130b254614f88e7263074b9f08174c4c4cf1ed91053976258f58977a3890167512a31aa56b01814cafe9436fe759752da17385551659a7e4747ae688045517b6d4f7dd5dc8ca32a2a76e1f82e6fcd291134a34c4e3a964034459a66c562f41d6f00dcc98e8db79c90d711464c6323d599b829f6fa30bfe1b9d949c2eebe57cfa0f2daeda5dc086fd449e7e151bf925479ec53427583e90222fd12f5813ce5efd6e44e3fc21600b7635418b1c4d6a00d3d6a09ac6c8b0b0128d648fbf6a5365cc80d0f77a83be78f15c5267035644be951293a008c7150956597be73291e4de0924e822140a4fbba56d34a17843b37935d7503d9ec28b11e0b62c6bca3300510594b64d6d4433ba13d7d31215a5d8d36eefa3e8df47dfb5576d614bddd0e14ce28e5afdfcad428c2f1ca6600845393e065b935fc8d0dfaf8192688ff37a68539319ff107304f38c0aedc9f2017f1278cfa8e3e316d95665e2c147996d5f7ac7521398806656a3aa128a4ecd2b758ae87a6d989e92ec520dce2a4fd9bce7d8c09c4ef09bfad4e8bfb8345062cda4dce52b5f2d433e54f030cad215731d2fab6618217b3459f8df94ba6002bdc9f177c32c6c821cfd0c9b309f530b9be02e7bd6962163b7d7717e666f61233cd9687e82886102046d7f5052d43607d31317e6b0c1a8a24ea28a7db6b929e01764d35ffeee11b5a8e663bc62338324cafd7eddd7810dd13c77c2720802e8dee8b2604f6862ee3b7ea45b94c0e4d316d5bcca806d87d308558e99dd155aa9d45559eefc224312a99cfc8c2dcdb52249d9ea3645bf7017e341b2d2e1816f99532667491f1ade38312025e13b0132134e7659ede16aab4919359ed113a269a928d2ae5d802632413c0123807ee92cd78a8fa16611a82574b21774762ee57bc50ab376ad0cd83b3d8792ab2f5535c7d3feb79c09063f2c7827a2dd895137952143669eea58980b9cf382f9851428f54e99fe0bf37bfc4c4680fdf0e3e3efa35c9d6576c3ae50dafc832e8f0da5996cc952e94ad74462d910e6a044841374f8bc0db982d332271af2bbc0d2761b3ce1b1c3efbac1d5f0d7e576fee9240ed025fd1f73ca9f6bf8a98222ca7942be9cdef0f914e8959e27ad37f0a902ed5f8f5d401ff8a4402b3a6181b3c70210c21057121fd1fa3708b16db4541a16d7a4a2dd8f8e57d9132db906c97cbfd6d50a4a4986fe48167378d7a2332290a43674fdbbd06865ba1daf39e333457003fa1d6a94f4059139e6ea4b520bdbc8d8e6783eeee4139e37b1603b3156ffd3cbcd9ffdf813955f293c0eaae8639b62791dada70fb14c0ba8af8c2dd25a75182ef62f2861e46f04c8c7f315dab4ddf036b79e355f1a0be6855bf4274dfe8ec42ddd02358565004070fef7973bd90e1a1c3244f5fdbbc01cd0acde19574e8d67bb7da8cbf6b9661888244aa3375f53021a0f29d3cc3de09cd1662d6276a08c06c4e21642325a2e99c89127c3b3197f859e028a3b2f6c788bac3fc0672ef17bf278bbcb0d1eab6b956dfe10fead9e591ab93138b6e58cf8d6d74a0afa1d9245dcd8fc9043bcd9108fe3f807cb771a39b9ed303cc8cd3741b579466f9face34177601648ceadd6ac500d5220285f2a3b6f964d699919f7323ea9963e82e40f5371184b8dc2fd737cb2acb5af60bc53ab27043991dca08edae48665697a813ee164fd5c9061985f25e7efec9bfdf84108b9412e6c0110e1f9f715bbbc1951ce4aa62c42d50361e031a088b87c4bc347719bc1ea075655db330eb8870bad923e6dbbb1ded4fe1948abe316d36ae744b55c710ef0a488bf7ad55f86848d7bd8ee815d8be776830afbc207e8db2d3e7ce5f00d0e46b250f3cb3e08bc3f9b10e00a5e2a816356b87f8bbeb785226055aacdefd2fe2e12044190f1100f970bb7e494800f3d5e0a8767484267cb21cc5c04ffc5fe68450bfa72f553d46f0c73e2039b270ecfa7150fd3ae6bed0b13953ae9d9bfbc8a550f75ff759371f78d294b63f12f5842182d377d1b6c8c23ddb58936c87fd332924ac1d53c13e2ca8f246358c8ba647b1bd2187768aca564818c3ee7abb999019918ae8546c4c409aec23fcdeef9973ffaed9ab78a8d3e57842e47faee5474cbfd25ae48a6b4c9aaa4ee2cdf6274bb595818568a6eb37ba6c9d25adb588c2cf014adce548aefef797c0f9f13a00f272f22b514966d47b0a0e840da28ce93adf752fce9276ca2e9224d6c4cd701b94a4e91c0fcc59d6b883651d1cc59a683cc1bcf6667e6d8d5b9783f68d457a3b96a1216ba98854567ebb0d019a94fe7566b6b63dc8c68c52891a128309ae934ec702523c9918634c38a63c2adbe56f69d3b6b14c7a5ab0ba6daedb4848d855c53c4f6704be7286210a0268741e379139630118ba94c960d1ad99dafc24b1a083af5e22c7f24f2317463bb031ad3dc41f47aaec35b2cf7e7a83abec53cec58f8f1e9cccad2aaf50ec23855598c6db7145672413454a72d7c707c393acf8b5767760321a662c7bad932ac9c02d8b29e624179ad5c69eefb9c354168c20818da85ad0578e9b88d3bf1bf58eeda94f7f99bb84b056b74b131d0fd650f3fc9b9b0ed87a2bc17c53e4b91b74116345bdb44d88e75117032125004bdcdef7f0c8beaa60e1bb9298327a2e674f3fecdb925475e2378c523218d28aa31c04bb116d94aafe9b9facd2e307f296a8812894274e25c02a6e6c9a622c0550bdb718c88bc06c73acbf464475269e3c7a00a78c1baac1d9964556b7a7e61c4bb4e0299d763245e123ad48747d77e8fe21c3a4a35ded941bdd01a2d5099870e25c85791689345ab657ea5b4b02365715f580215238c0bfdc6f6a96e2fd33082d066e609cd9705a6fd16c1fe52803806c4cfdf648a8bdd8870204ad806f20a9cf434c839d12ab7a364c2f7bb60303830391041166551c7b8985e8101417330eb40ce60570ea57a6039ba9c5bafefd8ef4cf09f4ba5951a4e6b32d16cc35c2e8c48961f557c7eaa292886785647f374d7a17cc05afbe6d2e291fbf593288083d9f09525e47c05b1aafbc1a45bda42165a40751f8c953d4662ffda4ec4ca4aac5850339807678093cfa4db348658ac1e19b3dd0de42057534d9642630670228bdc8666cebc2819675f201120dc7ba4c437a3e57d015cb22b45e65ea08a9e747e44247e7ca89537a78953ba795a0532986cdb997c742b14bc617cb19cdf899787672a8803be38c6d09fe6c2a0cdc15a0bb7264ac6b13b9df20362cb1ab75a1a244f9bc0344d7a51f247a5cb22b68789eccb5b61a2749d270cc7aa3c1523781d4127834a6c250a2e071a363855c2c43251f4f741dfeea27723b42e4f4d051ddef60c38d5b403b2ca74b5ad4e6bd9f168c5d35d4b703652dea9881b4fa87a9dfdc246778f18b6312cd9dc676e137c175901377e691db5283739072a0a5759002e6bd25728a03afa8dfc618fd888b72042cb73b89a69cdab98d9cf6686e9a2675e616fe99fbd7e68d228b900728f849338b7808109db57f3290e99021096aa5d3638a47849d958114fd0d53843dc705f7a29c137bb3674c0750f11804e10ca86a5dfb8a7fac0fd1acd5ae70c503b72ce26ff60c82f163c6f4f85a9af634499aa053f6f70e744c11211ae2c2619a4ab44f5e89ddeb4d6bdd4ea27e4094a51a1210fbdce2d4ebca7c9b98f98cafe44d2291a07cc4720b59fd3f5a7c2bfff9123525d3db84645673533c8e0631ced9682c950e90ced3a70cf3adf7329c4063af4867c73e5898ef220ea6cc4de07dddf201563200d8e8af51fc4463d1c3092e736fd0797616ec63b879cca8f7560b6735de8714eae8ad72bb7976174855d9c8dc6ec66ebd2c1987bd1e3680819e348e065b939b56c616b978cf3a9015e82b344fc50c9e5d0dd9894f5916c3e487e717948c49eecd378aa8a1b4af856cda3fe4176a45444d152a5159be129f8134197ccb5b892accf1e603166cc3c3dec00c706fe4672a36d71c5f201dcf1756c6b773b4b1523c08cc8b1c49f3953699503aff2d29b9f723f18303fee49be1a67942d8515f22660faf69df47e9101898eb6c686d2fe71a6ce4a7e0410229f430181acba085465e7b4ed1dc522a4f31599349d5c8a560ac1036d0e280fc135a6b881ee89a3b7b7e11d21f44127571d5d5c5d1e4ed7efac02891eef777d689b73ab97323826e2b60ad3d3a735d499c5a3baccaed995d765042d491ecd8f0a0ead59c49f3f29b55803bde6761250aaaff599687c371c1cf4edbaab407462dee0087a98b7110612af0e4f76bec13b58ef82ce26df2c40332cfe5d678f3846505c1728b04bbb7dd907b8328268b7ab809dfdbfa02abaf4923aea1c3a43b47e7e0aa7aac9fa56834cfc76287e04d28839551b4f28bc9cb330caf6f339e0159fb49f554b145777f4f23c528a453d308026bfc85111c6c280c7239fee1e84b74fd1f5457b83951662c13fbde836b7568efebcf3d33112266897a67889e45c618dc20be635c14d2e0b0c77ec8fa14f78ddf598442eb81b8af0bf9d72d8903f8521c554ed6c94b201db0e669cae76ecd0682dde2587014db72febc1544591f4fc76a7aaa45584db5369147d10ad5d4f8d60f14ae926a58f2985f7dbd89b33c762767867d7b4f6716ba8978d660cda43c62823367d4606cfd04e6445a2c177103a1437d78513e4acfc33b585c2ec86d47afdf3209f2b58dbe473591b7b7455027b5696777b173fbfb8643be1465fcb268cc3f991813105a79a489796537b1fcedbdf7574178f15398cdb633ad155123b4e286f151e492a90cb2ab2c2751b8e4140c391968295b2679387661b6f2a830c0215e01787aed2fb53975cda6576cf36b7e276af85e90fada99e4b33552ed674183d497d6d035bea7844a430845d2e1258e181949b5a1227663fd472654ad0d212e79f20c6ee344ee67426044530362e032d0398e8d011f516972047d82de4c57a82dad7dcbfc94652a189d49050182c9efdeee2262e958f2752b3180e10c8d208b226ea1b119ab3c939f20a6b2dd10782847dea0ecf867737e8a0cda7a6d9b1153a0fe30689dbd2aa18502f9ded413fc423b8b5d5ecdf86bcf597d8466765369057c94d71ed12f8df092ba49dfa531dd7ef82a0a7c8744901daa9c25fe1239497619cd464350469fcf1bc679b262dd6ef81078c1295c35a35882c01c188b7112e5ca3efb9802039d5ed7d1eb53446a54cea5e377fb8580eef9d71e9dc224e1b92887915c7763d1de701a7988ac672aa428a5435c16ee4ddf169c2d7c608e0b480ea2111a07fe580a558687c22141a4ba6c2ecae9c5881221260aab6ea75f5a3c2f66a33e914f9301f8799a11d4fadabb9b216ca23d61d753243fc906d49c33c23672b56adf4cfbe0470d2d867a5a75d0fbe676063e9816cd587682a750754ce490c9378a12a75e18111d74db173d31496949f24560e384c7e19c73ee3fc6232fe440267f91e6a6e308551f8c3da99e5a2299de312d963ead018772ba68eef8f7551156111cd1aafc78a014902466c4f1beb855333d1db5ee4c0f308693f9a5f5a3eaaf57a9ba49c035e47a039944e8447b4b0543dd4fecab58ac036021130448c862030791be90fbafaec6b70f840067e1b885fd195c03a17f593dab4da3d604634957db6346f9d4bf9ccbcb1510003249bc5a58798e7ae824252fd3687b621b89605c8a09f74c8ccbe9955c895664e7509898bbedccb81c0e8c5e05a13f7775e67f5c0ac4670a142a2e5c98d105e345840aa0e8314050ac901a8b1cb54ceee83b90c8c06a203ca844680af5af2571d9499bced3504fc39b96dc1e25abfe80cb65ab25047881eb4e886e6999e515765f65963974b9262cd521610e64a3856afca0dd66f1307a4eeba7c1f5c240856df33b76f487ce75dc973ae61c0e6d5b46b405c4018f762d75c11cf6fc6a36a6bac3a0ba8858b3feea5bb71cfcd980bab8e5fa0687d85718af78c54af97349fa03c0f510a27f4f5363ec33fcb785f06b5a36f237bf99ba436171f7ff62e255c86cd7cbdf2c880e415ef966025a749c832c35fd842d04dddcd64b4ba145769104bf9a857a1980885e32fc04fee040de2894fdb4b6a638f5b9a03ee0c573f953548f767495468084f4230e4743c76e0c4e282cb74ea0405fa54cd3337297fe430605d278a1bdda40e5f3620450994de157542ab71187d90b32df3739a7b1c491cc844461939afca5b3c6f70f1b2f1d52cbdec3c63f8578a4faaf64d","title":"435. 无重叠区间","link":"https://leetcode-cn.com/problems/non-overlapping-intervals/","question_id":435,"issue_number":69},"67":{"day":67,"pres":["贪心"],"tags":["贪心"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个非负整数数组,你最初位于数组的第一个位置。\n\n数组中的每个元素代表你在该位置可以跳跃的最大长度。\n\n判断你是否能够到达最后一个位置。\n\n示例 1:\n\n输入: [2,3,1,1,4]\n输出: true\n解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。\n示例 2:\n\n输入: [3,2,1,0,4]\n输出: false\n解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。\n\n```","content":"096221cf5b628be1e73e8bcfe626c73470823d84ccaa16fd586d3f787f5a6e0399120eaab71a6acaa2c327b76ceabd51b4230a8a962459d2b221b53ea2e5ff2df533792a91c1cce34424c3a88cd2371574a73d037164857edd3ed52860577de733738149e44777abc0dc8e8268563259fb3a9ea0cc9e771893624267fc35f628a9aa4455720c26701ee65bf710fc6af5431b5ba7137f2031b2c6432cf3e78b301913114835df8e6c620165abcf63730135c58ace12580f0bf025883d738b4e0d36171b815603974caec0546bff6b742db47c875af9c10820cf28aea86a1a292031667151c4ed32b89981a833226688ef160a6bed634be6a2467985687b24ae6e73cb889e9598458245487e03d66bb7d11e5f6c82ff33834793e1c41a8d8955b45d1cd58258bae7d214c04f4145e57c21b6a87903f4b75888c36e8c9d72f122a7780ebffd481d042184cf0ce6a9874bc4abfdb4b894a2d44bb829d79d333a70726dace623ff8319856c103c15342bafff7e9be371c27e48631e38e778e0e1936123a1503c453d90e61509c92f71fb090a913309d496b046b5be4a05f9535b5460fda803136568e53b95881f7e285fd369eba6fef0a968f3025d282ac24c03c5bae45186a2801aca3546f8466d2c13597557f421f49d809aebf76cc790410cc1361bff0d7300f6ab045f14628f7f195ccdafff3ab6006eac5d579f22e85315ab74c97b33664395b069cc108b135f85d55d6ca1ad4f593862c47610cfcb8af7b8c165b0f6d59abd8c05eacc0884bcb5bf151a7051530ee66f93c6a7aaba47c659507c4596b7a2f6c9e370a9acd4eb9a4d723781779d2f2cf47ffdb41741fb9b54964b7173539f727514b4a2ad61ccee3107f3d7c5cdc7cad6d83014d22c07382d7d451508e6a9163bd4b77a147de374c7780be49322ee72a753b690051ac1146c04d84587bc6cabe766eca49a813cc7e9e213dee446dc99e8e7d911dd8c0dc240c3852dcf5a2359f912a0a80c50af7ba2feb249496c2495692591c64b3fdfcb7a97b32bcb55d28fab82eb69513f43429d50e9bba829fb1e001a3c90eb30b7fc2dd053757583b651bd27d83b85fe4ee7770dde828aa954bb66ea7a0f84a055d4c70510ee27360817a011cf5bcc7dd75ac1504481d4c4210d5fef80968b28083e052d5622665633bf85d77b6d0efcf2cc5bd03ea2b9b5d7290edf3688f2dd27d646fbe28fdcc6eecbd39376804f949fa3168cf8031e8cca38dc0ddd3a8f6e5da6e9781ed9a4449a3b9a6e270181a9de1032f9482fc8f7441b1de75f5675bac2c1fce6cb994378e095b943f85822f235889a8bde49d0103d87eb81ff9770d71273fa63b8462fc468fd8f635b1edd8bae9abba4e6a8895c0aa9adeed4b441fc113ab15f8bbaa8bb12ee8098cea23b63a4eb1589c475aad5f1114772b2f377379dcb7c6eac9d91893f7aeb9c3cfa2cd71ced67e14c27626184380f28994c8a55a1d82e342ab55167e64b03e2f33d5285f91f237c33c5b3baf2d59bf265e55561630fe08571da324549d2ab5ada6c66dba6e849d212090f67ac225d03d9376ee78f811288e0ee894a8dfc7a7b6261cfe305d05432dc260b77d55f558a39516e2fabf5c544ecaaceac5919fb99e7ec965b5509839b9337ddd900bb6b21f151723f742ba567004766472c55adfb759f90ba0d380525a9e76bfd4fc3da999ef846406ec643798d7dbb9e0a8d2421716b8ba326ce6c11fe56c5b719986a282968866c3b845cae8444dee5297fdaf0fd606e10351db5759006adf7aee0534061b056d8ded00dfbdccf2f29bcf80d6cff9b3bd5fcd46c2a986e113d2610a9a69cce444428134f2116f162ae5d65b12e704f0b324180ecbd222f2c0d02c3cb9b2c7725afa49061b66ea907013b89ceada1eee7a44bacc7f66bea0cb95ec43ea92e78f09985a899877652c66191baa945b9c8ad48afdf5244aa158c6c09e3633edd77fd9ec81f4da6357ccab2eeb7810ef158853f863da69d3163b985cbd7c8044a97e515c875e678845d4419f38fba3909ec3ad080cb26feb3dc68dabc79e851ccb860f8a1c35d0bc71c0e1658be45f5c8241fbd17b613c2245c22a3634da6f9f4aac1f0140d19b89eb3c13b2f1b3f4997f91c1f9e0bbdf3523580e8866fee6c07e7e2c13cd0b2b6bcabcf313023337fe367d46a00cb42fcc5799d3c1fd2a0382197149aca17be1c3077465edf9ccb2dfc1aa25717faecaf7dd388c9fcecb7ebcbe56ffb1b4f5caa009645a668ca28377d50692455efbca14b4380eba0009bc40bdfbc1edda772a393e1c82ce44180f30ddbb164a4a960c3916c2435fbfc9baa8b8e1c5e841371fbcc5c77faff238f66a48aeaa6a8c02de9457fbc63581947894ab577a1ced25ada52910c1c862109ccca8cfc2c0121ea74bb796f3048c33b0583d21da1c17dd733da9983f751d7ec2762bdea0b676d7df002a8614ca3d9f3dca46a962252daf95298bf0b65f30a12fb9f96841b4c4eab07bcfc3308b3540003821fdbf5bf29cedd429ec32325e8c024ff48ed856b59a261f233a1b6ef2d1d48d1547af964161b509619c4a3dc2f5739ff495d4b01695d60ce8a1273a29e7edcd0b66ddc07d67996c979b5f36f89495fa792d99da56a84e29feb2924cfbeb715eef9a041b9fd7757be02e0236c9eb03b7d72d72e07e32abb357b233747046b6b8460385059f0e963b6d38db39b8e73b8d0f7b5c8fb4764aae99ccae93bbb555513fd0471e0781715bcbdbe4284f9715d54a4f6ae63b5dd8889ff5c509fd29b6fadbf0db9f1f8acc0ced366653776de6ffa93f2a7f8735b3903276345cd589eb05428ffc3a2eb57de6b4b93f3f4d692d5c34b4e2191d42b0168b7be7dea03ee1f64bd0d360433d0c29e8ea175c6ef37de29dd1ad663ba58bf727e664f0b99b0bb7457ff4faa2a10e72c71aa85af8962b276509e60d9c29a62bb379fa352240b758ba6ac4c25f6e8dc07c01c6d0e397737abbee2225c67cdedaed1a56e3e82269f1e2db9b1bcfb1f2080fa89a4d6819386cbc5699e61ab0cf61488e5162f27b6a3c69bd4e1d47bc8c32f3c6628dcf45cca1f03962be52af368f3ce6bc4b617cf4208c5ea9074c4e8a7a238251cf219b958d2cf579e6d9f23ecef47ab913293cffff7e7988eece3823392e979d19d8187be13d422f1f5c91f9ce9ce7955a44e69341bc6270cd4595289bb9deb34b85ef5bc439a6f97bdf5b87c87ee3ad893f75d7485ad66c108fbfb5b0d786e4c56a47a7f18452ec762ddc010103f5904d60c9cde8cd1a0a810569de448f2da874634c245dedde561c196124b524c01eb3fd53f90d61941c4449292d1f35985e5ced08e4d6409a36133ec82e2d1dd81ae4f996203b1665efdc7d136eded579a3b0659ceda81debfee4b4abf1a4ed66dbcd798b95dc65b5de4deec9915a4d32602552bbdad642988c725bb01503ec3e7e04522979a0af6c32f72ae2121899e308a66b590a6ef5f5d998aa39a9e47e09963e5c2e6ba8e092de36db261139ce524597e224e3862cf0c60254360535f646e148e972851cafb46dec7803e24b20043187b60a3ff0c35cbb44afc9e6e9ff0646bd9f168c5d3134b6d361e9be88f52c567910a3630cf8d2bf62b9ceb4452afcd8efdc6ca888dc7b2a105faa8d785c4fbc18aadf9dc5c7d28a03afa8dfc25dfd895b75b18b66eb2d766bfa3d3d5cf2f8da7f76b4349268996b77e68d228b900728f84875ce3c5d35f9a1ba0270f930411ccaf182425f62404d5114154bbcf3802a73d082e18c177fb765eea1f4e47870121858be08cdc8de8c1f317c904ea635d7f7ad321ba41d1220f3b2f09d183f4494499aa056f3a32ab0d82541cb363205cacab44e4e89df3a493a4dcae69a17e375cfe7842e3d6240fbca7c9b98f98cafe449b674e07825a6ee09bc6fba2c9a5fd973d083b6ec30f381c254ec8b73048a493cb9c19954da1690b8547a46212917e32bdc82873ac949ee969f622df970cd6d60a1563645df5c3881f826c705d689aa366864eea6d6e8222badefe913569fc5077e8714eae8ad72bb7976174855d9c8d94a932be80cdca78d1e43b4e020efc71a1239773d4eead3b253451ac9b1e13817bfb0f5246142f003c30de33714c7e547f0d36b9ae44ccc22f219341a9fce30e1bb33f3df1f6a5159be129f81341979ef0ecc7b7c716652f76827c6dbd53a956f76c32e32d5beff80b1975d8aad6d5ac94c7b33a640e5b26c076626998036945445228e6fa9c9df90ec17b80e15bb13f119d2e2efa8892e97751b02a4becfcd9b2e421fee72025377a44980d598ed104c39a974e78588b019b00ff1cbe369f718a7c09c2006dc888b209a22992e0260b1a1357069cad01c8e0e790edf5d08da0452552b154e923f3f4af21d76310b1feb50a53967f1602a3122c6d36513f330d7a11a1b0f6fe964522badd00fd01378db22491ec783bf598d8f0dccdb85432e085c07e067075f1dbe52a287829c637cac2fd73e10e2eed05d2bb667f3c659a629287b23bf5f70fe5ad99abefa160ba3098799353d907c415cfffd3ada6a082682401c10278447efd3e234d8dabcaf449ca668f39642b509bc7774d334dee1c213fe203330fd06aca61fef2110d7d247fa7b77014863a116bd84aeb9b15408f8cd4ba2a9fe300fbb244cbef727bcfd0586a8f6af0ff3f8056f58396f3d331126027c5a677c6ff1232d38300a13987320354687afd86bb6578ddf598442eb8528aedbfdf72cdd5039c6edf1da2299efc54974b20c8a632e0d02d24f42587014db77dae950117dff4d371ebb0e163849716271c3919b7774f8d608e07a87ea59229c8b683d0e47ec2413305299ff9e02022d597866645d369c6282336380a4f89d0002b11a185b3c7c3ddce2e409d206878a4707e5c003059bf527ce623829d746bb5ee9bb4e8bdc8a7a0009d8597ad7e76f49f27f1c90e8635051e4413c9d92d06be175dc6f8aa4f1c7dec5e53ca5339c9892269943a447e55222e3a3a4626d58761f3f16a56930401858c8ce1dbe622c1d127573c3083604b46b46cebb5c4fb7d8c5c8e6c59937390fc76e6cbbd1587a9cc0e67007c987429701525215808e24e46b53bd6066f4f21a8ebd4b170182d19fa5096e5f73c17957c5a987a28d8bbcd2b7e606f2d1ce8b4bbca2f7c1595199e79829f42ba0159c086b5dfb2b6cd2511f50b0f5cd8e3eb552a0c76cf841b50f88063e3473d848201f716c09fee0d0b4e853785f2eb5c834438866bc72f13859c6033756869303bdfb68b39e609142303f68d815b5cc0f930a9764f52083d492a1c112ffa84d8a89c70f94f50f513faf9081ba29dfb66d0616e6d1619c94e6b0bcd9fc160d820ad8f6388e56d3a0ba8164e3abc5ba4cc502f308f445b8390240cda4134abf4aeb38783607446756013dd6af6a25799c662d79f322409e6719e8d01ba004699f2dd5779e8d918f3a8f16de9301d4a2cae2ff99388bb5cb3554179b629461bef61753ae0030b691bc3c8dc58003716416774cc5f6e7c7ae811d6f1326cfceb36b0a1a4440f71e250b21753d6b3df757acd304863b322f35786a594f2ffb26445c11d22541c56b9ddcaa80970f5d36481935f29b8665271ed9b63d6a34e2b6c0057ce7a0fb05d1bac8a7346f44cc807b922e6144150a298c3f38ba4d524d387a95c1ca2030176ec063c38329610ffc7d689bff973dcf504c721e8874d3c2ca5c6abe4","title":"55. 跳跃游戏","link":"https://leetcode-cn.com/problems/jump-game/","question_id":55,"issue_number":70},"68":{"day":68,"pres":["二叉搜索树","分治"],"tags":["分治"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?\n\n示例:\n\n输入: 3\n输出: 5\n解释:\n给定 n = 3, 一共有 5 种不同结构的二叉搜索树:\n\n 1 3 3 2 1\n \\ / / / \\ \\\n 3 2 1 1 3 2\n / / \\ \\\n 2 1 2 3\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c0a729f060673f505b5b522e56b895245bc1fc25180a945be00f4bd74bcf881c76aece1138c41ca862317adb14b89fb51d390f74d2d0445b6df7373c74a4fb467326c1405ed3688e624b4a0b8bf9a56322f6dba7d3ef82a56cbba2f03e529ce4bc871aaa14a4f1cbfa2be2278d9d47516d0c345614fe452a9e52adb6767e0a9d7a273952ccf82878c78bf32b6674270d68e6fa27796dc117408b8c96da744159f3d8faf374d068b1fc70c5bdde589f3498944288261ca6fe48b1fefc68ee4ffe91a245629db7235ce8d6e549536625cb1522a4281081813321afc3ed4f747fade6ce233d12cb22efb6cdaeaaeb728492979b66ac477f5b0dfc6f5b4ece1f6267a404fc13bf9f9b07cfcddc3e9aaf65a84c4bc3e7449e601929f22b44b4cb2d3b9edb75cfbf76e8c276894993137a99941a2a5266aead77f5c8c47d8dffd4d3fba1e78c693fc48d976a5e4cf35d40797ba6ab78e47187fbbcba25bee37fa4f3ae67c8a53f197fb55c827a31622598500e77f55163cc9477e4ecb15405db520397e28ed568292e45ee330545058880434163319e05d4f11b1898d9d36ec6a6f8c1aa61f1026516f558e0cb662730d53967288a02abd83ee9cde9a3f7b1dc54e56c1744075430f14953e1aefa36dc7b97b7e25d49844e0e48a5b887ef080a7a2fb67b7ca04e5b812e855f01d65e01e5fc89e40faa699851de56754d52cca506075559efca75b28b430e34787c5af375537d522a1f17d1ccce09397523b9deebff98934ba80e48a7bac6826ec998e2db96733f5b0e7efea9bdd8eb21c3e4f231cb58898130e442708aec3c06da965a71a9c40c726614722f28a4647ef9996d11796d1150525ce8f43c9e8effb0152b2541b88773ae96fb6f76c9629b47ae8b627c45d907d24af41e87a752a95405c98c3f16be44568458145c2663786561fd0a9d29fb51a6dc8f7fd03a2709f78be83d9d120cdd3292f0de0e39f16008351217004756fa639f735bd6f88edb08cf9b429750535a0aca7be798a226209e16a494c571ce7d510a7cc3c852ecc8ae172c5f1afabb2739ad106b92a81fef05b84c47d4b73bca54684025483ff912a11178bd3399e642bf6e997b8b26f33e9d650be9c0a347350280aafad12b514511602324040801e0dbfd023834b4a8f83cb91e30544e19aa84571fa1379717bf1bc8aafdf386abf375f75c42d3f0cd8162d7c0a5f12046fc822d51ee2df6398c2ce76ea7bb1afa2d14a4a152e28295580847839a9f8b727841c9c59ee2f98ad9a788f137a0d86b50d745863017bbb7139b9fcb49d2133d9cd08cd8a471ef2971cf4bb27208c576c549bce71dc7966a63f4c1ebeeef444bf892b4a69218b1355ee97bf7d286df4ffa3a3148c64c5f394cbac0a576ffb3e86c196ae4935063e3f6d4c3435656c33118ac816a8b04bd6bd106a87a5b1d68c65d3d9c9846865180f423353cb64d4be74b192a1db8518fdadafdf43efe9fb9f6f698f46be879636f22d78853db3e487cdf846edb5e43d0a7e948dd1d0b2b43aa1a4c03f90664d4ac812eacece99848a7c97e635067c7e705cd7b31fa39067de95e658f3159532290d3c766cd6c5228531cc19bd7e9528e8c817f6a13f67dd73e95a3939d05678e7a1d8d642e6767721256bafb7db8a8b43d240a0796e75dc5885c7a573303d69dac7bb28b8df63fff55be4c737f00c0b26d937eba27c191c815ce1a2a6e0da316a73a9ac3872c45ae7562aba9f3de7d01330e9d9b2249cedbfeb57f3a1f953c7d60da2ac13068a6e1e4f57b0be4e27df59bab7a665bf0cfeb86d20804246b1b3b327e3d0b752a0e10daa0e825814c01254d9feab10e312f2e2cc6e7b82f6722aca2876bba53aa301738a7e8afb6e1e7a461adf0c464f833b64bf032b50272f18686a9858b4e43c54ca9b78079b5cdb64b8dd05d589118965ae454c73cc66cfc98d3165ea5347dfcb2cf9e8a0ad7578c2387088c92276ebbbfc8dbde174888d716d559e75a895f481bf6948c3909f135eda0ca29f2b0d66dd89a68e175ef71a09af8c13d78c4776a272dd47eb5901555cf2cc96fd5aef9758104fb1e3f858787840b609d5e5aecffea2f16208e455dd8aa10cee3edd8fe35690936efff0beaeec605da98fe7ac6ee654a13c7b739ed1cf5eab68e2c1beb78ff2fd0afb9c072985404d05de1b8e5b5cb0f2317a373c727e9028de3268a3adce8b36f48404e32937faabeda42cc178e11f92ff2bc9996e4c3a4cad1ed0ec361246bc3610b64d4dc41c9d11490ec8bc06eb771e5b93b8ecf42f3d75ea2d4475b7df28afda2f6fb0afa0fbe1080ff1e15c09870bf0fd3a2a8c6b19275f5caf52722053d1afb66d9099dabb355b50c8269ad08e4a27cc0b5c3201a25e5508377503c48c122ea3370dbdcdf2a890aaaf1a29e38e3bb417607055f561013e648f35e0af8eb92b98101d51c1972279ac19b681af87a6bfbc6daaf7f3351f85ca295691528ba988c4a54f5b2e009ab6fc355797f6fcfb365ff3c9c971f36a3d9d873247b2db9debb579886855e495813b24b5d7e799092d79d2c53186b136e75d0840f1ab39b6fdb83d551d70e9907f5c677ef933ca34655e9fd9f97eb5f99d79fef21779ca3a714eab0f274dea03e57bf46b3047294f9157b2da97b55ad2ae077346c3244456b36b27d324e698ca831b690ccfdf1db3ee8d0eae7cbfa5c75b0a0c2aee933f5001840f404788f2b1744f9f9940fc5a1714054b4ede823e8dd092a2bd7d4725b40b82d1f8c724b126a7e5e05f4dbd9ee75a97a34d88df8731d7651752e5a880783f90770b395b7a54b93031998e3ea8dd5998b05187cd9c52b1b26f0f173ff7ca36b36f801230c759d8ec6c7b45f8fe6378c6c894f847fff4aab6c6323064ec595fbf18a66a0c71f72b12837f59fcdc07cf8124df731d5bcca59db59b8fa01146200bcf9d75c628bc0bd54d07033397e1a00f5ebd8a499dc4d2b6e143bc69246d05282c514344412d3f34a706e579fb4d2de83c124ce2c2ce97acb3e5dd3debb533f6a0d0a3646a9270be5dcfab0692fea1d8ed546e229ce78833d45cb6b9c2cd76b551b6543fd304c4a63aae69b129043ade2cf70dee877c62176f62e4ec6ea91ff43246f1e152b08ed2675d40ee2cecb3fde5ecd6e530cb3686f2187907abd0d744d8877c0199fd65d55e5ddb579872332e3128e55285019e831544a81c7bf123a96e828f678c5cc3f286c690a4aa3333a730371a878f7ea50507f295dcb0a8790ed8ffcf269059d9707be8fd30f3dc30dfc94ab35c1894608005158e1248134df967015cc4db8b8d1f359de8b8b968e033144d73376a9d1eacbdec5a15dd225429b2f10a9ced13bf3ed1ed46f1c73ceda818cfaba1e18b85c08d921a6dc83c0188a1d53b297bfd041e1973c757f2bbdad642988c725bb01506c89bcb5dfcf0a01d8294089b421cec8186bda40b95000362b92ea344d3e14b447e0992aa3c2a8ba92142df23ede695882f86a546f2b151262cf5e257116321d5f7544148e97285198be12d9d09d3e6de0452c035160a3ff0c35cbf205ae9e279fe4006b8bb02682961b5a6136509bec804308e615cfab830a248632b6312cd9dc352b40355a444f6426385bab7c6226362c1a4044087741df5739a93af08daf60939e9bf90e1ec221f7df74efe598d4cf2f8fc3a22610326ff49fac072d9e6eb7563bdccd8e33a7be9d229a06a07518857a449ee1186f25e83956de48051ddfcf6a47f44a623343c11dd84604c0164055831b68e08fe5d6b5f7f8abf011c901f8496d7c77d526f37dd06e014566469f83f92607cde55723263eb35ac10217af65385ca9fe6ea7a9d399b890a0d4a377fd4c0408b06306b0840e5496a7c9b98f98cab702d2214c4e9f0e74f092eebb9385ebe88621464320c359714f6c1a8dba0552d9c3fc8c02bf4da1690b850eea36549f6269f49b7c63fea38ef220ea6cc4de079b9072156b2d13a1c3c11fc446604668d3a37a8600f16d658922f5d6f6c12d60ac6777ac2146e783d721b7d3317ccb5d918d8fec6bebc38ad11490a8680b1924fc71f366c32686a0ad6d6c6745d2de5a68cf06fb1252075a7c1b193fdefbd28c9c93b98ad2602be246079f8f5790476c7bca8a63e6a8293ddc1dd2af7df85d4897c5daecc7fe811e2e316b9a382ffd5cc612f92d61b0641ca1f045197ed8bbdad5eed888cc682a0e0f7495337915d1502011011653f6879c80f942f05180e15bb13f119d2e7cbfdcc8b439956fd4863f46073149e5634aba92e4a9cd45858e373cb46d99af43767a9503bb22fe29b537bc4faa7623e80d6d0e3f24c015bd572f8bd0a7dcd3c8526cd0337c777b24643b43709aafaf45db2ca5e8b060bd7ba6bf373b31e1b036cdd39f11d4bbfca18eeda0e7bb11847f744f53b0af6d4bae3ba1ac4a55aa0a71aeb202263704285f4db9b969036589cd356bb4f9cb147a0174b872854b5eaa64f8e97b810c329788adb653e314177b9b4732d6122c234c686fa229ea59b45a9050f36415d7e3cdb7e8e5aa21b0ef1e8eb297c66491e7f0102f3d3405be831395a190d05d4af38991d4ef063830fc163f08e86bd6663a4db1e2e7a2bb3f2d7010e94d32238460dc98066a48374c7f8f0c2a823c39ba0bc5457683ee0f77cf6af3e567ff13f8c1dfbd92634b2b3bd2e76c85fe5166d3870bb571c60432196e23b8dff25577d2b2d11066ed1084aef09234ca8f30c2369004a63ccff3689807658df271af94682bb669c84342fa6eb89511179ea4e77fe5afe104d7980f32126c57fe261ac86db303a767f7d624d6b29a8ad87b8e4d6d402299b9fa1265e5d3844c261cf852eda78cf188f7415783eebe2d41ecdaa09aec653f8c5f0451e90f72d8aac3912e9ebc64da2b91595cbbde98bfefa2c9a0b509ae8f1b63aee11d21ee49188272c496e9da962b1ae6db5e9ecb42280ffccec760625c86167c9dca6d2dd13a87debe64e9fef9c2d7785ceb6149bdbcdd171cee9dc59f9ab4220464a1949c92a94a8ee327aa786f440aa41a8e39dda451f31047b04f4878bf076c34cbfcc98213dedcf8fec6e6f29d24a9af36cc46ccd4cacc51365321fedaa8ebf75c9bebd52617a14557b75f27e4b37481c982d2afd3b2afe89a0e2c48a572e46de5de5ff5696abf39441f5b3c0693b033652d00bbfeb939056705cbe2434ab6c0599cebd94916bf3bab6595f626074bab34bfc3e879904b06976cfa38fe","title":"96. 不同的二叉搜索树","link":"https://leetcode-cn.com/problems/unique-binary-search-trees/","question_id":96,"issue_number":71},"69":{"day":69,"pres":["链表","归并排序"],"tags":["分治"],"whys":null,"difficulty":"- 中等","description":"```\n\n合并  k  个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。\n\n示例:\n\n输入:\n[\n  1->4->5,\n  1->3->4,\n  2->6\n]\n输出: 1->1->2->3->4->4->5->6\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a3341b49540ac59ceb2e023044c6a2c91e1784c888f097f578c3c92372d8d7aa2cb0010e4c1585ef17ef24a6521cd79dca9e146144934e0a61c520142a4f9cf2bf86e7227de45b060cd413b5c257e87aa0ec1e5685baaf5cb83a6425e144214bc076a7bcc3327f92a6ce119a45a259eb5447f66e3a3f5d8622489169937f4c4f9c22d12780e3185cbae976b213552580b743420a3f77820794bf29477cad5876e8be61758263137f42c3069b94d1d2fd2489401759302ebd12431eece9afd6def5aa0c9e4046f8aab7a4ce2d3f20758257fda1f2af87768e4c07c642b125ac58aa32c0c6ca0afd1ae5afbb3c989213998154f2275d40f80e71849f13c267598b08360a73810a85d1b40a807887d965138fd4a2e856a8500063e4909964254e8961956ebed0d898d1db0f412d352ff6e74e0e3266d0d70dadb659bb7e401e6dda08ed3c59b8e1e946689b352525dcf82c2f57586a878f3585b54005872b09734b4af27d21a35535b78d13d95c2de3f38e23522e7dfd8e74b50fa43f65fe66d804457f4db3dff06030b4243e690f6d4353291d6fa15a0a10246a1cf0f6b02cd4582c87d7ff86dd2cfdac5ba5478a380bbcf3976259413a6c62cf7d3faaee9a5c24af16109510a5826db6313a1eec136df78977237f08e19c0c9f7207f0849222077207fc8e268cfd3a423f99a9c649b9873460d56ca30c6b268dd557588f75260a99f7f73f3cabc0a148aa98952715a27cccdb8c8ac3508fb046b97f1f4ac93d3eb3a1a248302ac628db9b982a869252a4c1959159391c737080e1169e52e5f7cf761d74c319821cae68aa73cc2421c9fe62902a2c0a38edde89200adcd6751ec99b6f1aebfd78b6f3386b4c1b9f584c1c7c2600973aa9df6497da38e2ae7a3ab50f92dca65ab45ad4284e91b9ac6cb69eb9775ca7a0937d9d2f68b60755860c91e7f847594c9f7d70cd3ed151cf90e08f112d98ea470c06322d4f12ab470794baf85b8ca0491e64357dabf021df75e44e110809f93ea1f1dde8cb5f79d15c63f0d05a123fd9cd6f6103392322dec55e69cf26c42d16baf40fe59749501f3eb4e5f0821df46bbad2f021873ab8044e8bd6beee18dd32e9a1bcac17cc35bfa52428ef926460b2c838bd2d30a67463d6c212e3b0b3fe1d8f5343f3f814568897e9c400c4c5ec8973cb73335a22abd34f6aae5ed84bdf7b307f84bf7d3c29a4ddbdaa1fb1365f1bb2b985e9330cf0322cd47a6a029fe3712abb870e0af9c5b184580a1b18a427342e5d89dc8dd80ea988ae606aef05c5cdc7e83283aba853d99a4c04af01a3eafc882fbb473d10c72d949b47a212bc44d47dd2f47ccf3cbb2fee3f1eef16747e79bb8a1b414aa1b963ff7f6e6bade72c3fdc4c8cc625ff08c39cfad65f2b8cc6e2d44eb87406cdff3111198e7cf924f24eef062c860b20ea33dd632785203ff1769b0db088b2ae7ec4f5035e00b66ad1420a4b9101ff2ea765b6d45a3a2f391c3e4937592076f1e69d5df2fc57c16428d43825c84865ffcff2a8a32725251ee41416463806ef3808f3c91eed98449acd47d745066f4c404e34b32fd1e0176ca52639e37645f23b5f8c447ed6c6723dc987553321dc452454983af881e985bb57539617f949ef80827dc3c20021a49463abdb20ea8c7dc01786824ffac7dabef6f120511728ab2fb01a3c32f21fa996ade1445176ffcdf32851607b304f3e575951e79030bdc678b52c4c0f16452e62751d9d1c9a3ddb2da6bb913ce32d788a7a80b5a1dd6565b31a51ebe83d46d4f91845e628be81da5b4d22d708c2548254245b2d0f6da1b2f067d063877213bfc6f2f6e4880205f3012f8e9c6650d447136a4afa1491b11e3fc8b02663ccf1da4d6f8e3fefdd390fa69d8acd52e880cfe14cf7ef22638aa96ebc5acef1157892084f7c661ea7c198e6e6987f647955aac8b548cf41aba6a563894dc46b9b60828330f0dc22fc177884c9c5055cda3375d614519d9826a1b9b3dc634e243d1ac8b1f1ee16317b958c7febb25b2c9cd22b8aacc6f993421924f6b62a1861cf186f2a935e32b46dbda20864c9817a1cbb937b7c60a295c3715405d543415702a6c7b2c0b3c47b8d312089806a0f6948630d3eca7433a6aeeab900758959cbf9ecc31153d8e19c5288b5aabfb0fe6d668cd3c4a8ffb7642e95fcc88dd66d0baf8a62eb94b49b922821689b663254f9996b6cbe5e981a7dbe070eddb9eb1f9248a43e173cc7275367a57132cca91b25847b7f1fc048f99cc06579e00db279b010f10e16b977f118c435ecc3e6d9a291af3dcac0a521e6d761de5b505fbd67512c6a24057a05284261327227017bb0598f277b2b7b7d664f614b3427c05bf71fc74fc71e92241cc7c663db1f0eb2dba6be2bce0a47d8105a9d51d211bb942fd75533e17d2292ca29b696a9897e79952966783c97212762c36e257cfd03764d10b72838d0389ea56165b5088a5e528d66d7afdf4c92a4a4fccd46a7672836ffd67b985bee4265ce510c05947e8a7443e860eaf8ce72d0a4990483ff907510255fc03b8e2d01c4123e452131c7e0e7a78f08e0074f0ca2ed38dce0898428016e8897aa0eb6ee60801ada5d9d3f04799faa5ef25608fdae258a3b3f276d5ba7708eb42ad097f94bd452f22a97b55a225e03b26767b10452828ae7432526da6be1bb6909bb5b8977be8d8a6a48eaf143afeee86c8a533f306180ce6042bd7651717aca5f206c5fa5b4054b4ede72abad50c3b6ccf956c1a12ff240593280a106375053efdc1f3ee75a939618adfbd3d49781f62335d88119eb5452effdcb6ebd874dd8e4d097e3f385f119eccdf590a83d8a42704bb0f9527acfa75c5f82e3b9d83c68ebd36dab465c922dd4f992df94bac6c686d0005d8fae3e5d14c850c871fff0e7098adae9f54bd6b719f46d7ce8347b925abaa622f07778d4511cee34d7c14de41d8e8a3b0cea921611c5c4767c2e2e3577af5e628c31bdaca7046596ab5ed112f50162c625b0c434bdf3aea46f336bd0acf16720d9cfec68cdde6c429dde9627d3e28c2e91fd1181c806bfd61f36affd26bd4b64ac6737fdec0d03484c2ce94617c59df02fd00c8a6288c7f9a2eb3ea23ad8527dbb6ff84a8d4dbb8e6df7d8fb21f93c68d8eaf04d522f1f5c91f838c813508cd25275e07cd770cce0d11c0e9d2f733a346a7b3438f10daeefcb864f8bc689ddda3533ac0bc7c9515b5aa07431f3d4258ed6576430935b648ddc010107c0c56cd07868ac982f5eb6e5680e404e3c1ad4672d03dd694f970958a5d15494148e869c55cde9e774f8a01cac6cad904f4c0c4daa44d6e09c72475a5ccabccd2c6a95194240a9b3517b3809d6fe0a11ed470431dce96c8dfaeb43418fb1a4ec26facc6cadc13c63714b78a82d651e1db701e3322bdf64e2982c725bb01506a84a1b383d74b1e9d7806d1a32486ab4c249e4efe15546a2dd2933a037b4ce047fd992db08eaaa1a40927e379de69528dd2655e6501151862af5c2177022d5304082747daf96715ddc56fd695827723b4062c035b60c3ad49619ee604fcc502d6fe1a0596b52d98f91341621c48dab5801f44ae788ac0ef4377d261b62c2c9f89292d477c1e174f3f2f3d4ef1613e6b19545f05180f3e8469c9ed0f98322d5fea436295ff0f07e620a89528bde3cd98812ac7a7ac7c587b27a191ef1b25dd78b61663989dcc66f1d4f95f9a52e627559a1917cab2162360a67e50d31c4d528ccf280ba732672756b979bb78218c39143bc6010b8ccfaddabff4fcd2bd11cd1cec1d5633269d6fba23976e082a3213cdcdaf2f0dcafe56447f0dfc6ec15417ba2c6455a4b610f4a79fdcbf99a09ce73ae8184a4eb92d549adf245496f58ceddaca84fe09977b5d42b8106fd99fc6a1bd84a7f39021406a7ebe0338506c1d9cad050dd9d1cda602bf108b430b8504eb2c078a2c77bdc27c6ee5c5c7a174b962889b499a8b68157d7a5de4d8a21fd9053f133bcea32a974ef76d15ff70d6d6b7c93132a7723bad254ee78aca2ba78c613d85419cc08fa87deb9b88c13790f3420b1924fc3db058de0ed4f3ad776c6758d5e0576e9a51fb0f0f6c3e2f00707090a886d1fad1ecd59e5215e346079fc9188b093037c18b2edbfa7178c25cdfed29b2135c978eebec8efe9d1e627838982272f84dcd11a32429e36450e4f40b537ed3a3d68ed4d193e668661c743ee8336443d44a3a111729619be1b69df90ec15180e109f46b44cf602eb7cdcfa132e17ccbe2381c484841a82618a0fdd2deae56919d155aaf6e502ba3f59570834ac872d247a20ab3b27500d92a30d3a2f249e203b8db7f4252315841d4c003cdfd20475bdfb3c6ae5038589e55db64c2ddaf45922559ffb7e11e36d87f504df1127f242a53273f527858a4fbada7964766f89224d70237cea34f9f953817fce1a6eecaddb50156f085a33142352b9eb7a51517413edb2bfaf3df63e8033bb205f9fd30006b2cd52c88adb23bf5f718e5a7dfe6f8ae46ef60c829ea159541c81581aa9efebcf3ab6d315bf40e6e4403e93e401cc3acaf91469c0ddc6a64581fd79223067e0132969cf7758cb2fa3aae1f8eaeb7564c116d2cf3e47847c3091a268006bfc85139958cb8f379cb986ccdad55eba02b3efe9c166fdf3fd1e565fe38bac7d3e9f93112266897a63ec6f85c2f818e0ba874c3041c45757ec6a5a14f78ddf598442ebb52c8acec96788b963d826ad437be29d7e67e974b2081e032ac956370bc259a1c4da735eb931111c4a6fb30c9acea0cae9716271c3919b77706cb60bd0fa772ed8f3498f7cac29b61c64d6a5729caf8fa083ffbec9d1b26da43c6282336380a06cfd04c6e5ff6cd7742751461b68850dcf8b57cfbd68b83ca9274b0b672d86e2c8cab1f10482f271940735592614e434af6b10272b2120cb037f1ca81fed56457e99a04d2d8583f52ad8d963131538b1d7dc9ca6d27c56f163b1c2d684539482ad5db3da0c765139e455fc0cebccbdbe622c1d127577179c7605646fa6ce4e881bd02de128e180bc636baae33b29eef5b87fadb07755b6393261178202a6e2a5cb16559f8269347295046adf9d3de317e6e356b87336f03cd865c81857d95aa1b02be21270f09661263467f44dd83bc58e70c972816916f9a9601cf9393c6f1b40615dfe6acc611547fd4ebe7b03f638c8d3b3ba8162f1bdfc75bfb6faf162c86ce8c02e80a07648253eccb6bea569a982b2da6cc89f4a1f2b217714aa645d08ff68c0d6828a1a14d6bba66eae394a08c8f96e792cb6c506f501c8030e5830b926a49c5a9025b44e317ddc5a8eeb602c39cda613d44c84cf82979b50a52e7bbb26dc1bca101d46163dfebab0a8c825410dfc71caa946c0158b3a8d43f0a253a2456dda3741a9f1e45a6056af7fdab29ac6a8155ad420fa9fdd21030bc914db1a6b222a43f5c1060f470eec981a012e70f4e29f32f0056f6647c2009a3a969dc784619f1adf281d3a0ef635f7d6b11e80191be2e29610ab06e016a2799a10bda78c49f0c1d148cb445a2e7a616b135c40e633c433808c0806491e6c8ab9316091808beb51c79ac6655c2d712a3f8f12e3bc8133bc8eff180927bd9cb6dba8f67279fd5418457be7c9f51d3c0dc6b124b360f30168471eebb292fef130122a1554a7e6e9270f9d3dac2f2bd34dabb51801ba592543266f581a2ce2d1858345cc054fa8ac844581d09374216b6c51039dfca26a881a3582071dd520a7fe6bc34dff6d30d084aee6c950ede5bb8a64744dbf7e09f4c6887c68abc811c52a9d6b0df319b697056a3ef5f849ef3de17fc173c49ff864016602451d0a8d49d28bb498c8227ef3c7c1477c2b5c69f250313205c7f7e1f9bbf71b81173911653956e653ae20d5b7d10a91e4af1feb3892e4d0a420e29502c5d409e8b7df2f8f97c1e50d6e8318141552a2f939aadf0891d804a96bdc2548d6d1d3fc213350e028444991bc7520e83047ad9139288413d2912c2ce2ad1289e4667b57f078a4fe375c4e05fd037473c0f797c3b3e36a573e574a809916e0b7330da6d71d056449f7e8788ed6f6a41b6c1eda1cfe257976ab6d98d0bde36dd69a133732774d9aa96e4d627f322c7b21a905768b6eb739e0b85e0f8536e4161d6023118ae2409f902fbf726be164da67ea29723117af7a586e4aa753eb5c32af173c096962e33b6c7ff77026cbff99ea332f195fa4951c37b4f4d4812f76e7b8fe313a801815a9b02e115bb5008e9047f8ef8acb8fc84a01fbc8a58deb82dd155ea0d59bdc64993587f6ccd11d515e10844399b7413f4711e4e275b424c7da167702ab0d5a6d2c23cfb1e4abf5bb1727b7a70b77f2c0873c35493ee01442661500493d71d7708b866142882e63da47e8c31171c0c8a53465532a49f5c6f262095fbfc9965fca3312fb91e875df1be2e365aa611cb5e8c4a4e1af2ab5718b4b23581cb07b7532470564095db1b5846e28aca2683377a1641ef01c8ce846b1f381dd028d575fd23cba9d0957abcf4a2603ea713b45ce947759ec5a86c2a0b769a9d550eaabc94a06eeef1b9d65fc2bb9c6ebb24b1b251e88787eca5a090457ab84e0521f0a4dd030593faeb69af2a28670ac598198509ca832e21e94de1fe90d400f2440c23c3ccd4f3549e402cb23c3029bbde8d9dcffe7617380e9cd9db6c2b1ea07ae5c42ed7fd910cf4ab61a47da576ba172cee629d219ce56fa10fef8c3c815ff355a3c7f5e2bde841df622985b0e9775ffd03f3ac6abec830e302dceb36574ded39e2631e8d8ef36cc6a16988a06384d6ddd9a9fa76d919c93fb3004280540eebb3727c54ab998bd6b3a418a28bb2f1b10989a92e4b1f3491bc308aafb005becb9ab7fd55320af9cbb6f741fe2af23a6b35463e0b0561791c2317a984971b43e6e51d638f33b0872bf29f1796fab09969ee801114821659a79be75264c24b0e9e5235c3125dae2b33a7152ba0c086f5e1af091f4af9a5dedee8f824a3cfa905aff425943e476a5eb7ca0cd1ef0fe1ad78f7ec472c2b0c67c0d50db2df88a9d8b57e4bd5914c54989c59b7a378d63d6cfce648453e773366928b1a3819575c0ca1837cda84033b308bd654b942ec9041f06cd709a31cd6b150282c886f4f2168602a5faa15093e1877ffc7f99b5995f06d4c00edd69ad4acf37c6356fbb6d19a465f230c3e28c41cdaafda8238612a226389c831d97d43c872912beea626ed9bc93d83de8c96e0b16848e5ed72ea51602f5f42bb394bdc0858a3dad1d202cdc6d92e6ba17043facce4bd2c8ccbec0e2d2c36030c6a1f953e3b2b4215025c246e5f9be0e6fcbf01a71d56ae330e169ed0e994301044fec72fc60d2d52bd2312ec0a5c3d8ae6ed2baf51de5c95dbf57ace6e9dadf86f53f89dc96c23792eac1ee8ea0ed5cd318f0aa6eaa53641dfa9586653342c860b052d23021c336fe6d4c278acc87cc5958bb0e82b4361684a382f1b687b09fcd6a8992d997087f35231c773668e4b49f048c64bfa762316e97fe05cff4e302eb0e4b6848ba3f396a5f1c3078eaa243bbaba8f1011a9b6c856bbca825721984a8339f97d75a7cb19ee51fbd658bf29d0e1d71466d0a119c875f4d3004de7421111254745af173ac163212cd7acdb6af8b01c289a58ac39a3ed507993f1a1b0b33d436ccfe8e11e2ef5615546331421f23d02290169931d1753204bef17c1bf693f26148445fa5b151f3753fd57bd593d6b49e50f59d0bf6a17d8b6b4f8e12b832a568b2cec151fc7dbfc574c30293e8912184b097b9de4a4e868316fa22ad862cbc8a647e0ef69b40c20b8a2a6b515455f6198d603a41d32c6a4365985207f1dc9ca5e5e265dd7fc2e731c4e36f9ec16c8edaf4c59692bf1fd32c6e0e87c802f4129d0d1dcc82901473d48bf44f031f777aa6ebab758ca076cba79bc0a697754e4a3d20ba24beddaca793f8f1b153d25ba1554c7","title":"23. 合并 K 个排序链表","link":"https://leetcode-cn.com/problems/merge-k-sorted-lists/","question_id":23,"issue_number":72},"70":{"day":70,"pres":["分治"],"tags":["分治"],"whys":null,"difficulty":"- 中等","description":"```\n对于某些固定的 N,如果数组 A 是整数 1, 2, ..., N 组成的排列,使得:\n\n对于每个 i < j,都不存在 k 满足 i < k < j 使得 A[k] * 2 = A[i] + A[j]。\n\n那么数组 A 是漂亮数组。\n\n \n\n给定 N,返回任意漂亮数组 A(保证存在一个)。\n\n \n\n示例 1:\n\n输入:4\n输出:[2,1,4,3]\n\n\n示例 2:\n\n输入:5\n输出:[3,1,2,5,4]\n\n \n\n提示:\n\n1 <= N <= 1000\n\n \n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a33409c9d41ad4507437e220640680895e1724c89803d7d648e3dbb342ab259aef3271decf65565cc7dcc696d1ff876cbbae05612460cccab0d430a7dbf155da73ec61261eb19f9674fa4aae32965bfa41dd20bdfd86d69b8fda12f0b0ed7149b04ade387740d978dd8c830a993628ed439633875193366c2e52a9b4ea372284f6de94c6e454398a51f1961081fd38ee7e3dcb46944a4a081bf7e479b9dcbca204015f0d0b0f765d06eb8b47ed8bcdf52936e9c8f4b9f2654aaff15a5e9ba139109f0d322899b0855a0c902387f958b415bd91027dde2b53246aa8fa0fee54c554aaef2fb2e2c3826b20b140deaa2ec67849a8f9940b04552410cd25f7f7b3ffdac6e8027fc37899db512cfcddc3294b3674ac20b2f6b8068185144cb482085bc7125fcb56bbac07a9b9746e022a74a0fbbe441342ecc35ae44c5c9da698ee0cad0e486ca909f15f24a593f067e91e4f7972b95dd30f93121734d10a620962182a122f43f0fbe9ee07cb0287c1bef5ca1511d523081d433140593a708ccaf1ee5924c5e46ae3454e9c94396e6a2bdfb8c26f0fa3e8222d7d2171ab7e5d15acb60299fed33cb4b233b4db65045a092b112a2c3eb2aa081f2dc7ae7c3646c080ada5f8e972ac8da9c39d6e7241555d847e05113319bd5268a94c66302172893ae98a0d7b4e0088ac433e676fec45be6c45908677caf6ef1128d42ffb6edf0f48fe4877f73394eef7615e80e34b7e0e0ca5f9be3e1efba803450741d13b2bd0a1b4c65580ff1d31c44b6b6ae8e7db4b2c8f151f7a59f90d5febb72445177c32c6c821cfd0c4eac5e465a42728fc37d0c95ed01bf1f7e771860233da87003d3b38f915347c4d5c8db2c2ed92837d69ac182949b2567b40d0e33f1c0f358bc6d8891e4f9aa30eb48f5308ac0c87fdfe3860ef61278f770e7847f179a8e001b7b3f78b8b400f694cae8d519efbc2709f785f701932b03dd15913467565cd62eb5b738f84a440f9674259cd5623ff1ed7a8ea12af25915353283f14a5a3e4240af51eda48f22fa02c29f7cd1d15bc5f1a31ce91412a9d021a9a00dacd3b37e820b284b4d10ec32a1c3c0afb4cbfa7450c42a12ec020f040c8113c25cc17cdc51c5478b249e831b5400e9d6d1ba725608a50a66c5a2d29331d2c1133900a6abda35b5113056491f69c6757e8b34830fb317f56caae30a265875f25c914f16e9a9d3d7c6b6f1117e38fb2830846b8b7786e46ad77c3bec46decd632cc9454c5ce3b7d945e9a7fe1d552ca2d5f9b2cbdeb2aee269d212309e9575e3579071e5bf67d1be8315d07b598c9ef1c6f528e67a0fe72bfa5e45a95f9bd2512277fafef184f3facd272cbcc61c3ab8a3b0d152f6dc09f7f6e690df4feafec8d2c67b54ff9b2ac9907af2bff36f1a6ee6a36a60c1c81100a6e4e3944e11f9f155cd60b20e4188aa59661d41f15e318a9b5b875495c62c0e34bb5d6ae56d1eeee43c50a5fc13224a3ffd82b5fef195dc75e674496000e8897ed7354e76d39a75db6e4dd987c947cd240a2d4ea9084001c93e6ee7838a11b7025b388df1f83f134b2a6f500cc35a32dc260854da5c49b7395e48ea5640c544ecaa19303e44f7d3b9ed06d29be01f7c76837f9c7cadc3f6ae6bde5eb2478c2e5c7106190e3cd1ec12e09cf665085db262220bf2f41a5b3e9efd4b0d36bd48044a029bfc7d914d797508d1b76cac467ead6c91d627cc35266d31b81da1189adea62f45867e5dbda9edf6b9887dae74b1cc14f188a2850b710bd46e5cf405b6bca0e66d54b787715d83ce156d796f2674ba276031406c98d6f9c9f68c967e281c7a25223ac56fb237f50e386f3a8281c1305070128c616bfc5b7eb20939e60c803ac7344844b24c63fdd68ef971c5adcb058802e716f47c3e917ad78e869d968b4f41c550beb89a71beca9f46b7f85061a215984dce38c73cfb5938607d167a96364bd9b3db90832bfe55bf3f870b9a9d1851ba84e1d5e5194ab6e513cd740bc6c0007446adbeea6114b97ffffaaf1cb2dcf92e84ac04a16ca6e0639cd1f23e54cf745024e815edb6b43654e92acb4dd4682e26e63d75dca3e0eca6c3565135fbc289aaf5536813270c33d5a501dc27b1cab24558506cf66fc28ddfae9c1c98917a6d7efb8cb94873ef67d4700470ff24528d6f452fc3afb7f77a956824de47f7b4c183c2003a16a27fc70bdfc4517c2a81121f2a1182d821280ee8378acba8669149916da4186117361627710625495f0e68c4bfae23d0dfcca2a27e838819e5b1ab9614bb1ab79f4bcbff04baec3debee363a669cf2d7eca9ef655ae37774bf92421895ff5dd751edcbc2e9efea488e4c1ae269047e69d1338435fdf68cc21f9e23aef11686cc50adedf56b731abd11b915211334b514886f7f9aa1db6512bf6f999ee351c1fa277c9dea335c6177d502ad564e9fc1fdcaa968a83951eecb5e9caf0a6ac70b35ff958eaf196f7ca90398f01a225ce485c41a41401878a46f996781c32c10c1ce30fd4ac3846b4093bc69fd247911b7fea0509b8933a79ad8c8745883e215f0b6ab1a84d5f09b8692a95168c9f4684deb0d771397088576f77a159b3123b265f3c56a237d5405a8120d486efc8f524d679d0435358e4c66d79e23db3b097e9475cb89f226ed9d329128f698aad09e838bb36bcda19adc296daf0155646d35439e2c486073120ccdbd706666142ea851c3b8e2de2eef62c2d1f0542f16be013afd4a5e714c09a43443899ffd5c4ea6de966568799d714b4e6ab0ecb8fdaff3e375c77526d84a42d7dbeaf3e3f1874eb90e3ecf9137513223905fb0c56a631e1f5a2403c193d3d3c5e4d4cf7939c378904bdbfc1782d8b5ff060f03172bb31d67f130c541c105ea34a93b99b7e5e98e5923177868cf4e9a2f1ddd0370bc9bacab68bf4e489141c1c3b263b81f98ab742c0873bca9827b25f0f9dc1cd11f7b143f7f05aa81d2cdd2d9087d725645e1e62aed18d8fe7860516687c81c0054161d445b0a6f4aed1feb76dd3a9f0d218cd4c2000f0f7e1f7c0391407feeb5aaa00671f141e5f606850ba61d9d621bd90e0ca213f3fd196249fc23484a65a5e8a41e56931dd5f87dcfe243cc2169e92e6ae50533704313401d162f05e22677e83fc8b8da8a936eaadbdfca1cde6324a69c5381e0fcd7a15d0982d9b954337b7fbb439a2e37c5118540284034e10d69f24c1bfd57b10043ee2098b5ed159d94ab84b07d20271089b04aa468501a1a1554045acd511770427931829e025f80737642eed44590555b37990477a993ce86d93dbe54b33f19bbc003ff0a57615f9e646b0b60228ae9a06ad6bd25005ab2968923ca4daec83fa3f145017cb4c7c754993bc2c24d1d012dd09013183995855fa94f54371c9b6afa9278649cc041ec9c684cb0b711ce1459475b89d1729fa26082a1dbc02078ed3c52cfad268e812f61da0be43f7e7e25db906d19765bfa6dcada2fa491b5bafd4661b670bd261698d26a546f2b515724cf4e256416341a19312275dcc5690890ed57c7d3c23e1efa554f4d0569a3f21235a7fd19a8e527d1f93371f3f168c5d3134b6d367ed7b5d52d42bd7c87ee8b646bc877bf1b2cd9dc676e1335511d0a7163304dad7c3e71687e5f0517003e41d25728a03ab3cbfc6bdfc588b74a499c73b29a27e7ab98d9cf6686e9a22610323db1cbf90626d253a87d588f84da76e3c5d35f9a1ba0271c98034483e163120fe839049b1c504f91cf3802a763220812e779c636b058f8ca9461c7f75a092a2233063e4706cd4dd61158d89b8d44ea1af41ef9706f66469f83af634499aa053f293fb544805417b22c2849e5ab44aaa99d99fed1f4c6ee3ddf054a5cb02d0fb0df245496a7c9b98f988bb017d2220707b70620bfd687f5e38cfac7e97513116ec30f381c254ec8fe3853f6d8948c4bf14de53903cb47ab6d54cc2520de867c73e5898ef220ea6cc4de07dddf20542d375dfede88649b467a5d7ae78966864eea6d6e826bfcd6b78f2c25f32f25a6710fe0d9fd01b7976174855d9c8d94a932be80cdca7ac0a00602330ebc31e109bd10a49ead586a70499cb13453c13bb85f026c576341606cde889d9de397a587d02933d23c52ddc31e9a13127b84df2ec4bf2f2cc04787a867ac0d41d5dbb1b993b7c74b6250399e3025bc41cd02f7223be37671eff80b1975d8aad69cb8d19ba86837130f659c332b06cc563b0b440939bbe1b69df953eb7b80e15be77a52c9617ce6c1d3b2699579c1dd6a651c1b49e5634ae7b8f8e7b34ac5825850ea060e79eeadc7758360f16fc855a44e9ef22e489b08658683a300ad3b9bb00c161a7e1652d4a34cc8edbb94e1a7d0c1a6440953981d892aaa9bee74832a56e4b2d4052bd7261e4cac0025764e146b665f3411eab0aeacc40b27ea937eb20737d5ef14cc8a7d3de1d3a0d28cb3f01b7cf385a33142356fdbf1f72f3b0620c72ccdf39571ee0475ac0ff9f4272a7925ce0688adb23bf5f74ba0add6baaee74bba298777c04e955bc847c8edd6aaddf2bc285d55ba4b361003f43e2e538de9d7fe56de1cda6a2c5412da843c47234570b587dd5f8cf6bf7cae52cbfca25673287631a7e535479d6f5c2a804aabb15871a5cc94fa00b58973849d4ec1aa7551a9d556228b6c97ef79e405a183d4b69264466f2ec2ea5f94e41d6b81df4ea029c10e1b586939ec87ef467886df984462fd068aaced8d3b96d507ac34ad1dbe6885b470c71e7380ae23e9cb0724f472cf4801f22fe38006179fb8f07ee0b7ec499897582e1c6233b7774f8d2cb41ee972e8df2998f7a0a5801983193f052185e6b35328e7d9de320c9343896e23776a58468999462b19eb857d5f7a147eac990285b1e060bcd68c8bd6da2aa8a068976258d1e46159167b6518171006c632351578a8b14678ae080c9f26c5c3e492d52505bb93049b9e5b375fe4d1df67744fd75377c0897624c434142b4f2c260c770d7ec79067d98e2613dd455ed79d8bcb8fab72dafb2757611aa9604b14f138beb5cfaf698c40953256dd1cfabc36cce1d754d1e89e287c116bcc5e7c7d143d6b0743a31b49bc3485586f2d44a4fec0d2155c273d15d43b234af3935fe6f67e88ab214ee02d74030b7467531d2d4edda59f11a9588a650dd8548f9632ef9b87d4b6d2251cf5cc8696441633d9eda1f93c72a5b77e0dba181606c5d55dbf5db8082bd3c6895da60a2524d15ca8842faf5a9ad43937ebe58de8fbcca8073c52aa4880cacdc517721295985360cd6ff1c994a08c8f96b5d7983e083b69079d64cf9c47996b42e683025b44be3dddc5a8adf75c8a89893978079202b15248a44202a3e0f03993b7fb2b8f4b63dfebab0a8cd51c10d58214a4c0210104f4ae922d6e2c3a254bdded2156d31745fd662cf7beba29ed24c555ee5015d1b8864562f29100f4ebfd2ce37a08182eb42dc48a90ae44a6434e35ae461258a025303a23a3e02788033b19a3e8a181cea0a126087d225fbc39cccd7b46395eb07301066ecabc2bc13cc897520c0ac1df09abcda616b135c4482c6e4330418ed464c9e6d2abd746420146a3be5f79ab281f9a9131aaf8aa043bc8133bc8eff180927bd9cb7ab38f5974bede3c844abe6e9f5bd398dc66125a2d2530168471ada82761f7615522bc5526373dc658f9c59fc2f8e16e8ca21d9331e1c25c7c66fa81b0c72418031e5cc054fa8ac8441b0f092a4207e19825358c9571a89ca34a207bdd0a1155e6bc34dff6d34e1b17d96cd61dd015fdfe13239ebaaf911c3dd3cec4b0814e52b696edf5728a735a56a3ef5fd6dba78b45b2176e0cac9d6a55732a1fc8daddb775fb4ab7822de5f9f8b9b17f170305a3c6bb869ac18c47d4d410568af791585351f6fffc579d9ca3f833eecf1e64354a8eef20680329969bcb89291fb83546318ff9cd186ee31db8436f27ddd6e2b7c71484609bbd05dd17a4aae955d2d983950c81039d08ceb4876b20d247ccda43723c1998c44ebeb56fffe36f91e8248155b866468a12b7d991e0b7aabed2e931c223fd41d305daf0f5dc3dff9617dde148914b756297a3d05441011c4a2dcb57eb7a342ae336b462d02bed98a5b52a38571e57d32db4584f956d8bc37633fe1bbe0c634dfc87b01f9253759b29a08272ba685aa579a2dca605673df49e80200e613726f7ce362ddc3df85fe79e6c33a3dee06d1063f5f49eb635a5fbbf4401937508041c0dea653983ac14a544c208d80fac50ed3940ac452b81e7f8f9be99f350b9990c9fb66ec257ee0c09ed875fdb4f29e5269210e4699bb1cf11d1bd7994e4300d83e8b6a008a5b78d14513b6348e51a8ecd2bc334fdbfe1f5ccba899bb550dc5503fc6a6b295f5097c54e340aea6d142495a964e131d47f5b5f5ec71e1e443aa4ca44216534f9beae966c333f9de726a741dd323af7eb9e27ab589349c2dba47a599985180cf3355dc21fc3e2d8baad2f7fdef2ce242a6bb777f868317565df155e1cdcdae98c09901bb35baf4f045d52c0183107e8f704c934ae19d0b50749778bada59a1a4186d00e2a512ff775566d45a1273642c156981a74c2310148140d6356c8ef16c4dbca714907a8f9796630c136f3c7f5ed2642c9659c297ba8d2388e5c655404f36588ffee5b37384cd159fc8777878ea7706a4671246b99d0f3cf6b4e0182e5841cbf3236b215201aa3151a964dae01e973a0a228ca2ce6600e3dcd42e3960bce75b6486a0904796e388b1798b65a0b2ff0e5db57b9fc28bfc751a45688ab0d1548ae67a66c50d7d0e9758a92719db87692d9919cecae35961bc36d70a8a9cec7b52c76c6d181270b054d00a462b7efb2b0fe48d0a2a2f799ac1b1ef50e28758b280f030838fabdce624e3f1b816cea01b5be849c84e28596b29dcbf72347498bb71f28fb911ace6039c80f56bd5a704366ff0d68d58402c2ec095f3684aa57d6c80de7fd5cab98139cf42699bf00484371756ca9bd608e4a7b4d2e6bac666a25937617b569e7828cac2237dc6f55f23f2df83870ebb4abdbb9402e8a467d643b77b64376d4977a56bb875ba5a176e700ae7e6caad786742a4f93bb0d341f425c11be8e71d384032df17d48db6ffc6663af7ee154ea09b3d48354291c9f6557206874235c9a39000b09b5257671499e1676cfa38265101fa4dffc3609599efde2e53b64a1e39bbf76867a623765400c6e544dced231c8691d932fcc3ab9927eec8c933b99948ccbf5be6d17e1a136f959240a","title":"932. 漂亮数组","link":"https://leetcode-cn.com/problems/beautiful-array/","question_id":968,"issue_number":73},"71":{"day":71,"pres":["位运算","数组","哈希表"],"tags":["位运算"],"whys":null,"difficulty":"- 中等","description":"```java\n给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。\n\n示例 :\n\n输入: [1,2,1,3,2,5]\n输出: [3,5]\n注意:\n\n结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。\n你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?\n```","content":"09613310c9d44c9fc671f2f8b95cc9aca10f934288bc428f6b084c70221171acf9514dc8c94d3999714e903c92212cae6ba2f2271af6ff83eb7cb46e350537a417e4ed8b4b5019138fef03227379db8ae761b071d48825b7bb65cca48dabb899493195462eb99e2b3d32087baf9ccbb330d54b24745ae1cf7cebb78660a609a97854cea8f087dcbb9927bf3ec115e47dc4f9cc2ed6260351cfef1a97422f355f471e7b101ea1c55fcfeee83e081662584cf4c87c9590bf63af12eb795819a1b09e17179e4d0fad63ade94d6af3759a9f28b50a374e46c3bc7f29a0b868282dcca7e7b721dfa36fa3f20b27f9a3de84eb230c51c949a573024566a5694e0243d6e40def99e5ff5dc90c581556e433024b99919b6d8732fd03bd9cbf07e5c26bfb260daef556c2a0c78047aa9883965f4be9910a50c4df00a78316b4f81dcb4bfc6d45e0dd30612d43daf17f9bb9c808d4c3ad8bc5c58fbc11af4a8f89445d66d082c5fb77a39d7aeb6258550455438b97268aad2cfd19176c5d5cde3e93e0dd283ae6190c096dbfaa7027a1787db3742ada6f3295c6ad11e084215df330135f07828841654a319c2ddac9071bb9fbd95dc3a5e7fba871c5024d1629d2510cfd94e54f9fa2ad17c70c58f75b7e2c1c6d764ef421f1ba8c98f6f77ffe9a63162ca752b40b1b9e9be70c86a3f86033002a869cbda717bee6158ac325e75ac2c66af5c6592b6044ad6cd136875adfb3e5e31a3e8ac1edd63a52d57613c9c98feebafa41b0fdd695b696c0617809bdb1b3a1011d4b5dbdb948ab0e8125027d39e00f374d1309e315714e3ebee3fc8eaa772e7f4bf457e24d199020cbfa4c59a8c06f069cc42b0397d684943c7a65f7abe2555cc887bdf58fbcd98c6d318b7231557448064c1eafcc11b2d4a760154cc253e0f0d660292ee861a47ab24599cd17bde8cc54f05119d8107107b7b2fce1325d2c19f557109931ffffa08832b11a8cc757e14d65fc024650a55798ed555bf1218ca8d64a2d3612d1060ffd91777b8fd13bcf9e65966a715b3fc5926d3788c4428444ee85a1ed7c92e25d27e7b338f57ba36cf8dda13307982aac02a0034bf38c200b84e08a359278fae67f7261fa6a5cc7081fe52009e6a0e74cec05ba5ea300ea3826b49cb626591bddd5c4ba73571461704b4505635bfdbc92235c66b4f68602de5810393c2aebe34f914f6cb34bf631a9f0e481c35d5179b94ff0addccfb06cd5e3a6f2024aff982696729430f62427d8754bff10bd500ac7e04793f1852b7849f1e780cb1f7b10a7c9f2b2e5d0b094cbaf04ffb25401ba67e85608dfda38d9c7e72f8e2378d2fbd9938a328e2411a370e81d37892bc7d11b5248b2b3f0c880f58ca3e00132c3ffe797da6cb64818ca309ceeff87684a7a100829d4f03a2e7fafa111aa9eb2140706ad9dca8e5452103c9deac9b44c32dd1ef74265a73cac39cbdcedd800f43068b0f309881a0a7ce89690b66a74e56f070056700b84b242153d78dddfd3d698c6df11bf662a1d34a7c6489840761da38b0fae7e0787978d0fc75a70122fcf382e5ae5630ae5c5e717d1b0d1fc2c9a9e0d4b1839cb844ee72552df417d42a30250ef7f4d23769b85a551aa0b72693226a9c5df9137b8000f95b915d671d911aaae9baecd887efed651a35f5338df9093d2ce16eda6ff67254976a2a805d8df174a03580e9ccb811dcfb4237fb28e039020264d6b85942cc15739f367c5b407916b3d036aa07dfd21caa2817c1ba6103ba2ce8dfafbd64821f82b974acbcbf5b460383fb6324a7bd23fe1d3f53f24a7ec0270ee9723ebfdd76de84fe99ee0df8a011196f770450e154f1734741a921e22964b9427590926146db105012e3832c5ca83214d15a3b6a663b564aa17393b87e2ac90e3e7a445a0c9fd6bcf1bb66af03eae2f75e2af89a2a9886a4aca449db09d79b7eabf4697c351578514936e0bce403efd7dfc9fd0184eba376bebbcf4a38320e254b83d852e859e0a4db9b0ff173f819c244517e44ce85b905d6e2ff3898c3a25fa3dd395ca18d9b1ed7ddbbd7fe170e5b94ec1a0f06409fd380d1678bf77d7cb0e30b320b9df02e1c9bfe61c75d59fcbed90c89a0002869eb1e5b36f0f6a0ab6987410c84c9fb3f2a347627565df530ae8c1c604df5e24f5c4f2784833e870cb71d6490873e22458af75aa954c67dcf505ff5c4dbe6795c0fdc0b01b4b4f972d9d07888c5bea209834f6a07a2e44212c01e60491c7bb549157ba6da502a5e196ddbfc806b8b4a10ec17e166ad544054ac4de7ac2dc2fa9010f10e16b8d756fcb063ae6246da22a0bf38cfc474f43283349a6ea41e6996e56cbb04e57fc39db615622312647e85bcaab27e69db7cd4eae51e1397e16df71801b6aaf13e79a5dc991e02d3a3be84b9177670746e328e8137bd9f1cb298a242d15659f0fc1bd5178eb98001b34780589670b319a90a0ccff11ae5b3edfad029c30e6f516ccf614081241dcebea2e936676fdbdd87e03c6195a88e0eb6df573ae3e412e34ce22ed5fd61658adb40366f249e0e0ae7e5e1a9804ea6da9d5b7d634c219274cfdc8c501c28bc23b697761d8e16bf46968eb1841139a178a43c7731595303f9e65f8e969205d533d8012165d6ddfbc51404e910e3f36a36c65e8bc2ec1090934dbe25be9a502bfcf0be57cdbfcccd7cacaa0ff2cd8fad0e76307bb702c6539695ffa705a2c001e6baebd390e43407193338c998f68a8ef6feed3c24f201d920319fe84cc302b22ed7541ecefc434118893c94be0178d7e131338754f14e0c1e2eebd36c3f2650c37efb1b3fea8ae973fc9185b90ad541b3e68d84dc284411c93af91994395af75979a661b63782ff077804ed9d81482c594fe012100260bbd1a71f131e94cd133e8128e388bbd230cc40a13e3b10fd32fc60962bc0d18f6bdf304f7b44961934ec9c29a55b92497a97e24097f81ab894a27d5f6d227c011563e3b4521a98aedccc6c102714f5746f6e61ff81ad0cb7e5e7e678fea112f501a3076562a514bcb0ee870f23b9702239af3ca2607007c017d1e924e42ce7d6667902afc266043c5ec13c079b13840c257729e74accd54c08834437829c171674891926587c8f47d19977ba47a49aa7553bc5c303b1c32d4cab86f5dec5629d049494b0368e90a90753151951b011bf2fb77cbbffe8807f6c338b8d768640a4bf53e856e7ede79fd47603b0283adac738c9333c5d940548456a817cc1858fda2fbc36db7ff80ddf042ed195b95d6bfc0c232cc00417e082839fece07e459f21d3de272cf5e82946fa86c19b2de8c95bb608a23fd2c51fac37c813a341974da1a57541416c9a09129a4be5c4b5516520b5f9e4ec79d16d6974a4918b4552aed3efe88e30a43284a4235d1844bdd932ee46128470bfd02c3d7226b7c5e8e001cbaf3b7a4386bd1b94f5c817eaedaf87041241521ceca17a3b31727cf0746e2be5ad65ed3d8bfaa076cf1e8a8d02ff1262cf32c617b7f2993ea4db430f1dc4474eb97cf893f1f620793d9e3c3f796cff5a689025185d35c26884e2a54f8cc6c92bca797c93d3aabaf0e1bc03939f45803deaf4151ae4952d5fefdf1a43f2e37dcc87e870b3125c5b82af50da5ea7759a2feb5fdcee08bafe9b2a835f5accf84d7ffc3aba9fbe47190bc203aa2c2ae25174d0271e6d673ed055f8f776c227d0af6172f1aa9d7bfdb321e0497c87002b400b6171e1cc07a014dc05c8a02efda559fd83227a4e3ec6a81c0068397fb190882a661d8adb79e45f3269bb27cd5c9a64fc4e550080b06f6b6a84609f94ccf068e83bdf820d090189d6d5aabfdc558030e496e5d3186f8efd121f04e92f25de3f0a387a412e6a5a3c0a596bb9aeb4d8609292cc00725da9e721596c486fdca5756446ef8695a47860676f4fcd6b9afdfb8bab03a5f443a8a40761c7e64c8fe7e1cf48d94c04bfc4de8275ffe3aa4311d906b76b1e8293ea7ccdcfa69a438bfa307938a6d466a6406dfe9881fd946705d689aea28d24eb2223c8276fcc6aca57e60a77a77e8714ee8c5852bbfde2f2085149c97c6a233a6818ae03e90a8680b1924fc71a123972b9bbcad453834459db13413817bfb0f524614664e673f93ba819ab6deecd9850368f86c079f8f57d95e7032c89a2e9af22139dc5e9be729a05c139e9eedf1c7ee88342e316bcc717cb4088356f76c7fa27e10efe4170475c9b1fcfffed193e6682a0e0f3ddb67023e98512c16444f28a8bfcb9db01dbf00929c409b3f119d2e2efa889da038c72b8cc73f1b1c5249ff6304b2f5eabbe75eefe41d16be675c2beeb0c737c621ed7d811bf94bffa67c44835326c188af14a2399b8126161a7e1652d4a34c89b8efdbe1f599d4ab431311b71dea37e897b40bd76310b1feb55779967f1602e65e7f284e146b665f3411eab0e8e3960b2fabc62aaf4464f6fe73ccb8257bfca9d8808599f01b7cf385fe1b42356fdbf1a56a685a35c62ad7c2d762e81c669405a1f42a774271ff6cc8ed981185ae1fe8a4d7e8cda04eaab254cbea3cd5018845d880ddb2fdf3bd21041af61e62594cba2404538de985ff40964cdc702a6c1cdea92202730a7ab4cfb239cafabf32fb1f98e6f07f6e2e7004eef924698f4551348026bfc85111c6c280c730b5e30084fe0185ef6f23ccc7167fc17ebdb136e856e88386d9d33112266897a63e94ff1b7ad5bd0caf288f504f000c77ec8fa14f78ddf5d40160ff06c2eda2df77ce9b749f7aca4eb703d7e67e974b20c8a674af822d6df46cc90103e262b8db7e4591f4b530a7e3a4498497167f536b19c96a4fc44af14ae926a58f2985a09391d776834b76422f9ecbf1123fa8918d3e438843db35232622204f89d0002b11a285775f681421e5cf4acdd3a267e1d6c4da9bd46bd7f3209f2b58dbe4731f542974580c7348c67c601e64e09b4e3be1465fcb268cc3abd4d52d11e9c84d95900f4054ad8fdf73741ad07939c9892269943a447e1c642e4577077e949902ee8e6f39dd040c859d96cbdbe622c1d1621b6f75994a4b46b46cebe781af28de128e180bc636f8fc08fbcbf43f87a99e4b33552ed6261369012f6f466ea33d0ab208fc4b2f1e21c2c1e79b395d632325fe11630ade985cd0c9718eee3542fc66380f2b75516c467f0385e89644fa1b906915963cc68b2fcf89dedce4e30f1cb989d2c6531d2bddeff2fb723bdeda6565d5594314c3c108fb70af0e6ac4ce8f55f2443e60820e82df05af5a9ad47b7ef2ed81f4be9c834e340dbd62ce8fc7ef743c46acac5c3cd135a1e392bd8c82d4fc83d52d1e24277ff9648b8f0099310dccd1470f44fe17a6d5a4adb773d8f5e26d3d41941ee52179e15252e5a9f12b93b7a76687686384c1ab0a8cd5551f938a14a7856a4e48fabf8b64736e33244bc0a364139f4c00f2373c8abec434ed6ade7fee501583b89e4375bcc308e5dda35fa44141102ea61cee8acd846ea6431c70a7394016a077756e3889f472f6380659db8791f1a3a08c2c1b38713bc202c2f0233c6974f33f40553dca862ad969d5de00421a81df59fe8fea5ff22fee0e633c436e4d83d42bc3fa81e5c7084a5a41edf2132dcc7d5dd8c66aabaeb46d6f87412781a1a59e947b979e65a5d522669fd5418457be7c9f519a8e886b400e620f2d16946a87a82761aa4b5522bc1369653dce57f8c39f84b1b53ac2af50da388f92543266f581a2ce2d1858340e8500faf4d5445514232a4255a4cb5e7c87d742fc81e7117671c0521b64ccbc34dff6d34e1b4aa4249f519515f5f657278df7e69f1e2dd3cf8aa19c1c07ecb5f6df728a735a56a3ef5f849eb79741fc0b2054ff975b7f732a1f95f0809d35f244c9a866ef217c047bc2f7c6822513080a5c7f3c4ddefe3a92573cc3165bdc20313aac0d413812af1603d2d4b3892e4d0a420e29502c5d40d7cd7db9afbe645b0e82a625ab0247002f939aadf0891d804a96bdc254cc6d636090186f6f28ae44991bc7520e8304289c028b894a177b5791c0649470ca6c27f53f2da02c9347c4fd0d943c463c25393c7b7d66f559f47dbd0f9020786a39cc6d77cd040d8a00c981e5352b57aec0eda1cfe257a609b896c96eda339743c6752263316879744e22d662eb491bfb65c5b849851c5c855a236485237c317cd5ff9b11b461dac4174bef09828822d3642aed9db32504551aeb1a7e9e8b6ad3490e130cedd0634b37dad9d11b744164b97605fe2659d2724b67","title":"260. 只出现一次的数字 III","link":"https://leetcode-cn.com/problems/single-number-iii/","question_id":260,"issue_number":74},"72":{"day":72,"pres":["位运算","回溯"],"tags":["回溯","位运算"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。\n\n解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。\n\n \n\n示例 1:\n\n输入:nums = [1,2,3]\n输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]\n示例 2:\n\n输入:nums = [0]\n输出:[[],[0]]\n \n\n提示:\n\n1 <= nums.length <= 10\n-10 <= nums[i] <= 10\nnums 中的所有元素 互不相同\n```","content":"0961361ed7da89d7d9328cf909b1643f65529601cd9d2cf27f683e5476b6ecbd9e38e25a6b8bbe107d7e843ead282c9c6da1e6341df5f0587fc873d662630fc974e48cea47384528e3a6066c0c4d8cf9cf2bf95e7425d454b064c84638532b43aea715fde64153a7ebc9849f48914d66a45e8ae7beb81f4696163a45a16dc349ffb42e24404b4e4c7fab4fb041fd1eb54445098d77252d5dcffe0d79f082fd0e4d7a303069d2c32b4566c1170bdcd80009c989db21b795aa375a974a37a90499901716a6650e927aadd75c876de7b3b5f0019436496d2109c2eeea9720503aa33141729a50ae759ffd100cf59df684e828006dc35e79e5a2476cb8664d2b4bf1d9e16b54790bae5f99e8de870cbec9b8115b69a57be634c152160fd27f028f72d1ec38459f506334c552a9dea97aefe52dc534279fc84bceaa7de4c74a66cc7a958a0f941511507b9faf53fcc9d84d8edaf1d2c99ceea546d275eef170d48715146a9c2f94de08d133065f6b0860e7ea1ec6cc17a0490ff75a66ce3fb0cddc1e26e4252ccd36bfc1190bd02d57cb042a9b3127c199bc71bb804904ff5e58474ff08f191d6a53e52ca382047acde9be04f6c281c6cb3aef6d26074d58e003e1a4e86e9f67ec12af637ba3fa0845063201449d42c1d2c0aa818a558cde516750ba1fdb357303dd8c2bc1cad320712b4608cee1bb70dfd369cfc14bb4565fc949eac45e3e6b638c63d23e817ef45f67b05e8f2cc0d1c33a54deb29a8c929f5256927ec696d8d7e583bfb599835a396723c2cfe7ed9b803682c6d6147f1d18a1552299a0eb7f444a737285bbc0d4904ce5f68f3da24bf48d4bf55f63f7e04714d685277dc0d500606a070f520263e0e43d07c6116ba29ec05236602aa57128797f4c38c6d3685ab40c1348f0adc98008f4afb6547676caba198b3ff1151caf329c88e363511fc8114934bd8be50c8ccce9b84f92f956bb02612855f830c24504eb5e4db245b68ee62f922b7a90b23eab71435baf8dec8350d0a5731680b518497b938b28e96b14350b83ed6450074d42945e2adf905fa220655202ccb32ddc4be357a9fb993c1594fc09bd6b8bb81efb3b70cee13a059f032d77c7c7d48c3e5ab686bd2a7908724cba5875e907e16b5bf15b4790eb26a85805fed9ffa67f4c3a62646a483a6e54c7819b077f6694e08603f55b3c1b3327d5e361b78437a330bd1be9aaf5e68687feb203f842d3f0cda67cdbc492fc0e65fc81089773a130c73023ec55a4ab1cfb3d1aa6ba7ae19ebb5926608391b38b576642c4f09ceecc89c88885d215aadb415de05a821718bb8e009a89f744f1183fa0fc83c7a171f4147de555b27f15c460e181425f1ec993afaeb1a5d1878a4022a49bc7d78f64fc112c5eddf4f19fdf4feafff5ebc46a73ff9213c29452f097d86c2858e49b416bc5fe120aafe4feb2431ccff062ef65b933a43ec33f425b01de3068aefd07b72ee4ce4b5035e2046e8ad5d92eb8201efbc34a506856acb8ff9ccccc9e4c810b483766d3e8ee4d84bcded39b47d8794dd798d841d330090e55ab127000f1256df4a9812eacece89d48b3e27c435567e2f10ae44638c62c0b67d65347813b69492c9cccc659eb63640a5932c19af6c25faea68b4c4919ea7fd90fb6ac97a80b5190761bb4670341646a1156bafe7498adb83b390a3597e569fb89727b5d021adaafbe7993ac4b108efe5e9d4c717c02cb936ebd587eae6192ea3b08eff5ffaddc64be5edde3f16c44e11d5fd7f3f1a6fd87392c87759001acf69e53ddf0b01ce78f3b891abdb2f36f7aaf846b4288c93caa87c4244490254d05424182d1c1c218191c7e072f751833fd6d04e916944d2a014ba2fd5e8a5164024986c939f9d2a26b292361b66eab240d34bcceaeb0d4ea8767a6f4e2b34db271c1543ea40a79f6a98880bc8a7047ca5e88b09d797147339f156b943d9a41cc704d91467132e4450275157e853668dfbee1888039d698e732e15b9fe24273e9d8c7a2941201e8d141a879ae289f1d221d8efcaf537be15f898aa27ae9c88776b324dc27c06063bf1b6460fbdf4d77721a2ece7db6b43656ef24c748e16b3320e71341d7a2e1e19cda92d99df8e08dabe644693200c3c1796f915fe1dff8fd0f600330f73878eca8a73fb50c1cbf82f531292e810cd128a15d672ec777318fe7450fd7df0c72c956cf8011ec536164074d9386d43ab64bf0010bece2fe3886dc4d090c3440266f8004d2ba923ee05bd025b0822879f2848aa5be6ffbe20ec04b0669e4460954cbdd47f6d1128c2b7619e665ddeb801b8dec62fbf156adf2765a67e989ec94f7d10b3ed924d62c561e20c293779002e086aaefaa56a1460e268a2012031af6791ea213441cc8b90e8a678e3a3800c60feedb6d70149310b83e20340dbb189a61589eace97eda21ea9586d55eeec0cbfe2e2c961033579a4694e6a1faccb8b8b90ed42918b4c53b064b8d89160332f72a4b5794b9a460f04e49a3d7ea54296ac38d01761be62bb272b9e9abea2542ed09cf7349e1b45028f22aafacfb2a1755d60475df2d1d105cfc08c7a09c164d6ddb4f400c372f7e72ccd7287ea49269cd82cb3c98119911efcc6da6b175ed122ed0b897c2e859dda396804e2494f0e258acbcf2568df323058706e05d70fdfe0f6a70c6294bb32ab232676c66020b6061ae0c7b1138e3ec5dffc398e1efd337f3fac0b58eae0927fea0d3cda767f5534c01a6502ad7780755f9acf04bc5bc715154a8f1ae22ef9013242edc9a674e46e4423d9d7e4b5c6a755e14bb8ea1ee7de03460d8deb13453764c27385dc95ecae25466b694f7eb02de320599bdb9d6d5dec80e027cd994016263bcb77db129ee1f64bd44706872ced7dae7f321caa172de728903cd7eee1ee33e6366030bfaf6f5fa8f08e64ad48c648bbd3b3e432ee77bd5cd56f5490602cf7e9f49239c88c68c6b3b1187e3507c04895091f5bffc91f222774a4419298ab9ab8bfd27288942f44a65b7fcfda3176ed5b7dadf9ffc938d82ca659624e245ff13bee55f7b0d9aa39580d6fb882987de626d3702c2e95c844a4ec525a96fbd2fa7866bc9b606d468199793843ac586c9c97d7b51c22db460c1fe57f42ddf60e7e46de8dd73c09cffd6ed87d5f9ee8975defb00d5c1d8e1f750ce08f1f5c91f838cab3555e70f275e4e8b2541d6494393f49db22eed20ebba43d467f0b3d6f867edc410a8caa3153bcbe44bda4cf0fc3f72757d0255b474725f021fae2e9c9343104c1648ca16819189d69ab33a569da00db4dad41330de5282c7a36684934957494b48e877952eb1df3341c4449292d1f15bdce5ced08e4d6409a36129b8dbb2dd9bc7b21c817158f72f0da9bc9878b9907d9a3b0659ceda818ce0e84a41a15f12974da6c1d7e8318f08099f97a2cd68d9f9265f7f2bbdad64298ac5279101503ecce8e08d815817ce6906c2ac2c9d9c4c55e342fe045422799b8c7103365ae10ab39049e5c2e6ba8e092de362bb3b58d1b12d1a6f625b12308e4227604b251d1b6d743e8e97285198be128b95ce3e70b30044501434a3e20c4eb69e4afc9e6e9fad4e6bd9f168c5955c196d7f1ed2a9800040b2788aa3cf4f6a8e7ce37c7fd0d57d44133551594f3763741da532376b427e5f4c51003649c35734bc3ab384fc23df8bdcf0155ab672af9a37fd8198d9cf6686e9a22610326ff49fac5468d228b90021dac68933b7cb920fca5eee6355980509cd9a51122cc239049b1c504f91cf3802a760703650e576eb66318e3107429343118f9bacbcf6a7a881b35d8852f90c4a6669ce72e877cd441a2f266cb5e0df1344fae5417a755acd0481141dac7c465aa1a417f4a9a0d6bd8ba09da869f55e600ce56f43f99c3e7e96a7c9b9d9dd89aa0b80354c428f136fe7cadcbbba92f5ba902051422b975c304a600d9cb12c00ed96829204bf03f424588c47ff4854de2c3af4867c73acc7daf26eea71c49052908c2e462a3e18fdca9335d946705d689aa366d00ba93921d077b598e3917e34bc5077e8714eae8ad72be1d22220ca0f80db83af32a4809f8370c4b6760b4b61af6a8b239773d4eead3b257243d49b165acf2ffb46525b143f1b3376dee7d2d9a7c3f0d49e6761e36c0c94c65ed952127b84df2e92fa6c788f159be17df6500dd2dfa2e4cee5ab1e2e316bcc717cb4088356f72a7db12d53a6b65f193fd8b7d6c5e5d1d9e6742a4014749e38334a98584345445228e6fa9c9df953eb7b80e15bb176579d2667fa8e9dee669537988e3b46151b12cf634ae7b8b9b2e705c5ce1d16be675c2beeb0c737922ff46ed25b8e40bee337018c55209bf3f874ab32b8ab26161a7e1652d4a34c89b8efdbe1f5c4acee106801ca1d942ae8deaf218a4910b1feb55779967f1602a3127e28371a3b330c7c6ea8f1aba89e5f26b0ec2afd01378def0ecc9b127bb5b2f2808599f04939a7d0f17f42672a88ea8f6a680870cf55d897fd70ed0f57946fd2f449652c69cf06a2edf27bbfa461f6aacbe8fdba48bc389c22c00b95079d5bc2fed7b1f2a0e66f2218e942364b29f43e6d1cc3bad1bb449e1f8f2464502d80ed774f720066efc8f73b8cebbf32fb1f98f2bc56693a7037bc9d7014c00a0e2a8806b3cf0527cedf9fba379ff31b84b340d6a46f678384167edd3ff3b736a15db8c2c5b8da31490c6897a63e85f91261d5c21ae6618f36320a0c77ec8fa109378ff590086bec52c3eda2df2b90d535d1338753a529dced379e4b7be2a632e0d02d24bd63870900f67ca0c1524599e5b52cbbe3ed408d974d0d1c3919b7774f8d60a544b973f6c721cba2968be07afe10242f67cab4b35b6bf5bd8d660cda1eec282336384b01dade507e42ea8d2356733e73acd52899acb26be1838a88869534aee80ac230729ba4337331717ed48897c07b90f0c9b13f19e8fd5ff655c10ca6073050d50a572d029e146dcbf88d40126aeab1c94c7913c489e4de02f3f3ead9e08383caa5bb4f1fb36f34227cd56a0697e3f8c2dfcc08ccd1e0dea6f934f48ec219aa56454435ae118e341c64ce58b3f8b97a677ba927602bd4f6d89e1fcff0f9cce7e7f38126a98036c046ccf4fac25d345b07f6d6bfcbf77498ebf32f1a904e5a8b6229fdb8749fc889e58236","title":"78. 子集","link":"https://leetcode-cn.com/problems/subsets/","question_id":78,"issue_number":75},"73":{"day":73,"pres":["树","Trie"],"tags":["前缀树"],"whys":null,"difficulty":"- 中等","description":"实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。\n\n示例:\n\nTrie trie = new Trie();\n\ntrie.insert(\"apple\");\ntrie.search(\"apple\"); // 返回 true\ntrie.search(\"app\"); // 返回 false\ntrie.startsWith(\"app\"); // 返回 true1\ntrie.insert(\"app\");\ntrie.search(\"app\"); // 返回 true\n说明:\n\n你可以假设所有的输入都是由小写字母 a-z 构成的。\n保证所有输入均为非空字符串。","content":"09613316c1d44c9fe745f0f1b39b136e2cd2338cc19428f2536e3f605695ec86933b242746cbf339110b985dee1b7838d176418710e7d15564ec7fe05c6233f374e783e141324e2fe5aa20660d44b5fae735f86c5c27e575b24bfd4a3f43285593a73fcee25579abd9df8e8268563259f714bca0d897761ba4607960f615d2269fb8445f650c205b1cfe4df508ed6ac84a166680104f333290c8410eee7c1fb1d9b0b3492ec18c657beec130081a716b4ef2ee903f2c958d349c2c3d4bad4e291b3df836c8029547add442876de7b3b5f039b2346865ce9f5f2b93af620b1fcf95d5b637c067837573ee8238e4cfec92146f37ebf868c188cab55cffa5978b623c8e04486e10ba498ea49fc50ab4d0f40e4d63ea74ed77d112124dd26108807bdaf5661e9e4c646ad054bf97ca08e1b27f49f3b57270c608cc50949f61c220957a02bac3a4825168a1ac65ccc9d8678cf7ef14085e6155d61d2be3be3706729ec7db5a7ca4b478ed51584b2490a46e03ff513db8678ecab6ccbf34f728a5a909be72c1c19fa14c1498c02ce824ea7561865e56c9d4e166d0ed747e80573fc2eaffa81e1e4e5c3a8b393fed9547754293262548606dbb3693e5d3bd3b8fc36f3c0bff6d3561cf0ce2966dbf9fbdabf5f09f04a929154d1c6c64a30016effdae5d8e38dfbf9c1c19d4024b4aacac87e0070ab2bf02bec71e4e0fdc7bbc7555841744ebd3e6a55de92190409f06254f5bc5a509085591617eb00935434864342f1fca21013417244c51ba9e9a5a4e3377f1d6e9bec7c349a11548a8b5ba4af17d5d596596276d0e4b6fd4fdef91ae53a0aaa1748b0c818371b4037283f7165288df1f7fe8814d20255c7a2d69f4347cf0826d1e766dcae5ccd9130a16e0dfa9f5fa4a0712e3b11a0b3919244d638d39c8ae8a4b7c4bd709ec68f523a5a76eb1b9b26d810903bd734867d18a999e291a5d35970218c650e8aae9a770f83b0d45fa194d65eb38455f8f558dc3535cc9cce6a7af1a025158f96173e5f11d66f88c1a8ec352f40b4a0662f8ef0a1c382b08b719a69dce75f47b6837937e759e70a40aba2e4c3df8a911f12fb6863c3bd9823e096b4a105bc04aacc0400c483c3f74bc6427a59699090ea712d155c25ae45be97b4692f0c90c3c5eddb6969b240a1b0c2d570e6d523fbca1f67a7e0ffff5e45efd1f4d345352ed833d9201378f1fbe2beeaae1c886a8fab217cc4af5f8c3a66edcc785fc1070fc8122987d9830fa0f21c87fa89b2ff20b1ca49358e0adb856226a81b78587586642f6e79ceed087f9a084e73aafd35251e46f801e0bbab1329b9ce749d234f86e0a0d13f528e6791cd629ec564798519ad94c2270fefcc992f2d4cce2e8514bfa8cbba2b115ae3152ee51fde29cd377c1f2f0e9c6704dfca004c38268f0bee56f1a6ee6a36aa42d009de430e7c6954e39f7fb66ee65bd1eae07ea33527403f81d6b81c104a638e5f37d5327e50b65b7143387ba0536f8ec5c5a5c5ca3a4cc9ff4ec9f68a906633464f6e823f856177caec552b81047a5fef0088000615156c74754438d32068e98ec779092b68f29f2f7371f4427aafa7d977f509f005a2dda3138bf550d6278f3d9aa33ff0617332549caf1b9f027dd94d01478508c75ae7093e1f6a95c1bb10c44ba335c7106dfebd24335b2e1b6d0a3cd94e6726d8d658b4a5e570722d6a49078acbd4a029bf559bd4f524501e39e6e9b6872a96690cf34087d031309131e923e9ad7ba2f648679669cabc8c1b8a0778415b20b8cafd7b9ef4c5d883a306977d236dadcf624278fe00b51f638f83b7aa07e4050b881edc997223f332a8ac096dbc7dff7ab801097e06ec771dedb83c7720627f3979fe4c5456b62c3f8b26b3923d074b62ad1c1b878463b76017727eb43684ea24df3249218b2779bc93f6305093d4f8ee529e52e7f01d5715633dd5a34c0f817d046ae9959b3ab00b0564d3995d903ebcf5c7b4e0718bc5191249243c35519c8ba3d1e395c19cd8d640f83288475e477ccb8cb7b732ea8f02eb6463954945e7448ea1f20cc27cd142388100a22bf8b49fe87faad7bf0715cdddd219325fd5aae9bb621a6d1137903770448db86c93f1329727bf9b5afc70c41d5fd4e9c637b1e7dcebe92e24bf6d9482409977b98c750297ef48cab48b777ed11f5a3b603f2912583204198a13c208a108bda5cb3282a3755409dcc9a7bb763e3474be5e3ee38919d8dcea8eff989e775f5580b37f954d317a93c8261793619276306e0fbbd414281bced05968188375d943e43f4736f2b13e96a8f4d6f8b007dcc396dfd245e8e9de15a01177f333df4b304d0997813d3b9487dc613ca610e6d632656e846cabb69a9d9f2dc53f650fc7d2b188139d87dea64e96c719b407b2bebf6e76c8443e5e0fa877d862fae9e1a1454c712ae6f5c315b976c78e1d42d61d990edda0d9470afc46b196f7432b4389d9772699a0621cc827de6ae5b5a1203dcf6ea22dc7a7ca1fed62b4d5489d05b5c78a96ff735b9e9ebaa6508fc0acc1543eef54134bd15a5a1e07e0d5fd9566dbd0f6e440eb516d5e287105c29be0648720143372198cb4130f0a37cc195bb6ddc07cc1df3cd7cf5a43cf1091af9a3f3bda50ad4a3cdaa6424d2bfb058a4f5bc6ec4e97704eb5fa8092594ac5b7878d13f5be16fae306024730b5e257fa56b3b5f288c8231b690ccfdf1db3ee8d0eab5c7e8092fb0ef97c1e770bd495404a64164b12f580bbde7fd4784f310145cfde4ae61bada012d1f99c93d1a40aa245b94544b5c6a755e14fdc1f3ee75a97a34d88daa36492303696b4fc940cdbc4f1fd5d3b9eb1ede774bdda6b9859cd7c9414c75c4cf650727f9b93ef960a25b36f80a0b5374cfc7c8cdf534dd87638425804f892dbd5ff9433609540b96bfbbb1ca4cd729add87895b532256904b53e819804bb49484d8b3b914c239bc69ac53b6f01d5c94d7c14920df2dfa3fcdfa73f7106441524cdafacdfb12b62cc4b8d1e24e5a8aed45e3a9dbfa98bcdb5ddcacbdc37db6aa30cf60ff9cf3c720d9ca3c6c991b5f57bcf860c327a6dc2a713c00f4ed825fb20f27bbcac41c9b606d46855dec0967bd6c285887d7a1cd856e01dd8fe7d972dc360b7b628ae942bced0bacaef8093b0a3d67ddbb95888c898e1dd50ce08f1f5c91fdea6813555ae49275600c433418c5f5994b88ba538b871bbe806927382e0bff066ff8f6ed0dafe5d7985e3699275b5fb08587b680e49e40a3a104c35ed62ddc010103f59049f42c88c8298e5e17456dba504a19f9c6c728d17d694ab35c1df0f5b494b52e1619c299b917c05814ad1da98bf1d8c8a80abde1f214fea393dafcaa3cafaddef18db6b559b611ffabaca1ceded579a3b0659ce87aba6faba1e18f11a089773aac6d6c113c61512a09be2c947e1b0690a317fbdb3643993ed25bb015063e6c2e08d810a02cf2c50c6b62d9dc2006fcd1dfe61067720f58f70083e4f9e6de09963e5c2e6ba8e4063b724b7260dccac71546024dd93ea0888fae1d8e59bd0e1ab902a5f82f35f1c8b4d2b6af8d85092bca795f83138b6910f2cc03a2bfeb5ad4e6bd9f168c5d35a0539364ec9a2e31d54b26bd4ab8c05ec07ba71b5b61d47e2a69cb094ddebffc9d6da07abf1d5e6b8f7b5d0ba9a847bfaef3c9a3d3758e0526f512fc9940cd77602ad211e08f3cf6686e9a22610321ba6d6e93a27966dc27d72cccc933aa797961181318a275dd650449ee1181b77a17c6ad458154798cf63288d60227303eb37bb3674c0750f528e480e8e9de0d8f6baa8cff60a8826f9005b5d74c437c1208813414566469f83af634499aa053f6f33a8118f005ee12c7c02c7e544a7a9d399f1def4d4e727a5570f3fff7841e4df395486bce3b98f98cafe44d229472dcc4720b58bbfa8c4ccabfae95f63483a8b40761c46018cbb64368ec6d6449d068406c5cd2df6a4211c97607ea6c33273223d06359a4ea94969c27847ef89cfa1e6750710851feec199f03766e20c8b5cd1a80ee9fc86eedb362fe97abe4fdd89142ed764e5d3aee8291ed4df0970ca2c660b02ab076ed58edcaf50b538b258ef782b29bce0ba9a433491d71afe3cbbda465b7d443f7c96a9d2170b46294620eec6686c44d7c61b9d5b7d35aef56ed2ba3c21db5dd4af03bb5f00c4cdf09895b7c47061752ed65b7cb4088312b22a329c5212a1b15f660ad0f99399b8d889cc682a0e0f7495337910dd4f2f4b071d7da8ae9c80f943c17b80e15bb13f119d7d6bb6ce93b625d048cbdb3f1b1c0649f5494ae7b8b9b2e705c59d585af8691f63a7fc8365836fa4268148ac28d5e3304891536dbcdafb4cb803b8ab26161a3a5314d4dc33c0f6a68f9e8a91d5ab5c2e08d037942ae8deaf21d76312b3fc9f5779967f1602a31245232d402227137d4bafb0b1acc3592fef877ebc0164d9bd5b8f926d29f0b2bac5d7dcfe317cf385a33142356fd9f3a740680870927f858cd763e8033bb057eebb7e2a752ca17ec1e8dc74b1b243a9c1b3e8aeef0aab388e718958c6049a4189f9dbb2faacee763807fe422c3a03f43e2e538de985b907d2668f39642b509bc777267f1c6deec8a475cdf6e833fc16cbb5be47687d7037e2b72446cf005200804af69b056a8f8cceee73cfa600d3b153c1f56f28d7c73c62c13fbdac36aa56efd1c2aa837408263ed8ef7aecb65c3281c24ee67c8d4f4d3b2677ec8fa14f78ddbbd7006bb84f8abefa937d8587339e7bad1dbe29d7e67e974b6687f432a3982d6dba25d04e1ff335c1c1544591f4b530a7e3a44984de50275f7119f9381b8d29bf4aa769e1ca27c6bf9294df61c657252f67cab4b35b6ba8978d660cda43c6282378774e0a879348625de6d7321113573bd1881f99d8b267f0b89782c3dc73d7f3209f2b58dbe473591b7b745f437e43c62f351d78bef44078a90f138f74c98dd0979d197de99a04d2d85b3f16e4dbdf753a1c8e163799db670adb6f0a2a1c6f3345662d7ed5997cf38e2613934b48c093d5848ea876c1da3a572d1aa9604b46b428aea181fc6d9f40cd50039573f6ba7ae69cf247c3a0846133552ed674563d547f23443fe2310af075d60b6f2c4ebcfec6d509126e203f8073664ac99d5dbe9f798fee2f45b2753c0f45744e6746232998e8d011b458c420408c659e807ad5958598a5c95c48a7e686c611547f90aea1aa2072879a3b55ff1b0c1dc0b908f33cea5a6a8acec211f0206b2dd10782842faf14d5907c37bba093e2b9daf3017b0cf262ce8f9ac55e3c46eea347239025a2e3ddee8cd8d9e79382464d6f3c55d3648bcc4fd7625985c502180ce3599291a8e4e90e8d908c2833449305a96d67e1484881a9be6d93f9f22bd46163dfebab0a8cd54e1cc7d74ea7850a0f46e0aeec2520253a2456dda3741a9f1e0be90869f7a3ba67a260805bad185ccfb980557ec7d205cc8cb222a43f5c1060bd64abdec5fc0aa60d0171b6625117f56b643a3da3b943f6784619f1e9b7c7d3f3bb220d293866a116cab833297518bc7351542b8cbc3d9c26ab974f0c1adaf509abcfa4149b35c40e633c433808b2c530c4b486f8935f0c095cebf00d2da261439ac276faf8a661698c137286efa5c8d77b8d9961b3dc7675f48141d703ff2ecb02d397953f5a4b62477516c338fbed6961fa191064f50d281d3dc61eb6979fcab1b56ed5aa588961f7d7127b3eef81f19a7f3258345cc054fa8ac85e495b507a074fa4891133cbb40ca881a3582071dd50087dccbc34dff6d34e1b4abd239258d008fdad56229df9b2d0033cadc68abc811c17e59fb090208a301256eaa15fd4ccb6985ea40d1649ff864055732a1f95f0809d7cfd0adee027a17328143e8cb588d061461d63143670098cbb74883b73911653956e653ae20d5b385cfa5b5089bbe7dc7c030a244f65036977409e8b7db1ebf7325b0882e862ce4602003293d4e2b4cc13c302dff18606c823663ed82b5e4528ae44991bc7525cc6507dce09c79440793e59c19221f73f9f2273f5212db006d34584a93afe015d756a7d79b4e1dcdf73e678a91091442e7d2e8f4d6ad65d44d954918fea7a7f5cbc95c7a9c6e20cd123e5d9ab0dc97d8526a322217d31f6a0c2a2c26f8d5bc0d459e9030cf9c678c74e96b8ab3f661262f71f315ded6a1fbf02f49563be421fef3bacbd4f5229c39b88f2ae3876abd13aab2a87ddcb2430b8dcf75d1f66b9d189a722bfedb4490a95340609156fbf2d38e09749a044890cc90fbc5ab42358ac0a36c0abe9eaa884bd1fb3991695ad69804dab490eee944f974672078118990bb55c4b3f933c0da73412526e154c5f29ee726b1db094ed83de79ab091ef155cf72387a3ff17f7b4721875d93f0671763610b4d81965c3a4be96c140b959b29a472d875106752f711564b27bcdc2274267dbfb5b3dd20fcbe3161f65ac226e6827c505abb4cb51fc5480c40f9e0461fcad67181d607e30171351040c8c0317249e880e072c87e445e0bf416dec9843f597949876d9422a871cdb2b3c67af5baa23476e241a55af55035b48de72d0e55798d844c15dbefc0f227fd9cb4834ac1a09b5e912eb1d203c19a81ea85ef8f423ff74f0532f9bc9c6f46cf84cc33b02a656317d8d03a9803cea86f36e906adbbd89854a1560a6480c3b7bc1a9e487bfd6e746cfd90ca95c3ad3f44620398da81676c58fd73b7da5082af9943c8de058b29c125ee176fee2ddb218de56fe50ea699428131f348eacdbcb9e8f500c86e0883c5e96c0dd657b8fe35a58e1faf4c99f8725746ed28a52c55c89ce76cd3c42dcddb20f9cdf7d9a9a75cf35f863ff65c5e9c4e0eecfc2b394af9caa798eba46bbf99b2b7f85cc7b94d1f044591b33a8085b00fbeb9dfe3a8077c59f982bcbe46e23cdb36167c083e070e6a3e0e1812a2e8970617e1a5142a8835aab962dbdb568eb3b0997bc7ba4219d54e0de29bfa6728d92647c8177bc3420feb6d7aff1b5c8aca8695b1ee5b5e07a4d48d8abab16ae492a907b8e5368f286d261de4fe0defab27a8c978acae083e4d143da4c867f2ffad89a622b3a31d7cbcde5655c84655fb66de32b79e361b49f8d0b85b218ebbc8b4d9e54a09a85c43cfd371a29747fb48ee9042fe65ce23fa54586bc4b3d453fec28cf5f7889a76dc94a2aa30df81e6801e9df926202abe87df555e33b0c69e1834695dfd984f263b29f14b86e4ec84172f6f7d7592cf37d23908c86c902facf12ea5cf9d239f80c699baf8724ff4ea07ea63360a1e18aa0052cb4305e297968a0dd5d1c93f33c4691ddfcee8b244a9e5dd2d790a2b4819227afd323e26524a4a6e696f5b9af4a385be07b0275cae7b4f1fe691b0ca2816019dae36ef0debfb3492d1106518ba511a24805fd015a8140571a93dcb720277abc83f1532a8e6b0db1dec3f6bb44502ad23cc0d5a60567daafa5c0a2c3c5f1ca7c0a0a5b3dec7e2072e42a50405fe6e19684064d9a54304cef0fb9befb6e6734f6e14a95fcc2e7180d600c78c1d8cb33fd2299776b7a3c00bfc72e57ae69ce94b0832407b383d21495972c1325ec8d1375912ae9b466a5f99017a48bea000b16fd62ef39f4d5ae74abc76629b1fff441306bfad2e239d7fe1282991d37aa0d6cba2a48328969509edbee56f2817c22039efd8d375a535adcb1f6499a43a324fb490ae0b200689e105fa9cae3e403de73c5d280e24d5635f066245d80ac5f5206c6a5cb752e34300072245f249b7533d281ba1041c441fbc45564854720cc34eb4df66b743150c8d9ad60418717b3146ad9ee1e78af273743cadfef931fc35e3640e2c882a2a986f8fb364364741dcfff1ab175ac738aaa1267ab1f966ab86e35d37d5c8d88f5b18e9b0ebaaa12563d20e476af9faadb35a3abc0574328c26ffbca96d6c4b49b8c89ffac26fcb19bb555dab15c7bf109e1573bb63bb446c2d52b4ab8b05a34def9199362abc0f07336fea525dedceb146118ec9f9a8370e2bc0b5e49f2f0d1d170b988e4ede2883a86dbda8f212a8d402d37bfc61b0ca956ff9c2a082ec15ee6ca0056c911caf5349128928800f282b888c97dc20f53c2a7f42c7ecc868ae0cacd7a5685300aae4dc96aeb805e1e3ffd8e3962d2df178f7db7a33f333101394fa05308a4792fe8428b855cda54bd502da1247c5054e720795473bc9f565a0da2b949204aaa3d3e3afe515d00b78ba4d949b57e99693c04bca702443153f73d855b8c073d81fa75553c60518703679c6dda8b8bfa8b29135dd563f0e0cc43253258205774342da969e176b54bb91651357373ca43de655852876ffc5bb799fd2ec62814f75ed2301994baab22d82bb3f9e1de61ff8c9ad861ec79361f97605f39820500fdd1ae4e83732cc82d7e708ce6b63ffa3ca7b49ed5503d21287c26c945f1f197d146933d886f28d8bebeb156a5422d855001d65f90ab11fdf3ff0ae36d80fef698e7187ef89288e82067ebef0ade3233425fbef2b141f88e36023769fa4ccb53b9b9373dafb5f0edac0e3d8fcaab06a71f9218839d26f0d9432491b181536bf9a420687e9f1eb8e2bb6497d50430a214fb8284b6a23786d703663da3734ce4f8fdf328be86592f5e9033a47ccc45f3a6cd17a6bb3a14cf4e491fdd500a0701275d8019222051f0688bd929b8411781d3c81c1f8040a3e4aff90253db93676d6603b32b8ba98c6aedf33ac8d32c6ca726e9435cf8c32c4a12642d1253aa09bb7e271e5838ed306cc3d372e6e024ee63511ceb72b11f14c075723fb09034f076cd24b639707509d9f5485c909fad93ec9893673f31abbb1e36ba204a67d1ab1f261cc09bedfdb3c2e5b1b1bc99407ca7bb2db54278c2df76960a9888c97a821369954818b30475f390b114c874106aa0984b6da20acd776f28d9f910658e91615b20ece9ab2543bb7219a0c948a0e8d0f78f0448b66479d4ad2b68d933e19afae0cb9e3001140d5e7c48fddab88e9aadfd3e6964b358b2c019c08d7cc77afc7860809d43711ab2d2ad765457b9596c2010bfa90172d62d94158e93d4dca2a94050bb12e86ef94cd218d33fcf65b1725ab5fd91b126a947788d05dc4989d62463efc9e8afb49b8b463b03c73cfe406815cea30931ef8b09ec793d9a4ae820413e0e614995ba910613aada0611180c38b8b61ed5788397833c997eeb7741820c43daf0f473850779c473023bf616ec4d7d9fe1a0965b3d6eef260c0bb662c0d140f056b6f5525274a9ae3c43eaf804ba0730142c2c42d785a99d379ffa8e9280a9fa20417e66c7ad07ce38efd60a89230531050c2b15cdd2b8f85cab32358ffe7b8b3dcf543f964f1f072d8474f09844beba8d424f8f604aa57a8a403e1774f7904744005f722da5a66c51e943f04a1368ee1756fc036c9db26922a3fbe4303abbb9ccab2503aee089abbe6038b8185dc97a9cf3a48481df1664ed367a588567b367e7ac447e00788a7a8b8cf0b3af5f20ca2a4368683fd4870bc06caf76c9a231304d5dbcbf0e59a0fd091a355a691afebc68ef0d7a285b091ed353d21b4459929733feabc754895e41f825d7dc7432a22b7974caa0b1f7994bbd4c12301971eaf1eeb301bf8b3c3ad63708b9ceba8620685da2e8d7c8700a110e6876c74c93cc17df355285f77cbbce27a463485ab16da9cc0a2bf0312d7275fc52214453008f1bdfa594cd5134500115e1fd55101e9477d84987cce0caf34870971cd94e1f9afd310d56f6d543fa161276b8e19cc52d72020268fb66af0272ef2441f619f06331c1d048a59adbe47c49ad84b3c3de3f3ba17b7da6055202237387de4d70fde5b532e9bb78439538e70247faca8d92a18987e3f9fb51339890f50cbc21bf2866b7c0c9f0f999a6cd3e409751724a8f442a4cee4c147d22a5e05252a61755109243d7b7cba5c2a753c0e20d56a0171ce3e562e967374e0f14b41ec1ba8da5c771964998c1e7dd82d2c222a10f1b3309674e1377ead82cd62831d254cc53b8801d847d5bbc9a8e364de9099983a1d685df305b417ae6e9c832d5c4ef6dfa52f90dddb5f1e11105375bb032efef6251380c0d728d0f53204f2c27fe712891ee176b8eb2567c81c6b0368307bd44910a1fe1543c206631516649aa95d984d3c14723468aefa3996879a416c7b8833dd436bdb07b242d6aa3d2d4b44eb9ab3f94c2fab8328de0917d7d46e322949fbf014aa32525bfd833c8c6008933d8f8a39dd1edf219cab7ffc4f3295b8f63e29f468e3d0297fbe66aa91424bd0f02c5b7d1e529b0f64eefc77bc086318d73459af3608dc2e7fe72c4a226b47029394f623e858ef29dd7ebf1e0bc1e286b4e8d79c275b46b4a728daeac9a8d09d57e790f01e37933451011757d880cf28d87b50cda2c3e28df6","title":"实现 Trie (前缀树","link":"https://leetcode-cn.com/problems/implement-trie-prefix-tree","question_id":208,"issue_number":76},"74":{"day":74,"pres":["哈希表","Trie","DFS"],"tags":["前缀树"],"whys":null,"difficulty":"- 中等","description":"实现一个 MapSum 类里的两个方法,insert 和 sum。\n\n对于方法 insert,你将得到一对(字符串,整数)的键值对。字符串表示键,整数表示值。如果键已经存在,那么原来的键值对将被替代成新的键值对。\n\n对于方法 sum,你将得到一个表示前缀的字符串,你需要返回所有以该前缀开头的键的值的总和。\n\n示例 1:\n\n输入: insert(\"apple\", 3), 输出: Null\n输入: sum(\"ap\"), 输出: 3\n输入: insert(\"app\", 2), 输出: Null\n输入: sum(\"ap\"), 输出: 5","content":"096221c37c5f85fac03c87f9e42ff6164f863d84cd9d3ffd50693f586f594225578280276ec8fe003803b457ee1471d664e68a0352afd90738fb28a96b0579fd0ab8838e1d261976e0ce4579691b9d8eb33e9b09484d857cf73dfc2660576408b0cf48d581335bdfacdec8fb7114407abd53a2fabf911344a70f344ba46ee044ff913a2a46474c4759ad718c4cc707b76a5a09856724187acdf2157bd5a7f22771740f24f04c61ebe6c42dbdaf185558a34443567a341260ab3fea744019a1b09e171b815603974c4073e6ad837c3d72b41220d9d0e80bea4d56e9b423520b9aded6d1914670e0293a6236bee4c6dd93304f34fbed68c188cab55cffa5978b623c8e04486e10ba498ea49fc50ab4d0f40e4d63ea74ed77d1121641d2201e987399f12a039e560b4d8305fa1801e82b5da3ca193090ec55222f17a2e61de276fe4d6ae1cb04a8f9a74f189e110d8756d3a6c2b8bbb68cd44e912ad299362c4b9ed4df9c2f9451f312b1cfafaf555f8c50e9562477c77fa5dd5b73e53fb2cedd1327e70635cdbc513094c6302770d908389e3202f79bb962b8817906db57586759f7b02c1f5d40e72d958f274ecde9ba07daf48ec8fd3aef6d221d4bbb7e45a387bd10b6feeb2aa06e55893d416f676f2307d56dab93decef2be3ed5ff271b7fda69eb5f36169acd1e8baed46617252a8ea8bc9e0ab2c82e8bcc1ce962f0c45be6c459086c78a363cb1b8647feb0e3ed181883c0effd377efb772bdfcbaae1b9ca46bdd1f6949180c1604f08a189bc952919515b5e27c56daed462352341ce6bb2c81e19eafbc1a0b848307b4b5e5dbab1bffe45f44d1cb021c3d64f728bc372069ee91b0094f8ae95fae8ac3ea1d7545ef1b1bed7a6bff5ab6f389070156e7f4c2e4c1ba5c008b1dbb541187cfc53fcd4d767192ccc68a66db6428ae417b1d3cf55e9522cd813493ab5adfbef12532e1ef657179f31ebcba2b02db224a1c757e1678992181933a13937768ad6412ebc8bd77708ea9e198fe61c0a81f04908ef5b4aaa51c3d28fa24951050b112b229ac42a755fa12a92000b0a91d3186a61f042a4d9b17e469630ac106488851ce324a241543ae70cb02c4fef154b75b78744fee422bef29cda22db5fd10dee6b56c74e4489c11682fecf0b5c74dd287d47006dfc8cf19bde731f1ceff2aa376f8a06c3592f09ef977c0edf3688f2dd27d646fbe28fdcc6eecbd39376804f99b881168bf7e1b507e33519dc03b665dc7a8c801ea44b118e3e9775d08f0cbc9bde1f35f96f2c0c4dda1827dcbdccfa5565bfb6f4ae08e7b36c01b859e1573bddda0feac0de328c0656dde1d999a6188f2f25a155f8120d8828f7f8197c54b0b4d4c699f18dbfc90317ebfccb88da42864e36d6dd18b8868211f38f94d0a3316f83e738becb6db9d6c229456ab4f2433991dd40649fa994a43775deba3fe23fd414eb67ff5222787883020be7c36dcf3a9192701958d4481587477f8ad07f30abb34a0e3155eadee7dc9afec911895eedeee13c09a71eaa1d46bbc56498125ab4fdf80b8a346b5154de4459498c1a2d8dafc6799484bea9371d72b5db1a2df68559f1e0be14d78bb8329a3a9167037f5ff8dcaf34fd191a091946d5d2b6ec18d0a0d8156f438e45ab7180e5fa99601bbb1f4b92055c70141a210fdae81e6c452febf08ce23ae74dc1884c74571b07d6bd957eaaa6a7b53fff4a884c737fc71e4ee409160caf07c5c77e9401742d0cdc489950e4e4f04140e7156dd9c5e8a6c1b93435ba769335aec280ed414b659c72366c8772e38087024ce4dd640af6f670d9b5a85848e54149623c7dce84fbae6e2d5924245210326c926664b501f929376c2a9883ec005e4a1b45b4e5fd717f77fba8e41ba336ce0c4a669b85c99b64093fc26a688a39ce64f1717ed1f0003eaaaae1c780c01363a22ab2c5718c251e7cc1dae738924b8649c1e41987b919ac6c4a329efb49bca40f284e6a04c608c4698869b9005b84f33a5b29132ff6c463088412a929bf41d4ac8b2f1e2effbf7cf24f390fed31380ee45220d127963d5bc155646dbf8b0fb081f0bb3ebf2506c1d739ce03d711ebc2ba21f0905f36560f044092c89d3f5a293c3ea5e8a1c3771690f37cce3a750479ccd3ecaa43ffc20c28449c21cdd172503bb8caa748e725a857bcfbbf509e912dcd6f05ddaf7f2b8c0981dc19e0536d520704938fd23ae502f10050eca8a6619695c4b3fbb7a8cfa76da33e021df954d317a93c826179365061634da5a2fd5d5285e0fa1e8884982d108a1751fd68732c4a8b2bdd2c3b834974cc346dfa6559f39dfc190007666749ade741ed937010d5fd281ca94ab74b0e6d632656e846cae962b2c8e5924eb551e6773a3c8231d11b8476ec62408d596845a6f9ee7e8522dca9e3fd28c62ff2f537694fed12c32e0c2d28c33e31af93212fff9afc911a8367d28b73166b641385129d977239cf446d859c57a1ef0b29474ed4ffea37b91439afbd997e03008296012678b46fb92dc4c383eb3640c11ede4514a5fc1851f259e0e0f354741a98042ea5525f5c15bf58c4ad991b0e24f955560a7f4b4475ca820f77f09c6bd1dcd56bd616cc05fdc530f5e216894655adb8d997a50a99e29da43471c0f8a91df5b0f26c85ec7e02c14fb3096cc99a712f37837b05f868ac3e776c324c112565fb2d3a2c27f4e17ff1909cafb49d77b0d9eaeea4840927fea0d384e933bc4e4c40b74b7f842c1744f9f9a525efa1714054b4edae6cfc92122a6aea80725340b8685cd827515c27340e1ab684aa9d30fd723dd1a7f8731d7651276b09880c9ef91d73f798fcb2108d230a8ff2eaf2d5cdce0d59279c8962106ab59d7db129ee1f64bd4470043b9d83c68ebd36c0b379d86c82528460fb4ef07968775c40d3e6b2aae0668a0387d87895b532772c50b2299bcd15ba1c4856d4549f0f6cced5e4980f2f518ec967761e57d475331e5e1a3de9e1ecae9ad97de7e9bad7632345c24483d22339790ed1d37772405950602989a4840b972825c853ca0773d2ea809ccdc60f293a45b12b0ac5d0fbac6f2ee6204a05807ca9a8078b631ee10f0396fe4258de0667a24d751904b783da2cf438874e2ae164eb70d22241e82e65fcc4f3f795a1d01424060bec3077e12d0e706633cd72ce497acd70d6c8813f5594062391d227b2a114d88950f4a1f7bb4e852c01cd1193772a6422e1206c3a93d6ae5db33f40ec0d8273538597a99131052b98b5d5e5982afe7d09a58ffac3825ce26af4edcfb3b3ffff3023d4521c07f758a714d597abf36162c7ccc62f37638c2df00053f4da4383091f1953fa16767f1f12e1ac961aa5ab6682b1cdd68921e74badcb2ea0e6720178a82b44f75c87af9d555f81d4a2e21edc6980cd3e8c280e2354e7629ed05319601fd13c41e9c3d3e21f2ea0b02002b52ac7f3ad094070491bac52e9374fc2eaad3812859a108671b89ba2df5e4d838ab29270df725cca48057a1a87c6b14fed56ea9c1b50acfcdeef8e9ea767aaa69bf3a4cbffa0f6bf482fa7942838d7241a06bfdc2fc9bc297b6da33a83ac0f2ee4fcd720cce81c3fd937de5c1580fea2aab252530e97a160f9772b469a804ead0ff5b67219c3f1134103100a37a7eda2609db8afd9fb97a6abc4a5da1dcb8465817a4964bf19702473c0df71c9169a49a8efddd907cc242e00bfd69ade30042092cb41ee19aeb6162c12f87d005de55f8b31e1fd7894dd362996f1e06683c73bbe7a42910ab79b63fa8c7350be7abbf0c259b39ca4099dee02501c526c0c6d11229507d76fd39af4a03972ce60d72b5aa9dbc35a2911acd8356caca1aad877826df39b7296a9b04022d8076e693d3645471177b933acea993fb4ca2a6b2420c4ee8cb948226efe2a9d6d5fc850ebe70e42535b6b4a411005dcb3d7d26aca90bae0e1613bdb946d7b4b45a312880fcfcf1de76dc3f91ab4973116edb66b254a688b2ef662119b711681b2a6cccd337b07d66dc8b7e7cc5e38c843c173a8f436a35674702de7a900d6b247c788063b13b03b50dbd040fd0048567da3445d4751bb5432cec8b986d65ba220947310752efca595c31a21343945e078c8d2e7d29b8ff5937f344e6bc69ab880d167a764c06dded916f323783bc4956fc4bb463bc354c8b229955211e4cbbdec9cd4ab1e2e316bb82335f166cc12b26c60ac620ff4d2211975d8aa8680bc9ddaa568474f5f07c07e714a9858436f445228e6fa9c9df901a434d4e146b17154ca2e5aa8c1d88838d16e8c876a651c1b49e53e60cdb8b9b2e755908c515ffd670a64a7f4c77e8872e169d51b8256ade9324ec24b289184b240ec7d92fd675a137e4d78fea34c89b8efdbe1f5edd4a755064e8e58947ead93ff21ca6342feb1e14c53967f1602a3122c6d225b3966577d5fbeb0a1e38b0b3fb0c663fd1d37c6aa57c28a7d35f2e6ba888c82f05277f88ca36a681f6fdbf1a56a680870927f858c9e76ad4729fb48f1fa69622160917ecde3c970b0ae45e3a3d8bacfbb02a674c87cc011d446b5159cb79eb0e9eca2285d55ba4b361003f43e2e538de985bb05d018ca74342513d38e3b0b630a66c7d7b22c82b5f73dfc339ff4b91a27702478e6b00d149b45126fd74a82c94c2fe1c390ff2296f82aaefe0185ef6f7b83951662c13fe9e97bfa56e883c2b69e611c6520deea7a94f31249ca8717e83fc70c1d70727fa586a14278dab49f393592788aedbfdf3b8bd57c8c05871dbe29d7e67e971f6585f63ca39f786aa0259a011bf663f0eb544591f4e81a8de3a44984c7436550705ab73e01d960a21fa42ed6db7bccb99cd8cb61c65f765d6ecaef99716ba8978d660cda43b27a6a7356450bccd0546e5cf2856a5f3a5b3cf89328b3ace02eb5d6d8c6869235aff328d6650cdbad73441b6b6f11453a1ac662671671b3e94077a408189f6e84cab0d49c6f5ce09a5ff8f25b3f16e4dbdf757453ca533980cf2261c07f092e1227660c3b432c90d707a3dc6355945c02c6d5d799bab22a88d8275a3c37c2673646a971eba9d4e364d7388e180bc636bafc76e6cbbd1587a99e4b61107a8326183d44660b6c15e2310af075d60b6f5e0be8ffd1d60a123a666b91767344dd9a46b6db6299a01d5be06432031d2e5f66427f62cce09918b455c4271bdf41d5ef7a82dad7dcbfc90f41dfe686c611547f90aea1e237728b98304fbb1f105ad8d645a335f1706a8acec04ed8206b2dd107d2d16de313d9d47079f2a084e1a69489017d06c8078aca9a8b117803e7e5535bba66eae394a08c8f96fc99cc6c1e3a7155ce649bd765fd6259cc83025b44e3519297a8a5d35c8a9aa6227942db18e53335ea4916eea7fd25dab5b679912f6af5ebab0a8cd51c5993821ce98525080abbbfc6243d2574711a91aa5e1a9f1e45a64c2cf7beba29ed24c555ee0340cefdd90d30f8d71eb9f2bb398e155c1060bd36ee8a90fc01f2161c7bf33f4715a02e30746ce7ec679f371357a5b6d881d3a0ef3e75576b11e842d2e2293a780af573424a2f99a665e16ec8d221435e9ff55281e7a616b135c40e633c0a765cc0c32bc4a89cb0931945c1892b72dbf266b395520cbd667c55e6916ad49951294f2454d3690c925218baaf714ddb41fe13bb03f1147a78af8ac1f0baa03c8471ada82761aa4b2170f5104878798365cb97dc82f8e37edebf53921b8f92543266f581a2ce594a1171328f10bf82c1444025232a4255a4cb5e7c879e0ca881e017753f8952177ff6a71edff6d34e1b4af36cd61dd015beb65a229fa5a5d14c758788cfeb816845acda989036cf084840def475849ef3de17fc173c14d5864055737735c8dac0dd75912097a2e26b91baa9d5072f405a8da5d59eec753667f4f33a5598e958a1c750eac8fc5faf9ea2da35c7ea1e5111418eeec2cc9cedc9855d34ccc238b12e739f9db5202db607c7efa6e92d2a87da841d46fd007475c048e9b0bb2df4b1dfae61d823dd68e0cb2681ee2fea0347b3fbc3d8565afb52d04da9a358f99002e909830b1fbcc7271016e38a91bfe0da33e506fd54f504cdddf9da1aff80101c2bcc19a981ea6422113c476f64606d9360a6223d458c1df011c15cb2bacef72d641e132cb305e8067ffe06ada03d359052a2642a4496efb8977fefec923888837f87695f9e7bb9c262e52752dffe29f09e84a029c6db341fd23ed96d5c21b2ae401a77eba7a915071d4ac62d25658ff144b4d3e181e420e29267e35faf52879404f92f924dbcb855c3eb0c3e1f1538191cd069609d527ee541956eeed6655d8e56c99ce50ead1ad248762fb848c0c41d988e859f80fa82a13a9fb5902a50377449d5158fe111c121d6bfe1f370ff8dcced7891172c8899f5a4a4a60f36f7f4991c027b3096a66ae56ad61b165050d9424b263db1b45d39262695d1fc9965fcd76366fc70c819e0ff353515ef0ab535c5064304ecbb4d00e6db35ec8a57c4066978026acef1315846e28aca72c27e645410f5448d9aca334879699d61d11ba867ccbaf38e50bcf4a260638d6bf108bc156bcbcfa1642d056e908c4515c9f2c7e53ce7d39ad74fc7bc9874da61e8be51cd8080b89dae980970e3296a73b7e1b66f4cc0aecc33b02a057c01d284218917ceed7c65fe08b0ac8bb263a1105f2ac397fef31dd0142cfd707416bc9285cc86fe6705640899ffce797652a131f2d8739985f50c9ade0dc8668f76fc587eee6ad46f8eaa74a11aa6d2738178f354a3c0f9e8e7f70ac26c2788b0e9775fda08e6a57bfee274e31fdce3585746ed28eb6311c4dafa64c9ce24d8ae20cc9f919dfbbf38a214c334bd4b438f526ff6bb267544bd99c597a8d976bf99b2adff45ceab4d421f6fbbbc308aafb005becb9ab7fd55664fb49bf4fd5ae335cd21537b207503193d7d11161287bcd6011eb5e0512d9d609efc7f8fdd528db3979f73d0805e5dc70f50b1b1842f6dd9610e9e5235c3125dae7f76ea457697c0d2b0acff075c02edc39a8cadb65fe88af059a9e8319411132e5eed9e52aaf833fdfa63ddc6477101517cea954df2f5a2a3dd7ffab34368afc5471aca5e4994688d66f6cc62483eb184f05b68cbb0cdf4d9fe5608b25c569fd571a98e11b407f59152bb68d36ce258677986e1901cfc8ac0b5f7889a3093c6a2a273cde59fd41edef969662aee81df5e4765ef87893229690bbc9d120c3328bf04c2a197c73e63227f3e8fc912d36b0a893dc33ee58e6bbee59d6dd0c4deb38df83c00b0ff29eb5264631e51b97e52985401e4818cb24ccdd6d9725bba664fbbc9a8b92bda8fad065343640c5c3850d7727e1243535f2a65675fc9f3e6bcbc4ee84941a5711b5fe691b09a7d544dd4ed6a8a5febf37da8d7596976e8154f3f8a559840e41b3b3ab10c95164523e3c074417dadedf2816af84705af6f02ad23cc02556093d517769da1e1c4ac7bf7cee3ed8ec0caf52c2f7dab4955ea2d187a654adfe9024b8fb1a8d9a7eab173527314e70a80623ee58400cfcd48d8fc3fd46a8d76f4eb8947ea3eb16cb4cfe9154654262b6c6f3a635972c13203e28c783675d4d8172b588f4c5e14b4ad49a601d439f4b2474bfb5ed53e23c97edf1e134ad1ef6a61d678ce7c4cc5c8508a869ee0e89741a6bf09edbee560221d900c23f3ded434bd39bade1174858627604ff5dbef5f361f8bba10ef85fc614065b94418260e2e876375066245ac08d9f2642c2907d41cb74353526f4d814faa55276f06f1181c5556901e1f561017488646bdc44cb743615e99f5924b5c347b6a09eace88b4d9e56e6f3bb695d366b367a7644762dc23659e27c2fa7e300e4dd2e2fbb4265a8e38b6f73961b0bf66bddbea4a2d9acfc4d51b4daef9b7eefa6131f87f6d6af9faadb35a3abc71267b800eb0f0b8282b4b47e68084f9c969957dea050fee538ee71edd1b7dbb02e70d70701db9ea9644f37fbdc88d363fc3434b3a45ea525dedceb14611c787ada87e406f85bfa1d67a1e531a1b84e563c50283a86dbda8f212a8d402873ef877b0df946bb191b3c4e611e35bad196d9a3f82080c04cd6ecd0429269e968a9a2db9645a7f5886a5f0248478fe9ee0061c44efb1ffa784b805e1e3ffd8e3c46879a42ae9db3376ee6e001393e60720ea24dcbac1709864cda54bd5028a400e9319303707d60b7a9aa66584857c98af3ca1b497b898cf41825e3da167949b1ea79fb9a9049f3e70571f3a7c62916452a50c883c99dd49d495b192e6232d2b1a6f3d0c7cbd75b2b0f1a854f888a4149fb8e5c51d0a3ed093bf3045ef86a7e644e775ee06d17a3fb1cbf57ad0d6e9279a3e5fed2301994baab259a4a033b53ced1ec6b4a7955693df77e47c1ff3980a500fdd1ae4e83770c582c9a241c13e7ee3d4c4330da1307b961b879946945f1f6d2f5d2c5d97c2b785cba5e43f091a669d0d000065b80abc1fd83db8e0528c0ff2699e6aadef89288e824f38bef8acb32e692efaea2302218fad396660a7facc932c86834fdbbf5c348485dbd8fcaab06a71f9218839d26f0d942b1a7157177fa1c40a098ae1d9e7db45f311004b690a214fb8284b6a75640b702b63ca2c1ece4fdd9a66deba2bcf8fe41d7314e6a1505437bb3a41","title":"677. 键值映射","link":"https://leetcode-cn.com/problems/map-sum-pairs","question_id":677,"issue_number":77},"75":{"day":75,"pres":["字符串匹配","Trie"],"tags":["前缀树"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个较长字符串 big 和一个包含较短字符串的数组 smalls,设计一个方法,根据 smalls 中的每一个较短字符串,对 big 进行搜索。输出 smalls 中的字符串在 big 里出现的所有位置 positions,其中 positions[i]为 smalls[i]出现的所有位置。\n\n示例:\n\n输入:\nbig = \"mississippi\"\nsmalls = [\"is\",\"ppi\",\"hi\",\"sis\",\"i\",\"ssippi\"]\n输出: [[1,4],[8],[],[3],[1,4,7,10],[5]]\n提示:\n\n0 <= len(big) <= 1000\n0 <= len(smalls[i]) <= 1000\nsmalls 的总字符数不会超过 100000。\n你可以认为 smalls 中没有重复字符串。\n所有出现的字符均为英文小写字母。\n```","content":"0961e8bb5b12c3efa0798f5f328c692d7297f600befb09b4097e4527731eec86933b242b61f6fd223609946bec12491a32dacd4f5adf9e13456cab79febbaa6175fa90e357154703f5a41667c0f7377723f06d95ceee439231bc31cde8a7a9c05a2c810a6eb8d43e3b3e0573afdcdbf273c3483d3207e0c57ff5b1833ee519a37f39a8eefec94f767ca560ada276a0722b7a62ea4a404576b948aebe6b22fc2144762909844c46e8215c66fa8576f2ec8a6d4e9f3d25781cb959835b39ac1b99b757927be2019673afd75169df44742db37394501a5e94e64259e9832b532f981b2938de50a2458bfe3322f4b9ec84f92d0a41e081ff48653d6ccd22414a08ebb453d3db97fb38b913204a6f49a8d0ba12537f67a404f20c83938e03e9d56dfa0c2badfc55c3b2d24f9a561703c92a4ba30ce5d2193f895b0516b4d51df642fc5a65e1cb2e6c0c6cd7f5689bb2cd02c5d8a298fac8b0821989428f9c699a9011006a9b2c83d03ced322d4768046fe3f018cbf707a27a15f7cdb13db764331b6126ac523a693092d41618e22c74e7091996f7d01819271cda852c65d9303378078288427370319c08d7d6121b9ffb16912033012924ba3d972a3b43b76f5da2bfacd569287bc356e29770a9b6a0de33295554b62156084b154bb8349646342cb24cbc2d1358f4e942f2a78c381a407286c9da829c51bb24d49f108536c3bbfc74c97b3366418a65f522689c1f324d4fdea74b4e060ab79926fbdb134727522f17a1391f2e52371f7ef9859d0b357873e997e9f395db02aa024af4f3e98062cbd1e0d794206c125e2eb7abc0f223c35a2155ab16c433814b9f427c9e91307dc2eb560ac6c877611b18093e24b06869f5887d6c7516170705366e1ba67309667f4c38a2ac3509a80c137fa59eeb0adf006311d2a4ea61d172e6199a057dcf18324d8741c4fd399a81fd095e222fa6c1f4a44382a713dc0222255cfa2496cabe5385ed3890113430b314f1d20038f34be6a4a81a1b5556cf66b54848c5e85b597caba4c59752525904ca9556106a6001c446b01b59a027f484c6b990ee10b6f322d155787a98bb51bd0dd521a1f155c27a20d384b08db8c5404aacb3e2f95e4ec60220ed061709079710d345c15fcc5ac1674985caca34375fd7bf9bb30f0b0f122e6921616e31515d1dffda89386c425dd9314f0e7b50d6a13dba2dd832837b44ebdb8fefc5e2dce77cf01486f9a603de132f7b7dcae3121aab5139804bbf1b6b52fda7872dfb0f15a59e59e38c82563a718295ab886c4742fdda9ee5ee89cebb8bd227afd56653c577803a0eb2831899a8cf49d2343d97e880cea872c91f73f36f771825b3ee99f3492272cef2ed82f1f2fce8d16f4bf997b88a8619bd0359e85efde29cdf4fcdfff1f2cb6154fcaa00ce8342f1a8db68226c0811282bdc9b5619f8bdefc01336ac975f841a9d6ac313ab6d6c1e69dd5d35b09746a8559af224093cb56a63e74a3becd50b52a5ee1c375b3ddfbebaeeca98fa6de772446017f9844ae63d6665d1937ed45c60dba1df4be02d083070ab2c7a01f30e6ee5948f099ae0f3be4885f4704b6f64c1e807c54638c6280675df5f6cb6387d632f8cc0c764f96c771d581be198d0e95fb5a1836a441cfc7ad904b8afabb308729a77339f652e64647b3e5b9ad97db8a8b839130b0ab5e469c7896775543a09db82907bb19b4b15bdfc6da14c7377bb4767a375da75aa6d9ed21d08d9eee2e81a1e813299cea02c46af7965bfabcfcdb98d4c698b39cd1cfa8a82a70a7f02d6615932a019bdbefd636e8e8e58618afc3ca9a3c42451a5277d14424284d0f8d118191c7d203d740f1af54b1a04a73d885c021bfadcd4640e4373179aadb9581d2ed41323a42bffa60a113992c3a6a5f4e5966ba0ddd167e226b779f43d88327ad78e858c848b4d5dca4483baaf73b5ce9346b4d6526f9115a26b0bf157f93da771477d1449873f79f0bed791810ecf548528870b8a9f1c58b89ec8d4ea2d45a3d115f063ee70a850753bf3b4b93917cd36d4b5ca02fcbde947da8e6ae142cfb559dfa2d85408ed0f003145b471ddc82d17b234a41fc5175f2eab6064bcf9e89acccf3f0e25b09f99e9be64166a3284994f0401ba753c173844614b65df530ad7d5ca12e25d02cdc5d6454830c47ff97fd56c0a7ec5205697696f718fe63a6806c7554e994c94c7dcc08d094665ae20861a89bf4e2679be536c0d7c345e201016e52985c4a5769253a661aa28a7eea7d6bbcfc3645635b3a401282888416509ca9712e68973b781ecdb19e44180ff1be9b054bea44ffa9c5c183ae6ef9b9dac8e1c5e843366f8ce4975c3c62aab45a480cea59ada20dc4174bb4a580c5c887b9a7bb6ebd145dc578737f03f97cf6380e1cc78713397d643b12c2928b514966d4797a0cd55dd32c398acfd51d4f7244dbbeb0e796d4fc70ebb424fa3c8fccbb16cb23fbd72699706e7797091681193d5bfcc404c2cc639f8900f7b25d7c4ba261df5d9be0dd03fe73e0a4837a39f379a24d9cf0565030fa010a5e06ae6d3d504a8e94196d98af23aed3d2474e0c6e21ac3acc2edffbbe5006188856f12b40e1976bf5ecd789b222afe4a34f33fea93220d1e1c1acc6c2c0932eeec1b5d2dc4007969a00208c7de51eb7589dd5219fbe9a12bb3f51aed5ad3f3e5e1cbf2b1f11ec6fad1e962309b7e0f70386174fa727e2d010667bcb83b0f564172a93380a9874ea0ed43e2deee6d2e04ab0601d384cc2e2934ca7c6bd9eefc061190b4c742ead134e08ef4fab0d18d385b4728c006bc90674577dedbdff1e2e4904d962a3eee913b4b122d9e79b8d77160113458020ac0a6fa1d54ae8ddf34b713fe6dab1fa025c9b6b2ab5801784a25d54b7ebd8c05ed4f41bc04d85eb9ee83f621bc7d1d03ca8b3e8b416dd753118dede6a922e04f0bd644632c0fcfbb19ada8533dce866d2a5285e388cd965dcc67dfa3fcd2a7aabfdecfd7cc08687e5465ceea00fc19fef471495265b3d11d387719215855257b4bdf3a2c9e06b64a6145b4580d9caec60030184487200ad7e2fb87472dc4098ce765e315c67a950343e679729e46a7c972097193416a1d06bfa8d921fe3aa76c2ae172ea64f4214ae82e77d9080968412f7f1f200105fc1a74c41a0d694b32f85ecd7e6c0c856a60349a9343b0efd1e34ccda04587a21b4a733ec650ce7337867aa115725070a10c28a9505553f2bb1948ee3db9717d999d89b58ba440e594b688ad4da6454ad48bba9fbb2f86507e02410774b6d0597cd23a4f1083f526d25b236cb94718b5ff8facbd639835f1166ff7d9568225041e6ff51b7346190fd7a1930ca89241474c3e531640965ac09c03eb975c60149e7d29cd3cfdb9e90a420b49770ada8063de903ae4622a462fd502c1f3e4aabed0506b4f8a96dda87934ccec1856e3298095a16920662c4691d55afe8b4e43c5582feaea04e83189f8fbde1b04acd73e60e60ea599a77d4f232318cfbf62e248c09c197da2dbeaee98a2a6579ea4bdd960030d21285dd697efeb3c78a724536a81b86ff8c5a3f34a893daa87bfe603b99ea6182e8bcd4a37de5c1592e3471c1d98e744c9823bbf6e81a9cda80af62e91eb5e71a1d88af3c2ec898fec7469f77b726b85c4fbcd9083fbe741919e39fc693833b973101a3292d10ebb3d0ee05e365c4369a21f56649e9ff7e2435820d2ac4aba7caceb462177bf544b1add22d43c8b985be7831267dcf7b72d959d52b9fd8b0870fd9c0fa5aceac553847d95e705dd9f11ad6c32055309534d276e0c379a04de6fd3b2f4bc2db40cab58fdefa9dec99fe8c213445f1c9cf9fcc528d86d92f64de8f7bc2571d0620e495f4c5b304a5ce271828fd226ebb035169cf1593b657c33100f4eea15b29707a72a50b5120d46270e537d58c6d5acd106bf96d9a1c90d70e8d90b571217877af61fa194228220f69263a9ff6420b4fc60400c4ae75ee4c4b56aaddfe6a3faa2ce400b0f9c1ce0e399f03a6ac72b8176c1a83ecb3966194be6c060fdda2ec7d7681962ed0f18a7ce11983636034ddc2d4136099e328242061950ae38e409bd3394aee77a737526c5d75f40d27b88401e1340664f7d3f85d1f8d1b6c3ec98cc603eb938429fe1189d4c3829cb907a92e76c36ca429b8f66bc56499e85dac6c7fe811e7e642980383fb441cd028c11499e2d16bab45f50069deb8496b6d9e0b23a63404874d77a3e4f98703d170d1c6f9d879cceb412a737d3e85bea153b9d2e2efa889de677dc65d08e3f4f011b1aa82206abebb7fea24b829a550d94675c2beeb0c737c62eab3b44bb4cc7780bb9a574c7f67b4e0cb56b92348126161a7e1652d4a320c0ebbbc788bbcdc3a9553a1fb1609478ad8daf3cd72d55e6fed91e2ac204587fb8382c6d64146b665f3457a5e2e0aad85f2fe2c637fd113796ef47ccda3835b5a9f2c98e92f9317cf385a33142356fdbf1a56a3a4d23e936f88cca30e30a2abe64f3a66b730465867894b3ba32eedd4ba0eb99e8aeef0ae072c8b45b8c53c1793f81aa9efebca0ee21311ae8437f5e57f4772e4e8df985a005994c9339376611d78b24417d0a66fbc8bf6e8cbfb477a778cbfcf013277d247fa7b77014cf0b0f6fd21efec8482bc3c087c163e2ef00cdf71aafc56f7b83951662c13ffbe364a21fbbd796bad32c1236688ca677c6aa5c70c88540aa39c10a1b592e7ef78fe84473d4aeb26e2eb8528aedbfdf3b8bd57cd141c859fb2983ab2e9756209ae97db4cb070ef42587014db72febc1544591b2fa62afaaea1d84dd163a1c7019ac77058d7cf108a061abc36ccbb08f90933a9819750e6cc3ef995b6ba8978d660cda43c6282336380a4f86dfc4b3bc6708cf9ad49cb7370dca162924b62712405cd6863fbbba785891fc1d51dc9fbfc4bc9ea11006c632355337fab14e3be1465fcb268c8aeddc812907e7d94c9b941f6d53aaa09d3c335d891b789be87661de3344731c636f420a0763c89932a6c26a1af7040c859d96cbdbe622c1d127573c3083604b46b42eb9a2c0e433f4388e180bc636bafc76e6cbbd1587a99e4b67187ed6695669192d2f055dab7d4ea23098702d174ce6e8dcda0873736e75dd3b2e4a99930887841af6ee660bb221744a45201c2e032d0398e89957bc0c897054916fb98a28c6d3fddcbfc90f1cf5cc86c611547f90aea1b07226deca2c0aac22171fdc9d41b741e41b2ecec6891ae9206b2dd10782842faf5a9ad4396a8ca0c0a7f59cfd53341e8c48ce8f9ac55e3c46e1ea08b90fd22f582a641623512e435ed9dda8a7f1f9648bcc4fd76259ccca4c0f3f9e6ca0c5fae8f30ededf86286a079202b1527bd97d2fb083946d93f9f22bd4616399a4f902c59b4859da8201e9956c550afaebda256e2521241fd6a87d41b53445a64c2cf7beba29ed24c555bc1541f8b4af102dbcdf08e6a6fb6cf0440e5533c67f9384c3e71ee34b4748e8463858a025303a23a3a969dc78465fbefffac89df4ef295f606b01e85982fa6070390cf5277a4f13c4b920db7bd5df540c50d1fe0081cda616b135c40e633c433808c0806491b48dffe85f377242deb54268f06d43e1ca45adbfb47a33821a20e2eff180927bd9cb28abf6083db5d5418457be7ccd1487958e251219735b2b3c8471ada87a4b804b5522bc05747e6b874af397c985f8eb3ac5b44ecc63f19a276634bccfe5ce7a570a7050c01db4dec80d5f0652006855a4cb5e7c879e0cc6cee71d202590020a62e6ee7b90a2c864314af36cd61dd015fdb85c3cd3beaecb4c2187db8aac9a1c5ee583f6883dd837541ae6a118d0d6fbd70cfc5e3742f6dd6a7f732a1f95f0809d35bb0a9da86ea934285927ccf68ed66947416512046b028cba34d15932c377079d276c3aef0d5c795b875b4dc6fefddc620103680e29502c5d409e8b7db1ebf7325b0882bc61d10c044866dfdeffb5c766d705c4f9cc17c52c4f1cc45e3d4c28a3449e5ac02f0e9e0466d910c7b440793e5f98db4ebe70ca6c27f53f2da02c9305c4d75dc472401671746c753e2ebc15e26aac14b939376e38817a70de4a25905c9ed3a4342b12b2dcbabae5e257fb23e58de344c759fd69ec76216031adfd8dc5cf7aee22b8910187031bf9fb64c14edfc6f83f271235b84d7509e97445b946a0c026f752568c7ea2974f050389cbc9a0ef363ab1d13df90d86ded3243cdda4b3771f6cb9b1dbe218a5fbbf322cc33807040401ed6279d1c91be901875c9b40e857af3544ac45318eb1ffcfb3d6e404dfcc58d6f920cf03ab0817f5c642da5d03078118d54ee15c0570872c4ff67d051a490906486ea8262b1d9a94abcc8c79a34a51bf069b72383239fb3b7e4d3dc34993e50840630f444082ed462d78bd025170d6e620a43c9731551c11c3423c042ea5c71574603cf3a8b9824ffca3312fb91e875da5ff677a13ff11821fd51d6904bcee0f4caf9835dce107b753242d2137bf9b5b186cc887ca19af0e1c311fe104dadbd237353a518e7bc775946cc5e7aedc35f2f4f94a14a741f108ec4079d2c4ae2d274b6ca4b87a6880f1c1ec3afaa8acc24fcdbad707c576f8fc16848c9dffc7efa75422f14d0708cae1e5220d8ce2eb68f934411945978475cc5a9eed282bf83c8283ed981be4435f37c3d9bba454d70e78c96f7d21b192d6dfcae86c036203acf2f22e093da97ab7817a82afdf60d38d59d40fc122ff5069bc7c9d628ff83dbc07e8873f8150a11ae2d2d0f8baef5392237adb92ca6c5f9303edac7ba58e11b11fd4aa160346a428f66301969cb36c818b3ac5e12fc885d395ecb4318d179d6dfa0300c7005588996f7c44b099c2d6afa476a284c1b7f840cce56711522ef7f03097afe348ff87d6e4861c4f11d3e1fabe12aa79897316355b3e4609753e51040da7a492465bf0a3167e946feafc7f929307d3b3b8e71095ee1119820759aa9bae2f6dd9610e9e0070906914d32b2ea75b33ddc0cfbbb5d4744417bfa5dedee8f824a3cfa957eaa070c670472654abd00be3b127bf9c52f7ec477101517cea954df2f5ff89d270fae6132cee91021a9c1f0ab168c62ba6e662483eb184f05b3c8efd9dfad3ff573d9b5c05dad960e4c31fb00df4b143e331db70e35d5d74c3fab136aacb8caedd889a3093c6a2a23ade9bb58c1ec3f9796a2ab7d58713077093ecc53234695dfdd109263328bf538ae8db826a2e372f2cc6d82cdb3702cc6e843effd327a5c99b6d89c49f99f4b57d4cfca130ec506a745610fe2352903b6ab6c2c4c40d81839c7a28ee3406f58ea8bb28838eef143e6727441d6a31837a266f11070744796e5b85ebadb2a40fa72847e267464dccca9ab07d544dd4ed2cc50debfb34e683592076f5155f24d2179347ce507e63bf40d0580277abc87d5a7de4e6f9886aa33424a47428ad23cc02556093d5173fdba1e990e936fac0e5e994c98efc434b06e00c0ce46e503b372b8be14b428fbca8dee6ed85354f664da941cc3e3ee58400cfcd48d8fc3fd46a8d76f4eb8947b87be539e681e905047e112b222a6237222bc13f03f3f137593884d80a2b0cca010e1af7e500ea45867cbac90c4bee03d35c629b1f8b165a43d1e26a66977fb36766c5c8508a869ee0e8926087a423edbee560221dc24977a68c9a34e97cf7d33517d6f168320bf5c4ef0b7352dbb446aec9b53d407dfb6e053b0e7d9708134a6c09e916cbe4606d630e9d09c96900072245f21bf81c692806a14a59131fc8171f0d633d558608f89c18cc1a1501d0a1811f32717b3e4ca79e88a9d9b721206fadbff966b367a7271230d2246e882f92b33d645d4993b3b7aa711f897ffebf613afce205e5d5a60f63dd9b8cdd1256aeb0bce5f33c40d2556d6af9faadb35a3abc717b51e348b0f8ec6d661b49a5c8cdb5df7e8348d8285db61589fa479e1a72bd18f0506b774efdb0d40dfd7fa6ff903671960f07336fea525ded88fe1411cfcee3fc7e0a6f98edf4992f061d060bcd8a1abe4bfea621f8e6b546e0cf029970be2e9ac2943ff4dce3caa559aa17e94b28d444801f1a39cd4bb80d1c67d1f79dc736be23122b578dab96158478fe9ee0061c44efecd58d84fb50b3edbc94a6d77f25f8638ddb6733a33e0e50dcee635ef10edcbac170c54eb5e01f8050941215800b7f580795473b94df4ff0d735dd9126a7bddea0b2ac0fd62540a120d1cf39ac93ede2389e226d02583523eb44b8d073d845a7473fec515035362e898fecf1b8afb2927bc00267502690601a608c057d4c2194c2e56a2955b18531400f7620a222ee4f9f2e44e1c3ef7a95d2e665cd5111aa77499142d7a907dce976db73a95bbdc9e1994cda9b7af86d51a1b217501ec61aade82b32da8cd1b345dd7039fce6c5261df212588d1bce924d9d5f443357146933d886f28dc2a5bf152353209d05504131ec4fee51d63dbff44eb95be72087719af28978cfd61b7decb6a2f0666b34d2f26f1a6dc8ad7f4c04e2adcce77ecfc62194fb194f9693a6c398efe83e0ab05c8824d2250d9f62581d32453ba1d90a4fcbad8aa2c06ff311004b23012a5492284b6a232547703663da3734934f98d6359bba70b88fe41d7314bb8b0d7e77fb7a6bb3a111de99d9b49945af725275b444d677515755d8b580cf950b73413ac9c9f9651f7859f6c76b72fd667ecc342a28b3b48fdca6c852accd3a9bc30b3ad5679bdf3293e8720ad17172e59bf0ab27a0cdc4834989353b2e34790ee91211dfca307994034b5770af48511b541b9b1f2b9f540486901aca9918fcc83dd29f3130e071e9d0b763e80da66073e3eb65f612bfc895383d134749fa8f40d76991db0f0da62df76960efc7de97a06063cd1b81ca305d5f69591a4f964d74e32faeabda6aacdc76e396b5910658a05841b24780def70c3baa21db0c998a09860368c16e8b66479d4ad2b68d933e19e6e80cb1e20d365e96af8dc399d0c1a7ee9a8bc6b54b67ce7854ce46d7d71cc994c31323d43711ab7f6f8330173595d8d75942e1ea1a332191553ef06c44c42efb777baa6ec7b9d5cde737a73901cad8b903986d93d7f075f74c14ca04340daab8bf7d124567e092c309ad6713a4f207eb269578d5923f1d1134656743533aacf87314f0da22c67bf7e261a85c4516125f09ff0ad87c98bcdd21021d5df6eeea03e2648a93e6c4c438d5af967afbe8073e35804b791e08612a7e845463e2cf8efead89bfbde1ead0ce7e1452ab79c571b56e0c25bdd63e43799ddf793a6136bfc33a0df9ee67b68346fa79cdac5da0c1391996a760fa038fad5f734a57e38165427715541ad97fab6d0cfb36e782fd65d94844119f6d228701d83a39c50e93caaed3e3d3fc77c530c9b27ed14198c925b2137cc9a849ac006cb257aee12cace820661a5d678bb00ba841071c8879600d1250270885a7cfa839e9e315ce054db2bdf1cc8d4e8f3682317f226a249ad76a3f910c7f8b134272879f06970c4fe39a277c0c10567c373b5995107e1bd13c5471019b4b142c3e71600c10b5d2ac038215afb58a7ab5718b35059454a4fc16b1a6833250f10aceb6d45327292cb29952ae03d95194de1c485f229de148707a459c91196be828cf6aae06d47a3da9db71ae0ca97cb08a98bf312d3ecc83ff3e47ae55544f367a85b01199e300e6edd6bcc7717d6880d41a9db8aa9fabc355b9c26ae6830e4590448f1baf4debe61d476a3d0a0d926ca9cdd3f702fce3f736dc60ad579886a97370a5719304d5918ee156bbb1dba7a04ce12278ef755f40d3fbcb397141f86a4dd590ad92f8a4d1236c9b18f5d6ab657a4cc5920cccf3fe5c310a9fa15ce6b55637abfd11a5977f198a2345fabac70394015ebf317395d2d1861e1adf180a7d7e8e71b7c58395eddae1998e86fac18a3093fdf9e498f94da9839c6a774b2eac6275e188515cfe5e66608ca8aed85f24afb864a5e4eaf7866812b07f8c24ddcc763a52bf11d6e0f67ca651fe67930e733d6268a70d1d0c0eb7aac89041a5708f05a1002f7e080fa48ba41d8af2da22a2e1c995db1684e61031c2cd1c562ce77350dc9c5f04c768d73bb2a270afa43468c55dfcace1efc87a8eab39668fc501a6c13f6e2bc434a85c88f9c0e485ca3579d213490eacc8e18832ed4676d806b47cd6ae2d2e7069262a3dd3357d2471bed3213ed7dd7b311176fbf721a133549b090e9736a5c62d561352ae31cd1b7fac34d171394f88dc870942966fa4981a15e070c7eb7929aaf34532507b15a96117d98825a57e3b2c3df11b9e7e7bcd7838f06c091f0a0021c4ced4639377899859b63b4d4afca1f4b7bc9584732354f6f232b9b1fe057b0ea12b2452dbe23e365d00164af080ce1ed85a79c7a7cc2e2f6c92964218baafcbb80952ec3cb3ab14312f23f2561d3c63925b48460d27122419f954f290aca3ac91c7039ec3474d50918cf7aeb30fbf2ab6ec04777f575ec745c93dce18eaa3941259fe8686732fe13297e18bff393c98e7a40f19982243be1b05d7bde38dfa3609fe52989af0bb4b7db67ece11a77ffeb757edaa25f306e0273f3834ad54b97116f288b5b85eee5a678f09b0d8bee7478f2e45bdd6a5a0b750165b66af81fc92fd1feb8925eefe2db5c1","title":"面试题 17.17 多次搜索","link":"https://leetcode-cn.com/problems/multi-search-lcci","question_id":1000024,"issue_number":78},"76":{"day":76,"pres":null,"tags":["并查集"],"whys":null,"difficulty":"- 中等","description":"```\n有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。\n\n省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。\n\n给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。\n\n返回矩阵中 省份 的数量。\n\n示例 1:\n```\n\n![](https://p.ipic.vip/0aybb1.jpg)\n\n```\n\n输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]\n输出:2\n示例 2:\n```\n\n![](https://p.ipic.vip/94y5lf.jpg)\n\n```\n输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]\n输出:3\n \n\n提示:\n\n1 <= n <= 200\nn == isConnected.length\nn == isConnected[i].length\nisConnected[i][j] 为 1 或 0\nisConnected[i][i] == 1\nisConnected[i][j] == isConnected[j][i]\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a33419dab438a4a074246202662680898e16664879d34704a893c930b2c884fa0fb0f10fac65745e3ba12fad6b71dba02202514082975c4e747616d1aa8bab20aa6024c428846fe3ce839687f450285ce47e98d3d44d7a0d0f4f668294d6daf50bce60700cf8a42ad8ec1fc35f226bb974769590e3c731ecc76f710ff69ea6416429a197c2a35a8c0ae976b21355d5a147402304c61e5e50172abce605d0f32c8647cbc9ebf6e8d01e96e7719a1be9dd34ab60f4ba4e0405ae8ad8e6608728235cf4f432eb683c7fb3a18a39770b6baafea0496d267ee9d048b1a0b2e1501d89ceb64462daee7d6a247ebb380c7237e880e51220fac43c1ab94861af4d3ae135d69fa35e77c8f4d094fd464038e7bc7ae4160cf0621ae02be3d6a0d964349e59326b5723385482f1490f1da02e6fe4d40e0ec206d0c44d0f76799a8d603d0e2a18cdcc8b2ab1388728c9e745d69c08ff5ed7ca4b478ee7259630f54779b962882af08ce1a346f5663c23888c2de231ce72b3c084ab1a6493664a9ecb1540bdb483c94c685d53f292e79d731336d0783b44c456e38bc0dd7d30b19bddbd359cd600a7da96ddd015a092aea68cb2527e66eada1860fc51040f66573263f5b786dd721f5bf81b8e8f569eb53a0ae2f8472be28195bc5eb840d0e81122341418dcdc1b87ee4c263eef9a4043ee3a012c59ce5461b6bcb32c95fd97a91ced9947020c0afe390495eb31c0e84b5bdb0e3e427cff7b8ed84da9d590352a5fee1877c784e3b0f3e8e18858d022c7e19d80f0a631d2adaf8e096b661177a624f98564a37a97b9b29231ace94eb3328a1861e0efab5234e0c3c664c72612863deda3e26e4d8c1f802332b7fe7fa58f1cea8f59482471a89cc1187d7ab6dd0aa1bf508245f8bfabe358519bf4ef14f1cd2057e19c9811638bf525769fe9b5f6fa619712e972d19c66ef3aad6bc71fb1a0d4ef787d52990232d32a730f0dc043ac563e5838a1a124e51cc6d7df9f4d5b1182af04548aa109b97d8d00c2cb6dfdfee9800ce2ad38b65a13c525123f8be3dd5a53bba2e6a27f9b811fe1b886489881ae41c926b8f8f9b57b8572dd58682846c109921b0ed00120811bdd79879a024de0e905a2eedfbaea8ba5dc38a9a8b1dce936a745ca6e28ed351375cc48dab733b16c82386879ca5992074bc7685a451de749127350a2152280e25fe55a7651c4b69f93993b7874a6cbdd634ebb6739538c2aa3d94357ec93d8ab0185cd828261a8ec0df3e3e035fd6cefa6d0e4b796f43674931437bf7c82632e52cd92aa757d826c5c0d9264aac3786e26e167af46095b51c907f92d755be0c53d2e8887b733a48746f1f6e1dc8967563685d5adf79ddd17ddd183e705bfda8a4e38da67b3ca594f3556f99795e30e8d68b663bfda42229c5ad202e467987c77a38eb4eb36fa010b263e6ecc9b83ab265b6ec04ae08efca5186ba9142f80917189abb3c0ef2ea60b5deeb65066159125d46c921dcfdb68a2141f742fa9b89744c845393814b7e018003d983d0be26a8afc654b7ab01532afe5b663476d9721cc392a2ac23048d18b4bf70cd9d8929d4b262bd91a9ae4c097e8729d7df68041a6d4c7f9e3ea30054faa989299251f67128677b89a576cff85dde9bd6bfdf90b95c27d16b4a32e6fe99f77e598a103498a79283ab13446ede454ac3fd7c6e8055f3a3acbc0466832390fa76eb7c71b208c9dad88730da38955cad965516b532d735aac7cfb9887a6bb237cf38d48b868308611ed54f6c308d3bbca0e66f7983855c4784f81baa99f62d708c2877264240a0dceee515032e7d180a7a2c26ff7b16ea15aa4e0b0b4185d9b31a332e2a16c8f487207208ae91856d8150ac1f2c34a2ffa09ee2e59371adf6f566d50ab657f933b3187bfe9f8f9d98874a76c77d87b88678b7e0aa4986ce51448216994906de4431e841f1a2c71579ac3942f3bfd68d8323eb569e368524969e244ab7bdf2d6ff0649b6c414f049e6588c5b4a201f1ee77909b957e7f1891fbcfada2da5840a9f426015a726abf15706d6090e0667bf75d1c9153fb2339712d5375c0db5607f96fac2bcc2f8210e3eac9f81ffbf711a6b158f9a550bc95084b1caa249597c6edc4804f0dec43bd05f26decbf9774a38fd74d74f3bdf6438fd7202980bfaa41a27d4a75fe6e5a214fd9addd1c28a294b4a9a219a3d87a84e2441a1594026763452210e02e62e85c7877f904faf6c992aa7c98adeb3e1c97c57369ea00d130388716b09cd881dffb0738b89e2f238ed5d8bf30dd9b054ae6dac2c0abac9b91e80ce84f4f2323fe92e108bd61d23e69077940dfa83a4c28b9346e005278b2e020915ee4cdb08a7a8a352b62abf6b9c2ce6926c25246f2c1506e879947570184ae52beb3155176389519867cef1f4f5316672266e89e73c766f76c409a9604299fafefb946b8a375fedf95299860b57fc0332f79da997195e7aaa3a9eff131451d4a1c7204289d5e561ed7ca1326e2e04c322865c8d5a0a696e80bc72f8caca6ae5dddd18a5e84188dbbcfd33c42888a353642ce147dcc487336e75d0840f1ada976ec89a86089748e653b68959b9fa3ce21605b0f49cd2f1499be788a4276a94b9a645b9a8e53a88e1395ef605f25f2dc7f3096667d75155a700e07d34176e1652583668dc999adc0d6d8d1ebaccf7fef114e7dfead5c2ed0964b1e49699ba67b4524c6afb0e20e0781d599d8fcd25c5ab712004f5bfef21ba860e7f2fdb9172617384154a9d13615c60753e46b895a6bc3ba9217a8dc0ba364f2b7b276106a25adfab5473b69dfd88578c340798c8ecc89c8486435c3b9a9b62072dbcbf10b829b53564bd073f4a68c98390c7ee3cdba3738c71892ed67ffb47f0787f6c1903cdbff7f4840bde4b9dd8159bf9776b2e50af7b88c458b3004a4ec76e961446ce888280716f438bb04d6114824bf2f5a3ba90f56f2c084d086784edfe90ed7523cb4bc24a33feafb4f7522adbfb9f91d8a8db96cbc56e9525ea0fd50fa2e5163b4b9cabc79fd8e6c87dc38719344321c2b276844a4ec525a939f47ceed22e8dcd4fa96848ded1cb1e84c28dc1332e58d705f554c1fe57de2ddf60e7e43fad8e78cb87d584a8d4dbe580cd7dcf9853819a869fa2028008a3b09a04f48c813513b241640a07c43904c65a42d5bdc6f726dc0aebba43927588eef4f462f9ee70d88ef74d6f85ae288908d8e8591d7b7a164df620701b473ced39f7c010103f5904d604c8d68eccb1ae2756d7e44ef4da86103bde5e82d1ef4e8ba20f5d4f0570de6de14fd1a23a419f6e9292d1f359decfce86c71e2d5de62548a6ffe2859b98fc7bd26b589b665efdc79570bee51d93202c59ceda818cfae73418f11a08ca0bef92deb900dd711da49ec6b37fe585675f1c64f9e84e03c88765f140067fe6abacccd25952ee2a4ad2b621d2cf4c75b44efe15546e30d98c7d0e3e5dfa13e0df2aab8685f3dc4a61a64aa12450cbb63e2f125068122b9c6f2f6b0d25100b212a1d8ecc025198be128b95ce3e7fef90b9ad94f80139b9a50213e5d69e6e9fad4e6bd9f1218b8713056d2b1ed2b4e31d4fb27a8cffc64e2aca77f8767891c74d6e133551594f37637b126db3bfacc6e49ab69dc4a4fa17e88665a258457eae17560a7eecdd7eec15b027e7ab98d9cf6686abed695c772ebae4d1543e9b7bf05437cb84c776ad80845fd854ef6b18971e3fd09c034525e839049b1c504fd8816c02e42f773d57eb2abb266fea750f11c60142cacfaa993f0605441dfb4efb0b8fa29afc3ad67f8d30abc2cd4c469f83af634499aa43703d78ae0a955417fc316c09f6e50da7b5d3d7eadebddfec2eae2f4a5cb02d0fb0df245b99624f1b4926763bd961ecb3aa09f88e704e37337c0d2d066abd919aa64d90f1abab865759b18008105918c407e367d18441df04a6cc54ea8c6441c6d722352f36bb77a358722ddddf201563645df5cc875c96133e09a01c02a32ccefba2f22eae65407317caa515d6bf77c88a360012941952f9d642e604455952a151764a69a35628cfc397b438e93be600e11c6032f292bac4193cd18f2d51fb0f5246142f003330d13f4b6e73537d0e26a6ad48c0c3072f9065a8fce019189436d06c788f159be129f81341979eb9aacfffd7577d783f893507fd758a0ddd6c32e32d5beff80b1975d8aad6d5fed1d7a03b22475c17da7d3706db572c0148527eafa9d5c9bc17e77bc9e8409b3f119d2e2efa889de677952b848e714f5f541cab3741eca393b2e705c5ce1d16be675c2beeeded37c621a43b8113f15fd5a07c09c2006dc888e04cf67cc0e52655552b5806cf894c89b8ef86cbdf9986ee1038548851dd69e888e068936354f7adbd1e37c2046b79de12653e075b25281a7745aff4e4e3d44460e7836bb37a4a8db9479f8f6c3ef1bef2c9cbcdf05275a8afa33142356fdbf1a52c275a78db31d18c9d30b04f6da505ebf4362a217fb663c6e3f778a1b20faea7dca6e9bb42f47d827acb1fce6bc81581aa9efebca0ee217755f30d3e59509771601dc8aad1fe41ab05f2422e565086da775e31492ebc9da13cdfbfeb39ea298181f9480d7d247fa7b7701486455c2a804af69b056580495218ec215fc7087248405dc3bc0f195ca659b57813986fce57442d6b1baeace9f43b6eb15270e49c4559f822e7038bf79ee3c7404b39efbc457f5ff88f7cc9172a057bf41779ba7b8542931def5741b619dbe4503cf77742e5aa6bec308f852888c1c1544591f4b530a7e3a449849716271c6f50e43e1bc8248a009426b88f7dd7a29ec3b13383193f0567cab4b35b6ba8978d660cd54c018cb5f388a4881257c7b09c643af299c18ab61e24c51520aaea2d5c1d792811e25f349b07e3c76523c9fddec4dad494982cc632355337fab14e3be1465fcb268cc3ef92866c1ebaf94b9c961e7c42a19fd375221a991a6d8ccd2e69de335f541c642e4577077ed5997cf38e7b39dd040c859d96cbdbbb08c1d12757611ade4a0b06f446c197d8fb60915c8e7b4482737560cccce1fd55c7f9c76170196f8527564e1b3174125cad7f10da75d60b6f1a4eaeabd2d21456442f6d97776624cb9f07a9da7c9ae26642e1423b040b655f7a46691998849942e023a869098c47878b2effa7dedcb2d70f55bb989cec11547f90aea1b0720cdeca7e4fff594352c8d64ef378ac0962c3c7da39f20a6b2dd10782842faf5a9a827064eff485e3fbddb9173c0aaf62ce8f9ac55e3c46eee508719020a5b194ea8cc6d8b585d9220a2a3419962a83851cb42d1782c6410f01a76c94b8a1a4bd24c3dfc86d3d07db4ce52935a40652aba9f72b93b3f2659b356396a5ab5cc586550dd6c61ca8cb284e43e088896b6e6079701399d83d67e45438bb513ded94ba29ed24c555ee501583fdd21030bc914db1a6b266e26c545a699736ee8a90ae44a6434e35f36c1258a025303a23a38369dc784619f1adf2d79af3a6371a396b0ce811c7e46865135eb07301066ecaf535c773d7de014f5f89f514abdd8c16b135c40e633c437e4792802d91af86abc157044e4dabf91a26aa6143f9cc76edbdb27a7e8c1a32d2c5f180927bd9cb28f6dc223db59c07841ebe32d005d389926b440265466453c06b87a82761aa4b5522bc5526373dc61eb697db8ce2a77385d01d8931a592543266f581a2ce2d1858340c921bacc386075e5c09215f448ecb5e7c879e0ca881a3582071f7520a7fe6bc34dff6810b4f1fa122d64d825aabb75d2d9ea4cadf0c28adec80b64498ba2322541ae80cb6f2f06551ef8e94d91a8c781772493b1eda92cca3d62d6580f0357cb0396da368f9ecbbb46217ecb52803d597cab68bd91b7a9754acd1548cd55af2df3e8d05153158d056501c77294099d9cfc6a3efed8e98da1844e10bef983a150186c2068201476249e0b087f38a1e808c36000ac3024737b822fab0dd8267f91bdd67efc6148bef0ddc034693fedbf55558c95cef6daa9749f8b922eb29a102358951c2ecd2bd94f9ddd0a04dd660af789f58e8bca0c44a9c905084e80cf47b1c1cb6ee8c6c1e5d270b7eef3e864d4e43e65dc746ad76d8e7c8806966554d06e263e9621acf79c5a9496a9f39cc5f443eb2a5dda91488cedd62a9cf349f3f1a9236160fe02da250c1efef307e0f1547b2d85747f76fa55b1b5098ce312103b2b2cb7a1179c85ce9bcf9499558f888cde96f95e3ac49249b48c733d35dec49da7cc0629a2e55ceb8ecf2afaef65ea7cc1e9fb764ac4af90215e4a85ed346342dc74d9b0db5154a3ed77160b3341d302746014228f2727061f9c7e298c93da35751de54c93322721db933694634971c9aa50b5e2f2d0314ce8d7e3b05ea6d057084a373a42197214e36118a5204052fb5c759216328fafbe1991e81b81b2fb958c80fa5f72b3f0ebb589f02c5165804f5ee134cc29679c48540e31b3f7042619ed21b036ce28aca728b3836135ef70dc3d3d0335b0254b221942ecd2389b2fa957aeabdf1296ae2058a41c115269e9cf6076e0538dfc50147c5ef9fab7599dbe9831d8ef28e21d471f4bc01d19d9cb082e6cf2a70b803402e9dcbb66f4cc0f9f028b52a6b3b14c2c1208954d2a82f22f80ff6f8cbb249a1105f2ac3d4b1bd07ca406fe76e307dfd8fd094d3e82c177e0297dd873c383da97ab7817a82e9905e9ad6418d328f3cba0a2cfe799d6bdab63dcc09ea8726c665bb53a3c1b7bae0bb14a62b73c0b8e06c5f934aabac73e69d0ce31ec1fe581d46eb2eeb0e6acec9a811e6c11488a66584d78b90fab3229c1bfd27ce010b952a0ea2b36f7c44b099c2d6fef133f7c1bcb3ff5acaaa2d4b0445bbbc308aafb005becb9ae1b4067b5ebc8f81f46faa6489620d1f5b3e4640333e59571dcce8de4817b5ed0c00dc67e3fc3fa593178799e3cd68d0ba444bcc070befc8b50530c24b4ede121fe9d6c62a2b7da7d1ee1007397c28179c1f27a448647a2d7ca3665f06944a025aec7d47e0a07257e83e3af65741c55529ddf7cecdc6eefa45bcfca689df703d6f89e55905c79e31d9b81cad17e03950d84c51b9caf95f16a4fe9efa5f28958059d98224271ecedd1cf448667fbb73f25c0984d88ca70d5513d9335d4a11584121965557006ad22406156edb765fa0c1852a4d10d5a2fb7c6068f784c1945d73cdbe9ee020a3063b3104ca84a987810201e95996c4409c63a2317aeb194758dd78011a0f604298c82f08bb21b5e9b893d079ba9756a4842e62005ca6492228b38854f1ae53470f5da9392269c5f3afd19c9995c312ddf1a5b1b8306eef868d0d3a103751cb3dc68725a2e38264207401f191e56928ab6ec8474d34a8839db8fc3db4ebed2aa65df44299d9cc70dc7c9d84d56d76c19ee560226102ae39f7e917e0c4118809adfeaf0f79de9d586570382ca601050533023c2662f0f7c540aec962cc96858bee3b498edb19783175234461b7d4d8d032d309b9a5081faf0a71c01c649f10f207b048404ce813be5991221b4fcac1d2c589efaba3cb91d375fba3584984d5f12377ceb3860cb49ede6f48c476ff43d3020ca0b86dcc3ab3d21dda23af92e2652bcadc52d715aec16a0cc800402b702c56d14918a6edaf26c08037e88ef9114a098126e04da43530d634c08fce726f29bce59d471883325334e4febc02d4dd8ea8e77de69b9ef845ef17d9fe7c657707f05caf064e40760dd816f871084363ac393c6713c8d28fabfcb2e742de370ce61584b795170a58044830297b02f39e4e057e729191aa08293fda3faf3def6d6fdc0343a243c6b3f5fd98c26d7a321f9b9f5fa06270cdf54545e871576993cf1b0c1718b8d6662733206dc5af7cfeaaf670d0a0b32f54d51e48739144b0a1e547661b44a50d4b174b856c3bc9595df21c022eae5ac9922cd31fc1a1d9d92c60548844cb06735faadd5e90b3f6d454785dedc3b183976541131476186385b4ed47bef2d980a55b57e400b22f6de00d6149b46748ae16eb13e3284650a77e196e7a6ce20cd259e3ed4dd21dc6e501cb638d136c6ae6fade54d810a3ccd797581648841078bdd1b548486ec5efd68e847c9e62247f79c9bce9b672bf277aa1872cf8a2f1132ff3749b7d13266d009c1aafea05d9689b4406ef720e0107f6087f8c3af94afd1f9d8133afa2bdb5f3b741c41773e504ddc914a58ed7bf06ca6d240a4a7b30fe59a3db219e21ae1c4eec515079737a89cca3edb8afb2c57bb00c3b0e42d734527ba6057d002d8e96ce567b5eba8936400f760fb527af5fdf3c6dfecfb343d98ee52ad11c57a47744d447aafb63b2ac2ed273b445bd80e9925b829a289c3951aee744135b9455aae8717bc4898dbf098f651db0a38b6100fc1a59c65ad5dc08c00c64410014742ec586aa84c2fe9515231a669d0d524531ed58f21f8065ddb51cd80fb2438e7187efdb6ddad71d76bef0fcf27c6f28e7f51c0819c1b0242067ace9c4b73f9d836fc0a86217eb9aafd8fcaab0375bd321887f87214ec02b0648181075e896444793a18afbc96fa83b004b690a6809b8200d236d614f283f63c72a29ce0994d422d6e3229ba5bf377314bb8b0d7e25be2e3ee1ef0af4ce91fdd55d857a1875aa148725121f01db8f84da821c731b2afad0d6794b6d13af86382ab3626ce3391261d7bacc94e7953cf801eb160eb9b01cdc3d1a823b2dc2a214e8e42a075c629c06083e2b923ceb7e7b712844e91f118df87e1dea0e464c5aaf480c317e1b9b5964cd540c83934ec28059b59c689bd17673b430d6bfaf2eec43f23575e3f22fa94ffac1f1367e5b065dd48948962cdd8f546d8c30f72060e4c7cf8ca02a63d11becb1792051251c1a4d9a5114aa18a5bdd320f7fd76f28d9f910611e65849df3cc9a38c4646a3218026998a09cc0863da4484694758cc7070332ffa81622c943b26ca86982a06455d001f5d0b2b0a365310fea27ed09157d0fd8a36e394c31323d4625fe26264df2c497bdf9f892b16fac01a3321cc2214ad4604d944d15d2b802e86efc68875d861b2ab325870e50bc2314f71ec729cc525a0e890645b34a9b4e9b40dfd26d5570d73a5e406912fea79d59a2f4e580f5706142847acb5621de2932efc73ebe87ddf5019171e5d08f348df3294b1b0753e1b5df48fbd03b129cbdfaa97cd6bcbc9fa74aba9553235803019652e28623b9e5438add3cbe0ad89bfe9c8f8d3c877504fac68aa3ff23a4458c6ab253a16d19977694425a9973b64f99008f1c614e43dcbbf0fe6957713dba325d717d1ec4f16192eb79d7b4a7e0e7e309039ab3e0ff822e9daf579c806596acb10329d1c91733fef5dde8be29fb0ddb0328b779da9209d4e9d926de00d18b7d300d10071b204ebde3ef0e7276f5e06798fb001a60c461d8076783a0856675f9e8de5a839e9e3159c4019aea9bfc48d46823cc06f7235612d9ae42b4bbb3b628b034b3699f32cd44301addf64280443133071651c8f67372cd83b7e3f44cc4b5d626a0a4f1802fa87e50f8247e0fade05ff719635159e56b6bb1eadaddc1019f806cee5911f617a40d1d716a649d07b94de55060b22ceb540642e7e97864d09a138d55dae549b3569d6916bd344e030f58a90eb63787bc583f75121e85b07066c3f85bd0c99f22aafa382bc8e3525689dd458d4ace19aa38940a0ff69a08438569347d764b564aaa9497c612a5769f24683e790bb43afb0f745932cb145d1c1ae2d02a56c8e049cc5c1cb10f2ff9fc4e91ea26e3d8120124880bec52d3800fa2204b0dee3d7bbf09467769b74bc85bc4b440bd782338df4ee794518b5ac42e6fc1863b1d711a5977f4ade6217e0d39e5bd85910fe3c78f6969fd940738b5d4e74548e71b798a9bfeddab4df8e9bfab4be7d8e8f9a9998e44de7c6cb6a784a28d76820fac80247e555292cf9fd8dc27524afb864a5e4acb8d4681af977977697866b730ca443ddaead39fc5aa406f0597d712726e05955170efda1c3996ba570c643a1497c1d4741eaceb50c9ccde816a4d0fee8dc3cc7b3423f8588485e66ee687af69c5f04c768d73be7a72bbee5396ac55ffaaca1f8e2308781393ba5ef01a6c13f6e2bc434a85c88fec3b9cda93216b8134964ace8810ce00180a835876be0392ccba88e936d7656d37b31a3957b1ae5e55e0c82bee39a3e368d6eafee9f3653bb70878c29d0c1aa6bd21291a3427de832b3b2694f7faecd7c84176accac78b4523496ae5129c3cba0f79304f388464dbf23b1a78053b89372f1fc78fafd16baadeae087d1185f0ba15e9b6efc34ef7391e966684323791129b5eb90333df27630444f5151d2574656959825d8c59ad0e3504672b75bb9b20e0a28a6d3dc1e3ce0df10100f6ca48971fc6f11f9febca034b8a7164954e7c48081a612504bb057bd0634182c5d2bc44f709cf0ff4e161b6133a3368a2e6290fdb3d38228cb5ff84181ead7c65b1cfe403adaeb7bdd14442673c2f91f276e82d56aa89b6997e00031223622afb32af1180641188fe436b152bd63e47b72e7436cb168c154affae8ef6b9e4effde11464a2d9a3accbb1fad766d2e21ea01e9de0e101b0478ccbacedc2d496c10389b6c4cab7831b149c1173f06ea83fcad52c08a3395d890163cbd31215202a1817cfbffc38ee58ca7d0fb786de897e73be1bcbc674e081ba73f6782ecc5703c26dad5e6743525efe757f07345aebd81bfc1fbde373c57261308ce970ee02651939852662d99736fa792ef769a14e44abb67d16432a381677404fdca8fa174c7b5c107f869ec3f2f5a8c97e38725fcf8d6b025f99e46b1165ba12460fa779b92b752beca46825c548ab332b02f1e3c5d4d4b237f8ede6f14084a18e6d9e3afa5b7b5c6c900729f4c03b20557de6cfb9b45331b1b3fdd566a39e89f7e58bd2b6b3fde3ed39cb062a1c59a9c1b6fae41991b2d5666d354087c529ff0cd9bb0dd445883b6bf77f107f6891d8c2f4499c158df322b5f68966e4b8371c92193beab52e1494e0b6b5b53595ff1d464ea3eb73e56cd1364f603fe6d749553b5102dea679908c0b29816dca0f82ae63cb8b430f51f8afa9f98bea87c63918e4a364b77dff5141afdab72f4903b541c422e29780ffc5d3b8482aa8e1c0cecc64b608109695f294e2d2a57127321ae84a3d1ce376e5181b1113133fceddf2bca4b8f4f96ff81e4e1e0f6119ecdc5bd86a32a81422be03e8a15bbefdf28931eb4da2e2f2c0967bc4ee2a5fbd8e4d2733d8e4335e093abcfad35318854a2780599b2a81e8fe21572d39ebdf217a87d24581e6582865060aca59d06e33ed4b9884f56cf3aad6826b2b41e841aaf3dcffa6da2ca080101b7a61355b742493905a4eb787a67b496c6d17a8ea437a34a17a82283268ffa55f27a210ea81a9a375eb779554d28b70f5c4ce9798e283f9c3c7e80c88e6ba225e4030754193332ff9fa016a62a4c6bd213e41b22de65489e49a811a5d0e5be2a88639658750b4363dea94120b5368091a9ce38dccc3284d46fd8d7c084fd9df3a61eeb0b783c5ed7b5c9ecc3245f8154078f9d8bf82e1689accbd027a27b60d46fbc94099d074b48ea4fe13432ecc93569340759611ce79a8defa57c8d991d0b02b0ad25b8a85d7565e665fbe77a0efa24d163de59e7237ab973bd6b432a03edc1cf1385007a6dee087f51daa2b50ffee45d97a5b1b18d6da3950f89433e0bc7ea1f7716967be64585a1907bdd0df788168ad53a10dcd0f75b1d2cc8e4d257d90642e2f61302f0","title":"547. 省份数量","link":"https://leetcode-cn.com/problems/number-of-provinces/","question_id":547,"issue_number":79},"77":{"day":77,"pres":null,"tags":["并查集","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n在节点网络中,只有当 graph[i][j] = 1 时,每个节点 i 能够直接连接到另一个节点 j。\n\n一些节点 initial 最初被恶意软件感染。只要两个节点直接连接,且其中至少一个节点受到恶意软件的感染,那么两个节点都将被恶意软件感染。这种恶意软件的传播将继续,直到没有更多的节点可以被这种方式感染。\n\n假设 M(initial) 是在恶意软件停止传播之后,整个网络中感染恶意软件的最终节点数。\n\n我们可以从初始列表中删除一个节点。如果移除这一节点将最小化 M(initial), 则返回该节点。如果有多个节点满足条件,就返回索引最小的节点。\n\n请注意,如果某个节点已从受感染节点的列表 initial 中删除,它以后可能仍然因恶意软件传播而受到感染。\n\n\n示例 1:\n\n输入:graph = [[1,1,0],[1,1,0],[0,0,1]], initial = [0,1]\n输出:0\n示例 2:\n\n输入:graph = [[1,0,0],[0,1,0],[0,0,1]], initial = [0,2]\n输出:0\n示例 3:\n\n输入:graph = [[1,1,1],[1,1,1],[1,1,1]], initial = [1,2]\n输出:1\n\n\n提示:\n\n1 < graph.length = graph[0].length <= 300\n0 <= graph[i][j] == graph[j][i] <= 1\ngraph[i][i] == 1\n1 <= initial.length < graph.length\n0 <= initial[i] < graph.length\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a3341b691438d470b7d69202662651280e3596d89ab027c50b434b5032d8f5da1f70810c5ff5565c173cc736e24c977c5bee375114e2ff6a50d500e56a2f9cf2bf87d4428f640bb65c94621422b6f80ab32cbe4786baaf1dc8187655e144214bc076a7bcc3327f92a6ce119a45a25af85445278003250f16fed57ee2f8758edd0cfe46c7e466c8e48aeb068e6ad161d3e1aa5846548e82c4653fab3511d7a19abf3f6700117be258b22f434a3167a3ab8179c67039d7bacf87d6be34b7828b67f91651451afe7536ee8bd20582ba3314139cd0437a43d35a4ce756432021acc8afc28076fa8edcfee58fdb9cfc8283d984e516411b741cabd94c604bad1ac1f4d69a56bf868c75c1f2aa82e4ecdf71619acf142c38ec848996afba910aca607c90a1790d967cfa74bebc56b8b7d861152a89c1204514995ad77f5c8dd74482837552c445359ab6ea43713ed9ac35881ddc57ca4b47bce5b59632558478297189a69fd67152c6a5b78c33c93f4dd0b3be90a3e0b5b9aa67904a1476ab15405da6f1899f48512dfb0e98880573fc2eafcb4241e4a4ce80bb18c1d45023c58883b2909316d33cf64200f52ba4840a086b7139dc8e0178d6f43a83c69566548020cf447a9b8cecfc09135d1d7253661d476d95015079af21088a0cd6d283929a68fb5bc1abfe4148bfe18ea61d2c971cdc47531677caf6ef1128a74f4b2efcb1b0ab1c2fdc9386be3742fecc6b8f7b8c176b2e9d9948ea0c3447f019595b3813a1a7257530bcf6c96c26f101845cc5051414653e399938cf538082b1e4ff221797df542ce4f258f22ecc3494c9ece452f9df61602ade4a0b0dde7b52ba0e56f5ed7b5bdf182bcca916d24b073167b774b0f471a89ce0f85d69b701671c950fbc3d7752d2ff47ba54c9742afc315bae7cd66c6532bfd1e4f25ba88e6e121702f12cb572bac30f5d0a2af05b436af2edd86ec049d121df7529a7e29d9a822a76e311214357f5bec4973f8ce135ce4812284c274c50a73206dc8d309092228378d1ab3b0cf5dc87754397fe1e259e8eb648a58162883d20cb466b413d0896a821f2e87e3bfe70f8c2d71fcc8f1983f68a16b2b8274196e4d824e99769421cb3c73d74786eac8191c5fe89f9a8e330a190b2d4e31674938beb5ea77712bfff7cf5dd81c412a7153f18431ad013ab22cbc23ffafe8c186a0e6b307e04ac8c7c29057dbc490f01769f0b30a965db933e72a22c477a4ab22f83b06634ac16d795fcaf4920926c0d276de42c9cc93eacb8acd8a84e636a1d14152dd7a863017b8990099bafb4bf6173d9ee280ceb07ce01d73c574b14102c978cc8f60661ceeaca59d9ba4d9b685583ba481c3d68853f61123b24b92bba0b410da9e98e2a13951a0ed1aa426fcff9fe26d1146e49f4f6bc5fe112792e4e8b84d03daf062c86bb80eac00f633774a01dc366887e807ad2de6e9585d3ad10570ba160d8eb91023f5f7529fbdb42c4e3518105d9e4cac0b452669d6c525c3561754b4c751981372b1feea01873f505371c34545508c112b8ea1df77b187b9a802f3c32e1f4322a9f34e97405b9f2b792fce0a3a8341035359f4e0a1d6498018280644f3f67f495989ba6efa2844f918ba3dfbf789799f9f6ffa8309a3e0b0b3d3909f0509be5f1570b2b1ddcf3659d3615fdecbefe3ba134473f45e4dccf43f27c56a98e5c0ba67d337ba151dac0ecac8a1226a38316984723b8493f78cc2f4ea234edac9cdafe1aab7fc7ee1408c764c4153ddf0b21ce48ff86ea6770b4ebb9c2f3ad4c15c5ea8104663e2a56ea881ecc79508085910cc8d84c5a2532c026f9d4d6fb23720a25d2d1efad9dfa084242a362a41f1776177cebcec389cb83dfedeb43d5b6942353230d0657933ae36b27dc158ea4997c67c26510d2532a8c303ac6036559c301a3392150085f418ad222350ea025ed33aa4b86cfafb20364aecbcca9d8a0ac1bb0e83438f001cd6b22e56615f15c7ca7909d070d666be45c8a2f9254920b3fa32b51b710fa269745bfa0f0adc27d17d718607253db3b500cdb3f4957bf06c0ed5c034d847ac10d3e0ff5ca6cd0e3f5d0f4312d398d5441354143294aeb2930c4cffbb01d23a751b76c9ad8feb0ff18e0d2345c83a98807a442cb5dce346fb32a356a1eb9c5ab48d30cd264b94fb36298f2786f519e1533a2a4654db819e7fab45e30728aca3a312bcdf89b36e5259413eaf933eca82409d72a460be3aa7d3abd1b6e2c2785b3796ad01223f8b674209d9901cd4b673809fecf01bee758af224e65ee62563faa3d96a5b51d44f1b667a1defbb0dbe1e96f41c12ca9242880cf0aca5c2929f48fc0f13812f3a18f65cf81e76bfccd07ccd55a92af234a80a8541603bb1fcee61d6ea1b4a742ce44e93211aadc58b75b26af7d6f9fa23a5d85b1185895f73071bc16afd5332facfbfbba125da3735b5cb03ce83431ad9766ac3f7d4bb533167d855bf91602135bbb8804643dab2e004a879e9556d5963dc8c69ec049d92273a9fd73ac6592436f496bb2ccd8e4fc2b5b6955bf755587497a4cf70a48a9188def3bd2203c3bb3673914e6f66088b4ccc942736f17b38f90ccc901d331f2b0cce4c030932eee13c4d27df077458980302eede51eb7ba8d85d10e1ea9f25b2f202e57cdbf2c5e5c7edb5fe0fd4fbffc96300977f3763396956f642722d171768bcb7381c73416d8932babc855997ef65f7d8c5552c38ad031fcd86e81d282ad67e45cae2c32d1d80a0cb57cede3ad183f6c8b2fc8d3b746328c909bfb0624264dfd5e9e5e2d0b74dbc153fe89c396f192e8e71b3d37660392259313bc08ede1165898fc1259d5775b144d7fb2d8cefa3fc1528031e2cb33769f125f241ee30e41aa43b968beaf3a45e201c7642e7459f2b1de103738da0a0bf41be51449151dfcfa26dbb2fa7aa6716066491a6b17426e5dadd35ff1b5501d6f5a46c248093dfa04d4cc9ba39f5a045cb7f8cd1383a5102d8f26fdda9100350e3d49fc42ad02089248f03c8a4403327b6c9b5c9f2fac56c495fd857146882a916d760188477a922f461cac7279ef754911b058c85917084df8d8766605fc51fb253c8ed3a8c6c8f28ebe424a6942789ddb38da88ff1b8aa8e32dce107818e829fbf159c08ecf5a84d8ce7d83b13b5406a5609d93654ca1011d5a2c3f734ff0af6a4439d33c1c4fcb861f8a0798cdab81374c3ad66d100e3ef15031f3d4205ed697c104463ed7fc0dd10567e0d4cda10b388bac5b0e810569de448f2dad50326d8459894fd2eebdf0f5b495837a5249c34dd9e67098116e9c4acf344de89879eca452248f72976bef9b4e59292cd51d26b58c9230aa8959f36abac03d27e542298a79aa6faba4332f11a4ec26facc6cadc13c60e13ad91a2914da8d37f567f7097ad6429888e63bb09167782ace8d5880a53807806c1ab26d9891527974ea53f543e659bc0340b7f40fc02b2e23b98c2fbbac84063a72cad6043a8f86a546f763f126292264a2543261c0d646658cbc3281898a3129b8ece7770fc5541511030ebf1407085f31eb4856ed6a64562d9aa42c5d3134b2b794c9befcc1755fc75cfb6831a3f8678b62d2c9e8e263e5b4e4124417b263a5af17a2c6b0875540c175b1441d25728a03ab3cbfc2d988ad4e71328ff0ec9d05aeeabc3f3cf6686e9a22610323abad6e31a609b24b94a7b94aeda76e3c5d35fc731a0275dd60d6e9ee145450fe8394dd5550406d0833651e832767b0baa3bbb747dc068111187014fca8dac8ddc8da881ff18dc52e8064b7d6fd372a732d93c1b3f2e48cdc6eb3607dca20d7e2c33eb4482010cf02c2557a9a01caea9ce87f185ded4e727f5490f08b07f40ff8b244996e180f7cb9083b0009771131ce64720b5d6dcb3ee84eafb80366843218c5b45152515e2fe7e1ca4d8d6cd41fc36f32644d13aa47f54ce3710f4867c73b8a38ef220ea2d879d7c8f906f411e6f56eee9881fd94622183ccff128860fa92e75a86bfc8bbb8f253dae615dc2714ee2cf832be5d23274985dd5c38fb82faa9ef8da438b82680b5561a871e26cc23d80eeb03b285d42c0d2505ad522e025784614664e7a6b97ba9efbb6c3ecc8906429a8640fc98657c417383dcd916a9aac6571a5159be129f6550ec5fbb1af8ff689577a7426c07135fa4cc60efb6c73b17f52efe515192ef2aad6d5fed193af2e2a064e26c73d300ddc46312a025a61b2bfd194f94ef66680a009e3315ddc7d7a93c6d9a32ffa6d8cc7250a511240e53860e7b8b9b2e705c5ce5450be6f1f64bbfe9337db3cb93b8c7abf44b6ee355d9b00319488f146f767c6f85d5f4e3b5b2fd4bd4ccaf7ba95b5fc99ddc4106801ca1d942ae8deaf73923010acfefc1930c236574ed85b6229214c167d753411eab0e8e3960b2fab8565a84f638df20e8f896d35e1e189c9d1dcbd6667d985a33142356fdbf1f840680870927f85d1fd30ad4f7de30cbade002a687e9078ddfffc3ba7b218bbc1c4f384af4aaf57e2019942dd0e8615e2e5dabb733c540b5d15fa0b664929b7726f00dee9f0f54c9f02e9702a6f4ab1c7774f310b6dfa9c880ac5b8f628d12dc3afb55f61743e55a7b7701486455c2ad30fbadd0b2cced89cff789ffe00dfa32b85ef6f7b83951662927af1ea38f91fafc696eed36a4f0c4297a63ec6f21974818407a838871e0a5d607becd7a85552ddf598442eb8528abefa937d85933d8567c24fb07a92b23ad20d619dea66e8882124ac2cad014db72febc15445d8b2b568a7e2b949d7d25a61127f58e33f0adf1ba937f30ca58f2985f7dbd89b3383193f562286f2bd1d2afcdfc83477823ec63523657d46098796496555aad632132e1a35eddc4adcfe9b76c8dff2c686d47afdf3209f791d8fb121171b28315d4a344087667d166581e93311cb465fcb26c886edd4802a1ea6d40c819d17791ae483d3752d5ad07939c9892269943a443844682e032e0763d5ca39bfc82855944a488dc59fc7dbb5678d972911757ec768124f9e6cebe781af28de12c75e0b9573f6ba78b582e75089fadb1f77106897211a695c3b794a15f3380aec75854e231805bbe2cede544162327b917d621fd28607bcc63cdcff6f119821744a45201c2e032d0398e88354f81eca661b8c748b9701c482aadca2c94945dfcc86c611547f90aea1b072268d8f3209f10a0a08c9e84eaa41ea51778a9d855fb40438648b42f9c277d2709ad43937a6a0c0a7b0d0b4153405fe48cf929a8307266ceee508719066eae394a08c8fc5f09bde620b2e681d9636f08a16aa6244ccc55a7144e317ddc5a8ada70ec3dfc83e784b9d42b6606fe17d14f3d4be668ef9a16e98276d8ca2f14ff7934524b9a85fa5c43f1d0ac0a48a70746c756a4cf7a3741a9f5a00e04c61bef0d768a1738407ab2345d1b8935438efd401f7aab265f67e0c587abd5aa7d9c4d528ef101a4eba224625dd2930736deafd209d345c199de4a1d5a8e9a13722746b1cf642cbfe3476135eb07301066ecaf530d33c9c973a425395bb6fe283e21eb81fee0e633c433808c08022deb4c8e2935f04095ae2fb182daa6455d48b7ff1b9a16632c10911c8eff180927bd9cb28f6dc227bfa8741ce57f7329f03928e9b2e1a023a0f7c53ca79eafa6631e2425c38965526373dc61eb6979fcab1af3a8cfa1dc077a5d5067336bdfaebb35652252e76c054fa8ac8441b0f092a4255a4cb5e7c879e0ca8d4e556753f941d4477afb03495fff9641b4af36cd61dd015b4b05a3a92b6ac911f27d59282b5ab1c17e59ff6df728a3e1b0edcbc16dedbffde5eb2537911f386061c73371f85fc809024b70ae6d50def3c7c1477c2b5c6dc6b57133d5c3c730192bb79c6583cdf455dd12b237bb7410f7c15b90f5892b0e780044d0a420e29502c5d06d1d97df8a5be665b41cce865cf4b13496edf8087f0891d804a96bdc2548d6d1d3bd958351578eb0add13921400c54d66d84f8e944669725ebbc0649470ca6c27f53f2da02cd04b90f856dd09500758443c706066e473a638e95ac26e783c3ac06b38d6180d8a54859bea7e6e1dbf9e89a986ac1eaf6aa4c1ea4d8059d769ec76216031adfdd9889f3de1718c9007b8454f82e64be90bdaece9250d1235b84d755da4244bf002a0dd26be160ee930f6de010d6c89cbc9a0ef7576f0826ef963c9d3d02432b180e03e4529c2f792993f97c2fa57518e3a17321b0ce5622de0e31be901875c9b40e815e07a08e9047fc3b9f4c7afcdfa5af5d15883bf2e9c4af10422e78f70d73b54078118d54ee15c0570d7790dba34461a270f0c4923f9266d37f9dae298c538ef3118c22cb1727b7a70b77f2c08218600c6f903172a2f4f419f961d7d05ef6615358ee621b93c9a2055595dd9544b0232a89341356a06af86d6d925bc891b4cc96e873eeabb2260709151df5f8656132effa24e1ffc9840e7e15c9d0561335f25c7c7521612fc8a9a33903b784f44a16ec6dfc722502b018666c06be774ccfbbddd2ea7f4882970f341b247e95b6f858dc77d3b477496861b15aabc94a06ec6bde1ca53daf2917dbb24b1b251dfe4d4b8cbefd40070b8450f21bfa8f83b4c89b3a87af92677330b8c843cc75197c76165ac47fff89098128b105f2ac397fef3549e402cb26c7132b890d1dfd6f8710c490990cac43d6a1eb27a9d817a82afdf0c9ade0dc8668f21ff5e6ba63693718ff975de45e781238920fa53a3a1bcb1e9bb4f8c2b739d92e06c5f9303edac7be6870bad4bdcfe58195ded02eb63118dc1d06c9d8b69a2a06384d68b96e0be768c11cf22fd004280540eebbf6f350ae49988df85a476a284e9c9aa0982a267421f6ff2f2648afff157fb85cedefd48324cb085beb65ba362895916355b3e4640333e101914e6b89f1a52fbb93b2ac167a5b52ccb9b5dd3a8e3e73a95ee1119820759e3dda67f2c8b2440ca3b35c20f5dfe6a61e25b22e0c9acf5e1af091f4aa48f85f4e8f824a3cfa957eaa070c6700e601fb3db16edb72681d739a5a90925682c7cf6951ab7bce5eb860baaa74169a0c56867953505be688d66f6cc62483eb184ab713c8efd9dfa9ab10346e65c4b9f8134e48e5ea50dee8b7deb248166e0487845cafc9b4ceb99c9e089e28130b9c6a2a27390cfb5d41edef969662aeed5cd565e2cf192be62753b18b385635b3323a20495e4de802272147f7194df2bc850339220e96ab7db2ea5cf9d6dd0c48399a7f83c00e7ea35ee56795b4e59a56f1c9f783dabd2c4df0dab839c7a28ee3406f58ea8f26e8386ad5d3a26314208385dda697e4c111a1a442a231ac9a7a3f1ec13df4913ea3e4f44cc91b09a7d540898be69ef0debfb34e683592076f5155f7fa01c985ce4507e63bf40d0580277abc87d0a3cb6a3b7dc11f32c7dea2156c75ecc1f5530d28752718fc8f290c336a7c0a0a5c78c8ea7696106e00c0ce43915727063df9a1b03ddf9e68a8f90cc78526e43ec168b6663b4d4419d88068c9642cf6aa776f4eb8947b87be539e681e9055d7e0c7c29267d2b0d09917351a7c278194599c8112b26ca010e1af7e500ea45867cbac90c0ea213d9232ccf12860d5a69d1e26a66977fb36766c5c850d7ac9ee0e8ca6b8cbf09b094e560221d9f6377a68c9a7da728f7c8567392f9217c5ff58de6217352dbb41d84c9fc7b4075a26e18714667960c57562317e916d8cb61186b1ad45bc94300072245f21bf847432806a14a59131fc8171f0d3a6d09d403f39037fe3e1511d0e0bd565d3f2f451ce6cccde78dcc685d12b6bfd366b367a7644762dc652acc2783b32d645e4580bab5f04613ba23aadd6933f5f92fe5d5a65249dd9b8cdd1256aeb0eea0a734389c552471f9d0adb35a3ae15b267bc948f9b6b86d215e1dd28d84f2c56fd87adf015de21cedbf109e5367c363b30539791db4eac340a057ef9b906134df484f6714a32f46ede4b14611c7da87a87e406fafb0ff82050f515b58cccf3a8a4ed6fc24f2e6f2498284579137fc64aae8943ff4dcaa84f159e75ea72669981393080c31d4648606256f9ab29dc62be278013a1c93eddf23e736aa80fe001c03bdad85c588b853a4a0ab97b18a6463a566a1db2e7dea6a471190ba492fdb0edcbac170c54ee78f4bd502da1247c558111407c001338ea724a09f3b8e8829a0f99eeaa9e56b825e3da167949b57af84ebe20284242405022568aa59f09566c40df7541b95180a703e27928fa5b3fdf298d87bdd02774b0c903b30608c057d4c68da969e17291bb29237485b383ae73ff34fda6b24b1c8a72e97d2e93bc96f16902d52d011efba24ede93cd078a071bdc9a7d61eda9333b63951e8e920500fdd1ae4e837328acd85e7008f3e37f9e583261bfb4a19ed52fae20ce95635197d146933d886f28dc2a5bf15231a669d0d55466bed44f5509676beb91c9206f4438e7187ef89288e824f38bef8f1992e2a66b3a66750649c8724662ee2adcce77ee5c62194fb194f9693f38d99f8f42f23bc65f774933f11dd2c1d0a180c75f5c70a1d8eeec5f08474d911004b690a214fb87b0438772d0e3e7f37937678c00d98dd2f90b2229ea5ad533a40f2ca417032b53e63baa80adee491fdd500af7a1875e30a9277031e01c9b8b1dd961c7e1b17ceccee04566008ffed6a6ffd363f98606f3cb2e8c4dda9ce33b1d86389ca6826d52ed59666daa93e04823828a093f9b027e9c6858a7e897b7e76600244e9443bceb72b53be034b5770af4851521a4f9b4d64d0006a80925fc2d40cee923ec99f7b7be17ef2e5aa2aee7fef0067f8bb248846fa9adb367e5b061b9bdb48cc25db940663f77fb8263481889ad2dd6b68d63181ca305d5f6959540ace190fe314a6e49f63e3853289dfd0de5236ef1c04cf5a9dcffe263baa21db0c998a09cc0863da1fa166479d4ad2b68d933e19e6e80cb1e2504811c2eec1a6df9684e4baf4c4dfda4b6cd37801884890cf6294d18a546b803f43e4627eb92a013e9c8d922b16fac01a3321910814ad4604d944d15d76aa0486ef94900b8d33fcab711725ab16974f12278f7cb2d0428a85a05e67048ad5f2e063b8e949ed2759e5a40f8f22c068dc8f7c00556b2a1c142847acb52658a49317cc68ade867f42f58594b0a4eb6549172daf5fa3c11181de2dccd46b920d0dfe39cc631a485bc7afbe807777b8f1a04657561783bd7547ee281cbe0e394f1bbd5f6c9e17d1c44a528806ab434021188ef2d201dd48b307b4104a5ea2f7fb79022f1c614e4798ef90fa0dc391e95f832de1292be4264514bf8c915053a4b032dc46ea2474ab464e78ab42b8d480d118236189c01913a25c55dde8be29fb0ddb0328b3ed3ae65944ed5876fe62619a7ed49b10038fd03efde1db8e72b624e60658eb947a55c5209cb7f6915366e2732d6d9edfa76a6b77b814108f2e0f1eede03ce7ace3f33672463ce9f623691112bcd0b0e349af06fc36200a7df3b31455e38297a6036c66b3766d121543f44cc4b5d626a0a1d0c67aef8ac038215afb58a7ab5718b3546db1af0b558a9aad67605bc0ad3b69115613145ccf71dea46c2518fde7f060b22ceb509222e2cd8c91976e838d440ae06d42878fddb6cf90dae79a1c3d1a7183106de838e146dae55544f367a85b01199e300afa3df968e3525689dd458d4ffa4d6e5da3ae1ad2ceed04304dc08831bfc5ce6e70c042e650316b86ca9cdd3f702fcb8dd36dc60e411988ee03728a56c8e04d880ce8d5eeffe8fe6ec29a7643dac21310f97be8977344dfa3f09aadda4b8f8a4d1236c9b18f5d6e830284284d6489f90ba043811b5a15ce6b55637abfd11a5977f4ade625ae79ded0ed91c43f62164c1989df243769a5b5e1331ca34ac9883bfeddae1998e86fac1d875c086b09998e44de7c6992f6a05679e6f69e7cf4359df521372f19984d85f24afb864a5e4acb8d4681af931850e97cc6b3a42a4119ce0ea7cf449871cda737d712726e0047f170efda1c3996ba522ca51f452617e5a4af090f672d989935f8481e98eec5687f36815efc91e1f660dcf35b2d9452eed28977bf8a073bc803468c14ffda49bbbae2fdae27675a5b42ba6c13f3c449061fa12d8fec7fbd7a3681adc070969cf8c860cfa17c1993fb07ea85647cfe08797785b6a82457da594694adea6121098a3d7a93e24e927fba7de2a0ff967e4cf29998ffe6b945b96a97534f471e2f7404873f6cc3c9c2959f08530e62b57d9e01f6c809fe5c6fc04fde44650bf6df4f0802697d568f8a952e7fd5fe9cea5aec9d2145946ac1e832bfb6eab20c3df28730a28721829eeb4f63368b4762d44011406d2226611899977bc919a9afe194d63ac57eaae15486ae38edc0c16fddf000b0f25a49571b27411b0f5b7a97da585511b15b78cfbc8db691a36ad0ce35d344b4f137fc4057081f0ef551651612fa378912e289bf6ef95d7578516b70f89a3db8c5207d4403adaeb7b9452442e3a919a506920c7cb14eddf12de9d7b7b5f363fb2b366d2185d6b188fe436b10f9763e47b72e7436cb1218f00d487bdea2a9e4ee291424e4d64cd708cee61d63810350bea01e9de0e101b043e83e89bbf631d6c5e77df2956ab317ff840a256730fead8d6ad529da03395d890163cbd31305803ba8749aeec8bc6ff8bb99dae1d29ad9e9a6dc0a796674e5849ee6926d6f4ef2368678e9ca5747620e0e004b14870b3ebbab3c1ba90644f1e7c1f5b97fd68ca7610c1dd1c3236b33520f59aa638ce14e34bab22982d21a8d3193d45b1c38ffa5ec7e59445b420af3f5a3c84dee49d71b2a399a45bf98346e45055e76d2ebe7fd58db245f29f38824154c4f665b066506826037f7e5dcd913a5a5c314aa996b7d2b8f9ed958c5b459f0218980557de6cfb9b45331b1b3fdd596b3fe8d46244bb586b65863ede87e56daf9edf867326bd0f9a40624218da4f227c529ff0cd9bb0dd445883b6bf27b055fa8141b4336bcbaf11cc6c1f1e26c51d02d934c021c894ab0fcb494e0b6b5b53595facfe64ea3eb73e56cd527af032fb7e728859ae167fdf678d09d3d1d642dcf8f12abd16b8b430f51f8afa9f98bea87c7597941b3d043bcaaf6c5fb3ff09aced3b55014276207854d65d66ae82aa8e1c0cecc64b608109695f714e306f4b006464a996d0cae67e1622c8eb54312ee1ed9e6599389b3fd3ff87e2e1aeb955dbcdd9bd95a82ddd103eca66913fbbefdf28931eb4da73052c0967bc4ee2a5bac6e28d713b89067885daefcff87b78c71aaa314bcdb2f0128ff67126d3c7b4f24c827d24581e65dfac5060aca59d4fa53e81d5c10112c762a46827e6f2508c1ab8288bfe75ab91792b01b7a61355b742493905a4eb393434f9999f852ff0df71ea0453a07a8a5b8fe755f27c3d42e90dc72c3af83d105728fe411518a038c2213fc7162dc992cb66af3ece030754193332ff9fe158f52a0c41bf52b0532c932c06cb2de755e0dcf9da24ab38fc185f2149691b2dece608944556050b907a0a8c34de65afd7041f799dbda6da73c3fad7824c435cade0778311f0c20b1a4e6881d5030ee1fa2aff97d742a60b438058f9def53dec7be9d77073f2dda5c3c3cf91326b320f3aeb78439cdff06f1f857f2ff0b1f95ea01e1fe1e92fec15a5418258ccd412b421e28cb6aa085d63d63e80bce06a9e9d855f5c62ca0f2f936349202b45a03b54258d2c36458ba558391f92b846b7eefed5f20097233fcc0a06979f2f26498fe6f87e5ed638d1484be635b3a0daeafb601e4d91dcff219cb686b1aed527e9962fef72077522616520332165d1ebb3c42221b3c1096d9bb3fc49078913394c503ee536ea14871eebd74e5795c4337b1b3d76be051899e92730acaec3baa46426097dec22937b41277f27a699ef57503dc3684577ae35b15843a6920e8bfbf1d6c28e9eaa56739934bec5c45a41d232002a8d0765df11519a720fefe78a7c82482f35cfc76be4f17967d97d924234918a630ae45850a5e13ffe6e5c09ac00a90cda13ac9ee15d6a281c1edf574e21b09de2a9d2ab8b0c01bd019593599b25f0d72c339ed03c6c8feccf7719d7a393f0304b99b2325a5f689b62f4989ef9ecf104508b794ff1985193cdbea444f1eb59ea9333ba8caa7c9c2e7817045e6509fe4a0b5698eebd3946960a8b36fda71a6774e80330f25840e920543088c4c7a512998a90ff31ff1360bb02802f284ae8f5f5f958b5cb0a85db1fdbc773aa7996b4f227d7d467d5610df0350ede564d25d536c10c0d2f968271ab39cd658cbf835501ee549b3d55f61b9adeef6f898424f3f068caaa262695aa527e47e444faa97519962aabec1da6449c22be15d8b4861a0f930d84748b746ddd5b4ea9dfa211381f465fa9688d89fc74249a566f2d90ef4f179badbfdd06d56eb46bd5e1b57f1d50b7924b0b16d3b9b22de1f8fffbdab7a8a028caae8209d6302ea08a0e463d074cd9a599e84db2066e2cf0cbc9e02399d98ee1e95ff7133342068d5790667474832173c8864a8ba00f6ee18c2cad247d24365de9d7d2176ed1394193a6d864a4c94680fb209ce7cc25b2681d1c70965fd6a4c92d3a5d6fb1940ebcc237707517b97e8052ae5af9c74882f46f587baf9735cef9e9e4d486953b71a8aa266922eb67cc4f2d4a0a98b9209a69ed5a0d4115c86abee09d419635dfd1d6fab8fdaeb8e5bcc6167d94cfe0c3293a567b9c20c3050e87c7a6856d30a83fd2b71439180f5138dfd0a9e1db19ce8d518791c767b6110a38a22e115ae83ce94eefeb11790659a80be78be36ac5f668dfdf055a587061c3f05dce2a431964316479003820db42c7dc8ea218f77b351250f770867bd76661f0771ed6a1af14d5d88b2d241c0e49630df953447264e14d05b6d9f44ce9aff4ce0ee3f43aa265f42019c2835365ae187493ebedd0a31d38e6d4b604bfb8b5cee509b9ac3148260fcad41b4e18d0418b825b9f1628bbd7bcdfdfedc101427c476c8dcd14c2e7d7a1b48a19b179f5665bf7d7a0e1d313d445d357177d7996d3c03a0b8923d38da30b1eeb19f0b8675af343e74a1daf4a5845ee9ffa66a4ae9cbe06ac001d85dd1828212e4d41e4417b0ae6db8ad4775075bc347933aae100d7ce54466faf4eba1ae854e2cb6531d304991d3672b63ced1d865deeaff81413cf6bd7bc1e725658ba6b43117af352ffcb708ffcf1a21959c920776b520d255694b946db2ae6656012f69f6520359b77164004aa90cbf9d11e93a71e0a616b14013b8ee5b0ef29e9416bebe8d865713c726c49fb20c8ddc1534d6fc22270b7cc7d022b47af5e972377bd534707a2a9dd11df3c80c91fa8cea4f3c58545f6d87108ecd181e8ff0826fcdb0eed0274990b9b20efd8cc434c3c58a326dcea7d6d51c237a46ed2fd0203c832453bcd9797b1b928a22cb0838258697ccbc6a6b0c64728597f7ae37e1c3e2289c2c2a7a94811c5e1251d3b0f4b780aa980e847a1e026e663a8219273afe16c6c36db7bcfdefb47c90be52af62b95ea2cc82e0e6b4146a407dcee589dd5eb05a7b4b8c59cf693a409e7ba4650b1a7f96449d4df3ce4b75654f71d1a37bee88d574a70418f58680e964c0a23b76fc8537a8d62346e29180d74b153bc721faa4529848d9ace478330f575c902e37d9508681f7a827e761d55f3279e1ed1e901539933af88dfa0ae166e71425f88bf496c06f5af11f6eeaace5c958bed794c99e51fccbb9ecb718220974019e18cbc539d2d97518c7f424bdfdccc9cc4a2529012a58600459def7374eae032814fc4ef2f02fe724d359aaf71a0f2e307d06c404be625c8a4e4904ea95dbda6ebfd2ddcc119256e447d57d1498fcf1243654a374e1e0812084074d3c05e975dff726a86fecb2d6eb5abb312eddf7a5e74e1a0e5db2ddbc85788931438f9a1cf3b713127cc64be1b755c79980de770ac7e15fa85cd77a80a5f787ab0bf3fc6004d645343084cbd5de0c2a2717b1b05b37398c8c70650bedb86c45f5542208dfbacd72df491726115b787dbd724cf3c4afbc120b166d8e283ddf0df214cae863a4b10444edaf351905d55a829c8f74e596a800acb83ad1ede9e2add5e803afb3eeb7272fba0d253e1753b0a77544521c2df1c9632bcac348c736a9b8f73350c4d618bda9e4daad94739c686e5bc76f2ef23f8b40133d8c49e269a8cce6f4b82c29552724ca9954303ee7d4ea9db324473fffa2e1f0903e8e0c808434a715d82a985e28184c717c9a8688fca0cbd1a1965ecdf39e351b69c57c17665e179771258ef86dd1db9c74c37bf109c66cd9a8529d22d203948e8c295684648960555410e826bba16fdcba81f253af423cdc25bc47f212a2c15c52bd2f852c87d132d1458acc7fe29fa088ea38688f64bb518f2a59eaf1c39cb5f85c97f43a29e740aff560bd47ccbf5daaa888129c6bcc99bd6338df359b37a819f9f07bd78a9c9c8b49ae905457b455705126a55f0ccfca358a9c660e71dd9c948e44e720e4f547fa00b07aa07d84cbd591f515df5a34b584a9eb7f97a5ffa9ab18961a1b427ca9bb9278af9dd1737a1839020d825614b466e2374224cfc47e1e317a51531c8117de5e1fb91b626aa8a98c61f75513e0f09d0dca138e2d8af189b17da786c9426559efc63886d324358f0d34e731e2fb648e9489adff9bcb038fcea9e1de2d591af59677a0eaffaf5a176db64070c8c7d8bbe586b67681ab86c592c4d8e0043d229ae65686a0d789f0c7f992ae2dc75cd4f6f85b867f0b2357350eb13839b333f1b00e16eea5a8159f171524f0b5cf8cebd175cd4de24d0a1d49da36e458c7510fdc55c86a436a453a61ea1f5f23f9dd53b02ae72dd21bbf80653394ce814084e7aa0460867f9aaa257f0d629739a988e4f6cc89500f04ddab53a1fb584ae6d2f6d5d0a85f9717216d43c9730338b3bb895a27b74509792ddde4934d690c0af9b011291599f01dd8abd2710d8518d77f9cdb67490303af224bd657d81eae17c027cfbbd8ea03a4812c31e6d5fed1f790f8978f2317a005d95482ad35b80b24545d8436d0ff7d5a19b90549abc27fa8db78d15e7173d0f61a13ea13017f86f93ae5f6f3784efa29ce41cc74bedbc1df8e0d425a474376f989ec513cce25d0f8b6f398239b824660904a0ae5b2794e165bb41f642d73524a876064388f2cb31fede14a1cee22c138cd5dcd76044285c2516f534dd294fc14e65812433174178182a7372cbc5b8d790a1b050e3e053b0541713b962b861eaba1f3ea8fb3b1aae501d2ae101b8eed37d77c1d940adae43dd81d7efd04055bcf624bdeba958c5b35a9c62150d32f62e2c267f0c41a7d9df449a41d346b0af982f9e071f5a3c3ad07ce5c8f2ee37612d52cc3d7cb15dd84cf63d3105d75623b6f225b596cac87882a60e2ea4195048be8c53641c317a792d59b3594819e6445c0b366a6908a88f37d1808d10bf05d41c657a8d54e629f878c8f2f7037a4118325ad1549f4d0a3cef90deacc825fc9395ed542417361d60b6296d23de0b3b577375ec9fb63144e399fcdbadb43d466d8b12e8a4c235fd081c1d02ccb238b06f756fdf486181887fdb1a213c988ff5472847dc0f76e0334d50055d3182c48a2f16c20bf0c48cef10d56bb415591a2282ddb2723f47215cf4a435d09ce8d682f0c56bf0d8380605dd879ada4d599d4e832b4decb813fa82cccd8b17d20e1c5d2d838605e10974ea82b27b224a67569c2471d9a400d10f98cf4d3b1f95c6e45c1c3efc5e1ad425df22852e9eef4adaae29a4a45dbb86abc6ee090e1369de0e1851ace79806dfe47f98674d018418a230c6a884ed2e17b0204cceb35f2353814873ce89c976efca54f8091fe98ac33e1bed7d75f52b9bdda8374e6a93ec09cacf871282f6b646124ad3f1e84959bba486decce4b2380b4834b2677cec88fc173c29ad6a5c662de88138cf246133519b3a150181a88180e8255714be3fc2b76bacd293e949fae46076b000014235b5b326d7b24c60479108ca72f360dc2f32325a8fb3a834828fde0fe6899f91c672cda2b52aec384a43a843f52d97ac3aa280f0a59d932a67e2bf7a9520df61db8a41bbf940fb157a81aadd1be3fcc47fc0d69c61f45d0a689ff1fd03b69ee281136537fa3013d3d3b9ffa9ba4ac1b92b46e82dc33f6e9fa888d0b85c77eeeefbc9db3aa73faae15f1653ff6c767b06a8b7a04559ad6fd5d0255cd50531a7b4cb7008aeb84d17b4b47f9b14f1e40bd0f5305fb11de6428cc670266530773633107d575a0b80594c023373c4ceec3d45f0d8ba4c95fb588b1eb4cb7049af3650e88f95b5bbfaf9ed25bab6e2bbf67b8fe66383533d58c2fac143e47473b104232161fa8825468e05f2dc3d66a2bf0f91088071b00b89064017974fdf7e1c997efa1be223641eeec512ac35d3c0e1a3353c99a2940c4bf3e61c74c09853f7b3b7b3fc4af0212762bc33984d74e3ef79f794e7f44bda5e6ce44c75503a2c1a1c35cc0e890066c9ce3c1bf6671014783aa55261cf57","title":"924. 尽量减少恶意软件的传播","link":"https://leetcode-cn.com/problems/minimize-malware-spread","question_id":960,"issue_number":80},"78":{"day":78,"pres":null,"tags":["并查集"],"whys":null,"difficulty":"- 中等","description":"```\n用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。\n\n网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。\n\n给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计算机。请你计算并返回使所有计算机都连通所需的最少操作次数。如果不可能,则返回 -1 。\n\n\n\n示例 1:\n\n\n\n输入:n = 4, connections = [[0,1],[0,2],[1,2]]\n输出:1\n解释:拔下计算机 1 和 2 之间的线缆,并将它插到计算机 1 和 3 上。\n示例 2:\n\n\n\n输入:n = 6, connections = [[0,1],[0,2],[0,3],[1,2],[1,3]]\n输出:2\n示例 3:\n\n输入:n = 6, connections = [[0,1],[0,2],[0,3],[1,2]]\n输出:-1\n解释:线缆数量不足。\n示例 4:\n\n输入:n = 5, connections = [[0,1],[0,2],[3,4],[2,3]]\n输出:0\n\n\n提示:\n\n1 <= n <= 10^5\n1 <= connections.length <= min(n*(n-1)/2, 10^5)\nconnections[i].length == 2\n0 <= connections[i][0], connections[i][1] < n\nconnections[i][0] != connections[i][1]\n没有重复的连接。\n两台计算机不会通过多条线缆连接。\n```","content":"096221c0597d8bd7f7d11d52235efeaaa328b64dbf9baf1fcccdf9295d02033616120eefe38aa2147f4181d103acea1232e5f7406ee4922d6da907ce3f361570a36f332bdb5c1e0d80c33822546cdaa4cb6387621252e11ae945a3022625595dd6fe26630bbd8f3a39225d30e5ddcdb86ad54b2d3e07f0ce30e4bd863cf908af745fc7a0aec6c7a39620a8618513eb7fa1838a7f97b4cab9463189e9272f78da91f6bec1eb321ca7b78fe67e47919683ca3a0b12b0b795a4349fe57649f4303d5bb87df3575627e02a19ab8780503871a23ecf77592c96920874b1c83131729abd6b3f9995c867efb42a45be96a0fdcf40504fade7e42d0a3225900f32150eaaed7a8687919062a04b69500cc74c5b47c4d8960cff348c47b2ccc419834ddd3e5109fb4a820830a420a43d4b1c977040eab83e9f1b3c8b46409178119502b53a1d4bad940a325b7ab3ae6ecac9d84a482c2a5a32496b449f5aa01968b9e7d245471112bf385ac0413c0245693e68e4ca1ccbe735a053383122667cba28a5a909be6356206fdf35a44c25a37350b15428d94d3695c5bc11e09c2d5ae332327808b6ad435467319c3bdae82219adfad25aeaa9e8c7a56ad403781628e9760cddb3e77bbca1803cca0b7df74d592f0d727941cb2cdb9981b7eaf469e99779242c816dbc0c0b5ac5c441eb988c3e01437493ccde8f72e3dc65e1cb46a078988f6198bd7f4303462580ae03fb1acbf585cd67619e8d9dd77f0dfb054dff94e2e5cd9d7bc994c7f6efb7b83e4b65cca1d9e42341ebbcd8dd05ed4d1ceef5f4d1a15534264616b690d4cae57b6f166c2ec1492069aa1ffc2645a86096df1a2b87921209e4b93545cbfcd1d2ceb5ec3dcfb74e0daaabddaa98e5bf800e7b8a1848652617360043abaa7c8eadf54e5527d03682e588080560b77af63eac34c2db76d0f0890ec72076c44c0e0ed0dfd0b16240696cdc13708d4194f6f2d829c353b6ba33ded265fc3c454b965ab9e65772dc209ea2db71103801ee0815e39e7c5882f51fccbc4b957372593bf4977e38667339c652abddbf7da5186a503ff6b023cca53bba2c7e3cf7b509f63cbc69be8f11db0a7dfaf9102283032a4ac8256116d313853674b417b3dd45bc6d75e92ec8a300ea3824ab949038de9a5a104a19b68dcdeba6a3cff687dc354e5da2f0d8407f4e890d90f383f98514288e2487e065f35149f8df8dc4d9e9d8cfa87645c8dfc28e79dcc793f2247dfc81039971a131f93b22c44d612a8df8251c6335c9e0aebd570a478295ab89404140fdd394e9d38aefa289f915acf54053d051803825b59123988af04bf624f80b5881e496b459bf70ff47b47a212b29dbd31979737528a59d8d4b630d670f11d2ffd894d34d89c39669f724723058982e74150b57b7bc777dba1b0cad4c0079baffc2592becb6245eafb13c312b08f0ad6626874ed803a078df12dc284676823f37e7c37b1bb8e7d271510ed8c2c1ec4d0d0056700a8eb37f1a3b66df547c445c4b56d46281a3e8e52c15a310b481da0a03b166c6ce0e4649f55f90dfeae61592edd534a6d0590c5bcc6802b9ab3ef2ff221443186250e997677493236425fa203bbd6102704cf1f59335c4051b343148fbcebcf8343fc7c04a2444e1dd0b77a8d1191405408c7726916c0771ecdf9c930078b2674b32edf88ee6736d8d3e4fcfdae9e5a61f1c40b1711481aa4236be0284fdaccb3609a51aadc71c09c8c174af377337170af311bc9ac4862f5ab87261a54662717d0cedae71b114916b5d2a56d9d6b310e8eff456f9355407e8b56a0e8a9e421efc237c3baaec3cfcd5e8cf97005b5363928c87b18789beb1bb2aa9b527a773c7d4e7c17d133defd9b8cdc57d6575ac9cf53f7123b93bff7d959efc215b697a016d72842a3c07ed03f00a99298024e6b16d690f4f7a0a969b4aaa602c7a9c0c2d22f2156794b6209347a5801c84ad00ba76510699ac71e0985c7a530706d935df61d117da4f15d788376314022da34bbfc016d17fe84ba95d6e2ff28e8a3720c234e1bccc1ed65e8c729be563b705eef006dbd3ab47548d28657a74c124d1b45a0dd24d8b6d9c131a71bb39168f9984baba863c4d5e9ff8032f3ba984858d0f5d130abc06b0fa781248667f63c14705c0c0c702fc5126e4c7e6544b09d170cd49d4493370fc2d549145ab9f7366c8e60ade774eb3609becf9c8983f4b4a97228c3689a242277a90505c1d7c345e231418e722a8c4bd62904fad6f802ba8dabedc8fc5ce4a5934ac9f0c2d108b714809f89a1ceda47eac9be2cd10e44180fe2cc3bc4a95ab52d49d68113af3d19780a38e3b4b86256af8ce5677e9f3299e7aa693dca593c62ffd4474bb4a592a438b68a9758cfad25afb56ac1ff1379ec253b1e0cf5f72158910911c2c2e32bb07ae6f6a8dacea7bd720d199a1ca51d4f724448be93f746e68f403b87c4ca3e63baf861ba59d50c8cd5c8aa00a6ac70f0ef99c83a1197b5aab0e8fff1a2d50d9acc5274d85f8c66cff66ae2b4c2d3bc7cd17c14ac1876554b7b252e3254808b7f9b55fbe8a33b28dd9fb53970e4e16ceaca516b2daf891869f87516ceef55f58ea135512961042a835cf89ff5d0ff403e390342e1f2820c36f050236c8ec0b492bff007a5d8a003eccdc72d975b6e95d0bfde7b000bdc618e940d51e46780145e1ad2da7b2fe598c6caa35574c5c376fb12e7c4b7a12146354313c7ff4b067bd4f56533b9886a03941183675120fa6d1016a7ede9eae0ff59905e5fe23fe0a5a4ebf2244b7714156407554149d91b2bc34e47a6f96d8b53158240c27252388069e990474ad92f4eb459022069fe3ebfee1e2fb5809369681650d20e8fe32ff7ac41f6ebd2422416fc8d1888ee63bdaab75c93ed4658427b534a87f7f23194addfad8fe8402cf40d39d3c95a832633c4aa42f9c8218f541480ecf3dd041228bcb9a8c6a2142c7e3165614925fd7f56b636161c1a144465ca2627d242468a687338379d9a0274d341fb7a65316da919ff1939ccb4ae507eb70cb389304cf167244daa3ce8adefbcf6cc5972b32707bcca519ca0d1a8d25b56ff32faa867ac0b65dfe6855dec08271d097df8f33230d8a7cfd1d95cf7dde22d0602f6aec2f53c4083d4b4d086e1e100c04da3d7dcf2d0e7f6b32c061ce42580d8262600db493529fe2cedf4dcf8b478cb715557b3edd4ccf431c8a7395135d627e892829807c557bdcb23074029508f9a34158737c164da8723a0d4c54bf309c991e566d16499719c8928282f7e7724c9daa48afd6874e2481179f9dab28dfdf4652522f1da568d9609b9c7c148a10928fd1bd42f4cfce96c11f6401e02e7da2c7a1ccd2c6a9519d2d58d82910b3829262a4a219c9320602e4da818cfaef5051be5400992fe1d1ccdd13831809ad91a2900e8ed326025501bdad366cdc9277f501137199a6b48d8c0a43864f2c87e22ec8cf0f7ad701b01512772bdfc862443e4f9e47e09963ac84e6b2c84879ab61a6120efff86b49722b431b62942660254360535f222f40c6d27a2acec312969588773ea45d40420528e6ad7763b6bd51d69e6e9fad1341d9f168c581561f3864509ba1c10649b96db4fdfe110e8632eb1b06d9dc213b5d7605100079632153ec7d79631a725f5c1e00656bd25728a073bc8df4639696d1bf035ab672af8727a1e2d69dc73f8fe0a27d3a326ff49fac542b9d7df7547f829ff076e3c5d35f9a5de1731593023fd8a8562b2db030799b015009d8817c0afe69395903eb37bb3674cf7a0fd967b58b6a75603e506e0f2e75e818970ce6daab9baa72ba329e33706f661bb5deb44904d9ea2f151f29b30c8e1a5e9f63285cf7cf6ee7e993c9a8f4b798a674a6053913fc785bf9906a4ebca7c9b98fdc8fb8449f685142af086efb93d6a1abc8e3e98639551d6e8d1538556b1ac4fe3d53ea9693cf56f602ef3a11852bed3100a54073a7d2073aabddf38f29ea61dade4e938b3a3f63645df5c3881fd9143f123c9abe66fd07ea2b21d06bb5d6fec17e32e63430ad7900a7f7fd01b7976174855d9c8d82a920eb94ca847a98f861113324fc71a1239773d4eead3b256344cfd75b13d17bfa1252145b6054486fa3e1f8d1b6c3ecc89e2968f86c079f8f57d9096a34cb8b55c2876c658f47d4ae7d83410ed8ca8bbcba83ab1e2e316bcc717cb4088356f76c32e32d0befe50b4b3a97fead8583fbb9e6682a0e0f749533794398033b0010077aa8faccb7d353eb7b80e15bb13f55d8682eafc6d4a9399d7b888e2046063149e5634ae7b8b9b2e705c5ce4f59f133276da7fe833f9628d93b9c13b74bb1e47458cb2a47c888b209a22992ab6e574c3b164fd4b36689b8efdbe1f59986a85f3a018952da64ad9daf68996353feb0fb123ac236594cf008066d64146b665f3411eab0e8e3d7072fe9c637fd4278c3a14b8fec387bb5b2f2808599f01b7cf3cce531047c219ff9e46368096d9239ccc29338ef46679405a1f42a2a682cd52c88adb23bf5f74bf5a5d0a7e0e74be37d8a78ea169541c81581aa9efebca0ee643b06ff511c1003f43e2e538de985bb05d04c8f39646311cd8277442c4f3996b6f7758cf6bf7cae528fb5b655582f6b30f3b76d14d50008228960f69b056a8f8cd4ba6cd0b100cdfe48cbef3d3acdd2536a8f36a78636aa56f58396f3d331122668d3ef7880c90e7dce9640a738cb4509586833e4c6a84652f7f598442eb8528aeded9a6fde8732d163c253b66d9ea038e8196f87f23be0dd2d35f46cc10105f679aec14a5891b8f07eafa7ed0fc2e84468536d10b77a4f9c60b406ba63a58238afdd9b98db19a9737e5326cad7fc1f2eb2bda7264c9a09877e621c7b460eda8300585eeed02316275a73f7a20299ace07ee094948fc5d433b3a720d26a139e873c17553e3745497e0e8f7c615379f6b10775b53d22b05b8c80e49a9b2114bdd34b9c8b523f4dcedbdf757453ca533980cf2261da3a497e0d6430453448309bdc3fa7c7695d8e0a40c0d3d19f93ef229afb27573c3083604b46b46cebe7d3ea7c8b40c01806d72d90fc76e6cbbd1587a9c36133552ed674563d54086f0f5aac5743be31d65e211744a6cdddd51e123a6671916c233fd09b40b4f97992aa6e45bb3a5e4a45201c2e032d03dea78211bc118a7421a53c8d8a34cc9f9488f686411cefccc5895f1a3ad3fae8ff3c75d7ca2565ff5943528c9308f33cea5a6adf80895cbc6c22639509d7ca66e01492977679e8e583f3bcd3b328243eaa488dc0d48b1b7f12a7aa460a811be3f8bea08c8f96b5d7986c10453c55d3648bcc4fd7301c98d6501544b659948ae6cbee4087d18b236907d64cf4321fa40652abf4944793f9f22b972d228cb8ab7fc29c5317f5cb52ad8537640ab3ebc62520253a74039fef3d599f570bf24c6fb9eaa103ed24c555ee501583ad87527cf5d24df8e8e659d93f0c5132f878bad98b846ea6434e35f36c1258f07072766ae0a91c9231095797e4bcc5dbe9a1375f336211b36882b0606c395eb07301066ecaa12ddc6f8fd401581ac7f547b0e7a616b135c40e633c433808c0d42cd8b5c6fbd2440f475cf0b54268ec6d479aca76f783bf5320e2133bc8eff180927bd9cb28f69a6d6fb5dd08ca03be359f4cd3d0c76b5b4b2a0f7e0d8438a6a32e61f1615522bc5526373dc61eb6979fcab1af3adcbb4fcc7ff1c12f7b1bf59ca287363258345cc054fa8ac8441b0f09776855a4cb5e7c879e0cf5ab89582071dd520a7fe6ec619dba9a0d1b1cbc25921d855bb4b15d6692b9b49f1464878fc4e881451ee5c4dcdf728a735a56a3ef5f849ef39759a8176436adc90f0173371fd3b9ced93de303868227ef3c7c1477c2b5c69f25035a6e087f65328cb175c6116e91501adb2a6d63eb1671385cfa5b50dbfeb3892e4d0a0b482958742212d1c429b1eaea320277d0a763d50b475b05939aadf0891d804a96bdc2548d6d1d7dd318204825b56e991bc7520e8304289c47c7da52177b5791c0649470ca6c27f53f7de17ed64b90d06bcc0d0f596a6d417b6066ac26f477a60ed944783c7c8f39389f1819ee7ed7daa4392b15f3db97f48dae1eb823acc3b744dc3a992de43f6f3431f5f4d9d3b574a771cfde53c30306f9af36dd4dc4e4a03f3a0f35e80c2718ea70188b5addd426e53c4da67ea2974f5829a3cbc9a0ef7576f0d02bad369bd4967c7cdd8eb3771f6cb9b1dbe276eabfa76351c37b4f4d4845bf2737cae34ba853c212cf13934d9d7a15e94236c0bca4e8bdd6e551a19f238e8429d429ab4159a1c60b9e46292d8118870bb509573ed7294ce871084e743d1a707d8b267037b094abcc8c24894a51bf06c65826505af73f6c2259a024e3ab2e582724112eedd6147b46f6787b2382b475e7689744331c4aa0114b4b7cb19541226729fae1d69965fca3676afa4ac80fb9b6292e44bb41de4d8048171fbcc40f4caf987ccf9f07f41c713e5f71bfdb1b5846b2df883e8b3d2c1b75a144909a84761f7937cf289475e72389b28ff372f5baf66070ae6bf108bc153b9e8ded76440538dfc5011580bc94a06eb39da6d115c7bc8b74d839a1a951cdd2d4f6d0ef9d0b7bb1294073b7e1b66f4cc0aeb861f96f6b3345c7c5278914cae33130ff0f80bad1db02a9595631c3bdfef3549e402cb23c3060fddec69ed3e376442b4b9f928f1f2317a97ab7817a82f2f50c9ade0dc8668f76ec5865aa62c86f93e573a94ee89668c83df301eddfbcfbe0914f8c2b73c0b8e06c04b903edac7ba5c85ee31fdce3581e08b928bb2243c8d2ae059d9669cee92dc0de94d0b2d076d95f866db3080bce000ea2fa212844e0d89093e1f01ca299b2a5e347c6aa2d4b046f91bc308aafb005becb9ab7fd557b4cf19bbbec57e42de07317285b6e071276700d3d49cce8de4817b5ed512adc67e3fc39a59317dab3e3cd3a95ee1119825718f8dee07b1689205cdb1c61aa6f5db32b63e64733c494eceee185091f4aa48fdedee8f824a3cfa957eaa033892509721ae9855f80ff72fa8778f7ec477101517cb7bf4df2f5a2a3d270fabb392cee91021a9c1f0594688d66f6cc62483ef8caa45b7ac7b3d9f2d3ff5746af55619f8134e4de1ff748fbf506bb65d323ae1c1138cae19b4be282c0ebd5d8db62d688f6d93aedcfb4c91e97f043662aeed59a13176bb9c6c5326f435dfdd109263328bf04c2a197c76a266f7f7194df2bc84207f420de6ae79a7ce081c9168085d1dce9ac4749cdd267a9342d201e18f72a52cb1140b6c2c4c40d81ca9c6728be7554b0c0fc8927fe9dad777969640c5c3850d7727e66114730442a231ac9a7a3f1ec4ef54941af6a1a168291f9817d7e4dd4ed2cc50debfb69cc83592076f5155f24c352cc5cb7192426b749fa580277abc87d5a7dbfccf9886aa36d2faf6f02ad23cc501034c687593f98eebcdebd2da7eaa0a5c78c8ea769615bca0c0ce46e503b372ba1bc5042a5ffe49fb5becc00002241fd1683603794ae509a8f0491bf25fe6a8d76f4a2c713b836a472a3e2a64b133b4f7f292b322a1726c17c0fe2da69306ccb8a167d4989554148ebac4ebe5b987aba8a4340ec15d5222bd451d81f5a18fbe26a66977fb36766efc8508a869ee0e8ca6483bf09aafbab25705c960c77f2dedf71e77cb6c05b3d82a32d770bdfc4ef0b7352dbb446a1c6fc7b033aec205d655a6795070c062c10e11ac9e2282c3907d35ff258002d2245f21bf81c69284fe7421a5c5186525c59737206d548ee8d16f24b1c109ebded0d187e743e05f49ec1e489f8727326eff3bc68b34da7644762dc652acc27cab330364b5087adb5a4304bdc3880f76933f5f92fe5d58c0f63dd9b8cdd1256dbd6bcb0b56924db4e6d40f9faadb35a3abc7160349b40f9b6b86d2f0659bec884a98d789f7ddf101eff5c88f143900075b326bb0c227954bfe1982ff402bdd590367196542d336fea525dedceb14611c787f8ee701521cca2aa8a6c0353544edc9b008a4cd0d324c0d3e26fa4d4419c35fb62f396dd70ba8f9883d822bb6ae05028fe44d25a49428436c31a4b67ccf7de9264b0647d7f5fc7a28d3fae78acdbb4534e0aefb99383d7f15fa4ebf6d5f28d2d07f178a7db6733a33e2450dcb34929db53c79081308564cdaf41108677d4fa679dfef4c23de1fd77456ffafd1f195af7e5a79726097b8638fafa03fe5321f32d53332cfe5abfb8e0dbaccc6f807d53991984299dd248e69689ace9332b28207c3d0748b87da05d610190a6adf645b2e989ec775023b5ec817212f9fad5c2ff23ef40c24adffb2a277fb34f471ce3458ef925b48e5cd50e77835d2eea52bc35f778722710935e56831efcc87e7692fec9629f2241a9f43d5b4c50944aba9a761e29a4d33cdec90c1be8910adb184710b8a6c533b78ebec285fcb6dabfb63e9dc8b2ac65e10a79b77ebb5f3ed840952ad926b41e794db02044f0bd78513274948ea03f27a1e5f4020d864c23e26a457db77852e41056dff234563c4519360a6e1ef177813d11cfafbe","title":"1319. 连通网络的操作次数","link":"https://leetcode-cn.com/problems/number-of-operations-to-make-network-connected/","question_id":1442,"issue_number":81},"79":{"day":79,"pres":["二叉树","递归"],"tags":["剪枝"],"whys":null,"difficulty":"- 中等","description":"```\n给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。\n\n返回移除了所有不包含 1 的子树的原二叉树。\n\n( 节点 X 的子树为 X 本身,以及所有 X 的后代。)\n\n示例1:\n输入: [1,null,0,0,1]\n输出: [1,null,0,null,1]\n\n示例2:\n输入: [1,0,1,0,0,0,1]\n输出: [1,null,1,null,1]\n\n示例3:\n输入: [1,1,0,1,1,0,1,0]\n输出: [1,1,0,1,1,null,1]\n\n说明:\n\n给定的二叉树最多有 100 个节点。\n每个节点的值只会为 0 或 1\n```","content":"096221c0597d8bd7f7d11d52235eceb6a3298eae2e3e8635067467257d1aec869d38e07a6e89b73092e62bf8296a4c9732c7e64065cc90256c46907ffeaa78c83ab8949812343b76d1fb4b46541ba5b0b22ba40f74538943c63fe53f624a660285ce49f581307ef6accfecf850354d6daf50bce6beb10d46a428316b9161fa4cfe8c3b245c7a407463a77da24ee422b46e6200b17a280d7fccff0478f5a0fd0a5b761f3966e8cf206a622e948219667ba3444d55bf543d1ff024a2314da34e0e3dd84e93d0d719caaec34768e84d7635887ea3791555b6ec53470425e5c3e35a48717e961c22b27379e4c6752c250f5bcb80bc641933a4e0cea445fcf9cfcd2331991811790dbb498eb7839e07b2d3bc74352fab3861b83adae08e4482e205a1048b410a8c450ba01bbf3f5f3994764ae8a31f59d8c203889c15b7eb1dee7f3a87856a078e67084ad9e64f9989f601c8dea2aed8caa7bf128d648d88435d70c180d0f776988475c7555962075655af50aaccf518af5b2e330754ba43a7600a661e83bfaa056aaba66a2aa36f77bc7521da6d3497f78713c1802d5aee32314d0588a784cbd0309a05d6c60f1a82c4d17bcba5e6c2a96fdf014a0e29f27b08c6850bff3167e020a06c7aa7fab5e9644d150ad955aa97f5c3deaaf13153271267d446f0582b3299d2018ba1e2631e2729b4a37a58b6bcc6048beb20ea62dcc276fc08cfaa6460956ef73353c47cbdd3e11b00831d5522efc63be7c70f0235746c56f10879b5cc99daa261d6ce7228766dec92a7f3879f05fd4204ababc7a8440e1c781f08d82d4124b6601a787d6e47e99fe33dc954988d20e8437c9ae02d7bf05ec4c27e639668666f632366f12832f588615f2c214e766961829ed13017382e7b9192aced9707d4b6b6fad098599a566601c2a8e661cd72fa2286151cf8d0e0bb0cee0daa78addca2631b4f2ab7d1f8a81cc7fb4ffa40124e3a7ef802cbbc5959678992073a32b128f0dd3438f14ae797bb140d4158ec6170dde21344e249ae1b16ef9757585401e7966f0c614e272a18a5b4ce75ec7062377ef6ef5acac566b775141cb5d208836488361626d982160e41563a6fd243c3c0690c4bf95079c6313eed0336040586fd75ce0426f1329c5228e8dbbda89d9a8eb0ecd02b7ca88febe58c646e2eb38ad295da6ba4d68600fa550a2b3038e6e24dba4c7caf49c73ea0e1cba5e78980ec109b37eb9eab9516bad1ef8a320b98a46ccb59ef6adb4943e21ffe8249a51d79e19f0e9e93d206261bc38ecae0651b3ce1b3e3fab9ece5fcc2e076edfc261be924f5367dfa9c6dc3a88228dc7b76a49eece7fe2fc67903e228ef42479c7198fd552062d1ffdaa5f0e6e4e1fd7b48f5b8ba9fab17a03853d161f7f08ede65ccf2cff1ca7c44fdb416c3a37ff190c46e1c66e7984f6bc5fe1c3e89e6ce8e423ed2fd5dee6b9c25ad0ade327b5400ee126b86f604ac1a2046eb522ad7075f9317379bb32438f5e9635a646ba0a8d09ff4ec9e4fad0b442c66c1e823f857175ebacb4d9e106aa9f3e52b8b04605245e14a606a812d2881bdf7748db0b6a416f3c42414430eaafa43996d73921b772efe1035a546025862f1fd8638f90c172b1f46dde1b8cc14d289de19574e8f6fb37d9de1f580701ba11a46a40b526b001c21313f5e7aab90b8391b081f90e747e4886e715a010fdaac8e7488bc4808b8f559bd4c71710fe5976f89617d8c659ff009ce1533633aab1da33b98f190217e907860adabf2c4b28c5c689700c003ff88a288086409d65c4331b40cbd9af3637e9a86436085d001aa81cb27449d25483a4f79bad0c4d91b3b327028387a081bf24807e9059b470613ae144a7469115d7329a8ae96631a12c8f19a15e350e5793255f9dec9fdd6a9fa41f0afd5118a01e817ee5ff21b0cababc9cea8f513778ce53e7fc94ac59388311535c1b446d0cc73639f7f7649e538cae26414b14e2dc3c28a9fcf5ed133e330dab90d5b4155d3d6cfb098303ce8ee5aab6a88289c382e1abff2ae6678e741889b967bc6d88d7d99e563b409f8f505cdeea854588c3d787642d92ad3975528d14e8f6695322173840e14bda48b99af85054e5890ccece2cb21040d49aec413128e0b97f394800ff9d665df5304f0e2c735f85e32d3cce258491bce72df54d6401a72d21f579048a099716ad0fb06f3594d944d9bd7dac0a60a4a629622b211809e40e326be341a340f6d65624c06b371bea0da5bcd1ab434f92bebbf98b0e3f9a0256b62cba96c7715f31a655ca1827c829837e5b3859726861b8f9e46efe10f94cfd06859350e479fe3e4ecabe36e65d176499b91531b9ccb56da4cd7cbc8cbe0fe59825137e248067253d7309e2afef5a505d308f6149269b58c098299a965046bb258e718627c12d14e89041a92f08a42816be2ecf7db26a8e76f1184a559480411db64f37237fbc0bdba963cd71027b4e92bcf825117d5476bf2d0d4915d3270ca5ca295661f1abb93914773c4b0ce24a977f15458586dc7916ae7019d920033bbf436c05f2828df969813c1877fc1b3b99f5cfab8c814c7a4a52896d6f08d8589915054e6f7787ceb167810ac018474e07a23a43d28bd66e1cf683e7b533da11d037f6ff996534a469c373f35ba6563d7bbc165b00a6c502bd8e8b722517f69b163b0b4cdbdb6cae39a0fafaee519e7fe70790c608da88f76a79e252922c47a0dd4ca92d2a833964f5c053b9890e0525719b9a3ff59848b211516f8a4ed6cce8f056f0cd690651a5ead3d59d80a19192f7d2a46b8849da131ec7a6697c2ac7a1d2d7b0d6b09880cd7bf543dad9cf6bf1ec36a4b93f3f5c995b386050975d9cf2b4831f9e328e367ee5131f1086b2e119d83c68eef3ac0b239c029cf1b8430ba4eac6b63662059d3fab3e38503de0dcb9d3ec1bc290f6904e77b878219a147544b8836cb0f71ced89c906b2a659ca6087446dd1f8cfbf1b598ef3b2d5f227667cdede3c2b83a76d005de182af8a8f3f55622d5aac7df8ffc958bcbde2ad178e418ba49f6e50b6f0dd2f68a8591b38729d48c2d29307a8bae14d04a53d825e73af163a7996b87e34a98684fde929f7bd0d9a79c196e5cd17cd76d91b1359163df03a8a0282741c9eab6bfc4e8848292e9813cc1e153f2878f9ea3198146f9ba8b559be5d53c4fcd0f275e4ecf3242824c4388ba8a832fb34fe3e906987cd6eeaef768f9e720f293f75d7485e428954cf0a0151b7a731644a46e697f0270e52c928455192573049f42c8dec7ccb0b33a569dad0ef294c81272c35892d1b135939a5b0e1b4b1dc365d067def53341c4449292d1f359decfce9ccb0b3009be6170a3ccb6d9d2c7b43e9c2e50d5291ab8c99d73abb95eb03b0659ceda818cfaba1e18f14841d069bb929e931e891509a597a2ca7aea962e11306ff8a33660cf8f71b22b503ecce8e08d810a529d6506cea468d3ce182ed20bb8414e3e2bd48471437251f213e084638b8da8ffa4092de324f4695882f86a546f6253122c805860770a271b0b7e6e5ac1d36d5fcaf755c3c1ce23708e1a48467b60a3ff0c35cbb44afc9e6e9fff0b3f8ca326c59d5c0f283848daab804f1cfc2ecfe4d10a68c374e231638bdc3527547d0573653763741da532376b103b0b50454e3e139d187ca073bc8dbf6a918cd4fe1500d93df79275a8e4ccd0cf23cabae7267e7d21b1b5ec1428f802d37372eccb9e332c596975b05be06717857a4b94eb326f2fe85d41dd551e06c586774ca7266d2103aa37f97f3a812756119253078fcfebd9b2e2a6abb3578814fe075d6772cf3cba46cc2b1f012902da8bf9220895aa497a2924eb44931d19b4786519b6cf44ada9d399f1dea09cae74fb530b10b0300fb88965188bbad4ecc1dc8fb80d9c6c5e07d34730b5cc95a3afc0e290c37f13116ec30f6c546c1dc6b23b5af0d8cb8c0af308e73d16985af12c109b6a73bac33873fa89c0a76ca66cdede4b9899741c496457f5c3881fd91238143b94f12fc106be6d738263ae9ff0c72a7dba6722a6350be8c3996ef3977e74cb08d0c1c6f666b99bc4826a998268011979d671ab2cbd7cdee4873b2f346cd6da4c52cc7ba07b000351414f777a83fb809ef997c6c8942908aa2953cadd19d9524c29c19a40ddbe2925a51591ee03f71c41ec8efca292b2cd123e3d7bc061019e5ec204f73c60b6631e9baa4e5c75c5aa9080b092c7af27640e0726da7c2d4a9858434544147da8b9c8d4b61deb3fc6b253e3705ec9272ea1a29de6779562c28e794e4e5406b16a4ab5fdede7b54bc5de063cbe675c2badff89649221e83b9c13b544aca82e468d546384cdf45dab32b8ab26161a3d591c87f74cdbb8f2dba5b3ca8ebc5f2755c44fdd6da08aa63afd6310b1fefc11799e33161fbe123c64644624290b3a5daff6bce38b0b61fe8a66e62b378def0e85803873e7b2ef9d8589f91b2ebccaf73f107c2893a5a577684625de339ea6d730ad4f2ffb51f4a6642a3a639a7886fbf377f5fc4beceb92e8fcf420ef7d955bc016d40f9b159caad0bbeba09a733210d40472550bf92f2748a7e985fa4b8342c37c227f5086c725007e1b33969cf731caa5b73de001c2e7da13272f612bf2e53e14c70b0f24cc0fb0cf1e40d297fefa6adfc92a8ef4c40142a9c621508ce404971b6a881a5cffa9bcfed3f69bbca12032fb421b9a8f2307d460b313f78983a7b1502668cdc518712e83a7229b3d797b42a44c61f41eb32bd805a9116bfa50c2ba0111a6255480e24987429bcb72bf7a07ecca585407f53a5162c92c50ac83da85b972f3c84bf7608f73a0a1e021edfedf17079f46bca9c1ff47b4db5bad10184be6bd13c87eeb83941220428916b7bdd81511b2dbc5d2ce0e4d981f637c94736a78033b7bbc5e56e539be9d4b75b5e194bdddb1ca86af0e989794956378eda624efd50d88250731721af8fb2c21841455dff9a1721268e1b1d76795846b4cb8ef5282cb7a736c404c73c8e2795cd9654abe9edd6a0c4325190d5b57ea6b73e0f5a5f739c48fde3eaa5e77420f8af4","title":"814 二叉树剪枝","link":"https://leetcode-cn.com/problems/binary-tree-pruning","question_id":832,"issue_number":82},"80":{"day":80,"pres":["剪枝","回溯"],"tags":["剪枝","回溯"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。\n\ncandidates 中的数字可以无限制重复被选取。\n\n说明:\n\n所有数字(包括 target)都是正整数。\n解集不能包含重复的组合。\n示例 1:\n\n输入:candidates = [2,3,6,7], target = 7,\n所求解集为:\n[\n[7],\n[2,2,3]\n]\n示例 2:\n\n输入:candidates = [2,3,5], target = 8,\n所求解集为:\n[\n [2,2,2,2],\n [2,3,3],\n [3,5]\n]\n\n\n提示:\n\n1 <= candidates.length <= 30\n1 <= candidates[i] <= 200\ncandidate 中的每个元素都是独一无二的。\n1 <= target <= 500\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c39b3af36d673d7a41596f265686992559eaff043a04b97aec035fdd67cb892950aecf3a3bd13fab6c0a78e61bb9969a1d190274f3c7474c431ba3825db633c6115af218ee76a234032a6e75ded9018c9e6f1dd2e5b8e4a2232d2835b837c1c0f1cc0d3df13b5e03ac109c58b9d639533b53063161c629ab289835f826736cea7479a9dc0b61847be885f21644999982aea3e262237a561705df1d7d37a8d4d995b7bca43756966a34a90d99b71ad2ff504bca47c373c1ae44e47937817cb17d16579be6724ee1930584ae0adcf0d55ce0cf3187a16e309ceefae87fa287a53f1932f1ad8dad4deaa2cecb2935c60252231cb1418cb783840bb7d8b60d106fe775ea73cc5c0f49cd63409e6bd9ae4160cf0621ae02be3d6a0d964349e59326b5723385482f15b7e11fc25cfe4d6ae1cb046e2366d6cc669989ed02edcca280fccb92b410a07e8d88549a9119092e1af7794cf812f4584903547580942289ae0fe91b0f505849ecfb7c2149e2fb75954f5159d9ca4f51c372ec368deb5abed6100a62867ded714f855e3d2e7c91e92b55146ca5658ed4796992b09b76aad2e4b9f56f7390a4f5a8379ecba19d8512a2c3ed3aaa68789cd0e7aae2b9f58610a43852170782a87c8ee945685e8c19f6207231d28d1fcbc8ff257e3e5fcda2ece911d6b924e3930ca530ffa813f1b7262001ce2562e60c8466f8bad1e8f48fc0aef59f4263b3071b868392b7e0f225d9f6bbf9a61f51ba9e894c6db5bf10174862512bc46e83cb610f2e44db595b4279bcbbb8d8c7c5586d257523fe74215e941ce80248974996f4272b86a21d0dfeb40b6ccfd2c43eb5abb260fad5f988a28dc34728b2e6af6d11937b1146f391cccccf6148e0544033fdd0985a9a546607c2ae977cc136b761cd4035d2057e1fc5635119d8105c0cba90dcef1d7b2d3cc85d2bb9dc2a451f07cb7bbc7616fb5141b028b6feddf816ada30e576bf4eda4a8f8a73800e30410dc9749420808f14f4fab129b97cfab5851b687aefd8915a3261b5eac34ff8dc1b94976857c4b65be4917229dde13ba69ab0ad2ae438b22026b3c3a2f9278fbe678035930eba90d86b02ac7a1c0992cc422cf2ee26be54af194537171a8bab081bfeed232544d3952cca6b3ce8f661d1efebee7722b03cc35cf86dfb0d92e70bd3597ef189d6bab776c547e4365053bfd15c90e084e7aa85a26292892c92a09b87bbc61b833c5a03983243b49a51a77d9830fab98d2063716e08cc8da5a1724fcb3e3fab8e4faf0d4c975defb270fd324ff3476ddbd884e045b904aeab9481f01023aa857bfa177fd5df0c341ae7563dee4d8b093c7c6aaef8e98c80f00c710571c1c149a0750ca4a187330de6cdefccac729d4f03a2e7ca6b11ea09f5f814a41b9fe6e0890d06c6eac8e9f823d79cf9c32e529d508fd6acf5528617481240dedd158cf2a9390480655db521599757fadff7d32aeb06c06327bcdd5e0f595fcf7118f682b1330a8da4e9066731e8aa50ca55907b08a8220df54522e2fde2e255ee96e33c2c5ec12d2bcf1fd2eaa9f0c531915ef887aef267bdb4b5246ae0545e2514a29589c89a251a604796f3c224777b9ca17dcb4fd1f7c76837cb87d9cfb3378828c3f771d9e6435446a580256b3e776bca9b8391b0a089eed5fc1897a6b56053adbaab77aae924a029bff55804c756b01ee886ca1407c867d91e633c731146e16a41fa11995cb842d4390757a9ca9eef3b28c59688928ce1fde8f9a8a086402d46c7832a50abc8ec06c6c95867148479709c5f2cf402b9a45100c0c1fb6a89cc453450d3d4d1f35742ebd110f9e44bb305d2733f8d4c16622437122a7ae8a6f1112c91309639d67ab200f3986f8afa3c1e58a58affbfb67c924b45ec23fad2474ceb7849999866c63c45191bb9b73beca9f48aeef52568f1490410ac14d3cf24bfe98f2144a893765fdb4d2bd6fbc3bd164d802c54171d4a63c52265050e5c47e15cc019f72b818f1a4d670736bada162f20c7642fc3d3a09be566f8254982d79881b301686ce0af186faa13fac254bc19e75c141835afadae466e3851a3f170f2e4092c89d53137a3b6785e7fcda10349bfe448962274c2680ab83f943e2c20628559c13cace3b5a12bddfff54a97fe40adfa3b64ab4fd649e3b19b4e12b2d84199d9619b11a2e2c071993c1976de56efe0149a9a78f71c58896ada0fbffa3a920b914405cba1f8745e87fc9692b734a2b634aa9a8a7020687f3e00996898d315d894914ef60796215f522c6063b8349749e7139af3717f3cfb9095478751963f6af03f29f7f568dff1a13ec518b224539316715a34ea6f274b281db951da202da773a538534c32fb036fe6759c00f4526b6e1b3449876f4aff6dc638b63e08c49654fa45cfa14213118d6223ca8906c7bd387a4d4148861ccc86b05327f6285389d977269d34021c49c029eae475a020af6f6ea6c933e39afbdcb3b5755d0955b5c52a96ff768da85eba2265dfe5f93440abdfc0320d873e0e0ae7e5e1a98047cb054135118b850dca7875f6224f94d561c470a647584d5497cb9847a81d9ce089842cc53bc8939f5eb79f71307e3a3f397a50ad4fee780642494f0a417febcfa738af47750eb52b3197794f95b3337c03a1be963a4366029280c096078e9347a4473efa33abf9097d7dbdb3ee8d0eab58eae456eadf4ddc5ad77fd43590eb04d6e8b2c520a82a0c306de8b714054b4edae6cba9f016929cd86615945f73a52ce724b1023260a18fd82b2a031e03e758cc8ab7f1d3504756b04884fdfb7107cbb92edae4da53e36d4bd93859c9986050975d983621b37b2e538fc66b85a6cf10d235035ceca9ccbb57c8feb379d659265842dba1ea3147009144bd695917456ec4f9f271de73670ad86afab57bf4f499969e5c1997cb821b3a96139096bb5a9834f2bd2dbd13ccb17690f394f33aab4c8c7c0cb045a6d597fd6e71bf41bd4cd7047696b90cc1a2b761a0f6d5535444acd2fe871d8399d2323aadbc832380f6e3c7a1d85404cd6b8b88ac2fb9318e65c0ab9057cbdea152a6bdb799a787b9a426cc2344c5d3406b483d532cb39817220f066e863e8237ec32f46c00622434d13721f202702e13e7bf1020c5a6331f060cc685d0cb5606330b79a7bb0e1f6ff4fec8845a7851b5a4a32f26fcd7009856a8613555a7d8936279d75564fe6bb195bed309e7068ab9dab9585be79e8bdb2899a5ca57350df8c939c8b0685536d01720c7a81f0584ad33b7d2a83f620d16b366eaf471aa0d48d9db061b932f12e75fcdd688d3011156af118677f1415c1a1a62ca5ab41474d175f1262946ee39e2bda99694519a94a2adf31ff9ed40b4a104a5010d7bf5cdf8c3ae655364b14de03f2d72270455ca4261cbae055017830d7ee2c51e0148e94a549c2ca8081ccfa2ca19d0b27c71245d7ab5be14fd2faaea3146ff2c1bfdd14f52504d12377767d15ade440b932d1d74663c491ebbfdcb3cf0aa2c6e2f9c49cc3c8ab8d1851bad05e02bb4e1a57f7f17a909cac99ff18378d990f2fd13803db5614feae7167a7597fdae9eef287332128e3c567b30b332ecfa20ef726a0e5606ca2c685f1c9f98bafc8bd9c3ff7adc48de2f3c398b4fbc770573b6fa65699fce04f495018d19b15ee7422a8e7b857456372862d3a8bd891f2322723547c1db41513b12f26f07be30c71dc5cb311e3c65a99e42c2485dde2529dc22c8a95ef2809b7ad61eca3b6ac61ff18abb17cfdca8c75c4eb67081f32323a05462ed34dcc0b8cae9dfd2bed75ae32aac2c2a3d60e4a0efc813c07c1a5c9b878fd06d3f33a9becdc774a8128351b3e65194e702e8058c0cef1768eaa7579b1900c010c01345b6a5c6edf29dcaf7d83bb3913297d2b23497c76e5d789e306a995d8b9ce0d5bfbd83c78121488bf1dee3ac419eb62dfd116a2aa311bc9b6783a4b5b8d2ef169199a531c80b749695d335000d97de9bfc1d25f18e642d670a9f622af645c722adda733fab247fe8a350f1e8c1a52e5d940d9264b4a6da9777e4671be5625eccdb19538ea2d23c73c87ee6ba9a4f193235398b247f454c9dec7dd8fb2f6a26cf0c31e2a6f296714e0d148a9af094bcf74cc97cd4046855753c1bf35b15e448a3f87c1520e6129426342be8c1b41cf727c7093009177cd18c9e9c06c3f8bb8b36c2510795f1e0f5c68404f59355aafd533c157210a0a9db44a90efb7d313ab3bcaa00df01541c86c62b3cb9d8a3ec67f98e2381c480720ab370fa0fdebacf90586815054f7291d7fa7ff8944936cac72cf478a7fffe33d4786492989dcf75aae29dbe572164e3f441591f74589e3c5f1e1f5998682593b55d671dd79bcc2c66f832657f4acab4979c43a4502be12622833140a340d754886f9bbb78a1527a2dd00fd01378d83479f922412fbe6b7c7c0cbee1b30bad6f7315f35219ea6a50621463bd73be9c58464b15175b71e8bf42a2a686e946fc3f9e07ab6bc43f2aecae4aea343bc29c4718357db058151c0fedbadb0a0ba602512ff1f3a1013fd2504538de985e9408419dd77647915c8dc5d121b6578e9debb3ccff6e933e716cbbeb1506c29763ee4fc7878cf160836ec03a5cf1903c1d891fd6fcdfd1e84ac44d6e36f17cac6427ea871e9e971ef04eb83daba80651e2621d9f245bbb61f73cf8607a23ddb081c1d263ea2dba10c2d8ff9980d60ec52daa2ecd63bd0ff56d12f871df76fd7ee3dc21920d4a622e9fa2d24f42587014db77dae950117dfef9f1aa7e3a449cdd1162f5f6c4bb76a528d70f84ab20c8f8f2985f7dbd89b33d15c6c0b268ef0bb152eff97e12f42910682446a656c1651819c497845ab8c6c75681473ac880299acb26be1838a889dfe7afdf320c20172dbe473595d34261104734892327c532afae10168fa4616cb3a8c80ea9a912d13a8ce4181d6177a58a38f976e741ac15830c9d20843943a447e1c642e453b4e2d81973db7ca2e509c4a48ccd9d79f9eb55988ac2e4c163083604b46b46ceba5c0ec638a40cf5b40ce64ffaf7ae687f446d3a59e08721b6a9f301769112e2d4656b7630afd75954a211a42aceac0de09696e1b33d4722a51b4d20ffa9f30dcee6647fb7220441765516155680bd4a18345ba0b8d7a1fd035cec87a93d3ccf6bfc90f1ca8e6dbec51143fba84d1e9266e91847e2cb01d069d102922d97caa1a3ad3e4835fb359382da248ced17be615d4ce1337a6a0c0e3b0dafd107b0ee40180cece8c117235bba80022d52aacef94e3cdc1d2fc93d938083c2655bf2dd898349e2c0db18f020f05b1509891b2adee4097d6c8602307b705b67d4ec84f01ffd2f723c7848f31fe6163dfebab0a8cd5581cd5825ea8c6271a58f2a88d2d616b69280298ee2476d64d11aa4c6fb6f0fe60a9659110bd5c15d1b89f5179f29d4de2f2f370f036463a60bd36ee8a90ae44a6434e35ba2a120ae56871736da3b569cc62464bb4f9a7d39d8aef635f7d6b11e84282b0606c7c12f93501542b87b42cdb3c9c8a4f1c00daa74cff98f458b1748a5d6d7d13684d8ec46cc5a385fbff5f195d06e0fa0f31aa21199a8038666857e79840d6936e27760355f243029f62199295704cd741ff2eba3fca175d6faca8effe88b3d10deb641fb34baa4b5522bc5526373dc61eb6949f0c0f15fe1464db2091632efdf6fd7081ebcee980c2f1c060917d210ffebfc6aaa287fd0203d9ff401796613637722071dd520a7fe6bc34dff6d3085418f325d6549e15afbf5d299effb3cb0d3ad3ca8af0c4521fa6deb89b3bce320e13f0e6569eb4f3de17fc173c49ff864055732a1f95f0d4d878eb66d4fb73e17d2c44328cf1cedc644d5769183e68088d8573ef1859911653956e653ae20d5b385cfa5b50dbbcf2ca651958034d62586d1313928b29f4a6a75e125bd6e42cc243094466d7dbf9b5da118018d3f0831dc36d107dd3173a0161ea05cd5e942947fe0828d54ec4da0ffbcec7544dd351df45a8bc70f68a0de917a8001e8f53c6d53c25393c7b7d66f559a638e95ac26e783c28ca7468f35117905a8795f431223fd9dbc7a1cfe257fb23a4c3b0448773ac14f75c216031adfdd9889f36e632848a0182404df1ee78c707c4978533275174f6093c19e5700ea30ea08967ec5108f272a287464303a3cbc9a0ef7576f0d02bad369bd4966529a49599375f2c939bb1917689f0be0c4be9510f0d080fec0d719fad58bd48c8129b02a956ab2e5aa8473486b4e5eba888a04bb08108bab0739b0fab0f0cec95079e146c60c0519b42e10f5131852d04ba6f6c1a270f040d6ef3633d76f9daabd08c69aa4a03fa52ce2035615ab77f6944208654daed4d1f312446458ed8542618bb284179d6b465f069c57f555058d945451b29b28f000f2873b1afb9d43590ea627bc4179c77a5ff213508bb19d35a91060a04a1ee5c18eeca619acb4eb74f243e5e27c6d5571d08a5de8269c2373d1056a11fba9a84761f2d588278f83cb47787e2afc632b4baf72d6ddc088c01a73f3b9e8ded6f2f46738b974056cbb4d8e93de7d7e9d758c3a2b33dc270bdb21fd18387b4cbbd914d31f14d407eb7afe3221fbbe7c56df926622845988b750aef0e28ecd269e8703c0b1d8006bd9aae6e53636c932ac806b23c3060a99bc881eae47110381b9ed9873c383da97aeaab27a8a0d506b0de07c806df37e85661ee39d37497e878f37cdb9f68c270bd0ceacffde5ace8658c2173a0e8a13e1ede03b6e22ee88a1bb142dcb7190501a87cc1631b8dfca829c9de3bc6a038ca83909beca80da424fb30990801c12a58e3e16f3f0bfddb8b98eef03fedcac1b6e7099fa22117512ceff57fc4afb846ff85defeb914664faac7faea53f83ecc271f35001446407071170414e6a4971b43b5f05151a17cc9fc62cdd25491e7b18c79dee63b19820759e6d2fd7b61f3610e9e524ebe1e77ae2b33a75637c484cfb1a0fb4c4c44f7c08c8ae0f065afcfeb5eeabd6ec631472b17a6975380ff72fa872cb6be0034555d56ea954df2e588a3d279e1cc132cbcd4564fce5105f221de32ede63f5314f1c4b0711648552c3e013dc7dd4398d03a48b6591b9b418d0856c10fed17b908d889980e79111cfa84dfae182738f626566d3edf555f241190723ef7c8ed54715fba9dad176f01a892a0fa50148d8bfbaf3cc76203bdedafbbdce8945055f930fdd623e85cfa7f5cad60690eab665d45180f3d938f780ce16cb1a7e6a6973180f802b6ed73466903b7254b1bf9ed47bec05b276c68c84c1a019bc1e6a1bcdaf0cf6fb7d1e9d5819f83b1a4dd522a6658668169e5d5658a8ac26e571f2ab8fde01376840380693d845a44cda2b969aa989133db03e521d4f9a631d616f8bfbf0b6bb8effb27465ba240a967ea2bc2c410810998d3a53b73d1816babe3bac33ba70617330e3b1a62edccc05daec97ee89fa78de3046482c037783073205543b6d1c6d12cc2098691093ab00051e41e548e10f207b26e714cef1ebd5b89203966c3e1dec996c3a999c69cd454fd9f4e48b5ccfd1449cc93830c938fdc4b4cc471de42e10f0ca58464ee2bb0d50d1be41e343d8ab62b34d03ae7686688811ed78f9aec2d6ffd482784edd0e5a6958b07e9ce6f2c33f25cec3015bbfa6c55a18794305e69c4effe96fd08ae0f4bed86c032a98382cb8b798ecb86a4f90c9d1c1fedc5f6c801feb70252406711fd56b15269ec9f1e8fc982d97098d6ad88f8d534803d6c8b0de7d3b070757883dee6eafbd6215d280bf39d2c20a8242530d127a223c981df7ea0b04ae85609f9c4bcc14f4d33349e9d73b06c77c1f44f5de6504a6395e51903211896d16a2a12e1a7203895103965b4b3e3b795a610b496d70fff263f58e5a281e76d465d70108e18a41e90c30fd1583ed63fdcfb53c7b349702a49b423249a31983b110989b50ea2c2b7e82ec8f3edcae5074380c2f9a73309218122782eeaf79ddc861b08c05fcb343ca8390534af0a119855bf2dbdb0c6fb37a09db18de00da55aa00521d06e","title":"39 组合总和","link":"https://leetcode-cn.com/problems/combination-sum/","question_id":39,"issue_number":83},"81":{"day":81,"pres":["剪枝","数组","回溯"],"tags":["剪枝","回溯"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。\n\ncandidates 中的每个数字在每个组合中只能使用一次。\n\n说明:\n\n所有数字(包括目标数)都是正整数。\n解集不能包含重复的组合。\n示例 1:\n\n输入: candidates = [10,1,2,7,6,1,5], target = 8,\n所求解集为:\n[\n[1, 7],\n[1, 2, 5],\n[2, 6],\n[1, 1, 6]\n]\n示例 2:\n\n输入: candidates = [2,5,2,1,2], target = 5,\n所求解集为:\n[\n [1,2,2],\n [5]\n]\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d409c9741ad6f077b58202662640f83ed5a758993317750843eaf0d2fac47a3d33d11f0f15565c67ef650633fd97fe286e25339442dc7a529560c4ca8fbef04f95e7f25d15eb065df4a3e4b2351a648a54a22f51deeceb6caa1c0bb85fdfb3f8eafc5b7998d3e624975f533d5ca1c1081ed3473173341e4c719855c69ea63144284fcca80f508ab0605af99bb5e662376320ea9d740f1d4ebfa937b1d7621a8eecd79282fa75ef6e3685819a1fbc9438268d2c902862f1cbfee08a0f5b87af504b09ca604739da16c43e8dae40558243cdb1929b67373e4cc3d72330c58c186fe416362e8a24b63b0684d0342c2df03de8c0775be4cc3cd1650f03e13419a878c6ca022fc378d9c9b262d0e8c70d0e82f0b9840726745b456151bf0287ea7cb0d119ef362ceb0422c0c9b1ea17f81caeacf226e3d78dacc515c4e01890c26215528497b10128d638cba505c6ef182c5dc77a39d79dc6b5b4e3f5560979508afad2cfddddbb6ccbb39af28a7a10179ba31457d5ddcc373be4eabad3b88ec5ab6c6140d2711e5a42e78e731124704a0a6426f4032ad16d6f7371a8ddad259e5a7d3d9a845db007d2a2add4003c5bae548a6a09c02c63378f8764c2a03559be59c6af8d1fca989ac4b637927074bda60d251020e98c4338192e0601b2229a386bd9b38bdfc0788ee1ee165f6c875c3c75d0f65698c6cdc0c846bc6b6edf0f46d81849ce2580eed1f43e093e0d4d99f50fe9adaffef9ba83c766acea2dee60976285f35b98c2c948c3911ba9374e3b22a4525b69ade147ebde8f39ca219a8b0b762d94589fa21f45f6186fe3011d6805660b7d1717e6640337d6fe1307ee499751d53ababdabe8d0a7c9137444716141a129c0f729e6a023fe0c79e44bc3c7b1dceabe670d41ffa19f1176dd20e0304e33286bc78c7c1ae646a755b8c1a6d3e960c1c03e44b454ed828c453a881ed430ee21bd8cab37ec6723490e16b9d303407de9ffc8f5cd3c8555881b9190efa5f06f253dadeb66decf10b04002602831791bdce75fca2e2ee935476e6616db11bfbacbf15169442b56d866b1c9904fe926b44132f57aa442df7818c837c1c8e0a9a00b1b30923aa11e17e2eef6b58ec6d46b5ff268f905ffcae988f39e4a8a6ebe64a02735bec92779535268caaca3bb91e305c693baf9377f22f64dd0afc44e8fa81c0dee3e5cf71c32a8bc6ad29c00a94b598475681dd30db36a24eb3155bbc4fccf237a35000c5ef4ea7f88a327571caea81f41c6608a9f3fab2cbc7b084f0ae27ebbf7933b07fe95917fedb3bf7c3fb268e2658dec0ef93962e8f173fa25df0151fbbc47544ddf4c175fef28cf1d4d9e0d66349d6bab4b6b114b72053d154f5eab0d44bcc2e4048c54b63feb51ec2945bf2bffa632153e487496dfeff11259de7f3a74c28eaf75ae0891fac78bb6f32787801df12688dfc069d12e5f964510bf60566ab1700aaba0d04fbfa5b506856710a7c9dc4fd9e4cab0b480567fbc12ff0701a798ac47e95125abffdc90f65b604115cab274900e11b6fd38c8c3592e0d6a14a8dfc7e6b6365fbc30bc04730d22f0b4ff05f72993b77402eafeac764c36e47265502d59bedd950a9a98165651fce57da3cb3aea4b00549827d1fb865316166472b578dd476bc8eb52105080da0e542cd8b4a70573436d795b774b3b44810a9f559bd4d794001f5946f867f7cba4090c20dcf393e6d01bd10893e99db982f59b97965bfa8d5cdb28c5c66a008ce0cfc88a595047303d46c52308d3cbebfe16c75a3846b478be631a9a1c92674802759244945a4d2e5c0181a157f083a989bea7a97ea6fdb71a2cafcc6720e37a0fba2e5d81c0770ba86ae027777e161ba3da190fc7e09247b076d7d95202700d118ee79991aaf4fe6bd2e6b0e457d0b949b46b6227f489b255667ce473cd1ac03d053c1e459c7f94999715129ccbd43a3b14012005300d13ec33a8c43c1450884ee7e502a4450e8df7f0089019f72b81886e28b2e1e2effbf7c9e066a5ba21d3a1caf58659e39cd2c3892016470fb800ce7c8d2a135a6344afedb26dc13c952a7809c21a6d1137709695405c0c0cf7a09256f37a0fdfb820c1e94e445876334067dd3f5c6fe02ad850d390e9c62918750037ef48cf90de322bf5ff5f1f319afbb70e7455588ed3321805c99c750b953353d4b54d6ddda56ac51e3536ea5b0b724ff92def6efb7b697b720eb515111f9389a44fd20eb2f2d735e623118e0b7ba5d52c8b2e7038bb6b1655b9b0b50f2656a7115f227dd6575d74937996661fa2c17a79dac151c5b2868638cfa41bed67510dbb81002be13d6611e64492656e846cabb27e6cff2881ba450a8134416c2719178e836a4615f9e0f3472e5a5a62d8d089be8b38e7d8b2fa9df4f2c1ce353ea2b547f1ec06c14a89a666ad2b8e18709da2bc4c777046f7630b4389d9772699a0621cc8d1298fb09140929dcf6ea6cce1413afbd997e454fd0db483f36fd6fbe688ec3bbe53613ac168e450aeeb44d3fbb1da1b4eb2d5056dd4a69a14f061015f7539be28b75246db70613582b43376dd198153eb1936a8093946cdc0b8812e8cc6a8ef041aa5d7f8491f0beaa05d4666212a18822355ed0682459f37922bf86528732a5a92532712f37837b55ad2ae03f71202b47172d64eb333e5f3feffb65ba908fbcbf9f77ac91bef0dda20964abf2d389e970b44e5c09b0457e8f2b6c1084e5be46c5aa71515dafc7ae6cbadd402a62999869495af13a52d0311d1962391747a9cfa0a72fec723dd880f862146d7b276b098851b4a47e75bf9393c1d84cf6826a28700724561aa9cfda690bb1ccac201bb81e9829b1f478ebd8cd8f24475c287ed52d25972eaf29ed478d18dd5e9cee83f6cc0d0c7d0f768812a34064d35a299ee3c9aa23e27d05c94d8fbaab06d932cae8634f7461eaf3bd084bfcb88c3f96607a6a5f426ed69481a0ca679da2b09039f48546d27685f90dd6d7ae17a87d061e4413352a3d0e24f359964e54af40f1e5d3dd875a1b4900280544811007f8dbfb8d612ec8048fe95fe207ff7a950343ce6173b67aa1d444054a9b4b5e210687bfd80bf8fd0ed1e5bb69ad16c74a21e94518d6635b6b046748777d114dbb1f36962e470b4a5b936eaadbf8c9da622e4689fee71b3791d227b28220daaf6132735eb451a72e3eee119f79296838e83142f37a103ee4c4404cbe50ad162181d8f09ad8c243b0f391d6f077cd185081d4a7f4cc3cdf0d4e6105171effd2302ccf711f2eccb7148513330bf6617d255649c1850eed21b65d7693894bd055287535ef47095d6548f5ebcf13ddf478002600164c7fc915dfd05cdcfa38694aff4a4090178dc1ec4b151d36d0901e18fc1acd32892a022555e8529fc56e185909d23f77e0f1cdee3830a1b327ed25bb0c50fb7060263d3dcdc61faa9a2fa62ece4ed08756d159d2dc95a1034dfbd192dc1fc22816e62067457d1a89e8518831c0f54660ca90f7a1d0b7c10898e0e2f8f894d2cda188225e8ad25c27ba4e2e4efae87a90afae95f8033b94bf0e11e93b0aee5904fdae5d65af7f77dbcceeffbd062217c0c66790091b3fcc8d26f7389dea5669a3f4b5facdf58a8ce3b29021f4a5ea87e1facd91a1fbfd5a91981cf2653438bd551d30149cc736b7283ce87b075e6c6a66d6a8f1753a182fb4dfe6153e9302f0467287cdda68e396871ec84fa0215bd61305d0a5512b64bc7c57e0552d4f8cd23841e62e663a47aa63fe650f89750211d77c4be0cfa596f6e4e7cfe714c607ee5234737bc05890fa01d79ceff18037326bf8c85c3a94f9c5da2ee36c91da51ebd6bd2562c760326a5c5854314d75e252a58ec616eeaf12f50e5795a70d220c5f4a5f6ef8ed81840bc78173621a33422d2426791f52472f0c93946c7c1a80b130d33874bcff289527e03f4a8524eb2611c40610b4c63c39a4dfcfd870bf2e889744ddb36946377831bc90dc03b00824182fdff178984ea92223c022b297e3c6312ed42f3afa7907e0deac56b7d4203ac114d8cc92a935e7d2ca846a90fc29595e61a878a178bd59d4eead3b44665ec7c24d1dd234a95b5a055561447a7b9faf9782bfd8c6c89e2968942554cb933b905a6c67ed917ad7bd292a910b9bb36cab135c97d0b5bbc79fd34c6f6807852228a8168b5fec4632e32d5b83b1584d69b1e48290b994c1f86866475c20952e790ddd5469290d1c63a3bef0d4aa07f76588e8409b3f119d2e66bfc4cda3259d79c1dd7d4f50521ab16f4ab3f9ebf5a251c9ce5e57f023156fafe48264ca21b4329a39f102ffa02e4c96553f8688e04cf132b8f60c3c4a2b541e9de04cdff7a69fe1bddccabe553a09a654c77ef4b2e672837f79ffaaf0103cc4610802f1577f61647822350b2878a4e4ada4d35931ab8a63ae553b8da64098c66c3ae7f5b7d48999b9552888f8a372037b2b92b5e43e2d5b7c9236cbd8d763f90e2fea0ca1af0000682cd52cc1ebb233a1b619e7aecde8b3f20aff74c82aea169541c81581aa9eacf9f3e0603311b20573470398776018c8ade9f25684509131286203cfce7e541b4f28bc9cf7758cf6ed39fa0799b2eb39277d247ffa9d5a1486455c6ccf18f6934c24db8c9dba379fb054c5ac559eef267b9f9555238f7bf4e877fe13a68ddab69d76466e7397ef35cdbf5c69abe84ee67c8f4d4f11263eaa8fa91b398fb2dd102eb552c9acf19b72cf9428947cfc54c329c9fb7e874220938c18e0d02d24f42587014db72feb88124599bdb52ea7b0f008d6c316211a395af6390bc424b01eac75dec65485eac6d8d872cd5d7641269ef1e02022a89a8d7771d369c6282336380a4f89d0002b11a285775f2b5b3df8c14ccce9fb049fd6d8c686d47afdf3209f2b5897ad200d153a305504794788767c1776aef41d40a83b56d00c8cc3abd4d56457e99a04d2d8137a5ab49e8d7d2616995f3985c0713d983a103f4e236b11770a7e96d832b7c7625289415ffed4ebc7dba5638f956e137d64c6334746fd6ce0e790a633f4128e180bc636bafc76e6cbbd59cefaca4561106399221335183472121bb17850b57ddf0b625e1ae1b0be9b5a1227663fd43b7e609ed20ffac21a81c4264bf20b5e3a1c7454614d2d60d7ac95de28e2ee0a1a987c9e9c50c196968fecc97c53b999d28f5e1a65baaea1b072629b8c7e0cb014011bc2d25cba73a4293fc7dcc840b7462d21d144c3ca6be61edb807c64aaa094e6a7dbb8073d598c48ce8f9ac55e3c46a2a04612d128eafe94ecc9c19ef696d628042b7d01963782e64fd76259cc83025b0da5179180e6cee640c3c2d56d2d1df14ce52935a40652aba9be6d93abb77f81332ddf90d6208cd51c5993821ce9c62d004efaaf877165763477198ff77c13b51e45a64c2cf7beba79ac708d55f3506efed7d21030bc914db1a6e067f73f41101bc01cee8a90ae44a6434e66b6205456e264737177f1e82a97700558bfe9bbc592f4aa30537d3f50ba05c7e46c6c751bfe10404862cae569952c8d971f4d4e92f909f988f51f9b35c40e633c43380892c530c4b486abc153192322a3b55f68e66d569ac179e0b3a57c7a8b58339baabdc69e7b9a9e7a959d6c79fc9100d012ed709f0592929b2e464736437558e730e3a42722ff192677f159267e73827cf3d0d684bdaf6acdae558531f7d7073b7cdf81a2ce2d1858345cc054fa8acb44dc94a1eccfd76276dfb81c0826a881a3582071dd520a7fe6bc7d99f6901b4939a621d600cd15a9bf41299ea3fab54c6887c68abc811c17e59ff6df728a730813f0e11ed4ceb69053f4477d1db788031a2373179cf9aa9d35bb0a9da827ef3c7c147784fa949f6c4d5765047f7503deac7bdc5636995f1dd10c207dab43573810bf15339ab0ba93044d0a420e29502c5d409e8b7db1ebf732154ddabc5fd44f471d2fd0cfff83dc50804196fe9706ee2c5339d91235116dfd3fd055831756fe2e289c47c7da0f3d7b5791c0649470ca6c24f5fa8a0fea2db80230bd50efe13c25393c7b7d66f559a638e95ac26e783c35c93976da4010b7019adaba397f54a19c82f5d5c857fb23e58de3449a73d769ec76216031adfdd988dd26e23084f453c30306f9af36940bc4ecf83f271235bb4dbcfd1eecd457c70772e000ab8407e16732e2918e0e0e4d0d27f2f53738ca3cc4535d38b44df78eb3771f6cb9b1dbe276eabffa49518a3d4f040601fa7f37d4e352a745e519dc09a615a1344ce9472adc9bedf6b8cde45ea1890badb06e8b46f34c48dcc61683466a78d37b9400a5154131833c5ec17d085e621e3f174ca1267037b094abcc8c79a34a51bf069b727b7a70f430625c3a8d01d6814d1763610b04c796543b05a6285170d6b661f0749970054c54c455430829b3a4493a6234fbbaa8dc3687ea7f6bfc46fa548fff677a5abb119f1fc5064304bcee0f4cac98f2355ac32dfde1d5a8ad015bdef7cc2a2957b576f6f283ff67c8115518dad9d0bd0bb3113ca967ebf7bddc34bce9a22970e304a903ad3f3b9e8ded2d6e0538dfc5011580bc94a03df697af8d5fcfb19420c365f2f959c79b86db8aa1904934f9570520bbe1e22e1e87ebec6df9232e7d26d6ca79cc14dbb53516f90af3f8d9d60de448543bcf97aeb200d64c2ce0796369d7de85d186ad2244364bd1898f352317a92af6d5328cff905c92d727e226cf36903d469d62fe6e9eef278b2de68228cb62d90ef6c5ffe5a0f4018c693283f3b43e1ed048e5e032f69c52e34b99ae083b0fbe7ce7635fd8d1a9609dd92cc5e12acadadd8afdbb248d56863699080b87460eaae12a3105f9d7c2caafb47fa2d6f7b7ff5bccb94d421f2af7ef758ae6f605b699dffabc1c7c0ae4d6e7be02a379db3642600970460c7a6d0d5910b3bb96406cbbe35f7e992ab3902bdcc76ad3a8c9cd3ad3a143198a4b1cfe9be72f70d9325adf0061d81214ae3733e9403bd9cecab0afe85d5751a4c6d5d5e1f87f89cfa957eae936c6780e2609e4cd0bebad26fa817ef7a2123c522a35979550eff5ecf69f2381af1321ee807f139c5c4af03cc428a389794831be84a31075defdd9afcafd4a05a7080eccab34e4de1fa30ded8f6af236872dfe494270c2afce51f9b0c5d3d493b03093c6a2e032d384e1865f9db2612a63bd819613432ef496a97b673d51fd9f5c6b6024bf5687ecd68e2426622f7e93d736e7703385208a6abcdb3facd49d62dfc4ca99acf82dc42b2cb42896e9b8b3dd58a596509489116f0140a0442b15bd9c66fb9a598ee1f2aa180565dcf1afd19c99b5e712ddf1a28a9fd3e387e69e64633e6e2bfa7d6313ea3e4f1089dce0f6340719dabd639505e2e01ee683040a2bdf1a552ea01c925c84003f31fe0dd0034c22e68a38080699bbf9cb2bed2966eb2e56e870e6025f60f385566d9aece9cba763ea82e5f79a8cdae63b2643b4260cee6e3069727fdeb30542d4f2fd93a4a89e08321569f475cc2438e5d2419dcd0b97b17d9d24cc22bda4c734ed36f739fb81af50133d586223213a6b1a338f764aa6cd78366b88d85e6a5e8d445a13f7be2aea45c533f49a580eee19c52262861ff06b4169d1e22827d434e73527868358a0869ee0e88622dfeb05c7bee5602266bf455da68c9a34aa3db9ca567997a52d6105a68bbd5f7b5a9ab846ecc0fc665e75e36e15264c27d6635f066245f819def76d31662d9d52e343102d2245fb00d21c697a43f51f0b5d1f845e4c592117159d6cfd840c9d69d0a35f785f99ded9caf9f6035a132a1e3780e5c6277843c276fe31a0dfcf1adda50a9b6a77acdcc1987e3a7f23f8d451fd0578ada87031886f1d27a3a571324b7895900e0d74727ca5f55c93d9f33a5a0f997030b6b4a2d60ff5123d76eba3b3ef63767dbf8711fa3e9193ea3ddc702bd51afefa54c1769fbfb6810e2f2d8d32be1d102d99b62cabc190ca2ff4c829561a898d6b411838b9dbcb4175694595e8db95a45b57c303b71361ce206c6abf6f6f9a16cb19e82c6e528a641b786e61c127d140ebee68ed14efd9853e9206f5cda3545a1604c178fbf07f0b86f0ca7afab7623229a49f80764413022b7c9d6b265a7b2402adeb4dd16e7bcef61192cac8717ae9dd3596587d46dd00e1686de848cd46be835df8a1d79650d7aa0f49ccf0d327a38f7722763a2a124c8729d7f23dcb5134ff2c70392ed350b68cfddbaeff6c9f4351b936883f96dc66f8969ebfe11523e6b23047121dff67087d82b030a89cc18c6a750261da5124b3efac6214d2d412263bb43deec379eaf82a317d906c4430e642b4fd2898815fc62e76b5562dee51b43bec7a7c2211a47e558420f0e67c778efdc960b82172b1f612674252ac4ba6adb0a7e46927b0082ff8128356da389aba8fb98ce433b68634354d630a85e481c254b89fc5ff3ec91cbd1ec56370b658cb77ec48f11b28338c4b06e2fe035a6929a8ecc21c62fef9a05900e1e2a92d316023e6620387393eb1e9502d160076089a407cf9e601a31bd89951e6e4c0a5e7fe3b5fc5d371642a1005f241d990e8aebea98938808cd087ecf2eff3f95cf3ac638a591da244142fc6e4b65a3640b4c644307334e6c77611bd1879073a61886be0b6bd24d403eae299c207314a3f14c6bc89d80e4f11a04b3c5aac936aa648a9fa02e6abe3427e5439221eb43c5fdd92ce757b8720de8b3ddea13c0e1eedde2020706daa240a07199d3eefbbf2cdc4f94bda8b4873b3c9be07245f24ee1a165e0014d6566596502e","title":"40 组合总数 II","link":"https://leetcode-cn.com/problems/combination-sum-ii/","question_id":40},"82":{"day":82,"pres":["回溯","数组","剪枝"],"tags":["回溯","剪枝"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个可包含重复数字的序列,返回所有不重复的全排列。\n\n示例:\n\n输入: [1,1,2]\n输出:\n[\n[1,1,2],\n[1,2,1],\n[2,1,1]\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d42bcb540b146077b582027486b2a9cec7d5887820f7750843e86172d885da1f20611f1c15560ec72f1486e21db74e782ea472bab994a608223497adab2e98e17cbd424f760b263eaa4aae3296493a431f40bdfd86d69b8fda12f0b0ed7149b04ade387740d978dd8c830a993628ed439633875193366c222af2048ba722b7647eb7852465ebf62edd4a7be9cb1f0fbe7dbfe3551e7ea88ae785c9c9782cc630d18b1def0ea38cf7ebbb37fcefece18827e9a8b589e2b0da2e209b7bdfc70b420d9d0e80bea4d56e9b4235118a5d3f4e1b37a27b767106c1989e4e8fb91106f35f3c3a4442d474dad6a46064dcadd0ec5b1ebea6ec90e501671ed3e07549bb79b67a404f21da99ebb3cebe46df82808afd261cc86ca4582571639f42943a5ca182d9ddb72cba57006721dc87cfe4b613f79a4600a55dace4e460d3bd6447e69060126e08e65d049d009dae1f823566642bf2a65b16b8f8cf7bd9cfc5d5c90787bb876d19e8ab4bc3cbb024a18a6bee43c2d0a6891a46e11ac674a5fe6a81e3229ef98bd5a5724e904f6675a73641221841f797de61fae6195df0175d061d2a8dff247dfb661736261cc0254dfe3b95ff0e5904f981f10b17f085b0ff7a5d95ae5a9b2ccc1e88234e1e4240f51d953e251382a92d5288bb5c8612f1def1c1c7ae504d77cb4595b4b9c559aa87b9a996145276dc810cd9851c799e9e146cea5c399fd9e4552b12e1784b481b7e0f6f46353b4d092da817c09409fffc68a7c7b7f3701108f31b18d08357e19eb0c36791331f9facc9fbb5f137e784977c32c7db410da31468a409af23229a5941f08f2b63564c9dfd3dbee83ed34f5b84116a59ff0abaacbb0821b71b12e4b5510163e2142bda47db6bef6647d24f23282cf99081758b569d539af26c1f948dce5a80dd03f75dd5e0b00c0d2f7916f61496cd433729f6c99ffc7d42eda5faaa932c7e06cc930464cbf56affd5553e42e81a5d762063622f90812f49d51558eec1ccc926f906f705903e39773256d723f2af4271bcf73d17d60057eeed25bffce678f631416b7d03a8b65b81bdf954482063786f381e927932e71cecbd3b13f7da16a0c8379166f4db457997da024c32e9e4725eac3b8441f358388d4d0136d4531682323280b34e1daf32f343b9ba9ce19bf0024564e17afa971f0395edd27d645fee88de7cae3dac27dc4208bc4abef538494b5984a6695d108fd3bb85bbf2f79bd79faf2348d5218f5ee48bef28c31724fede6aed11f7b2aa4dcd1b3d1e6b39bc3a132c5b36416b07fec5f29d1d600dcc0de258c1649dec3c893aa25830314af6bd61e1ba12ac7c315797db090e3c782f18ebce9c7d9286934451c178e085fd568f7db9dd270cdffd4e5c7636cfe9a32c3a975f084f568226c0836e061dff0103c85e7f89f421bc7f340e66c8e16ae07f9336e6600f5346b90d7048d1be7ec4f5109cc074c8b141485b32438f8f078594a46a0b7c99ec6d29d60a9cebee3f46f8442e63f5677d1be68d84c44d7a4e247c4240e3748448fe102d10162f5828e3fb5eddc8045b8cc7c437f66f7ea07c76430dd290b43ec5c528e3762412fb3edcb7be06d65085a36f498e3f75989ba81714712c443d90da4ad9eb00b66b0c99218b297d9df101d3bddeb0beda3d0652e45749e8d0bebee15412b580383caa619cfa1257e9188008b272c776a4d5fef5a1f269feb5672bc08e3e9e6fe61904696417636a68b6fee86566c45606c6df0a839b15ec538056e5385fcaf10e58f3b890c511a42abe1ebce410acbff7fce9eaa4479e6595a611a61cdb0f1ae733753171b542e1d6ea24964b607f7063a6c298b83ea0b526606439cc7fe655e76f399e73cac39c70e4a67b182f2978bb4ba04c1f88b0dde65c95f54eafb07117ce5dcad26804963cb7a97b88678b7f5964ab3ee5240851490460bf6483ce643ffb8d91f4da6355edcbfd69d800bc8548c02841f8c9f1e5fba86e51341894b9ad715cd6fee70a85f660ef1ac8e3b27f6f25e39ca29e6b3d345d89444ef52c7b55bf3abf15708c4330f0570be42dcc10e3eb015bc11f21f5f2dad624abdf8c0a9c0da3e0c05b55a386fbe750e6a09a79a6f0ec779b1b0f2818c3c691c84734e8cf7ae58ea125acf93ba6d336ed826b1559ef5ede307e7ea3db07214dd67e0d005ce4e4fad759be2dfc8983f485ebc20b21f89bf6d2778ae594026751d5720112de4219e020c36c87f0666a02e7379f3b6ada79a5a3e7eb6c25c1968f05acddd65dc42cfd71b83012550ac2b937976d0323db13470e76517a6d0af210652253358dbfa47b8d63d0092e31a03975aca6c0e7c1ee9ca526ccabb27e65528658a6e947baed1d14efd55a90ef12b8fc253a8eff4617319b413be1e2d1b34b80eb26e6485ace040dd32c398a9f65ff3df245097e711576173f705956ea11454387ffd34915a17d343b0c2ba4f18d76d68efd5d4af7d3976d6f97f6fee97b3144256c3db23393cec75dd42d383abe0245eed75de0c48e1bc407b9e10b3b4b2121749cc1847bb53585719ae468ce2801a5c20e252562d650a6674ddc3087ea4ac53889e806fcb4bcc0896a339f5b93ccf0f06f9a4b5def65ec8ca83fe2163d1a2fc46aceeb769c4bd7757ae18b3683ec6f102437ed02f49b322e96c1e467b0245257fe8603a1126ebfb31ab8dccb3a49772e88cb6b5c0fb4474f0ec96caae67bd00055df41423e0781759f9e9be0fc5f3341401e6a3ae3eff8e5b004899d4201a4cb0275bd83f05271775085dae88a7ab31a9673496c8af735f391e6b2e48c677d0ac1966f19ffca5598a3f36c68cb9859c99e7575b34809c251b2ceee375ff7ca34c6da66e70043b9dc780ddb53bdaab64806cdb0ad721ba50bb692d420659d7e6d7f89918966ac98c3dd2f0603b610deb7b838405bc1d4346c665b5256cce88ce97603b449cad4d2e51c14bf2a889d68ff22d680d4b5c3182a4a790b928708a02901e1ecafcb3f65a3dd9b7b696cca88fe182df318245a400ba48e7b7086c0dcee695c591d9c87ad2df0b336a6d85ac0e9a4a1a8875a56fff60e8ca2e88f87da9680397939960c18684c16804369156fd1d81a37dd6799230e9b724b2987bc99ce299a89a8ef5f9c331d7fc14d580cacbac7ae408f1f5c91fdea6816710b401661a0a833941d51c708fa68eae11bf59bfb217996ad3e7e79227adee3ad893f75d26c0b07dc746aecc1558353d1f2fc7203a104c73a230ddc8595e6b594d9f5fc8cedcccf9b32656d3b105a1d4cb033cca439e8fab7ccad4065b122f37a5249c349bdf33418d02929a98f347dedfced6884d2a5cee3248a5ffe2858689a9049f3823d26653fdd6ac36ebeb57cc7255109a9fc5f7b3ba1318e06701bd21ef9283935dc65b5de4deecda5aea876f112a6ea6874e2988c725bb01503ec3e7a2ccc24106cf2445ccab26daab4c2e9e4efe15543e2cddc03c4c685de70eb4dc279e8b9bb38e5207c924f4695882f86a546f2b151234865f297106242816196e098ec37a04dda5388b95ce3e70e05506035160a3ab4165c5f50eb89620cae01d10908c61def9134b6d361e9be7805201fc3f8bedd0026ad37fe53d2c8b99346213611c094337353d4eec66722f4b65750517003e41d25728a03afa8daa6c8c91c1f21f28ff0eb28727a1ead48a8a7dace9a22610326ff49fac5468d27cf4507cddc19739b580db0bd74bae74148c154c97e1156f34e1222e9b1c504f91cf3802fa4a227303eb6a916b5e80354f3bec6b31caacead2b3bd82abf31dc818f863586675c326f37dd06e182e250dcbd1ee200f91e64c6c3b7ce70a94190df02c385ca0b528eefa8795f188bd87ae73b041435ceb070fb09662549ef38cf4dff483ad10dc655f498b1368b5cb88e8eec2bef7907b5f5420845b7015251c8daa2b4eead89ac551eb43f13c58cd4fdf6c5ad0787fb9d6103ab6ddf3fb3bc06cc498488fdf285926305dbcc3951fc95d70146886a328d303b96322c725bb82ff947e29ac717ee82a64ae8ad72bfed1617cd314cfc492a922909bfec33ed3e7265f506aa934ba099773d4eea234256245d5d24a56c500b20f5f46055200f6b1473d6a62735c710f2bac42f86c079fc611d901717b9adf3e92fc6a78c140d6b252b16e418a83edec89abcc4d55786bc1716dc9088550f73a7bb0640faabc705075d5aac7a8f7d1d0a9267e474121d028536998036945121b7bafaed9d9821a967b9de10fe36a5486042efa889db232d87be8c7221b124b1cb62b42a9edf4e19c4cb8c7063cbe675c2bacf1847c9273e578ca1bbd4bacf470098c55209b84b25de764c2c76f454e7216049df005ddfdabd2fadf9986ee103e489954c06faca5e65cd77e10f7bff9043c8d551602a31278282944072f0c601fbaffb8eb9f1005abc677d75c1d82e504e6c6327bd5e2b3d2c4d4f04032a6c8e174104e1286f1eb3f255b5a927585ec8575f91a2ff005faba7f672a698757f5d6cf66dff741afc1cfa9fcef5aaa2f85249453e00f8144d4ef9ee3bce6bb6f3401f30478100bba6b630084e9de9105d00fc077377f50d78e241b315228c7e1ec5f8cf6fd3ded199faeb1506c750e7fa7b77058cf160826aa4af69b0524dac187b479d0b1548cf64089ef2d7283880862803fb0ac74a35adf8396f3d34a6f2a4297a63ec6cd211881c247fd568f4d1d547222bec1a103318ea1836e73a378caadfff511fb8c289960c91ddd6693a364bd616088e662b9fa6e68b576d4013ef863be951d0adfee9f30a7e3a40dc1d116655d7a52e3250ece2bf904bc6be7ca7bd6fbdb88c9768a03150567cab4b35b6ba8d9c228409500876423647d596589d0002b11a28577162e143fe9c60ad7f9ad6cf0848bcf86c867fde23ab52b58dbe473591b7b74110c3a5483613b1267aaf4007fe9160d8e2687c3e581982612bbc90df8d85b3f16e4dbdf757453ca536b8cdd773bda10447e1c642e457707389acb7cb8cb7f1fdd524dc9c8d3cb92a822849f721a7962c2340e4efa39a6a5c4fd7bd708a4180bc636bafc76e6cbbd1587e0d84b651462833156731b29210f5be27f5fbd3793593c2511a3eecde6403827663fd43b234a9ed20ffa9f30dcee6649f3623f1e17615f650b6356d5aa9543e723de6b1f8141cece7acc8f9a9efa9b5c67be89dfc61a546e8ad3adb022749bc10519be151617f19a22d93cea5a6ad88b9313ef0a1050fb0782842fe61c9a9a7663a6ec85e9fdd2a81e674abc489ccace900c7246959822719066eaa1d5e3c7dbc4f494d364033a7106df64f0b146fd6259cc83501e10b64593c5fae8f424e99f882d172dd14620ad9862bbf06e3338a83b5f3495646b69f5c1a60a4a628a902416d96d28aaf3a8767140eabc9ffd90c71939dadd2b8f45f0057fbeeabaef58b402ce4a97af273b7c97f51407892c3977bc13f9d3bfa91d842b17226adc0685c2b435fb839d3aa33d2bec3f05ac67f8809475645233163d5da4e5d9ada67e8b3524a5e894980dd1c49ce80c4dea91528b9f210c17dae400abc7a618bf3bc404632d47fc917f45f4002070249779426709a3bf5f27f22042dfd031aafc3eb2970db6ad0c777c80fc7b1f73a73069b2fa2e718831c87be6199e4f6c933b128d85a2f48b38b4003be1d9258dedaa79d1afffb252d90c339f98f4fc34cdbe5989f62b2591bfd6323b06089a8e9183c805d0574c75e6de958fe9e2f78ee1537c4017966136379da4dc1befa8ba7c3afb434cd7211324f366d673d11cf9318fc213574357f5d941731a7b1ab8178b9f3247f84eebf79f04429a0033367bb43b83bc86632a86dadcee8735341817f315b85800902a91fc1018cadbcf9bea9fbfe5f9eefaf177fe5493d5eb1bd0fd27abcd8d21adf912","title":"47 全排列 II","link":"https://leetcode-cn.com/problems/permutations-ii/","question_id":47},"83":{"day":83,"pres":["滑动窗口","字符串","Hash 运算"],"tags":["字符串"],"whys":null,"difficulty":"- 简单","description":"```\n实现 strStr() 函数。\n\n给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。\n\n示例 1:\n\n输入: haystack = \"hello\", needle = \"ll\"\n输出: 2\n示例 2:\n\n输入: haystack = \"aaaaa\", needle = \"bba\"\n输出: -1\n说明:\n\n当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。\n\n对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c1b032f243483d7875596a35599d892b54c0f31b000bb354ec0a71d663ea883d71adcc3e38c922a16c067bdd3cb8a6a41f0c327acbdb467d64159b9eb1359f0043708944f236f9226f654d0b88c049e78d3374efacdcd4fa451ea2ef3096c0f1dbc33138fa3f760e9213957c9ad53e613b45083e5dc32ba22a9929f52b5d59ea626883946e62410fc42247f0da772b0b69e1e62e535d2daebddfb9a5a3444d55bf5b3f00f012b2dedb3e8b7610a015b74e0295584073e8ae472d0a2bfc218cd9f9e60be4414eeba218bd9d09186bb81be8a04ca9ff1712f59cc68ec920dde96b8cef55652c7108fca2dff73922c3481ce9c6550ce181d7b922fb5a74f9d0b001128272d6490b53982242817bd1f5280588402c24ce08b99ece5fbcb4624efada1520ca414882601d9709a86ed8997101ddfcc6e93541c85f0d8945f0a8de9abaa387d84985c46053b0daf89dc9d4941da8fa3d12a0cf88fbc2e529b23ac6ce29a1681f343e5e56d1effba260309b51186d3187e933142ca9b52698e45dbc9294d39012f1af2d5ad1322f4404a08c40425af76ee4560ff39902b09b76a8ecceb9f567bc58496253faca83277e72817824638ac7266ff9764b2d3b657557d923c58981a0dc30bf0c16a5e2ae1c19f6207012db8d1cdccbef3f70297fcfb0dee73af7b838ee9f16a43dc2ac11c38fe588677fa1baac04e21bd1de44917e07c381f79f4076b12a2686839dbdc0d22fe9ffb8fa93d79a4f0975b7dbfa23b4cf285f35b9616f8ad2632411827fd3b2c81308c0fafe8b64fee1fc81b809a8a7b931c4588bc975a81f3f88e03c489fd31e3dfec4117264583e2d026cfacd3c3ef70b797f28bdfc866c2abdb49fe69afa4a1635e0ac310b137ba189b01cd7042111d3b9e8318023b7728809619c5d3b4c850c97ad78d48fec331575ee386e2c03c888b70ee77ba7eb8470cf38172edd86d010b71ccdb27ad67b22727cad5eadff9b48487d29974d339dc0473efcdf7097aa29fb7e16072780cb79503f5d4d9f6aefa0b429fd180c0c1191d601b5d021d8756e7ba0af52812fd434b6f241ce7b04c98eadad5a8c5c2ef2828ea2511184317790187a7b04e955e700a44041b49c7218eac1a2442c168e92e6dd16624a2d4829100e0b0ec8ffddf1b5e67f23077af05a301c321ef3e178824c7e9e4ae313a0dbdea5eb9780ee359917fb99969a1b8cefec8f31c928196bf15de869ce487cd6b4a9b400f51f10a49d6dc6b745caef80117d0747385e43faf09edad54f1c751a2874d3df011536ad01d5ed1259aa56e6c748c4043c83f183eda273c63977c74f5d9ac341c4754adee71ddc97ad9cb9a6f6a28548294b107011da4a82483cfc30b8c9f5b4544a37508d8e4934b5a87e9e9efc3a101dead18622f37f149edc638b1a2155044d06fef150f965811941886cf5e3d803e72565bfd0eb235aafd3221728b67d48e56d3beee41251ade71c277b3fe8adbbd5da99c246e462746f05c2885dd1335062d0b96ed87347d68ccd41d330043743a61d5802d12062cab88e0bb1eddf8a488cd87c426067f1e904d14032f7310176ca5e6487366d60ea5c2d73fa11c1df6b1237abceca9d318fc7ea402566c214a23afce486fa5553f80827dd212a0c0c7846288db13dbdcce20079501cf5be6fa8f4521c1f1a728ba0f401aacc0b19f7a562d4204f1967eede26b6162da704ccf47e9401790427d3659b5edacaf04672e4127cd7e3cda7f3a7363d8a74b716adf0b6ed616f67bf7b3154b77ef49f8b2959e4c96908d2dc7ffeb3a94643e47975611e72cfaffdae6011500e115e22206c825865b028f5240360219383ec3252443944a3f6fc6d6876f3b3e428a03adf174874bc83f5968abbae06d3cc8b2ffd67e9429b67985d15dceedb8df1e05f06bf45e6f9a01deee2f634abbc1874ce48a82d42d80255d03c9dafbb7861cf5a5a9bc1eac3d83bbc0caa57ee00c5f40b30debc4539538a8e2d854bee11a14d2eb22e19b6f3ae5e79c87d8995ae71e8ce489a4674846883737dc13f253bbac249d3b8cec2519d285adadd3b9b0fb415eade79bd1cfb397f0c655419c680d271706a233abafdaffd431180fe4881696f783880f9c6ee06b9c21b3950ef26ca94294632b280ab00f62ebe45b4e0fd46b4df68882b4998a66542c35ccf8819fd537d7a0506b98fd23ae502b74f02f6b7ba68d3dcc2f2f1a1b0c8ea6ba3145149ab7ed317a93c8261793603733a56a5fbbd4b4380feeb57df9e983732da4514bb212b2550bb7989756bc65374857a39d06559f39dfc5a4f522a314b8cfa41bed63c56dbb01f12a272c66142282d4456f54686fe69eed5f6851da25ff072671ac23dd47fa678e9674e804a2045e5b5af2dd622b1e8fac87dc560fddf512c018f08846f5c315b976c78e1d42d2f9686ed8008947bcc9b14573b7f39af129d973b2f9a4a6482bd57d2ae171f5c62c6dcea6c933e39afbd997e0300828905222dfb21f76582e9c1aa6508ac5f8e590aebba517bbb59a9aeae2c1f54df4126b94253715cf158dea79e3d0e66b7171a420143372198cb4130f0d72e88d09c64980a8d0aefdd78b6f247ea5c1cadb3d9dbe044b6decdb77924dab5a71ce0f9e810c4a07719eb4fb3096c94b05b2f37837b07e87eb5257a6c3228452536ae60325f73f4ed65e3c282fdfcca14a890aa9fa4c44871bfa0b0cbad76ef2a3200b444608b2e5673baa5ff5c96a1020f18e1b9e723f4dd1b006299d4204a5bbd245ede7e02123e750d40afb2a7bc7dda2e6691c3bf73553708743f48cb4792f92761ad9af7ac1e90320e99eafc8c9cc2ac050975d9cf2b4863f5f17db967ab5a20f1017019269dcd93c2f175d3ba37c229cc0bc868b457ad5b607300529eb6b2b191668a0387d87895b532256956a22f809f18f5591d28cf7e9f0f6cce88ce980f4511cee34d7c14925091bbf7fc92a772240c49053499aca0dbf32266cc0c8a026dbee7d7a3176ed5b7dadf9fb5ddd9cbc265832ca411ba4beea0183e48d2e4928199bc9a0386c3627d3e28c2e915c24a468825b56ff326a7dd41c9b606d46855dec0d03484c2df84677b4edf56f00cd3cf7dde2ddf60e7e46db5f759c09cff84a8d4dbb8ec822f92ba1acf9cc382ea40d508b8e9d452d3e89a351cec042e5e15a17704821c11ddf4cff77df60a98ee119d749deeafed65deba68d88ef71535dcb77cd44bfee8460d776e1657a46e7d180539ed2bddcb105e36422e9f42c8dec7ccb0b33a569de401b4da8f1527cf6482c6a570908a4e171a0d53e061d878ded63a419f6e9292d1f359decfced08e4d6409a36133bec7b6cdc9c7e718c941589b665efdc7d136eded579a662c59ceda818cfaba1e45db30089721ef9283935d941e09b18ca29918b5c80c5f7f2bbdf04e74a28765fb2b7a5dbc98e0eece4e17874f2cc7a228ded11c04dd02bf46073e16d48c6119775bfa47bbb333b080aaf3cd1307e324f46911ccac6a073b79664630c75f34770a2e145f2c2f4dddc36912d3b212d8c19c773ea75548461424efba0535909e4afc9e6e9fad4e6b90b768cd9b52123e625fd8ac8e1e44b2789be38b03249a32f874699d9022605f701f1e1b7f6b7d14a5691d6b427e5f0517003e41d25728f27faed8ae6bdfd584ac7153b673b29a27e7abc5f3cf6686e9a22610322ab8cce95433f828b900728f84da76e3c5d35fdc54f227559f1e109ea8057f3ee87018d35d091cc58e7b49a92c673d44bf7fb33f798e304a558a444c868aebd1a2efa088b84c9352e242153a3bdb58ba329e6e5a6f66469f83af630ddfaa0d772e29b410801715f27f395bbeb116afe0df99bf9bb190ab62fb490f12f77947b8d62d548bbac9f7cadd8eb201db294842981272fbd6dceec48cebbac37513116e9e25381c254ec8fe7e1cf69d82d950f14dac7810af47a46254de2c3af4db5673e5898eaf0ab777ee9e479df50a1f69a1d9580535bd1cdcf698c03c65d83644e047444ae562192b35bbfe02bfdb71b8eb034e4fb97e22feb01dc798e3c223fa47140b4bfb0c07ac938be064e3689608b74c74a956211e268b9bd8a417b24c9b97c2b9e9bd91fa447dc8d1b2ace4a6944461fc460a9f48de43c08fef415b835447cebd1593547d93fc7c498697f4c6edfd821e5c5aa450d9ba2fb246fc7fa9814be8c3433797b05ff2a9d5d6fe17335ba0bd81255e5dacc0870089aecbf394bb533e05223fef42bf18419f29b5d7129ae6642b587bf55dba0549cbebd9abe420eefd282411747cbf006495d30dcf99b3427f5b9e05810611abda77b43a05d4cf6ab1a9530474a30829dcee6352563b1695602b4cc1f9bc93e13217312883ddc9449c53a45f1a378111ef91744d1d92e13abab69e6c8e80abca91affef4f2ac6f7640525290a36c7c8e3abab94b6fa90956a9bd0d3d373c0d99b85a25a0d1e2720935ab437c63c3f6cdd802bb1d2c13a82787e200c23a79efa7d8e84dbe4c302dfe6b408e057d5c5b062a9243b868ed048f2a87709a81e4dbbbf8ecab21bfdb3b8cb8a7c653a4e8ee082e3f1fc063e44aa1c8eef00704d7ed1b65ef080d33ef22f6f73df7019fbdb35827b896d3a7f93551c209192a46f6565e81d04a235e7c9636e31292fec51d65aaf634529ae40ea311698d2a907807505b62f589aaad3829fa5d339b8609c25cf07c47d2f4d48ee124101a8ad04b3204f2e938f3494d1df5114d5ac814a9251df660d723ee068cbc7e61b24114b5bef437910131bd2fe38e060199f3fd37aee3a949cbc5522f1b781ebe7e4f8660be18ad2ea2c62e8cf7d6d8d461c711384460c37b2ff76b600834a39c4b857ea7e59e89ced40517ba8fd4112db2c7c4d3fd1b4e912c6f408c9ffc1c5c2812c2723bbf26efc0512dc4d7d2f9ccd4a3b5c25db7f1cea83d05c6fd7af79a61ae4b491c117ae791541fcc555b9e9985277b7db0d1c40ece8a0f34a7a11bae8be2a64e044877c2db7d51f27249a8a418a396402f3acb95a367859d6257f5851ca5d1c070f44b2f263bef64b64baba303ae1639d67a0421b94330218ea3c4e86efb56751524721254a17a71ea39934567104eadefd8de536f27a18570fe90e25b4aa33f3fac1f4ec421bf21b3eed3e5ac80c585b25c735cd808f80ca6fb1fbb5500d00a1d5d6b7a668cd369604049be92f31169262bb78c560ee6ef39d9df912c31083ba3539cea1d0b73bb3792c7e8719b461f8a66e63a1cbf9663076f625b0738c4b28738cf0908010ce7b8816452cdde13a150475100104a24191237ff89f1bb9254ff4e69ca10e8ee092c819cfe47d27d596d0034cb6c500bcd9f2dd64c23b28f61acda633619aa1b52378465a6cd4f2e18a2494db09c331ed95b296c004ff6af8a6020e28080936e0bb18233dbe53a88b457761dbd22b8699d61c4d33b5317b5a6793ec279052fe41cb09888c079ae644c0d12811acb898f57ab9fec66a498f5bf0b6ce464bdfa91362f6247611e28d9fbb8c49e20e11f7ffcc0fcf323b79982aa527fa10d914427e3c9976d32852d093e8474866ccbfb9087a0a80600f35e7a61640fba8ca1b9672ed3ad0485d62623ff385037ad9b0e86900c7751461efa1d51843e7c87fb0d5a8434d179c707965e691fcbb08eb0adf6a838b61630e0ec038efd9b74dab2f18568d81f095a62216ba02a358125f61e06929ce33d1e160b96a69b94feea59fa4f60d4ddb3a9eff2fb6d68c3ba151fca142865f1beb475c2c5e34a799c663e4cfadef14d6cdb0c13b55fd439a655762711fbad346e4f242dd9b779565665b712eb9dec072afe3e58606bd26c86faf17042d8ffba979d524a245aa90dcd1d09e159a5ba95df0d296a5a83aed68adcbba4e71876bb5689d3558ed952fae5fc579d9898fed0719844477711a48a9ec2c89cc0e9d2d95905ca777842f4d68b4569a247a2c0c6bd125c11594d861b8e0b0807c91ca8aed05fcad881b50882219402dd97448a9f5ad4721cba95bcf93605f905b579c1e26b97e824ab50a56646ab14b4d0920f132d757da26ddd62a0639f71c6bda4d04ba1985998d30bc87b1c0c88ef8e7f1358190b7eed3e8d7e4b5fe45de87f69af3e64237aad39412859f826b26f7c79d10d0631308f50934e294b97e28a997fc3c29b37918e76a066639a7bbec960c82f50e6c1ec0b400c0e46b0f86341ce5ba5753a5399c8312d16b2b9f97f187b24ca437840ed944ecc88c1ce8127b5f2794bde71ad42fb0186559029d9952fbcf04a600c7e7c1367a55103c47a31bf76c733cb9f1650ce3effec9f2dde69da26c885b76dddcb00a083b09c8ec58ea03293b680265d1c5849fd0e8cec1dc301f4bcc1e872cf80cbd361900a148887f2a7b38b0f19c0feb60eedc9dc11689762af22f8f5b5d512bc8ecee12e5ba4bcb9c57b63515ce35e658bbb7cb43c9e055dafe5e37f8820d97d898b9b052a97c66816824758b270e980b6b7ca505f9c9dda484d41fd01de943175a247939a40ed9cbe9d6e02beb17ca04e325b53ce33320ec1f13bfbf162fd437a928d9d743a4d7791d62b3feafdc2e16ed094adc607a4d89f34d16ef0e410ae8d98f998bcd4733ff456143af8afb63466eaaeb861f926256745c7d63c811f9eed7c65bd54e4f89f97496588ffee5b1d3967d458f5bc983c3060fd97cb8586e922593659c792a51f2317a97ae7d438cee69c0cd39059c835db24c9437ee611c97393e47aa14fe79b3bd570b003af8bcfe5bbf201cb2b3d85fda4201a9a03b686518fc85ee31fdce358570fab20a52654c9d0bf62d8da3cc9ec308cd4dfd0a0fa249c0bd33ffd081bd52a0ea2b36f7c44b0998b90a7ec37fbd7e6a2e9428ce736175e23e8b43288a6b059e2cbd2f6a406664bba80f4f257e43edd3b1e3c5b22460e767b1d1b05e8a49b0650e1a55923d567b1b936dac159dabef2d610bfee1119820759aa9be76139d92f0e83527d824b0efa6a70ec1b3acf8ec1a1a9a7000460a48fdedee8f824a386e703eaed70db70096352a0d21aa4b337b4c02cbfe44e6a2b7b7cea954df2f5a2a39e3fb4a1137c86d05152ea5e49be758d2fb88536207fe2ccf81579cbb9d1bf9abd030bef47619f8134e4de1ff748ec9048fc65874bef4f594e8bad9b01aa82c2e789e0db63dbceeae32ac39bf49755def5692b23f5ffb013176bb9c6c532342f12afd940686728f604dfa187c77126262f2cdb9a2b91744e92208a61bcd2758fcf9d6dd0c48399a7f83c00b0e63aa1572d3e1e08f72c54cb5840aadfc48a0d8c83d17a21b51e06f58ea8f26e8386ad5d7969640c5c3804bf332d2e675b56443723488ce6e0b0a026b41a5be2760e1d9fc5f1d9365441d4a421d40de7fb7de688596d76f8045f288a48f01db7180822f340dc584f7eb0e27d5a7de4e6f9886aa36d2faf3228ad23cc02556093d5173fdba1a0d6e166cf81f3edb1cdc2a7747c06b4644db726267a7b2b8de74b0bdcd9f98ba7a19f7b072f4dfa0b8d6d7ccf880081880d9cb07ad4668d3ffde2d26db87be539e681e9055d7e0c2b6c6f3a630b37956751ac8c65681284d80a2b0cca010e1af7e500b76f867cbac90c0ea250cb5c629b1f8b165a43d1b02f32c22dfd676bd4d37aa0869ee0e89741a6bf09edbeb53560518b0a77eac3d473e935b9c74b5597a2203a78a196a64534528ff11efac9f07b093bf66e5d684a2781635f066245ac588cb0642a24409d1aa21048516309f206f80c72022ca14a59131fc8171f4b756f40cf08e9c405b75e151cd0abfc4d186d7b7b02e39e93a990bc2a293487bff966b367a7644762dc652a846699fb66254204d9e2fbac691f9f6ca4b42172a7987bed9caf0f6edd9ccdda1b5caeddfdb1bb6f3a9d02652ef9f6adf6147eb1382b6ac0539af8ec6d661b49a5c8909f8d3bd03391555dab5d86ec58c81270e966ae05692b54f9af8a2ff402bdd5903671965d42673ab81c5da58fe20e4786cbb6827e406f85b0cea82f4c1d1a5bca8d058c4183e422f3eff240ed95419237dd66e38a9c4ca08eaa84e259fe52b11f28d8449b141d42eb7a872e2f2389afde9e64f92a037f1182f5e471ea3da69eec4a530aa8ec9dccd7f053a0afffd4e3df6379f128e68f3376f170621592f41d3cf855f6bac170c54ee7a54b994d9455478b1d331a46c60f3bd4f56db89666959732a9f19ae3b2ed15c70669af24dcda05889fb185078e196a085a6d7aaa1dec92609145a71615ce591c7a7869808781f9a2b3bc88348a0a334b0090305b34d8402f02049fd8d9436116e5d46c4017763eb53ca343d87a36b188bb6ad08ba863d55107b92d42d10af8d379fea7338c1ae71ff891aed613da9472b1304ac2b20a500fdd1ae4e86577de98d7a9008f7072e7cbca3201ba1f51c649ced4038f751f197d143419f286f28dc2f5ea576f53259d4f4f4f29fd4bf21f912d92e4499943bc61fd25d5a6c76f8ed60a60eaf8a0b35d7e34fae820503480f970237cacadc0e737819221c0884d0ec4c7af98fcaab06a71f92188399b21599427074218583bf5aa5e0e99f98aa9c03fb245540e3b442f03fd660c3e6b2d4e6b1c63da3734ce4fdd9a2f90ee2bc2d6b05c2140bb960d6e6cd1506bb3a111dece91fd8248e6365d7dfe37923605055594f491d594506665798188ab044b7013ffc76a6fb4703790342a22a9b48fdca6c852accd27e19e6068816e9bd23294a97503d1706fe593a0ea73f488dccd5aca333f2401564cb96c458fe57f5abe0e4b5031a84158407e1b9b1f2b9f5404cfd61ac2c959a89c78d2946b26fa7ebbf7a227f141bd576ee3bb24a246fa9adb367e5b5b31b1db489e6098db54278c2df769349c939fc5f46b68d63181ca305d5f6959540ace190ffa21faf78874a7dc6dd88d9f910658a05841ef6d80def70c3baa21db5edcde5c9e46638e16de235cb74ad2b68dce1444ccc24cf1a27a369a0d2c4a433817490a2a07375318c8ae69d29056e613129d2c086fd58b65ff8e12ea9e5fa1ddf195878210163d7abef4b511cea13d83800eab41f2b230a249733809bc2bf54424b4aca56fc743dd9ddf01b96340b3025d61a7daf95f7b16578d20448e59af916b3a815cf808a53e1ef89a97e69dd9b88a811209e3cf2154d928fe3d0bed3db0d6f0d3d9d1478e29b45c3a0fbdc0dcd5143b5ea318ec64696d2d69fb2e2796508bb1533f349a2304063a253d21fd7e3ea2c19bf08783bda8c9ea9dfc7d1454f17ccf71e8104458c6ab612c159d8c2d687e2bbe9f7521fbfc2ef18e55bd2adab84cebc6390487a26c9b1f98a94253461eb7ce2f18770e732ed936e539509e64e78ab42b8d480d58c46d7cd3559172649c0e8acaa1d4b09cfe768b39d2ae659f4dd68660f7527ce3a849ac006cb257ae9278fef32b754f5c64caec6da85c074fc5382c41086d6e3bd1d9e5e078b0b0418f4606fbb4a3c492468072867e6a3470228dd46b368d112ece4d433c99f068db4946f9b0277c0c10567c37691cc66b37349475016d0acc464c486a0a1d574daef8ac4ac415e1fade7afb34ce710a9e00dab558e4e3981850f10aceb6d401622053cad752be29d95194de55060b2286f45a6a517a9985196be828fe40ae06d47a3da9db25b816a775a18a8deb73527bc583a4146dae55041d7f37c0b00c99f210be8982bc8e3525689dd41e9bada49fe5ce5ee1ff6da097060c904dcd13b458f3e71d6f6d2e0a1fa246a9cdd3f702fce3f736dc60e458de8ea93734a520cb4ad0cec28e12f7f4d2bd8a4ce12278ef755f40d3fb896b3400b3712fbec3e5edaee59d23719b50b485a04f7e03c8d642c4a8ac043311bdee0ea2bd1e76f2ae45e4d43431971f1eaede8314c65856f434299cd0fb970530df180a7d7e8e71b798a9bfeddaa9d8ddce85979939c083ad99c8b604aa83e16a3e057ad72120b3860215a41b6e69f1e7c58a1861fbb879a5b0edea932d4ef93bd83681cc603a4aeb43d8e8a439b150e159a13a0078272be016075306ffe0c190628f708f05a1002f7e080fa48bf658d989930b98f9f3d09216c2ae426fd7c1051b4cee687af69c5f04c768d73bb2a469aeef6d0e801caea4e8f4e27a8eab393ba5ef01a6897e6f26ef37bb5e88b685bfb4e068539253092486c2eb4db64080cb7ac32efa134ecabb86a67a615bf9357dea897a5e9ee2530085a3ed977516ee6ea2eed32348f1728b8a6dd5caf7169d5bd2e76e66fe79fdb605133ba68e32d86405a1d172f7015f95a55164cedaa0f7d641a1a24b4dae2ab1ae8553a18f6fbcf771cdfd5fe9cea5aec9945b0b4ee550d72bb27abb318ad170684823715e7bf196be7231e7226c074a6f4faf2b2053dbde6cb6cd9891e1594f58b71df6e00e0261e887dc573cfddf000b4764f7dd0ee4355db0f0aaa964b1c45b0c7ee7c48081a612504bb011f2547d56655a7fda1870cdb5a15d5814246bef3d982e259be7ba929746cb17b912c9958187171ce35d3a8eaa29d317102e7bdfde5021619ec56aac9c59a5d476371a7837fcf67ebc541862139efe7fba43c063f96672a90629f524844e85fabda965cb00b6915f4e03219a70c5a067e822387c6fea48e9d30e5c5e4a7082ffd6b2610c6510339b7d66ab7831b114eb173f54afd7a9ff1c9db033dc9e905e7dee790c4117b8d32fe6aad1c1e482b8c1e01323ac97af2792efe8260d1332a7646a93e7cd6d2d22cad0e07d7d78b4fd0fe17b23b3fbabf184be9a7b7957631615dfec7ef15c3a819d5c181cb979aa233f29cb38d137822acf24ebd65690475e2e3544116ee87d200ae0718c36f6ff9140463f1a902d354e710b979a892dba9d29a5a566d85f5a64c46316db37de905c6c61dd627a422b03f08fc34769fbd18ce7de5b7b2635232b60264898cf57aa945ea6f21bca6e5dfdbc1f7437b31b4862ec58abba2f9782fa7e9106351ced1b4d5f78bba974ff568a8dcbcc449b94d096076acd9fdfd5295889b6d12eb496136563fa66fe10469121bdc4dbc550d3e946eb4fee0f04af60c358470f41715953973345ad52a8bd347ce71e346be22fe18713df75faea02be11f34d3d7fdc1a5151ec01bf7d18a93cba273c37287b02c3f36363c2eee6b8123a89c30cd5","title":"28 实现 strStr(","link":" 之 BF&RK 篇)\n\nhttps://leetcode-cn.com/problems/implement-strstr/","question_id":28},"84":{"day":84,"pres":["滑动窗口","字符串","Hash 运算"],"tags":["字符串"],"whys":null,"difficulty":"- 简单","description":"```\n实现 strStr() 函数。\n\n给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。\n\n示例 1:\n\n输入: haystack = \"hello\", needle = \"ll\"\n输出: 2\n示例 2:\n\n输入: haystack = \"aaaaa\", needle = \"bba\"\n输出: -1\n说明:\n\n当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。\n\n对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d41898a42b9490a617222305f653595ed556d87b8217f57873e8c372d8a76a0f52312f1f85458f475f25c6c01ed76f2abe143274831f1a71a48015bbcf9e606fb514524d658bb65c94621422a5cbba421e5e75a5aabc4e2829065bba2ef30529cc9b2880b44a623376a8966c64cf0af0e2b714841707aa47c914dd82ab7604508995ee0e89b7862420bf1e4a62edad2d0a5846548e823444cfa8541f2ec846e8bdb085a3321f307bededb3088b354ad4cfe524027e067592c23e7211d00139109f0d322899b0855a0ca110772b7bba4ed31427ff7e2b415459eb1661201dabca5394168eb661b4a08c49bfd84aaff6c8e808475d444d7b3819853f492b71b5a78eb77ec7f8f5e150ec16200c26ec6ee290689487268c94baa9dc61da9a87901e5cb0a20915a0af8065bd94c2fb86d0d9edd48073b2e80fbe1764d008762aaebaabba2b8f25646ba1860a4c8da51a5ea9614a5de08d1373d5985ba2abbe97f8dd370ff7d4b6f141efcb3693948f1ff62de800878a8a45d12a0707eb07e09da6f3295c6add5336cac860fb29d2d4d8feb085c146fb26e8fe77a608a755e8036331c3c2ebe7301681028fe4c0ffeb5e54db4a18114c70c423eb488ace7bbf4cf9168dbd0c88182a8638cf47b69458c1bc1337012d18d1ceecad02f731a42cf97f420bebfe70e5e9e128e3cd8aadf9da147452546c914d55cda7393f8f597622dc99bf99c5673bd2d3f86b59b9afc5aed6490ddf00035c27f560a97927a32a3f4c13709208e0d8b52a7f2fbdb3d9dd9a190966e3f59463bb2e5f2dae75da7a1b775951d899c30e61f3c88c6f4986953fdeba1c41e58a190e8ebb60f646ce3b347d9e7dec7dffd06a8fc57eddea8f193c9889b250bf5505272a1d2ef48d8022f5582fcea6dc160b471cb074b1a86cdcd6ed38db075c7e766fd83999e08c7c38e970f04e1761f2a2154fa32748dc24fcc8a2acf590e40f81eb1a3086ead51b4f78e7e4b582f945a399cc2613dd6fa7794b22ae87116070b81c86550027240b15ce587b525f9010e2d3690ee3db4f929d255597a82945cb615d4349bf347ec7b3ddc80aa8b5bb46723e8b7889c5bfe2b693fb37829624c9c5b9641bc2acb32917521e1c7a0470d29a5901050f38acee00a664a1a4154f28798324764b7e98600e25a3f05333fd8e06eb94e68ac4be632aef3fca6f8984465b99f2ded949490178bf54afc0044f0910896458414f7dfb02a84356985347530a7bc4ce198bc9ed792136ec8f47e3c07283b1f302720303c458b33acf55951e64a822b2dba93249ca4e5a70afeb8307247553a71e31273fa63b06506c961f963f7ead8b3a1dbc49de98eadfa0220e2107011d95c844a1af233aaec1a16d7087b030003366c89e934b126fc3413756e2a68e485508e739a5b24f9a0eec13426ac8876863bb869fb33a94e6f1d48f05f21ae9b599b578ccf22303dba755cea530fedc61c5198f313287c35f9b6b5f9f595c56de556676f22d78650fb3f7c65d2b84ad94f7ddaa5ed49c13c083a5fa11e4d02d10a63e08c49da78587747e6379f366c1931da8464c52759ca417262af277eef71702872ba87b958aa286e6b3227aae6e79d198cc8da732447e4128314f1d0b3f8405afb2a2edd1f3b03247e490cb2b11a82ccdc0078420dfcb552a8d554150e3273bc87f401aacc0b19f99469d727681948c8dc27be16298304e9e877b42179063edf76b455fcc9fe675beb3f45d8e4e5a5e39e363db777ac23afd49aec545765aa5037488570cd83873b70e5f94b08d2f77cc1a2a64741e47947602956c0b6c4ae583b5220025c3e376f8a7f66a60cf514356d1cac80ce045266064898f9f6757e74c388e73faa3ac03547409d8eef9886bc8804d2d6892ec167e9709277b55e11f4e3e5acf2e7650aa95ae9c5a511ecfbf4129bbe396bcf7f87286efbedd343fff09dc619699c3f79e6b3ed9a8026fd54aa2c843d909d3b76b8b7f1d5f9294b91e815c14fe849a95e4232f09e913805d836d294c823fabbd455152ae60dce637105cee7aa7b6f639a0c256bbc6dd0c8261db324ae18c614f1f777e71e8f933c7c5008dd868ef0c6850508263203ed7c2dff806b8f7134525bcfbd8365df45e8622d42dc38d9ca3b293db8cdf81bb704a25da0f7ff05fa9176e76f05ddaf2f3d811086cb19b41d29785450c1fc8668ed71e31d4ba2a4e370d785d9e7e9b1af85a953ed464b53be549d52ec78ce247036420d4906e0fbf30e06c4b2e70bdfc582205d9e0951b56d6e6b17f563d5253b9e5474dc3d47fa6559f39dfc5a4f52283349f4bf15eb847256cbab797dec13ca610e6d63261fa612caf227fb9da7d04ebc1eae397e0de85b9131ae36ac220acc46673b9ec8af63937ae5e8ae8e3ace7bc79a453d47a357eb2b1074528c4652e1d42d2f96d4a8d40a8e7c80ce3e5f727f25af5adcce213ddb456ac2931282e90f121a0adcf0ec6cd93e25aff3dc3b474cc7d50c3336ee3bbf609acaebf14f22ac5f8e590aadf5037bf259e0a9e87e5652d95d7da1465e5b52bf10d3b0b10b0624be060e452b0d7264dc87043eb39f6fdab1812ad24bc553e7a313f5b93ca34655adb8d997a50ad4a3cdaa2d2f9febc858acbcf23ac4a07719eb4fb3096c94b011243c985155ad2ae077346c7b02452536f360771320e3a86a9cbaccfdf1db3ee8d0eab58eae0927fea0d3cdaf33fd4a185ef41423e0781759f9e9be0fc5a1714054b4edae6cbadd402a2899c920544ba73c6cd77e465c7b08453efdc1f3ee75a97a34d88df8731d7651272e45db49b4f95435ffd3b9eb1ede774bdda6b9859c998605093cd2c4306263bcb77db129ee1f64bd44705911b783c68ebd758fe6378c6c894fcd6bba16b43e303e5445d3fafffd8f42c646c99f2cddbd3b2c4304e77bd5cd56f5490602cf7e9f0f6cceda8b91703d5fceaa4d7114d84bf2f5a3fcdfa76f244455764dcdede390fd6e2382199b1e30e5b2fdae0675ffb7dadf9fa1b9a7cb8c659e7cbf16b346e1e55f3c59e7dec68ed4e1ef6cde976a0e6a7a8ba71b841a0f9171ec3df326a7dd41e3b606d46855dec0d07dca96f6bc336059c902fd00c8ab38892d962eb39f3da9892785ceb18ae49195fffe85759bcf48abe2c3cbf750ce08f1f580518aa6cb3548e71f3c744e8b7704821c11ddb280a57dfe43a5ee439d3ac7eeeda327e4ee26d8c3b60920c0b6669b44f0a8520c7d354b1eed69311b4535b648f7c010103f59049f42c8dec7ccf9f53a5ecda51ca69fd5087cce5f97c6ca61c996065b54181df565c860de8d7d4f870cd3c0b0a75194c6c7fa8e4d6409a36133ec82e2989b89e751d2251dc33225b4bad12bede65cd0202c59ceda818cfaba1e18f11a08d26dbcd783c877ec5b5de4deec9915a4d3265f7f2bbdad647ec08e69fe015874ccf6e09d810c549d3547d3b62dcfcf426dd60fac7400362f92c035503e44f513b4dc31abcca5f2cf5b4cb72cbd6051a8f86a546f2b151262cf0c60254360535f646e148edd284c98f057d3c1b57470ed55177e4a4a89ff0c35cbb44afc9e6e9fad4e6bd9f1688c9513433d774acfa2d21c0fbf778ef9e25e2ccf3bb62c31d98c263a4770031741742b354fc4663f214b77750517003e41d25728a03afa8dfc25dfd895b75b53f836eace5caed698c4cf6d8da3b90c10326ff49fac5468d228b9002fa584da76e3c5d35f9a468a0d5dd650449ee1186f77ad6d51c9525001d4976c198d60227303b61de61c348035253bb658168280eb85f6c4e7c5f647a278eb095e6362aa31f673cd3d5a1c290acad7e62c0a8380053f6f70a30187540da87e1f4dbfed17e2e59595f196b58db473b4460146b07e5be2d3241ad3e28df5ca82caad1080201a0ad24769fb828fdfee8cebbac375131120cf0f751c384e84bb3014ec998fdf56fe0eea6007850be12c5c90697fb0ca397acf898ef220ea6cc4de4e9bdf6e5a376413b086cc539c5c700f2dcef634c84efa476e826bfcd6b78f7e29e17a3ae86f4ee090d779f2c33426cb5d919cecc666ebd283ca3e90a86b0bdebf68b70ba753eb742a35b1757558d2de4c5d46c15f41171e40e9b5a3f8455ff8d1b6c3ecc89e2968bc29419fe43aa9677d23d0d760d7bf2834ca1c81cb29f81341979ef0ecc7fe811e607433987161b473ed19b9294fe3275ba3bd45113b9def9299bbd8b9e6682a0e0f749533794398032345595238ccfa9c9df953eb7b80e15bb13f57d27c2eb388d4a877c76acac934470d1749a92604eff6fcf7a34980c7140c94675c2beeb0c737c621a43b8113f102fff734408e456d86cdf74dee6ce9e25b161b63161c91e608c5fd94919cefb386ee106801ca1d942ae8deaf21d76310b1feb55730d07f5c02bd123c774e146b665f3411eab0e8e3960b2fabc62afd01378def0eccc6727ba8b2bcc5ddcd8b517cfe85b24c68356fdbf1a56a680870927f858cd730ad4f7dbe05e4b8796f7206d52c88adb23bf5f74ba0eb99e8aeef0aef7dc871c01695418650d9fee5b7c1a0f321677fba4b361003f43e2e538de985bb05d04c8f39642b509bc7770d630a69f7b6f7758cf6bf7cae52cbfcf013277d247feef1705ac3001866c531bfe60577928c9aff6fdbaf45ffb47c9fc56f7b83951662c13fbdac36aa56f58396f3d331126c689cbb3ed79c5c3281c24ee67c8f4d4f112677ec8fa14f78ddf5d60176ec29c390bfc23bc1ff7cd12f871dbe29d7e67e974b728df267b29e2d6ab17dd32b67b72febc1544591f4fb75ffb7a45484fc7b57727c41e37f01c825b506ac2f8f8f2985f7dbd89b33ca153f4f67d7b4a3576bb8bda7660cda43c62823366f4206c595006211be85395f295a37acc20285acad349fd6d8c686d47afdf3209f2b5892a273115a2227454d794dbd7b48532ae7b1007ea402138e5dc6beb1fed56457e99a04d2d85b3f16e4dbdf75741aca5824c9980869943a447e1c642e4577077ed5997cf3c42618c0041daf9d96cbdbe622c1d127573c30c62c1803ae46ebe781af28de128e180bc636bafc76e682fb15cda9804b234f04d674563d547d214615e2310af075d60b6f5e0be8e194865a5c623e6baf7123479ec372d09f30dcee660bb221744a45201c2e032d46d4bb950b9e58c4205ad83ccec57a82dad7dcbfc90f1cf5cc868f115f6290bf8bb07226deca7e4fff5943528cda4ef376ea47778a83da39f20a6b2dd10782842faf5a9ad43937a6f285f3a0ceb3537d43ab4884a5b0c55e3c46eee50871c223beb6c6ee8c82879ffdd82c0d45163fa064e8830b92adc576a9281b04a35d8eeffeecf50e908b9a1e6955db51e56f60ea4506e2e6f06d9bb1b3728735229ca0a70ac290591ddfc715e9de464e0afaadc62d6e607f601a98ad385fd15911ee4c31eaa3ba39e4249710ba0547cdfdc20b1a96914df2e9fc71f03f12107dbd7eafd3c3fa05e5084079b622550ce8291a3a23a3a924dc654657b4e8b6cd96aea326113a3f59f36882b02323770de473520673caf765973c8a97074d4389a148e886bd3cb13587412d6f173858c09d6493e6caab9816044c4de7f91a73882810d9cc76f0acf1607e90473bd5efbfc5c57bb8997ab7852a70b5de41955eb03ad61d9fc8cc6209611c0f3050cb23ada06b24fe4b1c22a155343b3d8c1eab978fd1b1e63a90e71dc42aa5db5f396ff5da88ce2d185863148918bf8ac00e1b11093a4253a2cb0e07cee30ca99ca3085b3bdd590a6e9bb53495f6ce4e550fab38ad57ad0ed7fe136edbbea69f4438fc8ff7bc9c0117b5e4bcdf798a62275fa3a5548f85d9de17fc17720ca7d23b1c0e2a0295ba9bb735bb57b78227ef7a334677caf983cb254a133d5c6e304d94fe27920168915f5389736574f90d123357f35b0bf1feb3892e1a420b426c50241740808b6db1edf1320873cb952c801f475054d99aa6f09860894adcbddf54c3284529eb1c095e02ae44991b8e140e8b5753d53ac7c7123d2b2cdbc06f9461b76527bf3426bb069305c48359d272555c2524217b306ff50be36cbc088c6e313c718f7423b51844997ed7daf67c7f40a195c7acdef97da638cfcda304b059b4199c76422f75e8e7f3a2df34e7329f8e79804f47aafc36e74488b9ac76685c35e3672508e66802b3188add26be1604e82aa2c41b0a5af799c1f3bb273fbec56eb12290c9c26524bc82b3244b3ef0ff9ce238affabe0514ca7b14674845bf2737cae31ba04fd35cd540f515a83b51ba503ecdb3a2ebb5dee517fcc0589bf93dcf4dee041ded8305cd0f73688911ce64e15c0570d7790dba7d001a2f0b42107ba1367937ebbeabcc8c79a34a51bf069b727b2835e32a7e4673d34fb9ab4d1763610b04c7cb7e3b05a6285170d6e676e17fc37e070058c445554b2ca8cf457d3d57bffbfc9965fca33169f64c8755ecb1337a13bb0c9f0ec9060904a1ee1f57afd1359dcb4aac536d7b00639580315846e28aca72c27e361b5fa113d8d3c8331f7157cf369465e7258fb2b4d03ff8b8e71b77da41f015bc5b7edbc9a168154f45d6c55a3f80bc94a06eb3dbe9831d8ef2df749124fbb24c849e9dc381efd90061c5186a73b7e1b66f4cc0aeb861f96f361945978475cc5a9eed6165ac47b6be909007e4551b6686ecb78e54835d2cfc797524b19bfe9bfba4221f1c4bd1898f352317a97ab7817a82afdf0cd0d506d34c8f76ba172cee629d21daaa3dfc2da6c2688131f348a38bbcb1e9eb06f7620ec0a5e02644b903edac7ba5c85ee342f6e3585746ed28eb6357c2cefa64d4c53d88e96399d6cdd5a9b076c45f9676b3410bd20040b9b326774fb99999fcafa476a284b2e3aa0982a267155726f7f93082e5b01bbedb9ab1fb557a4ba098aeff51e102c00e1634463e0805767a15123bac95d7484c9fed512adc67e3fc628f9317dab3e3cd3adfee0c19d24e22e09ba32f7ca47a249e5235c3125dae2b33a71576d7ea86f5e1af091f4aa48fdedee8b162a3c7e116b3f32487330c5d5e999e42b7ff3cbfc23cbba93c3b7c587cb1bf4df2f5a2a3d270fae6132cee91021a9c550eb573a766f6cc62483eb184f05b3c8ea0b7fa9ab10346e65c4b9f8134e49759f740eadf1ba6659e2aae473b38cae19b1caacb8caedd889a3093c6a2f036c49ae79a1e97f9646667eede9a020c41b9c6c53234695dfdd1092633759504c2a197c76a266f721ac69a659c394e8920912fe38e7cebcf907ccbee8399a7f8612aedb45683346d605e32dd20580e95ed707f660197074634dcee50840cffa4823ae01d4931e7bcf7c1c9f0a19972dfbafe83d3afdbeebb80cdc9a73e70e233c1922fa2e08054037402ef9df84b29b45f0986ff1ecc45eeb6bf42819aa027da25fe21caf8ac23fafa720f77c9aeb2c6c7e089f1e607aa6905a26f70c6ec50b89dcb16d55f7e88e9e9d6bc78e494e9ea898c4707c0a6bc44c99b6aa1cc97f28d1926c1e34a3812117a4109dbf6a8a8099a7181f1770b04c7a325d1f8f048c649ee542321cb7ed840fc40142fbdd27a63230264576a5d58cc32688ffce3ef8280b7024507a7080a30dd2289708c31e87f4da1c81ff253ece45483313c704ed1800ca90bc5b7086ed4c154a08b9e928305f736bb66e5afec640810c2221ad643068eed13ffe31639fc","title":"28 实现 strStr(","link":" 之 KMP 篇)\n\nhttps://leetcode-cn.com/problems/implement-strstr/","question_id":28},"85":{"day":85,"pres":["堆","排序"],"tags":["堆"],"whys":null,"difficulty":"- 中等","description":"```\n\n在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。\n\n示例 1:\n\n输入: [3,2,1,5,6,4] 和 k = 2\n输出: 5\n示例 2:\n\n输入: [3,2,3,1,2,4,5,5,6] 和 k = 4\n输出: 4\n说明:\n\n你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a33439f9240905709756ce7f7c66808b2e25e438bbe1eb009b854206a4cb13cf3cf4e62e49e134546b76e352a1ba807f0e3a76351243680d40acfe3de1e3fb1249a01597f66f479f9a00e01c9c6ce1a6246f3bf3041e8435b4a3f2e09053ab33f2e437809b349bc1f3570bd6ce670f3ae22e5efd89cf8dba458a34fc709b6765e089772270f7a08098479f0a8f3277a7637086bc3e82f7144e21722978c92d93d5459b0d1fae263dc63b0b43ec8fd93549d76c7965f852815aee014ebfbe171b646b281ac4e709be36b43e8daf2444f6638d75d26b92a7bf9d07178696b7f8bccf1a2cbd92c190c27a7003e1214475a8b015c07753bb00b216d418f552f3ec4b0eb129c6e8f12dac0a446b5c00b970a64c3da0b89ad67cb063e4909965046e8883158e2d700ada615b8d819ec44f25a5de3c0066e3049d0f7679890c00ef4cfad92ddca818e11af4a8cab7f5c67c880f1f77596aa78db5b584b0157578497368f69ff6719177d5840dc3eace7dc1f1ae430230a619fac4d38ac4840b15408d84f1d96d2abd536292d5ac9330545058880436074328502d4df3f1fa2d73ceba8e4d2b9f35e73d5ff8dc5ba5478a382a4cf391c3b8610a7c932efc1ffafe3cccf9157c0170f075b30e3639b7f1d2ebb466197a2b49acd1e8a90e3a5a59dc522c2e49373def9ba4e209d22eb5312da4f0df78cb7e81aa67c9454a356b0fffedeee061a554dd402eb014ee4943f78687028fac7bbea84052fd1085389fcd5ac7d456e3a363483269048ecba7c22f50f206d1d2adaf9eea6b9440d724447997150f220d99a200530af53b223683cc06f069dea1f03b6d6afa1edeab222a7de5bb34751392d28507b1fa871bf194a613e173d0d4eaaaf9e3b1e33255045629b47acbf7c7c70dfeb48f5308acde651deedbd0dd137b0b74a6568dca59abc0912750d78b8b400f551a9c4ad7ee019272e32dde564ee084b709d558dc3587be820b18dd7421c3626df062ee09e60688cd21bcda85d96557d5337e999522c646e12c64f88d38d6ea13444d5d214b319f7a619b32f6423f08a38fc30816b9b9f1dde107ef9c8d4b43cc67945afa7dbf97d53c70202ef392e09108f10e567c257fb59c2594694ffcb0e1cda4f5e537ebf8e4735472136060826eb1d55f1f06583e0842de05b1337322dcded40aa4e689e41e728a5ccea49693844b024ef4aebcacfb453d7c296f12046fc822d95648e33f30b21d047a4ab22fb3902a6bd66ebabba591945809fa189614a41cff09edac988fab84c22b3ade36956df416fba71e3b467d9a68811f094d25a18047c41a746adb876e162d6950dfa2245ddacd8683a782b1da6c5ab895f2fa7b7f81f1c17861d51ef53f4d082de4dcff5ccf229fe882822a80a1fda231c60a794b3eda74c8e9ede5865aa8e90890eb26af253dc649e20a43ec7b8ed930adb3168b8f006b336e6e37bbf903dcf993ec5bb2a32edd96e0dcee2e9ef6512bbd5d04f9f50a609570266dad125c353f89a5743e037d5c11c3b8115cc5b4d36c044467a458e2a0a8eb4c677b989bea9375d19ee9a103ec3319a0ba8b814970176caf98c57d4ef86ab6101039f2cee9a63003a47773f18d65f411291ca99069c4ceb34006776a19f6df5c647f7fe87e792c4dd4107fd76507cf897e7b23a22c33d1a9096dbddb65a4369bd4c4dc3fc546e8d5dc9bb96821e4fbb0199f462ba2b72ff5de0efa7ad53976f96176236b3f408bdfd1f6c48607d1091fc6df051df651f757a98f4ec45b9a1fd0e9c7b1a42abe12341c49f0906ec3f756facb96db2aeebd3945b1b152e92c6c2f08896b2fad721fda02e8d30d5b0f4ae7e07348abd9befd8482477fad2d1247d666bba454595cebc7d1630130d6f7d923a683ded01f625991bb52eb1bd6d2a40457109d5894aab6a14559d1d1761c85028c0f0599544adc25989ac04a622021199825e8bac122f330b45dd61916ddc179a00569af337503b097a898d2d41d06dd621bf4dc2af82283462baf174bc1a745cb75e7448ea1f20cc27cd2e248c066a3eb49c1db8c194e87bed710e929275da4a830ffcd5b66ff39c40441f6c5e0592c59d7427032f3ba98485ed7c2dd5c94e8a626f7812c0b986e913afe84b244cdf3ecdd83f0362bdc3f81ce532ac5ceb89b503fad261982b40ddb3292d800880da07d779282b4e4ad48f9c7ba847e41f43afa6e36bc298919982b1a8c8fa73b9674d51ac009a58e73cd94b29635b6b2a45fad1f30e06c4fbe019df8b852b5cb1115cd760796215f27fd57a7ec01d3b9e2824b43147f39bb20f0201243300e8ae41f5df3c0df1b05357ec13ca610e242d7256bb0f90fe27fb9df98903a510e0703453ca788a1bae36ac220acc0f293caae7fb259467f6a1fd8633de62fad611690aa356a621097c089e6563cbd42d2f96d4a8d45d947098de6c193b316ce241e6c43b33df062ccc942ad7845b5a120381dcb777b91413effdd95429c6354d89c1ec6cdd5baf1a59221df1cd28f248e4a8686f85be5def25463dbac4b45eaa9c309db2d7d24b9e015716e382a52d8dd0f889691d229bcb89b77311bd3d144f8e984fcc962c26f0742ff923e09a3110b1d2e45a1b3f64804e2797f3e29e0c013aad4b8a5ddc44c07792e9532bcfe99d07bfcd0dee78fdf1e8fcc7d58af236fa72343361129573006334704dfb68762529226b89813721454251bc33bcb88564abef6fdbd0cd792622a3003cc285d4122a14c8fa8e09702799ca20714effafad39b8fccaafd5e7db616d3646f560c3b01d0d5eba9ce09482c8ce1c8c90d3929c74151644da46d7827c0b7f300c5e1da1c6e9750997e8a60c19b8318f279ef278d4e1c28312444a02fd1ecf23b30bab33eb418819d96abeee83f60b51042f7764c9429c331dc32b769287432e23e57e08d057869ab8e57fe447298fd8b3cd6d3b459eb057731bc25e91a5eabfd1f126744b431d3599f9f49eb73e648b61f482fa0e395835d2e06b724a4e59441c45451ea107852ecc72c90d55d3da9d5b1962c39b703ab3434dd8b8be8ec8e39a2eea8b52a26acf1f058d8568cab6c24feb925e61fa1e405f120687a6d436dc38854e22c77aeb6af02149e32f46c006225b470876f1926e56fe5532f2477c4c0d5bf101944b9f88499f691d9936977f2b5e3ed2234ccd5202d19ebcdd579c4bbdfb43b7759eabe6920dedae7a92d2a11c5ec6a869c65bb5955a1460690b4aa320613a6635ed62dd9045527310479f0b868ac78af9fd7e3dc9ac24b388c00321d91f9fdaff4ebcdf410e045611a56dd2609b943a419f6eb892d1f359decfced0fe1f2d46f12867b5f3b7ddceccfb389c3f1ddc230ce3c78167edf057d47e5159be88c8c3a8f34a41804f4dc264f38c8b9a46ec715de4deec9915a4d360102d2bb5e42a7d888970f6014a3e82bdadde880a09b74f0687e2689d814c2e9e4efe151d7865939065436d5dee02e89063f9c2adb3a4092de324f4695882f86a546f2b1512629f5d6e6a0526160d6c2041c39e337b98be128b95ce3e70e0550603142cf0ba0c7c8db442accf60cfe80b20d1f868d9d35d1e203f1ec0cdaa5201fc3fcfab830a248632b6312cd9dc373f1d651e15033f6a6f37a532376b427e5f0517003e41d25728a06aab83b363999dc7bf1506fb7aa9b027e7ab98d9cf6686e9a226106f45f49fac5468d228b95d58a584da76e3c5d35f9a49e57308841e44ceb0163f60ad720c92077a4f91cf385f8d3d083343ab1d91552490756c5e824458e0e5e5d6b6e4f8d1991ec413f81a1e4074cc27ee7bd1205a344c16cac1e32a078380053f6f70ae0a955418b5622872b9ad28e6fb94dca28afc82a264a14a1840f9635baed9241ac3ea9ab58fd184aa4499201a5ce66d20b5d695f5ee8cebea913c5c43279756474d700b9dbb6255ea8cda8c54fa0ef52659990eea364ad22c76b1d52f6facc7daec3eea2e8d9978959a6145784e5df5c3881fd946701b27c8ab2fc81aea246e9f6beccdb7c67e7ca73422a52240fdc38d6ebf9e7a748e56d584ecec66ebd283ca3e90a8680b1966b536de6bd23284e0fd6e767c04c8ce5340fa328606496c3e2f00333fdefbd2d1f08cbec0d7673cf82507828f47c209717b98df659feb7778841ed2e803f81341979ef0ecc7fe811e2e73228b0e34f149d358a72362eb2440c5f80b1975d8aad6d5ac94c7b33a640e4d3dd24c3106d95367110b0220efe1b69df953eb26aabc409b1551dd6e04d0f8c4b23fda65978e1200585e53cf490aa7f8e9ebcd2f8c834d59ec335c63abf19766ec62e87ad240f171b0ec295d8b4f23d2a2b209a229d6ee60165c375816bff704e5f9bd9ca4a6cd8ebd552447c61dda7fa58db521bb2a43e585fc192deb731649b9126523301d6b6b413458a4e4f2c9960b2fabc62afd0164c4b54bccdb3837f0fcfaced0d4a31256d985a33142356fdbf1ed6a75080bef55858cd730ad4f7dbe43eea62a632668907488e4fc3ba7b605e7ae91a3a7f520ef7dc871c0169541c81581aa9dfef4e5af71265573d08ed88d70fbbec24b510a7e957f850eafa1abf6b1c7774f314f28bc9cf7758cf6f739ef029af2b856662d742af4ff785c8a45127fcd198dd24b2ecad4a9b300b5e30084fe0185ef6f3dccc7162b8f7bf8f436e318f5d1d7bd94741a6d6497f5779cf35528abc24ee67c8f4d4f112677ec8fe8097893a0d51755f11ccea8e7a23b95d534aa3ffa079429d7e67e974b20c8a632e0d02d24f425cf440ce77ee5891104c1a6f060eba2e70c8cdf1a27526c54e40c06c324b412942f8f8f2985f7dbd89b33d15c6b503584b4fb207bd5bda7264c9a69ec4250365b450bccca2a0151e2c53d0c424232fe8844d0e2a445e19eb487d4933faea720822b1e8eaa300d52343a110474538b6139537cf3b11511e1461c8468df97ab8484644ae9d44185d83676589489963a261a9e0a489ccc772c9c335f541c6467456a076eceb37cf3d96e5a91410c8dd496d7dba8778c82291b797ec434034fb437c1e781af288e43805d459763ffa933eec9e5178ba9d01e7e06559f095f267e7d214615ab770af82587053c1751ada39d9b44126c6f3f846a2d0edb835abfca75d4e77d21b221744a0c2b1735292d03c5c2d011e61d907508963c9e9474c69f8689fa9c4a14fcb78496431d30c2e7f5e9705bc5e02354d5190312a6b9ce5a972ce8df4f407ed45c9aa88d732da840b42c9d1a75ff8329666c063a0047397515e7875223f9b52e166c84a45e309005a5a7d16f1035bc9f97d82c072e6a14f927c78d1c84622a83cf570f0dac59dd9e8287a70ec3df812369079803b06761a41b52bbb2944793f9f22b84342193a2e80ac59b4859d5cb52adee380666f2b981607371326d1889d8091ad14b08f5402cbef0ee29a62dc50ec47a1583fdd21030bc9104fff2c95fa477195130bd2beec4d5f944ef0d1a4eb86c1958b1582b1023a3a969dc784619b7e2a081dbe9a1375f333e5cf242cce52d3f3074b07301066ecaf565953c81970e485ed2bd4cea9daa16ff60890263774a2322c0806491e6c8ab93440f5d5df1fb5f20e76940e19245b8d2f12e3bc84e11e2eff180922b8c8964bf9f226bfa9c058416fa3897189d94a7161203734e601a8438e3fc2724e60e182ebc1c68633d8d17b6ccb5e0b1af3a8cfa1d8931ecd4543a25bad4ec9a2d05453417c052fc8a80015a5f723b3f55bad65e39cbdb41a1aba3582071dd520a7fe6bc34dfa4961a4e18bd77fc37d015fdfe136edbf7a9d94c60c489dff2d51c0af89fbddf748c731213e2bf2495e3f3c217b95b7904f6861b7f592a1f95f0809d35bb0a9da827a7793d440cd3c8c682254b56610c047f028bb06e9f1c0e8a3c53956e653ae20d5b385cfa5b0392b8e7ed611a444a466c117c5140d5877da0e2ec185b0882e82c8102475d05b99aadf0891d804a96f58715dd161676d319210b7cd344841b821e4bce1f029c47c7da0f3d7b57c28922c0059a646fb07e7dac2cd04a91cd449d69771625393c26574cf559a638b90f8022317f7cd97671db18178d1283aff431625ba7a0baa187a716ab2fe5c4ad109a3a992da92e28606a87d7d9889f74a771cfde048b4a4abcaf3edd4580a9a03f391224b84b735dec610aa079e99362fb4e30a662bf97071d68f3b080eeab302ef08d6eeb1ec09acd0e4df78eb3771f6cb9b1dbe276eafaa20a19cb330a0c1849bf6e798ea643e501ce12df05b015ef7a1ae01f558ef8acb8fc84a01ff5cc58d6b06e8b46f34156bcc619856c292d8118d54ee15c585ad7790dba696c302746420d36f4643c7ef394fd83c53da31918f952ff3d2c3478fe3178730ec31cd6ea1d1b63284550c7dd583b4ce87c513998a265fc35976a7f36118a114b4b7ce1c75f3c6f31fafbf4d02bb8e6692fb31e955db9e2673153bb4ab535c5064304bcee0f4caf9835818249e3536e70166adc955f1d1ee280ca60d9541c1b5fa144909a84761f791dcf61d275ef6989aefade7abaf2a2287be6118a42c115259ec5a86c3e7e72dfce0104fdb5bea06eb3dbe9831d8ef2df749124b1b251cec5dfa3e1c5d40070b8034073b7e1b66f4c89e8b869b12a2a633edeca318902e3ed7d65e402bea8ebd234a83a5f2ac397fef3549e402cb23c3060fddec783c3ec695f1c61d1898f352317a97ab7817a82ea874fd2d6458d27df7aba5e62aa27c52ddae034ba2da6c2688131f348a38bbcb1e9f201c86e2bc0a5e02644b903edac7ba5c85ee342f6e3585746b002c163118d9caa39dfc720cba035cb9f99d9eca2359157cf23e77376ce484be3e3637c0dfecdc28ea3a43fecd0b2baa309d9884d421f6fbbbc308aaff94beacbcef2b0053217f983bfff42d121f4683c355b3e4640333e591f05a7b8a5106ab5f051629926b3873bf2883ddab3e3cd3a95ee1151c74609d1c2d32f70d9354bd3022ee9125dae2b6e8d485cca80c6dfcbcc796f4ac7c09a9b27649e89e5e917aae320965a046a56b7cd5fd9b03eafd331b8a2472a2b0129a8d904b1ef88a3d270fab05c65aa914f5bc47740ff38c420afc4340d7de5cba24775c0a983fc9af00f46af121f9fc838e49751a348e89a47eb169a79eb151163e0e19b1caacb8caeddc1d464938aa2bf73d9cfbfd40cdef2697726ee879a0e1722b9ccc52034625defdd096a727af84191f597da6a6f740530c69a659c394e8969856abf972eb9cfd5289194f0d0fdbd3c06b6af3dd25250200018b6511e8a4307f39190b90481d8b67a28ee3406f58ea8f26e8386e11c2b2e215f08384dd73e654c111a1a442a231ac9fa89f1ec4ef54913ea3e0602cc99e29a61540591ac7cb644b1be34e08559610da7685f3a8a5de310a5023926ec14ad51022c81c87d5a7de4e6f9886aa36d2fe32e50ea669f56557d93870c15dba1e990e936a7c0fd8fc78c8ea7696106e0454ae4661c7a656cceb21f428ea1a897efed97594f6e14a95fcc2e37cf8400cf9e1f99ac379511c40bf8ebc83cf43ab77ea3d2bd785465262b6c6f3a635972c13203e28c613260ec9d4b7b458c58065bfbe54cab17c139e99d000eea15d72611d245ce1f4169d1e26a66977fb3673befc8508a86c3cac2ca6b8cbf5fa2f7a16060488b0533cbcdc25cac3da786497895a5276017bc8abb1575529ab846e787a87b0830e33e6b6f546bd349042c6245ac588cb028652c48cf52eb0a4e53220cf206f8542c6956d20303561fc7170d163a7448985bbdd457b74e1845d9b0a72e18717b3e4ca79e88a9d9b7216d2ef5d7bc27e32ee13d4f23d06563c02782f671347d4d88baf2bf175ac738aaf76933f5a405e5d5a60f3ef7b18cdd1256e7fee8e5b52824963e392295bbfff41f69e879703e8a1cffaaf024284f57a3c883e0c068dc33d81b09ab5ecebf4bb4533ce963b305397954fabe914db143eda6d96c349612077d3aa70153be87eb0319ce9c87a87e406f85ede4826d1954564ff28e11ad47c2f865f3fdbf41a4d44a963ae554f998d136eff6e3caa559aa17e94b6e9b16d252000cd0368a477c6782a293c16ae32d0d3a57cea2803fbf63fed7e0180144a1b998de8aeb4cbba6f7d1e39b2d66f173a7ca7c33ae334759dce86374f10edcbac170c54ee7a54b86559b424f8b0d29217c853a37c9bb30bd844e94bc7afedb97e3b2e541825e3da167949b5ae483fcab1bb9397e09041f73aa10ec9521964ca71c15c61c116d5e6bc8dfa5feaff3fc8d368e0e775b0090285f21dc7634162dd38db417291bf4dd6540122b44e775ee06d17a3fb1d0fe7a85d2e66bcf4112be5811e45080b22df6e92bf12eb2719789e79634f09939708ec721059e958b70dc594af2a80cc78f289c357e58b8ed8b6b49f65516dd12879546da5f564a7d553b6199dff2c187ebf8416b5a4cb7070ac7ec22c30b8b1dfa5a73a17aca75ef847b48733368e18a0431fed286ad2ee2f10c60c9e2a15b02e3ddb624227828e26302ba113c90d55f2432057b2876dde730961cfa72cd27be614a06dee5a06642b965e1bc84a207d467d7aeceafa4938a22878ef48be2c9d0f3ce6ff8a8628b403ca06635ed25332daae7d13f26cbc3d53ee0ed7b3eb61745293e75a2856816756fc460b8cbf93dcdb584544cf0f9d7e2490e0ac2f3ffdb7966adf469f0951ca4f7da392246948c9af67c42b60265e68071a20b70fb127eb78a77beee495d5920e10f624a1bf440dad3b0d5928372bbde521bedef1ec6fbf9b52fee989ac2de3ebcec0bd4c16245dc7a469f013cbe1173fcd30af6073d2bff2ac03ed7a85b34e32bdc332d4ff0d3d9c0ac0d12ff0aa338797e","title":"215. 数组中的第 K 个最大元素","link":"https://leetcode-cn.com/problems/kth-largest-element-in-an-array/","question_id":215},"86":{"day":86,"pres":["堆"],"tags":["堆"],"whys":null,"difficulty":"- 简单","description":"```java\n有一堆石头,每块石头的重量都是正整数。\n\n每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:\n\n如果 x == y,那么两块石头都会被完全粉碎;\n如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。\n最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。\n\n \n\n示例:\n\n输入:[2,7,4,1,8,1]\n输出:1\n解释:\n先选出 7 和 8,得到 1,所以数组转换为 [2,4,1,1,1],\n再选出 2 和 4,得到 2,所以数组转换为 [2,1,1,1],\n接着是 2 和 1,得到 1,所以数组转换为 [1,1,1],\n最后选出 1 和 1,得到 0,最终数组转换为 [1],这就是最后剩下那块石头的重量。\n \n\n提示:\n\n1 <= stones.length <= 30\n1 <= stones[i] <= 1000\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c0a525fc6e7d305a79595c2a57b684274efbfd231c09a85de02d51d540e9801b79afd31638e22ca84d2f7afa13b9b1861d3d2a995b6d822d5664d49ec46dbf7e1c42d11bea51a00b3a26505dddff3c8e8f651eeecfb6fd9be09b4d57b650a4c8710075119c614c6af609c6279f8a454f640a2954f148ee30889a2dd5295e5107fced833388c4ae976b213552602d7615284c61e5e503659dcd726deca36d4d56761f07608c11e94861f63613528b7a2ad8d21bc4ace54b68f74a742d997eb744145498e64b7ae9b5095e10a7d2ccde56cccedd0d72ffd660727c4e5ac48ab43f0a2eafe78fa246a1b5c2c96220990e5e611ab35f8cab90981df6ceaf115169a56fed73c5550f0fa8074ece3e5d23d38d778be7c82fce6541a97aaca66d46f7c9195903b4ac16b4f81fcc40fd6a59e0d71a67084ad9e46499b0f700f7fca090e8cb92b41fb24383b45f5371c581d2dc75b59b7bf4605b4e3f534d827a90c5e61ba3452f322542b94b80af87097aba3b445578d6c37851c37228ed4860a3409297e2871cda842e78e7f75a5753fda810154c5be705858e0f72c7e5b004e1c38ce6e131eb642d3278b55862a1a58f1699c5ed2ba56356a03d727a66732508ee41a5b0e9cee19f34e1f5240660d844e17537c65d8c36e2ecc8fc781b43cc92cec236237cbc535bd7ed59fdc874ddc57c286476a66deb368564f2b0e2dd16069bc0ceea3874c9770de1cabdd3b3c65a5f79b8d488d9bb472e4e5139673eb98724633b5ae92bcad10f7e2206ab742f256405b6bbcfc7dd636d216223df62217c9d1cfd0146a24d94f22423a0bdf053dcd37d7ab090e64c722e35a43db16535a4b3faa99bd2b1bb057db11b49642a3202d064a5ce0eb5d48c731567dc53d7ccd552032ffe6da753bb4d97c8159ad0c755e55f10d41f6a03bbb0f0e23e470b240b7037c44cf5a8db8373f302cbb2678aea0e9c3b2c33a708d5e7c9f13325829a381431505be06f7ac5f41344eb8c3bb1c340d90b4e266eecd8090d092a1da01b97accd52f57d4c017af4d455efd566ac57173ebbd12baa659438d18c7d8d191588e0bfec32a12c6cc8c9f5803f46806a0c837b0c5f4fa4439a6a8d26f33596612debcb9d4a0f2e82abe015a60d2207c2cc6e22e4b9bc99c77b6e08f4f3f8b25a5416203032eceb698ff0e0149977956a7d447b4f37395f71c23e8afb91e64fa94a03fc084af1be029e639adcb2294cb177c8fe2aa797a763e27b88370e51217f80b1b88b724e8770bac7d9b9e6d6f0d7ec75dceb240edb2bd81c73d09d66c79e47f658b2ec1649484736a5377028cbc7b27c2ec84ef68c7a7dd8673aafb39b615de8d16b4aff8db8b98cd121420ad8319bdef48052a68fc08f985a3ba4a27cab8e12af8a75d090c23337f1a8482f1b3d9c0890aa0e7bd7943cfa2c12be6b67dd5ae0c90adb3468b6e804a102204724093cb56b72e74a32ecc92853a6d21202783cc898b8c1c65d21c52ddfe1b7dda0dd46753c6e7ad2b364d4766bda9cdf8e5e9c0825466e932e5ae56f35ffc5e1211538bea921f1e4181c440aa9f453987b539219422ccb1838bf64c597fb4a8f9f50ab3566690c11abe5f09e2ab5c5f47e2573c3198713fdc9b0fb7069f80d10d1270f0c187b4834b8bd158bc7dc01972f32100805c2ff155e08512aa92717ac0a1890b86c6e8a5fcdbadf8b0855ee5d98ba2adc5661a122bcbcb7b01a8a6fd9122e6593975fbde1026c59706d00daee7ff122a6684f3aed6551658d7a354b907ef4bc6881ec2384446b6678ba6e3ba94251e8765a8fac11878e9ce5704814004f203c7405b5133bab489f395d0714f1dbd86617737313a3ad8166143dc4ffaf25e350d978316ff8c2fdfcce85f859e4aef2028404dc17ee5ff00339a9b2cac68bdc104b972db1c4c954dd91a126d2f93a37967ccd6d6c9f79458e4eacc4d35514844e22f2eb88a9f753e13ee122ed5c9cf74361d7d9edbd953923eafb74aa69b229800c232598f2986f79d3408a9c8a78c1e48f71bbef508b08c8c808e9c4a57d6f8c16657864fa2bdfbc5708da4baf759f151b70ac221e8f9388bda98928565b9cc9ecc7eb2f011d4ba9d8100281079ef197bc2d3f7b0886654481ce9f58ea029c364c399a8c6cf213b26db73603148e2c0ae54bcec3502ab6e24799492add65f8b2e4bd2eb982d2fc4fa870f091296777fe28784f372f3b651f6ca01fdb9eb593158556a9f519d9b1b89de2f3a9297a65cb86627d32e116716cacbf7780b202e7a491983f881895b34cd5dde6396d3ceaf635117d9fe0e4ed94d36353ec7a4eb892433a9ccb44d663ccc8c2d32605a11c8f798e638f7840e73e8108f1efba07d915f718bb63bea604a4aca64218668a79e50a70763ed144b3051ab5d08947a96bf3fffec73ba9c86711859653440e1dfa6bfc6b24fbc0b5ba9c2ad71d31b1c9382c2ccc1aca7f6bdbfcd69b51334fcf54aab96b2534b6959382c940b2e023aa5fd15662576ce88a69c61891951930b8c535e2782534ca99812bc29049c4bdb276d65b91e214c48daa37a73972efd8b4e6186a87847f1182291f4998f2039a1273159585e068eb091bbe77453bcf79fe89a7eb32659493ad1ce9736e80ee8a3759ab05f25f2dbef3176e64d07b26e266b5237d2335021e0f1cae60325f23f3ea7dffd3ccb4bf8f3ea491b9e1fdfa4669bbd796cdae7ba108510ea07f57ca2b4316b7aced06c5fa5b6a54b4edae6cbadd405a30d09b72535aa61942d82b0e40033b0a51ba84a1f075f92b34c58db6364a7621752246da45caa02560ba86fcf700d67f13d1a6e08c9c9498055075d4cf734178969d7db129ee1f64bd44364b699d8b8fc0e975c6e62d8c3fdd00ca68e917d43e2d23540b96bfbbb1ca4c8a53d6d637d3f37777614dee60ffe756f5490602cf7e9f582487c48bc52d3f40c0b00426519a59d8ebbefccdae6f7f6e225c67cdede390fd6e23824bde032be3fca5a30a6e85e6d48fd0b0df85c2974f9e2cea54ff0fa2e516720d9cea889d91ec8134869333736e678ea5548d5164ef25a96fbd2fa7866bc9b606d42113dec888349ac2d4c8192e1c9156fd1dc8e57dde2ddf60e7e46db88c7d8fdab9c1fadc83b8a7cd249ba97981c8c3cbf750ce08acdfe31fdea6813555e70f751b1ade254a824c40d3a786ad38fe03eba75ed42bdaf1fce876a3be7f9dd8ff54749fe4388e22b5e6155868171f2fad607a3a6645b436958f5e033f3a4bdb0707427de69af37a16cdbd62b196c615218d6499d8fe618890414163051da524d871dddf7f009710e1c69ebd1ca98a8797c6196c5ae62d75e082b1ccd4c7a202c86b34d2350a868e9f6290e45797250610808e9ba6faba1e18f11a089769ef8f83e850950f12aa9becdf5af6d3750b3065f8ad2d67889471f44f156db1c2e08d810a529d6506cfa729cdd04266db0fae5c12676dd3c91e673e14b447e09963e595aef3c24c2daf61ba61108bf874547e313f1262cf0c60254360535f646e5582976a5185be5aced49e6f7ea8104753012ff3f7443cc7b402b9df3ecea3062e98a1388a831b03641c1e9be7805201fc3fcfab830a6dc032f7312dc4dc2574393551594f3763741da532376b427e5f055f457f11835960e57baadda97697d0ddbb5b12b67eb2d82ecdab98d9cf6686e9a27455663aa6d1ac5920a938c4003bc9849276a689801a9a0b8a0d77961004b4cb721c258b7640de067a65d18f7848f44a743251eb7bfa6520b321405f8376078388edc2f6baa8c7e613cb06e206503333d326f57cdb3d536f3d6c9f83ec2c0acafe056f3e70fa448f1109fc412d419db70de8fb9acda8afa191b262fd0c5176b02d49ff8d245cd5e887eadb9899aa0b9c6c1a488a4773e199dbb0bd85ebe1e97513116e935e36596b1f9dbb2b59acda8e8e0ebf1ef52645c04ebf4854de7110de867c24adc0c2b720e23c95d0549485651d6a6443f5d2811f826c705d689ae029c81dbe6d2f8276fc86e6813a25f62f32bd3446a7f1d57be5de2e26cc09c58fbbf74cebd283ca7ddfe63b5f1966fc6ca173c67d90abfc6e6061498e926511d129b240000f4076024e24f4fbd2d1b68aaac8966868e66c45968f0cf309387b84df2ec2ab623dc144cea47cbd1b43cf9cfcec86fe8c1e6c3870e6717cb408de7cf76c6fc92d5bbdbd5f4c2796aa8684f098c083257a5a567c9c33664388037345140326a2bfcdc8bc06ae73899a59e16d58d27c67aed19f9b6cbf769fa4310f5c3163ef698f63157f0f45c05f48d8be18a1e29be4baed1d02ba20fc3e8034866b64e48304b5fd0c102809a64796810c1b1ab8a1c41d14d84c3c421d5c575c1c68dff4bbce729c44a491e84fde673a9bf3b590f00cb6a196669681abd9b6aefcd9fb8d50b487ebf8022b81","title":"1046.最后一块石头的重量","link":"https://leetcode-cn.com/problems/last-stone-weight/","question_id":1127},"87":{"day":87,"pres":["堆","链表","分而治之"],"tags":["链表"],"whys":null,"difficulty":"- 分治","description":"```java\n给你一个链表数组,每个链表都已经按升序排列。\n\n请你将所有链表合并到一个升序链表中,返回合并后的链表。\n\n \n\n示例 1:\n\n输入:lists = [[1,4,5],[1,3,4],[2,6]]\n输出:[1,1,2,3,4,4,5,6]\n解释:链表数组如下:\n[\n 1->4->5,\n 1->3->4,\n 2->6\n]\n将它们合并到一个有序链表中得到。\n1->1->2->3->4->4->5->6\n示例 2:\n\n输入:lists = []\n输出:[]\n示例 3:\n\n输入:lists = [[]]\n输出:[]\n \n\n提示:\n\nk == lists.length\n0 <= k <= 10^4\n0 <= lists[i].length <= 500\n-10^4 <= lists[i][j] <= 10^4\nlists[i] 按 升序 排列\nlists[i].length 的总和不超过 10^4\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a3341809041ac4f074a7e2f1d4e6f309a0eefe389a13a7c55a83e810921b257a1dd1c11f3fc5647c87fd16a6c01ed76de97e378074213eb49a8e6cadddbbfd063b058fecb41debd4afb46266bc6e71a618f809b6b1ef4ef5b6d32ea54205bf8049f435109b080f7254a0c88279f5ca6d63f4d325521e4c86c2883209934e4eeb8cfe94e6a4558baa71e12a191ab535b3b7c13074c61a0b190bb6e12d0d78acc2b1a15f0d9faaa74d122b7be7e84e3cf5890778d8b5ec5271cb9ea02e9fbb86af458a796af066f86bd7a5ca2bd9d09186bb81be8a04ca9fc042df8bef66b7fc88fb1210837aa88457ab16b6b0d40f5d00fd996e4ec60c4026f177ed93c065f9183806eb707fe1a9792b31ce5cc45f7373caedd5ec2bac846aa53142ef7297c82ca182d9ddb72cba570067212c371fe484ae0c3286e3d46d9d76295bede0fc9e7a0a4d4c9b18613bd7e8e8b505e4ad282c7f476a2b774f26a557a275475ad9f26afa12bd31834495b4cd43eb1f6de1510e62f24044681ab501ca7484e5fe6479eddb896dabd11e382e9d38c6b27c2eaf0b2371f7572ef3da907f68f562616dc6f1b336c61e17fd198ab9463c6d86a335cd94275249c7fd6f2f6647e2c046d7e53ee9e7d1b550b543ce24547edbae709d06dea9d56daca4de9a487390d4e5c96c2fba870ceec67d5ff4ba85b9b997d919d5faad8ce0faa78955cca5b6b585ef4a506165847edc76ba687690e256a7144f65f2e5797bab9c0756f0a92b5bf93111b7269523bdb6c96e863223044d2605d78745fc0a1938ff63a31301d75ea2c4c62f279faa3903dfa427d94fe3118c99b4465b6da187f78017f313e8ea3fa635df3ba797fcde6c236827c88074859351f1e32ca6c5ae042132ee0ab9e625ed9d9d4692325ec7b198b194d81fb1686d508da860b0a52fc0530c1d2faa3694153e81bc1e350f64c6f1f6bcb0abcc59a4486ea399a00398c42b8d5e7bad6ad4992ff9648426c247aebfe5945c8f80700ec5f55e11f8a9cdbff0d7bdd95bef3854bde36060afc76c6dcbfa9546a80702dea44bd82c8766b9a75e55eeb427ed958a3b8545700059f12f9947e0f5721f99848ffe479c7fab1f16aaa5fdf19e27a8e27e9ab62125fd6c3e10e6d5ed31a678260454149386193bdb3ef7a581411230bcb24cff3da88992561bb72dfba1849c125a0ccd3a6f18a80ed14941bea94948ed3024b5720a5897859827bfc23f6b22549bf4aeffc32b85f3fc50de32937d31e1bf9482fc6fd441606e95f5675bae7d0fcecc575fbe0270cd4c96f93b67dd902e2ccd00260943095dd8dd48271ef2971e953b24a12c756d08c6d4f1decacae99b3a5d1ad8b7b26a4a0d2d8af4ffb0c1eb34d96b6afa01ed8ac99ff8d377181e126aac84e9ad9cf35457e84f367279af27665a8899fb90978f19f3dd90ed70beb65e85b266e5c810b18e0d842cc34b399772fba59c8d8e5672eecef0d50a5d615034e3cdf8eb9f3e75750fe0b06721f67e8ec2ce9631449a2c576bd134782fde61d800061527aff4459498c0f038eabd674b2b2b78808f3c03c1f4728aaf16b9a79619518622fd63239be6803445af3d8a338fb201a0a3145c3c6b9f309d198e41478508f78897cafddf484691b8f1a468d3554570e193d33d2ef1ae1b4d466245b76a2b807f5ef1467135d16b12717b700c23b21f9a970d512451e5bf7de29afdab01ceb90d122c03c3d6f35ba1da33d93f79a2e518d7b719eaaf0efbbac59ae54b1cc14e18a968f054e0ad57b6b318f02bca0e6634b8186665484cd02a5bac3246394294b0643409ed3f0f519260c7e343b772105f54b0ce823b54f270942a9dcb10a172f2e2cc4f3b32f6422ae9c8063b27fa720353a80c3a6a5e2e5844eadf0e364f52cb76cfd3c96027acfb385a29b8a7c62c77d8eba855cb6ec9748aae8517c9e198a5301c56b3fe144fc99f11765823565fab3d1bc8d17d7578b208636859e365fbbb6efdae90d4882ce14f653e462ba5f4412315b26b3f03b99463dca3ad9b2f548daba4ae46dc25beb5864a86b6849dbc87a70f124c2905a13fd4fb5735ae6def765a61488a589a5a28f0e605498f7ecc9c22f211b4692fe10138901bbdc7835803c691c865858483b43d0725e20dac6ee5b4b11ec7fdd4fd6573a73d32254bd6baaa04baf312d9b08cf40b35f94dfe1c2a1164a529ccf0fb78a9f5f26639e515510741256223e3fe519adcd8155926fb76ea72aa8caa8d1a6ebc27944369e970c2d108b714809e0851edfb2910b212f983e901494ad8e8fc255f2fe4fa1c15a5260e08acf9af6d030f04b94fcfbea7074c9f12aa95ea4a4d6a590cf2ed57f7fbe4d580772816ab27581e1d25adc578921f303adce578aecc7437d0f8110b02a2c2a25b217836d4799add769d71ec799a8cd58f0d42645b6eb0a486e61cd01ae684ea3e5fee6af69bc2f52e8c6559a9e0450c0091ef79f9f85186d66a434b4f12e115cf0bdc72c4b88f9fd6fd96eae00762e33f3cd04f948e7ba685299bd45cf276934bbdab75eb98c309d9bd3fc5e72b8e1d35fcaf634c193f9016934229bcb87866911bd3d144d8257de6439fddf783a2595896c15edf893d6f34bfee081eb37779483ad14f9e8bb758aa02c33c14fb3096cc4e519637ec07b39e479b4197b283e02086064e92559333af5fc62befc85aea5b571ac9591c88ee24074aaf3da84b219df001840f4042aca785e1ff9e1f24696f5224049a9ede039f69140763e999869495aac665bd8300c0822754309fdd1fac475a97a34d88df8731d765127394cdc59ccb7547baa9ff5f034f4774bdda6b9859c99ea4c5a21b7806f0d63eef22eb134ee5131f1086b2e119d83c68ebd758fe671c33e8947cd63ee1eb73e3023441096f6bbadca00c350d38b76d9f07c623d4cfc7b9cc65dfc630602cf7e9f0f6cce88cec5253d549de3507c59d7029fb0d7ab90cb2677105b543588beef90b12770d618a50318bee7d789176ed5b7dadf9ffcc1c89fd937d02cb811ac1488e516720dc189ecc991b58179d3812e347d28aea00fd024018160a922f87de0c31f9ef96a9d3b018dc8bc7dd796e38e776b1cdd47f11da4ac2e8a439024a2e421fad4739bb6d584a8d4dbb8aacd7ddbf4538984d2cbea4dce46a4b9851f82fa817947e7123a5e00de3b488b3611ddf4cff77df60aebba43d4689fbaa9ea69ada22bd88eea5d3ad0a8649517b5aa07582f3d0e14f60a10104c35ed62ddc0107c760a50f10d8c9bc78af1f87f1ed8a50cf2c7870837da17baddf861af904b1e411514a924c879cbdf2e418205d9d799b6189ad4e4fa8e4d6409a36133ecd5aad1d7cce7599e7a589a7b5eb3929d7aedeb519a771459cfc781c2aff65211f14122bd21ef9283935dc65b5de4deecd053a4db6a4e717dfce16435888b37b5571172c5e8bba7ab0a529d650687e2689d814c2e9e4efe15127f2ede88710c7a1afa02b8cd63f8c2aaab95232de324f4695882f86a546f2b151262cf4071255e601f4e6a2051d6c3337b98be128b95ce3e70e05506030c60e6b35f70cbef60d69e6e9fad4e6bd9f168c5d3134b6d361edda6cb1749b97e8ba5cd4f7cd232ab3160cbc74d6e133551594f3763741da532376b427e1317171d3e0dc05966e562ae96d625dfd895b75b53b673b29a27ba81b2d9cf6686e9a22610326ff49fea15239760fc41368f99da30a28e9617df5ae4291393081085cb186f25e839049b1c0d65bbcf3802a760227303ad76f0733c85344b1f88441a9ecfb896bab6a880ae5dc607e7051e2c3bcc63ba289e2248744c469f83af634499aa577a3b25b50ac10013ac22225cb5b15f8da9d399f183de89cd67b5456076b32e0cb01992cd50347c7d15340562ecb8684c4603db899ffcd5b5aec6aaec825f505d2f905c386f6a029daa3753ead88da628bf4da1695bd005e82b17de4073a7d2123ca1cc8ebf65b82b81b56b948c74466b0814a697e6509d030b2068d6ea35d21de36d35a841fcd6b78f7e60a77a07ba3801fcc38372c6c22421c041f0c495b808a496c6d43ec1fd2d5e5c24e171ef66c073a4bce474777d58dfea4b56d43ee7115a4e583e0c3373ccf2d2dca8c3a0d9907f29b46c0a9fc345d75f79378dc40492fa6c788f159be145b14015f9d1b4a9c7b8c0556b592e8d357ca908cd13a06c5eaa7e0f81b74f5c7dc8a3cdfffed193e6682a0e0f18dc602d2dd7472c45101765b6fa819dbf12a03ee8a41af5243bb72e2efa889de677956dcbdc714770521ab10d05a3fdb9faa24481d41d5af7340878e79ac737c621a43b8113f102ffa0354fc208258dc9f609a33492e5735a56773c52d4a34c89b8efdbe1f59986ee1068019b48d17fadd0e067912642b9b6f0163d9f643c28a3122c6d64146b66087c58a6f5e8eb975a7aee936ff34864e8a25e989f3072bcb2a9aaaf99f01b7cf385a33142356fdb9dec393c663fd63a85cf8262ff4f60be54f4b17f6f667c9a60c4a5bb20dfdd4ba0eb99e8aeef0aef7dc871895095498b40d3f890b0f9f8ba217648ba05635c4ffd142e538de985bb05d04c8f39642b509bc7261a741a6db2d3b133c9a4b73ffb0099f2be567f292d648d9d701486455c2a804af69b056adbc999ea24d1a658d0fe1c85ac3a29d18e3c62c13fbdac36aa56f58396f387745f76688aa66a83fb0c3ccf8716b267a54d4f112677ec8fa11252ddf598442eb8528abffa8b6ed99b7c976ecc58d66c96a270d90e789cbd18e0d02d24a90fda2b0df76fc1eb5e4f547018f61a4161d30252be81da87a9bd7d65a7a87fd426ba1f49a62a31665952801dd1be8d63a4b077c3e1603d2fa1ae438c5a84e693a90e248d16bdaa3b8843c0c9a1a3e7690caf5f1142eb2f50175a3cfe50f0f3e625bf9d715fbcc5a1bcf89dc8a2a600beb496875274d7ade1141a9826457634d0bb60987532c17a659eb8bd217769bae8fa05cf950e05aead0e9682f29da0b6df731510d156e05f4abd961b8988420c0d0d756ee47d71e0cc94f507cd8dfb16a971614537b2da7d86101acd24b1f278e8c0d61cfba3f04237482ab97c2a7b063c621d1d893a1bf909dc60320519b5d79ef55316e8fa9313b68a8e0545cb603134b3e60d75e93329364f4e152a2920035d6876de28e2c04f52b340c4ab068896989bd4c00b36df0b0f5cd8e3eb552a0c76cf841b50f88063e369788193ce49a82ff0d145527a179d027a24d52d8f84ea2ffc55488333c9a8abaef1b6","title":"23.合并 K 个排序链表","link":"https://leetcode-cn.com/problems/merge-k-sorted-lists/","question_id":23},"88":{"day":88,"pres":["排序算法","堆","哈希表"],"tags":["链表","堆"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个字符串,请将字符串里的字符按照出现的频率降序排列。\n\n示例 1:\n\n输入:\n\"tree\"\n\n输出:\n\"eert\"\n\n解释:\n'e'出现两次,'r'和't'都只出现一次。\n因此'e'必须出现在'r'和't'之前。此外,\"eetr\"也是一个有效的答案。\n示例 2:\n\n输入:\n\"cccaaa\"\n\n输出:\n\"cccaaa\"\n\n解释:\n'c'和'a'都出现三次。此外,\"aaaccc\"也是有效的答案。\n注意\"cacaca\"是不正确的,因为相同的字母必须放在一起。\n示例 3:\n\n输入:\n\"Aabb\"\n\n输出:\n\"bbAa\"\n\n解释:\n此外,\"bbaA\"也是一个有效的答案,但\"Aabb\"是不正确的。\n注意'A'和'a'被认为是两种不同的字符。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a3341809041ac4f0b4a4822046a6411b00ec8e04d3a5f386bef76b785c31ffbaefc191debdfbbf06c7fee56809762b37ee39f45511b3563498fe50d4590f8fa0d17ecd7e24c17f641a2352926505ddcdf2f86bd5dcf7b787181bf73572573fb1bb3aef78c7627a4605c5bfa2beb2798b444434f0c135914fe4419a214f926be80d522d9acc6b35c21cbf92d2f76d5d4f0fcc2a13619a7a788ae705bd08b89db3a4315f7dcede674cb69a6a23ec9ea9051807e999348842900e4ee08a9fdf077ef59fcf9c10820cf27acb76a2c39ccb4c4b906c04ddd677aeba8f7badf84db320b69cb8df961670f56cf2370491cffbf57edd4a2c83b9c25225c7c8e771b3fc68de50f946f8026d8d6b745a1cb0b923d66cecd09a2bba02e963d6b27996e57eaa21156e1de0092aa1482ea1fe451f975680f79492c0e2281c0cb4d176aed80f1d6d1d989323ad441bc0f56f2b0f890d9d99614a2029743b1d8a9fb92c70a983d80a013cdc7a5f0dbfbb95cb2a7b5357ab911464174d0ff7d9336ef29c760a24af05bf2c3e27af7ec4e5884590d2c5898ea085b1357828bd6f03f1a8ff1118468a5d7d8a474e801423d28dc5a0edaaf26873ea29a2605ffdffa63662c0a5a726ff623e1938183f0ff6de551a4ebbf4edebf0e0858e5c640d6ae8c3d3d4153a1cccf8871c1d867c3ef48af519ca17474c6611a677aa4aa7b8268f49eebfe977b201c2d571abd8934f3ca41240fb0e2e925d2c96778285c46b88d8f483b50097159683630395182090ba07f082e69889f2b780bb698c1c9d06e6d25712dd1682752931fd50d44b4529cec26ee7d479bd51932b90095cda0acfde9940da2cb515ed7b5bee0b6bcf9b46b14b49e4b6f38162627846648f7505072e2165bc752dfc7d7433a2df14fa54c974599cd17a3fecc51d3500be0137d02b5adfbe32b6a2f2bff5728a63fd0f4a2a428b22a85c06fe38536c25f23551555b3fd5462c0e6312238f8456e2d9564304372d7990a0bfd092cc59b5161590cdf4be797e0ace441dc0031c26ae5716f3fa37eb010f4a427a1264d1f3d54d678c112688f891ffc317cd9e7d4b718c55543acbae3fb4370c62104ec3d1b03168c13c26506832adc1bff4796d4c81a3d5cca939994380938012b462e880800f3dbf910f7c23caaf03477dd8f5b771ca1aa71f11368de36f445fee88fe4eee2dcd87cec2188e6afec5ea49ca5b24c699a33e811bf0adc748fe4bd7eccfc10b3500fe6ef46821d3c93bd15eb9dcad4751909d6b3c8c0554276f1cccf99647b2626d726dd3c7dfc97887507448d8c0861dccbf192a2144a780ff32bd95f45af5c9ad372cdf276396901f1c1f4efda48a54bffc28bda6dbf4518e432afcbf58b46a682df8f98413bb7af7f8bbb11bb96b133080897ab2f38f597720cf688fcc01336ac816a840da068f328aa6c4f1d55d65d02a79b5a8c5dbcfa223237b4765ae6621fefe4145cbcfe1d25503cd383b9c5f398d76ce46c65602fc08572d53f5f6dd08f4cda6c66da9cdf49e10c0b1b6ba8377109d5066cec968c01bbe1d19c4b9cd17c435564c1f306c54f30d4330879d3595c85d4efe1eaf0f48b39d0021a343048ecd5b8c329dd8ec5166f758e45957db9dcf4b24b19851646b3395c6532190d12d3c1220e097c65116474b58d07f5c5175725593a95c89a27cdaa1d7f859e039d092f6457858b0ace6432f35be5b716956b093b658562f317f0ad985a1bb812d7126c8df0dbd65e1cfa2ba749dbe2fd9268392fa7337e72dd29c0d2c3072788dd0263c978936e386ce228bb62122527f322d1c2e81b01377e3c14741d0bf54b1a5ed464c0d5e797f1dbd8a0fdaae0cdcff7958aa2c2411353fd72b720f19dfc5e092d7c81bf86eb43280ee21dfa25981bb51ed8f12c7913014700999a57ac61311bff7156338f513ed2f84c824dba9b1c89ba1086775029d8824fbca3507b1d1d45c52fc32d924e8d0008d0a16434451350898d2d41d06d9268af5098f7826e6904ffbf7cf24f390fbe323b1aea5c68cc6e836022db7f646dfbce49b0c8bee87bed714adbd121f34c9f27ae86b665ef9247310b605048d180913f4a206f70e9bf85a40c5dd5aa01ce27750479ccaac6b743ac8d1a3947d87adcd5395770bdd8ee05e47fe41df5e8f313a9dd6c802d419caf2768d95c97f308805f7d2a4252d6dd817ff876e51a47e5c9c93896dc8ab3a8f2e4dbec73b909021ffb7ef917a93c8261793619612c54e0b0ff0e50c4fbe04d898c803602f04514bb212b2550a12bdd2c3bd10c27cc3f70fa2e59f99daa706552283349a6fa41be8479028ee21d57be56994b4e2d230c7c82079cfa2785d2f399816aa499132e56823bd067ef1cef6e4b9f5c291caaf9fa799f6dffe8e8a4578b2fa9df4d3c0da15bed6f2f6509de223fe1927f6ac781ed9a1e9f4683d96a5f482b6be65cda9721609a5d0be6df57ccae5b5a1203b1b7ba70f07678fdfcda2a46528edb29382cec28b23a8dc3a8e53046f81adc5917adbb462cf231a1b3e6131f4a841a26fc1c373a5cfc5892e2d05f0e2bf8541350620d6321d1cb5c30e0cc2ec1d0c922cb4c8016f2ce6dbdb135b8461ca6b3d0bda50ad4a3cdaa642494f0e258eff3a77490e52517bb1ae7013f9af3136e65e22f5de423ec7777232e4c116064a027770b1cf4cc74f0d199b1a5d36de693a2f4dccf5d2fb7a9df84f93af50b1851fd1f00e0781759f9e9be0fc5cd381300a880ef3cb4b80e7e30c0c843524fad2954c93b19506a1c1040b886b6bc6bb77a7891deac7300761f623c09e95eccb80d59b680edf700d6340488e8edc0ce97c34b5d2780bc6e1c6bb5be669b03ee1f64bd4470043bfecc8ac2f836dbaf78c23f871ccb7fee16b2777e77580bd8faecb1a903c753c68a39c1fa60390445b775b08302a7101a61873fcd4e2f9acd9cc925065f9aa60a39468c4ed0fca3a7f58d6f2444085c67cdede390fd6e43ed1d9b1837feb8b889176ed5b7dadf9ffc938dcb8c35cb6ea61dbc0febab42724ed3ee9688c3f08944c7936c18707c90b040e7020f9764ea3bf87dab860287e243932d07c0c09f2588c2e080632079df02af44d486359f7f9e23b3a13fe4dd1a8ec8bac3ed86c5b8e5df7492e979abc8c3cbf750ce08f1f5c91fdea6813555b54a730b1cc5774b90125698a0b9b631a34fe3b343d93a95fff2ff62f9987b94c6b2557d9ece289508b5e61558353d4205ed7d10104c35ed62ddc0104d36422eb542c8dec7ccb0b33a25c9b601bc9de5133bc15393c6ab67848c0f46494b58f224ef60c9967d06a611dbde95b60bd6c6d5faa44d6409a36133ec82a4d7c989ef3c933b56fe280aaf9ecd55a5ac05db78521c9cd681e5b4ee5b5fb448169764a1c6d1ca5ddc5b11ad8db8903fa4d3265f7f2bbdad642988c763f453503685a6b48dc80a4f9d751d87ab6881810960ca1ca71b137b31ed8178187b1cbd5ce0d068eecbccba8e092de324f4695882f86a546f2b1540279c02217513251d1b6c2b5adac5715fdffb46e0d0973679e94e2c295160a3ff0c35cbb418b9ca3bcde34e399ca266919c601f3f7f50dcef89492bfc3fcfabde2079ac18f6716cf3f6041e633532160b72ace8a78f18772b023d0f553d437200810428d375b6d8a86c909695ec7103e331fed364fd8198d9cf66d5bdf06f5e756fb2cde9053d9766fa5901c0d68e7eb0918116d45ca07454d60b6e9ee1186f25e83904ce521f1dd58a6a47e31f6f3253f774f37726cc75465f921f42879fbebcf6a7a881b35d8852e2074a3377c53cfd66d66e476f3548d3c6e12410d1a20c244570e744c1545efc2c2a56bfe54ce6fc87d6f1d8b79ce73df556435ceb070fb0df245496a7c9b98f98cab314a96a527ac74c3b9fd695f5ee8cebbac32839116ec30f381c254e9ebb3d48eb8acadc43f61fbd2a43c415a8621d907824ea862a36a692a4f220ea6cc4de07dd996f47636c1ca097c71fdf0f245d729aee368f4eb1476e826bfcd6b78f7e60a77a77be340da0cf9a7bfbd62231fa1fddce8de42fbfdb98e03e90a8680b1924fc2c8b239773d4eead3b256743d4cf1645c438f54d17015d61083a33dead9792b886a28c962064f8177a97cc18975a6c7bd49e67c0e62f30ce4797e160b6475f9798b1e0c7bdce507d656b9c3035e614c01eb63e3ee36415bbe60b1f37d1aa8dfffed193e6682a0e0f7495337911dd573c170a5269e8a9d9deb61daf7b9ee119bf6c54de6160be93b7e677952b848e714f411252cf634ae7b8b9b2e705969a4f5ff0205c79abe4dc1dc621a43b8113f102b9ef2e09ca41389cc7b20fd96adaa726584f336b52cea31accfbe6dbbadf9986ee106801ca1d942ae8dee96e856318f8b0e1573096621612b812656d78142533122f11a3bbe3ea965005abc62afd01378def0eccc6387bb5b2f2d2c0cdfe4b29a0cddc73037624d3b2ed63732270927f858cd730ad4f7dbe05fcde2a2a682cd52c88adef11f5f74ba0eb99e8aebd4fbb289a3fc044d015d33f81aa9efee18ab33a5d7ffa0b763a29fe34ebd7202f3819c04aca4a91c2edee2bcd7d651b87a622989971486e25b923e50c7076d7bff7e2ca3778ecb8822e58ee18d033359ea3282111379d586f8640668b435aff51a99816a476a9741ba26fd258452b5116ab94e9f42da251ced85759cd8d098d758b674211e1fe764616dbbd59585ef98c7dc80c222365fc3041ba7faa41b30cec4d49b10bf124a7ae59e9d4070efe2f4f9ef67e977ddb5e4f91320dbf6253228c2b18d2bc99fc9709b0e11d649e42a72dee862d43404d112ca7469d92c3da687129ddae191542faa41cec76efa7acf796f54f5196edbf1040edf0a788da86a2019aac26982c104b73424ed6fdfe205aabfe1d4ac19c81d45e3b0f3905c6f495eeff6d3e641127e6e203b10307337a13f7e22d02a41640fbf7b1701443d9b0cb679ba66e41bdd05d9de8ba84c9ead8e8c0ca5d5ce6404781bf15a3864005100c6142e46f63e2cd93f323c283e618aa53684908a21b851fdea26df31c45b368757abb176a3ee9197feb73e392a0e7baaff1d37184c56ccffc217e500b2e1d045ec188e3fe9f10a3a98f1a55c67b09f55c484c19bc21b1d4cfe7b2a1c6a0b45f6456d52cca0bbcf61dac6803d3221c6b757a6cacdb614c43639491ff3684b2be72e37643b9fb779cc7d545129e36bc4c9dd02e0860943a9ee3e24dab470bb66ada3c1ca68c6e216c625a2a34d2a28c3ae00b112d00f6ac815441cec91fa36754532c0a4b0e271300e188c8a6927df4424efe10ccfe0a3fa292cf5bd067616d2010c94f5907f1942dcf42e5ef9e38c0fc2e6c33da547574ef4cf3ac434762ad211098f4550f99200fe84e19b3e6c63120e281b0937533b19a39dadd3c8ba56d94902aee27c59175d3d2035cf83af427128a310774962bf9f0b1af218c84cbc6ef6e8c290f63b26c7117e460ffa6998983299c380c58a7ecd8c29fe1bc305f0e245dbd16cbff2e6c62749a7301066e9aa027d975c2973c584893bb4eab8bf453e0608140206530775a948817c5b481e5d416190008f89f7568a228109a8338a395b07e27ab5b7a9aaeb2d4d729d5cb41b888677af0875f841aff2c9f4cd38e993c1223775c787bc521a5a13c4baa4b5522bc5526374d9457f9c5d69ee8de6fc9af589552edd3067325a1c4f0d02d48093441c01abfddc834494646780b01fdba0b39d2db10b689ab192c719f5b0a72f8bc799ea6dd095e1efb2edf1ddd15b0bf43609cb2b4970d618edda096811c17e59ff6df72cc3c0856aba611d09ebade0afc072749b6865c55202453d0bec7c97db30386a86ee437753e77c2b5c69f250313205c7f3c009fae34c2442799455dd62624688359537155f65b1d9aaebdce6b1965106a6c166d080cca832ebfa8bf730969d6e065880e4710269391ade18006aa6096bdc2548d6d1d7dd619264520ed0cd849c71146831e28d10697d444782224d4946c9d79e06c27f53f2da02c9305c48310c4235359637f79297525bd50bd12c35ac26e783c7c8f394bcb4a0d8a13b58fed756f50a1db95e49ce24afb6da0dae337ce219e27ab1474297de9b88b80966f8d5bcfde53c30306f9af61dc4288a9f03e77433bf11e1010f47012f80ba9860c94164da67ea2974f5829a3cbc9e3a73424f0c16ee46399cb987428bbc2bb7e0446b9b1dbe276eabffa4951c37b06031c45fc686284b71bf401ca1dcb4eaf50b4724be01f55a4f8acb8fc84a01ff5cc58d6f9668051ab4910ef920bd746342d9103d507e1400533982c43ee2f46532c4d4b2766a1267037b094abcc8c79a34a51bf06c937287431e72f694637cb179ab0673d63610b04c796543b588c025170d6e620a43c9763104844d85f4b1939b2c95c3b5529edb2b2de6df5b81b2fb91e87008fa24d3a1afb3bb515cfc3c7a97a53ad89351ef0296dc109e32e7a21405d55855c28e64e52e807f381dcd32780081042c38fb681632cff7123bb1377540eb31b5967ed8960cd77cc249ffd2b1dc7076305fe6853c8a21479100da80e792c199b416e6570fe2cdfb93ac88193d3c2ebfe2a7db8c4c9e97e5622aac86d6805c33cf5edfcd92d801ac43197e94b","title":"451 根据字符出现频率排序","link":"https://leetcode-cn.com/problems/sort-characters-by-frequency/comments/"},"89":{"day":89,"pres":["二分查找","堆"],"tags":null,"whys":null,"difficulty":null,"description":"```\n给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。\n请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。\n\n \n\n示例:\n\nmatrix = [\n [ 1, 5, 9],\n [10, 11, 13],\n [12, 13, 15]\n],\nk = 8,\n\n返回 13。\n \n\n提示:\n你可以假设 k 的值永远是有效的,1 ≤ k ≤ n2 。\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c3b1093584ce3c64605a7e2355b8822559eafe011808b071ec3141d560c88a224daded3538f60ea9442272fd1cbb8ab91e0a3676cde4476b5f1bb393b10bbc024d4a8f7ed6d34f8da4e3254fa1a534c7e4494babd4d14f2cfd8986fdf82aadace1a5743fb76e4a5ef731d727ba9f8286fd0c19591cd849f62dff6ae66edae5079eb4d7a65b788bb2246770cf99fcf7caa32505e6a68ba632588d9784c52b0305b0d6ebef3acc61b5bd7fcee0c91a97778d8b48843e54a2e34aa5bde676e95eb697e646629bbc6757a2bd9d09186bb81be8a04ca9fc042df8bef66b7fc88fb1418efa52670c5bcc3756491ce7924b0f1c755fb0ee03206e4280430834c2b3e90dae6ca20fdbd4af4aace1088c3867e4e509ad96a225a53d4503955141eba01f5af5d40092aa1482ea1fd649f54966e3fa106d3c76d8d44295b5d503d0e2a298f00c63101385418da9545f77fb80fed37098ba97897b0a3d3c182b84ff759fc571e97e494f113ad249edfab4600e8f523a693293efd1df642d7cda0900bd3006d191bb79b5894506db5a5b504fffa008da9bf7e439998f2771c7c5ba06d5c48dd8ce32e74426074d58e029e60d0b12bdfdec14a9644484d0e7a4e2a3e3860ce571173f2d4630f13253f0a2eb1cc97797b7872045ae4e0e48dea697e3081b6b2cb66a6fdd42718e2ef92410c45201f493afe41ebf14b23fd27c3e4d4fdebd0a2d7f91617eb00935431f36bbdcf8ca97d35778ecb0b53c4854c6a5c0097d436b3a381c8f338b8d061d720cf0c9d3e21c2cd7fafb92b86e317547579b516b348d709e3c29f75ef7bf16402d06183fde71f0c4cedbe2143c3dca24a7de5bb34751392d28507b1fa871bf194a613e173d0d4eaaaf9e3b1e33244a4f8d3ee1acae4b7f43eeeb6ff6f60aa34bf81b7d080cec1b75d74ee7847f17969e39144e08789fb7cb53cfa7ea9f9c7a96c889408be7017fb680f43f5497da586be4cc08feaa4c4a540897753d9cdc5231cadf7a8ba02afc4016072e8dd64e50047d4a9c72ecac9c24d12c0d111492cb3fb5fb2517829dfc78589477a0d4348cf079df7902e581a5bf578e5e2ef2858d8969d82b682d8c7a0b4342bf6e9844a927ca249f6e34e8c98d442c3382b8d7d202464b275021372c0a0bf61d0ef0a2f77e2b42d531c8dadaad97ae9e51f2226bdf2ce24efac08dd8c3e0c9f17dc42089e484ed4bb39cae994a4ca5de12f53a814cb11f5176fd4bff159d5328e9e25ea3f290277a69e1e9b9d71c4d32a7cdd4b1e5e3b39ceaaf20dcb47f39b94bf4542ef1da0af9c1ef068e2556ddd4c892a2148e273ea25fdb1c3fa12befe7197f78b1a2e0c487d08dbfc00e38f5f2e2aad4509f4b3fff319dd1ff877ba5a3c68c9b4a3bb7af7d88bb13908ab1330f0795af271efd946131f582cac01312ac816a8538b668f32fa84c44105afc502c84994ebd5abef524093c59077dac152cafb5182ef5e97d577a7ba294cb9dc4d09363b50b4d3a65d3c922c04316429dc57f8d1159bbffdd0389327f526ed44771778d3706879ce576b1beb48523f2c60f1e7732a9ce779b787a93335a2fc60639b75102564ef1e8b534c30f1a281b47d7f9b9ed06d08df3165c738f59a57da4daf7a64711a31e44b0355e7b0c1b193d153fb2ec9bc76b3c6174b5960bf3ec1d463e5b30b1cb8301cc8b39b8743a0081272c797e85943dcf6814f259dbbb069c681c37689e53fe06f3afac4e11be1138b7d58dd0ccd54000f8369349c1c4f5b460391296315a4dd006cadfeb0626a4da0167c49119cf11452a7399254d2f4f5bb0d2e2e51b3b327c123777190cfd562eeb038e4d04014d84d9b20304242a20c6c3882d493ead84a660be5fa9320b38a5e6afb4cbebbb42a0cfe461ed015bfa9247945d04e3e3e0bbf3f5710b9949ebd7a713e2e3f5379abd2851cf4aa72d7bc90062ed31a08fbb6f54cc597b9ad7e9c2cb2cbe31b85ddf3bc6f3323bdebba79cc44f16ac8946fe109e5cc000604488b5ea6429bb48ebfcaf22bbe8e129bf820b935ca4eb6f93dce23d72e07552112fc149be923e54dd39cb4cd66b3439e53d54d5bfd5e3a9ce555c1ffac69caade7a693c15cae0506d8040e2fbe8fd047e033aec3a67dbaa9107bd043050c6c5744a26cc7fe854d6720e70ea0959ba42a98a6967e1cb04e75b4eb7789ce1d4c39935496ab5208d2e8b98422b7c815f7d397a2a4a233227e72d96c7814c9157906cac2da4cb9adf92f3c36d4c368a810122018b4d4c0ad9b11dfe807d8faee2ea05ee78bffc10d2bb5098a841e59f7e1934c5f695af9e8d3c56841670faf66676f0c429835ba98fc1a7befb21e6707fbd405e177e64dc1fc82a790ecc3ac579a365e16346804a7a3be8f0e3689b67ffbcbec733866ea48c523b1ba856a3221d6509de3475f0a92567c280f88747c93a9c857707723c37f95bcd98212e8d543099d11d9ce95270380b1a4f64a53384fe15195cc199c4187587e2fa6cf342ad3b472d1ce8cf16fb4ac3a6685da5bd61ece9ca84735edc30b5ea6e8bd5b3c139dc2d2479c1cbc527c1acd1e2fba2e50046878c5012aa0f176f865de76f942809f66911f90cd5913513111017c5480a0818c8e2285027c8037b489e0105d4de7fcf7c95c45127ddebaf29b3d21fe57cdef7ccd9c4ed94f235ecf7f0fc6233b470016e385641fb484c2d0f2a6a91aa3717474b759f3da0b4846ca9ec72f7d3c15320038d0c03f287d3192b17e2737dfaeef8351188bcc86cddd027da8cc8e8b0c2a13a7b572aed24b3834c4e58d1375c505c781e9002d5ad1c38ac9ef8a7529b241fd0e3f5c0d1dcc851043c97c26a4530f3e529f46de35225e916395c368efecec6e921dfb52d8363d941cd7df35df06864735b5182fbe3e78242c053c0d152bfb832e3c09a22d34509ce7880b1960ade03cbf5654d7e6beaf3bd084bfcb88f1e95777a67675a61c4bb8c97e5a35567263061ab8d198350cba2394b3b1fbeab510d1f4f2e39362e0c18e5589465916fa0667fb8b58035675c67543b22ee3c67a1dd9c02c2e99921dd8a58966fd924ea3b29ae5927c06ce793517418aa270a0c6df494b857ea5dd8784bb9468d1ac8502bf14418f5625a41386c4c56711d59b8322e950e7c057757957ea6356d69da761144b1d228938b96c11fb1bc2cd889503d7863b853a92c2ec31c98552b7202e22969fe423d3fc2cd417c885d891921affcf394e2c35189ffb5eff279e21e60b210fae9825aea71186f7d7428b692064a8d427442d8d248be7b5d0a980471a99cf291d80db458ac361ab7c600de3c51715173f4ceb5c399556a42f7293ebfcfa3d4d7ccb405df2e14de2b1bb393dc7fa3e0169768490b9a9fc581b7fb4a4ab84205855ce7dad7c70d954152eb8ee2d045ed902809367bb2e032389f866fb54b0079c5c2ca8081ceca37a19e2724e51847e49f5ad572d1c884ad1541f3c389d02ce72401e9e581a9efc05de27f8832c1e94663e692c4b4dd8ddb0b94ea25002f0611306ed13c3b281a98768d305d4f92b66fe1ce9df24a89f20cf04d168c42226edce21b258df1ad557cd7d1c33655547b2c9a8e68f9770545a29542a93af88c701acce7d48ff59dd7baaac3896092abaec6f49a95b8c4a4e71dcb8468987548729f1b403870d7d573c31a5c9a666f034f00fa2a2f0a97d4a9e33d230c9cee73e029a3b43a101fe165007fc553ac34e3c54c5009d7a5186425f9132e961c95c9330986bea7236d264dbf377eb2f304efa1118dcede66072a02301f06471bec4cc92780be9afd2bfb7d883aaac2e2aff10b460fff821429c0baf2b64ff209f4fb39a8e6dc6962803d0f103953185c6523bc79cddaff76989b7570b7913a3d000e1b9887b700f80304070bf3b1714c3bf5adc3bef49775d695e90795961c6e4e0c67c1d90b571e2f9f79e510ad90098e04cb9275a5fd4e22b9d3794f367de667ef015b9a1a6584daffc85d307808d954c2b8c2d15304ca42d647a5cd1fa36c75713aeaa43fe077a5380aae87d73a780bcd7440ed1a486e55a3445d4b69a35434d2ce879338e90ce63fe313751efd9b8826ac961ed53ddb3ebffc81afbbc69dba166466140d7dec9bca683aac6007dac113d509fed332178e37fa2131cb155242b43dbcce530575235b5244a5aef7e648b5e41dc023f331d09224b6f32b64b1dfc14e6c636e3b790321d7a3c7b7e151abf48422a7addde496b06c3f393e3ec76bb41c4d932e86d505a4eb5f2b5a72f751b23b48fcccdaa3c623cbfb2323357a61a4036783d104c3998e4d7753b705810611abd544963b38f6c14c81aa463f7a9605ee1a00e0ae95b689eb1223db4e024b147d4fb3acef6b7b16d213df7ea0d3fc6c962f5cf4ade15a3cda3a5b47ed4621242a192a6b0c7b43bef5aceedb4a7bf98f72f0154a85a75a98966b61babda28eccc9b95872a5ccf33e54637b8ae9e3642258379b55af44488964e8d178b90830b28aacb45fe90c2a77b56331f22e223845674c9729f27cb95eb552f779d3221b594418674cb8b8c9168fafafc54cb1e8fb3c2c1808c078f14684daeec80300c1fef7ec9973005bb0376679d53e94634d358d8fb9bdda600dd4d324dc93b62c4abade403eccc390ff2a576ca44c709b4043f5bf1a2ad0de68fa2304f32eec31190c356eb4db91e6583a920326cdf4394d8c46c047eed2d4a2c82b0e2f8be7603324e4e923fa4c450e1ba00713d54fea2f8d79937323db348cb44862aa4015a39e31990fc6f23ee6535490dd1c302c98687f1b8b242a3c0ddbb4ad71f6e74bd87e8f46a96114ac89f79b1f20ab449496c2dd6e7204cdae082e49feac1fcd7ced9fbe754b1bdb9958e2b60e4ccaddabb4d1ac4db9196878b47078670f315ab37f4be4078b9d555eb5e5b2b3f392c3a6aa009bab97af5176fb9725dbc00eb83b90ff958730937137c264559c85b22d7b43bdebe20ec9970e359dac1a8483c4b8a18be6b093fe959756d9488ea2199f804032190f4063ea4e70e1ef92f41bc08fde1faf4b45440e8f169c10ddae65f12e7c76abcb7bad086e21c2faedbb12ecdbfad8f1210d1526a98036c976cefff1cc520f522ecad7aad1f048977b4a586a803d20b91556f3cf2aacb1efe6e788ae0360035f5274d701c80d87f51b9c6c00e7311c7f6d7b5283d96a474e40b092cb0668140bb59c7a0cc9d93af9fa9d102922d931ea9fec28087eafbf432f309c0a934bb3039f1477fe8d02684e2633296d9694df69d4669387881778815441cdd433a17e635038064923251804c588ffad936bebc0c11718fef50a2aa29fdf66d175746c362bcb53798422f589458b78a7f13c9c5ae6a4af6498e8ef661bfdcf177412cc0c425410553ebc2e1ec48a96092358bbe58daa6819123fcf30921e8020eeea4902f760a939885eff9f892f387aa9f51907853f27749734fafc8ca425aca581c8a35569dfe2f35accd6c325e3988be73825ac4cde0e5039236c464e2e2bfbc530600027de2e78ffd5ffde273f4ec0d26a32fe3df911318aa48a126b97e60e06b49b1f0395fff8db92ce6920ac0e7607373fd1fe98cc391b9bf20eedb83c4587263e58b0fd618dfe607f363a3637960fb07c1a97ad7358c242ef31bb20d81a7849af8ac67dcba89c41d40e6fb3e1b656196d7bef82f29865d9221750561d68b7253fb21ef53a2f9cbdc7303d2a0681bb9d8fc805f25f4f45fcdeb381eedae16050fbb90a26c9140967c080b545d8cce46774a24c3e5ccbddf772a84d8b17af5938a6fe18574259e5c8435d0fbccd53172107561afc30b5e2d96450d64d26661a8f71d288c63b1ee093e8abd703634812b07eaf3e6fb36ffbc6b0b26716010ba5c0b3827655224d1b789854afcf57aedc53d7ebf342b79c82f83ec1fc1e56154f91c8cceb90e6cc809be82f4fe63d2d4fbd9eb7182cb62fc5d382ea0f2f685e12db29d459216e9136eddbf01492ece8ec32fe5fa76e9a913ac0b0168e7054c6bfc39431624ebe73c96ce250ace414a254a75d4b9717b4e3a60f13317bb9fc599c0e9e2fe547a8d1a256a5343859a4ed01ce781d1bb0e2ad661c7d050a67e033b46a427fec5cc570ae67f6e7dcba686d474000cc61cd661acb63caa74a698a3dce5e433f80aedb8d2d8acff96da6f337b92e12ba173c67ab7e6717e997b50b0f55182ad0de3718e930db765f3e93a86b27995d1c6fb9754061b16a1ed06311833b051e624ab50d37c0e37ba542871dcb10f559a53f5caa4b3bcbf8e5fce197b707f5801998be3d8542fd000ae29442ce12032d8b32d544e1271667cf040dd1600e1a540b03412ae4752437d5d8ee81c937f74a18f106da72083522e33a68081e8200c1e2153d636b042e81c31a7851ef671f7098a974c36ed270015943e95e1e0528e98a49207434e7f7fccd24aee4747bb01edc77a5ff68755a7c9c36db5e91879e122bb3c4e2d961d3825fb797bcfdcdda291c8fda0babce05ee6eb886a79835c6572020be80deda478350ed6ae6213b3d21f27a480ba5a408864bac7ab5bc561965e5e095fd4270c79a34f1dde4ab23742e39b94b577cb305a4752adb427b4492e1efd40f7fb8c5e8c2737a3aa6ec696813e83cf8edf7dd3c4cf27e950241a5f8108367625504e96497f4ef66343967d4b4402cfe796460be8bd7a3c9fa2259365bcaa38f352c18a9bf333bbf121e1aa42df40dc825c038e9432c8d0df15eb9c548cf73a6df68cc70a71aead3c7a194b503c9653494f0fb465f930ce2acbd19689b53b1187bf892ee5aef51c7d6191e3ff028a16988e32cca8589d9c59b05ad20e502df0816ce6361cecc0c1331deedc2dbafb56d8884b2afef5d82f022111f72bbac2ba085b005e983d3fbb8553a49ac9988f145aa65893e576109771e4e7f7b171014aee1de133db5ed512ad368e33aed3b5b8979755f6dff2540d58122c2f11d5c148bab6cf1c833dcf071be09ef7974e241b130644371666a99b060a48fdedea1be24ab82e803b8e928bd33127465abc922d1931389f30794832b0c014d7cbed41fb5b0f6aad22bd0e6132cee910248d94c05b5758d0599a01d2b51c4ea8440168efd9dfac7b1460ab5194bc4ab34e4de1ff748ec9a52bb2cd33eae7f7e54b582f469c4bf8ca3dd99811a93c6a2a2739098fd9d529bf9612f2af2d5f97c7b14daa9b05c40695bfbd14467677af65cb9e2c295186938524b8fe76582391ac872842fe3d22efee59d6dd0c48399a7f8750dbdb456a91e2d201e18aa0052cb1140b6c2cbcb0d471014bc8c41fc994c470f5ea6052768f7f9784e0c5c3850d7722c23421a11592a6a1ac2a7b2eac64ef54913b7144f44cc91f3cf2f260283e627de27ebfb69cca9592024b0410a76c41cca19b74b543e954fda522877a1c81d0a3cb6a7b48831ed3862ed2a50d65eb77f0860de94436d92f9c390e336c790e1f786c18efc27344ba2495eb96e1b1137218b811907dbe9fa90e6b68226022c51fb02e62e3dc0ae568e9f4893a877a727cc3ab8aeda13b866e57fb3cfaa511431422b64227b370b3b993e03a9852c281284d8436d0cc24c4f4ea5ac58e409c332fd9d440ebe50877f62c95adf43080dd1ac3f2adb64996766898d048ad5caa1ba9e6b91bf44aceab7297a66d2340cb6f1811ee97cbbcb4b3d93bf2c3216f589ae5f211b83cf0bef9dae32187bee2b56615a66da445f171f3ee119d8e2613d1117e05caf064e40760df216f80d14332ca14a0e5b5684521f05696909d412bdd84cf20d5105d0ebd60418717b7d03e9cddca994fe652072adecad27e133a76f476ad420648827c7b363304f5686f6fbba235ad631b1dd6933f5f96caa9bf55b639ed4d9934656b3b0f2aaa706389714392fab99e2e6146eb43c672f9b01e8f4ec202f5f40bee2cdb58d3b9975915d1ee44089eb10825377e063e051782b49b4f79148bd46bdde90276abc0f07336faf1e0ea8cef40855c79aade5370474afede4df054c1d15049f07d671c738163ee9e9a046a4994b9777b562fe8694f657412752059f2a80c34b288601860f1b0c846597063333d7dd83894ef024175575cda848bb03be433c259c9a81474a133334b20fcbc9f2d82521bbe446ec625fcaf51e9ccbca5a7cd5ce3594707f69d603f16263e24bca45a98f44f4a2fe8653f2ab0d6dfff0d331b2c93faab69fb1bfa9488b5a396efb385dd8460d356b8d79dde0d1a3f3c43cd95b01e412e161a1b703cbd6f1aeb489e0e4f6ff342e74be6682b1c68856c081a736a1bbfbfe13210ad2adb63260c78588f0aa7fefee02d51537ffcef469d8d2a527881d5be9e0a13b61a7b2ea7f73bf6ce76cdf100f1a74db4015fc2a8355ecdd024106d91e27489518a0ce86e7c734a6f2153042e3f17da1dfbc318a993d864b0f172e5128619bceffcccfb7b2512e5727c95f495868f143c117d671e5a10cd65caa28dc32cfe2c8259c8f0b35f3b9f8e167726bfaef691d20c8870ea3aa65684271bb405fe7197fdff33f573b7611161bace24cee149514e38f5cfde7c183fcfd0968cdfa726502020ff35fd7a8faafb688890fbe82ddb7ece4edf2ff60f3ac6e8b453aa0613fec2e0e21a6cdd3363fceded53dc1ff7625ab1940263b46b56affafbd3dcb03d8d895ce0d3c5a0419eeb389d1304f11a04b1c56ba930920b9733f51e2d7b27a39080f545fa94b0aef2882756e853481d03dd4a1264284337ca6d4bda466fa819d9a4390636b6e75144ba55a549af46417fb0388f7d2af8fea9591b236dabc0d939f60d609d5a259fbc839d2d1fac62ef31b13c9ae268363f3f827229b67e9755e40b3bbfe95dd08538e36d15f61f0e229a133f5d72a68495400caa667a04763b398f5e99cfe8a0db9a46fca287247a06962d53615345688ef66cbf47ad8391b4abbfc2bad1286114f8d58cbc3786e8a1d3a950286e2ddc02416e9b802f8b2195f50c0e6ddccd59bd0b1a9cf85d1cf0c6ee4","title":"378. 有序矩阵中第 K 小的元素","link":"https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/","question_id":378},"90":{"day":90,"pres":["堆","贪心"],"tags":["堆","贪心"],"whys":null,"difficulty":"- 中等","description":"在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。\n\n请你重新排列这些条形码,使其中两个相邻的条形码 不能 相等。 你可以返回任何满足该要求的答案,此题保证存在答案。\n\n \n\n示例 1:\n\n输入:[1,1,1,2,2,2]\n输出:[2,1,2,1,2,1]\n示例 2:\n\n输入:[1,1,1,1,2,2,3,3]\n输出:[1,3,1,3,2,1,2,1]\n \n\n提示:\n\n1 <= barcodes.length <= 10000\n1 <= barcodes[i] <= 10000","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c1bd23f07d6231746d59590f54a19b245fe7f8390508b05be10a76d05bdb801b79acff2039f736a84d2f7add1bb9968e18342399636081e50f5dbaf8fa3a17ecd9e1895ed2d3688e6f77660886c1a56322f6dba7d3ef82a56cbba2f03e529ce4bc871aaa14a4f1cbfa2be2278d9d47516d0c345614fe45229849b97cee1b589011661831b3fa4330c1e58f3f1c0e324a33e48c68440b779422f59092dd3e1d4cb092f3e272cb6fbbb57686f0d319917485c95d98251ba7e80ab7bff170e85eb29dbf06618ebc6d40e9d2e4053141729a50ae759ffd100cf68ec989ca18e5db418cdd63661a41cc377c491fdeb551f2d58af331902f216d628d633d3df0adea15b96da700dadba14db1e1089b0265f3c70b89ad67c9063e4909965167e8913458d8d201909f30ac1a9b1ea575918f7628c7d55746bd41e19482d703d5efacb3d1ca9e8010bb5c8fbb47524de183f0e875859978dc765a7b0e5f718c94279cac11f119177a5a64f83fb0eadc1e26e8371b0a4fbba56c15a1756eb24c041e330afc9684487dee525a847a342b609a2c404750328f2ed7d03a149dc1d37ad1a4d3e6a968c6027e2627e45903e9a2e95398a1b928c5117cf977792f225f7e53f823e1938d85fef46ef49b6e0f2e9164be2b3f59d0fd42cfa68b0515adc5ea8a500a71ffe664d0f08e3f36c3bbfc74c97b3366418a65f52239cf5a644143d2b70a15594b83e0bd2c3886a9bfb7e0e09b675f6c5e381314f7dec2184450e43d442f613c93596792f28d90721cdd0c3d67140ac9444a026ff2b8b1c9e74fe5f6fe22d54bf4abf87ae0b52d76f39a60ed4b7da8c81d7e7518602339a87672e8e447f3f94728bcd7ac6f308c7b11469afa93889a3809f6504170af94a61b980b2f5f89eda270dd7ff6229a1571c2326f08d55497f239848ee136520c5defa0e9b84f92a613e6417f4e3ab57496c8ad5a84d02d9223063fb0341d4d9dfcae6684121fd2456414955e167372d6fb4b8f1fb6ce78dce5f85424c0984f2d677e14c666a5d38464a00d585222f0bf3adda715872f7f01fabe23fd3d8f6988811eff2671e3dcd79536c64c49ad9bcbf86366c5341ded072b093a8c18c36fc242d656f95e45b6fbc81a3b5edfbd97af280b2d142f481c6d523fbe9bff794e1ffdd0f25ce8164d365650fda43da32e3a8729bf1bc06404260d2d557cb64e42d3f0ce816ad6c48cf10173fc8105995cbd33f93223d647aea721f5371caaa571e0af9b56324780b0aa88667740ecc19df4d780ea9889d233aff66753d752810b39b8b02896b8e745cc1f3faed08cc2b071d51c72c750b17910ce72f38f52481ef9bbaf8f9ea7e79588622ca6aefdd6a675f53a00b1578bb7938612cf8c95ef99395da9e83687ca63a7d6c90b474a98fc5a009cfb7965a8a6929c0179cf973dd623dd30c76af04f265852821c17efe565c115a3934d0654e9641dbf7d72bacd7f2e99be7d15335ef3dee5e694fec71ca64d280033a9ef439c5a701fac830e854c078f8a8234eb5962182ef5072769fb6f0ecdc5e121d0accbf237939c20561615fb8e5ff32868e3424e7da30a6def5d5828758a888c5da41147653e1ba8f8dc9f0295c4dc7d2761d218af14f7cb9114e71aa4314494025e451c182f03d1ec18eb98d065157c76a1ae05e2e01456135b19a5c89a27cfb42370b99b03aa1c2f6757898309cd4811f364f5b52588643e1a6ab47ef40af0a3a95118a22a388ffd8cfcc7d66607fa1ea249c3dcffb6643926aa325d46d013fedfea2b289ac50263fe9723c2fddc4f28bd5d1a392a1c88b39ccd71442610413b107532971f3f894e902ab0838e348feb1b5e5320439cd133e3d276f6b9eb3b9e37cc22485fae83c1a98b86aa05f2de8625ce66d743924dad5d2ed8eed9a9fbd36ae529e62d7fc54ef291b32e3f5150638917884a08ed483fe554f79ec7ba905cb12ac0d73e5e11de34dfeb0eeff0702b4b6fd21e055206c8fe6e13993d820bc66ed9bcc3355761bbfa66d865794ffe3e351eab356380669e3371b21a2838af8706fec8e5c251ed710e92c220ca439e19aed2f875ddac136d09645612d386da7a38683d38a6eaeadd04149bfe7ab32737136ac3b682ef10f6c21347289c72989c7a037ef4e1ea18ab1ea345b0e4f318b89144833b409aea2d76c31f80dd57a9162f781a04ddca853a8d43e4076fadb3ff269ed59199a8f2e489a920b914724fb01b815efd65f3343c635c3b0a48b4beb44b54dab2fe1cdfd0cc2b5d8d4564e968647719f572ac797ed60c68d23c65a26959aa94fc575152207006f3b415fb8432119ee45b0ee513c7614d22366802ad14c4fc62b295efd547ff0599136e16c2719131ae36ea6d58cc076021b1b5e1789b22abe8f1cf2fc860ed9a4e6065ed12ae6f5c315b976c78e1d46e60c39afc910fc86599df36196e3235af51d2c23c3ddf542f8b9a03a3fc3f1f544289babe64dd6b74a3bd8977030b82ca496d52836ff76893c3ebaa654ee30d8e5143e3a10335a714e0faae3d114fd6506ba7095655058f1dc6ead956246db70613582b43372198cb4160a1d961ce969070900c991eb59213dfb93ca34655adb8d9deeb5ed4ea89f2643994e0f97286bcf23ac4a07719eb18fb4020d1b0537f668d281cf76fe87e34727b134c256d844a325f73a6a831b690ccfdf1db77a684eaf3c7fc5a73febdd3d4b83da54f540cfc0d26ca2b521ab6a7fa0fd8a121115ae4a2e220b2d45b004899d4201a0eff68179d7e4b5c28340c57b285b6bd0ee03e6cd38685730076176e395adc17b4f95435ffd3b9eb1ede774bdde4f8d7dfd6c2405a0e908b734368c1b760b17aab5c2bf3006b2e119d83c68ebd758fe6378c6c890ccb78f44abb6c2373015f9ef9f2e399188603c4972ddbe177776743a22fdd8b1fa71a520bcf739f1e65d5a2cec5256f11cee34d7c1492509bbaf6b28be23d2a145d086f9ea8a0dfb32a2f8208911f2be3b9afad502b81bf899adcb3ddc9c28c689e3de34fd525a2e516720d9ca3c6c991b58160c0c36a3e717d8cbd19d644098071a129f47df4d262c9a806c4617fdec0d03484c28dc1332e1c9156fd1dc8b52cd0629926a2b665ae942193c8f69f82d4dbb8aacd7d92b25381c8c382b150c64bbea0874b9bf48f7210b307741b0dc439408b1c0fdde4c6dd7df60aebba43d43adaeefcb827adee3a88c2f91232c3a17a9d5bf0a55a167134592fed203a104c35ed6280ea3a103f59049f42c8de8e8ab0bb6a0793b701a89f8f4f729317c69d8135c1df0f5b49051da5249c34d99e61028b00d7c1aaba1d86c4c5ad8e506459f26f63a3ceae909292cd7bd26b589b665efdc78373b9b805d43b44189c99cec8bfe90532f11a08977cc5cfa9d31d8671779487b8d15aead345103b6ea7874e69c88775e255187182c2a3c1c059019d1649cbb73cd4ce0234b44efe15547a20ddc066087f46e606aede268783b4f9c14d68b02ca72c14c4f46a162e79565d268a5f7a252f29000b1f275adaea215195a012e7dc9d6a0ba91b527e4b4aa3ff0c35cbb44afcdd21cae31a2e8bf175c5b05c1e23625bc9efc21353bf708beed0030e8632b6312cd9dc672613285122473a35781dee3b372d0d2c5f4e1b0068419b1928e375afc3a8608dd6dce31e1ee57bbbe70de7ab98d9cf6686e9ea6351623efad7e915389b6ee0083a86aeda76e3c5d35f9a1be1690ed64d44e59c326f25e839049b1c5018d9867447a728385903eb37bb3674c0750f11c60114c6cfee96eba7e0c4f20dd95ce30c5f636bcf22b27a97445a6f66469f83af634499aa05696f6de749977e5efc2c6c19ede544a7a9d399b090a7daa677a5400418b866069adf245496a7c9b98f98cafe449b6f1a4fd66d20b5d695f5ee8cebbac37513116ec30f6e0e294e83ec7e01a49093cd52ee43e92c4ad517eb325c962510f4867c73e5898ef220ea6cc4de07dddf760763795df8959a35d946705d689aa366864eea6d6e826bfc9ff18f2872a76477f96b4ee6cf967be6992931c40dccd895a46ea3de83c23398fe7a0b1424ed78ad23dc61dde7873b25340c869b1e13817bfb0f5246142f417d6cd0ba8281f38da8c0d53b61d26c079f8f57d909387b84df2edbbc6c2e8f0b9bf033f85b04d6cea1e28fbbc04e7e6438847934b8088b5bff3a32ee2d4ae6f40b527cd180d6d5fed193e6682a5c4a20c0613743d94d3a6f041268ccd0ffed89538834c4a4419b1551dd6e6daad8b7a53bd478d78e0200504e1dac2c04e7e393e2b24789875e0c94675c2beee68274926ef627c85da51cfff2394890522c86cff76be37bd1e462534976401797f703dba4a695b5eb9f86ac513a428559d179e1def40bd76310b1feb55779c3315950e7577e28206b26270f2858a4e4e4e3df457bb5c669b25479d9aa5cd7ec387bb5b2f2808599b6542ef38dea7f1635218ebca570684a31c03ccac89263a4657dbe05a1f42a2a682cd52c88eefd6ebba30ef290d7bde39201e466e271c0169541c81581faccb7f3f2a7752e2aeb1e734546e86e6f1adff5ccf551dc4cc67730354e9b9726541b4f28bc9cf7758cf6f933fc52c3bda547687b2404e9e23d188606137fce1e8b9b1f6accc381f47edab109aefe0185ef6f7b83951662c13fedfd38fa03a6cb9ea8907e47683c9ba67093fb013b9ae84ee67c8f4d4f112621a9ccf5002ac1bcd61030b800cfbea4f53b8bd57cd12f871de9619eaa3b97437099a861a98a682cfd2599015cbe2fb0eb544591f4b530a7e3a44984975772487619cc3400d82ea55be526ebda64948adbc59b63d2176b4a37c2bda85b3bf999dd295cd24add022336380a4f89d0002b11a285360a3c5b73d7cb4dcce2b43cb9d69693cbc607fdee20cf7a568fab2351126074415d345689623d5a2cd0b14e3be1465fcb268cc3abd4872104e7ca518190247d57a790d73b211edb5a22e3892269943a447e1c642e4577553b86972ca6dd6e6c9f454fce95d89e96f42bdafb27573c3083604b46b46cebe7c8e928d61f835b449378eeed76f8cbad1c87f9cf4563007d9e7c0d7e1b286f1204ee3144a538c756664521e8ab949b5a1227663fd43b2303d8d207f7927393bb285fa0216a4a55291c7e522353cdbb9819ef1b8b75148c2ec2c534d797c581b6d2251cf5cc86c611547fcd84a1b07226deca7e4fb61f435a8dc359fd79a70a3ed3c6c91af2582e7edf57d7d767d018db97723ff6f1cef3baccf55a3a10e30b81c1decc451646eee508719066eab1d1f4d9ddd8b585dd3f56453c55d364d6e612cc48198cc328712ea2419cb6ebffee5e97dfab227942c166cf6975e44c13fde8ed2ec1b0a27ffe6e69d5c1ab008cb54c18c1c351e9de221b47f1ae945e5d783a66178fe03b5eda4d6fa6462c97ecff7db8768b55b51e40cebf97424bc1cc67b1acbd08f27e0e1032f877bcd8d1e003e3210f67b023561df3252d3a65f6e72a88310957f9efb3d390efab260c746b4ac24282b0602f7610e3270145219fbb31d06e818a4f425f8df564ea9dae1faa1fc40e633c05775ac08827dea89bff93581f4408ecf35f2ae37a53d5c77df0f1f17511c8133bc8eff1809238969e66a2997033e690158c19eb319351db83933e5c1f735d3e51c125a5e6722ca34b097ebc452f3736c60fbf8cb5cab1af3ad1d01d8931a5d11b7c35a181f29f2d05587a1997548ad8810b49465d733300e19e1b74dcdd43e5d1e20a656bdd5a4b73e6fe3ddfebcd4e5805a6228258821bbabb476699fee0924c2bc893c4e8c44e19a2daa2d733832e534d89ef5f849eb59145fc1f7f06b1d514553d7f5295bfc69d76f45fd3fc62bd3237512e91bdcf96255839205c7f3c4ddefe3ac2407dd45802c02b307fea430e7555e17150dbfeb3d4044d0a420e6a1f620e149ed938e2ebea32207599c22c8102475767dad6e8f0814dd144c5f4981185641d6390477d45738444991bc7520e83046bd309948e0f7b3205c2946489709a3d29b17a7cf569c640cc8a0bbe725d1625393c7b7d25ba17f56ce909872d3772388f2438cf494a8011868fe16c6e1dfac0eda1cfe257fb23e58db101c97d873cbf3e292678ffae8d81845ea771cfde53c30306abea659a5b91bfb037745776f7033154bf0e4bf002a0dd26be160ee92becc30a0a27f08e9da8a93c24a3d662f92086cfd87022a580f4324b64fff889b122e3bff74940ca60654d4845bf2737cae358a654c908de12e646a52e00ba413cc1b6e8b4fcc7ef4abb981d84f7678a57a3121ce28945da4f29208109dc55cb5c0570d7790dba340f5c274e014233ef723565bed3ee98843fea1802eb0f9b6c7b6a79b724060873c35493ab4d1763610b0497c75a7e4bf77d142593ee66ed6ec4655c073b8a114b4b7ce1c708290c7dbffbfc9965fca37869b916c412f0b1333f08b556da4bcd550647f3a04b45af863591c207ec7924700b6a95db1b5846e28aca22937073550ef401c5df8c255a3a52816c9d6ecd2389b2fa957abcf4ff4a3ea741f15596153b9e8da46b6e0d688ecb525cdaf99ca96eaddbf98a1dd5d8df749124b1b251849c91ebc5bf815338b053117df3a4e73a0995ebb068f074413345978428e65a9eed6137e913aaaade981be44344009e8cd4b314de6a06b13f3360385a28173b0fe7deb08e792f498b933d83b2391fb51e151aa939199948a217fc7ca2bc2afa0725b4aef23dab625ac548965e8d272679144a7cdb0cefeb4a7e55fc9b0b99e9c77f8fe29854891554cc92c240ee56c1d4171a35f0278f0680ce2fcb91b6d0add05c1ed61ca4049cce4aadc81f11aae6c27f0578d2c0ac1dab8098","title":"1054. 距离相等的条形码","link":"https://leetcode-cn.com/problems/distant-barcodes/","question_id":1140},"91":{"day":91,"pres":null,"tags":["跳表"],"whys":null,"difficulty":"- 困难","description":"不使用任何库函数,设计一个跳表。\n\n跳表是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树,其功能与性能相当,并且跳表的代码长度相较下更短,其设计思想与链表相似。\n\n例如,一个跳表包含 [30, 40, 50, 60, 70, 90],然后增加 80、45 到跳表中,以下图的方式操作:\n\nArtyom Kalinin [CC BY-SA 3.0], via Wikimedia Commons\n\n跳表中有很多层,每一层是一个短的链表。在第一层的作用下,增加、删除和搜索操作的时间复杂度不超过 O(n)。跳表的每一个操作的平均时间复杂度是 O(log(n)),空间复杂度是 O(n)。\n\n在本题中,你的设计应该要包含这些函数:\n\nbool search(int target) : 返回 target 是否存在于跳表中。\nvoid add(int num): 插入一个元素到跳表。\nbool erase(int num): 在跳表中删除一个值,如果 num 不存在,直接返回 false. 如果存在多个 num ,删除其中任意一个即可。\n了解更多 : https://en.wikipedia.org/wiki/Skip_list\n\n注意,跳表中可能存在多个相同的值,你的代码需要处理这种情况。\n\n样例:\n\n```\nSkiplist skiplist = new Skiplist();\n\nskiplist.add(1);\nskiplist.add(2);\nskiplist.add(3);\nskiplist.search(0); // 返回 false\nskiplist.add(4);\nskiplist.search(1); // 返回 true\nskiplist.erase(0); // 返回 false,0 不在跳表中\nskiplist.erase(1); // 返回 true\nskiplist.search(1); // 返回 false,1 已被擦除\n约束条件:\n\n0 <= num, target <= 20000\n最多调用 50000 次 search, add, 以及 erase操作。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d842c3d4da25c067868220c57680898ed435087b8217750843294112d894dafe10c10fbe95567cac4128fd47ec11254003bdb501c0f8dfb1821537bd5b8f4619055114ec311e855a0100f267c7cdfde268f885e1ec8d0b9d0ac2210003a8432c7c9d92099833da7344b946ed77e1c398fed355e1a3e5aeac7198b5fadbb544d0ab750caa9fb08a73f2da198abb1f0b0b08f67e4f32f5e4a2e81981a656646f2e647ad8da9a93757a26a39bd0a7b0a841aba400991634073a3f913b4e3af36b446b696bf486c8bab234ce399f445566421cb1f25bb6277f88d7464350812c6c2a2200031a7ebd1b50785dc8e876db949f9db96d138a32c2f4e5b63d15963f3dbb137ff1cb24686c0c41f9888578d5106f68c7995eefb2cce744f4bde6d22b5ac7207d2bb529bcd53a49b7aeecc101d5db69b0f20525e90ae77d40d2fcf0420221c3205211010a27883a4645f74fd82e4ff7590a878c34a58512f534d81951283a00de31e2f56584cc03cbce2dd1613e5083c0a4fbba56404a24562b25716d8493692fe851deaba2143cb30267006b79840407e31a010d6cb19189adbd15beda9d3ccab75c20b790b2ad75c0ecc98e976a4a3b024c40b5ff659502e186f7452e72af0bb819ed0f469fd9b763d239d54bc2d135ac6ca43ceaf81102842758ecdc1b87ee5df64d6f048956d98be5b919d49450672c724f750cc5f90d5f0947d36c29ffb904d54bd330384b5bdbce0c623d5f15778ee81ae3e4a6cc6a5d6e7217e2f671d5bdc3bc6c92f7f1627ab7913e2a08563335b1a6ef2a9a8c8e75dfff4fe31ce48858129f42ebf1640fba24c53eadf7e46b2b7cc9472373867c4dfed8c6dd4d1fdcaedebd4293cd22c00332c7c461303e1911fd4a8ad276a478e20deaf8d617f59dd05ff4afc16bf4bf8792c5c9006dab0139781e73c5e1126ddbe8aa430ebba7097517c6a00cb7b965b4db6433aea1ed5ceb27bdb7667f3b326ab6d7641f8a73809c30934d19c4d758df516ce9847964b68593ae79e513964612ac4468ade9b4fa000475121f4b205faa61c9a2e6b17f6a50af121986fb6941cf8367fcdcbd4b732c67848adb5eff86468c61838ee241803168c12dd7dc148eb5df95c4486dbc53b145ff5bc98a50a0916272e552166532fbca7f9794735f2d8d65df4314e2e5752f3a231ad263a8e2bb31ec16c276b0d2f87d51b941adc948aa114a9ffefbb200da0b96cc975e645da4879c410db9f48a40475de800f93a1df292916c182c9f3781b1de7b3e3fa7f207e78032ebb2772ea5ae34f82192fb4a8369a80ea4bf71c3d80de82eeb5b425b7fa6e2ed778a92b2be3c11b5b54bcb8d2c5afec86bbe10312e1fdc7b5d45fad4518f532a8caf89452a8bcf18daf5b3689a57299b512adabb00c1f0897ab2f38e378fee37f6d1a04d8f92b66b90aab5be23fa23bb7b29f801391ad325f099626e5ed5595c43290956685b7ecc437518df01f124c3fd992b8c3f295cd47e94f656238e2824afdd084955e47ca5c928617720bda4fd298dae374822769fb6f0ecdc4d111d1b0fbf028949f2c5b1a0aff8954cc2876d2476e484cd8b368b2c5a9b8761346f42ae48bacd2d52054655853a9888c477312cb55db20b9ae9bbe0467bb761bb4670341677f1d5c89d877a2a6ba1d01cdfc6f6fc3a9d77f1f1f2673af85f221a6c3362cf99440d9175d147cf31bef489ce973cf56b737aa6b0217689761fe2ad4aeb2521aba37fd51390560b28c5c6b9731c135ef899fbe08642fd46f6932b119bf82e26f79a984695e89fd36ae9bcdc828ba471d22051fb3819cef66818cb8c0cfe6e1f920d8af6bc33edfd3e2cd6e0230e9d6e5f9de47646ea099fb644a68ed768023f6dda8176cafaac6e5986ea6f4e26ada30b951dc3fac1678c2a588a2a98a5877c659a6ba856fb5ceb948aee35148a617b24f0bf95b36d559fc9ffd176bae347edfbccea68c2adb59a2338617a49c3455b681d6d4d7244b8ee415cb43e24ca6b2c044b5a3ea611466d865794ffe5e0703a34f6c85749960228a1c3421b29d1db0d5bea63eba717dd9db25c446840ea692ad0b8c8258761c694d13c6c6dc7b1e217e72f284fcc5450d99e3529a2934167c88ebcfb169ac89013d4ed521cc923b473afc9fa2539d24a658a5efff19e09f7e882e579ee77778ca47cf8819f25c7db098b056346c3aa343fb1c47c6b0a871c690c3e0fcfca5cded28ad1d1937aa1f9a47e575d13577655c663145a8f3e2071dc4b2ae42d0cd04faac1ffeaabb757970158b7896656bcf0027983a28a8240ab695ec535452283349a9f54176498893600e5311ad5f9924c1f1cf36562cde677e9b6e55204f86779677a1e33c913ad861e27fff7604895d683ca0bdbe24cd22b1e8b381728be7366bd8d2f1ed46fc3a191b08dc2528ad9d7e7b9887ed950f857dc49a374c3b7f39a01d9d5feddd5fbd9fcc991680fd1e958eafcdf62ffb01f6bb247b2af8cab906f187ecfe6fd248ae2e422f31f31286759e5916b0f54d2ebf55e0b4ef2c195fcc0432e8070f004cec48b8246cffcbe90dce83fbecf7bf218ddb5120e0d7e80451d571dd039e10f48539b4fd78af4691363d1c380f0a91f18cf921e2275d26c5107f5298eee03759c165b00a6f9476fb92ff14f47f87ef5bf7f0f4e1c4fdaafe20fefad1f26f2a89790c6038544cfa75632f1a2c66a98485685d162daa5c7d104efa0b24c4775b1cbabdeb5d80ae300402f5a3ed29fed0503c6cd49029d5925368df02c782fbc6bdd1803959772aed23bca7504b5cdcdad4c80d4118860c5b56dbf164567f488d16e6ca15361a4d1d1140bd86b1416fefd0e97b2acc768378d8ff0e82cea0f4012f000112b1176cff26ce4eed1deb06b73aa6a9e7cc8150131c7878e4459f2b1de635709db6acb64bbe4b6d926de22c10c17e5a80f70821500d8fcdd66c7a8ac6b054e74e300345103bc3e1eb8798fc482b400335ffa246d0708cd917396a25d3f67f7f5d6d5a6033484c27a0008c2ffb6cc91259d1e68f533f6a0e0c0446b23a05edd2fbb9602fe40b8cf26ce033c07a9503ac78c7b6c07bda907b451683120a0351f6b3a957d952d85947b871a217c37a2dd14815f5615a50366d715e7f1069b90f1f941c460c575b9455a6356d62da400645adff2eaf979ad601b1ab30d9b4583b535bbb4e852e0ac51295682b593de02058fd6d1630e9e5434e93528939238df9f09bd1c0639a1004423528ca5d09a994f9ee9250de641a5c62742b909303448c6a7142eef2428b7a52019f0750a09ed8a7da29a259843317b5e002d530556b5791746d09721789ffa766fc80292b4f5d0a2b2ee24ca3d913a3f67d0e68b2c7c754993bc2c24d1d012dd090da8372dd8836e75b1d453ffc09c7e7e4b49f9565fd876e1031e421010759f8cb4ffa571114e682938de24516d8aa9a3dc842ddc10c64cd64f11a543ea20054f2e7bad02ce72401e9ab87beee48a58a2a965cacea2ebc250321edb9b5ab7da44a63162e100b2d215a8ef96715ddb644cad9c23e3ea50d52034c60edaa4079c7b40eb3c9209fb04e258cbd24ccd348616d364ad3aed35c57bd73cfb6835c65ca299c312c8d942e3d1d7b14011b377e7453e06a6370687e5f515f496d4f96187fee3ae78db86a88968e9d06799c25f3c82794e0d189832fd5bda23b10743abadcf81d279c28b10972d4aeda76b78d9a0c9453e56619d64d44d0a44f6f4ba77d4193520503ddc62328fa7b08590ce13d91367ec0155f5094400fca94ebc3bbe5edd3ee5ddc13f90e5b67118078ba52cc2b0e3a34089fd8ed2c0bd5ef4471325ae74ece7e2db7653c55a4b610a9f981d6a591a08db762fb560f1de26e47b0c22412c3e98aedc6d784fe4c86684840891329b58dbff5eec0aeeec33d56502ac31238486d079bf03659e59ccda602bf1ae92047c047ac2a119f6833f4dd5673e5898efd2feaa57740cf5c57e6a9caa1c75a0c14b31dddde98c13766f8268b5ac3a617fbd6d6b78f7e37ef333bad7146e6cf966fb9d9242cd15d9a8bc6a423aa968d847bc8fc665d5868fc6da177d62193abf932256f26869b1e13817bb34a13021432007b7a9fbfdc9ff39bb8d3b42968f86c5ab58f57d909713d84d72fdabf2d3c815bdeb97df84f1d97d6b5ad83f0cf5b7665659a3030b4168302b63e75a67952efa3211975d8aad6d5f1de9323d89bca97df5da6e96998036945445260a3bbd89de453a33ec1a555f57046d33504fa889de62a956ec8dd344f473149e5634ae7b8ebf7b35097801d42ec321930c4b0c737c67c8e3b814edb02fff2395d975223c8cef345f16c89817b0d30541958de894c83b88f8ba0a7d8cbee4b2654875fd178b5dee1749a4910bbfed5053cc22a444ca3497a222d50364c5f3e1ec0c3a3aac64766f89224ad5378d9a05a95967d75f4f6b6809899b64e32b0d1ea7e0c356795a4e86368535a927fc6c39963f94f2eea44e2bf2a376857a837a2adb277b0a34be3becbe8b3ef5ea7349b7f8853d405d33f81aa91f1bc675aa9b3cd1a8fae9ac57496e6dd1d2c180ec35fe34ba1c4eec13902d8c0f9ecb578004db323447ad92b957158348e8abab9f18db77043ce0c106f8042b5ce57638fd7feba2a9fe357ccb74dc0ef6738d6c7182c8467e9ac30ac56b6d6c4fd9d744a7266c1e772c6aa5c7cd48f47e627a54d4f112677ecccf41d78c0f5db117cb61ccfb5ebc4118bd57cd172ad1dbe29d7b52ad6086bc6f667b3982567a1778e1a67b72febc11710c3f4a830e4b6f647c0d84169071319b72a65a760f145e626623ba1416f7b1c03b9459998c0f87d702ef6a3260748fbb91cfb49ed93b0f08cee4f7fb2eeb4274aebf3aea8d36912b75d344bea2d761d572410e25d36ae25e2e47b2cf5f8ddd4c6d4a9bf0e03bdac96ad4e77ce9328c7c90e832f043f54dc4e57e9d64186d8126c78a19e9b1c3a008f016dc994223dc66f016536642e0932537e91d62bbde0695798041185d3c38797fd08c1d1701f757cc660430fe702aea2c5c6668d57dc4c0bc030baaf22a788f61bcbecd00c671d27d62f7c3d547d210a50b6315aa230d6166f0d5fa9e8df950a5d776e36cf11234a9ed200f59ff6735ca3ae37e4d1e982b49ce19f81c4037c16bb30588a65028c338a8a2dccda11701800bdb4dfcc86c611042dd5a0eff52a72ded77e01ba0e433cc3d74dfb72bf17668a9e9256fc442e75850b82c060f814f49b7d72afbbeaa7f59cfd177b14e82681cbdfc5433c16bca0063fd53ebef8bea08c8f96bad898aae7d4fbd45fa1136d8856ec9c4239c6c3ef278f7d01302762ab60185cedfbbf548955affc18a69a2d0876ef183f65b011cbe3f5ebab0a8c9c4f37d6c75880cb3f0b58e7ebdb254d646e6c588fe23a5ed0534daf4c30f7aeb43cf60ec555b37a3f83fddd1f307917ef77180ee63ea599a3c178b373450c02813bf08b9c5eaabbf8669999ffb20160ca41bee9ab34087745490629d7c6b8ceb22fd6027ffcc0f1c108babda6a64c54a20ebb460cc2c9847a3191010b09a4749041c1ff908690b10636f4547d526f0bb68f98aa6c29f3a023a0d73413fc3b623798ab0d88a10c77514503d91c6e8b3148a217b5d508c257b635cc3f968598025c18735d641f842a87a82761aa1f1d6bef5b6e727c821eab97d18fe6af54c3be58817ff0de183e66bbc4f5ce43571c71548e01b786c80a4e4345264211eb9c1012c8da49a18da30c68388e5c423aa7f83dc4dcd34e4660ae77fc37df1ff7d41364db97b0de1e29cac6d1f2d45155a0cdabdf3cdf3e7056a9ef3fd6dba78b45b217670bb0c90c10326442bff08a921fc841d4f86ba66f281a2790fa92d0715a4365523a6e0c8dbb3a8f1135c45810c1272a74e205156d11f35b0bf1feb3c56b190a0a4b68142c4040cac334e2e5bf771a4c99c22c814e02542fc0dfe8be8900800cd7f1911196471d7dc71e3d096dae4cd15e861607835f029c47c7da00327b922d48a109c30fc58a30ae8f65b233c06d2ed801e2771625393c2c352fb91ca630a11f832a767239d76d38991e448c11969eaa776e4da7d591e083e24bfb6db0c0ea44c159d769ec76216079e8bc9d888274ef348e9a5d8d465eadb41c940bc4eca515271235b8427a5d61baeb349a0b15b32e3c4da67ea2de095821a2838ce1ab7b38b5da3af93f959ade6126b380fd324738b7e79aae76f4bfb41c1cca7b14674845bf2737caab5ea84587419b08ad54a4744ca6533195d2acb8fc84fd1fb0800b93f97be503ab4159a1c6049146ef841fdd7dde25c6a3b858fcc81f97818ea76c420d66a1267064f5d1e5cc9179f71804fa1db1727b7a70b77f23077307cf3d6ed0a4a6c8a6cd74089cba8d6380d1b96f620aa43c9731551c59cf500f4532a49f5c743b7df7bebddd6bb2e6697bb750c205f1e44d7a5abb119f1fca0943c1224ecbd404b23581cb07b7536c354a2e95c61b1003a3cec4368d29780075a144909ad95c1f7940e5289427a277dce0b49529f9b1ec7b14fa5adb48fc5511b4fdb479264a76dfa64e51c5a6be8a2ef39bb9da37cdbe9e27c224c2f918d4829deb9ff5fe2a70b8034037f2a7b6103389e0f1358610636000dbc27cd6709eed6165ac47fff8dcdd0ff510422ab8f9b1b711964d3dbb3c762fafdefad1cfe32216770596cc8724351ed450b7817a82afdf0c9a8c448f2edb76a71757802dd964d2b82db117b7cb68c77ea148dc8bf5ffe9e90ec26c36c8a9f66522b903edac7ba5c85ee35993b1581e46a466eb3150c3dbbf648c9e60928a6384d6ddd9a9fa76d95f866dff4d4d9a7b47dfbd3d3503f8cdc2cbaff63fe5cce698e374a8a267421f6fbbbc308aafb005f28edce3861c4f04bd84adf012b779c53650612077464b332f247d40e6e8de4817b5ed512adc67b1b525c7c76c93ceed8975c2a01104825510edd3fa5424d96a0e8f2f1fc3125dae2b33a7153acf86d28eecbe741118edc8968ae8e524f186ee1fbedb7dd70d6d2617e49e5faaff72a9c234b1e2153e4e057cf79501b7b3f6d8c20dd0cc132cee91465fda1f56fb29df25bec4310d72f788f00f7ddcbad8ae80b14a08b2554b929f34a69150bb528adf06bb65d323ae1c526d98e1861cf98ec0e8d3dad57fc7eca2a27390cfb5d41e89b1202a6fee96cf410d41b9c6c53234695dfdd109263361f90496e0c5802f726f333085cf37926b07ce689764e19a62bfcf9e6d998a83cbe6b67b459aaf7ca91e2d201e18f72a52cb1140b6c287915f819e9c397dbc3a42bad9e6d86e8386ad5d7969640c5c3850923e3720114e5b166d664ec9b9a3b2b91cfb1b5aad761b4a9ad0fc807d574d9aa874910db9ba7aa1c6732076f5155f248a1c985ce4507e63bf40930d5077b6c83e0f2feab4b0cf22f7472faf6f02ad23cc02556093d5527388e4f3bae936a7c0a0a5c78c8ea7696106e00c0cb62b046e65658b951917ca96a8dee6edcc734f6e46ec0b997c79cfe241839e0df2d63fd46a8d32b1ad8906fc3fed6aa3cdaf095d305966766f732d0d7bc13f1de2e2633d7d9ef20a2b0cca010e1af7a655b8459b7ce98c4048ac02d93936b11f8b165a43d1e26a35c33ef02c66d8c82bf7ac9ee0e8ca6b8cbf09baf6ac2c671d811c25bca69a34e97cf78e1f3dd6f1683242b3c4ac5e215c89fd01e69df22d0139a2700526407b975375066245ac588cb028656a079d52e34300547604b150f65d397843ef0e51504a9a1e350d3a3d488646bdc44cb743150cd0b0fc474d237b234ce4cbdaa79df8766e45adbff966b367a7644762dc656f80748fa91a640e04d2fffba43d5ac738aaf76933f5ba7ab7d5bb0f2088c9828f5b11e6e496e5f3616ad2556d6aa9a8e8b3473ad23e683ee362b0f8ec6d661b49a59f85fcc17ed060c5141ee00fedbf109e533ce963b30539791df7bfc305e902ee81d1753a985f486367e3785dedceb14611c787ada87e4021caa9a182324c73554fdac707904f8a826dbda8f212a8d402d37bb527fe8dd07afa8eaa8ded0daa0ae9087d864a80130e0ad01cc3476167ccf7de9264b064573c0a95acdf76e930aa9efd06520baba9ff8d84b805e1e3ffd8e3962d2db83ea78b3576b9140e50dcb34974f10edcbac170c54ee7a5059a469f1c038a0f2a721a9517698cdf65f0d735ddc173e5f197e3b2b513c75e20a129dbdf12c3cbb9ea4bca70244c1f3573aa59aa9573d702e35358c803117b7267c7dbe4a8fafba3d161f702774b0c90601a608c057d4c68da969e557b5eb5964f6a12766ee731ab40d13f6df0d1fe2683c5e42d8d1411b86e1b9902e4e624f6e468db31e614f1d38dd61eda9333b63951abe7585012dd49a1a4713cd882cab32a8f3e37b0a38b6149e85f1cd94dc2dd46895f795831472c19d886f28dc2a5bf1574522fd148004330ea10961fd87ef7b51cd80fef698e71cea98966dbcf4f24bebbf9e120782ff4ee335e3280e13e4c2ee2adcce77ecfc62194fb194f9693a68083f8b07771ba74da3796205ada48490618453ba1d90a4fcbad8ae78c26b5114e1e240a3f4ffb7d1964716c0038626d8c7678d465dd9a66deba2b92a5e41d7314bb8b0d7e34ae286baea1528b9c9faf9c47e72e3275aa44c67757515588f4d49b95156e0a63ab88ab044b7013ffc76a6ffd363f98606f39a8e8c2c6aedd7bacc56e92897468db35d2987ac7e62043963926cf9bf0ab27a0cd8e8354897b7e76600244bb5a5c81e16e17be1e4b2322fa0d7b1b541b9b1f2b9f5404cfd61ac2c959a8df2dd2d12273eb65e9bfa724f54aa67e6eb1fe69ed10bf9a9a7a325b4254cc95629e6098db54278c2da52c34ba959097f2252e824dc48e1a77752a1515599d1961e516ebacf020acd776b6c8d9917927e91608e638ffd6a44977ec2ddb5ad8c614dc0463880dcc2e1380249df8c89f3e5da9bf42ac8c1f521b9fb5a7c399d0c1a7ee9a8bc8da0721c02e158246ca8a60a2d8e91323d43711ab2d2a8420093d9bc4db465eaec0073373d84f5cf96c04846ed15d76aa04d5aad88b2fc97cabe5710a25ef108e55382a8672f6af6cfae8c9535c3fa2aea0d109f8a90abd7773b6f0149435943ad794385872211b1c3e6608e8f02c58f6da16cb6ebe8b29a0615e001e1b4ebb07c6758f96ae7550545affc19755f065d0f5aa978377cac0b433b5bc073e0d957c0d4f75612311d7547ee281cbffec8cf1f49af0ebce7e432ba535803ff23a161181e371694e9db10c566164c6972664b7ba22b58943aa7993f961d5b0554cf9f060c67bf7b11d354048f6ce284a0d4537609536f8394aef4eb7dff667c40b173b826d329c4fde7e60cf5d96cea3dbabf7b0328b77eeb12c8144da9178ba4156b88249ac006cb257ae9230bbe02a21070e648fab47e613430acd28255a6b2b6e759ed0cf8239e9e3158c4a02b7fba2819f518d32c6767d3324378fcd2573c51862d0296172dcb52c970c4fe3d8683340100439636901c62d762a82644f1544cc4b5d626a0a1d1902eabda603c140fde7cf34e17196350e9e5bb4ae72cee3981850f10aceb6831b6e384390da07fc519c1fc0d77f060b22ceb509222e77f2c91976e838d440ae06d47532a9db32b611b430e99690e9202d2997c6ea4060b0071d087e2e87b00d85e308ecf6d0eecb7b716583861193b7f0c9e5c445b3ff69a0844e1a8e41c453a814b4e2086234650e07b16cb5d1d3f57eb2e1ec1cdc60e411988ee03728a56c8e5390c9cb8e5ef8e489f5e502b52f66bd3c180887fb8f6d3443e62335badef99fe6f6986424cf15eb80a97c285e84820996fdff50313bb5a15ce6b55637abfd11a5977f4ade6254fb81d11eda485eeb7568c08b83d24b64d206583439c625acb283bfeddae1998e86fac1d875c0cff691dbb11fb583853e331b289e6668e7861f08a4751b059db3d8845f67faea36e0aaf8b5ca3a53be798c29899a2a7642ba45ddb2ad39a01d871cda737d712726e05955170ea68bc3996ba5708f05a1002f7e080fa48bf61b8cdbc11a97ffb488c65592e1107acbdc454022a13f34edb65f04c768d73bb2e125fdaa7779aa1caea4e8f4e27a8eab393ba5aa4df584153c6e9061fa1288ab85b79ee0685392535b61d297b903b614d29e3fd804fa13068be8ced92c7d3dd3387de2c6281a96aa401c82a2fe9a3e2be622fcab844c06f93cce9203b38ffe6b940d90ae6534fb35bbff4e5466a6ca679d6517ecfb78fd0157d9e01f6cced0a1f69004ebf7141ffa6de5a79d53b99867b5a952e7fd5fe9cea5aec9c21e481aaa02cb65fd37fe3194c32f2610662b4547fadab35f21e722366e011406d222205edbc676bb89dfd8a0051420f253a2e9240261e887dc573cfd842a0b0f25a49571b27411b0f5b7fe7caac1534117b296d2c4e8465d55e258b51c601063157f875022d3b5a1011b4f3366e430c52336cdb7f6d3c502850ab548abead7c65b1cfe403adaeb7b9452442e3ad2cf023b6589c23ef0df518bcf293e116232ace172bf500970328fe436b152bd63e47b72e74325ff3b8406fb94f2ed20a749e5c5511e5672d20f87e176e67e2e7b73b844a78a070b310478ccba93f62d496c10389b2f19f92a74ff40eb0a3f45bfd1aee81cc9ad2dd197c758279731731756f4d332fbf7afaab6c5fd95e0526de8d9a8228eb6bc23010f0780266293a9d8230612e2f0be5e7669aeb404f00623eca9e4f3c1b290647905722f169af173b4244584c6363236b3736fa792ef21d25de141e72ecc7e2db4ce233b40b8a6c6f220c9b6dd1ff128a63f5c3a8497e38060e0a5a3bb06d39e46b1165ba12460a15d9bc2f600fb8412824154c4f62bff2215622653647d03e0912b51085718af97b0eaf7b092d3c84503d6514c9647169d27f3925e191b1b3fdd10256be8973716e9626c6c866c97e9ff6fe4b5d3815461b705c26d6f4c0f985c016778b5f0cd9bb0dd445883b6bf27b05abcc700b9357ccb8858d86c565f26d92a0ea971c92193beab0fcb494e0b6b151c1d1aa6fe2da46df26c02a35c70e641af2479d04dfb0a62e86bdf029db6df59f6f8f12abd16b8b430f51f8afad6d6eded2e60b78842364661ddfd0117e7ff14acbd6910572c39643d59c80f72c3cafe95360cecc64b608109695f714e306349006436b4be97cdf6215a15cee65f312efca9907c84259d21d3e4abe4e1e0f6119ecdc5bdd4e67e844220b608de7bfee2c17ada59fc8e73182c4029ef0bb0f195c7f5d5245ee74363afdaefcff87b78c71aaa75049afc9e5dcbee5b3bd38efaa109d0294a175a2099ac7a60aca59d4fa53edcffc101128e2cf72d75fbc108cd49eb67d7bd20aa9827131ab7a91c55a742066b05b5e5786f77e1d7c4db67899633a64153f4358a18dda214e0333a1aa00ddc6831b9790c027db7421d15e92cdd6d3fdd72629dda8e34af6d8b57531d57743cd59fa016a62a1141d24ece3122de6548c363a811ec96b0dd39f166844c2a7140691422ecb140d10b0b6645c33f58d85a9121b7914d4c2d9df4f5da36dcefd78e10275cecae24983bf0c25030646881d5290ee1fa2aa2bdd742e844448913aac4bb1bcf29e6933f37b7ddb8c38d8a8f7c7106367fb377449498bf5e35857f2ff0b1f95ea05751b5db1cbf03be4fa90ca2911faa73abcbfefe224063b84becd0fb40cec8c7131521ca7a499b2a073d6558ec695b61c268734895e1176e5192a546a3e0fbded21bd37b24a8655197d6617232c19be3545ed6769e0c0eec35fde58d82ed680066de85ba6fc4e1c8bdb78112e8af71cd620e6e08616520332165d1ebf58b7029b4ca0a0597efa83c01d1182f1b097cab7ee53e9a1ea2991d12c7905d345f786d940518c9a87575e2fab8f3d9792157008467d23f2f683b62ab87ab180773c3751676b1318e0a14918315a1fbf1d6c28e9eaa5673d171ffdcee47419c775742c8467c9b5e15df6925efe78a2cd70a637cd1ed08aaa579219033d64a72d08d2613bf1b4387af6ab3674723ac00a90c8739d1d6a8112f620310c11245278a96daa086bdd60c14c24c9c9302b10ff0d72c339ed03c6cc1a3db734192ae92d93a73cab673151a6e8a58e0c2e6bca2a57f08f6045499d71edfcdece110f1f659acd27fe9c9b10e817e394541103172f17f5930dde6fe6c14c44fc562f48d1a3a5ee80330f2581bc320543088c495e046ccd8deff36f60869b05eb822070387bba1f446e7824dcdd235ddc173e92cc4e6b739d69b35ce6b4af12f57c047493dba7fd51c4866d8df5bf330cd3ea6bf835501ee549b3d55f61bd9d9f86999983eeea362c5bd0f2592b01b684da47ea9d76e33962aabec1da619b622be15d8fdc0124c960a947d8c636095464eaa97a35f6c4d66228c4ad9d5f87867864a696887b24252e3e4f89552d870e22a99fffb2a1917c9921359599cedb230e1beb6b5c595f0a933e0ae8209d6302ea08a0e463d0746c2a3cbf451a949272cae9eddfb289385daf6b63aa05d2868068d5790667474836835c0de45eeef5b6ffcd57ee26b292d3606869b815244d1394193a6d864a4c94680fb32f0ef9f6ce82d664422d91082d9d77e7307788f995cee8d375f2952f97e8052ae5af9c74882f46f587baf983acef9e9a0919a913d71e6bd086222e166cc3f2e401190be209a69ed5a0d4115c86abee09d419635dfd1d6b9edaffcaee2b28e73778fc7e7c3542c4b6b8028d43b198185f783596cca6bdfa946705f470523f5d0a9e1db19ced07b8791c767b6110a38e17b4308ad72bd4eb7a701695450c745b386fd2e8aa126c4f5055a587061c3f05dce2a13586b5e2a2d7b6072940d93fcb9d14ab83461097af770d43e833333be774c93f5b43effd88b2d2441775d2262a8051c3701b53a0ed2c5e844aca7e7d511e0e914ed4fbb625387c00765f95138dfebaf95a3542b9f80f74aebf1f49aa04db9ed7f510c4c8b98570b5cd000d88208ca7f60a1fdbcd5df9e8a1538300e3fd9c7148da5b7a1a98a57a904a83f50fec7c6828a4d19c865bbaad5bc4e1a4adead1fdc31c6e45e252f9f74f761103ac52ec8e374c0a8d8bab3a8e65b5e5021ab699ab2093ff00f156209c35b99e7f07b052479bbed9536e1b3fc661a952212efcfc176d36a9f16d1381491b817ce54cdc7fa118c0081059776297ef8fa22c63438f89b93a263e09a7223f2f81306b40901263defe74fe89bfebcaf8e835638856b2ae20a6817f78c6d3b97600d70104ceb98ebbf9c52973acbe1673fcbb3a14b551844ff3bc3d10b6103aaaca3c8a3d55720d58847879eea7dc9f95a17b2f1c1d5238910daee29e5ebcf3d1014b6733cb5cd06b381f274310a5897cd7b01a5b6c0a6ffcddc4b40915786827c9e7790580b0fd6afd8ce50bb4175ed475cc2a07fbd4d0bc2834cf1ccc22a52457237f00302f58bc6516def3e26c0d386445b765059851d4c69298004393061df9eefcbe390b8a4829e8b4b562da24960db46b627fb18b8034780b5b414e21c3a76ab768e2c9150e23550871ff28f89838e55d35c12845b78578c766177377bd0b0ac18376febb21102f9002fa710a00b3ba4fe94798aaa682f24df5a0f27b558b3b4239cb19e36f34c9cae13aaaacdec8095bc36f773eeb32390fe164e5c77dc30f6349f5a9a07f573d4a5a2e44ecfd4d9cd53e1129f1759bd940db13e613ac2d06e240f42861372cbbba7b1ca9128657f5eed432e6ba4ca382a8376d1ed04ed737ace1451aec29679f718d860cb7249d0432fe6ab84f209da088fcc410688b93a738caa778d2496aa5c52ac370c719ab271e6ebe802d05e4678e87fc6b1ed9406b85da6a1e5e130e6c46d3e1f6e7d579206c19c46430b4a2a021c1c0723410791c15f8747b77440cabbc4375ca8e2f95ef2f12e2620e9a8a4d72d99c157958d142bb0eb872d036370c220bd096f5c27d713e165b72a73b3e49425f82e4a1428fff2379d000121402e5c04a75d8ec2ff7839180aab4481cdb31328f79c82d50b48012796dfabcf19b784127a2eacaddbd72bc03c8d283da954d20c42755d1e2d93fb7c5b90ecd8eddcadd97bd61207a871d1f0561060805584dcfa5bd6d0368e75da68f17de8323cf48a8612b33237187e5c5d448e904ec549f5d134ff2133de9f396005677c8b92db0cee862b6acecfe9bc35a7bd17ffb10224db8cc26fb08dd36f058aa4d95b744c8395434fab294eea94670a27e5bc3b5c3d03b4f3d8414d4c3046cbbe85b0c49ec111c6f73cc5c474de55552abedf64ea5ff0d51b8d7e75e821084058b4c9cc48e387473cad5ec80acdd3cb608664617541e899bf350304c5031a5d06de7b9407bcd5ae0a3e15b43ac8cb26a5747e7054528022f18978c83156791415ed9ebc6cfa158ed8fb939f1ee75ea0f7ddf20078dd53c2ce6d58c1d03d5eb61747dd7c90dfdaaad5c42cd3f99af29966c3a70ac839ced3d055ee03e7868ca3a2c0500a285803464e2f15f0ccfca358a9c62da6449b8c46e9312146471a30e44e0eec07d84cbd59427b5df5ac24261fccbab66950e29afad402edf82fdacf8827a0f9dd5128a6c1d425de71374d0f3723257d08bd0eb3b779f04035ca1a2fcfbad191b626aac9d7fd1e6547450f13ce93ee6bd1d493218b36c1526c947b7fb4fc078179330616dbcf0a2b0022f407820bd193a1e8fe30eab2911bf9d080eb282e244ba8ced7a86db72b550c8431ceea5872606513fd2b5c7952cf581c976efb720e6356529f45399922a19320831b3cfeb26eb4be327225f71580961a4c4d5fad23b51fe258f1720f1d2107d2cebd175cd4de6991f9b7d2f62011df3c51fdc10798a5369718aa07bcaeba6ed39a7f47d30fc60bbbf80653394cba51181b35a0154760e9e38613bf8167359a988e1246e29500b90bdabd6807a3c8e0356947501b8cf92a5816d43c976276d83ba5958c6f721884dfd7c513348ad7cea9864e71d015961af78abd7a3af2518d789699e326de3068b777fb655781eaa7294c3faf9a8eaa7f0c04c2533e16ac03784fc520977d355254951300d30cc8fb4a4f9c0d6c08cdc5bed48b5382f16aae97f0c853ee26170f61a13ee77f45f867dfeb483a2c84efa2dfab5dcd00ffec3cb3e89435857d3734b29ec513cce25d46cd017e812ef93a613612f4f2093daccd2ca80eaf1ac27b60e5791b69cbbd877eac8d6fe8b3e2310edf9a889b6e4d4b1b6d42f529dd6a1ad70664c02a7743191d5465217bd0efb8d790a1b050fd9f01be065e09db36b821c0a94b50ada051308420447ea94ef6eeb03233cd8562d7bc469dd093c5dd5958a3ac2480eba1489fbe5a85363f1032a67c2d78130c0cee97b205d6169214f5dc982f9e4646522130d87ff2e29fbc7631655ecc7432f809910df372234296026bb8a064fbd2c1c0368be2547dbc5e4c5b94ce01215d7a61532d59b3594857a9004472382b2d4cfdec14fb808d10ef5096502c398d16a920fb6f89f6f70f660019361cdf5fc3010127aade8cb6b26d87dae8e45d3e3d585224f3292e768c0b26573b30addbad5202e3deae9afdfc464d5fbf14d0e5cd7bf05b245801ccb07dbd216821d64d6881d74ef11a213c988ff547281094463aa53b0e05575d30db829772108728abee8cef10d56bb4471854698eddb27a7e503d4fb6f6619797f39498f4ca3fa78a761b5ed4cb87b11815c90aca6819e4f45aa9d6c5c18b44de1c1c573698dc1ee90235948ce43a6e4a7a4b9c2c6bc6ad15b44bddcf04751fc689b608597af417549d719663c96ed7b70f97e17fe1e05da686ff94bb025a7d2c8d0e0551ffa2cc0ed6ce7f98674d018418a23085fdd6a73a0dff26578aeb564a06d3462187ce8122e1981dbf080df2ee8c7a5ebe7d73f562d594fc7e0f2693f149e094c95dc6b3eb5c384ad3f1e84959bba4c58b9ee4af38481d34fd6d78c08aa2733467e22e193524958f799f74793859c031016fc4a1ab80e8255714be3fc2e52ef887c1e41cfaa5333d881812146faeb520c8a01b1b57ec088334f3329d61793242e9e0ed34cfc69007af9afcc58f3381ab9f6aac2a253df71b7ea97339f5450825751d7f978b5c0f709f57dff86a4e01bfd3ae698578ba8ed21ed43933f9c2c49e62ce6ac5f21a14a400515686ba41ebec70e0eeb0","title":"1206. 设计跳表","link":"https://leetcode-cn.com/problems/design-skiplist/","question_id":1337},"-3":{"title":"预打卡","link":"此处正常应该是链接","description":"让大家熟悉如何打卡","day":0,"tags":["预打卡"]},"-8":{"title":"预打卡","link":"此处正常应该是链接","description":"让大家熟悉如何打卡","day":0,"tags":["预打卡"]}} \ No newline at end of file From c9b633d2090f4699d00f8650b6242ea5406c2c70 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 15:27:19 +0000 Subject: [PATCH 14/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From 2670417f35690b819fd18ec12f3bc89d5b8f9fa0 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 16:19:06 +0000 Subject: [PATCH 15/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------ static/meta.json | 2 +- static/my/solutions.json | 2 +- static/users/index.json | 2 +- 4 files changed, 109 insertions(+), 94 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index ee2869b60f..0ed2b2a6f7 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759331658624,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759331658710},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759335546375,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759335546463},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file diff --git a/static/my/solutions.json b/static/my/solutions.json index 037f706e31..15ba8886c1 100644 --- a/static/my/solutions.json +++ b/static/my/solutions.json @@ -1 +1 @@ -{"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[],"10":[],"11":[],"12":[],"13":[],"14":[],"15":[],"16":[],"17":[],"18":[],"19":[],"20":[],"21":[],"22":[],"23":[],"24":[],"25":[],"26":[],"27":[],"28":[],"29":[],"30":[],"31":[],"32":[],"33":[],"34":[],"35":[],"36":[],"37":[],"38":[],"39":[],"40":[],"41":[],"42":[],"43":[],"44":[],"45":[],"46":[],"47":[],"48":[],"49":[],"50":[],"51":[],"52":[],"53":[],"54":[],"55":[],"56":[],"57":[],"58":[],"59":[],"60":[],"61":[],"62":[],"63":[],"64":[],"65":[],"66":[],"67":[],"68":[],"69":[],"70":[],"71":[],"72":[],"73":[],"74":[],"75":[],"76":[],"77":[],"78":[],"79":[],"80":[],"81":[],"82":[],"83":[],"84":[],"85":[],"86":[],"87":[],"88":[],"89":[],"90":[],"91":[],"839781960":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"954545647":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"1541732340":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"michaelxi3":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"darknightwriter":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"findlayzhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"laofuwf":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lbc546":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zch-bit":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"frankelzeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xingzhaodev":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joeymoso":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hackbl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"q815101630":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shiyishuoshuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aouos":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"thinkfurther":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wengzhouyunfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whisht":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bzlff":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzzkains":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chenmengyu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uancen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nuomituxedo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhongranherz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gr52":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hydelovegood":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nikojxie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fangxianshen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jokertzw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cyang258":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kernelsue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erikahuang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kuang-mou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"iloveqier":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"duke-github":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"caterpillar-0":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ashleyyma6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuki-yzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zpc7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yujian920":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kiirii4":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ucashurui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xixiao51":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"feikerwu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"heng518":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yaya-bb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tlntin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richypang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fenchuiyun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jerry-lllman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nickyk319":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"herbertpan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wsmmxmm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fan-svg":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuzejia":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunnyyujf":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"phoenixflyingsky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nehchsuy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lzyxts":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elainekuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ll491119940":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"2learnsomething":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ataraxyadong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wzasd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miluowzt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maylinglin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weijie-he":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brodxie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"y525":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"leungogogo":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074242240","body":"## Main Idea\nFirst, it looks like we can convert the array `num` to integer and add it to `k`, but `num.length <= 1E+4` so this approach will cause integer overflow. So we will have to do the addition in array form.\n\nThen the idea is to simulate the entire process, add each digit of `num` and `k` with a `carry` bit. We will terminate the loop when we run out of digits for both `num` and `k` and `carry == 0`.\n\n## Code\n```java\nclass Solution {\n public List addToArrayForm(int[] num, int k) {\n int n = num.length, carry = 0, i = n - 1;\n List res = new ArrayList<>();\n \n while (i >= 0 || k > 0 || carry > 0) {\n int kDigit = k % 10;\n k /= 10;\n int sum = i >= 0 ? carry + kDigit + num[i] : carry + kDigit;\n res.add(sum % 10);\n carry = sum >= 10 ? 1 : 0;\n --i;\n }\n \n Collections.reverse(res);\n return res;\n }\n}\n```\n\n## Complexity Analysis\nTime: `O(2*max(N, log(K)))`\n* Given a number `K`, its length will be `O(log_{2}(K))`, the time complexity depends on the length of `N` and `K`, whichever is longer.\n* Notice we want to insert digits at the end of the array and then reverse it after we finish the addition (reverse takes `O(res.size())`). If we insert at the head of array, then it will take `O(n^2)` of time.\n\nSpace: `O(1)`, as we didn't use additional spaces except the return array.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077454608","body":"#### Main Idea\nThe problem asks for the shortest distance from each character in a string s to a given character c. Since c may appear multiple times, we must compute the shortest distance to any occurrence of c for each index.\n\nThe key idea is to perform two passes over the string:\n\nLeft-to-right pass: Calculate distance from the nearest c to the left.\n\nRight-to-left pass: Refine the distance by checking for any closer c on the right.\n\nBy using two passes, we can efficiently compute the minimal distance to the nearest c for each character.\n\n#### Code\n\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n int n = s.length();\n int[] dist = new int[n];\n Arrays.fill(dist, Integer.MAX_VALUE);\n for (int i = 0; i < n; ++i) {\n if (s.charAt(i) == c) {\n dist[i] = 0;\n } else if (i > 0 && dist[i - 1] < Integer.MAX_VALUE) {\n dist[i] = dist[i - 1] + 1;\n }\n }\n\n for (int i = n - 1; i >= 0; --i) {\n if (i < n - 1 && dist[i + 1] != Integer.MAX_VALUE) {\n dist[i] = Math.min(dist[i], dist[i + 1] + 1);\n }\n }\n\n return dist;\n }\n}\n```\n\n#### Complexity\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082949045","body":"## Main Idea\nA stack can be implemented with an array, but usually we only have access to stack top due to encapsulation, while we can actually access/modify any elements in the array internally.\n\nWe can implement the stack API with `array`:\n* `push()`: append at the end of array (`O(1)`)\n* `pop()`: remove the end of array (`O(1)`)\n* `increment()`: use a for loop to increment `array[0:k]` (`O(k)`).\n\n### Optimization. Range Update && Lazy Evaluation\nNotice the time complexity of `increment()` is too high due to range update, and we can use a difference array to optimize it.\n\nAlso we don't really care about the values of elements until we `pop` them, so we can evaluate them when we pop them out of the stack.\n\n## Code\n```java\nclass CustomStack {\n private Deque stack;\n private int[] arr;\n public CustomStack(int maxSize) {\n stack = new ArrayDeque<>();\n arr = new int[maxSize];\n }\n \n public void push(int x) {\n if (stack.size() < arr.length) {\n stack.push(x);\n } \n }\n \n public int pop() {\n if (stack.isEmpty()) {\n return -1;\n }\n int index = stack.size() - 1, ret = stack.pop() + arr[index];\n if (index > 0) {\n arr[index - 1] += arr[index];\n }\n arr[index] = 0;\n return ret;\n }\n \n public void increment(int k, int val) {\n k = Math.min(k - 1, stack.size() - 1);\n if (k >= 0) {\n arr[k] += val;\n }\n }\n}\n```\n## Complexity Analysis\nTime: `O(1)` for all operations\nSpace: `O(n)` as we used 2 arrays.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087312725","body":"### Main Idea\n\nStoring everything in one stack will lead to so many pushes/pops, so we can use two stacks, one stack for string, one stack for number.\n\nIterate the input string:\n\n* If `str[i]` is a number, parse the number, push that number to number stack, and push current string to string stack, then empty the string to start over.\n* If `str[i]` is a closed bracket, then we pop the number stack to get `count`, pop the string stack to get `str`, then append the current string with `count` times to the `str`.\n* Else, append the character to current string.\n\n### Code\n\n* Java\n\n```java\nclass Solution {\n public String decodeString(String s) {\n int n = s.length();\n Deque strStack = new ArrayDeque<>();\n Deque numStack = new ArrayDeque<>();\n StringBuilder sb = new StringBuilder();\n \n for (int i = 0; i < n; i++) {\n if (Character.isDigit(s.charAt(i))) {\n int j = i + 1;\n while (Character.isDigit(s.charAt(j))) {\n j++;\n }\n int count = Integer.parseInt(s.substring(i, j));\n numStack.push(count);\n strStack.push(sb);\n sb = new StringBuilder();\n i = j - 1;\n } else if (s.charAt(i) == ']') {\n int count = numStack.pop();\n StringBuilder top = strStack.isEmpty() ? new StringBuilder() : strStack.pop();\n while (count-- > 0) {\n top.append(sb);\n }\n sb = top;\n } else {\n if (s.charAt(i) != '[') {\n sb.append(s.charAt(i));\n }\n }\n }\n \n return sb.toString();\n }\n}\n```\n\n### Complexity Analysis\n\nTime: `O(max(k) * n)`, each digit will be pushed/popped at most `max(k)` times","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092141722","body":"## Main Idea\nWe can use `stack1` as the input stack, and `stack2` as the output stack. \n\n* `push()`: Push to `stack1`, so this new element will be on the stack top of `stack1` (which is the end of our queue).\n* `pop()` and `peek()`: Since we use `stack2` as our output stack, when we call `pop()` or `peek()`:\n* If `stack2` is empty, we want to move all elements from `stack1` to `stack2`, and their order will be reversed, so the bottom of `stack1` will be the top of `stack2`, which is the head of our queue.\n* If not, then we have access to the top of `stack2` already.\n\n## Code\n\n```java\nclass MyQueue {\n Deque stack1;\n Deque stack2;\n \n public MyQueue() {\n stack1 = new ArrayDeque<>();\n stack2 = new ArrayDeque<>();\n }\n \n public void push(int x) {\n stack1.push(x);\n }\n \n public int pop() {\n if (stack2.isEmpty()) {\n move();\n }\n return stack2.pop();\n }\n \n public int peek() {\n if (stack2.isEmpty()) {\n move();\n }\n \n return stack2.peek();\n }\n \n public boolean empty() {\n return stack1.isEmpty() && stack2.isEmpty();\n }\n \n private void move() {\n while (!stack1.isEmpty()) {\n stack2.push(stack1.pop());\n }\n }\n}\n```\n## Complexity Analysis\nTime:\n* `push()`: `O(1)`\n* `pop()` and `peek()`: \n\t* The **worst case** of `pop()` and `peek()` will be `O(n)`, where we have to move all elements from `stack1` to `stack2`.\n\t* **Amortized Analysis**: Say we have `n` elements in `stack1`, and `0` elements in `stack2`, and we want to call `pop()` or `peek()` `n` times. The first call will take `n` operations to move all elements from `stack2` to `stack1`. But after the first call we will have at least `n - 1` elemetns in `stack2`, which makes the next `n - 1` calls `O(1)`. So the amrotized time will be `O(n + 1 + 1 +...+1 / n) = O((2n-1)/n) = O(1)`.\n\nSpace: `O(1)`, the two stacks are given and we didn't use any extra spaces.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3093992695","body":"### Main Idea\nFor chunks `[c1, c2, c3, ..., cn]`, we have to maintain the property: `max(ci) <= min(cj)` if `i < j`. So we can create a monotonously increasing stack `stack` to **keep track of the max value for each previous chunk**. \n\nIf `arr[i] >= stack.peek()`, we can greedily create a new chunk and `stack.push(arr[i])`. Else, we need to find the previous chunk with max value smaller or equal to `arr[i]`, say `ck`, and we need to merge all the chunks `[c_k+1, ... c_cur]` with `arr[i]`.\n\nTo merge chunks, we can just pop all the max values representing those chunks off the stack, and push back the max among them (in our case, it will be stack top cuz this stack is increasing) as the max of the new chunk. \n\nFinally the size of the stack will be the number of chunks.\n### Code\n```java\nclass Solution {\n public int maxChunksToSorted(int[] arr) {\n int n = arr.length;\n Deque stack = new ArrayDeque<>();\n for (int num : arr) {\n int max = num;\n while (!stack.isEmpty() && stack.peek() > num) {\n max = Math.max(max, stack.pop());\n }\n stack.push(max);\n }\n return stack.size();\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095444824","body":"\n### Main Idea\n1. Find the length of the linked list. If `length == 0`, return `head`.\n2. If `k >= n`, then we can do `k = k % n` which doesn't affect the final result but reduce the number of rotations.\n3. Use two pointers to traverse the linked list to find the last kth element and its previous node.\n4. Modify the linked list.\n\n\n### Code\n```java\nclass Solution {\n public ListNode rotateRight(ListNode head, int k) {\n int n = getLength(head);\n if (n == 0) return head;\n k %= n;\n \n // Find the last kth element as new head\n ListNode fast = head, slow = head;\n for (int i = 0; i < k; ++i) {\n fast = fast.next;\n }\n \n while (fast.next != null) {\n fast = fast.next;\n slow = slow.next;\n }\n \n fast.next = head;\n ListNode newHead = slow.next;\n slow.next = null;\n return newHead;\n \n }\n \n private int getLength(ListNode head) {\n int len = 0;\n while (head != null) {\n ++len;\n head = head.next;\n }\n return len;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(1)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100701991","body":"### Main Idea\n1. If the current list has length smaller than 2, don't need to swap.\n2. Else, recursivly swap the list `head.next.next`, and the swap function should return the `next` node.\n3. Swap the current 2 nodes, `newHead = head.next`, `newHead.next = head` and `head.next = next`.\n\n### Code\n```java\nclass Solution {\n public ListNode swapPairs(ListNode head) {\n if (head == null || head.next == null) return head;\n ListNode next = swapPairs(head.next.next);\n ListNode newHead = head.next;\n newHead.next = head;\n head.next = next;\n return newHead;\n }\n}\n```\n\n### Complexity Analysis\n* Time: `O(n)`\n* Space: `O(n)` for the recursive call.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109183645","body":"### Main Idea\n1. Define `inOrder(int i, int j)` to be the problem of the converting `list[i:j]` to BST.\n2. Base case: if `i > j`, return `null`.\n3. Calculate `mid = i + (j - i) / 2`, left subtree will be `inOrder(i, mid - 1)`, and then we create our root with the current node `cur`, then the next node to create will be `cur.next`, and we build the right sutree with `inOrder(mid + 1, j)`.\n\n### Code\n```java\nclass Solution {\n private ListNode cur;\n public TreeNode sortedListToBST(ListNode head) {\n if (head == null) return null;\n cur = head;\n int n = getLength(head);\n return inOrder(0, n - 1);\n }\n\n private TreeNode inOrder(int l, int r) {\n if (l > r) return null;\n int m = l + (r - l) / 2;\n TreeNode left = inOrder(l, m - 1);\n TreeNode root = new TreeNode(cur.val);\n cur = cur.next;\n TreeNode right = inOrder(m + 1, r);\n root.left = left;\n root.right = right;\n return root;\n }\n\n private int getLength(ListNode head) {\n int cnt = 0;\n while (head != null) {\n head = head.next;\n ++cnt;\n }\n return cnt;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(logn)` for recursive calls.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112278406","body":"Say the length of `a_1` to `a_i` is `a`, `b_1` to `b_i` is `b`, and `c_1` to `c_n` is `c`. If there is no interseciton, then `c = 0`. And `a + b = b + a`. If there is an intersection, then `a + c + b = b + c + a`, and the two pointers will meet at the intersection point.\n```\npublic ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n ListNode h1 = headA, h2 = headB;\n while (h1 != h2) {\n\n h1 = h1 == null ? headB : h1.next;\n h2 = h2 == null ? headA : h2.next;\n }\n return h1; \n }\n```\n\nSo we can just go over both linked list once, and switch the pointers.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3118087746","body":"### Main Idea\nDefine two pointers `fast` and `slow`, each iteration, `fast` moves 2 steps forward while `slow` moves 1 step. If there is a cycle, then `fast` will equals `slow` eventually, and if not, we will exit the loop.\n\nIf a cycle is detected, we need to find the starting point. \n\n```\nfast = 2 * slow\n\nfast = l + n1 * c + t\nslow = l + n2 * c + t\n\n\nl + n1 * c + t = 2 * l + 2 * n2 * c + 2 * t\nl = n1 * c - 2 * n2 * c = c * (n1 - 2 * n2) = n' * c - t\n```\n\n```\n L\n-------- ----I-----\n | | D\n ----------\n```\n### Code\n```java\npublic class Solution {\n public ListNode detectCycle(ListNode head) {\n if (head == null) return null;\n ListNode fast = head, slow = head;\n while (fast != null && fast.next != null) {\n fast = fast.next.next;\n slow = slow.next;\n if (fast == slow) {\n while (slow != head) {\n slow = slow.next;\n head = head.next;\n }\n return head;\n }\n }\n return null;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(1)`","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3126063970","body":"### Main Idea\n* Base case 1, both `p` and `q` are `null`, return `true`.\n* Base case 2, else if either of them is `null` or their values are not equal, return `false`.\n* Recursive case: both left and right subtrees are equal.\n\n### Code\n```java\nclass Solution {\n public boolean isSameTree(TreeNode p, TreeNode q) {\n if (p == null && q == null) {\n return true;\n } else if (p == null || q == null || p.val != q.val) {\n return false;\n }\n return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n }\n}\n```\n\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(h) = O(n)`","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136827599","body":"### Main Idea\nThis problem is asking for the leftmost node of the last layer, and when it comes to traversal by layer, BFS comes in handy.\n\nIn a standard BFS algorithm, we use a queue to keep track of the nodes on each layer, we just need to modify the algorithm to record the first node of the current layer, and if we exit the loop from the current layer, that means this is the last layer, and the node we recorded will be the one we want to find.\n\n### Code\n```java\nclass Solution {\n public int findBottomLeftValue(TreeNode root) {\n Queue q = new ArrayDeque<>();\n q.offer(root);\n int res = 0;\n while (!q.isEmpty()) {\n res = q.peek().val;\n int size = q.size();\n for (int i = 0; i < size; ++i) {\n TreeNode n = q.poll();\n if (n.left != null) q.offer(n.left);\n if (n.right != null) q.offer(n.right);\n }\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144871038","body":"### main Idea\n1. We store `Pair` in our pq, where `TreeNode` is the node and `int[]` is its coordinate.\n2. Since we want to maintain the row order, we compare pairs by their row order, smaller row has higher priority.\n3. If row numbers are the same, we compare values, since we don't really care about the order we process columns each row.\n4. Use a map that maps `col` to `list` to store the node values.\n\n\n### Code\n* Java\n\n```java\nclass Solution {\n public List> verticalTraversal(TreeNode root) {\n // column -> list\n Map> map = new HashMap<>();\n PriorityQueue> queue = new PriorityQueue<>((p1, p2) -> {\n int loc1[] = p1.getValue();\n int loc2[] = p2.getValue();\n if (loc1[0] == loc2[0]) {\n return p1.getKey().val - p2.getKey().val;\n } else {\n return loc1[0] - loc2[0];\n }\n });\n queue.offer(new Pair(root, new int[] {0, 0}));\n while (!queue.isEmpty()) {\n int size = queue.size();\n for (int i = 0; i < size; ++i) {\n Pair p = queue.poll();\n TreeNode node = p.getKey();\n int loc[] = p.getValue();\n List list = map.getOrDefault(loc[1], new ArrayList<>());\n list.add(node.val);\n map.put(loc[1], list);\n if (node.left != null) {\n queue.offer(new Pair(node.left, new int[] {loc[0] + 1, loc[1] - 1}));\n }\n\n if (node.right != null) {\n queue.offer(new Pair(node.right, new int[] {loc[0] + 1, loc[1] + 1}));\n }\n }\n }\n\n List> res = new ArrayList<>();\n for (int i = -1000; i <= 1000; ++i) {\n if (map.containsKey(i)) {\n res.add(map.get(i));\n }\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(nlogn)`\nSpace: `O(n)`","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162435845","body":"```java\nclass Solution {\n public int minSubarray(int[] nums, int p) {\n int n = nums.length;\n long arraySum = Arrays.stream(nums).asLongStream().sum(); \n int targetRemainder = (int) (arraySum % p);\n if (targetRemainder == 0) {\n return 0;\n } else if (arraySum < p) {\n return -1;\n }\n \n Map remainderToIndex = new HashMap<>();\n remainderToIndex.put(0, -1);\n \n long preSum = 0;\n int minLen = Integer.MAX_VALUE;\n for (int i = 0; i < n; ++i) {\n preSum += nums[i];\n int remainder = (int) (preSum % p);\n int remainderToCheck = (int) (remainder - targetRemainder);\n if (remainderToCheck < 0) {\n remainderToCheck += p;\n }\n \n if (remainderToIndex.containsKey(remainderToCheck)) {\n int index = remainderToIndex.get(remainderToCheck);\n minLen = Math.min(minLen, i - index);\n }\n \n remainderToIndex.put(remainder, i);\n }\n \n return minLen >= n ? -1 : minLen;\n }\n}\n\n/*\n [3, 1, 4, 2], p = 6\n \n arraySum = 10, targetRemainder = 4\n \n preSum = 3,\n\n [3, 1, 4, 2] = 10\n \n [0, 3, 4, 8, 10]\n \n [7, ]\n \n Sum: 9 p=6\n \n a mod b = (a + b) mod b\n \n (S_j - S_i) mod p == sum mod p\n \n \n x mod p = a\n y mod p = b\n \n (x - y) mod p = a - b (if a >= b)\n a - b + p (if a < b)\n*/\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182362544","body":"## Method 1. BFS\n### Main Idea\nBasically, this problem is asking if we can mark the graph with 2 colors, where adjacent vertices can't have the same color.\n\nSo we can apply BFS to traverse the graph, say we mark a vertex `v` with color 1, then we have to mark all its neighbors with color 2. If any of them was marked color 1, then we know it's impossible to mark the graph with 2 colors, so we can return `false`.\n\nIf no such contradictions found, that means the graph can be 2-colored, so return `true`.\n### Code\n* Java\n\n```java\nclass Solution {\n public boolean possibleBipartition(int n, int[][] dislikes) {\n List[] graph = new ArrayList[n + 1];\n for (int i = 0; i <= n; ++i) graph[i] = new ArrayList<>();\n \n for (int[] edge : dislikes) {\n graph[edge[0]].add(edge[1]);\n graph[edge[1]].add(edge[0]);\n }\n \n int[] colors = new int[n + 1];\n for (int i = 1; i <= n; ++i) {\n if (colors[i] != 0) continue;\n Queue q = new ArrayDeque<>();\n q.offer(i);\n colors[i] = 1;\n while (!q.isEmpty()) {\n int size = q.size();\n while (size-- > 0) {\n int v = q.poll(), c = colors[v];\n for (int nei : graph[v]) {\n if (colors[nei] == c) return false;\n if (colors[nei] != 0) continue;\n colors[nei] = -1 * c;\n q.offer(nei);\n }\n }\n }\n }\n return true;\n }\n}\n```\n### Complexity Analysis\nTime: `O(E + V)`\n\nSpace: `O(E + V)`","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204204644","body":"```java\nclass Solution {\n public int mySqrt(int x) {\n int left = 0, right = x;\n\n while (left < right - 1) {\n int mid = left + (right - left) / 2;\n long midSquare = 1l * mid * mid;\n if (midSquare == x) {\n return mid;\n } else if (midSquare < x) {\n left = mid;\n } else {\n right = mid - 1;\n }\n }\n long rightSqaure = 1l * right * right;\n return rightSqaure > x ? left : right;\n }\n}\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222726555","body":"```java\nclass Solution {\n public int maxVowels(String s, int k) {\n String vowels = \"aeiou\";\n int n = s.length(), l = 0, r = 0, res = 0, cnt = 0;\n while (r < n) {\n while (r < n && r - l < k) {\n if (vowels.indexOf(s.charAt(r)) != -1) {\n ++cnt;\n }\n ++r;\n }\n\n res = Math.max(res, cnt);\n if (vowels.indexOf(s.charAt(l)) != -1) {\n --cnt;\n }\n ++l;\n }\n\n return res;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243695565","body":"```java\nclass Solution {\n public int maxAreaOfIsland(int[][] grid) {\n int m = grid.length, n = grid[0].length;\n int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};\n \n int ret = 0;\n for (int i = 0; i < m; i++) {\n for (int j = 0; j < n; j++) {\n if (grid[i][j] == 0) {\n continue;\n }\n \n Queue queue = new ArrayDeque<>();\n queue.offer(new int[] {i, j});\n grid[i][j] = 0;\n int area = 1;\n while (!queue.isEmpty()) {\n int[] loc = queue.poll();\n for (int[] dir : dirs) {\n int x = loc[0] + dir[0], y = loc[1] + dir[1];\n if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == 0) {\n continue;\n }\n queue.offer(new int[] {x, y});\n grid[x][y] = 0;\n area++;\n }\n }\n \n ret = Math.max(ret, area);\n }\n }\n \n return ret;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269054068","body":"## Method 1. DP + Count\n### Main Idea\nSimilar to the DP solution of the LIS problem, but we also need to count how many shorter subsequences contribute to each subsequence ending at index `i`.\n\nSo we define `dp[i][0]` to be the max len of subsequence ending at `i`, and `dp[i][1]` to be the number of shorter subsequences contributing to \n### Code\n* Java\n\n```java\nclass Solution {\n public int findNumberOfLIS(int[] nums) {\n int n = nums.length, res = 0, max = 0;\n // \n int[][] dp = new int[n][2];\n \n for (int i = 0; i < n; ++i) {\n dp[i][0] = 1;\n int cnt = 1;\n for (int j = 0; j < i; ++j) {\n if (nums[i] > nums[j]) {\n if (dp[j][0] + 1 > dp[i][0]) {\n dp[i][0] = dp[j][0] + 1;\n cnt = dp[j][1];\n } else if (dp[j][0] + 1 == dp[i][0]) {\n cnt += dp[j][1];\n }\n }\n }\n \n if (dp[i][0] > max) {\n max = dp[i][0];\n res = cnt;\n } else if (dp[i][0] == max) {\n res += cnt;\n }\n dp[i][1] = cnt;\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n^2)`\n\nSpace: `O(n)`","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3295757426","body":"```java\nclass Solution {\n public int change(int amount, int[] coins) {\n int n = coins.length;\n int[] dp1 = new int[amount + 1], dp2 = new int[amount +1];\n for (int i = 0; i < n; i++) {\n for (int j = 0; j <= amount; j++) {\n if (i == 0 || j == 0) {\n if (j % coins[i] == 0) {\n dp2[j] = 1;\n }\n continue;\n }\n \n if (j - coins[i] >= 0) {\n dp2[j] = dp1[j] + dp2[j - coins[i]];\n } else {\n dp2[j] = dp1[j];\n }\n }\n \n int[] tmp = dp1;\n dp1 = dp2;\n dp2 = tmp;\n }\n return dp1[amount];\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322650611","body":"```java\nclass Solution {\n public int[] singleNumber(int[] nums) {\n int xor = 0;\n for (int num : nums) {\n xor ^= num;\n }\n \n\n int rightmostBit = xor & (-xor);\n \n int num1 = 0, num2 = 0;\n for (int num : nums) {\n if ((num & rightmostBit) != 0) {\n num1 ^= num;\n } else {\n num2 ^= num;\n }\n }\n \n return new int[]{num1, num2};\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"suukii":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mirrors-cl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xqy97":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jakkiabc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyoneday":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chouqin99":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhaogeg111":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawnhu23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ye2222":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uyplayer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guixian001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"serena9":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"junzmer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hx-code":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"admu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xxiaomm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pgquestions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eldinzhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiangwenzhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawnwu6688":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tomtao626":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aiweng1981":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richard-lime":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"acoada":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"duanyaqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ccslience":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaiykk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cachezhou0617":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangtuo1999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cytrue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyryan-web":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"naomiwufzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuajingliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miss1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"johnxizhao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"incipe-win":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"revisegoal":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckysq999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dereklisdr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"perfqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mryao1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"likeyousmile":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhg1992":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liquanluo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aq666888":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"samlu-ecnu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhongxiangxiang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hatorimain":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"neado":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaojunjun1110":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wxleah":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunl1ght":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kerrhl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"orangejuz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flyzenr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"c1f2h3":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dlm001128":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuxy94":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aconcert":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"linjunhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hyqqq22":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yibenxiao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elon-lau":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nowkizzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gsgtgyb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"irenia111":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"suiyi8760":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"saltychess":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rabbit2010520":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ellie-wu05":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yopming":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckytwj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzz607":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zoulufeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xxoojs":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"okkband":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wyz999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hacker90":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ricjli":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luhaoling":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flaming-cl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gelxgx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gaominghao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jessie725":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lsunxh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lanceli424":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qycoder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qilin88":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hengheng-yun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"smz1995":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"size-of":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"moyuanhua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"9vivian88":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guxuehua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kirosola":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"biscuit279":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maoting":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"youzhaing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jawn-ha":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hanwangxxx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dujt-x":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"degndaixingqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gzgzgzgzgzgz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gentleman-goodman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xinyi-arch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zenwangzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"andyyxw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fourierhai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yangz001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mannnn6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"haoyangxie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chjillout":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wenjialu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mhcn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"coconutice":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jackgaoyuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xingzhan0312":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yufeng727":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fontendart":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yingchehu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cobayaz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tomato-tomato":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xfliudx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"djd28176":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xilutian":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xy147":[null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091443042","body":"### js代码\n```JavaScript\n\nvar MyQueue = function() {\n this.inStack = [];\n this.outStack = [];\n};\nMyQueue.prototype.push = function(x) {\n this.inStack.push(x);\n};\n\nMyQueue.prototype.pop = function() {\n if (!this.outStack.length) {\n this.in2out();\n }\n return this.outStack.pop();\n};\n\nMyQueue.prototype.peek = function() {\n if (!this.outStack.length) {\n this.in2out();\n }\n return this.outStack[this.outStack.length - 1];\n};\n\nMyQueue.prototype.empty = function() {\n return this.outStack.length === 0 && this.inStack.length === 0;\n};\n\nMyQueue.prototype.in2out = function() {\n while (this.inStack.length) {\n this.outStack.push(this.inStack.pop());\n }\n};\n\n```\n\n### 复杂度分析\n时间复杂度:O(1)\n空间复杂度:O(n)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3120847716","body":"```\nclass ListNode {\n constructor(key, value) {\n this.key = key\n this.value = value\n this.next = null\n this.prev = null\n }\n}\n\nclass LRUCache {\n constructor(capacity) {\n this.capacity = capacity\n this.hash = {}\n this.count = 0\n this.dummyHead = new ListNode()\n this.dummyTail = new ListNode()\n this.dummyHead.next = this.dummyTail\n this.dummyTail.prev = this.dummyHead\n }\n\n get(key) {\n let node = this.hash[key]\n if (node == null) return -1\n this.moveToHead(node)\n return node.value\n }\n\n put(key, value) {\n let node = this.hash[key]\n if (node == null) {\n if (this.count == this.capacity) {\n this.removeLRUItem()\n }\n let newNode = new ListNode(key, value)\n this.hash[key] = newNode\n this.addToHead(newNode)\n this.count++\n } else {\n node.value = value\n this.moveToHead(node)\n }\n }\n\n moveToHead(node) {\n this.removeFromList(node)\n this.addToHead(node)\n }\n \n removeFromList(node) {\n let temp1 = node.prev\n let temp2 = node.next\n temp1.next = temp2\n temp2.prev = temp1\n }\n\n addToHead(node) {\n node.prev = this.dummyHead\n node.next = this.dummyHead.next\n this.dummyHead.next.prev = node\n this.dummyHead.next = node\n }\n\n removeLRUItem() {\n let tail = this.popTail()\n delete this.hash[tail.key]\n this.count--\n }\n\n popTail() {\n let tail = this.dummyTail.prev\n this.removeFromList(tail)\n return tail\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146107002","body":"```const twoSum = (nums, target) => {\n const prevNums = {};\n\n for (let i = 0; i < nums.length; i++) {\n const curNum = nums[i];\n const targetNum = target - curNum;\n const targetNumIndex = prevNums[targetNum];\n if (targetNumIndex !== undefined) {\n return [targetNumIndex, i];\n } else {\n prevNums[curNum] = i;\n }\n }\n}```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3167532564","body":"### js代码\n```JavaScript\nvar middleNode = function(head) {\n let slow = fast = head\n while(fast && fast.next){\n slow = slow.next\n fast = fast.next.next\n }\n return slow\n};\n\n```\n\n### 复杂度分析\n时间复杂度:O(N)\n空间复杂度:O(1)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190926614","body":"### js代码\n```JavaScript\nvar judgeCircle = function(moves) {\n return moves.split('L').length === moves.split('R').length && moves.split('U').length === moves.split('D').length\n};\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"itsjacob":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shunanch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yppah-eb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"raychenlei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"woshichuanqilz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"willuuu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"christina-soda":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jia98shanliang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"user-vannnn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tobepellucid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"johnvsd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yueza":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawyuan97":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"victorhuang99":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cusanity":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jay-xzj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shiradaone":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xinyue-ma":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"taojin1992":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joyce94":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"steven72574":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tian-pengfei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"asuka1h":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaowangcoding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"james0608":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaneyang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"azl397985856":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whgsh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chengfengfengwang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bulingbulingbuling":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"c2tr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eden-ye":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"codingtrains":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"starorbiting":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mo-xiaoxiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"passengersa":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073445770","body":"思维:\n1、将数组num和k转换为字符,\n2、使用BigInt方法相加\n3、最后使用将相加得到转换为数字数组\n时间复杂度:O(n)\n代码:\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function (num, k) {\n let numStr = num.join('')\n let sum = BigInt(numStr) + BigInt(k)\n return sum.toString().split('').map(Number)\n};","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084084442","body":"时间复杂度:O(n)\n代码:\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.maxSize = maxSize;\n this.stack = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.stack.length < this.maxSize) {\n this.stack.push(x);\n }\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.stack.length === 0) {\n return -1;\n }\n return this.stack.pop();\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n const len = this.stack.length;\n const count = Math.min(k, len);\n for (let i = 0; i < count; i++) {\n this.stack[i] += val;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097108121","body":"思路:\n首先,计算链表的长度 n。\n接着,将 k 对 n 取模,因为旋转 n 次后链表会回到原来的状态,所以取模可以避免不必要的旋转操作。\n然后,找到新的链表头节点和尾节点。新的链表头节点是原链表中第 n - k 个节点,新的链表尾节点是原链表的最后一个节点。\n最后,将原链表的尾节点连接到原链表的头节点,形成一个环形链表,再从新的链表头节点处断开,得到旋转后的链表。\n时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表两次,第一次计算链表的长度,第二次找到新的链表头节点的前一个节点。\n代码:\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n // 定义链表节点类\nclass ListNode {\n constructor(val = 0, next = null) {\n this.val = val;\n this.next = next;\n }\n}\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n if (!head || !head.next) return head;\n\n // 计算链表的长度\n let n = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n n++;\n }\n\n // 对 k 取模\n k %= n;\n\n // 如果 k 为 0,说明不需要旋转,直接返回原链表\n if (k === 0) return head;\n\n // 找到新的链表头节点的前一个节点\n let newTail = head;\n for (let i = 0; i < n - k - 1; i++) {\n newTail = newTail.next;\n }\n\n // 新的链表头节点\n let newHead = newTail.next;\n\n // 断开原链表,形成新的链表\n newTail.next = null;\n tail.next = head;\n\n return newHead; \n};\n\n// 辅助函数:将数组转换为链表\nfunction arrayToList(arr) {\n if (arr.length === 0) return null;\n let head = new ListNode(arr[0]);\n let current = head;\n for (let i = 1; i < arr.length; i++) {\n current.next = new ListNode(arr[i]);\n current = current.next;\n }\n return head;\n}\n\n// 辅助函数:将链表转换为数组\nfunction listToArray(head) {\n let result = [];\n let current = head;\n while (current) {\n result.push(current.val);\n current = current.next;\n }\n return result;\n}","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shellylcooper":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"testplm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tom-zhouch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"skylarxu214":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"taihui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huaxueguakele":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yang-chenyu104":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mlking15":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"-3":[],"cyonline":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rzhao010":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zywang0":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jetery":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"klspta":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bookyue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jancerwu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"buer1121":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ceramickitten":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gg925407590":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alyenor":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chenming-cao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ggohem":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dark-volute":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ronething":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jmastella":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"paopaohua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dd2001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mayloveless":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuexi001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nineis7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"abby-xu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gsw9818":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaomingshixiaotang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"snmyj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flipn9":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wabw1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xqmmy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"a-pricity":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sclihuiming":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"amazeding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"astrking":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tzuikuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ringo1597":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brucezhang-utf-8":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luanxing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"moin-jer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lihua1997":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cuizezhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xuanaxuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tiandao043":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"restlessbreeze":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ruikiwi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huiminren":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"saitochen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wtdcai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"albert556":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wuxiaoshawn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zrtch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhuzhu096":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whoam-challenge":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weisday":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"syh-coder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaaller":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kyrie96521":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cavecrypto":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cxgbro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erjian96":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"a-polarbear":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alexno1no2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yetfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhiyuanpeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bwspsu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"arinzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mdge":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allenfeng666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yin02":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elsa-zhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"asur4s":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"littlesugarman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhihaowan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"apockira":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guowei0223":[null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077086971","body":"```\n首先需要找到所有c出现的index,存在c_index list里为后续的pointer搜索做好准备\npointer = 0 定义好pointer的起点\n遍历s,在c_index的范围内,对比pointer和pointer + 1 和s中各个位置的绝对距离,如果发现pointer和s的距离大于pointer +1,那么说明s的index已经走到了离pointer+1更近的距离,那么这时候我们更新pointer,+ 1, 指到下一个c_index中c的位置。\nres.append()c_index中pointer和s中index的距离\n\nclass Solution:\n def shortestToChar(self, s: str, c: str) -> List[int]:\n c_index = []\n for i in range(len(s)):\n if s[i] == c:\n c_index.append(i)\n pointer = 0\n res = []\n for i in range(len(s)):\n if pointer < len(c_index) -1:\n if abs(i-c_index[pointer])> abs(i-c_index[pointer+1]):\n pointer += 1\n res.append(abs(i-c_index[pointer]))\n return res\n\n因为用了指针,所以时间复杂度 O(n)。 空间复杂度 O(n)。 \n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087516204","body":"```\n使用栈的经典题型。遇见数字就num*10 + item处理。 遇见【 左括号说明要开始处理括号内部,用stack先存好之前已经处理的结果,遇见】后括号说明括号完成,则需要stack。pop()出保存的结果加上括号里的内容。是字母的话,则res+ item更新括号内信息。\n空间复杂度 O(n)\n时间复杂度 O(n)\n\nclass Solution:\n def decodeString(self, s: str) -> str:\n res = \"\"\n stack = []\n num = 0\n for item in s:\n if item.isdigit():\n num = num * 10 + int(item)\n elif item == \"[\":\n stack.append([num, res])\n num = 0\n res = \"\"\n elif item == \"]\":\n pre_num, pre_res = stack.pop()\n res = pre_res + pre_num * res\n else:\n res += item\n return res\n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3101341120","body":"还是链表的老套路,设置一个dummy head。 判断cur.next and cur.next.next: 是否存在,存在了再进行下一步。\n用tmp,tmp1 来保存cur。next和cur.next.next.next。 然后我们开始进行交换步骤。\n\n```\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n dummy_head = ListNode(next =head)\n cur = dummy_head\n while cur.next and cur.next.next:\n temp = cur.next\n temp1 = cur.next.next.next\n cur.next = cur.next.next\n cur.next.next = temp\n temp.next = temp1\n cur = cur.next.next\n return dummy_head.next\n\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125611734","body":"可以利用bfs的方法解决。 把每个点放入queue中,然后popleft()两个node进行比较。\n\n```\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if not p and not q:\n return True\n if not p or not q:\n return False\n \n que = deque([p,q])\n \n while que:\n cur1 = que.popleft()\n cur2 = que.popleft()\n if not cur1 and not cur2:\n continue\n\n if not cur1 or not cur2 or cur1.val != cur2.val:\n return False\n \n que.append(cur1.left)\n que.append(cur2.left)\n que.append(cur1.right)\n que.append(cur2.right)\n return True\n\n```\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148705374","body":"```\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n ans = 0\n for x1, y1 in points:\n cnt = defaultdict(int)\n for x2, y2 in points:\n d2 = (x1 - x2) ** 2 + (y1 - y2) ** 2\n ans += cnt[d2] * 2\n cnt[d2] += 1\n return ans\n\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuqianyang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sj941127":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zjsuper":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yongxi-zhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"darwintk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"h-steven":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mischaqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wurongronga":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miduoliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyshenzhengkang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"y4h2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yoco323":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"forschers":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shanshuiqiankun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"annabellhyx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hwfrankfung":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"frederickfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huibinny":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ggmybro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"myleetcodejourney":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"want2333":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"staringwhere":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allenfeng8":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ryanbaiyansong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dou-yu-xuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hyxupup":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cs12300":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chiehw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aesir-idun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaldsk12":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hxj2001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"for123s":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzhilin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yfu6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mengsixing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"import-ant":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joriscai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangqianqian202301":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"airwalkers":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhumengcheng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kofzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"leonalhq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hjy-u":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"csthaha":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zepherust":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"feefeefee":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hughlin07":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huizsh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chanceyliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hshen11":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"horace7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangzh0114":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dragonfcl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huifeng248":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sarah11qing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"el1as7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zcytm3000":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pangjiadai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xb798298436":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ywang525":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"limbo42":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dorapocket":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zoeyzyzyzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jasonqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lp1506947671":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"texamc2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joemonkeylee":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"northseacoder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dominique9898":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wl678":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"meisgithub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sye9286":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fuku-l":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kangliqi1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richardtaok":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chocolate-emperor":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lydia61":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangjiahuan17":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"seanutf":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangyong-hub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erquaner":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiujingxukong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"x1aox1a":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"drinkmorekaik":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dinjufen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuzmt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"munmust":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yan-jie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hktangshuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zpbc007":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"linlizzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"krabbejing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"firehaosky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chao-cc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jinjin680":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cruiseyugh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"quieter2018":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jadeliu13":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaoq777":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiangyanlineu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuxiner":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yufanzh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"franciszq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kangqinsen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"manwzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jerry9926":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"soso1105":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pkuphy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhenya-zhu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wty9sky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"skyoct":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bingzxy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaodingc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jyjsunny":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aoxiangw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"enrilwang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aswrise":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aneureka":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ljqchlsw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jingyuzhou123":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dianlandu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jameswangxin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhenxied":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nuozhouzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shin-guid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bochengwan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kyo-tom":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uratora":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guitarys":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sosdogecoin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zol013":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lrwhc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wwewwt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cyk1337":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangyu1131":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"diana21170648":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"61hhh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"quaaaaaack":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"acy925":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bi9potato":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guangsizhongbin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhaoygcq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"catkathy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yqycs":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhuxinyu-znb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"freesan44":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mo660":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sencc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"randong22":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"beginner-jamji":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yzhyzhyzh123":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunstrongchina":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dongzegithub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"metsystem":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miller-em":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dorian-byte":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yizhewill":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qiaojunch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhouliuhuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"beanza":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kingxiaozhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ygnauh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wzbwzt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"iambigchen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weiboshi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"master-guang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jennyjgao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangjay408":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chang-you":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rocjemaintiendrai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ainfinitedz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"christ36":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hengistchan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huiyingc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"andyli4":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"momogir":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jamjid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"freeroo2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ycan253":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"laurallalala":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"danielyan86":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rennzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"larscheng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qingkediguo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"adfvcdxv":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"javajianghu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chloe-c11":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"verkru":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eggeggliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dr-kkk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jinhma":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"emergence23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"0christ1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"junru281":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joe-the-plumber":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jsaki":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"witerth":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ludwig-ll":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luster-lyl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"smallppgirl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"realduxy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"awilekong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wwz223":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangjinzhepro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"atom-set":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"coderxiaowq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hillsonziqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alexzhang-mini":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xil324":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bordergong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hawkins-hjq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cathyshang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"greyqt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yanglimbo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rao-qianlin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dtjk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"martina001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lxy1108":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"franklinsworld666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brainlds":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huamulanyyds":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eclairs46":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maike-hps":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sanjiu81":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qinmengx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yashuning":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luzhaofeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lizhao-liu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yukibei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hermione666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yyyyytc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zin-next":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pandapls":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jackinai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"godkun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dadahui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"akxuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fightforcoding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jialigogogo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"celestexiong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zjy-debug":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"peggyhao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sleepydog25":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"edwineo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"panfx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liudi9047":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allanli-lhh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xchen172":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qiaoeve":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tangyi23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shangjiaw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tongxw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"haodongwang1995":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuichicx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qunshanhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hebingliang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"baiqz":[null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092397229","body":"\n### 思路:\n通过元素在栈之间的转移来模拟队列的先进先出。\n\n\n```python\nclass MyQueue:\n \"\"\"使用两个栈实现的队列类\"\"\"\n\n def __init__(self):\n # 初始化两个栈:stack_in 用于入队操作,stack_out 用于出队操作\n self.stack_in = []\n self.stack_out = []\n\n def push(self, x: int) -> None:\n \"\"\"将元素 x 添加到队列的尾部\n 直接将元素压入 stack_in\n \"\"\"\n self.stack_in.append(x)\n\n def pop(self) -> int:\n \"\"\"移除并返回队列头部的元素\n 1. 如果 stack_out 为空,将 stack_in 中的所有元素弹出并压入 stack_out\n 2. 这样能确保元素以先进先出的顺序出栈\n 3. 弹出 stack_out 的栈顶元素\n \"\"\"\n if not self.stack_out:\n while self.stack_in:\n self.stack_out.append(self.stack_in.pop())\n return self.stack_out.pop()\n\n def peek(self) -> int:\n \"\"\"返回队列头部的元素,但不删除它\n 复用 pop 方法获取队首元素,然后将其压回 stack_out 以保持队列状态不变\n \"\"\"\n res = self.pop()\n self.stack_out.append(res)\n return res\n\n def empty(self) -> bool:\n \"\"\"检查队列是否为空\n 当且仅当两个栈都为空时,队列为空\n \"\"\"\n return not (self.stack_in or self.stack_out)\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaogaoddd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tuuna":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lxy12l":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chxbilly":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sentiy-hub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fea1220":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wtbkevin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"awenbocc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hallcia":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huzhipeng-hu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tongtz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lindo146":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"heye0507":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lmw6412036":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/1#issuecomment-3072932165","body":"@azl397985856 需要建day1啦","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3076893308","body":"## 思路1\n\n枚举每个普通字符,分别找到其左侧,右侧**最近**特殊字符的位置,求出距离,并取最小值。\n\n1. 预处理每个特殊字符的位置,保存至数组data;\n2. 枚举每个普通字符,在data中查找其左侧,右侧**最近**特殊字符的位置,求出距离,并取最小值。查找过程用可以**二分**实现,也可以用\n **单个指针记录最后一次位置**实现;\n3. 返回结果。\n\n## 思路1代码\n\n```javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function (s, c) {\n let n = s.length, data = [];\n for (let i = 0; i < n; i++) {\n if (s[i] === c) data.push(i);\n }\n\n // 双指针\n // left 左侧最近的c索引\n // right 右侧最近的c索引 right = left + 1\n let left = -1, right = -1, m = data.length;\n let ans = new Array(n).fill(0);\n for (let i = 0; i < n; i++) {\n let char = s[i];\n if (char === c) continue;\n\n let ldis = Infinity, rdis = Infinity;\n // 在data中寻找左侧最近的c索引\n // left 指针移动的条件:data[left + 1] < i,确保data[left] 是在i的左侧,距离i更近\n while (left + 1 < m && data[left + 1] < i) left++;\n if (left >= 0) ldis = i - data[left];\n \n right = left + 1;\n if (right < m) rdis = data[right] - i;\n ans[i] = Math.min(ldis, rdis);\n }\n return ans;\n };\n```\n\n## 思路1复杂度分析\n\n- 时间复杂度:O(n + m),n为字符串s的长度,m为data的长度,遍历字符串s2次,left也只是从左往右移动一次,为O(m),所以总的时间复杂度为O(n + m)。\n- 空间复杂度:O(m),m为data的长度,不考虑返回值的话,需要一个额外的长度为m的数组来保存c的位置,所以空间复杂度为O(m);考虑返回值,需要一个额外的长度为n的数组来保存结果,间复杂度为O(n)。\n\n---\n\n## 思路2\n\n也可以枚举每个特殊字符c的位置,处理c往左、往右能覆盖的普通字符,记录每个普通字符的最小值即可。\n\n1. 预处理每个特殊字符的位置,保存至数组data;\n2. 从左往右遍历data,处理每个特殊字符c左侧的普通字符的距离,保存至数组答案ans;可以使用思路1单指针记录最后一个位置的方式,降低时间复杂度;具体可以看代码;\n3. 从右往左遍历data,处理每个特殊字符c右侧的普通字符的距离,与答案ans对应位置比较,取最小值;\n4. 返回答案ans。\n\n## 思路2代码\n```javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function (s, c) {\n let n = s.length, data = [], ans = new Array(n).fill(Infinity);\n for (let i = 0; i < n; i++) {\n if (s[i] === c) {\n ans[i] = 0;\n data.push(i);\n }\n }\n\n const m = data.length;\n\n // 从左往右遍历\n let left = 0;//从左往右开始,第一个普通字符的索引\n for (let j of data) {\n while (left < n && s[left] === c) left++;\n while (left < n && s[left] !== c && left < j) {\n // console.log('处理left',left,j);\n ans[left] = Math.min(ans[left], j - left);\n left++;\n }\n }\n\n // 从右往左遍历\n let right = n - 1;// 从右往左开始,第一个普通字符的索引\n for (let i = m - 1; i >= 0; i--) {\n let j = data[i];\n while (right >= 0 && s[right] === c) right--;\n while (right >= 0 && s[right] !== c && right > j) {\n ans[right] = Math.min(ans[right], right - j);\n right--;\n }\n }\n return ans;\n };\n```\n## 思路2复杂度分析\n\n- 时间复杂度:O(n + m),n为字符串s的长度,遍历字符串s1次,遍历data两次,left、right也只是各移动一次,所以总的时间复杂度为O(n + m)。\n- 空间复杂度:O(m),m为data的长度,不考虑返回值的话,需要一个额外的长度为m的数组来保存c的位置,所以空间复杂度为O(m);考虑返回值,需要一个额外的长度为n的数组来保存结果,间复杂度为O(n)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082655797","body":"## 思路1\n这是一个典型的栈设计题,数据规模不大的情况下,按照常规操作即可。可以使用数组或链表来存储。\n## 代码1\n```javascript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.data = []\n this.maxSize = maxSize;\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if(this.data.length < this.maxSize) this.data.push(x);\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if(this.data.length === 0) return -1;\n return this.data.pop(); \n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n let n = this.data.length;\n for(let i = 0;i < k;i++){\n if(i < n) this.data[i] += val;\n else break;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n## 复杂度分析1\n* 时间复杂度:O(n*k)。n表示操作次数。插入和删除的时间复杂度都是O(1),每次increment都要遍历数组,时间复杂度是O(k);所以总的复杂度为O(n*k)。\n* 空间复杂度:O(n)。n为maxSize。\n---\n## 思路2\n如果k较大,increment是个非常耗时的操作,所以我们需要优化increment的操作。\n优化思路:increment是批量更新的,可以用差分数组来实现。但是又要支持高效的查询与删除操作,所以可以用树状数组来维护这个差分数组。\n## 代码2\n```javascript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function (maxSize) {\n this.cnt = 0;\n this.data = new Array(maxSize + 1).fill(0);\n this.maxSize = maxSize;\n};\n\n/**\n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function (x) {\n if (this.cnt === this.maxSize) return;\n this.cnt++;\n this.update(this.cnt - 1, x);\n if(this.cnt <= this.maxSize - 1) this.update(this.cnt, -x);\n //console.log('push ',x,this.data);\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function () {\n if(this.cnt === 0) return -1;\n let ans = this.query(this.cnt - 1);\n this.update(this.cnt - 1, -ans);\n if(this.cnt <= this.maxSize - 1) this.update(this.cnt,ans);\n this.cnt--;\n //console.log('pop ',ans,this.data);\n return ans;\n};\n\n/**\n * @param {number} k\n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function (k, val) {\n if(this.cnt === 0) return;\n this.update(0, val);\n let r = Math.min(k,this.maxSize,this.cnt);\n if(r <= this.maxSize - 1) this.update(r,-val);\n};\n\n\nCustomStack.prototype.query = function (i) {\n i = i + 1;\n let ans = 0;\n while (i) {\n ans += this.data[i];\n i -= this.lowbit(i);\n }\n return ans;\n}\n\nCustomStack.prototype.update = function (i, val) {\n i = i + 1;\n while (i <= this.maxSize) {\n this.data[i] += val;\n i += this.lowbit(i);\n }\n}\n\n\nCustomStack.prototype.lowbit = function (i) {\n return i & (-i);\n}\n\n/**\n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n\n```\n\n## 复杂度分析2\n* 时间复杂度:O(n*log(maxSize))。n表示操作次数。插入、删除、批量更新的时间复杂度都是O(log(maxSize));所以总的复杂度为O(n*log(maxSize))。\n* 空间复杂度:O(n)。n为maxSize。\n---\n## 思路3\n有没有保持插入,删除O(1),批量更新O(1)的算法呢?官方题解给出了一个懒删除的技巧。小伙伴们可以尝试一下。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087040795","body":"## 思路一:栈\n这是一个典型的括号匹配问题,可以用栈来解决。 \n步骤:\n1. 创建一个栈sStack,栈顶元素标示当前答案,初始元素为空字符串;\n2. 创建一个栈nStack,存储需要重复的数字k;\n3. 声明一个全局变量num,用来记录数字。遍历字符串:\n 1. 如果当前字符为数字,追加到num中;\n 2. 如果当前字符为左括号,将num压入栈nStack,将一个新的空字符串压入栈sStack,并清空num。**遇到左括号表示要开启新一轮的字符串重复过程,因此数字栈压入需要重复的数字k,字符串栈压入一个空字符串来存储本轮重复过程产生的答案**;\n 3. 如果当前字符为字母,追加到栈sStack的栈顶元素中;\n 4. 如果当前字符为右括号,取出栈sStack的栈顶元素s,取出栈nStack的栈顶元素k,s重复k次;并追加到栈sStack的栈顶元素中。**遇到右括号表示本轮重复过程结束,因此将栈sStack的栈顶元素重复k次,并追加到栈sStack的栈顶元素中,继续前一轮的重复**。\n 5. 最后栈sStack的栈顶元素即为结果。\n## 代码一\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n let sStack = [''],nStack = [],n = s.length;\n let num = 0;\n for(let i = 0;i < n;i++){\n let c = s[i];\n if(/\\d/.test(c)) num = num * 10 + Number(c);\n else if(c === '[') {\n nStack.push(num);\n num = 0;\n sStack.push('');\n }else if(/[a-z]/.test(c)){\n // console.log(sStack)\n sStack[sStack.length - 1] += c;\n }else{\n let s = sStack.pop(),k = nStack.pop();\n // console.log(s,k);\n if(s) s = s.repeat(k);\n sStack[sStack.length - 1] += s;\n // console.log(sStack)\n }\n }\n return sStack[0];\n };\n```\n## 复杂度分析一\n* 时间复杂度:O(n),其中n为字符串s的长度。\n* 空间复杂度:O(n),需要两个最长长度为n的栈保存答案及数字,其中n为字符串s的长度。\n--- \n## 思路二:递归\n括号匹配问题,一般可以用递归来解决。 \n步骤:\n1. 预处理字符串s,记录与每个“\\[”匹配的“\\]”的位置,保存至数组left中。\n> 预处理匹配括号位置是这类递归问题常见的技巧。\n2. 从左往右遍历字符串s: \n 1. 如果当前字符为字母,则将当前字符添加到结果res中;\n 2. 如果当前字符为数字,则将数字保存在变量num中;\n 3. 如果当前字符为左括号,递归调用f,处理\\[i + 1, left\\[i] - 1]的子串,得到的结果重复num次,并追加到结果res中;num清空;\n4. 返回res。\n\n## 代码二\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n let stack = [],n = s.length,left = new Array(n).fill(-1);\n for(let i = 0;i < n;i++){\n let c = s[i];\n if(c === '[') stack.push(i);\n else if(c === ']') left[stack.pop()] = i;\n }\n return f(0,n - 1);\n // -----------------------------------\n function f(l,r){\n let ans = '',num = 0;\n for(let i = l;i <= r;i++){\n let c = s[i];\n if(/\\d/.test(c)) num = num * 10 + Number(c);\n else if(c === '['){\n ans += f(i + 1,left[i] - 1).repeat(num);\n num = 0;\n i = left[i];\n }else if(/[a-z]/.test(c)) ans += c;\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析二\n* 时间复杂度:O(n),其中n为字符串s的长度。\n* 空间复杂度:O(n),即递归栈深度,最大为n,其中n为字符串s的长度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091479392","body":"## 思路\n1. 设计双栈,一个用于存放入队数据,一个用于存放出队数据。\n2. 各个操作的实现思路:\n 1. push:将数据压入pushData栈中。\n 2. pop:如果popData栈为空,则将pushData栈中的数据全部弹出并压入popData栈中。然后弹出popData栈的栈顶元素。\n 3. peek:同pop操作,最后一步返回popData栈的栈顶元素。 \n 4. empty:判断两个栈是否为空。 \n\n> js中可以用数组模拟栈。\n## 代码\n```javascript\nvar MyQueue = function() {\n this.pushData = []\n this.popData = [] \n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.pushData.push(x) \n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n if(this.popData.length === 0 && this.pushData.length) while(this.pushData.length) this.popData.push(this.pushData.pop());\n return this.popData.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if(this.popData.length === 0 && this.pushData.length) while(this.pushData.length) this.popData.push(this.pushData.pop());\n return this.popData[this.popData.length - 1];\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return this.pushData.length === 0 && this.popData.length === 0\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```\n## 复杂度分析\n- 时间复杂度:O(1):插入、删除、查找操作的均摊时间复杂度都是O(1)\n- 空间复杂度:O(n):栈的存储空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094576990","body":"## 思路\n比较容易的思路是,排序后,每个块和排序前元素的种类和数量完全相同,可以用哈希表或前缀和来求解。此思路的时间复杂度是O(n),空间复杂度是O(nlog(n))。 \n后来看了看题解,发现可以用单调栈或维护前后缀的思路来求解。\n\n### 排序块性质\n**我们要想划分最多的块,并且保证排序后的结果和原数组的排序结果相同,则块中的元素必须保证,块中的最大值都比右边的元素小或者相同,块中的最小值都比左边的元素大或者相同。**\n则我们维护一个前缀最大值和后缀最小值两个数组,只要前缀的最大值,小于等于后缀的最小值,则可划分(相当于给数组划一条线)。\n## 代码\n```javascript\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n let n = arr.length, prefixMax = new Array(n).fill(-Infinity),suffixMin = new Array(n).fill(Infinity);\n for(let i = 0;i < n;i++){\n prefixMax[i] = Math.max(i ? prefixMax[i - 1] : -Infinity,arr[i]);\n let j = n - 1 - i;\n suffixMin[j] = Math.min(j + 1 < n ? suffixMin[j + 1] : Infinity,arr[j]);\n }\n\n let ans = 1;\n for(let i = 0;i < n - 1;i++){\n if(prefixMax[i] <= suffixMin[i + 1]) ans++;\n }\n return ans\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(n)\n\n## 参考题解\n[https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solutions/1/zui-duo-neng-wan-cheng-pai-xu-de-kuai-by-z0wz/](https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solutions/1/zui-duo-neng-wan-cheng-pai-xu-de-kuai-by-z0wz/)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095130877","body":"## 思路\n旋转链表的本质上是将链表尾部k个节点移动到链表头部。按照这个思路步骤如下:\n1. 计算链表长度l;\n2. 如果 k % l === 0 或者 l === 0,即k为l的整数倍,或者链表为空,则不需要旋转,直接返回head;否则 k = k % l;\n3. 声明两个指针fast、slow,fast先移动k步;\n4. fast、slow同时移动,直到fast到达链表末尾;\n5. 此时:\n 1. slow的下一个节点即为新的头结点\n 2. slow.next 指向 null\n 3. fast.next 指向 head\n 4. 返回新的头结点\n\n## JavaScript代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n if(!head || k === 0) return head;\n let l = 0,curr = head;\n while(curr){\n l++;\n curr = curr.next;\n }\n k = k % l;\n if(k === 0) return head;\n let fast = head,slow = head;\n while(k){\n fast = fast.next;\n k--;\n }\n\n while(fast.next){\n fast = fast.next;\n slow = slow.next;\n }\n\n let newHead = slow.next;\n slow.next = null;\n fast.next = head;\n return newHead;\n\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中n为链表的长度。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100439586","body":"## 思路\n因为是两两交换,所以可以声明四个指针记录涉及到交换的节点,修改相关指针的next指向即可。具体步骤如下:\n1. 特判:链表为空或链表只有一个节点,直接返回原链表。\n2. 为了简化代码,声明一个哨兵节点dummy,dummy.next = head,方便统一处理。\n3. 声明指针prev,指向前一次交换后的结束节点;声明指针curr,指向本次交换的开始节点。初始值prev = dummy,curr = head,开始循环:\n 1. 循环终止条件:curr为空或者curr的下一个节点为空(即curr没有可以交换的节点了)。\n 2. 声明next指针,next = curr.next;声明nextCurr指针,nextCurr = curr.next.next;\n 3. 两两交换:curr.next = nextCurr,next.next = curr;\n 4. 重新设置头尾指向,确保下一轮循环正确执行:prev.next = next;\n 5. 重新设置prev,curr:prev = curr; curr = nextCurr;继续循环,直到循环终止条件。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n if(!head || !head.next) return head;\n const dummy = new ListNode();\n dummy.next = head;\n \n let prev = dummy,curr = dummy.next;\n while(curr && curr.next){\n let next = curr.next,nextCurr = next.next;\n curr.next = nextCurr;\n next.next = curr;\n \n prev.next = next;\n\n prev = curr;\n curr = curr.next;\n }\n\n return dummy.next;\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是链表的长度。\n- 空间复杂度:O(1),仅使用有限个指针。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105520636","body":"## 思路\n* 本题目标是将一个有序单链表(升序排列)转换为一棵高度平衡的二叉搜索树(Height Balanced Binary Search Tree)。\n* 核心思想是使用递归方式构建树,每次选择链表的中间节点作为当前子树的根节点,以保证左右子树的高度差不超过 1。\n* 利用快慢指针(slow 和 fast)找到链表的中间节点,并将链表分割为左子链表和右子链表,分别递归构建左右子树。\n* 实现步骤如下:\n 1. 递归终止条件:\n * 如果链表为空(!head),返回 null。\n * 如果只有一个节点(!head.next),直接构建一个 TreeNode 返回。\n 2. 寻找中间节点:\n * 使用快慢指针法,fast 每次走两步,slow 每次走一步,当 fast 到达末尾时,slow 正好指向中间节点。使用一个临时变量 prev 记录 slow 的前一个节点,方便后续断开连接。\n 3. 分割链表:\n * 将 slow 前面的节点作为左子链表,断开连接。\n * slow.next 作为右子链表继续递归处理。\n 4. 构建树节点:\n * 当前 slow.val 作为根节点,递归构建左右子树。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if(!head) return head;\n // display(head)\n if(!head.next) return new TreeNode(head.val);\n\n // 寻找中间节点\n let slow = head,fast = head,prev = null;\n while(fast.next && fast.next.next){\n fast = fast.next.next;\n prev = slow;\n slow = slow.next;\n }\n // 此时,slow是中间节点,slow.next是右子树的根\n let next = slow.next;\n if(prev) prev.next = null;\n slow.next = null;\n\n const root = new TreeNode(slow.val);\n root.left = sortedListToBST(prev ? head : null);\n root.right = sortedListToBST(next);\n return root;\n};\n\nfunction display(head){\n let ans = [],p = head;\n while(p){\n ans.push(p.val);\n p = p.next;\n }\n console.log('处理的树:',ans)\n}\n```\n## 复杂度分析\n* 时间复杂度:O(n log n)\n * 每一层递归都需要遍历链表的一半来找中间节点(O(n)),递归深度为 log n,因此总时间复杂度为 O(n log n)。\n* 空间复杂度:O(log n)\n * 主要是递归调用栈的空间,取决于树的高度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111762311","body":"## 思路\n- 定义两个指针 `pA` 和 `pB`,分别从 `headA` 和 `headB` 开始遍历。\n- 当 `pA` 和 `pB` 不相遇时,它们会继续向前移动:\n - 如果 `pA` 到达末尾 (`null`),则跳转到 `headB`。\n - 如果 `pB` 到达末尾 (`null`),则跳转到 `headA`。\n- 这样,两个指针最终会在相交点相遇,或者同时到达末尾 (`null`),从而退出循环。\n- 返回 `pA`,即相交节点或 `null`。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function (headA, headB) {\n let pA = headA, pB = headB;\n while (pA !== pB) {\n pA = pA ? pA.next : headB;\n pB = pB ? pB.next : headA;\n }\n return pA;\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n + m),其中 n 和 m 分别为链表 headA 和 headB 的长度。\n- 空间复杂度:O(1),只使用了两个指针变量,没有额外的空间。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116200386","body":"## 思路\n- 首先处理边界情况:如果head为空,直接返回\n- 快慢指针同时遍历链表,快指针每次走两步,慢指针每次走一步\n- 当两指针相遇时停止第一阶段\n- 如果fast为null,说明无环,返回null\n- 将slow重置为head,两个指针以相同速度继续移动直到相遇\n- 相遇点即为环的起始节点\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n if(!head) return head;\n let slow = head,fast = head;\n while(fast){\n fast = fast.next;\n if(fast) fast = fast.next;\n\n slow = slow.next;\n\n if(slow === fast) break;\n }\n\n if(!fast) return fast;\n\n slow = head;\n\n while(slow !== fast){\n slow = slow.next;\n fast = fast.next;\n }\n\n return slow\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3125594702","body":"## LRU Cache 算法思路分析\n\nLRU (Least Recently Used) 缓存是一种常用的缓存淘汰策略,当缓存满时,会优先淘汰最近最少使用的元素。\n\n### 核心数据结构\n\n1. **双向链表**:维护元素的访问顺序,头部是最近最少使用的元素,尾部是最近使用的元素\n2. **哈希表(Map)**:提供O(1)时间复杂度的元素查找\n\n### 主要操作实现\n\n#### 1. 初始化\n- 设置缓存容量\n- 初始化当前元素计数器\n- 创建哈希表存储键值对\n- 创建虚拟头节点和尾节点,方便操作\n\n#### 2. 获取元素get\n- 如果元素不存在,返回-1\n- 如果元素存在:\n - 将该节点从当前位置删除\n - 将该节点插入到链表尾部(标记为最近使用)\n - 返回节点值\n\n#### 3. 插入/更新元素put\n- **新元素插入**:\n - 如果缓存已满,删除链表头部节点(最近最少使用的元素)\n - 创建新节点并添加到哈希表\n - 将新节点插入链表尾部\n- **更新元素**:\n - 更新节点值\n - 将节点从当前位置删除并移到链表尾部\n\n#### 4. 辅助方法\n- insertToTail:将节点插入链表尾部\n- deleteFromHead:删除链表头部节点\n- deleteNode:删除指定节点\n\n## 代码\n```javascript\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.cnt = 0;\n this.map = new Map();\n this.head = new DoubleNode();\n this.tail = new DoubleNode();\n this.head.next = this.tail;\n this.tail.prev = this.head; \n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n // console.log('get',key)\n \n if(this.map.has(key) === false) return -1;\n let node = this.map.get(key);\n\n this.deleteNode(node);\n \n this.insertToTail(node);\n // this.map.set(key,node);\n \n // this.display();\n\n return node.val;\n};\n\n/** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\nLRUCache.prototype.put = function(key, value) {\n if(this.map.has(key) === false){// 插入操作\n let node = new DoubleNode(key,value);\n if(this.cnt === this.capacity) this.deleteFromHead(); \n else this.cnt++\n this.map.set(key,node);\n this.insertToTail(node);\n }else{\n let node = this.map.get(key);\n node.val = value;\n\n this.deleteNode(node);\n\n this.insertToTail(node);\n // this.map.set(key,node);\n }\n\n // console.log('put',key,value);\n // this.display();\n};\n\nLRUCache.prototype.insertToTail = function(node){\n let prev = this.tail.prev;\n \n prev.next = node;\n node.next = this.tail;\n \n this.tail.prev = node;\n node.prev = prev;\n}\n\nLRUCache.prototype.deleteFromHead = function(){\n let node = this.head.next;\n let next = node.next;\n \n this.head.next = next;\n next.prev = this.head;\n\n this.map.delete(node.key);\n}\n\nLRUCache.prototype.deleteNode = function(node){\n let prev = node.prev,next = node.next;\n prev.next = next;\n next.prev = prev;\n\n node.prev = null;\n node.next = null;\n\n // this.map.delete(node.key);\n}\n\nLRUCache.prototype.display = function(){\n let k = this.cnt,p = this.head.next;\n let ans = []\n while(k){\n ans.push(p.key + '=>' + p.val);\n k--;\n p = p.next;\n }\n console.log(ans);\n}\n\nfunction DoubleNode(key,val){\n this.key = key;\n this.val = val;\n this.next = null;\n this.prev = null;\n}\n\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```\n## 复杂度分析\n### 时间复杂度\n- get操作:O(1)\n- put操作:O(1)\n\n### 空间复杂度\n- O(capacity),需要存储最多capacity个元素\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123739061","body":"## 思路\n\n使用了递归的思想来解决问题:\n\n1. **基础情况(Base Case)**:如果当前节点为空(`!root`),则返回深度0,因为空节点没有深度。\n\n2. **递归关系(Recursive Relation)**:\n - 分别计算左子树和右子树的最大深度:`maxDepth(root.left)` 和 `maxDepth(root.right)`\n - 取两者中的较大值:`Math.max(maxDepth(root.left), maxDepth(root.right))`\n - 加上当前节点的1层高度:`+1`\n\n### 算法执行过程\n\n1. 对于任意节点,先递归计算其左子树的最大深度\n2. 再递归计算其右子树的最大深度\n3. 比较左右子树的深度,取较大值\n4. 将较大值加1(代表当前节点所在的层),作为以当前节点为根的子树的最大深度\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if(!root) return 0;\n return Math.max(maxDepth(root.left),maxDepth(root.right))+1;\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n),其中n是二叉树的节点数。因为需要遍历每个节点一次。\n- **空间复杂度**:O(h),其中h是二叉树的高度。这是由于递归调用栈的深度,最坏情况下(完全不平衡的树)可能达到O(n),最好情况下(完全平衡的树)为O(log n)。\n\n这是一个典型的分治算法应用,将问题分解为更小的子问题(左右子树的深度),然后合并结果得到最终答案。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125568669","body":"## 代码思路分析\n\n这是一个经典的二叉树递归问题,采用深度优先搜索(DFS)的方式解决:\n\n1. **基本情况处理**:\n - 如果两个节点都为null,则认为相同,返回true\n - 如果其中一个节点为null,另一个不是,则不同,返回false\n\n2. **递归比较**:\n - 比较当前节点的值是否相等\n - 递归比较左子树是否相同\n - 递归比较右子树是否相同\n - 只有当值相等且左右子树都相同时,才返回true\n\n## 代码实现\n\n```javascript\nvar isSameTree = function(p, q) {\n // 如果两个节点都为空,则相同\n if(p===null && q===null) return true;\n // 如果只有一个节点为空,则不同\n if(p===null) return false;\n if(q===null) return false;\n // 比较当前节点值,并递归比较左右子树\n return p.val===q.val && isSameTree(p.left,q.left) && isSameTree(p.right,q.right);\n};\n```\n\n\n## 复杂度分析\n\n- **时间复杂度**:O(min(m,n)),其中m和n分别是两个二叉树的节点数。在最坏情况下,需要遍历两个树中所有节点。\n- **空间复杂度**:O(min(m,n)),递归调用的层数最多为较小树的高度,最坏情况下为O(min(m,n))。\n\n这个算法通过递归方式同时遍历两棵树的相同位置节点,并比较它们的值是否相等,从而判断两棵树是否完全相同。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130348089","body":"## 思路\n\n### 核心思路\n- 使用深度优先搜索(DFS)遍历二叉树\n- 在遍历过程中维护从根节点到当前节点形成的数字\n- 当到达叶节点时,将形成的数字加到结果中\n\n### 具体实现\n\n1. **函数定义与参数**:\n - `sumNumbers(root, prev = 0)` 接收当前节点 `root` 和之前形成的数字 `prev`\n - `prev` 参数有默认值 0,用于累积从根到当前节点的数字\n\n2. **边界条件处理**:\n ```javascript\n if(!root) return 0;\n ```\n\n - 如果当前节点为空,返回 0\n\n3. **数字累积**:\n ```javascript\n prev = prev * 10 + root.val;\n ```\n\n - 将当前节点值添加到路径数字中\n - 通过 `prev * 10 + root.val` 实现数字的逐位构建\n\n4. **叶节点判断**:\n ```javascript\n if(!root.left && !root.right) return prev;\n ```\n\n - 如果当前节点是叶节点(无左右子节点),返回累积的数字\n\n5. **递归处理**:\n ```javascript\n return sumNumbers(root.left,prev) + sumNumbers(root.right,prev);\n ```\n\n - 分别递归处理左右子树\n - 将左右子树的结果相加返回\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root,prev = 0) {\n if(!root) return 0;\n prev = prev * 10 + root.val;\n if(!root.left && !root.right) return prev;\n return sumNumbers(root.left,prev) + sumNumbers(root.right,prev);\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n),其中 n 是二叉树的节点数,需要遍历每个节点一次\n- **空间复杂度**:O(h),其中 h 是二叉树的高度,主要是递归调用栈的空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134622736","body":"## 思路\n\n### 1. 核心思想\n使用深度优先搜索(DFS)遍历二叉树,记录每一层最左边的节点值。\n\n### 2. 关键实现点\n\n- **层级记录**:通过 `level` 参数跟踪当前节点所在的层级\n- **每层只记录一次**:利用 `level === left.length` 条件确保每层只记录第一个访问的节点值\n- **先左后右遍历**:先遍历左子树再遍历右子树,保证每层第一个访问的是最左边的节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let left = [];\n dfs(root,0)\n return left[left.length - 1];\n // ----------------------\n function dfs(root,level){\n if(!root) return;\n if(level === left.length) left.push(root.val);\n dfs(root.left,level + 1);\n dfs(root.right,level + 1);\n }\n};\n```\n## 优化后的代码\n优化思路:没必要用数组保存整个左侧值,只需要记录左侧值第一次出现即可\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let left = 0,ans;\n dfs(root,0)\n return ans;\n // ----------------------\n function dfs(root,level){\n if(!root) return;\n if(level === left) {\n left++;\n ans = root.val;\n }\n dfs(root.left,level + 1);\n dfs(root.right,level + 1);\n }\n};\n```\n\n\n## 复杂度分析\n- **时间复杂度**:O(n),其中 n 是二叉树的节点数,需要遍历每个节点一次\n- **空间复杂度**:O(h),其中 h 是二叉树的高度,主要是递归调用栈的空间开销","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138308014","body":"## 思路\n\n### 1. 序列化 (`serialize`)\n- 使用前序遍历(根-左-右)遍历二叉树\n- 对于每个节点:\n - 如果节点为空,将 `null` 添加到结果数组\n - 如果节点不为空,将节点值添加到结果数组,然后递归处理左右子树\n- 最后将数组转换为 JSON 字符串返回\n\n### 2. 反序列化 (`deserialize`)\n- 将 JSON 字符串解析为数组\n- 使用递归方式重建二叉树:\n - 按顺序读取数组元素\n - 如果当前元素是 `null`,返回 `null`\n - 如果当前元素不是 `null`,创建新节点,并递归构建左右子树\n - 利用前序遍历的特点,按顺序处理就能重建原来的树结构\n\n## 关键特点\n\n1. **前序遍历**:保证了根节点在子节点之前被处理,便于重建时确定父子关系\n2. **空节点标记**:用 `null` 标记空节点,确保能完全还原树的结构\n3. **递归实现**:两个函数都使用递归方式实现,代码简洁清晰\n\n## 示例说明\n\n假设有一棵二叉树:\n```\n 1\n / \\\n 2 3\n / \\\n 4 5\n```\n\n\n- 序列化结果:`[1,2,null,null,3,4,null,null,5,null,null]`\n- 反序列化时按此顺序重建树结构\n\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n let ans = [];\n dfs(root);\n return JSON.stringify(ans);\n // -----------------\n function dfs(root){\n if(!root){\n ans.push(null);\n return;\n }\n ans.push(root.val);\n dfs(root.left);\n dfs(root.right);\n }\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n let arr = JSON.parse(data),i = 0;\n //console.log(arr);\n return dfs();\n // if(arr.length === 0) return null;\n // ---------------------\n function dfs(){\n let node;\n // console.log(i,arr[i]);\n if(arr[i] === null) node = null;\n else node = new TreeNode(arr[i]);\n i++;\n if(node) {\n node.left = dfs();\n node.right = dfs();\n }\n return node;\n }\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```\n\n## 复杂度分析\n- 时间复杂度:序列化和反序列化的时间复杂度都是 O(n),其中 n 是二叉树的节点数。\n- 空间复杂度:考虑到返回值的话,序列化和反序列化的空间复杂度都是 O(n),其中 n 是二叉树的节点数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3141895435","body":"## 思路\n\n### 具体实现步骤\n\n1. **数据结构选择**\n - 使用一个大小为2001的数组 cols 每个元素是一个优先队列 `PriorityQueue`\n - 优先队列用于处理同一列中节点的排序问题\n\n2. **排序规则**\n - 主要按行号 row 排序(上到下)\n - 行号相同时按节点值 `node.val` 排序\n\n3. **DFS遍历**\n - 通过 dfs 函数遍历整个二叉树\n - 将每个节点按其列号存入对应的优先队列中\n - 列号通过 `col + 1000` 映射到数组索引,处理负数列号\n\n4. **结果构建**\n - 遍历 cols 数组,跳过空队列\n - 从每个非空队列中依次取出元素,构建每列的结果\n - 按列顺序组合成最终结果\n\n## 关键点\n\n- **坐标系统**:以根节点为原点(0,0),向左列号减1,向右列号加1,向下行号加1\n- **偏移处理**:通过 `col + 1000` 将可能的负数列号映射到正数索引\n- **排序逻辑**:同一位置优先按行排序,其次按值排序\n\n这种方法确保了垂直遍历的正确顺序。\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n let cols = new Array(2000 + 1).fill(0).map(()=>new PriorityQueue((a,b)=>{\n if(a[0] !== b[0]) return a[0] - b[0];\n return a[2] - b[2];\n }));\n\n dfs(root,0,0);\n let ans = [];\n for(let i = 0;i <= 2000;i++){\n let data = cols[i];\n if(data.size() === 0) continue;\n let temp = []\n while(data.size()) temp.push(data.dequeue()[2]);\n ans.push(temp);\n }\n return ans;\n\n // --------------------------------\n function dfs(node,row,col){\n if(!node) return;\n cols[col + 1000].enqueue([row,col,node.val]);\n dfs(node.left,row + 1,col - 1);\n dfs(node.right,row + 1,col + 1);\n }\n \n};\n```\n\n## 复杂度分析\n\n### 时间复杂度\n\n1. **初始化阶段**\n - 创建大小为2001的数组并初始化优先队列:O(2001) = O(1)\n\n2. **DFS遍历阶段**\n - 对每个节点执行一次 dfs 调用\n - 假设树有 N 个节点,则 DFS 总共执行 N 次\n - 每次 enqueue 操作在优先队列中的时间复杂度为 O(log M),其中 M 是队列中元素个数\n - 最坏情况下,所有节点都在同一列,M 最大为 N\n - 因此 DFS 阶段时间复杂度为 O(N log N)\n\n3. **结果构建阶段**\n - 遍历2001个位置的数组:O(2001) = O(1)\n - 从优先队列中 dequeue 所有元素:每个元素 dequeue 一次,总共 N 个元素\n - 每次 dequeue 操作为 O(log M)\n - 总时间复杂度为 O(N log N)\n\n**总时间复杂度:O(N log N)**,其中 N 是二叉树中节点的数量\n\n### 空间复杂度\n\n1. **存储结构**\n - cols 数组:大小固定为 2001,每个元素是一个优先队列\n - 所有优先队列总共存储 N 个节点信息:O(N)\n - 每个节点信息是一个包含3个元素的数组:O(1) 每节点\n\n2. **递归调用栈**\n - dfs 函数的递归深度最多为树的高度 H\n - 在最坏情况下(树退化为链表),H = N\n - 平均情况下,对于平衡二叉树,H = log N\n\n3. **结果数组**\n - ans 数组存储最终结果:O(N)\n\n**总空间复杂度:O(N)**,其中 N 是二叉树中节点的数量\n\n### 总结\n\n- **时间复杂度:O(N log N)**\n- **空间复杂度:O(N)**\n\n其中 N 为二叉树的节点总数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146457266","body":"## 思路:\n\n1. **使用哈希表存储已遍历元素**:\n - 创建一个空对象 [map](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\454\\2.js#L5-L5) 作为哈希表\n - 用于存储已经遍历过的元素值和其对应的索引\n\n2. **一次遍历查找**:\n - 遍历数组中的每个元素 `nums[i]`,记为 [a](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\1.js#L14-L14)\n - 计算目标差值 `b = target - a`\n - 检查 `b` 是否已经在哈希表中存在\n - 如果存在,说明找到了两个数,它们的和等于目标值,直接返回这两个数的索引 `[map[b], i]`\n - 如果不存在,将当前元素 [a](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\1.js#L14-L14) 和它的索引 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 存入哈希表,继续遍历\n\n### 算法优势:\n1. **时间复杂度优化**:从暴力解法的 O(n²) 降低到 O(n)\n2. **空间换时间**:使用额外的哈希表存储,换取查找时间的优化\n3. **一次遍历**:只需要遍历一次数组就能得到结果\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n let map = {}\n for(let i = 0;i < nums.length;i++){\n let a = nums[i],b = target - a;\n if(map[b] !== undefined) return [map[b],i];\n map[a] = i;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是数组的长度。\n- 空间复杂度:O(n),哈希表 map 的大小为 n。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3146924002","body":"## 思路\n### 主要步骤:\n\n1. **统计频次**:使用 [map](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题04.01.节点间通路/main.js#L13-L13) 对象统计每个数字在数组中出现的频次\n ```javascript\n let map = {};\n for(let i of nums) map[i] = (map[i] || 0) + 1;\n ```\n\n\n2. **维护大小为 K 的最小堆**:使用最小堆来保存频率最高的 K 个元素\n ```javascript\n let q = new MinPriorityQueue(v=>v[1]); // 基于元素出现频次的优先队列\n ```\n\n\n遍历统计结果,将元素和其频次作为数组加入堆中,当堆的大小超过 K 时,移除堆顶(即当前堆中频次最低的元素):\n ```javascript\n for(let key in map){\n q.enqueue([+key,map[key]]);\n if(q.size() > k) q.dequeue();\n }\n ```\n\n\n3. **构建结果数组**:依次从堆中取出元素,因为是最小堆,所以频次低的先出堆,最终得到的就是频次最高的 K 个元素\n ```javascript\n let ans = [];\n while(q.size()){\n ans.push(q.dequeue()[0]);\n }\n ```\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function(nums, k) {\n let q = new MinPriorityQueue(v=>v[1]);\n let map = {};\n for(let i of nums) map[i] = (map[i] || 0) + 1;\n for(let key in map){\n q.enqueue([+key,map[key]]);\n if(q.size() > k) q.dequeue();\n } \n let ans = [];\n while(q.size()){\n ans.push(q.dequeue()[0]);\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(N log K),其中 N 是数组的长度\n- 空间复杂度:O(N),用于存储频次映射表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148902680","body":"## 思路\n\n### 1. 数据结构选择\n- 使用 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 数组存储每个点到其他点的距离统计\n- `map[i]` 是一个 Map,记录第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 个点到其他各点的距离及出现次数\n\n### 2. 核心逻辑\n- **距离计算**:遍历所有点对,计算两点间距离的平方(避免开根号运算)\n- **距离统计**:将每对点的距离信息分别记录到两个点的统计中\n- **结果计算**:对于每个点,如果到其他点有相同距离的点超过1个,则可以组成回旋镖\n\n### 3. 关键步骤详解\n\n```javascript\n// 计算两点间距离的平方\nfunction calc(i,j){\n let a = Math.abs(points[i][0] - points[j][0]),b = Math.abs(points[i][1] - points[j][1]);\n return a * a + b * b;\n}\n```\n这段代码计算两个点之间的欧几里得距离的平方,使用平方避免浮点运算。\n\n```javascript\n// 统计每个点到其他点的距离\nfunction addMap(i,dis){\n let m = map[i];\n m.set(dis,(m.get(dis) || 0) + 1);\n}\n```\n将距离信息记录到对应点的统计Map中。\n\n### 4. 结果计算原理\n\n对于每个点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6),如果存在 `v` 个点与它距离相同(`v>1`),则可以从这 `v` 个点中选择 2 个点与点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 组成回旋镖,选择方式有 `v*(v-1)` 种。\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} points\n * @return {number}\n */\nvar numberOfBoomerangs = function(points) {\n let n = points.length;\n if(n < 3) return 0;\n let map = new Array(n).fill(0).map(()=>new Map());\n for(let i = 0;i < n;i++){\n for(let j = i + 1;j < n;j++){\n let dis = calc(i,j);\n addMap(i,dis);\n addMap(j,dis);\n }\n }\n let ans = 0;\n for(let i = 0;i < n;i++){\n for(let [k,v] of map[i]){\n if(v <= 1) continue;\n ans += v * (v - 1);\n }\n }\n\n return ans;\n\n \n\n\n // ------------------------------\n function calc(i,j){\n let a = Math.abs(points[i][0] - points[j][0]),b = Math.abs(points[i][1] - points[j][1]);\n return a * a + b * b;\n }\n\n function addMap(i,dis){\n let m = map[i];\n m.set(dis,(m.get(dis) || 0) + 1);\n\n }\n};\n```\n\n## 算法复杂度\n- 时间复杂度:O(n²)\n- 空间复杂度:O(n²)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3152979976","body":"## 思路\n\n### 核心思想\n使用**滑动窗口**(Sliding Window)技术配合**哈希表**来解决这个问题。\n\n### 关键变量说明\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31): 滑动窗口的左边界\n- [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6): 滑动窗口的右边界(循环变量)\n- [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5): 用于记录窗口内每个字符出现的次数\n- `ans`: 记录最长无重复子串的长度\n\n### 算法步骤\n\n1. **初始化**:设置左边界 `l = 0`,创建字符计数的 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5),初始化结果 `ans = 0`\n\n2. **扩展窗口**:使用 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 从左到右遍历字符串,逐步扩展窗口右边界\n\n3. **处理重复字符**:\n - 当遇到重复字符时(`map.has(c)` 为 true),不断右移左边界 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31)\n - 移动过程中减少对应字符的计数,如果计数为0则从 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 中删除\n - 直到窗口中不再包含当前字符为止\n\n4. **更新结果**:\n - 计算当前窗口长度 `i - l + 1`\n - 与历史最大值比较,更新 `ans`\n\n5. **维护窗口状态**:将当前字符加入 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 并增加其计数\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n let l = 0, map = new Map(),n = s.length,ans = 0;\n for(let i = 0;i < n;i++){\n let c = s[i]\n while(map.has(c)){\n map.set(s[l],map.get(s[l]) - 1);\n if(map.get(s[l]) === 0) map.delete(s[l]);\n l++;\n }\n // console.log(l,i,s.slice(l,i + 1));\n ans = Math.max(i - l + 1,ans);\n map.set(c,(map.get(c) || 0 ) + 1)\n }\n return ans;\n};\n```\n\n\n## 复杂度分析\n- **时间复杂度**: O(n),其中 n 是字符串长度,每个字符最多被访问两次\n- **空间复杂度**: O(min(m,n)),其中 m 是字符集大小","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3157255368","body":"## 思路\n\n### 1. 建立单词频次映射\n```javascript\nlet map = new Map();\nwords.forEach((word,i)=>{\n map.set(word,(map.get(word) || 0) + 1);\n});\n```\n\n- 使用 `Map` 统计 `words` 数组中每个单词的出现次数\n- 处理 `words` 中可能存在重复单词的情况\n\n### 2. 初始化参数\n```javascript\nlet n = s.length,m = words.length,k = words[0].length,l = k * m;\n```\n\n- [n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6): 字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- `m`: 单词数组的长度\n- `k`: 每个单词的长度(题目保证所有单词等长)\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31): 所有单词连接后的总长度\n\n### 3. 遍历可能的起始位置\n```javascript\nfor(let i = 0;i <= n - l;i++){}\n```\n\n- 只需检查到 `n - l` 位置,因为更后面不可能容纳完整的连接串\n\n### 4. 检查每个窗口\n```javascript\nlet j = i,result = new Map(),total = 0;\nwhile(j < i + l){\n let c = s.slice(j,j + k);\n if(map.has(c) === false) break;\n let found = false;\n result.set(c,(result.get(c) || 0) + 1);\n if(result.get(c) <= map.get(c)) found = true;\n if(found === false) break;\n j += k;\n total++;\n}\n```\n\n- 从位置 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 开始,每次取长度为 `k` 的子串进行匹配\n- 使用 `result` 记录当前窗口中各单词的出现次数\n- 如果遇到不在 `words` 中的单词或某个单词出现次数超过要求,则提前终止\n- `total` 记录成功匹配的单词数\n\n### 5. 判断结果\n```javascript\nif(total === m) ans.push(i);\n```\n\n- 当成功匹配的单词数等于 `words` 长度时,说明找到了一个有效子串\n\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n let map = new Map();\n words.forEach((word,i)=>{\n map.set(word,(map.get(word) || 0) + 1);\n });\n let n = s.length,m = words.length,k = words[0].length,l = k * m;\n if(n < l) return [];\n let ans = [];\n for(let i = 0;i <= n - l;i++){\n let j = i,result = new Map(),total = 0;\n while(j < i + l){\n // console.log('check',s.slice(i,i + m * k));\n let c = s.slice(j,j + k);\n if(map.has(c) === false) break;\n let found = false;\n result.set(c,(result.get(c) || 0) + 1);\n if(result.get(c) <= map.get(c)) found = true;\n if(found === false) break;\n j += k;\n total++;\n }\n if(total === m) ans.push(i); \n }\n return ans;\n};\n```\n## 复杂度分析\n### 时间复杂度\n- 外层循环: O(n - l)\n- 内层循环: O(m)\n- 总体复杂度: O((n - l) × m)\n### 空间复杂度\nO(n):存储单词频次映射和结果数组\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162347437","body":"## 思路\n\n使用前缀和 + 哈希表的方法,基于以下数学原理:\n\n1. 如果总和 `totalSum % p = delta`,我们需要找到一个子数组,其和模 `p` 也等于 `delta`\n2. 这样删除该子数组后,剩余元素和就能被 `p` 整除\n\n## 代码步骤分析\n\n### 1. 前缀和计算\n```javascript\nlet n = nums.length, sum = new Array(n + 1).fill(0);\nfor(let i = 0; i < n; i++) sum[i + 1] = sum[i] + nums[i];\n```\n\n- 构建前缀和数组 `sum`,其中 `sum[i]` 表示前 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 个元素的和\n- `sum[0] = 0`,`sum[i] = nums[0] + nums[1] + ... + nums[i-1]`\n\n### 2. 计算目标余数\n```javascript\nlet delta = sum[n] % p;\nif(delta === 0) return 0;\n```\n\n- `sum[n]` 是所有元素的总和\n- `delta` 是总和对 `p` 的余数\n- 如果 `delta` 为 0,说明总和已能被 `p` 整除,返回 0\n\n### 3. 寻找最短子数组\n```javascript\nlet ans = Infinity;\nlet map = new Map();\nfor(let i = 0; i <= n; i++){\n let b = sum[i], a = (b % p - delta % p + p) % p;\n map.set(b % p, i);\n if(map.has(a)) ans = Math.min(ans, i - map.get(a));\n}\n```\n\n\n关键数学关系:\n- 对于子数组 `nums[j...i-1]`,其和为 `sum[i] - sum[j]`\n- 我们希望 `(sum[i] - sum[j]) % p = delta`\n- 即 `sum[i] % p = (sum[j] + delta) % p`\n- 变形得:`sum[j] % p = (sum[i] % p - delta) % p`\n\n具体实现:\n- `b = sum[i]`:当前前缀和\n- `a = (b % p - delta % p + p) % p`:需要找到的前缀和余数\n- 用 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 记录每个余数值最后一次出现的位置\n- 如果找到对应的余数 [a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27),则更新最短长度\n\n### 4. 返回结果\n```javascript\nreturn ans === n ? -1 : ans;\n```\n\n- 如果最短长度等于数组长度,说明需要删除整个数组,返回 -1\n- 否则返回找到的最短子数组长度\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar minSubarray = function(nums, p) {\n let n = nums.length,sum = new Array(n + 1).fill(0);\n for(let i = 0;i < n;i++) sum[i + 1] = sum[i] + (nums[i]);\n // p = BigInt(p);\n let delta = sum[n] % p;\n if(delta === 0) return 0;\n let ans = Infinity;\n let map = new Map();\n for(let i = 0;i <= n;i++){\n let b = sum[i],a = (b % p - delta % p + p) % p;\n map.set(b % p,i);\n if(map.has(a)) ans = Math.min(ans,i - map.get(a));\n }\n return ans === n ? -1 : ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),只需遍历一次数组\n- 空间复杂度:O(n),用于存储前缀和数组和哈希表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166424389","body":"\n## 思路\n使用了经典的**快慢指针**(龟兔赛跑)算法。\n\n1. **双指针技巧**:\n - `slow` 指针每次移动一步\n - `fast` 指针每次移动两步\n - 当 `fast` 到达链表末尾时,`slow` 正好在中间位置\n\n## 代码执行流程\n\n- **初始化**:两个指针 `slow` 和 `fast` 都指向链表头节点 [head](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题02.04.分割链表\\main.js#L50-L50)\n- **循环条件**:`while (fast && fast.next)` 确保 `fast` 可以安全地移动两步\n- **指针移动**:\n - `fast` 连续移动两步:`fast = fast.next; fast = fast.next;`\n - `slow` 移动一步:`slow = slow.next;`\n- **返回结果**:当循环结束时,`slow` 指向中间节点\n\n## 处理奇偶数节点的情况\n\n- **奇数个节点**:返回正中间的节点\n- **偶数个节点**:返回第二个中间节点(如链表有4个节点,则返回第3个节点)\n\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n let slow = head,fast = head;\n while(fast && fast.next){\n fast = fast.next;\n fast = fast.next;\n slow = slow.next;\n }\n return slow;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是链表的节点数。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169628215","body":"## 思路\n\n1. 使用双指针技术:\n - [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 指针(慢指针):指向不重复序列的最后一个元素位置\n - [i](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题08.07.无重复字符串的排列组合/main.js#L9-L22) 指针(快指针):用于遍历整个数组\n\n2. 初始化:\n - [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 从 0 开始,表示第一个元素肯定是要保留的\n - [i](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题08.07.无重复字符串的排列组合/main.js#L9-L22) 从 1 开始遍历\n\n3. 核心逻辑:\n - 当 `nums[i] > nums[r]` 时,说明找到了一个新的不重复元素\n - 此时将 [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 向前移动一位,并将 `nums[i]` 与 `nums[r]` 交换\n - 由于数组是排序的,所以只需要比较大小就能判断是否是新元素\n\n4. 返回值:\n - 返回 [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) + 1,即不重复元素的个数\n\n### 示例演示:\n\n假设数组为 [0, 0, 1, 1, 2, 2]:\n\n1. 初始:r = 0, i = 1,nums[1] = 0, nums[0] = 0,不满足 `nums[i] > nums[r]`\n2. i = 2,nums[2] = 1, nums[0] = 0,满足 `nums[2] > nums[0]`,r 变为 1,交换 nums[2] 和 nums[1]\n - 数组变为 [0, 1, 0, 1, 2, 2],r = 1\n3. i = 3,nums[3] = 1, nums[1] = 1,不满足 `nums[i] > nums[r]`\n4. i = 4,nums[4] = 2, nums[1] = 1,满足 `nums[4] > nums[1]`,r 变为 2,交换 nums[4] 和 nums[2]\n - 数组变为 [0, 1, 2, 1, 0, 2],r = 2\n5. i = 5,nums[5] = 2, nums[2] = 2,不满足 `nums[i] > nums[r]`\n6. 结束,返回 r + 1 = 3\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n let n = nums.length,r = 0;\n for(let i = 1;i < n;i++){\n if(nums[i] > nums[r]) {\n r++;\n swap(i,r);\n }\n //console.log(nums);\n }\n return r + 1;\n // ------------------------\n function swap(i,j){\n [nums[i],nums[j]] = [nums[j],nums[i]]\n }\n};\n```\n\n### 复杂度分析:\n\n- 时间复杂度:O(n),只需要遍历一次数组\n- 空间复杂度:O(1),只使用了常数级别的额外空间\n- 利用了数组已经排序的特性,通过比较大小判断是否重复\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172297646","body":"## 思路\n经典的二分查找算法,用于在有序数组中找到目标值的插入位置\n1. **初始化变量**:\n - `n`:数组长度\n - `l`:左边界,初始为0\n - `r`:右边界,初始为n-1\n - `ans`:结果位置,初始为n(表示插入到数组末尾)\n\n2. **二分查找逻辑**:\n - 使用标准二分查找模板,当`l <= r`时继续查找\n - `mid = (l + r) >> 1`:计算中间位置(相当于除以2取整)\n - 关键判断:`if(nums[mid] >= target)`\n - 如果中间元素大于等于目标值,说明目标值应该在左半部分(包括mid位置)\n - 更新`ans = mid`,并将右边界移动到`mid - 1`\n - 否则,目标值在右半部分,将左边界移动到`mid + 1`\n\n3. **返回结果**:\n - 返回找到的插入位置`ans`\n\n### 特殊情况处理\n\n- 如果target小于所有元素,ans保持为0(正确位置)\n- 如果target大于所有元素,ans保持为n(数组长度,正确位置)\n- 如果target等于某个元素,ans为该元素的索引\n- 如果target介于两个元素之间,ans为较大元素的位置\n\n这个实现非常优雅,通过一个变量ans记录可能的答案,避免了在循环外再进行额外判断,使得代码简洁且易于理解。\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let n = nums.length;\n let l = 0, r = n - 1,ans = n;\n while(l <= r){\n let mid = (l + r) >> 1;\n if(nums[mid] >= target){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n};\n```\n\n### 复杂度分析\n\n1. **时间复杂度**:O(log n),典型的二分查找时间复杂度\n2. **空间复杂度**:O(1),只使用了常数级别的额外空间\n3. **核心思想**:寻找第一个大于等于target的元素位置","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173065451","body":"## 思路\n\n这段代码使用**单调队列**(双端队列)来解决滑动窗口最大值问题,时间复杂度为 O(n)。\n\n### 实现步骤\n\n1. **数据结构选择**\n - 使用 `q` 数组作为双端队列,存储数组元素的**索引**\n - 队列中保持索引对应的值**单调递减**的特性\n\n2. **维护单调性**\n ```javascript\n while(q.length && back() < nums[i]) q.pop();\n q.push(i);\n ```\n\n - 在每次添加新元素前,移除队尾所有小于当前元素的索引\n - 这样保证队首始终是当前窗口的最大值索引\n\n3. **窗口处理**\n ```javascript\n if(i >= k - 1){\n ans.push(nums[q[0]]); // 队首即为窗口最大值\n if(i - q[0] + 1 === k) q.shift(); // 移除窗口外的元素\n }\n ```\n\n - 当达到窗口大小时开始记录结果\n - 及时移除超出窗口范围的索引\n\n### 关键技巧\n\n- 存储索引而非值,便于判断元素是否在窗口范围内\n- 利用单调性快速获取窗口最大值(队首元素)\n- 通过索引差值判断元素是否需要移出窗口\n\n### 缺陷\n在javascript中,使用数组模拟双端队列,队首出队、入队的时间复杂度均为O(n),性能较差,可以考虑手动实现一个双端队列,例如使用双向链表,优化性能。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar maxSlidingWindow = function(nums, k) {\n let q = [],n = nums.length;\n let ans = [];\n for(let i = 0;i < n;i++){\n while(q.length && back() < nums[i]) q.pop();\n q.push(i);\n if(i >= k - 1){\n ans.push(nums[q[0]]);\n if(i - q[0] + 1 === k) q.shift();\n }\n }\n return ans;\n // ------------------------\n function back(){\n return nums[q[q.length - 1]];\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是数组的长度。单调队列的维护时间复杂度为 O(n),窗口处理时间复杂度为 O(n),因此总时间复杂度为 O(n)。\n- 空间复杂度:O(n),单调队列最多存储 n 个元素,因此空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3177500710","body":"## 思路\n\n### 1. 数据结构设计\n- 使用两个数组 `ind` 和 `outd` 分别记录每个人的入度和出度\n- 数组长度为 `n+1` 是为了方便使用1到n的索引对应人编号\n\n### 2. 统计过程\n```javascript\nfor(let [a,b] of trust){\n outd[a]++; // a相信别人,出度+1\n ind[b]++; // b被别人相信,入度+1\n}\n```\n\n- 遍历信任关系数组,统计每个人的入度和出度\n\n### 3. 法官判断\n```javascript\nfor(let i = 1;i <= n;i++){\n if(outd[i] === 0 && ind[i] === n - 1) return i;\n}\n```\n\n- 遍历所有人,寻找满足条件的人:\n - `outd[i] === 0`:不相信任何人\n - `ind[i] === n - 1`:被其他所有人相信\n\n这是典型的图论中利用入度出度解决问题的方法。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n let ind = new Array(n + 1).fill(0),// 入度\n outd = new Array(n + 1).fill(0);// 出度\n for(let [a,b] of trust){\n outd[a]++;\n ind[b]++;\n }\n for(let i = 1;i <= n;i++){\n if(outd[i] === 0 && ind[i] === n - 1) return i;\n }\n return -1;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(T + N),其中T是信任关系数,N是人数\n- 空间复杂度:O(N),用于存储入度和出度数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182022991","body":"## 思路\n\n### 1. 图的构建\n- 使用邻接表`g`存储不喜欢关系\n- 对于每一对`[a,b]`,在[a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27)的邻接表中添加`b`,在`b`的邻接表中添加[a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27)\n- 这样构建出一个无向图,表示不喜欢关系\n\n### 2. 二分图判断\n- 使用染色法判断是否为二分图\n- `color`数组记录每个节点的颜色状态:\n - `0`表示未染色\n - `1`表示第一组\n - `2`表示第二组\n\n### 3. DFS遍历\n- 遍历所有节点,对未染色节点开始DFS\n- [f(i, val)](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)函数:\n - 将节点[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)染成颜色[val](file://E:\\其他项目\\algorithm_exercises\\libs\\LinkedList.js#L34-L34)\n - 遍历[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)的所有邻居节点`j`\n - 如果邻居`j`已有颜色且与[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)相同,返回`false`\n - 如果邻居`j`未染色,递归将其染成相反颜色\n - 所有情况满足则返回`true`\n\n### 4. 核心逻辑\n- 主函数中遍历所有节点,对未染色节点调用[f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)函数\n- 如果任何一次调用返回`false`,说明无法二分,返回`false`\n- 全部成功则返回`true`\n\n这是典型的二分图判定问题,通过图的遍历和染色来解决。\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nvar possibleBipartition = function(n, dislikes) {\n let g = new Array(n + 1).fill(0).map(()=>[]);\n for(let [a,b] of dislikes){\n g[a].push(b);\n g[b].push(a);\n }\n let color = new Array(n + 1).fill(0);\n for(let i = 1;i <= n;i++){\n if(color[i] === 0 && !f(i,1)) return false;\n }\n return true;\n\n // ------------------------\n function f(i,val){\n color[i] = val;\n for(let j of g[i]){\n if(color[j] && color[j] === val) return false;\n if(!color[j] && !f(j,val === 1 ? 2 : 1)) return false; \n }\n return true;\n }\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n + dislikes.length) - 线性时间复杂度\n- 空间复杂度:O(n + dislikes.length) - 主要用于存储图结构和递归栈","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186678361","body":"## 主要思路\n\n### 1. 预处理阶段\n- **处理未分配项目**:将 `group[i] === -1` 的项目分配给新的虚拟组\n- **构建组内项目映射**:建立 `groupItems` 数组,记录每个组包含的项目\n\n### 2. 构建依赖图\n- **项目依赖图** (`itemG`):记录项目间的依赖关系\n- **小组依赖图** (`groupG`):记录小组间的依赖关系\n- **计算入度**:\n - `inID`:每个项目的入度\n - `inGD`:每个小组的入度\n\n### 3. 双层拓扑排序\n- **组间拓扑排序**:先对小组进行拓扑排序\n- **组内拓扑排序**:对每个小组内的项目进行拓扑排序\n\n## 关键函数分析\n\n### 主函数流程\n```javascript\n// 初始化和构建图结构\n// ...\n\n// 组间拓扑排序\nfor(let i = 0;i <= m;i++){\n if(inGD[i] === 0) qG.enqueue(i);\n}\nwhile(qG.size()){\n let i = qG.dequeue();\n getItemsFromGroup(i); // 处理组内项目\n // 更新小组依赖\n}\n```\n\n\n### 组内拓扑排序函数 `getItemsFromGroup`\n```javascript\nfunction getItemsFromGroup(g){\n // 对特定组内的项目进行拓扑排序\n // 只处理组内依赖关系\n}\n```\n\n## 核心思想\n采用**分层拓扑排序**策略:\n1. 先确保小组间的依赖关系满足\n2. 再确保每个小组内部的项目依赖关系满足\n3. 通过双层 BFS 实现完整的排序逻辑\n\n这种解法有效地将复杂的依赖关系分解为两个相对简单的拓扑排序问题。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n for(let i = 0;i < n;i++){\n if(group[i] === -1) group[i] = m++;\n }\n\n let groupItems = new Array(m).fill(0).map(()=>[]);\n for(let i = 0;i < n;i++){\n groupItems[group[i]].push(i);\n }\n\n\n\n let itemG = new Array(n).fill(0).map(()=>[]);// 项目依赖关系建图\n let groupG = new Array(m).fill(0).map(()=>new Set());// 小组依赖关系建图\n let inID = new Array(n).fill(0);//每个项目的入度\n let inGD = new Array(m).fill(0);//每个小组的入度\n beforeItems.forEach((prevs,curr)=>{\n inID[curr] += prevs.length;\n for(let prev of prevs) {\n itemG[prev].push(curr);\n let u = group[prev],v = group[curr];\n if(u === v) continue;\n if(groupG[u].has(v)) continue;\n groupG[u].add(v);\n inGD[v]++;\n }\n });\n\n //console.log('小组依赖',groupG,groupItems);\n\n let ans = [],qG = new Queue();\n\n\n for(let i = 0;i <= m;i++){\n if(inGD[i] === 0) qG.enqueue(i);\n }\n while(qG.size()){\n let i = qG.dequeue();\n getItemsFromGroup(i);\n for(let j of groupG[i]){\n inGD[j]--;\n if(inGD[j] === 0) qG.enqueue(j);\n }\n }\n return ans.length === n ? ans : [];\n\n // ---------------------------------\n function getItemsFromGroup(g){\n let items = groupItems[g];\n let qI = new Queue();\n for(let i of items){\n if(inID[i] === 0) qI.enqueue(i);\n }\n while(qI.size()){\n let i = qI.dequeue();\n ans.push(i);\n for(let j of itemG[i]){\n inID[j]--;\n if(inID[j] === 0 && group[j] === g) qI.enqueue(j);\n }\n }\n }\n\n };\n```\n## 复杂度分析\n- **时间复杂度**:O(n + m + |beforeItems|) - 每个项目和依赖关系只被处理一次\n- **空间复杂度**:O(n + m) - 存储图结构和队列","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190382685","body":"## 思路\n没啥好说的,模拟就完了\n## 代码\n```javascript\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let x = 0,y = 0;\n for(let move of moves){\n if(move === 'U') x--;\n else if(move === 'D') x++;\n else if(move === 'L') y--;\n else y++;\n } \n return x === 0 && y === 0\n};\n```\n## 复杂度分析\n- 时间复杂度O(n)\n- 空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193453621","body":"## 思路\n\n### 主要步骤:\n\n1. **数据预处理**:\n - 将原始任务数组 [enqueueTime, processingTime] 扩展为 [enqueueTime, processingTime, index],保留原始索引信息\n - 按照入队时间(enqueueTime)对任务进行排序\n\n2. **使用优先队列**:\n - 创建一个优先队列,排序规则是:\n - 首先按处理时间(processingTime)升序排列\n - 如果处理时间相同,则按下标(index)升序排列\n\n3. **任务处理逻辑**:\n - 初始化结果数组和当前时间点(end)\n - 当还有未处理任务或优先队列不为空时:\n - 如果优先队列为空,将当前时间点更新为下一个任务的入队时间\n - 将所有在当前时间点之前或刚好到达的未处理任务加入优先队列\n - 从优先队列中取出优先级最高的任务执行\n - 更新当前时间点(加上该任务的处理时间)\n - 将该任务的原始索引加入结果数组\n\n### 关键点解释:\n\n- **优先队列的作用**:确保在可执行的任务中,总是选择处理时间最短的任务执行(最短作业优先调度算法)\n- **时间管理**:通过 [end] 变量追踪当前时间点,确保任务按时间顺序被考虑\n- **边界处理**:当优先队列为空时,直接跳转到下一个任务的入队时间,避免不必要的循环\n\n## 代码\n```javascript\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n let data = [],n = tasks.length;\n // 按任务入队时间排序,同时不丢失下标信息。\n tasks.forEach((v,i)=>data.push([...v,i])); \n data.sort((a,b)=>a[0] - b[0]);\n // 优先队列,优先级为:先按任务时长,再按下标\n let i = 0,q = new PriorityQueue((a,b)=>{\n if(a[1] !== b[1]) return a[1] - b[1];\n return a[2] - b[2];\n });\n\n let ans = [],end = 0;\n while(i < n || q.size()){\n if(q.size() === 0) end = Math.max(end,data[i][0]);\n while(i < n && data[i][0] <= end) q.enqueue(data[i++]);\n let [_,p,index] = q.dequeue();\n ans.push(index);\n end += p;\n }\n return ans;\n};\n```\n\n## 复杂度分析\n### 时间复杂度:\n- 排序:O(n log n)\n- 优先队列操作:每个任务最多入队和出队一次,每次操作 O(log n)\n- 总体复杂度:O(n log n)\n### 空间复杂度:\n- 需要一个优先队列及一个数组保存数据,空间复杂度为 O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194152066","body":"## 思路\n\n### 主要函数功能\n\n1. [numberOfRounds](file:///E:/力扣刷题/algorithm_exercises/.md#L4-L13) - 主函数,计算从登录到登出之间的完整游戏回合数\n2. [parseTime](file:///E:/力扣刷题/algorithm_exercises/.md#L16-L18) - 辅助函数,将时间字符串解析为小时和分钟\n3. [calc](file:///E:/力扣刷题/algorithm_exercises/.md#L20-L37) - 核心计算函数,计算两个时间之间的回合数\n\n### 解题思路\n\n1. **时间解析**:首先将登录时间和登出时间解析为小时和分钟的数组\n2. **跨天处理**:如果登出时间早于登录时间,说明跨越了午夜,需要在登出时间上加24小时\n3. **回合计算**:\n - 将登录时间向上取整到最近的15分钟倍数(下一回合开始时间)\n - 计算登出时间和登录时间之间的15分钟间隔数\n - 如果结果为负数,则返回0\n\n### 代码细节\n\n```javascript\n// 时间取整逻辑\nif(m1 <= 0) m1 = 0;\nelse if(m1 <= 15) m1 = 15;\nelse if(m1 <= 30) m1 = 30;\nelse if(m1 <= 45) m1 = 45;\nelse {\n m1 = 0;\n h1++;\n}\n```\n\n这个逻辑将登录时间向上取整到下一个回合开始时间(每15分钟为一个回合)。\n\n```javascript\nlet ans = Math.floor((h2 * 60 + m2 - (h1 * 60 + m1)) / 15);\n```\n这行代码计算两个时间点之间有多少个完整的15分钟时间段。\n\n## 代码\n```javascript\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n let [h1,m1] = parseTime(loginTime),[h2,m2] = parseTime(logoutTime);\n if(h1 < h2 || h1 === h2 && m1 < m2) return calc(h1,m1,h2,m2);\n return calc(h1,m1,h2 + 24,m2);\n // -------------------------\n function parseTime(time){\n return time.split(':').map(v=>Number(v));\n }\n\n function calc(h1,m1,h2,m2){\n if(m1 <= 0) m1 = 0;\n else if(m1 <= 15) m1 = 15;\n else if(m1 <= 30) m1 = 30;\n else if(m1 <= 45) m1 = 45;\n else {\n m1 = 0;\n h1++;\n }\n // console.log(h1,m1,h2,m2)\n let ans = Math.floor((h2 * 60 + m2 - (h1 * 60 + m1)) / 15);\n if(ans < 0) return 0;\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(1),因为解析时间和计算都是常数时间操作。\n- 空间复杂度:O(1),因为只使用了常数个变量。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3195140726","body":"## 思路\n\n### 主函数 `minCharacters`\n- 通过比较三种情况的最小值来得到最终答案:\n - `altb(a,b)`: 使 a 中所有字符 < b 中所有字符需要的操作数\n - `altb(b,a)`: 使 b 中所有字符 < a 中所有字符需要的操作数\n - `aeqb(a,b)`: 使两个字符串都由同一字符组成需要的操作数\n\n### 辅助函数分析\n\n1. **`altb(a,b)` 函数**\n - 遍历分割点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) (1-25,对应字符 'b'-'z')\n - 计算需要修改的字符数:\n - [a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27) 中所有 ≥ i 的字符都需要修改\n - `b` 中所有 < i 的字符都需要修改\n - 返回最小操作数\n\n2. **`aeqb(a,b)` 函数**\n - 统计两个字符串中各字符出现次数\n - 找到出现频率最高的字符\n - 将其他所有字符都修改为该字符即为最少操作数\n\n3. **`getCharValue` 函数**\n - 将字符转换为对应的数值 (a=0, b=1, ..., z=25)\n\n## 代码\n```javascript\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n return Math.min(altb(a,b),altb(b,a),aeqb(a,b));\n // --------------------------------------\n function altb(a,b){\n let ans = Infinity;\n for(let i = 1;i < 26;i++){\n let temp = 0;\n for(let c of a) if(getCharValue(c) >= i) temp++;\n for(let c of b) if(getCharValue(c) < i) temp++;\n ans = Math.min(ans,temp);\n }\n return ans;\n }\n\n function aeqb(a,b){\n let data = new Array(26).fill(0);\n for(let c of a) data[getCharValue(c)]++;\n for(let c of b) data[getCharValue(c)]++;\n let max = data.reduce((a,b)=>Math.max(a,b),0);\n return a.length + b.length - max;\n }\n\nfunction getCharValue(char){\n return char.charCodeAt(0) - 'a'.charCodeAt(0);\n }\n};\n```\n\n\n## 复杂度分析\n- 时间复杂度:O((m+n)×26) = O(m+n),其中 m 和 n 分别是字符串 a 和 b 的长度\n- 空间复杂度:O(1),只使用了固定大小的额外空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199063845","body":"## 思路\n使用**三路快排(Three-way QuickSort)**的实现,主要通过以下步骤完成排序:\n1. **选择基准值(pivot)**:使用 `viot` 函数选择一个合适的基准值\n2. **分区操作(partition)**:将数组分为三部分:小于基准值、等于基准值、大于基准值\n3. **递归排序**:对小于和大于基准值的两个子数组递归进行快排\n\n## 关键函数分析\n\n### 1. 主排序函数 `quickSort`\n```javascript\nfunction quickSort(l,r){\n if(l >= r) return;\n let i = viot(l,r); // 选择基准值位置\n if(r - l === 1) return;\n if(i !== l) swap(i,l); // 将基准值移到最左边\n let [low,up] = partition(l,r); // 三路分区\n quickSort(l,low - 1); // 递归排序小于基准值的部分\n quickSort(up + 1,r); // 递归排序大于基准值的部分\n}\n```\n\n\n### 2. 基准值选择 `viot`\n```javascript\nfunction viot(l,r){\n // 选择左、中、右三个元素作为候选\n let a = nums[l], c = nums[r];\n let mid = (l + r) >> 1, b = nums[mid];\n \n // 通过比较这三个值选择一个较优的基准值位置\n // 实现了三数取中法的思想\n}\n```\n\n\n### 3. 三路分区 [partition](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题02.04.分割链表\\main.js#L15-L48)\n```javascript\nfunction partition(i,j){\n let viot = nums[i], l = i - 1, r = j + 1;\n for(let k = i; k < r; k++){\n let c = nums[k];\n if(c > viot){\n r--;\n swap(k,r);\n k--; // 交换后需要重新检查当前位置\n }else if(c < viot){\n l++;\n swap(k,l);\n }\n // c === viot 时,元素保持在中间区域\n }\n return [l + 1, r - 1]; // 返回等于基准值的区间边界\n}\n```\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function(nums) {\n quickSort(0,nums.length - 1);\n return nums;\n // -------------------------\n function quickSort(l,r){\n if(l >= r) return;\n // console.log(l,r,nums);\n // 找基准值位置\n let i = viot(l,r);\n if(r - l === 1) return;\n if(i !== l) swap(i,l);\n // console.log('viot',nums[l]);\n let [low,up] = partition(l,r);\n // console.log(mid,nums);\n quickSort(l,low - 1);\n quickSort(up + 1,r);\n }\n\n function partition(i,j){\n let viot = nums[i],l = i - 1,r = j + 1;\n for(let k = i;k < r;k++){\n let c = nums[k];\n if(c > viot){\n r--;\n swap(k,r);\n k--;\n }else if(c < viot){\n l++;\n swap(k,l);\n }\n }\n return [l + 1,r - 1];\n }\n\n function viot(l,r){\n let a = nums[l],c = nums[r];\n if(a > c){\n swap(l,r);\n a = nums[l];\n c = nums[r];\n }\n if(r - l === 1) return;\n let mid = (l + r) >> 1,b = nums[mid];\n // if(a === c && a === b) return l;\n if(a === c) return a < b ? l : mid;\n if(b === a || b === c) return l;\n else if(b < a) return l;\n else if(b > a && b < c) return mid;\n return r;\n }\n\n function swap(l,r){\n [nums[l],nums[r]] = [nums[r],nums[l]];\n }\n };\n```\n\n## 复杂度分析\n- **三路快排**:能够很好地处理有重复元素的数组,将相等元素聚集在一起\n- **优化的基准值选择**:使用三数取中法减少最坏情况的发生\n- **原地排序**:不需要额外的存储空间\n- **时间复杂度**:平均 O(n log n),最坏 O(n²)\n- **空间复杂度**:O(log n)(递归调用栈)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204104013","body":"## 思路\n\n### 2. 初始化变量\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31):二分查找的左边界,初始值为 `0`。\n- `r`:二分查找的右边界,初始值为 `x`。\n- `ans`:用于记录当前找到的满足条件的最大整数平方根,初始值为 `0`。\n\n### 3. 二分查找过程\n- 循环条件为 `l <= r`,表示在左边界小于等于右边界时继续查找。\n- 计算中间值 `mid`:\n ```javascript\n let mid = l + ((r - l) >> 1);\n ```\n\n 这里使用了位运算 `>> 1` 来代替除以 `2` 的操作,目的是提高计算效率。\n- 判断逻辑:\n - 如果 `mid * mid <= x`,说明 `mid` 可能是答案,但还可能有更大的值满足条件,因此更新 `ans = mid` 并将左边界右移:`l = mid + 1`。\n - 否则,说明 `mid` 太大,需要将右边界左移:`r = mid - 1`。\n\n### 4. 返回结果\n- 最终返回 `ans`,即找到的满足条件的最大整数平方根。\n\n\n## 代码\n```javascript\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n let l = 0,r = x,ans = 0;\n while(l <= r){\n let mid = l + ((r - l) >> 1);\n if(mid * mid <= x){\n ans = mid\n l = mid + 1;\n }else{\n r = mid - 1;\n }\n }\n return ans;\n};\n```\n### 复杂度分析\n- 时间复杂度为 `O(log x)`,因为采用了二分查找策略。\n- 空间复杂度为 `O(1)`,只使用了常数级别的额外空间。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208885502","body":"## 思路\n\n### 1. 二分查找策略\n- 使用 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31) 和 `r` 维护搜索区间 `[1, n]`\n- 通过 `mid = l + ((r - l) >> 1)` 计算中点,避免整数溢出\n- 根据 `isBadVersion(mid)` 的结果调整搜索区间\n\n### 2. 搜索逻辑\n- 如果 `isBadVersion(mid)` 返回 `true`(当前版本是错误的):\n - 记录当前版本为候选答案 `ans = mid`\n - 在左半区间继续搜索 `r = mid - 1`\n- 如果返回 `false`(当前版本是正确的):\n - 在右半区间继续搜索 `l = mid + 1`\n\n\n\n## 代码\n```javascript\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let l = 1,r = n,ans = 1;\n while(l <= r){\n let mid = l + ((r - l) >> 1);\n if(isBadVersion(mid)){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n };\n};\n```\n## 复杂度分析\n- 时间复杂度:O(log n)\n- 空间复杂度:O(1)\n- 通过不断缩小区间范围,最终找到第一个错误版本","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3213065724","body":"## 思路\n\n1. **归并排序框架**:使用分治思想,将数组不断二分,递归处理左右两部分\n2. **关键逻辑**:在合并两个有序数组时,统计满足 `nums[i] > 2 * nums[j]` 条件的翻转对数量\n\n## 代码结构分析\n\n### 主函数 `reversePairs`\n- 初始化变量和临时数组\n- 调用 `sort` 函数进行归并排序\n- 返回统计结果 `ans`\n\n### 排序函数 `sort`\n- 标准的归并排序递归结构\n- 将数组 `[l, r]` 分为 `[l, mid]` 和 `[mid+1, r]` 两部分\n- 递归排序后调用 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 合并\n\n### 合并函数 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37)\n包含两个主要步骤:\n\n1. **统计翻转对**:\n ```javascript\n if(nums[i] / 2 > nums[j]){\n ans += mid - i + 1;\n j++;\n }else i++;\n ```\n\n - 利用左右两部分已排序的特性\n - 当 `nums[i] > 2 * nums[j]` 时,说明从 `i` 到 `mid` 的所有元素都与 `nums[j]` 构成翻转对\n\n2. **标准归并**:\n - 将两个有序数组合并为一个有序数组\n - 使用 `temp` 数组作为临时存储\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n let n = nums.length,ans = 0;\n let temp = new Array(n);\n sort(0,n - 1);\n return ans;\n // -----------------------\n function sort(l,r){\n if(l >= r) return;\n let mid = (l + r) >> 1;\n sort(l,mid);\n sort(mid + 1,r);\n merge(l,r,mid);\n }\n\n function merge(left,right,mid){\n let i = left,j = mid + 1,p = left;\n while(i <= mid && j <= right){\n if(nums[i] / 2 > nums[j]){\n ans += mid - i + 1;\n j++;\n }else i++;\n }\n\n i = left;\n j = mid + 1;\n while(i <= mid || j <= right){\n if(j > right || i <= mid && nums[i] < nums[j]) temp[p++] = nums[i++];\n else temp[p++] = nums[j++];\n }\n\n for(let i = left;i <= right;i++) nums[i] = temp[i];\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n)\n- 空间复杂度:O(n)\n- 利用归并排序过程中数组局部有序的特性,高效统计翻转对\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216251902","body":"\n## 思路\n\n1. **排序处理**:\n - 首先对供暖器数组进行排序,这样便于后续的二分查找操作。\n\n2. **边界处理**:\n - 在供暖器数组的两端分别添加`-Infinity`和`Infinity`,这样可以简化边界条件的处理,避免在查找过程中需要特殊判断边界情况。\n\n3. **核心算法**:\n - 对每个房屋,通过[egt](file:///E:/力扣刷题/algorithm_exercises/91天学算法/day40/.md#L22-L33)函数找到第一个大于等于该房屋位置的供暖器位置\n - 然后比较该房屋与前一个供暖器和后一个供暖器的距离,取较小值作为该房屋所需的最小加热半径\n - 在所有房屋所需的最小加热半径中取最大值,就是能覆盖所有房屋的最小加热半径\n\n4. **二分查找优化**:\n - [egt](file:///E:/力扣刷题/algorithm_exercises/91天学算法/day40/.md#L22-L33)函数使用二分查找来快速定位第一个大于等于目标值的供暖器位置,时间复杂度从O(n)降低到O(log n)\n\n## 具体实现细节\n\n- `heaters[j] - house`表示房屋到右边最近供暖器的距离\n- `house - heaters[i]`表示房屋到左边最近供暖器的距离\n- `Math.min(heaters[j] - house, house - heaters[i])`得到该房屋需要的最小加热半径\n- `Math.max(ans, r)`维护所有房屋中需要的最大加热半径\n\n## 代码\n```javascript\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n const compare = (a,b) => a - b;\n heaters.sort(compare);\n heaters.push(Infinity);\n heaters.unshift(-Infinity);\n let ans = -Infinity;\n for(let house of houses){\n let j = egt(house),i = j - 1;\n r = Math.min(heaters[j] - house,house - heaters[i]);\n ans = Math.max(ans,r);\n }\n return ans;\n // -------------------------\n function egt(target){\n let l = 0,r = heaters.length - 1,ans = r + 1;\n while(l <= r){\n let mid = (l + r) >> 1\n if(heaters[mid] >= target){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(mlogn + nlogn),其中m是房屋数量。排序的时间复杂度为O(nlogn),二分查找的时间复杂度为O(logn),因此总时间复杂度为O(nlogn + mlogn)。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217776735","body":"## 思路\n\n使用了**二分搜索 + 双指针**的方法来解决问题:\n\n### 1. 排序\n```javascript\nnums.sort((a,b) => a - b);\n```\n\n首先对数组进行排序,这样可以方便后续计算距离和使用双指针技巧。\n\n### 2. 二分搜索框架\n```javascript\nlet n = nums.length;\nlet r = nums[n - 1] - nums[0], l = 0, ans = 0;\nwhile(l <= r){\n let mid = (l + r) >> 1;\n let cnt = calc(mid);\n if(cnt >= k){\n ans = mid;\n r = mid - 1;\n } else {\n l = mid + 1;\n }\n}\n```\n\n这里使用二分搜索来查找第k小的距离:\n- 搜索范围是 `[0, max_distance]`,其中 `max_distance = nums[n-1] - nums[0]`\n- 对于每个中间值 `mid`,计算有多少个数对的距离小于等于 `mid`\n- 如果数量大于等于 `k`,说明第k小的距离可能就是 `mid` 或者比 `mid` 更小\n- 如果数量小于 `k`,说明第k小的距离一定比 `mid` 更大\n\n### 3. 计算函数 calc\n```javascript\nfunction calc(mid){\n let l = 0, r = -1, ans = 0;\n while(l < n){\n while(r + 1 < n && nums[r + 1] - nums[l] <= mid) r++;\n if(r >= l) ans += r - l;\n l++;\n }\n return ans\n}\n```\n\n这个函数使用双指针技巧计算有多少个数对的距离小于等于给定值 [mid](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\462\\2.js#L20-L20):\n- 外层循环固定左指针 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\461\\3.js#L34-L34)\n- 内层循环移动右指针 `r`,直到 `nums[r] - nums[l] > mid`\n- 此时对于固定的 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\461\\3.js#L34-L34),有 `r - l` 个数对的距离小于等于 [mid](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\462\\2.js#L20-L20)\n- 累加所有可能的数对数量\n\n\n\n## 举例说明\n\n以 `nums = [1,3,1]`, `k = 1` 为例:\n1. 排序后:`[1,1,3]`\n2. 距离范围:`[0, 2]`\n3. 二分搜索过程:\n - `mid = 1`,计算距离 <= 1 的数对有 1 个(`(1,1)`)\n - 因为 1 >= k(1),所以 `ans = 1`,继续搜索左半部分\n - `mid = 0`,计算距离 <= 0 的数对有 1 个(`(1,1)`)\n - 因为 1 >= k(1),所以 `ans = 0`\n4. 返回结果 0\n\n这个解法非常巧妙地结合了二分搜索和双指针技巧,避免了直接计算所有数对距离的 O(n²) 复杂度。\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a,b) => a - b);\n let n = nums.length;\n let r = nums[n - 1] - nums[0],l = 0,ans = 0;\n while(l <= r){\n let mid = (l + r) >> 1;\n let cnt = calc(mid);\n if(cnt >= k){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n // ----------------------\n function calc(mid){\n let l = 0,r = -1,ans = 0;\n while(l < n){\n while(r + 1 < n && nums[r + 1] - nums[l] <= mid) r++;\n if(r >= l) ans += r - l;\n l++;\n }\n return ans\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n + n log D),其中 n 是数组长度,D 是最大距离\n - 排序需要 O(n log n)\n - 二分搜索需要 log D 次,每次调用 calc 函数需要 O(n)\n- 空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218701829","body":"## 思路\n\n1. **使用优先队列的BFS**:\n - 采用 `MinPriorityQueue` 实现 Dijkstra 算法变体\n - 每个元素存储 `[行, 列, 高度]`,按高度排序\n\n2. **状态表示**:\n - `vis` 数组标记已访问的格子,防止重复访问\n - `ans` 记录到达当前位置所需的最大高度(即所需最低水位)\n\n3. **搜索过程**:\n - 从起点 `(0,0)` 开始,每次选择高度最低的相邻格子\n - 更新所需最低水位为路径上遇到的最大高度\n - 直到到达终点 `(n-1,n-1)`\n\n## 关键步骤\n\n- **初始化**:标记起点已访问,将起点加入优先队列\n- **主循环**:不断取出队列中高度最低的位置\n- **更新答案**:记录路径上的最大高度值\n- **探索邻居**:向四个方向扩展未访问的邻居节点\n- **终止条件**:到达右下角时结束搜索\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n let n = grid.length,vis = new Array(n).fill(0).map(()=>new Array(n).fill(0));\n vis[0][0] = 1;\n const q = new MinPriorityQueue(v=>v[2]);\n q.enqueue([0,0,grid[0][0]]);\n let ans = 0;\n const direction = [[0,1],[1,0],[0,-1],[-1,0]];\n while(q.size()){\n let [i,j,t] = q.dequeue();\n ans = Math.max(ans,t);\n if(i === n - 1 && j === n - 1) break;\n for(let d of direction){\n let x = d[0] + i,y = d[1] + j;\n if(x >= 0 && x < n && y >= 0 && y < n){\n if(vis[x][y]) continue;\n vis[x][y] = 1;\n q.enqueue([x,y,grid[x][y]]);\n }\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n²logn),其中 n 是矩阵的边长。\n- 空间复杂度:O(n²),用于存储 vis 数组和优先队列。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222257413","body":"## 思路\n\n使用**滑动窗口**(Sliding Window)技术来解决这个问题,通过维护一个固定大小为 `k` 的窗口来遍历整个字符串。\n\n## 关键变量说明\n\n- `r`: 右指针,初始化为 -1\n- [n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6): 字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- `ans`: 记录找到的最大元音字母数\n- `total`: 当前窗口内元音字母的总数\n- [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6): 左指针,表示窗口的起始位置\n\n## 算法流程\n\n1. **外层循环**:[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 从 0 到 `n-k`,表示窗口的左边界\n ```javascript\n for(let i = 0; i <= n - k; i++)\n ```\n\n\n2. **扩展窗口**:使用 `while` 循环将右指针 `r` 向右扩展,直到窗口大小达到 `k`\n ```javascript\n while(r + 1 < n && r - i + 1 < k){\n r++;\n if(isYuanYin(s[r])) total++;\n }\n ```\n\n - 条件 `r + 1 < n` 确保不越界\n - 条件 `r - i + 1 < k` 确保窗口大小不超过 `k`\n - 每次扩展时检查新加入的字符是否为元音,并更新 `total`\n\n3. **更新最大值**:比较当前窗口的元音数量与历史最大值\n ```javascript\n ans = Math.max(ans, total);\n ```\n\n\n4. **收缩窗口**:移动左指针前,如果当前左边界字符是元音,则从总数中减去\n ```javascript\n if(isYuanYin(s[i])) total--;\n ```\n\n\n## 辅助函数\n\n```javascript\nfunction isYuanYin(c){\n return ['a','e','i','o','u'].includes(c);\n}\n```\n\n用于判断字符是否为元音字母。\n\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n let r = -1, n = s.length,ans = 0,total = 0;\n for(let i = 0;i <= n - k;i++){\n while(r + 1 < n && r - i + 1 < k){\n r++;\n if(isYuanYin(s[r])) total++;\n }\n ans = Math.max(ans,total);\n if(isYuanYin(s[i])) total--;\n }\n return ans;\n // -------------------------\n function isYuanYin(c){\n return ['a','e','i','o','u'].includes(c);\n }\n };\n```\n## 复杂度分析\n\n- 时间复杂度:O(n),其中 n 是字符串长度,每个字符最多被访问两次\n- 空间复杂度:O(1),只使用了常数额外空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3227100052","body":"## 思路\n\n### 核心技巧\n- 维护一个大小为maxPts的滑动窗口\n- 使用`sum`变量维护当前窗口内所有可能结果的概率和\n- 通过`sum -= r`和`sum += dp[i]`维护窗口滑动\n\n### 1. 边界条件处理\n```javascript\nif(0 >= k) return 0 <= n ? 1 : 0;\n```\n\n- 当目标分数`k`为0或负数时,游戏一开始就结束\n- 如果[n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6)非负,则概率为1,否则为0\n\n### 2. 初始化阶段\n```javascript\nlet sum = 0;\nfor(let i = k;i < k + maxPts;i++){\n if(i <= n) sum += 1;\n}\n```\n\n- 计算从刚好达到`k`分开始,可能到达的最高分数范围`[k, k+maxPts-1]`中满足≤n的数目\n- 这些状态的概率都是1(因为游戏结束)\n\n### 3. 动态规划倒推\n```javascript\nlet j = k + maxPts - 1, r = j <= n ? 1 : 0;\nlet dp = new Array(k).fill(0);\nfor(let i = k - 1;i >= 0;i--){\n dp[i] = sum / maxPts;\n sum -= r;\n sum += dp[i];\n j--;\n if(j >= k) r = j <= n ? 1 : 0;\n else r = dp[j];\n}\n```\n\n\n- 从`k-1`分开始倒推到0分\n- `dp[i]`表示从[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)分开始游戏获胜的概率\n- 状态转移方程:`dp[i] = (dp[i+1] + dp[i+2] + ... + dp[i+maxPts]) / maxPts`\n- 使用滑动窗口优化:维护`sum`为窗口内所有概率之和\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n if(0 >= k) return 0 <= n ? 1 : 0;\n \n let sum = 0;\n for(let i = k;i < k + maxPts;i++){\n if(i <= n) sum += 1;\n }\n let j = k + maxPts - 1, r = j <= n ? 1 : 0;\n let dp = new Array(k).fill(0);\n for(let i = k - 1;i >= 0;i--){\n dp[i] = sum / maxPts;\n sum -= r;\n sum += dp[i];\n j--;\n if(j >= k) r = j <= n ? 1 : 0;\n else r = dp[j];\n }\n return dp[0];\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(k + maxPts),其中k为`k`的取值范围\n- 空间复杂度:O(k)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3231026577","body":"## 思路\n\n1. **滑动窗口 + 字符频次统计**\n - 使用两个长度为26的数组(`pMap` 和 `sMap`)分别统计模式串 `p` 和当前窗口内子串的字符频次\n - 通过滑动窗口在 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 中寻找与 `p` 字符频次完全相同的子串\n\n2. **算法流程**\n - 首先调用 `getPmap()` 统计 `p` 中各字符出现次数\n - 初始化滑动窗口左右边界 `l=0, r=-1`\n - 在每次循环中:\n - 扩展右边界直到窗口大小等于 `p` 的长度\n - 比较当前窗口字符频次与 `p` 的字符频次是否相同\n - 如果相同,则将左边界位置加入结果数组\n - 移动左边界,更新窗口字符频次\n\n## 关键函数说明\n\n- `getPmap()`: 统计模式串 `p` 中每个字符的出现次数\n- `equal(arr1, arr2)`: 比较两个字符频次数组是否完全相同\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nvar findAnagrams = function(s, p) {\n const pMap = new Array(26).fill(0),k = p.length;\n getPmap();\n let ans = []\n let n = s.length,l = 0,r = -1,sMap = new Array(26).fill(0);\n while(l <= n - k){\n while(r + 1 < n && r - l + 1 < k){\n r++;\n let c = s[r]\n sMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;\n }\n if(equal(pMap,sMap)) ans.push(l);\n let c = s[l++];\n sMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]--;\n }\n return ans;\n // --------------------------------------------------------\n function getPmap(){\n for(let c of p){\n pMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;\n }\n }\n function equal(arr1,arr2){\n for(let i = 0;i < 26;i++){\n if(arr1[i] !== arr2[i]) return false;\n }\n return true;\n }\n };\n```\n## 复杂度分析\n\n- 时间复杂度:O(n),其中 n 是字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- 空间复杂度:O(1),只使用了固定大小的数组存储字符频次","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235816649","body":"## 思路\n\n### 核心思想\n- 使用**滑动窗口**技术\n- 维护一个动态窗口 `[l, r]`,通过双指针扩展和收缩窗口\n- 统计窗口内字符频次,确保包含 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中所有字符及其所需数量\n\n### 主要步骤\n\n1. **初始化阶段**\n - `tMap`:统计字符串 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中各字符出现次数\n - `LIMIT`:记录 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中不同字符的数量\n - `sMap`:统计当前窗口中各字符出现次数\n - `total`:记录窗口中已满足数量要求的字符种类数\n\n2. **滑动窗口主循环**\n - 外层循环移动左指针 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31)\n - 内层循环扩展右指针 `r`,直到窗口包含 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的所有字符\n - 当窗口满足条件时,尝试更新最优解\n\n3. **结果更新**\n - 使用 `check` 函数比较当前窗口与历史最优解\n - 选择更短的子串,长度相同时选择字典序更小的\n\n### check函数作用\n用于比较两个子串,选择更优的结果:\n- 优先选择长度更短的子串\n- 长度相同时选择字典序更小的\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nvar minWindow = function(s, t) {\n let tMap = {},ans = '';\n for(let c of t) tMap[c] = (tMap[c] || 0) + 1;\n const LIMIT = Object.keys(tMap).length;\n let n = s.length,l = 0,r = -1,total = 0,sMap = {};\n while(l < n){\n while(r + 1 < n && total < LIMIT){\n r++;\n let c = s[r];\n sMap[c] = (sMap[c] || 0) + 1;\n if(sMap[c] === tMap[c]) total++;\n }\n if(total === LIMIT){\n let tmp = s.slice(l,r + 1);\n if(check(tmp)) ans = tmp;\n }\n let c = s[l];\n if(sMap[c] === tMap[c]) total--;\n sMap[c]--;\n l++;\n }\n return ans;\n // ------------------------\n function check(tmp){\n if(ans === '') return true;\n if(tmp.length < ans.length) return true;\n if(tmp.length > ans.length) return false;\n for(let i = 0;i < tmp.length;i++){\n let a = tmp.charCodeAt(i),b = ans.charCodeAt(i);\n if(a < b) return true;\n if(a === b) continue;\n if(a > b) return false;\n }\n return false;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是字符串 [s](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的长度。\n- 空间复杂度:O(t),其中 t 是字符串 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的字符串种类。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/50#issuecomment-3238889944","body":"## 思路\n\n1. **前缀和与后缀和预处理**:\n - [preSum](file:///E:/力扣刷题/algorithm_exercises/周赛/458/2.js#L10-L10)数组存储从左端开始的前缀和\n - [sufSum](file:///E:/力扣刷题/algorithm_exercises/周赛/458/2.js#L15-L15)数组存储从右端开始的后缀和\n\n2. **核心思想**:\n - 我们需要从两端取k张卡牌,可以是左边取i张,右边取k-i张(i从0到k)\n - 通过预处理的前缀和与后缀和数组,可以快速计算任意数量卡牌的点数和\n\n3. **遍历所有可能的组合**:\n - 遍历i从0到k,表示从左边取i张卡牌\n - 对应从右边取k-i张卡牌\n - 计算总和并更新最大值\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} cardPoints\n * @param {number} k\n * @return {number}\n */\nvar maxScore = function(cardPoints, k) {\n let n = cardPoints.length;\n const preSum = new Array(n + 1).fill(0),sufSum = new Array(n + 1).fill(0);\n for(let i = 0;i < n;i++){\n preSum[i + 1] = preSum[i] + cardPoints[i];\n sufSum[i + 1] = sufSum[i] + cardPoints[n - i - 1];\n }\n let ans = -Infinity;\n for(let i = 0;i <= k;i++){\n ans = Math.max(ans,preSum[i] + sufSum[k - i]);\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(n+k),\n- 空间复杂度是O(n),其中n是数组长度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3239927488","body":"## 代路\n\n采用预计算和枚举的方法来解决问题:\n\n1. **预计算 *<60* 以内每个数字的二进制1的个数**:\n ```javascript\n const CNT = new Array(60).fill(0);\n for(let i = 0;i <= 59;i++){\n let n = i,t = 0;\n while(n){\n if(n & 1) t++;\n n >>= 1;\n }\n CNT[i] = t;\n }\n ```\n\n\n2. **枚举小时和分钟的分配**:\n ```javascript\n for(let i = 0;i <= 4;i++){\n let j = turnedOn - i;\n if(j > 6) continue;\n // ...\n }\n ```\n\n 这里将turnedOn个LED灯分为两部分:i个给小时部分,j个给分钟部分。由于小时最多由4个LED表示,分钟最多由6个LED表示,所以i最多为4,j最多为6。\n\n3. **获取符合条件的小时和分钟**:\n 通过`getHour(cnt)`和`getM(cnt)`函数获取二进制中恰好有cnt个1的小时数和分钟数。\n\n4. **组合时间**:\n 将符合条件的小时和分钟组合成时间字符串,格式为`H:MM`。\n\n## 代码优点\n\n1. **预计算优化**:提前计算所有0-59数字的二进制1的个数,避免重复计算\n2. **分离关注点**:将获取小时和分钟的逻辑分别封装在独立函数中\n3. **合理的边界处理**:考虑到小时(0-11)和分钟(0-59)的范围限制\n4. **正确的格式化**:分钟数始终显示为两位数\n\n\n## 代码\n```javascript\nconst CNT = new Array(60).fill(0);\nfor(let i = 0;i <= 59;i++){\n let n = i,t = 0;\n while(n){\n if(n & 1) t++;\n n >>= 1;\n }\n CNT[i] = t;\n}\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n let ans = []\n for(let i = 0;i <= 4;i++){\n let j = turnedOn - i;\n if(j > 6) continue;\n for(let h of getHour(i)){\n for(let m of getM(j)){\n ans.push(`${h}:${m}`)\n }\n }\n }\n return ans;\n\n // ------------------------------\n function getHour(cnt){\n let ans = [];\n for(let i = 0;i <= 11;i++){\n if(CNT[i] === cnt) ans.push(i);\n }\n return ans\n }\n\n function getM(cnt){\n let ans = [];\n for(let i = 0;i <= 59;i++){\n if(CNT[i] === cnt) ans.push(i < 10 ? '0' + i : i);\n }\n return ans\n }\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(1),因为小时和分钟的范围是固定的(12*60种组合)\n- **空间复杂度**:O(1),只使用了固定大小的额外空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240725656","body":"\n## 思路\n\n### 1. 位运算优化\n- 使用位运算来表示和检查约束条件:\n - `colSet`:记录已被占用的列\n - `pieSet`:记录已被占用的主对角线(撇)\n - `naSet`:记录已被占用的副对角线(捺)\n\n### 2. 对角线编号\n- 主对角线(撇):用 `i + j` 编号\n- 副对角线(捺):用 `i - j + N` 编号(确保非负)\n\n### 3. DFS 回溯过程\n- 逐行放置皇后(第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 行)\n- 对每行的每一列 `j` 检查是否可放置:\n - 通过位运算检查列、主对角线、副对角线是否冲突\n- 若无冲突则放置皇后并更新状态,递归处理下一行\n- 回溯时撤销状态更改\n\n### 4. 位操作技巧\n- `(x >> k) & 1`:检查第 k 位是否为 1\n- `x ^= (1 << k)`:翻转第 k 位(设置或取消占用)\n\n当成功放置完所有 n 行皇后时,返回 1(找到一种方案),最终统计所有可行方案数。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let colSet = 0,N = 2 * n - 1,pieSet = 0,naSet = 0;\n return dfs(0);\n // -------------------\n function dfs(i){\n if(i === n) return 1;\n let ans = 0;\n for(let j = 0;j < n;j++){\n let col = j,pie = i + j,na = (i - j + N) % N;\n if(((colSet >> col) & 1) || ((pieSet >> pie) & 1) ||((naSet >> na) & 1)) continue;\n colSet ^= (1 << col);\n pieSet ^= (1 << pie);\n naSet ^= (1 << na);\n ans += dfs(i + 1);\n colSet ^= (1 << col);\n pieSet ^= (1 << pie);\n naSet ^= (1 << na);\n }\n return ans;\n }\n};\n```\n## 复杂度分析\n- 时间复杂度:O(N!),其中 N 为输入的行数。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243912780","body":"## 思路\n\n1. **初始化**:\n - 获取网格的行数(m)和列数(n)\n - 创建访问标记数组vis,避免重复访问\n - 初始化最大面积ans为0\n\n2. **遍历网格**:\n - 遍历每个格子,如果当前格子是0(海洋)或已被访问,则跳过\n - 否则,从当前位置开始进行BFS搜索整个岛屿\n\n3. **BFS搜索**:\n - 使用队列实现广度优先搜索\n - 从起始点开始,向四个方向扩展\n - 对于每个有效的相邻陆地格子(值为1且未访问),标记为已访问并加入队列\n - 统计当前岛屿的面积\n\n4. **更新结果**:\n - 每次BFS完成后,比较当前岛屿面积和已知最大面积,保留较大值\n\n## 具体实现细节\n\n- 使用Queue数据结构实现BFS\n- 四个方向数组dirs用于简化方向处理\n- vis数组防止重复访问同一格子\n- 边界检查确保不越界\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n let m = grid.length,n = grid[0].length;\n let ans = 0;\n let vis = new Array(m).fill(0).map(()=>new Array(n).fill(0));\n for(let i = 0;i < m;i++){\n for(let j = 0;j = 0 && r < m && c >= 0 && c < n){\n if(grid[r][c] === 0) continue;\n if(vis[r][c]) continue;\n vis[r][c] = 1;\n q.enqueue([r,c]);\n }\n }\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(m×n)\n- 空间复杂度是O(m×n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247579876","body":"## 思路\n\n这是一个典型的多源BFS(广度优先搜索)问题。代码采用逆向思维,不是从海洋格子找最近的陆地,而是从所有陆地格子出发,向外扩展到海洋格子,计算每个海洋格子到最近陆地的距离。\n\n## 算法步骤\n\n1. 初始化一个与原网格同样大小的距离矩阵`dis`,所有值初始化为无穷大\n2. 遍历原网格,将所有陆地格子(值为1)的坐标和距离0加入队列,作为BFS的起点\n3. 使用BFS遍历:\n - 从队列中取出一个位置\n - 如果当前位置的距离小于记录的距离,则更新距离\n - 如果当前位置是海洋,则更新最大距离\n - 向四个方向扩展,将合法的海洋格子加入队列\n4. 返回找到的最大距离,如果不存在海洋或陆地则返回-1\n\n## 代码\n\n```javascript\nvar maxDistance = function(grid) {\n let n = grid.length;\n // 创建一个距离矩阵,初始化为无穷大\n let dis = new Array(n).fill(0).map(()=>new Array(n).fill(Infinity));\n let q = new Queue();\n \n // 将所有陆地格子(值为1)作为BFS的起始点\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(grid[i][j] === 0) continue;\n q.enqueue([i,j,0]); // [行, 列, 距离]\n }\n }\n\n // 四个方向的移动:右、下、左、上\n const dirs = [[0,1],[1,0],[0,-1],[-1,0]];\n let ans = -Infinity;\n \n // BFS遍历\n while(q.size()){\n let [i,j,d] = q.dequeue();\n \n // 如果当前距离大于等于已记录的距离,则跳过\n if(d >= dis[i][j]) continue;\n \n // 更新当前位置的距离\n dis[i][j] = d;\n \n // 如果当前位置是海洋(值为0),更新最大距离\n if(grid[i][j] === 0) ans = Math.max(ans,dis[i][j]);\n \n // 向四个方向扩展\n for(let [x,y] of dirs.map(v=>[v[0] + i,v[1] + j])){\n // 检查边界\n if(x < 0 || x >= n || y < 0 || y >= n) continue;\n // 如果是陆地则跳过\n if(grid[x][y] === 1) continue;\n // 如果新距离大于等于已记录距离则跳过\n if(d + 1 >= dis[x][y]) continue;\n // 将新位置加入队列\n q.enqueue([x,y,d + 1]);\n }\n }\n \n // 返回结果,如果没找到海洋格子则返回-1\n return ans === -Infinity ? -1 : ans === Infinity ? -1 : ans; \n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n²),每个格子最多被访问一次\n- 空间复杂度:O(n²),需要存储距离矩阵和队列\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251721463","body":"## 问题理解\n\n这个问题是一个图遍历问题,涉及以下概念:\n- 有n个盒子,每个盒子可能包含糖果、钥匙和内部盒子\n- 某些盒子是打开的(status[i] = 1),某些是关闭的(status[i] = 0)\n- 只有拿到钥匙才能打开关闭的盒子\n- 初始时有一些盒子(initialBoxes)\n- 目标是获得尽可能多的糖果\n\n## 思路\n\n### 1. 初始化阶段\n```javascript\nlet n = status.length, ans = 0,\nhas_key = new Array(n).fill(0),\nhas_box = new Array(n).fill(0);\n```\n\n- `n`: 盒子总数\n- `ans`: 最终获得的糖果总数\n- `has_key`: 标记是否拥有某个盒子的钥匙\n- `has_box`: 标记是否拥有某个盒子\n\n### 2. 设置初始状态\n```javascript\nfor(let i = 0; i < n; i++) if(status[i]) has_key[i] = 1;\nfor(let i of initialBoxes) has_box[i] = 1;\n```\n\n- 将所有本来就是打开状态的盒子(status[i] = 1)标记为拥有钥匙\n- 将初始拥有的盒子标记为已拥有\n\n### 3. DFS遍历获取糖果\n```javascript\nlet vis = new Array(n).fill(0);\nfor(let i of initialBoxes){\n if(has_box[i] && has_key[i] && !vis[i]) dfs(i);\n}\n```\n\n- `vis`: 标记盒子是否已经访问过\n- 对于每个初始盒子,如果既拥有盒子又有钥匙且未访问过,则进行DFS\n\n### 4. DFS函数实现\n```javascript\nfunction dfs(i){\n ans += candies[i]; // 收集当前盒子的糖果\n vis[i] = 1; // 标记为已访问\n for(let j of keys[i]){ // 遍历当前盒子中的钥匙\n has_key[j] = 1; // 获得钥匙\n if(has_box[j] && !vis[j]) dfs(j); // 如果拥有对应盒子且未访问,则继续DFS\n }\n for(let j of containedBoxes[i]){ // 遍历当前盒子中的内部盒子\n has_box[j] = 1; // 获得盒子\n if(has_key[j]&& !vis[j]) dfs(j); // 如果拥有对应钥匙且未访问,则继续DFS\n }\n}\n```\n\n\n## 算法流程总结\n\n1. **初始化状态**:记录每个盒子的初始状态(是否打开)和初始拥有的盒子\n2. **深度优先搜索**:从初始盒子开始,只有当同时拥有盒子和钥匙时才能打开盒子\n3. **收集资源**:打开盒子后获得糖果、钥匙和内部盒子\n4. **继续探索**:利用新获得的钥匙或盒子继续打开新的盒子\n5. **避免重复**:使用vis数组确保每个盒子只被访问一次\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n let n = status.length,ans = 0,\n has_key = new Array(n).fill(0),\n has_box = new Array(n).fill(0);\n for(let i = 0;i < n;i++) if(status[i]) has_key[i] = 1;\n for(let i of initialBoxes) has_box[i] = 1;\n let vis = new Array(n).fill(0);\n for(let i of initialBoxes){\n if(has_box[i] && has_key[i] && !vis[i]) dfs(i);\n }\n return ans;\n // ----------------------------------------\n function dfs(i){\n ans += candies[i];\n vis[i] = 1;\n for(let j of keys[i]){\n has_key[j] = 1;\n if(has_box[j] && !vis[j]) dfs(j);\n }\n for(let j of containedBoxes[i]){\n has_box[j] = 1;\n if(has_key[j]&& !vis[j]) dfs(j);\n }\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度为O(N + E),其中N是盒子数量,E是钥匙和内部盒子的总数。\n- 空间复杂度为O(N)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3257477257","body":"\n## 思路\n\n1. **坐标系统设定**:\n - 为每个节点分配坐标,根节点为原点(0, 0)\n - 向左子树移动时,列坐标减1;向右子树移动时,列坐标加1\n - 行坐标随着深度增加而增加(向下为正方向)\n\n2. **DFS遍历收集信息**:\n - 使用深度优先搜索遍历所有节点\n - 记录每个节点的值、行坐标、列坐标\n\n3. **自定义排序**:\n - 按列坐标升序排列(从左到右)\n - 列相同时按行坐标升序(从上到下)\n - 行列都相同时按节点值升序\n\n4. **分组输出**:\n - 将相同列坐标的节点值归为一组\n - 每组构成结果数组中的一个子数组\n\n## 代码:\n\n```javascript\nvar verticalTraversal = function(root) {\n let ans = [] // 存储[节点值, 行, 列]信息\n \n // DFS遍历,收集每个节点的值和坐标\n dfs(root,0,0);\n \n // 自定义排序:先按列,再按行,最后按值\n ans.sort((a,b)=>a[2] - b[2] || a[1] - b[1] || a[0] - b[0]);\n \n let col = Infinity, res = [];\n // 按列分组,将相同列的节点值组成子数组\n for(let [v,r,c] of ans){\n if(col === c) res[res.length - 1].push(v);\n else{\n res.push([v]);\n col = c;\n }\n }\n return res;\n \n // 辅助函数:深度优先遍历并记录坐标\n function dfs(root,row,col){\n if(!root) return;\n ans.push([root.val,row,col]);\n dfs(root.left,row + 1,col - 1) // 左子树:行+1,列-1\n dfs(root.right,row + 1,col + 1) // 右子树:行+1,列+1\n }\n};\n```\n## 复杂度分析\n### 时间复杂度:\n- DFS遍历:O(N),N为节点数\n- 排序:O(N log N)\n- 分组:O(N)\n- 总体:O(N log N)\n\n### 空间复杂度:\n- 存储信息:O(N)\n- 递归栈:O(H),H为树高度\n- 总体:O(N)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260240769","body":"\n\n## 思路\n\n使用了动态规划的思想,并进行了空间优化:\n\n## 具体分析\n\n1. **状态定义**:\n - `prevprev` 表示到达第 i-2 个位置的最小花费\n - `prev` 表示到达第 i-1 个位置的最小花费\n - `curr` 表示到达当前位置的最小花费\n\n2. **状态转移方程**:\n - `curr = v + Math.min(prevprev, prev)`\n - 其中 v 是当前位置的花费(顶部为0)\n\n3. **优化点**:\n - 使用滚动数组优化空间复杂度,从O(n)降到O(1)\n - 只保存前两个状态值,而不是整个dp数组\n\n4. **边界处理**:\n - 当 i < n 时,v = cost[i](正常台阶费用)\n - 当 i = n 时,v = 0(到达楼顶,没有费用)\n - 最后的返回值根据数组长度做了特殊处理\n\n\n这是一个经典的空间优化动态规划解法,通过只保留必要的状态值来减少空间使用。\n## 代码\n```javascript\nvar minCostClimbingStairs = function(cost) {\n let n = cost.length,\n prevprev = cost[0], // 表示到达第0个台阶的最小花费\n prev = cost[1], // 表示到达第1个台阶的最小花费\n curr;\n \n // 从第2个台阶开始遍历到楼梯顶部\n for(let i = 2;i <= n;i++){\n let v = 0;\n // 当i[1,1]);\n```\n\n\n1. 创建一个二维DP数组`dp`,其中`dp[i][0]`表示以`nums[i]`结尾的最长递增子序列的长度,`dp[i][1]`表示以`nums[i]`结尾的最长递增子序列的个数。\n2. 初始时,每个元素自身构成一个长度为1的递增子序列,所以都初始化为`[1,1]`。\n\n```javascript\n for(let i = 1; i < n; i++){\n for(j = i - 1; j >= 0; j--){\n if(nums[i] > nums[j]){\n if(dp[j][0] + 1 > dp[i][0]){\n dp[i][0] = dp[j][0] + 1;\n dp[i][1] = dp[j][1];\n }else if(dp[j][0] + 1 === dp[i][0]){\n dp[i][1] += dp[j][1];\n }\n }\n }\n }\n```\n\n\n3. 对于每个位置[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6),遍历它之前的所有位置`j`:\n - 如果`nums[i] > nums[j]`,说明可以将`nums[i]`接在以`nums[j]`结尾的递增子序列后面\n - 如果通过`j`得到的子序列长度(`dp[j][0] + 1`)比当前记录的长度(`dp[i][0]`)更长,则更新长度和数量\n - 如果长度相等,则将通过`j`得到的子序列数量加到当前的数量上\n\n```javascript\n let ans = 0, max = -Infinity;\n for(let [len,cnt] of dp){\n if(len > max){\n max = len;\n ans = cnt;\n }else if(max === len){\n ans += cnt;\n }\n }\n return ans;\n```\n\n\n4. 最后遍历整个DP数组,找出最长的递增子序列长度,并累加所有具有该长度的子序列的数量。\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findNumberOfLIS = function(nums) {\n let n = nums.length,dp = new Array(n).fill(0).map(()=>[1,1]);\n for(let i = 1;i < n;i++){\n for(j = i - 1;j >= 0;j--){\n if(nums[i] > nums[j]){\n if(dp[j][0] + 1 > dp[i][0]){\n dp[i][0] = dp[j][0] + 1;\n dp[i][1] = dp[j][1];\n }else if(dp[j][0] + 1 === dp[i][0]){\n dp[i][1] += dp[j][1];\n }\n }\n }\n }\n let ans = 0,max = -Infinity;\n for(let [len,cnt] of dp){\n if(len > max){\n max = len;\n ans = cnt;\n }else if(max === len){\n ans += cnt;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(n²),\n- 空间复杂度是O(n)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269148142","body":"\n## 思路\n\n### 1. 问题定义\n最长公共子序列是找出两个字符串中最长的共同子序列(不要求连续,但要保持相对顺序)。\n\n### 2. 动态规划状态定义\n```javascript\nlet m = text1.length, n = text2.length, dp = new Array(m).fill(0).map(() => new Array(n).fill(0));\n```\n\n创建一个二维数组 `dp[i][j]`,表示 `text1[0...i]` 和 `text2[0...j]` 的最长公共子序列长度。\n\n### 3. 初始化边界条件\n```javascript\nif(text1[0] === text2[0]) dp[0][0] = 1;\n\nfor(let i = 1;i < m;i++) {\n dp[i][0] = text1[i] === text2[0] ? 1 : dp[i - 1][0];\n}\nfor(let i = 1;i < n;i++) {\n dp[0][i] = text1[0] === text2[i] ? 1 : dp[0][i - 1];\n}\n```\n\n- 首先处理两个字符串的第一个字符,如果相同则 `dp[0][0] = 1`\n- 分别初始化第一列和第一行:\n - 如果当前字符匹配,则值为1\n - 否则继承前一个位置的值\n\n### 4. 状态转移方程\n```javascript\nfor(let i = 1;i < m;i++){\n for(let j = 1;j < n;j++){\n if(text1[i] === text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;\n else dp[i][j] = Math.max(\n dp[i - 1][j],\n dp[i][j - 1],\n dp[i - 1][j - 1]\n );\n }\n}\n```\n\n对于每个位置 `(i,j)`:\n- 如果 `text1[i] === text2[j]`,说明当前字符匹配,则 `dp[i][j] = dp[i-1][j-1] + 1`\n- 否则取三种情况的最大值:\n - `dp[i-1][j]`:text1[0...i-1] 与 text2[0...j] 的LCS长度\n - `dp[i][j-1]`:text1[0...i] 与 text2[0...j-1] 的LCS长度\n - `dp[i-1][j-1]`:text1[0...i-1] 与 text2[0...j-1] 的LCS长度\n\n### 5. 返回结果\n```javascript\nreturn dp[m - 1][n - 1];\n```\n\n返回 `dp[m-1][n-1]` 即为两个完整字符串的最长公共子序列长度。\n\n\n## 代码\n```javascript\n/**\n * @param {string} text1\n * @param {string} text2\n * @return {number}\n */\nvar longestCommonSubsequence = function(text1, text2) {\n let m = text1.length,n = text2.length,dp = new Array(m).fill(0).map(() => new Array(n).fill(0));\n if(text1[0] === text2[0]) dp[0][0] = 1;\n\n for(let i = 1;i < m;i++) {\n dp[i][0] = text1[i] === text2[0] ? 1 : dp[i - 1][0];\n }\n for(let i = 1;i < n;i++) {\n dp[0][i] = text1[0] === text2[i] ? 1 : dp[0][i - 1];\n }\n for(let i = 1;i < m;i++){\n for(let j = 1;j < n;j++){\n if(text1[i] === text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;\n else dp[i][j] = Math.max(\n dp[i - 1][j],\n dp[i][j - 1],\n dp[i - 1][j - 1]\n );\n }\n }\n return dp[m - 1][n - 1];\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(m×n),其中 m 和 n 分别是两个字符串的长度\n- 空间复杂度:O(m×n),用于存储 dp 数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273217746","body":"## 思路\n使用了组合数学的方法来解决不同路径问题:\n\n1. **问题转换**:\n - 机器人需要从左上角走到右下角,总共需要向右走 (n-1) 步,向下走 (m-1) 步\n - 总共需要走 (m-1)+(n-1) = m+n-2 步\n - 问题转化为:在这 m+n-2 步中,如何选择 m-1 步向下走(或 n-1 步向右走)\n\n2. **数学公式**:\n - 这是一个组合问题,答案是 C(m+n-2, m-1) 或 C(m+n-2, n-1)\n - 组合数公式:C(n,k) = n! / (k! * (n-k)!)\n - 为了避免计算阶乘导致的溢出,代码采用了逐步相乘的方式\n\n3. **实现细节**:\n - `k = m + n - 2` 表示总步数\n - `t = m - 1` 表示需要选择的步数(向下走的步数)\n - 通过循环计算组合数,每次将 `k/t` 的值乘到结果中,并递减 k 和 t\n - 最后使用 `Math.round()` 是为了处理浮点数计算可能产生的精度误差\n\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} m\n * @param {number} n\n * @return {number}\n */\nvar uniquePaths = function(m, n) {\n let k = m + n - 2;\n if(k === 0) return 1;\n let t = Math.min(m - 1,n - 1), ans = 1;\n while (t){\n ans *= k / t;\n k--;\n t--;\n }\n return Math.round(ans);\n};\n```\n\n## 复杂度分析\n- 时间复杂度为 O(min(m,n)),\n- 空间复杂度为 O(1)。\n相比动态规划方法,这种方法更加高效。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3277237117","body":"## 思路\n\n### 问题理解\n1. 骑士按照象棋规则移动(日字形,8个方向)\n2. 骑士从 (row, column) 位置开始\n3. 骑士进行 K 次随机移动\n4. 求骑士最终仍在棋盘上的概率\n\n### 解决方案\n使用记忆化递归(动态规划):\n\n1. **状态定义**:f(i, j, k) 表示骑士在位置 (i, j) 并且还能移动 k 步时,在棋盘上的概率\n\n2. **边界条件**:\n - 当 k = 0 时,如果位置在棋盘内则返回 1,否则返回 0\n - 当位置超出棋盘边界时,返回 0\n\n3. **状态转移**:\n - 对于骑士的 8 个可能移动方向,递归计算每个方向移动后的情况\n - 结果为所有可能移动结果的平均值(除以 8)\n\n4. **记忆化优化**:\n - 使用 memo 三维数组存储已经计算过的结果,避免重复计算\n\n## 代码\n\n```javascript\nvar knightProbability = function(n, k, row, column) {\n // 骑士的8个移动方向\n const dirs = [[1,2],[2,1],[1,-2],[2,-1],[-1,2],[-2,1],[-1,-2],[-2,-1]];\n \n // 记忆化数组,存储 (i,j,k) 状态下的结果\n const memo = new Array(n + 1).fill(0).map(()=>{\n return new Array(n + 1).fill(0).map(()=>{\n return new Array(k + 1).fill(-1);\n })\n })\n \n // 调用递归函数\n return f(row, column, k);\n \n function f(i, j, k) {\n // 基础情况:没有移动次数了\n if (k === 0) return i >= 0 && i < n && j >= 0 && j < n ? 1 : 0;\n \n // 超出边界\n if (i < 0 || i >= n || j < 0 || j >= n) return 0;\n \n // 已经计算过该状态\n if (memo[i][j][k] !== -1) return memo[i][j][k];\n \n let ans = 0;\n // 遍历8个方向\n for (let d of dirs) {\n let x = d[0] + i, y = d[1] + j;\n ans += f(x, y, k - 1);\n }\n \n // 每个方向的概率是 1/8,所以取平均值\n memo[i][j][k] = ans / 8;\n return ans / 8;\n } \n};\n```\n\n\n### 复杂度分析\n- 时间复杂度:O(N²×K),因为有 N×N 个位置和 K 步\n- 空间复杂度:O(N²×K),用于存储记忆化数组\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3283550644","body":"## 思路\n\n### 1. 初始判断\n```javascript\nif((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;\n```\n\n首先计算所有可选数字的总和,如果总和小于目标值,则无论如何都无法达到目标,返回false。\n\n### 2. 核心递归函数f\n```javascript\nfunction f(type,total,state){}\n```\n\n- `type`: 当前玩家类型(0表示我方,1表示对方)\n- `total`: 剩余需要达到的目标值\n- `state`: 用位掩码表示的已选择数字状态\n\n### 3. 记忆化搜索\n使用`memo`来存储已经计算过的状态结果,避免重复计算。通过`query`和[add](file://E:\\其他项目\\algorithm_exercises\\9.js#L13-L21)函数来操作这个多层Map结构。\n\n### 4. 状态转移\n对于每个未选择的数字:\n- 如果选择该数字可以直接获胜(`i + 1 >= total`),则当前玩家获胜\n- 否则,递归调用[f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)计算对手在新状态下的结果\n- 如果存在一种选择使得对手必败,则当前玩家必胜\n\n### 5. 博弈论思想\n这是一个典型的极小化极大算法应用:\n- 当前玩家希望找到至少一种选择使得对手必败(返回false)\n- 如果所有选择都导致对手必胜(都返回false),则当前玩家必败\n\n## 代码\n```javascript\n/**\n * @param {number} maxChoosableInteger\n * @param {number} desiredTotal\n * @return {boolean}\n */\nvar canIWin = function(maxChoosableInteger, desiredTotal) {\n let memo = new Map();\n if((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;\n return f(0,desiredTotal,0);\n // -------------------------------\n function f(type,total,state){\n let params = [state];\n if(query(params) !== -1) return query(params);\n let ans = false;\n for(let i = 0;i < maxChoosableInteger;i++){\n if(state & (1 << i)) continue;\n if(i + 1 >= total) {\n ans = true;\n break;\n }\n let a = f(type === 0 ? 1 : 0,total - i - 1, state | (1 << i));\n if(a === false) {\n ans = true;\n break;\n }\n }\n add(params,ans)\n return ans;\n }\n\n function query(params){\n let ans = memo;\n for(let param of params){\n if(ans.has(param) === false) return -1;\n ans = ans.get(param);\n }\n return ans;\n }\n\n function add(params,val){\n let m = memo,n = params.length, rest = params.slice(0,n - 1),last = params[n - 1];\n for(let param of rest){\n if(m.has(param) === false) m.set(param,new Map());\n m = m.get(param);\n }\n m.set(last,val);\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:$O(n*2^{n})$\n- 空间复杂度:$O(n)$","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3287375518","body":"## 思路\n\n\n1. **预处理**:\n - 计算数组总和,如果为奇数则直接返回false\n - 确定目标值target为总和的一半\n\n2. **初始化DP数组**:\n - dp[j]表示是否可以用数组中的元素组成和为j的子集\n - 初始时只考虑第一个元素nums[0],只有当j等于nums[0]时才为true\n\n3. **状态转移**:\n - 对于每个元素nums[i],更新dp数组\n - 从target到0逆序遍历,避免重复使用同一元素\n - 状态转移方程:`dp[j] = dp[j] || dp[j - nums[i]]`\n - 要么不使用当前元素,保持原来的状态dp[j]\n - 要么使用当前元素,前提是dp[j - nums[i]]为true\n\n4. **返回结果**:\n - 如果dp[target]为true,表示可以组成和为target的子集,返回true\n - 否则返回false\n\n\n## 代码\n```javascript\nvar canPartition = function(nums) {\n // 获取数组长度和总和\n let n = nums.length,sum = nums.reduce((a,b)=>a + b,0);\n \n // 如果总和是奇数,则无法分成两个相等的子集\n if(sum & 1) return false;\n \n // 目标是找到和为总和一半的子集\n const target = sum / 2;\n \n // 创建dp数组,dp[j]表示是否可以用前面的数字组成和为j的子集\n const dp = new Array(target + 1).fill(false);\n \n // 初始化:第一个数字能否组成和为j的子集\n for(let j = 0;j <= target;j++) dp[j] = nums[0] === j;\n \n // 从第二个数字开始遍历\n for(let i = 1;i < n;i++){\n // 从target到0逆序遍历(避免重复使用同一元素)\n for(let j = target;j >= 0;j--){\n // 状态转移方程:\n // dp[j] = dp[j] || dp[j - nums[i]]\n // 要么之前就能组成j,要么使用当前数字nums[i]组成j\n dp[j] = dp[j] || (j - nums[i] >= 0 ? dp[j - nums[i]] : false);\n }\n }\n \n // 返回是否能组成和为target的子集\n return dp[target];\n};\n```\n\n## 时间和空间复杂度\n\n- 时间复杂度:O(n × target),其中n是数组长度,target是数组元素和的一半\n- 空间复杂度:O(target),只使用了一维dp数组\n\n这是一个经典的0-1背包问题的应用,通过动态规划解决了分割等和子集问题。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289197873","body":"\n## 思路\n\n\n1. **递归函数 [f(i, total)](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\2.js#L16-L29)**:\n - [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 表示当前处理到数组中的第 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素\n - [total](file://E:\\力扣刷题\\algorithm_exercises\\双周赛\\165\\3.js#L5-L5) 表示前 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素通过添加 '+' 或 '-' 符号后得到的总和\n - 函数返回从第 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素开始到最后一个元素,能够得到目标值的方案数\n\n2. **边界条件**:\n - 当 `i === n` 时,表示已经处理完所有元素,如果 `total === target` 则找到一种有效方案,返回 1,否则返回 0\n\n3. **状态转移**:\n - 对于当前元素 `nums[i]`,可以选择加上它或减去它\n - 所以递归调用 `f(i+1, total-nums[i]) + f(i+1, total+nums[i])`\n\n4. **记忆化优化**:\n - 使用 [memo](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\430\\2.js#L7-L7) 数组存储已经计算过的状态,避免重复计算\n - `memo[i][total + abs_sum]` 中使用 `total + abs_sum` 是为了避免负数索引\n\n## 代码亮点\n\n1. 计算 `abs_sum` 来确定可能的和的范围,这样可以正确地映射负数到数组索引\n2. 使用记忆化递归避免重复计算,提高效率\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar findTargetSumWays = function(nums, target) {\n let n = nums.length;\n let abs_sum = nums.reduce((prev,curr)=>{\n if(curr >= 0) return curr + prev;\n return prev - curr;\n },0)\n // console.log(abs_sum);\n let memo = new Array(n + 1).fill(0).map(()=>new Array(2 * abs_sum + 1).fill(-1));\n return f(0,0);\n // ---------------------------\n function f(i,total){\n if(i === n) return target === total ? 1 : 0;\n let t = memo[i][total + abs_sum];\n // console.log(i,target,target + abs_sum,t);\n if(t !== -1) return t;\n let ans = f(i + 1,total - nums[i]) + f(i + 1,total + nums[i]);\n memo[i][total + abs_sum] = ans; \n return ans;\n }\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n × S),其中 n 是数组长度,S 是数组元素绝对值之和\n- **空间复杂度**:O(n × S),主要由 memo 数组占用","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290259438","body":"## 思路\n\n这是一个典型的完全背包问题:\n1. **状态定义**:`dp[i][j]` 表示使用前 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 种硬币凑成金额 `j` 所需的最少硬币数\n2. **状态转移**:对于第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 种硬币,我们有两种选择:\n - 不使用该硬币:`dp[i-1][j]`\n - 使用该硬币:`1 + dp[i][j-coins[i-1]]`(因为硬币可以重复使用,所以是`dp[i]`而不是`dp[i-1]`)\n3. **边界条件**:`dp[0][0] = 0`,表示不使用任何硬币凑成金额0需要0个硬币\n## 代码\n\n```javascript\nvar coinChange = function(coins, amount) {\n let n = coins.length;\n // 创建二维DP数组,dp[i][j]表示使用前i种硬币凑成金额j的最少硬币数\n let dp = new Array(n + 1).fill(0).map(()=>new Array(amount + 1).fill(Infinity));\n // 初始状态:使用0种硬币凑成金额0需要0个硬币\n dp[0][0] = 0;\n \n // 遍历每种硬币\n for(let i = 1; i <= n; i++){\n // 遍历所有可能的金额\n for(let j = 0; j <= amount; j++){\n // 状态转移方程:\n // 1. 不使用第i种硬币:dp[i - 1][j]\n // 2. 使用第i种硬币:1 + dp[i][j - coins[i - 1]] (前提是j - coins[i - 1] >= 0)\n dp[i][j] = Math.min(\n dp[i - 1][j],\n j - coins[i - 1] >= 0 ? 1 + dp[i][j - coins[i - 1]] : Infinity\n );\n }\n }\n \n // 返回结果,如果为无穷大说明无法凑成,返回-1\n return dp[n][amount] === Infinity ? -1 : dp[n][amount]\n};\n```\n\n## 时间和空间复杂度\n- 时间复杂度:O(n × amount),其中 n 是硬币种类数\n- 空间复杂度:O(n × amount)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3295404263","body":"## 思路\n\n### 状态定义\n\n- `dp[i][j]` 表示使用前 i 种硬币凑成金额 j 的组合数\n\n### 初始化\n\n- `dp[0][0] = 1`:使用 0 种硬币凑成金额 0 的方法数为 1(即什么都不选)\n\n### 状态转移方程\n\n对于第 i 种硬币(面值为 c):\n\n- `dp[i][j] = dp[i-1][j] + (j-c >= 0 ? dp[i][j-c] : 0)`\n- 其中:\n - `dp[i-1][j]`:不使用第 i 种硬币,仅使用前 i-1 种硬币凑成金额 j 的组合数\n - `dp[i][j-c]`:使用第 i 种硬币,即在凑成金额 j-c 的基础上再加一个第 i 种硬币\n\n### 关键点\n\n1. 这是一个\"完全背包\"问题:每种硬币可以使用无限次\n2. 使用的是二维DP,其中行代表硬币种类,列代表金额\n3. 转移方程中 `dp[i][j-c]`(而非 `dp[i-1][j-c]`)体现了每种硬币可重复使用的特性\n\n## 代码\n\n```javascript\n/**\n * @param {number} amount\n * @param {number[]} coins\n * @return {number}\n */\nvar change = function (amount, coins) {\n let n = coins.length, dp = new Array(n + 1).fill(0).map(() => new Array(amount + 1).fill(0));\n dp[0][0] = 1;\n for (let i = 1; i <= n; i++) {\n let c = coins[i - 1]\n for (let j = 0; j <= amount; j++) dp[i][j] = dp[i - 1][j] + (j - c >= 0 ? dp[i][j - c] : 0);\n }\n return dp[n][amount];\n };\n```\n### 时间和空间复杂度\n\n- 时间复杂度:O(n × amount),其中 n 是硬币种类数\n- 空间复杂度:O(n × amount)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3300884457","body":"## 思路\n\n1. **排序策略**:将孩子贪心值数组`g`和饼干尺寸数组[s](file://E:\\其他项目\\algorithm_exercises\\1.js)都按降序排列\n2. **贪心策略**:用最大的饼干去满足贪心值最大的孩子(即最难以满足的孩子)\n3. **双指针遍历**:使用两个指针分别遍历孩子和饼干数组\n4. **匹配逻辑**:如果当前饼干能满足当前孩子,则两个指针都前进;否则只移动孩子指针(尝试用同一块饼干满足贪心值更低的孩子)\n\n这种从最大到最小的分配方式体现了贪心思想:优先满足需求大的孩子,这样能保证整体效果最优。\n\n## 代码\n```javascript\n/**\n * @param {number[]} g\n * @param {number[]} s\n * @return {number}\n */\nvar findContentChildren = function(g, s) {\n const compare = (a,b)=>b - a;\n g.sort(compare);\n s.sort(compare);\n let i = 0,j = 0,m = g.length,n = s.length;\n let ans = 0;\n while(i < m && j < n){\n if(s[j] >= g[i]){\n ans++;\n j++;\n i++;\n }else i++;\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度为O(m log m + n log n),主要消耗在排序上,\n- 空间复杂度为O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3305173933","body":"\n## 思路\n\n贪心策略是:**尽可能选择结束时间早的区间,这样能为后续区间留出更多空间**。\n\n\n1. **按结束时间排序**:\n ```javascript\n intervals.sort((a,b)=>a[1] - b[1]);\n ```\n\n 将所有区间按照结束时间升序排列,优先考虑结束早的区间。\n\n2. **贪心选择**:\n ```javascript\n let lastEnd = -Infinity;\n for(let [s,e] of intervals){\n if(s >= lastEnd) {\n ans++;\n lastEnd = e;\n }\n }\n ```\n\n 遍历排序后的区间,如果当前区间的开始时间不早于上一个选中区间的结束时间,就选择这个区间。这确保了选中的区间互不重叠。\n\n3. **计算结果**:\n ```javascript\n return n - ans;\n ```\n\n 返回总区间数减去可以保留的区间数,即需要移除的区间数。\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} intervals\n * @return {number}\n */\nvar eraseOverlapIntervals = function(intervals) {\n intervals.sort((a,b)=>a[1] - b[1]);\n let ans = 0,n = intervals.length;\n let lastEnd = -Infinity;\n for(let [s,e] of intervals){\n if(s >= lastEnd) {\n ans++;\n lastEnd = e;\n }\n }\n return n - ans;\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n),主要消耗在排序上\n- 空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3312499521","body":"## 思路-:动态规划\n\n1. **问题目标**:判断是否能从数组的第一个位置跳到最后一个位置\n2. **解法**:使用动态规划从后往前推导\n3. **状态定义**:`dp[i]` 表示从位置 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 是否能到达最后一个位置\n4. **状态转移**:\n - 从倒数第二个位置开始往前推导\n - 对于每个位置 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22),检查能否通过跳跃到达后续的某个可达位置\n - 如果能跳到某个 `dp[j]` 为 `true` 的位置,则 `dp[i]` 也为 `true`\n\n```javascript\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canJump = function(nums) {\n let n = nums.length, dp = new Array(n).fill(false);\n dp[n - 1] = true;\n \n // 从倒数第二个位置开始向前遍历\n for(let i = n - 2; i >= 0; i--){\n let steps = nums[i];\n \n // 检查从当前位置 i 能否跳到某个可达的位置\n for(let delta = 1; delta <= steps && i + delta < n; delta++){\n let j = i + delta;\n if(dp[j]) {\n dp[i] = true;\n break;\n }\n }\n }\n \n return dp[0];\n};\n```\n\n\n## 思路总结\n\n1. **初始化**:创建一个布尔数组 [dp](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\467\\3.js#L22-L22),长度与输入数组相同,所有元素初始化为 `false`\n2. **边界条件**:最后一个位置默认为 `true`(已经在最后一个位置了)\n3. **状态转移**:从倒数第二个位置开始,对每个位置检查:\n - 根据当前位置的值,确定可以跳跃的步数范围\n - 在这个范围内,检查是否存在某个可达的位置(`dp[j]` 为 `true`)\n - 如果存在,则当前位置也是可达的\n4. **结果**:返回 `dp[0]`,即从起始位置是否可达\n\n## 复杂度分析\n这是一种典型的动态规划解法,\n- 时间复杂度为 O(n²),\n- 空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/71#issuecomment-3314420253","body":"## 思路:\n\n1. **状态定义**:`dp[i]` 表示由 i 个不同节点能构成的不同二叉搜索树的数量\n\n2. **状态转移方程**:\n - 对于 i 个节点,我们可以让其中任意一个节点 j (1 ≤ j ≤ i) 作为根节点\n - 当节点 j 作为根时:\n - 左子树包含比 j 小的 j-1 个节点,能构成 `dp[j-1]` 种不同的二叉搜索树\n - 右子树包含比 j 大的 i-j 个节点,能构成 `dp[i-j]` 种不同的二叉搜索树\n - 根据乘法原理,以 j 为根的二叉搜索树总数为 `dp[j-1] * dp[i-j]`\n - 遍历所有可能的根节点,将结果累加得到 `dp[i]`\n\n3. **边界条件**:\n - `dp[0] = 1`:空树也算一种情况\n - `dp[1] = 1`:只有一个节点时,只能构成一种二叉搜索树\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar numTrees = function(n) {\n // 创建dp数组,dp[i]表示由i个不同节点能构成的不同二叉搜索树的数量\n let dp = new Array(n + 1).fill(0);\n \n // 边界条件:0个节点可以构成1棵空树,1个节点只能构成1种二叉搜索树\n dp[0] = 1;\n dp[1] = 1;\n \n // 计算2到n个节点能构成的不同二叉搜索树数量\n for(let i = 2; i <= n; i++){\n // 对于i个节点,尝试让每个节点作为根节点\n for(let j = 1; j <= i; j++){\n // 当第j个节点作为根时:\n // 左子树有j-1个节点,可以构成dp[j-1]种不同的二叉搜索树\n // 右子树有i-j个节点,可以构成dp[i-j]种不同的二叉搜索树\n // 根据乘法原理,以j为根的二叉搜索树数量为dp[j-1] * dp[i-j]\n dp[i] += dp[j - 1] * dp[i - j]\n }\n }\n \n // 返回n个节点能构成的不同二叉搜索树数量\n return dp[n]\n};\n```\n\n\n\n\n\n## 复杂度分析\n- 时间复杂度为 O(n²),\n- 空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3315877464","body":"\n## 思路\n\n使用了**最小优先队列**来解决合并K个有序链表的问题,这是一种非常高效的解决方案。\n\n### 核心思想\n\n1. **使用最小优先队列维护所有链表的头部节点**:\n - 将K个链表的头节点都放入最小优先队列中\n - 优先队列会根据节点值进行排序,确保队首始终是最小值节点\n\n2. **逐步构建结果链表**:\n - 每次从优先队列中取出值最小的节点\n - 将该节点连接到结果链表末尾\n - 如果该节点还有后续节点,则将后续节点加入优先队列\n\n3. **重复过程直到优先队列为空**:\n - 当优先队列为空时,说明所有节点都已处理完毕\n\n### 代码详解\n\n```javascript\nvar mergeKLists = function(lists) {\n // 创建虚拟头节点,便于操作\n let dummy = new ListNode(), dh = dummy;\n \n // 创建最小优先队列,比较函数是基于节点值\n let q = new MinPriorityQueue(v => v.val);\n \n // 将所有非空链表的头节点加入优先队列\n for(let i = 0; i < lists.length; i++) \n if(lists[i]) q.enqueue(lists[i]);\n \n // 当优先队列不为空时继续处理\n while(q.size()){\n // 取出值最小的节点\n let n = q.dequeue();\n \n // 将该节点连接到结果链表\n dh.next = n;\n dh = dh.next;\n \n // 如果该节点有后续节点,将其加入优先队列\n if(n.next) q.enqueue(n.next);\n }\n \n // 返回合并后的链表\n return dummy.next;\n};\n```\n\n\n## 复杂度分析\n\n1. **时间复杂度优化**:\n - 时间复杂度为 O(N log K),其中 N 是所有节点总数,K 是链表数量\n\n2. **空间复杂度**:\n - 空间复杂度为 O(K),只需要存储K个链表的头部节点\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/73#issuecomment-3322038797","body":"## 思路:\n\n1. **分治思想**:\n - 将问题分解为两个子问题:分别处理奇数和偶数\n - `oushu = n >> 1` 计算偶数的个数(相当于 n/2 的整数部分)\n - `jishu = n - oushu` 计算奇数的个数\n\n2. **递归处理**:\n - `l1 = beautifulArray(jishu)` 递归生成奇数个数对应的漂亮数组\n - `l2 = beautifulArray(oushu)` 递归生成偶数个数对应的漂亮数组\n\n3. **映射构造**:\n - 对于奇数部分:`for(let i of l1) ans.push(2 * i - 1)` 将每个元素映射为奇数\n - 对于偶数部分:`for(let i of l2) ans.push(2 * i)` 将每个元素映射为偶数\n\n4. **核心思想**:\n - 通过将数组分为奇数和偶数两部分,确保不会在奇数和偶数之间形成等差数列\n - 因为如果一个数是奇数,另一个是偶数,那么它们的平均数不可能是整数,也就不可能在数组中找到第三个数构成等差数列\n\n## 关键点:\n\n- 基础情况:当 n=1 时,直接返回 [1]\n- 使用位运算 `>>` 实现整数除法,提高效率\n- 通过分别处理奇数和偶数部分,巧妙地避免了等差数列的形成\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number[]}\n */\nvar beautifulArray = function(n) {\n if(n === 1) return [1];\n let oushu = n >> 1,jishu = n - oushu;\n let l1 = beautifulArray(jishu),l2 = beautifulArray(oushu);\n let ans = [];\n for(let i of l1) ans.push(2 * i - 1);\n for(let i of l2) ans.push(2 * i);\n return ans\n};\n```\n\n## 复杂度分析\n- 时间复杂度为 O(n log n)。\n- 空间复杂度为 O(n log n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322078023","body":"## 思路:\n\n1. **异或运算的性质**:\n - 相同数字异或结果为0:`a ^ a = 0`\n - 任何数字与0异或等于自身:`a ^ 0 = a`\n - 异或运算满足交换律和结合律\n\n2. **第一步:计算所有数字的异或结果**:\n ```javascript\n let xor = 0;\n nums.forEach(n=>xor = xor ^ n);\n ```\n\n 这一步得到的是两个只出现一次的数字的异或结果,因为出现两次的数字都会相互抵消。\n\n3. **第二步:找到区分两个目标数字的位**:\n ```javascript\n let type = xor & (-xor);\n ```\n\n 这一步很关键,通过 `xor & (-xor)` 找到 `xor` 中最右边的1位。这个位必定在两个目标数字中一个为1,一个为0,因为只有这样它们的异或结果才会是1。\n\n4. **第三步:根据该位将数组分为两组**:\n ```javascript\n let a = 0, b = 0;\n for(let num of nums){\n if(type & num) a = a ^ num; // 该位为1的数字分为一组\n else b ^= num; // 该位为0的数字分为一组\n }\n ```\n\n 通过这种方式,将两个目标数字分到不同的组中,而相同的数字由于该位相同会被分到同一组,在组内异或后会被抵消,最终每组只剩下各自的目标数字。\n\n## 复杂度分析\n\n- 时间复杂度是 O(n),\n- 空间复杂度是 O(1),非常高效。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar singleNumber = function(nums) {\n let xor = 0;\n nums.forEach(n=>xor = xor ^ n);\n let type = xor & (-xor);\n let a = 0,b = 0;\n for(let num of nums){\n if(type & num) a = a ^ num;\n else b ^= num;\n }\n return [a,b];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3326222352","body":"## 思路\n\n1. `let n = 1 << (nums.length)`:通过左移运算计算出子集的总数。对于长度为n的数组,其子集总数为2^n。这里使用位运算`1 << nums.length`等价于2的nums.length次方。\n\n2. 外层循环`for(let i = 0;i < n;i++)`:遍历从0到2^n-1的每个数字,每个数字代表一个子集。\n\n3. 对于每个数字i(用变量j来操作):\n - 使用`j & 1`检查j的最低位是否为1\n - 如果是1,则将nums[k]加入当前子集temp中\n - 然后将j右移一位(`j >>= 1`),检查下一位\n - 同时k递增,指向nums中的下一个元素\n\n4. 内层while循环结束后,将生成的子集temp添加到结果数组ans中。\n\n## 复杂度分析\n使用位运算生成所有子集的方法,\n- 时间复杂度为O(n*2^n),\n- 空间复杂度为O(n*2^n)。\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[][]}\n */\nvar subsets = function(nums) {\n let n = 1 << (nums.length),ans = [];\n for(let i = 0;i < n;i++){\n let temp = [],j = i,k = 0;\n while(j){\n if(j & 1) temp.push(nums[k]);\n j >>= 1;\n k++;\n }\n ans.push(temp);\n }\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3331626491","body":"## 思路\n\n1. **TrieNode(Trie节点)**\n - `isEnd`:标记该节点是否为某个单词的结尾\n - `children`:大小为26的数组,存储指向子节点的指针(对应26个小写字母)\n\n2. **辅助函数**\n - `getCharIndex(c)`:将字符转换为其在字母表中的索引(0-25)\n\n### 1. 初始化(`Trie`构造函数)\n- 创建一个根节点 `root`,作为整个Trie树的起点\n\n### 2. 插入单词(`insert`方法)\n- 从根节点开始,逐字符遍历要插入的单词\n- 对于每个字符:\n - 计算其在字母表中的索引\n - 如果对应子节点不存在,则创建新节点\n - 移动到该子节点\n- 遍历完所有字符后,将最后一个节点标记为单词结尾(`isEnd = true`)\n\n### 3. 搜索单词(`search`方法)\n- 从根节点开始,逐字符遍历要搜索的单词\n- 对于每个字符:\n - 计算索引并检查对应子节点是否存在\n - 如果不存在,返回 `false`\n - 如果存在,移动到该子节点\n- 遍历完所有字符后,检查最后一个节点是否为单词结尾(`isEnd`为`true`)\n\n### 4. 前缀匹配(`startsWith`方法)\n- 与`search`类似,但不检查最后一个节点是否为单词结尾\n- 只要能完整遍历前缀中的所有字符,就返回`true`\n\n## 时间复杂度\n- 插入和搜索操作的时间复杂度均为O(m),其中m为单词或前缀的长度\n\n## 空间复杂度\n- O(ALPHABET_SIZE × N × M),其中N为插入的单词数,M为平均单词长度\n\n## 代码\n```javascript\nfunction TrieNode(){\n this.isEnd = false;\n this.children = new Array(26);\n}\n\nfunction getCharIndex(c){\n return c.charCodeAt(0) - 'a'.charCodeAt(0);\n}\n\nvar Trie = function() {\n this.root = new TrieNode();\n};\n\n/** \n * @param {string} word\n * @return {void}\n */\nTrie.prototype.insert = function(word) {\n let root = this.root;\n for(let c of word){\n let i = getCharIndex(c);\n if(!root.children[i]) root.children[i] = new TrieNode();\n root = root.children[i];\n }\n root.isEnd = true;\n};\n\n/** \n * @param {string} word\n * @return {boolean}\n */\nTrie.prototype.search = function(word) {\n let root = this.root;\n for(let c of word){\n let i = getCharIndex(c);\n if(!root.children[i]) return false;\n root = root.children[i];\n }\n return root.isEnd;\n};\n\n/** \n * @param {string} prefix\n * @return {boolean}\n */\nTrie.prototype.startsWith = function(prefix) {\n let root = this.root;\n for(let c of prefix){\n let i = getCharIndex(c);\n if(!root.children[i]) return false;\n root = root.children[i];\n }\n return !!root\n};\n\n/** \n * Your Trie object will be instantiated and called as such:\n * var obj = new Trie()\n * obj.insert(word)\n * var param_2 = obj.search(word)\n * var param_3 = obj.startsWith(prefix)\n */\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3336492052","body":"## 思路\n\n### 1. TrieNode 结构\n- `TrieNode` 是一个前缀树节点结构。\n- 每个节点包含:\n - `value`: 当前节点对应的值总和。\n - [end](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14): 标记该节点是否为某个单词的结尾。\n - `children`: 长度为26的数组,存储子节点(对应字母a-z)。\n\n### 2. MapSum 类\n- 使用前缀树(Trie)和哈希表(Map)实现键值映射与前缀求和功能。\n- `root`: Trie树的根节点。\n- [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5): 存储已插入的键值对。\n\n## 核心方法\n\n### insert(key, val)\n- 插入或更新键值对:\n - 如果键已存在,更新所有相关节点的值(先减去旧值,再加上新值)。\n - 如果是新键,则在Trie中创建路径,并在路径上的每个节点累加值。\n - 最后更新哈希表中的键值对。\n\n### sum(prefix)\n- 查询指定前缀的所有键值总和:\n - 遍历前缀,在Trie中查找对应的节点。\n - 若找不到完整前缀则返回0。\n - 返回前缀末尾节点的 `value` 值(即以该前缀开头的所有键的值总和)。\n\n## 工具函数\n\n### getCharIndex(char)\n- 将字符转换为其在字母表中的索引(0-25)。\n\n\n\n\n## 代码\n```javascript\nfunction TrieNode(){\n this.value = 0;\n this.end = false;\n this.children = new Array(26);\n}\n\nfunction getCharIndex(a){return a.charCodeAt(0) - 'a'.charCodeAt(0)}\nvar MapSum = function() {\n this.root = new TrieNode();\n this.map = new Map();\n};\n\n/** \n * @param {string} key \n * @param {number} val\n * @return {void}\n */\nMapSum.prototype.insert = function(key, val) {\n if(this.map.has(key)){\n let root = this.root;\n for(let c of key){\n let i = getCharIndex(c);\n root.children[i].value -= this.map.get(key);\n root.children[i].value += val;\n root = root.children[i];\n }\n }else{\n let root = this.root;\n for(let c of key){\n let i = getCharIndex(c);\n if(!root.children[i]) root.children[i] = new TrieNode();\n root = root.children[i];\n root.value += val;\n }\n root.end = true;\n }\n this.map.set(key,val);\n};\n\n/** \n * @param {string} prefix\n * @return {number}\n */\nMapSum.prototype.sum = function(prefix) {\n let root = this.root;\n let ans = 0\n for(let c of prefix){\n let i = getCharIndex(c);\n if(!root.children[i]) return 0;\n root = root.children[i];\n }\n return root.value;\n};\n\n/** \n * Your MapSum object will be instantiated and called as such:\n * var obj = new MapSum()\n * obj.insert(key,val)\n * var param_2 = obj.sum(prefix)\n */\n```\n\n\n## 复杂度分析\n- 时间复杂度:O(n),n位单词的长度。\n- 空间复杂度:O(m * n),m为单词个数,n为单词长度。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/78#issuecomment-3340984021","body":"## 算法思路\n\n1. **构建 Trie 树**:\n - 将 `smalls` 数组中的所有字符串插入到 Trie 树中\n - 每个节点记录是否为单词结尾([end](file://E:\\力扣刷题\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14) 标志)以及对应的索引位置([i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22))\n\n2. **搜索过程**:\n - 遍历 `big` 字符串的每个位置作为起始点\n - 对每个起始点,使用 [dfs](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\465\\2.js#L9-L25) 函数在 Trie 树中进行匹配\n - 当匹配到完整单词时,将起始位置记录到对应的结果数组中\n\n3. **Trie 树结构**:\n - `TrieNode`:包含 [end](file://E:\\力扣刷题\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14) 标志、子节点数组和索引 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22)\n - `Trie`:提供插入方法,将单词和其索引存储到树中\n\n## 关键函数分析\n\n- **`multiSearch` 主函数**:\n - 初始化 Trie 树并插入所有 smalls 单词\n - 遍历 big 字符串每个位置进行搜索\n\n- **[dfs](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\465\\2.js#L9-L25) 辅助函数**:\n - 从当前 Trie 节点继续匹配字符\n - 找到匹配单词时记录位置信息\n\n## 时间复杂度\n\n- **构建 Trie**:O(∑|smalls[i]|),即所有 smalls 字符串长度之和\n- **搜索过程**:O(|big| × max_match_length)\n - 外层循环遍历 `big` 字符串:O(|big|)\n - 每次 dfs 最坏情况遍历到最长匹配:O(max_match_length)\n- **总体复杂度**:O(∑|smalls[i]| + |big| × max_match_length)\n\n## 空间复杂度\n\n- **Trie 树存储**:O(∑|smalls[i]| × 26) = O(∑|smalls[i]|)\n- **结果数组**:O(∑结果数量)\n- **总体空间复杂度**:O(∑|smalls[i]| + 结果数量)\n\n## 代码\n```javascript\n/**\n * @param {string} big\n * @param {string[]} smalls\n * @return {number[][]}\n */\nvar multiSearch = function(big, smalls) {\n let trie = new Trie(),n = smalls.length;\n for(let i = 0;i < n;i++) trie.insert(smalls[i],i);\n let ans = new Array(n).fill(0).map(()=>[]);\n for(let i = 0;i < big.length;i++){\n let root = trie.root;\n let c = big[i],j = getCharIndex(c);\n if(!root.children[j]) continue;\n dfs(root,i,i);\n }\n\n return ans;\n\n // --------------------------\n function dfs(root,index,j){\n if(index === big.length) return;\n let c = big[index],i = getCharIndex(c);\n if(!root.children[i]) return;\n root = root.children[i];\n if(root.end) ans[root.i].push(j);\n dfs(root,index + 1,j);\n }\n};\n\n\n\n\nfunction Trie(){\n this.root = new TrieNode();\n}\n\nTrie.prototype.insert = function(word,i){\n let root = this.root;\n for(let c of word){\n let j = getCharIndex(c);\n if(!root.children[j]) root.children[j] = new TrieNode();\n root = root.children[j]\n }\n root.i = i;\n root.end = true;\n}\n\n\nfunction TrieNode(){\n this.end = false;\n this.children = new Array(26);\n this.i = -1;\n}\n\nfunction getCharIndex(c){\n return c.charCodeAt(0) - 'a'.charCodeAt(0);\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/79#issuecomment-3342189359","body":"## 思路\n\n1. **并查集初始化**:\n - 创建一个长度为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6) 的数组 [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17),其中 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6) 是城市数量\n - 初始化时,每个城市都指向自己,即 `f[i] = i`,表示每个城市初始时都是独立的集合\n\n2. **连接城市**:\n - 遍历 `isConnected` 矩阵,对于每一对相连的城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 和 `j`\n - 调用 [merge(i, j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28) 函数将它们合并到同一个集合中\n\n3. **并查集操作**:\n - [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24) 函数:查找城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 所属集合的根节点,并进行路径压缩优化\n - [merge(i, j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28) 函数:将城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 和 `j` 所在的集合合并\n\n## 关键点分析\n\n- **路径压缩**:在 [find](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\2.js#L26-L29) 函数中使用了 `f[i] = find(f[i])` 来压缩路径,提高查找效率\n- **集合合并**:每次成功合并两个不同的集合时,省份数量 [ans](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6) 减一\n- **初始值**:[ans](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6) 初始化为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6),表示最坏情况下每个城市都是一个独立省份\n\n## 代码\n```javascript\n/**\n * @param {number[][]} isConnected\n * @return {number}\n */\nvar findCircleNum = function(isConnected) {\n let n = isConnected.length,f = new Array(n).fill(0).map((_,i)=>i);\n let ans = n;\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(isConnected[i][j]) merge(i,j);\n }\n }\n return ans;\n // ------------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n let fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n ans--;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n^2),其中 n 是城市数量\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/80#issuecomment-3344661787","body":"## 思路\n\n1. **并查集初始化**\n - 使用并查集(Union-Find)数据结构来管理节点连接关系\n - [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17) 数组存储每个节点的父节点,初始时每个节点的父节点是自身\n - [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 数组存储每个连通分量的大小,初始时每个分量大小为1\n\n2. **构建连通分量**\n - 遍历 `graph` 矩阵,对于每条边 `graph[i][j]`,将节点 i 和 j 合并到同一连通分量中\n - 通过 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 函数实现节点合并,并更新连通分量大小\n\n3. **统计初始感染节点**\n - 使用 `initialMap` 统计每个连通分量中有多少个初始感染节点\n - 通过 [find](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\2.js#L26-L29) 函数找到每个初始感染节点所属的连通分量\n\n4. **选择最优移除节点**\n - 遍历所有初始感染节点,寻找满足以下条件的节点:\n - 所在连通分量只有1个初始感染节点(否则移除该节点无法减少传播)\n - 能够拯救最多节点的连通分量\n - 如果拯救数量相同,选择索引最小的节点\n\n5. **边界情况处理**\n - 如果所有初始感染节点所在的连通分量都包含多个感染节点,则返回 `initial` 中的最小索引\n\n## 关键函数\n\n- [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24): 查找节点 i 的根节点(带路径压缩优化)\n- [merge(i,j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28): 合并节点 i 和 j 所在的连通分量\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} graph\n * @param {number[]} initial\n * @return {number}\n */\nvar minMalwareSpread = function(graph, initial) {\n let n = graph.length;\n let f = new Array(n).fill(0).map((_,i)=>i);\n let s = new Array(n).fill(1);\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(graph[i][j]) merge(i,j);\n }\n }\n\n\n let initialMap = new Map();\n for(let i of initial){\n let fi = find(i);\n initialMap.set(fi,initialMap.has(fi) ? initialMap.get(fi) + 1 : 1);\n }\n let ans = n,max = 0;\n for(let i of initial){\n let fi = find(i);\n if(initialMap.get(fi) > 1) continue;\n if(s[fi] > max || s[fi] === max && i < ans) {\n max = s[fi];\n ans = i\n }\n }\n\n return ans === n ? initial.reduce((prev,curr)=>Math.min(prev,curr),n) : ans;\n\n\n\n // -----------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n let fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n s[fj] += s[fi];\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n^2),\n- 空间复杂度:O(n),其中 n 是节点数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/81#issuecomment-3349592362","body":"\n\n## 思路\n\n1. **并查集数据结构**:\n - 使用数组 [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17) 实现并查集,初始化时每台计算机的父节点是自身\n - [size](file://E:\\其他项目\\algorithm_exercises\\libs\\Stack.js#L19-L21) 记录当前连通分量的数量,初始为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6)\n\n2. **可行性判断**:\n - 如果连接数 `cnt` 小于 `n-1`,则无法连接所有计算机,返回 `-1`\n\n3. **连通分量合并**:\n - 遍历所有连接关系,通过 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 函数合并对应的计算机\n - 每次成功合并都会减少连通分量数量\n\n4. **结果计算**:\n - 最终需要的操作次数等于连通分量数减一(`size - 1`)\n\n## 关键函数\n\n- [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24):查找计算机 [i](file://E:\\其他项目\\algorithm_exercises\\周赛\\469\\2.js#L23-L23) 所在集合的根节点(带路径压缩优化)\n- [merge(i,j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28):合并计算机 [i](file://E:\\其他项目\\algorithm_exercises\\周赛\\469\\2.js#L23-L23) 和 `j` 所在的集合\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} connections\n * @return {number}\n */\nvar makeConnected = function(n, connections) {\n const cnt = connections.length;\n if(cnt < n - 1) return -1;\n const f = new Array(n).fill(0).map((_,i)=>i);\n let size = n;\n for(let [i,j] of connections) merge(i,j);\n return size - 1;\n\n // ----------------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n const fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n size--;\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(m×α(n)),其中 m 是连接数,α 是阿克曼函数的反函数\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3354314699","body":"## 思路\n\n使用**后序遍历**的方式递归处理二叉树,删除所有值为0的叶子节点及其所属的全0子树。\n\n## 具体实现分析\n\n1. **基础情况处理**\n - `if(!root) return root;` - 空节点直接返回\n - `if(root && !root.left && !root.right) return root.val === 0 ? null : root;` - 叶子节点判断:如果是值为0的叶子节点则删除\n\n2. **递归处理**\n - `let l = pruneTree(root.left), r = pruneTree(root.right);` - 递归处理左右子树\n - 处理后的左右子树结果保存在 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\468\\2.js#L7-L7) 和 [r](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\447\\1.js#L31-L31) 中\n\n3. **当前节点判断**\n - `if(!l && !r && root.val === 0) return null;` - 如果左右子树都被删除且当前节点值为0,则删除当前节点\n - 否则更新当前节点的左右子树引用并返回当前节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {TreeNode}\n */\nvar pruneTree = function(root) {\n if(!root) return root;\n if(root && !root.left && !root.right) return root.val === 0 ? null : root;\n\n let l = pruneTree(root.left),r = pruneTree(root.right);\n if(!l && !r && root.val === 0) return null;\n root.left = l;\n root.right = r;\n return root;\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**: O(n),需要访问每个节点一次\n- **空间复杂度**: O(h),h为树的高度,递归调用栈的深度\n- **关键点**: 后序遍历确保了从叶子节点开始处理,逐步向上删除符合条件的节点","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null],"haoyuliaocurb":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073435345","body":"```\n// Time Complexity: O(max(num.length, k))\n// Space Complexity: O(max(num.length, k))\n\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(num, k) {\n const num1 = num;\n const num2 = String(k).split('').map(v => Number(v));\n const sum = [];\n\n for (let i = 0; i < Math.max(num1.length, num2.length); i += 1) {\n const s = (num1[num1.length - 1 - i] ?? 0) + (num2[num2.length - 1 - i] ?? 0) + (sum[i] ?? 0);\n\n sum[i] = s % 10;\n sum[i + 1] = (s - (s % 10)) / 10;\n }\n\n if (sum[sum.length - 1] === 0) sum.pop();\n sum.reverse();\n\n return sum;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078842293","body":"【解題方向】\n\n第一想法:對於每一個 s[i] 都遍歷一次找最近的 c,Time Complexity 為 O(n^2) \n\n第二想法:先遍歷一遍 s 找到所有的 c,然後從所有的 c 開始向兩邊走\n\t=> 不過想到如何記錄狀態就覺得太複雜,而且可能最糟情況還是 Time Complexity 為 O(n^2) \n\n第三想法:看了提示,想到正向遍歷、反向遍歷一次,記錄 s[i] 與左右兩邊的 c 的最小距離\n\t=> 由於題目保證至少有一個 s 中至少有一個 c,對於每個 s[i],其左或右必然會有一個 c\n\n【程式碼】\n```\n// Time Complexity: O(n), n = s.length;\n// Space Complexity: O(n), n = s.length;\n\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const chars = s.split('');\n const res = new Array(chars.length).fill(Infinity);\n\n let leftTargetCharIndex = -1;\n for (let i = 0; i < chars.length; i += 1) {\n if (chars[i] === c) leftTargetCharIndex = i;\n if (leftTargetCharIndex > -1) {\n res[i] = Math.min(res[i], Math.abs(leftTargetCharIndex - i));\n }\n }\n\n let rightTargetCharIndex = -1;\n for (let i = chars.length - 1; i > -1; i -= 1) {\n if (chars[i] === c) rightTargetCharIndex = i;\n if (rightTargetCharIndex > -1) {\n res[i] = Math.min(res[i], Math.abs(rightTargetCharIndex - i));\n }\n }\n\n return res;\n};\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089452516","body":"1. 第一個直覺是用 recursion 來解題,不過過程中會遇到很多 edge case 沒有考慮到而 error thrown\n2. 後來改用 stack 來實踐,也很清楚,不過需要搞懂什麼應該被放進 stack,以及 pop and push 的時機\n\n```\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * Recursive version of decodeString\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const helper = (str, index) => {\n let result = '';\n let num = 0;\n \n while (index < str.length) {\n const char = str[index];\n \n if (char >= '0' && char <= '9') {\n num = num * 10 + parseInt(char);\n index++;\n } else if (char === '[') {\n // Recursively decode the content inside brackets\n const [decodedStr, newIndex] = helper(str, index + 1);\n result += decodedStr.repeat(num);\n num = 0; // Reset number after using it\n index = newIndex;\n } else if (char === ']') {\n // End of current bracket section - return result and current index\n return [result, index + 1];\n } else {\n // Regular character\n result += char;\n index++;\n }\n }\n \n return [result, index];\n };\n \n return helper(s, 0)[0];\n};\n\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let currentStr = '';\n let currentNum = 0;\n \n for (let i = 0; i < s.length; i++) {\n const char = s[i];\n \n if (char >= '0' && char <= '9') {\n currentNum = currentNum * 10 + parseInt(char);\n } else if (char === '[') {\n // Push current state to stack\n stack.push([currentStr, currentNum]);\n currentStr = '';\n currentNum = 0;\n } else if (char === ']') {\n // Pop from stack and decode\n const [prevStr, num] = stack.pop();\n currentStr = prevStr + currentStr.repeat(num);\n } else {\n // Regular character\n currentStr += char;\n }\n }\n \n return currentStr;\n};\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091467280","body":"透過第二個 stack 倒轉第一個 in-stack 的順序,以達到 FIFO 的效果\n```\n// Time Complexity: O(1) for push, pop, peek, empty;\n// Space Complexity: O(n)\n\nclass MyQueue {\n constructor() {\n this.inStack = [];\n this.outStack = [];\n }\n\n /** \n * @param {number} x\n * @return {void}\n */\n push(x) {\n this.inStack.push(x);\n }\n\n /**\n * @return {number}\n */\n pop() {\n if (!this.outStack.length) {\n this.pushToOutStack();\n }\n\n return this.outStack.pop();\n }\n\n /**\n * @return {number}\n */\n peek() {\n if (!this.outStack.length) {\n this.pushToOutStack();\n }\n\n return this.outStack[this.outStack.length - 1];\n }\n\n /**\n * @return {boolean}\n */\n empty() {\n return this.peek() === undefined;\n }\n\n pushToOutStack() {\n while (this.inStack.length) {\n this.outStack.push(this.inStack.pop());\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094426027","body":"// Time Complexity: O(n);\n// Space Complexity: O(n);\n\n```\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const sortedArr = [...arr].sort((a, b) => a - b);\n let counts = {};\n let chunkAmount = 0;\n\n for (let i = 0; i < arr.length; i += 1) {\n counts[arr[i]] = (counts[arr[i]] ?? 0) + 1;\n counts[sortedArr[i]] = (counts[sortedArr[i]] ?? 0) - 1;\n\n if (Object.values(counts).every((value) => value === 0)) {\n chunkAmount += 1;\n }\n }\n\n return chunkAmount;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095908728","body":"```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\nvar rotateRight = function (head, k) {\n if (!head || !head.next) return head;\n\n let length = 0;\n let cur = head;\n\n while (cur) {\n cur = cur.next;\n length += 1;\n }\n\n k = k % length;\n let left = head;\n let right = head;\n\n while (right.next) {\n if (k <= 0) left = left.next;\n right = right.next;\n k -= 1;\n }\n\n right.next = head; // Handle the case when left and right point to the same node.\n let res = left.next;\n left.next = null;\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3102283858","body":"建立一個 dummy 連結在 head 之前,便可以將 head 當作中間節點處理。每次互換節點會牽涉四個節點,pre, cur, next, next.next,其中 pre 的初始值為 dummy,因此在每個迴圈保證有值,而真正要互換的 cur, next,其兩有值為 while 迴圈繼續的必要條件,next.next 為 null 則沒關係。\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n const dummy = { val: 0, next: head };\n\n let pre = dummy;\n let cur = pre.next;\n let next = cur?.next;\n\n while (cur && next) {\n pre.next = next;\n cur.next = next.next;\n next.next = cur;\n\n [pre, cur, next] = [cur, cur.next, cur.next?.next];\n }\n\n return dummy.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105649705","body":"# 想法\n轉換成 Height Balanced Binary Search Tree 會需要進行 Binary Search,考慮到單向鏈錶不方便直接存取 node,因此直接將鏈錶轉成數組,並直接以數組配合 Binary Search 遞迴建立樹。\n\n```\n\n// Time Complexity: O(n);\n// Space Complexity: O(n);\n\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if (head === null) return null;\n\n const dummy = new ListNode(0, head);\n const arr = [];\n\n let tail = dummy;\n\n while (tail) {\n const next = tail.next;\n next && arr.push(next.val);\n tail = next;\n }\n\n const inner = (l, r) => {\n if (l > r) return null;\n if (l === r) return new TreeNode(arr[r]);\n\n const m = Math.ceil((l + r) / 2);\n\n return new TreeNode(arr[m], inner(l, m - 1), inner(m + 1, r));\n };\n\n return inner(0, arr.length - 1);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112936097","body":"## 思考方向\n### 雙指針\n用兩個指針分別從 headA, headB 開始走,走到盡頭換到另一個 head。過程中若指向同一個點則為兩鏈錶的交點,若皆遍歷一遍後無交點,則兩鏈錶無相交。\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function(headA, headB) {\n let pointerA = headA;\n let pointerB = headB;\n let switchCounts = 0;\n\n while (switchCounts < 3) {\n if (pointerA === pointerB) return pointerA;\n\n if (pointerA?.next) {\n pointerA = pointerA.next;\n } else {\n switchCounts += 1;\n pointerA = headB;\n }\n\n if (pointerB?.next) {\n pointerB = pointerB.next;\n } else {\n switchCounts += 1;\n pointerB = headA;\n }\n }\n\n return null;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116343077","body":"## 解題方向\n- 快慢指針法\n\n## Edge Cases\n- 當快指針走到 null 代表沒有環\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n let fast = head;\n let slow = head;\n\n do {\n if (fast === null) return null;\n\n fast = fast?.next?.next ?? null;\n slow = slow?.next ?? null;\n } while (fast !== slow);\n\n fast = head;\n\n while (fast !== slow) {\n fast = fast?.next ?? null;\n slow = slow?.next ?? null;\n }\n\n return fast;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121584769","body":"## 解題方向\n- 看到 FISO 的第一個想法是用 Queue,搭配 hash 也可以達到 get O(1) 的要求,不過 put 更新既有的值,就沒辦法 O(1)。\n若是 put 更新既有的值要 O(1),還是需要使用鏈表。\n- 中間有一度 debug 卡關,主要是原本在 put 時無論如何都先把既有的 node 刪掉再新增,但這可能造成一些 state 更新上的錯誤,後來簡化為直接移動 node 才 AC。\n\n```\n// Time Complexity: O(1) for LRUCache.prototype.get, put\n// Space Complexity: O(n)\n\nfunction ListNode(key, val) {\n this.key = key;\n this.val = val;\n this.next = null;\n this.pre = null;\n }\n\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.length = 0;\n this.head = new ListNode();\n this.tail = new ListNode();\n this.head.next = this.tail;\n this.tail.pre = this.head;\n this.map = {};\n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n const node = this.map[key];\n\n if (node !== undefined) {\n this.appendToTail(this.remove(node));\n return node.val\n };\n\n return -1;\n};\n\n/** \n * @param {number} key \n * @param {number} val\n * @return {void}\n */\nLRUCache.prototype.put = function(key, val) {\n const node = this.map[key];\n\n if (node !== undefined) {\n node.val = val;\n this.appendToTail(this.remove(node));\n } else {\n if (this.length === this.capacity) {\n const old = this.head.next;\n delete this.map[old.key];\n this.length -= 1;\n this.remove(old);\n }\n\n const node = new ListNode(key, val);\n this.map[key] = node;\n this.length += 1;\n this.appendToTail(node);\n }\n};\n\nLRUCache.prototype.appendToTail = function(node) {\n if (node.pre) node.pre.next = node.next;\n if (node.next) node.next.pre = node.pre;\n this.tail.pre.next = node;\n node.pre = this.tail.pre;\n node.next = this.tail;\n this.tail.pre = node;\n}\n\nLRUCache.prototype.remove = function(node) {\n node.pre.next = node.next;\n node.next.pre = node.pre;\n node.pre = null;\n node.next = null;\n\n return node;\n}\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123752698","body":"## 解題方向\n### DFS\n- 需注意當 helper 的 params root 為 null 時,應回傳 0\n\n```\n// Time Complexity: O(n), n for numbers of nodes.\n// Space Complexity: O(h), h for the max depth of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n const helper = (root) => {\n if (!root) return 0;\n if (!root.left && !root.right) return 1;\n return Math.max(helper(root.left), helper(root.right)) + 1;\n };\n\n return helper(root);\n};\n```\n\n### Layer Iteration\n- 由於 stack 的起始值就有一個 root node,因此要先處理 root 為 null 的狀況\n\n```\n// Time Complexity: O(n), n for numbers of nodes.\n// Space Complexity: O(w), w for the max numbers of nodes in the same layer of tree.\n\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if (!root) return 0;\n\n const stack = [{ node: root, depth: 1 }];\n let maxDepth = 0;\n\n while (stack.length) {\n const { node, depth } = stack.shift();\n if (node.left) stack.push({ node: node.left, depth: depth + 1 });\n if (node.right) stack.push({ node: node.right, depth: depth + 1 });\n maxDepth = Math.max(maxDepth, depth);\n }\n\n return maxDepth;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125050709","body":"## 解題方向\n- 須理解兩棵樹一樣的意思是,其遍歷的結果會一樣,又題目有提到左右節點位置不同也不行,因此可以用多個遍歷結果來確認,或者可以將中間的空節點印出。可優化空間是不需要若於遍歷過程比較兩棵樹的節點,就不需要儲存遍歷結果。\n\n```javascript\n// Time Complexity: O(m + n), m, n are numbers of two tree nodes respectively.\n// Space Complexity: O(m + n)\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} p\n * @param {TreeNode} q\n * @return {boolean}\n */\nvar isSameTree = function(p, q) {\n const iterate = (root) => {\n const arr = [];\n const stack = [root];\n\n while (stack.length) {\n const node = stack.shift();\n\n arr.push(node?.val);\n\n if (node?.left || node?.right) {\n stack.push(node?.left);\n stack.push(node?.right);\n }\n }\n\n return arr;\n };\n\n return JSON.stringify(iterate(p)) === JSON.stringify(iterate(q));\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3131156971","body":"## 解題方向\n- 需要計算所有從 root 走到 leaf 的路線,這可以用 Recursion 來完成(回溯)\n- 用一個數字來紀錄 state:增加位數為「runningNumber * 10 + node.val」,減去位數為「Math.floor(runningNumber / 10)」\n\n```javascript\n// Time Complexity: O(n), n is the number of the tree nodes\n// Space Complexity: O(d), d is the depth of the tree\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root) {\n let sum = 0;\n let runningNumber = 0;\n\n const inner = (root) => {\n if (root) {\n runningNumber = runningNumber * 10 + root.val;\n\n if (!root.left && !root.right) {\n sum += runningNumber;\n } else {\n inner(root.left);\n inner(root.right);\n }\n\n runningNumber = Math.floor(runningNumber / 10);\n }\n };\n\n inner(root);\n\n return sum;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134845036","body":"## 解題方向\n- 可以使用 DFS 或 BFS 來解題\n- DFS 記錄最深深度的第一個節點數值,深度可作為參數於每次遞迴時傳遞\n- BFS 紀錄每層第一個節點數值\n- 題目保證 root 一定不為 null\n\n### DFS\n```javascript\n// Time Complexity: O(n), n is the number of tree nodes.\n// Space Complexity: O(d), d is the max depth of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let maxDepth = 0;\n let res = null;\n\n const dfs = (root, depth) => {\n if (depth > maxDepth) {\n maxDepth = depth;\n res = root.val;\n }\n\n root.left && dfs(root.left, depth + 1);\n root.right && dfs(root.right, depth + 1);\n };\n\n dfs(root, 1);\n\n return res;\n};\n```\n\n### BFS\n```javascript\n// Time Complexity: O(n), n is the number of tree nodes.\n// Space Complexity: O(w), w is the max width of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n const stack = [[root]];\n let res = null;\n\n while (stack.length) {\n const nodes = stack.pop();\n\n res = nodes[0].val;\n\n const nextNodes = [];\n\n for (const node of nodes) {\n node.left && nextNodes.push(node.left);\n node.right && nextNodes.push(node.right);\n }\n\n nextNodes.length && stack.push(nextNodes);\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138426787","body":"## 解題方向\n* 使用 DNS 前序遍歷,在 deserialize 時透過遞迴建立樹會較 BFS 容易。\n* 使用原生的 JSON.stringify and JSON.parse 來轉換 array 及 string\n* 優化方向:優化 Space Complexity 至 O(h),h 為樹的高度\n * 能直接產生 serialized string 而非在最後轉化\n * 一邊 deserialize 需要的 string 部分,而不需要在一開始開一個 array 儲存\n\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n// Time Complexity: O(n), n is number of tree nodes.\n// Space Complexity: O(n), n is number of tree nodes.\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n const preOrder = [];\n const dns = (root) => {\n preOrder.push(root?.val);\n if (root) {\n dns(root.left);\n dns(root.right);\n }\n };\n dns(root);\n\n return JSON.stringify(preOrder);\n};\n\n// Time Complexity: O(n), n is number of tree nodes.\n// Space Complexity: O(n), n is number of tree nodes.\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n const preOrder = JSON.parse(data);\n\n if (preOrder[0] === null || preOrder[0] === undefined) return preOrder[0];\n\n const createNode = () => {\n const val = preOrder.shift();\n\n if (val === null) return null;\n\n const node = new TreeNode(val);\n node.left = createNode();\n node.right = createNode();\n return node;\n };\n\n return createNode();\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144639245","body":"## 解題方向\n- 不一樣的遍歷方式會有差嗎? => 由於打算取值後再排序,因此沒差\n- 如何儲存最後的輸出最省力 => 用 hashmap\n\n```javascript\n// Time Complexity: O(nlogn), n is the number of tree.\n// Space Complexity: O(n), n is the number of tree.\n\n// /**\n// * Definition for a binary tree node.\n// * function TreeNode(val, left, right) {\n// * this.val = (val===undefined ? 0 : val)\n// * this.left = (left===undefined ? null : left)\n// * this.right = (right===undefined ? null : right)\n// * }\n// */\n// /**\n// * @param {TreeNode} root\n// * @return {number[][]}\n// */\nvar verticalTraversal = function(root) {\n const map = {};\n\n const traverse = (root, row, col) => {\n if (!root) return;\n\n if (!map[col]) {\n map[col] = [];\n }\n\n map[col].push([row, root.val]);\n traverse(root.left, row + 1, col - 1);\n traverse(root.right, row + 1, col + 1);\n };\n\n traverse(root, 0, 0);\n\n const keys = Object.keys(map).sort((a, b) => a - b);\n\n const res = keys.map((k) => {\n const arr = map[k];\n\n return arr.sort(([rowA, valA], [rowB, valB]) => {\n if (rowA === rowB) return valA - valB;\n return rowA - rowB;\n }).map(([,val]) => val);\n });\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146092009","body":"## 解題方向\n- 遍歷 nums 時使用 hashmap 來記錄曾出現過的數字及其 index,並看 hashmap 是否記錄 target - nums[i] 是否曾出現過\n- 可以特別注意題目要求同個元素不能被使用兩次,所以應將配對到的元素移出 hashmap(不過因為題目也說只有一組數字為答案,所以不做也沒關係)\n\n```javascript\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(1) \n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n const map = {};\n const res = [];\n\n for (let i = 0; i < nums.length; i += 1) {\n const num = nums[i];\n\n if (map[target - num] !== undefined) {\n res.push(i, map[target - num]);\n delete map[target - num];\n } else {\n map[num] = i;\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3146907342","body":"## 解法\n- 第一個想法是遍歷後得到 num 與其 frequency 的 hashmap,將其轉成 array 後排序並取前 k 者\n- 看了題解後可優化部分是,由於題目允許回傳值不需要依據 frequency 排序,因此可將原解法 sort 的部分改成 quick selection,將平均時間複查度從 O(nlogn) 將至 O(n)\n```javascript\n// Time Complexity: O(nlogn), n is nums.length.\n// Space Complexity: O(n), n is nums.length.\n\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function (nums, k) {\n const map = {};\n\n for (const num of nums) {\n map[num] = (map[num] ?? 0) + 1;\n }\n\n return Object.entries(map)\n .sort(([numA, freqA], [numB, freqB]) => {\n return freqB - freqA;\n })\n .filter((_, i) => i < k)\n .map(([num]) => Number(num));\n};\n```\n\n## 解法\n- 找 max frequent num\n- 回傳 left, right index range\n- 需要考慮當兩個 num frequency 相等時,應保留 range 較小者!\n```javascript\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(n), n is nums.length.\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findShortestSubArray = function (nums) {\n let maxFreqNum = nums[0];\n const map = {};\n\n for (let i = 0; i < nums.length; i += 1) {\n const num = nums[i];\n const { freq, left, right } = map[num] ?? { freq: 0, left: i, right: i };\n map[num] = {\n freq: freq + 1,\n left: i < left ? i : left,\n right: i > right ? i : right,\n };\n\n if (map[num].freq > map[maxFreqNum].freq) {\n maxFreqNum = num;\n } else if (map[num].freq === map[maxFreqNum].freq) {\n if (\n map[num].right - map[num].left <\n map[maxFreqNum].right - map[maxFreqNum].left\n ) {\n maxFreqNum = num;\n }\n }\n }\n\n const { left, right } = map[maxFreqNum];\n\n return right - left + 1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149617346","body":"```javascript\n// Time Complexity: O(n^2), n is points.length.\n// Space Complexity: O(n), n is points.length.\n\n/**\n * @param {number[][]} points\n * @return {number}\n */\nfunction numberOfBoomerangs(points) {\n const n = points.length;\n let ans = 0;\n \n for (let i = 0; i < n; i++) {\n const distanceMap = {};\n \n for (let j = 0; j < n; j++) {\n const dist = Math.pow(points[i][0] - points[j][0], 2) + Math.pow(points[i][1] - points[j][1], 2);\n distanceMap[dist] = (distanceMap[dist] ?? 0) + 1;\n }\n \n for (const count of Object.values(distanceMap)) {\n ans += count * (count - 1);\n }\n }\n \n return ans;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153048738","body":"## 解法\n- 經典的滑動視窗題目,與用 hashmap 紀錄字元的出現次數,並於迴圈中判斷下個字元是否已出現過,無則加入,有則刪除。\n- 需要特別注意\n- (1) 迴圈的邊界條件應為 right < s.length - 1,不然會讓 right 跑到 s.length\n- (2) 應先刪掉 map[s[left]] 再 left++\n\n```javascript\n// Time Complexity: O(n), n is s.length.\n// Space Complexity: O(m), m is types of characters in s.\n\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n if (!s.length) return 0;\n \n const chars = new Map();\n chars.set(s[0], 1);\n\n let max = 1;\n let left = 0;\n let right = 0;\n\n while (right < s.length - 1) {\n const cond = !chars.has(s[right + 1]);\n if (!chars.has(s[right + 1])) {\n right++;\n chars.set(s[right], 1);\n } else {\n chars.delete(s[left]);\n left++;\n }\n\n const number = right - left + 1;\n if (number > max) max = number;\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160434225","body":"## 解法\n- 一開始分析方向錯了,以為每個 substring 間不可重疊\n- 之後想到的是用 hashmap 存可能 substring 的結果,再遍歷一次,但是時間複雜度為階乘\n- 最後則是直接遍歷,再驗證 substring 是否正確,然而需考慮 words 的 element 是否會重複\n\n```javascript\n// Time Complexity: O(n * m * k), n is s.length, m is words[0].length, k is words.lenght.\n// Space Complexity: O(m).\n\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n const defaultMap = (() => {\n const m = {};\n for (const word of words) {\n m[word] = (m[word] ?? 0) + 1;\n }\n return m;\n })();\n let map = JSON.parse(JSON.stringify(defaultMap));\n const wordLength = words[0].length;\n const substringLength = wordLength * words.length;\n\n const validate = (substring) => {\n let cur = 0;\n map = JSON.parse(JSON.stringify(defaultMap));\n\n while (cur < substring.length) {\n const target = substring.substring(cur, cur + wordLength);\n if (map[target]) {\n map[target] -= 1;\n cur += wordLength;\n } else return false;\n }\n\n return true;\n };\n\n const res = []\n\n for (let i = 0; i < s.length - substringLength + 1; i++) {\n const substring = s.substring(i, i + substringLength);\n if (validate(substring)) res.push(i);\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3164019442","body":"## 解法\n- 一開始漏看了連續短數組的條件,之後想到暴力法,也有個感覺優化必定涉及數學技巧,因此直接看題解\n- 需要理解兩個技巧:負數取模 floorMod 和 map.set(0, -1) 以處理欲從 sum[i] - sum[j] 計算 i 至 j 範圍時,當 j 為 0 遇到的計算問題\n\n```javasciprt\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(min(n, k))\n\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar floorMod = function (a, b) {\n return ((a % b) + b) % b;\n};\n\nfunction minSubarray(nums, k) {\n var map = new Map();\n map.set(0, -1);\n var res = nums.length;\n var target = 0;\n var currSum = 0;\n for (let i = 0; i < nums.length; i++) {\n target += nums[i];\n }\n target = target % k;\n if (target === 0) return 0;\n for (let i = 0; i < nums.length; i++) {\n currSum = (nums[i] + currSum) % k;\n\n var prevSum = floorMod(currSum - target, k);\n if (map.has(prevSum)) {\n res = Math.min(res, i - map.get(prevSum));\n }\n map.set(currSum, i);\n }\n return res === nums.length ? -1 : res;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168248088","body":"## 解法\n- 窮舉前面的例子就可以得到規律:先處理只有一個 node 的 edge case,當 fast.next?.next 不為 null,即存在下下個 node 的情況下移動快慢指針,不然慢指針的下個 node 即是中間節點。\n```javascript\n// 1 => 1\n\n// 1, 2 => 2 => slow 1, fast 2\n// 1, 2, 3 => 2 => slow 1, fast 2\n\n// 1, 2, 3, 4 => 3 => slow 2, fast 4\n// 1, 2, 3, 4, 5 => 3 => slow 2, fast 4\n\n// 1, 2, 3, 4, 5, 6 => 4\n// 1, 2, 3, 4, 5, 6, 7 => 4\n\n// 1, 2, 3, 4, 5, 6, 7, 8 => 5\n// 1, 2, 3, 4, 5, 6, 7, 8, 9 => 5\n```\n\n```javascript\n// Time Complexity: O(n), n is linked list length,\n// Space Complexity: O(1)\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n if (!head.next) return head;\n\n let slow = head;\n let fast = head.next;\n\n while (fast.next?.next) {\n slow = slow.next;\n fast = fast.next.next;\n };\n\n return slow.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170547569","body":"## 解法\n- 一開始沒注意到 Space Complexity O(1) 的要求,因此用 map 來記錄曾遍歷過的數字,並使用 nums.splice 來原地刪除重複元素\n- 若限制 Space Complexity 為 O(1),則需要如題解用快慢指針來做\n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n let slow = 0;\n let fast = 0;\n\n while (fast < nums.length) {\n if (nums[fast] !== nums[slow]) {\n slow++;\n nums[slow] = nums[fast];\n }\n \n fast++;\n }\n\n return slow + 1;\n};\n\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n const map = {};\n let res = 0;\n let i = nums.length - 1;\n\n while (i >= 0) {\n const num = nums[i];\n\n if (map[num]) {\n nums.splice(i, 1);\n } else {\n map[num] = 1;\n res += 1;\n };\n\n i--;\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172259657","body":"## 解法\n- 經典的二分查找,需注意沒有找到 target 的 edge case\n\n```javascript\n// Time Complexity: O(logn), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let l = 0;\n let r = nums.length - 1;\n let m = -1;\n\n while (l <= r) {\n m = l + Math.floor((r - l) / 2);\n\n if (nums[m] === target) return m;\n else if (nums[m] > target) r = m - 1;\n else l = m + 1;\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173778506","body":"## 解法\n- 第一泡茶的確是暴力解,之後會想到 max heap,但每次 push 仍需要耗費 O(logn)\n- 有想過使用 monotonic stack 來做,但卡沒仔細想就覺得可能無法正確排除 sliding window 外的元素而作罷,而這其實可以靠題解中的 shift 來完成,又因為不是嚴格遞增棧,所以遇到相等數值時,前者仍會被保留,而確保 shift 的操作都是正確的\n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(k)\n\nvar maxSlidingWindow = function (nums, k) {\n const res = [];\n const dequeue = new Dequeue([]);\n\n for (let i = 0; i < k - 1; i++) {\n dequeue.push(nums[i]);\n }\n\n for (let i = k - 1; i < nums.length; i++) {\n dequeue.push(nums[i]);\n res.push(dequeue.max());\n dequeue.shift(nums[i - k + 1]);\n }\n\n return res;\n};\n\nclass Dequeue {\n constructor(nums) {\n this.list = nums; // Should be implemented as a linked list to make time complexity of dequeue.shift() as O(1).\n }\n\n push(val) {\n const nums = this.list;\n\n while (nums[nums.length - 1] < val) {\n nums.pop();\n }\n\n nums.push(val);\n }\n\n shift(val) {\n let nums = this.list;\n\n if (nums[0] === val) {\n nums.shift();\n }\n }\n\n max() {\n return this.list[0];\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178234382","body":"## 解法\n- 第一泡茶,可以透過紀錄一個人信任及被信任的人數來解題。其中可以不斷紀錄目前被信任人數最高者方便最後判斷是否為法官\n- 看了題解後發現可以用圖來解,之後補上\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n const trustFroms = new Array(n).fill(0);\n const trustTos = new Array(n).fill(0);\n let maybeJudge = { index: 0, trustTo: 0 };\n\n for (const t of trust) {\n const [from, to] = [t[0] - 1, t[1] - 1];\n trustFroms[from]++;\n trustTos[to]++;\n if (trustTos[to] > maybeJudge.trustTo) maybeJudge = { index: to, trustTo: trustTos[to] };\n }\n\n if (maybeJudge.trustTo === n - 1) {\n if (trustFroms[maybeJudge.index] === 0) return maybeJudge.index + 1;\n }\n\n return -1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3184149014","body":"```javascript\n// Time Complexity: O(v + e)\n// Space Complexity: O(v + e)\n\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nconst possibleBipartition = (n, dislikes) => {\n const graph = new Array(n + 1).fill().map(() => new Array())\n const colors = new Array(n + 1).fill(-1);\n\n for (const [a, b] of dislikes) {\n graph[a].push(b);\n graph[b].push(a);\n }\n\n const dfs = (cur, color = 0) => {\n colors[cur] = color;\n\n for (const nxt of graph[cur]) {\n if (colors[nxt] !== -1 && colors[nxt] === color) return false;\n if (colors[nxt] === -1 && !dfs(nxt, color ^ 1)) return false;\n }\n\n return true;\n };\n\n for (let i = 0; i < n + 1; i++) {\n if (colors[i] === -1 && !dfs(i, 0)) return false;\n }\n\n return true;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186799518","body":"```javascript\n// Time Complexity: O(n + e), e is sum of beforeItems.flat().length\n// Space Complexity: O(n + e)\n\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n const topologicalSort = (items, indegree, neighbors) => {\n const queue = [];\n const result = [];\n \n for (const item of items) {\n if (indegree[item] === 0) {\n queue.push(item);\n }\n }\n \n while (queue.length > 0) {\n const current = queue.shift();\n result.push(current);\n \n const currentNeighbors = neighbors[current] || [];\n for (const neighbor of currentNeighbors) {\n indegree[neighbor]--;\n if (indegree[neighbor] === 0) {\n queue.push(neighbor);\n }\n }\n }\n \n return result;\n };\n \n let maxGroupId = m;\n for (let item = 0; item < n; item++) {\n if (group[item] === -1) {\n group[item] = maxGroupId;\n maxGroupId++;\n }\n }\n \n const itemIndegree = Array.from({length: n}, () => 0);\n const groupIndegree = Array.from({length: maxGroupId}, () => 0);\n const itemNeighbors = Array.from({length: n}, () => []);\n const groupNeighbors = Array.from({length: maxGroupId}, () => []);\n const groupItems = Array.from({length: maxGroupId}, () => []);\n \n for (let item = 0; item < n; item++) {\n groupItems[group[item]].push(item);\n }\n \n for (let item = 0; item < n; item++) {\n const dependencies = beforeItems[item] || [];\n \n for (const dependency of dependencies) {\n if (group[dependency] !== group[item]) {\n groupIndegree[group[item]]++;\n groupNeighbors[group[dependency]].push(group[item]);\n } else {\n itemIndegree[item]++;\n itemNeighbors[dependency].push(item);\n }\n }\n }\n \n const groups = Array.from({length: maxGroupId}, (_, i) => i);\n const sortedGroups = topologicalSort(groups, groupIndegree, groupNeighbors);\n \n if (sortedGroups.length !== maxGroupId) {\n return [];\n }\n \n const result = [];\n \n for (const groupId of sortedGroups) {\n const items = groupItems[groupId];\n const sorteditems = topologicalSort(items, itemIndegree, itemNeighbors);\n \n if (sorteditems.length !== items.length) {\n return [];\n }\n \n result.push(...sorteditems);\n }\n \n return result;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190479297","body":"```javascript\n// Time Complexity: O(n), n is moves.length\n// Space Complexity: O(1)\n\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let [x, y] = [0, 0];\n\n for (let i = 0; i < moves.length; i++) {\n const action = moves.substring(i, i + 1);\n if (action === 'R') x++;\n if (action === 'L') x--;\n if (action === 'U') y++;\n if (action === 'D') y--;\n }\n\n return x === 0 && y === 0;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193447956","body":"## 題解\n- 一開始使用 Array + Sort 的方法實作,不過由於 Time Complexity 為 O(n^2logn),在資料量 1 <= n <= 10^5 的條件下,會沒辦法 AC\n- 需要將資料結構改成 Min Heap 來降低時間複雜度\n\n```javascript\n// Min Heap\n// Time Complexity: O(nlogn)\n// Space Complexity: O(logn)\n\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function (tasks) {\n const indices = Array.from({ length: tasks.length }, (_, i) => i);\n\n indices.sort((a, b) => { return tasks[a][0] - tasks[b][0] });\n\n const minHeap = new PriorityQueue((a, b) => {\n if (tasks[a][1] !== tasks[b][1]) {\n return tasks[a][1] - tasks[b][1];\n }\n return a - b;\n });\n\n const res = [];\n let time = 0;\n let i = 0;\n\n while (!minHeap.isEmpty() || i < tasks.length) {\n while (i < tasks.length && tasks[indices[i]][0] <= time) {\n minHeap.enqueue(indices[i]);\n i++;\n }\n\n if (minHeap.size() === 0) {\n time = tasks[indices[i]][0];\n } else {\n const nextIndex = minHeap.dequeue();\n time += tasks[nextIndex][1];\n res.push(nextIndex);\n }\n }\n\n return res;\n};\n\n// Array + Sort\n// Time Complexity: O(n^2logn)\n// Space Complexity: O(n)\n\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n tasks = tasks.map((t, i) => [...t, i]);\n tasks.sort((a, b) => a[0] === b[0] ? a[2] - b[2] : a[0] - b[0]);\n\n let i = 0;\n let curTime = 0;\n const queue = [];\n const res = [];\n\n while (i < tasks.length || queue.length) {\n while (i < tasks.length && tasks[i][0] <= curTime) {\n queue.push(tasks[i]);\n queue.sort((a, b) => a[1] === b[1] ? a[2] - b[2] : a[1] - b [1]);\n i++;\n }\n\n if (!queue.length) {\n curTime = tasks[i][0];\n } else {\n const curTask = queue.shift();\n res.push(curTask[2]);\n curTime += curTask[1];\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194091917","body":"```javascript\n// Time Complexity: O(1)\n// Space Complexity: O(1)\n\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n const getMinSum = (time, carry) => {\n let [hour, min] = time.split(':').map(s => Number(s));\n const remainer = min % 15;\n const q = (min - remainer) / 15;\n\n if (!carry) {\n return (hour * 60) + min;\n } else if (remainer && carry === 'ceil') {\n return (hour * 4 + q + 1) * 15;\n } else {\n return (hour * 4 + q) * 15;\n }\n };\n\n let [loginMinSum, logoutMinSum] = [getMinSum(loginTime, 'ceil'), getMinSum(logoutTime, 'floor')];\n\n if (getMinSum(loginTime) > getMinSum(logoutTime)) {\n logoutMinSum += 24 * 60;\n }\n\n return Math.max((logoutMinSum - loginMinSum) / 15, 0)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3196057927","body":"## 題解\n- 原本想針對三種狀況,直接找 a 和 b 中最符合的 char 來做計算,但會發現很多 edge case 要考量,要一直修正\n- 看題解之後,在有限的解空間中(頂多常數 26),枚舉的確是一個簡單、可讀性更好的做法\n\n```javascript\n// Time Complexity: O(n + m), n is a.length, m is b.length\n// Space Complexity: O(26)\n\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n const createCounter = (str) => {\n const counter = {};\n\n for (let i = 0; i < 26; i++) {\n counter[String.fromCharCode(97 + i)] = 0;\n }\n\n for (const char of str) {\n counter[char]++;\n }\n return counter;\n };\n \n const ca = createCounter(a);\n const cb = createCounter(b);\n\n const greaterCost = (ca, cb) => {\n let ans = Infinity;\n\n for (let i = 1; i < 26; i++) {\n let count = 0;\n \n for (let j = 0; j < i; j++) {\n count += ca[String.fromCharCode(97 + j)];\n }\n \n for (let j = i; j < 26; j++) {\n count += cb[String.fromCharCode(97 + j)];\n }\n ans = Math.min(ans, count);\n }\n return ans;\n };\n \n const equalCost = (ca, cb) => {\n let ans = Infinity;\n for (let i = 0; i < 26; i++) {\n const char = String.fromCharCode(97 + i);\n ans = Math.min(ans, a.length + b.length - ca[char] - cb[char]);\n }\n return ans;\n };\n \n return Math.min(\n greaterCost(ca, cb),\n greaterCost(cb, ca),\n equalCost(ca, cb)\n );\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199125049","body":"## 題解\n- 直覺就是用快速排序來做,不過實踐上,這次發現 partition 有兩種方法可以做:hoarePartition、lomutoPartition。其中 lomutoPartition 普遍認為較簡單,但因為交換數值的次數較多,會遇到 TLE,因此此題需用 hoarePartition 來做。\n\n```javascript\nconst lomutoPartition = (nums, left, right) => {\n const pivot = nums[right];\n let i = left - 1;\n\n for (let j = left; j < right; j++) {\n if (nums[j] <= pivot) {\n i++;\n [nums[i], nums[j]] = [nums[j], nums[i]];\n }\n }\n\n i++;\n [nums[i], nums[right]] = [nums[right], nums[i]];\n\n return i;\n};\n\nconst hoarePartition = (nums, left, right) => {\n const p = left + ((right - left) >>> 1);\n const pivot = nums[p];\n let [i, j] = [left, right];\n\n while (i <= j) {\n while (nums[i] < pivot) i++;\n while (nums[j] > pivot) j--;\n if (i <= j) {\n [nums[i], nums[j]] = [nums[j], nums[i]];\n i++;\n j--;\n }\n }\n\n return [i, j];\n};\n\nconst quickSort = (nums, left, right) => {\n // if (left < right) {\n // const p = lomutoPartition(nums, left, right);\n // quickSort(nums, left, p - 1);\n // quickSort(nums, p + 1, right);\n // }\n\n if (left < right) {\n const [i, j] = hoarePartition(nums, left, right);\n quickSort(nums, left, j);\n quickSort(nums, i, right);\n }\n};\n\n// Time Complexity: O(nlogn), n is nums.length\n// Space Complexity: O(logn)\n\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function (nums) {\n quickSort(nums, 0, nums.length - 1);\n return nums;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204182883","body":"```javascript\n// Time Complexity: O(logn)\n// Space Complexity: O(1)\n\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n let res = 0;\n let l = 0;\n let r = x;\n\n while (l <= r) {\n const m = l + ((r - l) >>> 2);\n\n if (m * m > x) {\n r = m - 1;\n } else {\n res = m;\n l = m + 1;\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3209343494","body":"## 題解\n- 可以將這題轉化成「尋找最左邊符合條件者」,即可套入模板\n\n```javascript\n// Time Complexity: O(logn)\n// Space Complexity: O(1)\n\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let [l, r] = [1, n];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 2);\n\n if (isBadVersion(m)) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n };\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3212999531","body":"## 題解\n- 二分:對於每一個元素前者排序,並找到大於 a * 2 者(重複 a * 2 的右界)。需注意是,應在每次加入新元素時,直接尋找其應該插入的位置,而非將整個陣列排序,不然會 TLE。\n\n```javascript\nclass SortedList {\n constructor() {\n this.arr = [];\n }\n\n bisectRight(target) {\n let [l, r] = [0, this.arr.length - 1];\n\n while (l <= r) {\n const mid = l + ((r - l) >>> 1);\n\n if (this.arr[mid] <= target) {\n l = mid + 1;\n } else {\n r = mid - 1;\n }\n }\n\n return l;\n }\n \n push(value) {\n const pos = this.bisectRight(value);\n this.arr.splice(pos, 0, value);\n }\n \n get length() {\n return this.arr.length;\n }\n}\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n const sortedRunningNums = new SortedList();\n sortedRunningNums.push(nums[0]);\n let ans = 0;\n\n for (let i = 1; i < nums.length; i++) {\n ans += (i - sortedRunningNums.bisectRight(nums[i] * 2));\n sortedRunningNums.push(nums[i]);\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216534944","body":"## 題解\n- 依序遍歷 houses,尋找每個 house 與 heater 最近距離,最大者為答案。其中尋找最近距離的實踐,可以使用 bisectRight 來做\n\n```javascript\n// Time Complexity: O(nlog m + mlog m), n is houses.length, m is heaters.length\n// Space Complexity: O(1)\n\nconst getHouseHeaterMinDistance = (house, heaters) => {\n if (heaters.length === 0) return Infinity;\n if (heaters.length === 1) return Math.abs(house - heaters[0]);\n\n let [l, r] = [0, heaters.length - 1];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (house === heaters[m]) {\n return 0;\n } else if (house > heaters[m]) {\n l = m + 1;\n } else {\n r = m - 1;\n };\n }\n\n const leftDistance = l === 0 ? Infinity : house - heaters[l - 1];\n const rightDistance = r === heaters.length - 1 ? Infinity : heaters[l] - house;\n\n return Math.min(leftDistance, rightDistance);\n};\n\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n heaters.sort((a, b) => a - b);\n\n let maxRadius = 0;\n\n for (const house of houses) {\n const minDistance = getHouseHeaterMinDistance(house, heaters);\n maxRadius = Math.max(maxRadius, minDistance);\n }\n\n return maxRadius;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217908480","body":"## 題解\n- 計數二分經典的題目,排序後解空間為 0 至 nums[lnums.ength - 1] - nums[0]\n\n```javascript\n// Time Complexity: O(nlogn)\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a, b) => a - b);\n\n const countDistanceNotGreaterThan = (maxDistance) => {\n let count = 0;\n let l = 0;\n\n for (let r = 1; r < nums.length; r++) {\n while (nums[r] - nums[l] > maxDistance) {\n l++;\n }\n\n count += r - l;\n }\n\n return count;\n };\n\n let [l, r] = [0, nums[nums.length - 1] - nums[0]];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (countDistanceNotGreaterThan(m) >= k) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218836123","body":"## 題解\n- 用二分在解空間 [0, maxElevation] 中尋找答案,對於每個可能的 m,再 dns 尋找可能路徑\n- 需注意因為 dns 時多了 grid[ni][nj] <= elevation 的條件,不需重置 visited[i][j],因為就算從其他點進來該點,依舊會沒辦法繼續走下去,與尋找所有路徑的 dns 略有不同\n\n```javascript\n// Time Complexity: O(n^2logn)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n const n = grid.length;\n\n const maxElevation = (() => {\n let e = 0;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n e = Math.max(e, grid[i][j]);\n }\n }\n return e;\n })();\n\n const canReachBottomRight = (elevation) => {\n const visited = Array.from({ length: n}).map(() => Array.from({ length: n }).map(() => false));\n\n const dns = (i, j) => {\n if (i === n - 1 && j === n - 1) return true;\n\n visited[i][j] = true;\n\n const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];\n\n for (const [di, dj] of directions) {\n const ni = i + di;\n const nj = j + dj;\n\n if (ni >= 0 && ni < n && nj >= 0 && nj < n) {\n if (!visited[ni][nj] && grid[ni][nj] <= elevation) {\n if (dns(ni, nj)) return true;\n }\n }\n }\n\n // visited[i][j] = false;\n\n return false;\n };\n\n if (grid[0][0] <= elevation) return dns(0, 0);\n else return false;\n };\n\n let l = 0;\n let r = maxElevation;\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (canReachBottomRight(m)) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222489820","body":"## 題解\n- 典型的 sliding window 題型\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(1)\n\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n const vowel = 'aeiou';\n let l = 0;\n let r = 0;\n let cur = 0;\n let max = cur;\n\n while (r < s.length) {\n if (vowel.includes(s.charAt(r))) cur++;\n r++;\n\n if (r - l > k) {\n if (vowel.includes(s.charAt(l))) cur--;\n l++;\n }\n\n max = Math.max(max, cur);\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3226683449","body":"```javascript\n// Time Complexity: O(k + maxPts)\n// Space Complexity: O(k + maxPts)\n\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n const dp = Array.from({ length: k + maxPts }).map(() => 0);\n let sum = 0;\n\n for (let i = k; i < k + maxPts; i++) {\n if (i <= n) dp[i] = 1;\n sum += dp[i];\n }\n\n for (let j = k - 1; j >= 0; j--) {\n dp[j] = sum / maxPts;\n sum -= dp[j + maxPts];\n sum += dp[j];\n }\n\n return dp[0];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3234016259","body":"```javascript\n// Time Complexity: O(n), n is s.length\n// Space COmplexity: O(1)\n\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nfunction findAnagrams(s, p) {\n function arraysEqual(arr1, arr2) {\n for (let i = 0; i < 26; i++) {\n if (arr1[i] !== arr2[i]) return false;\n }\n return true;\n }\n\n const result = [];\n const sLen = s.length;\n const pLen = p.length;\n \n if (sLen < pLen) return result;\n \n const pCount = new Array(26).fill(0);\n const windowCount = new Array(26).fill(0);\n \n for (let i = 0; i < pLen; i++) {\n pCount[p.charCodeAt(i) - 97]++;\n }\n \n let left = 0;\n \n for (let right = 0; right < sLen; right++) {\n const rightIndex = s.charCodeAt(right) - 97;\n windowCount[rightIndex]++;\n \n if (right - left + 1 > pLen) {\n const leftIndex = s.charCodeAt(left) - 97;\n windowCount[leftIndex]--;\n left++;\n }\n \n if (right - left + 1 === pLen) {\n if (arraysEqual(windowCount, pCount)) {\n result.push(left);\n }\n }\n }\n \n return result;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3237104151","body":"```javascript\n// Time Complexity: O(n + m), n is s.length, m is t.length\n// Space Complexity: O(k), k is different char count in t\n\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nfunction minWindow(s, t) {\n let l = 0;\n const counter = {};\n const N = s.length;\n const ct = {};\n \n for (let char of t) {\n ct[char] = (ct[char] || 0) + 1;\n }\n \n let k = 0;\n let ret = Infinity;\n let ans = \"\";\n \n for (let r = 0; r < N; r++) {\n counter[s[r]] = (counter[s[r]] || 0) + 1;\n \n if (s[r] in ct && counter[s[r]] === ct[s[r]]) {\n k++;\n }\n \n while (k === Object.keys(ct).length) {\n if (r - l + 1 < ret) {\n ans = s.substring(l, r + 1);\n ret = r - l + 1;\n }\n \n counter[s[l]]--;\n if (s[l] in ct && counter[s[l]] === ct[s[l]] - 1) {\n k--;\n }\n l++;\n }\n }\n \n return ans;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3239924106","body":"```javascript\n// Time Complexity: O(1)\n// Space Complexity: O(1)\n\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n const countBits = (num) => {\n let count = 0;\n while (num) {\n count += num & 1;\n num >>= 1;\n }\n return count;\n };\n\n const res = [];\n\n for (let hour = 0; hour < 12; hour++) {\n for (let minute = 0; minute < 60; minute++) {\n if ((countBits(hour) + countBits(minute)) === turnedOn) {\n const formattedMinute = minute < 10 ? `0${minute}` : `${minute}`\n res.push(`${hour}:${formattedMinute}`);\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240825737","body":"```javascript\n// Time Complexity: O(n!)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n\n const backtrack = (row, cols, dias1, dias2) => {\n if (row === n) {\n count++;\n return;\n }\n\n let availablePostions = ((1 << n) - 1) & (~(cols | dias1 | dias2));\n\n while (availablePostions) {\n const position = availablePostions & (-availablePostions);\n availablePostions &= availablePostions - 1;\n\n backtrack(\n row + 1,\n cols | position,\n (dias1 | position) << 1,\n (dias2 | position) >> 1,\n );\n }\n };\n\n backtrack(0, 0, 0, 0);\n\n return count;\n};\n\n// Time Complexity: O(n!)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n const cols = new Array(n).fill(false);\n const dias1 = new Array(2 * n - 1).fill(false); // row - col\n const dias2 = new Array(2 * n - 1).fill(false); // row + col\n\n const backtrack = (row) => {\n if (row === n) {\n count++;\n return;\n }\n\n for (let col = 0; col < n; col++) {\n const d1 = row - col + n - 1;\n const d2 = row + col;\n\n if (cols[col] || dias1[d1] || dias2[d2]) continue;\n\n cols[col] = dias1[d1] = dias2[d2] = true;\n backtrack(row + 1);\n cols[col] = dias1[d1] = dias2[d2] = false;\n }\n };\n\n backtrack(0);\n\n return count;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245083899","body":"## 題解\n- 遍歷每個 (i, j) 進行 dfs,遇到邊界或 grid[i][j] === 0 者即返回 0,反之則返回 1 加四個方向 dns 的結果\n- 優化:訪問過者可將原 grid[i][j] 改成 0,如此便不需要重新宣告一個空間來存取\n\n```javascript\n// Time Complexity: O(m * n)\n// Space Complexity: O(m * n)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n const [m, n] = [grid.length, grid[0].length];\n const direction = [[1, 0], [-1, 0], [0, 1], [0, -1]];\n let max = 0;\n\n const dfs = (x, y) => {\n if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y]) {\n grid[x][y] = 0;\n\n let area = 1;\n\n for (const [dx, dy] of direction) {\n area += dfs(x + dx, y + dy);\n }\n\n return area;\n }\n\n return 0;\n };\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n max = Math.max(max, dfs(i, j));\n }\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249843138","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nfunction maxDistance(grid) {\n const n = grid.length;\n const queue = [];\n \n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n queue.push([i, j, 0]);\n }\n }\n }\n \n if (queue.length === 0 || queue.length === n * n) {\n return -1;\n }\n \n const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];\n let maxDist = 0;\n \n while (queue.length > 0) {\n const [x, y, dist] = queue.shift();\n maxDist = Math.max(maxDist, dist);\n \n for (const [dx, dy] of directions) {\n const nx = x + dx;\n const ny = y + dy;\n \n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] === 0) {\n grid[nx][ny] = 1;\n queue.push([nx, ny, dist + 1]);\n }\n }\n }\n \n return maxDist;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251291240","body":"```javascript\n// Time Complexity: O(n + k), n is candies.length, k is number of keys\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n const boxes = new Set(initialBoxes);\n const q = [];\n \n for (const i of boxes) {\n if (status[i]) {\n q.push(i);\n }\n }\n \n for (let idx = 0; idx < q.length; idx++) {\n const i = q[idx];\n \n for (const j of containedBoxes[i]) {\n boxes.add(j);\n if (status[j]) {\n q.push(j);\n }\n }\n \n for (const j of keys[i]) {\n if (status[j] === 0 && boxes.has(j)) {\n q.push(j);\n }\n status[j] = 1;\n }\n }\n \n return q.reduce((sum, i) => sum + candies[i], 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3258808498","body":"```javascript\n// Time Complexity: O(nlogn), n is the number of tree.\n// Space Complexity: O(n), n is the number of tree.\n\n// /**\n// * Definition for a binary tree node.\n// * function TreeNode(val, left, right) {\n// * this.val = (val===undefined ? 0 : val)\n// * this.left = (left===undefined ? null : left)\n// * this.right = (right===undefined ? null : right)\n// * }\n// */\n// /**\n// * @param {TreeNode} root\n// * @return {number[][]}\n// */\nvar verticalTraversal = function(root) {\n const map = {};\n\n const traverse = (root, row, col) => {\n if (!root) return;\n\n if (!map[col]) {\n map[col] = [];\n }\n\n map[col].push([row, root.val]);\n traverse(root.left, row + 1, col - 1);\n traverse(root.right, row + 1, col + 1);\n };\n\n traverse(root, 0, 0);\n\n const keys = Object.keys(map).sort((a, b) => a - b);\n\n const res = keys.map((k) => {\n const arr = map[k];\n\n return arr.sort(([rowA, valA], [rowB, valB]) => {\n if (rowA === rowB) return valA - valB;\n return rowA - rowB;\n }).map(([,val]) => val);\n });\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3262161616","body":"## 題解\n- 重點是找到 dp 的關鍵核心 d[i] = Math.min(d[i - 1] + cost[i], d[i - 2] + cost[i]);\n- 需注意 cost[i] 為空值的情況\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} cost\n * @return {number}\n */\nvar minCostClimbingStairs = function(cost) {\n const n = cost.length;\n const d = [];\n\n d[0] = cost[0];\n d[1] = Math.min(d[0] + cost[1], cost[1]);\n\n for (let i = 2; i <= n; i++) {\n const c = cost[i] ?? 0;\n d[i] = Math.min(d[i - 1] + c, d[i - 2] + c);\n }\n\n return d[n];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263843103","body":"## 解題\n- 一樣需要去辨認 dp 的關係式,d[i] = Math.max(d[i - 1], d[i - 2] + nums[i])\n- 需要特別注意 n 為 1, 2 的 edge case \n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar rob = function(nums) {\n const n = nums.length;\n\n if (n === 1) return nums[0];\n if (n === 2) return Math.max(nums[0], nums[1]);\n\n const d = [];\n\n d[0] = nums[0];\n d[1] = Math.max(nums[0], nums[1]);\n\n for (i = 2; i < n; i++) {\n d[i] = Math.max(d[i - 1], d[i - 2] + nums[i])\n }\n\n return d[n - 1];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3266927805","body":"```javascript\n// Time Complexity: O(n^2), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findNumberOfLIS = function(nums) {\n const n = nums.length;\n const dp = Array(n).fill(null).map(() => [1, 1]);\n let longest = 1;\n \n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n if (nums[j] > nums[i]) {\n if (dp[i][0] + 1 > dp[j][0]) {\n dp[j][0] = dp[i][0] + 1;\n dp[j][1] = dp[i][1];\n longest = Math.max(longest, dp[j][0]);\n } else if (dp[i][0] + 1 === dp[j][0]) {\n dp[j][1] += dp[i][1];\n }\n }\n }\n }\n \n return dp.reduce((sum, [length, count]) => {\n return length === longest ? sum + count : sum;\n }, 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3270111521","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n)\n\n/**\n * @param {string} text1\n * @param {string} text2\n * @return {number}\n */\nvar longestCommonSubsequence = function(text1, text2) {\n const [n, m] = [text1.length, text2.length];\n const dp = Array.from({ length: n + 1 }).map(() => new Array(m + 1).fill(0));\n let res = 0;\n\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n if (text1.charAt(i - 1) === text2.charAt(j - 1)) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n res = Math.max(res, dp[i][j]);\n } else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273250794","body":"## 題解\n- dp 的遞增式為 `d[i][j] = d[i - 1][j] + d[i][j - 1];`,意思是,dp[i][j] 表示能到達該格子的路線數量,其為 d[i - 1][j] 和 d[i][j - 1] 的總和(從其左或其上格子來)\n- 其中需注意當 i 或 j 為 0,即最上或最左列的格子,其 d[i][j] 值為 1,因為只可能從其上或其左格子而來\n\n```javascript\n// Time Complexity: O(m * n)\n// Space Complexity: O(m * n)\n\n/**\n * @param {number} m\n * @param {number} n\n * @return {number}\n */\nvar uniquePaths = function(m, n) {\n const d = Array.from({ length: m }).map(() => new Array(n).fill(1));\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (i !== 0 && j !== 0) {\n d[i][j] = d[i - 1][j] + d[i][j - 1];\n }\n }\n }\n\n return d[m - 1][n - 1];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3279921315","body":"```javascript\n// Time Complexity: O(n^2 * k)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} row\n * @param {number} column\n * @return {number}\n */\nvar knightProbability = function(n, k, row, column) {\n let dp = Array.from({ length: n }, () => new Array(n).fill(0));\n const directions = [[2, 1], [1, 2], [-1, 2], [-2, 1], [-2, -1], [-1, -2], [1, -2], [2, -1]];\n\n dp[row][column] = 1;\n\n for (let step = 0; step < k; step++) {\n let dpTemp = Array.from({ length: n }, () => new Array(n).fill(0));\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n for (const [dx, dy] of directions) {\n const [px, py] = [i - dx, j - dy];\n\n if (px >= 0 && px < n && py >= 0 && py < n) {\n dpTemp[i][j] += dp[px][py] * 0.125;\n }\n }\n }\n }\n\n dp = dpTemp;\n }\n\n let sumProp = 0;\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n sumProp += dp[i][j];\n }\n }\n\n return sumProp;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3285364984","body":"```javascript\n/**\n * @param {number} maxChoosableInteger\n * @param {number} desiredTotal\n * @return {boolean}\n */\nvar canIWin = function(maxChoosableInteger, desiredTotal) {\n if (maxChoosableInteger >= desiredTotal) {\n return true;\n }\n \n const totalSum = (maxChoosableInteger * (maxChoosableInteger + 1)) / 2;\n if (totalSum < desiredTotal) {\n return false;\n }\n \n const memo = new Map();\n \n const dfs = (used, currentSum) => {\n if (memo.has(used)) {\n return memo.get(used);\n }\n \n for (let i = 1; i <= maxChoosableInteger; i++) {\n const bit = 1 << (i - 1);\n \n if ((used & bit) === 0) {\n if (currentSum + i >= desiredTotal) {\n memo.set(used, true);\n return true;\n }\n \n if (!dfs(used | bit, currentSum + i)) {\n memo.set(used, true);\n return true;\n }\n }\n }\n \n memo.set(used, false);\n return false;\n };\n \n return dfs(0, 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3288487076","body":"```javascript\n// Time Complexity: O(n * k), n is nums.length, k is sum of nums / 2\n// Space Complexity: O(n * k)\n\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canPartition = function (nums) {\n let sum = nums.reduce((acc, num) => acc + num, 0);\n\n if (sum % 2) return false;\n else sum = sum / 2;\n\n const dp = Array.from(nums).map(() => Array.from({ length: sum + 1 }).fill(false));\n\n for (let i = 0; i < nums.length; i++) {\n dp[i][0] = true;\n }\n\n for (let i = 0; i < dp.length - 1; i++) {\n for (let j = 0; j < dp[0].length; j++) {\n dp[i + 1][j] = j - nums[i] >= 0 ? dp[i][j] || dp[i][j - nums[i]] : dp[i][j];\n }\n }\n\n return dp[nums.length - 1][sum];\n};\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289632643","body":"```javascript\n// Time Complexity: O(n * k), n is nums.length, k is sum of nums\n// Space Complexity: O(k)\n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar findTargetSumWays = function(nums, target) {\n const total = nums.reduce((sum, num) => sum + num, 0);\n \n if (Math.abs(target) > total || (total + target) % 2 !== 0) {\n return 0;\n }\n \n const sum = (total + target) / 2;\n const dp = new Array(sum + 1).fill(0);\n dp[0] = 1;\n \n for (const num of nums) {\n for (let j = sum; j >= num; j--) {\n dp[j] += dp[j - num];\n }\n }\n \n return dp[sum];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3292845699","body":"```javascript\n/**\n * @param {number[]} coins\n * @param {number} amount\n * @return {number}\n */\nvar coinChange = function(coins, amount) {\n const dp = new Array(amount + 1).fill(Infinity);\n\n dp[0] = 0;\n\n for (i = 1; i <= amount; i += 1) {\n for (const coin of coins) {\n if (i - coin >= 0 && dp[i - coin] !== Infinity) {\n dp[i] = Math.min(dp[i - coin] + 1, dp[i]);\n }\n }\n }\n\n return dp[amount] === Infinity ? -1 : dp[amount];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3297467048","body":"```javascript\n// Time Complexity: O(n * m), n is amount, m is coins.length\n// Space Complexity: O(n)\n\n/**\n * @param {number} amount\n * @param {number[]} coins\n * @return {number}\n */\nvar change = function(amount, coins) {\n const dp = new Array(amount + 1).fill(0);\n dp[0] = 1;\n\n for (const coin of coins) {\n for (let i = coin; i <= amount; i++) {\n dp[i] += dp[i - coin];\n }\n }\n \n return dp[amount];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3303059077","body":"## 題解\n- 先排序,以 g[j] 為主,遍歷符合的 s[i]\n```javascript\n// Time Complexity: O(nlogn + mlogm), n is g.length, m is s.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} g\n * @param {number[]} s\n * @return {number}\n */\nvar findContentChildren = function(g, s) {\n g.sort((a, b) => a - b);\n s.sort((a, b) => a - b);\n\n let [i, j] = [0, 0];\n let ans = 0;\n\n while (i < s.length && j < g.length) {\n if (s[i] >= g[j]) {\n ans++;\n j++;\n }\n\n i++;\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3307711246","body":"```javascript\n// Time Complexity: O(nlogn)\n// Space Complexity: O(1)\n\n/**\n * @param {number[][]} intervals\n * @return {number}\n */\nfunction eraseOverlapIntervals(intervals) {\n if (intervals.length <= 1) return 0;\n \n intervals.sort((a, b) => a[1] - b[1]);\n \n let count = 0;\n let end = intervals[0][1];\n \n for (let i = 1; i < intervals.length; i++) {\n if (intervals[i][0] < end) {\n count++;\n } else {\n end = intervals[i][1];\n }\n }\n \n return count;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3311687568","body":"```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canJump = function (nums) {\n let max = 0;\n\n for (let i = 0; i < nums.length; i++) {\n if (max < i) return false;\n\n max = Math.max(nums[i] + i, max);\n }\n\n return max >= nums.length - 1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/71#issuecomment-3314986282","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nconst memories = {};\nvar numTrees = function(n) {\n if (memories[n] !== undefined) return memories[n];\n if (n <= 1) return 1;\n\n let ans = 0;\n\n for (let i = 1; i <= n; i++) {\n ans += numTrees(i - 1) * numTrees(n - i);\n }\n\n memories[n] = ans;\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316043984","body":"```javascript\n// Time Complexity: O(nlogk), n is total number of nodes across all lists, k is number of lists\n// Space Complexity: O(1)\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode[]} lists\n * @return {ListNode}\n */\nvar mergeKLists = function(lists) {\n if (!lists || lists.length === 0) return null;\n \n while (lists.length > 1) {\n let mergedLists = [];\n \n for (let i = 0; i < lists.length; i += 2) {\n let l1 = lists[i];\n let l2 = i + 1 < lists.length ? lists[i + 1] : null;\n mergedLists.push(mergeTwoLists(l1, l2));\n }\n \n lists = mergedLists;\n }\n \n return lists[0];\n};\n\nfunction mergeTwoLists(l1, l2) {\n let dummy = new ListNode(0);\n let current = dummy;\n \n while (l1 && l2) {\n if (l1.val <= l2.val) {\n current.next = l1;\n l1 = l1.next;\n } else {\n current.next = l2;\n l2 = l2.next;\n }\n current = current.next;\n }\n \n current.next = l1 || l2;\n return dummy.next;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3324003764","body":"```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar singleNumber = function(nums) {\n let bitmask = 0;\n\n for (let n of nums) {\n bitmask ^= n;\n }\n\n bitmask &= -bitmask;\n\n const ans = [0, 0];\n\n for (let n of nums) {\n if ((n & bitmask) === 0) ans[0] ^= n;\n else ans[1] ^= n;\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3327535650","body":"```javascript\n// Time Complexity: O(n * 2^n)\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number[][]}\n */\nfunction subsets(nums) {\n const result = [];\n \n function backtrack(start, current) {\n result.push([...current]);\n \n for (let i = start; i < nums.length; i++) {\n current.push(nums[i]);\n backtrack(i + 1, current);\n current.pop();\n }\n }\n \n backtrack(0, []);\n return result;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3338173897","body":"```javascript\n// Time Complexity\n// - insert: O(k), k is key.length\n// - searchValue: O(k), k is key.length\n// - sum: O(p), p is prefix.length\n\n// Space Complexity: O(n * m), n is the number of unique keys inserted, m is the average length of the keys\n\nclass MapSum {\n constructor() {\n this.root = new TrieNode();\n }\n \n insert(key, val) {\n let temp = this.root;\n \n let oldVal = this.searchValue(key);\n \n for (let i = 0; i < key.length; i++) {\n if (temp.children[key.charCodeAt(i) - 97] == null)\n temp.children[key.charCodeAt(i) - 97] = new TrieNode();\n \n temp = temp.children[key.charCodeAt(i) - 97];\n \n temp.count = temp.count - oldVal + val;\n }\n \n temp.val = val;\n temp.isWord = true;\n }\n\n searchValue(key) {\n let temp = this.root;\n for (let i = 0; i < key.length; i++) {\n if (temp.children[key.charCodeAt(i) - 97] == null)\n return 0;\n \n temp = temp.children[key.charCodeAt(i) - 97];\n }\n \n return temp.isWord ? temp.val : 0;\n }\n\n sum(prefix) {\n let temp = this.root;\n \n for (let i = 0; i < prefix.length; i++) {\n if (temp.children[prefix.charCodeAt(i) - 97] == null)\n return 0;\n \n temp = temp.children[prefix.charCodeAt(i) - 97];\n }\n \n return temp.count;\n }\n}\n\nclass TrieNode {\n constructor() {\n this.count = 0;\n this.children = new Array(26);\n this.isWord = false;\n this.val = 0;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/78#issuecomment-3341802963","body":"```javascript\n// Time Complexity: O(n*m + b*b + n)\n// - Building Trie: O(n*m) where n = number of smalls, m = average length of smalls\n// - Searching: O(b*b) where b = length of big string (worst case: check every position against every possible substring)\n// - Converting result: O(n)\n\n// Space Complexity: O(n*m + n*k)\n// - Trie storage: O(n*m) for storing all small strings\n// - Result storage: O(n*k) where k = average number of matches per small string\n\n\nclass Node {\n constructor() {\n this.children = new Array(26).fill(null);\n this.isWord = false;\n this.id = 0;\n }\n}\n\nclass Solution {\n constructor() {\n this.root = new Node();\n }\n\n multiSearch(big, smalls) {\n const n = smalls.length;\n const res = Array(n).fill().map(() => []);\n \n for (let i = 0; i < smalls.length; i++) {\n this.insert(smalls[i], i);\n }\n\n for (let i = 0; i < big.length; i++) {\n let tmp = this.root;\n\n for (let j = i; j < big.length; j++) {\n if (tmp.children[big.charCodeAt(j) - 97] === null) {\n break;\n }\n\n tmp = tmp.children[big.charCodeAt(j) - 97];\n\n if (tmp.isWord) {\n res[tmp.id].push(i);\n }\n }\n }\n\n const ret = new Array(n);\n\n for (let i = 0; i < n; i++) {\n ret[i] = new Array(res[i].length);\n for (let j = 0; j < ret[i].length; j++) {\n ret[i][j] = res[i][j];\n }\n }\n\n return ret;\n }\n\n insert(word, id) {\n let tmp = this.root;\n\n for (let i = 0; i < word.length; i++) {\n if (tmp.children[word.charCodeAt(i) - 97] === null) {\n tmp.children[word.charCodeAt(i) - 97] = new Node();\n }\n\n tmp = tmp.children[word.charCodeAt(i) - 97];\n }\n\n tmp.isWord = true;\n tmp.id = id;\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wutxuan":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073568207","body":"第一次思路:将num数组转换为int数字A,计算A+K,将A+K结果转换为List类型,但没有观察数据范围,导致int类型溢出,没有通过全部样例\n第二次思路:从后往前,逐位相加K%10,直到遍历完全部数组,再判断K是否还有,通过全部样例\n第三次思路:看完题解后,学习到了可以将k和某一位看作一个整体,不用每次计算k%10,而是k+num[i]","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078154786","body":"第一次思路:遍历每个字符,在每个字符上向左向右移动,直到找到字符c,继续遍历下一个字符,但想到时间复杂度一定很高,因此继续想其他方法\n\n第二次思路:先遍历字符串,用List先记录每个字符c的索引。然后遍历字符串每个字符,计算这个字符的位置距离List中位置的最小距离,通过全部用例,时间复杂度O(N*K) N为字符串长度,K为c在字符串中出现的次数\n\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n List indexList = new ArrayList<>();\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == c){\n indexList.add(i);\n }\n }\n\n int[] res = new int[s.length()];\n Arrays.fill(res,10001);\n for(int i = 0;i < res.length;i++){\n for(int index : indexList){\n res[i] = Math.min(res[i],Math.abs(i - index));\n }\n \n }\n return res;\n }\n}\n\n```\n第三次思路:看完题解后,学习到了两次遍历求解,从左到右记录每个字符左侧最近的字符c的距离,记为left数组,从右到左记录每个字符右侧最近的字符c的距离,记为right数组。再遍历一遍整个字符串,在left数组和right数组中取最小值为最终结果。在代码实现时,省去了记录right数组再比较,而是直接比较。时间复杂度O(N)\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n int index = -s.length();\n int[] left = new int[s.length()];\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == c){\n index = i;\n }\n left[i] = i - index;\n }\n\n index = 2 * s.length();\n for(int i = s.length() - 1;i >= 0;i--){\n if(s.charAt(i) == c){\n index = i;\n }\n left[i] = Math.min(left[i],index - i);\n }\n return left;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3083567541","body":"因为要设计的栈有最大长度,因此使用数组来模拟栈。否则使用栈或List来模拟。\n使用数组模拟:使用一个指针变量,指向当前栈顶。入栈时,val存入栈顶处,指针++,出栈时,指针- -,返回栈顶元素。实现inc函数时,只需要对数组中0-k位置的数每个+val即可。通过全部样例\n```java\nclass CustomStack {\n int size = 0; // 指向第一个空位置\n int[] arr;\n\n public CustomStack(int maxSize) {\n arr = new int[maxSize];\n }\n \n public void push(int x) {\n if(size < arr.length){\n arr[size] = x;\n size++;\n }\n }\n \n public int pop() {\n if(size > 0){\n size--;\n return arr[size];\n }else{\n return -1;\n }\n }\n \n public void increment(int k, int val) {\n int cut = Math.min(k,size);\n\n for(int i = 0;i < cut;i++){\n arr[i] += val;\n }\n }\n}\n```\n\n看完题解后学会了前缀和方法:- 因为每次的increment函数都会对栈底[0,k]的数据val操作,而是否val操作了只有在pop时才会体现。所以我们可以通过一个数组incremental记录每个val,即第i位置下面的元素都要加incremental[i]。在pop第i个数的时候加上它需要加的所有val,即incremental[i]。 所以increment函数只需要维护incremental数组。但要记得记得pop后,incremental函数用过的地方要清零,并且得累加到前面一位\n\n```java\nclass CustomStack {\n\n Stack stack;\n int[] incremental;\n\n public CustomStack(int maxSize) {\n stack = new Stack();\n incremental = new int[maxSize];\n }\n \n public void push(int x) {\n if(stack.size() < incremental.length){\n stack.push(x);\n }\n }\n \n public int pop() {\n int cut = stack.size() - 1;\n if(cut < 0) return -1;\n\n int res = stack.pop() + incremental[cut];\n\n if(cut > 0){\n incremental[cut-1] += incremental[cut]; \n }\n incremental[cut] = 0;\n return res;\n\n }\n \n public void increment(int k, int val) {\n int cut = Math.min(k,stack.size())-1;\n if(cut >= 0){\n incremental[cut] += val;\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089071815","body":"看到有括号,需要对括号匹配,则优先想到栈。遍历字符串,当遇到非】字符时,全部入栈。当遇到】字符时,开始向回看,取出字符c,构成字符串s。再向回看,取出数字x,重复x次字符串s得到字符串ss,再将ss入栈,继续遍历,直到遍历结束。\n \n最后得到的栈,就是存储了最终解码后的字符串。取出栈后记得反转字符串\n```java\nclass Solution {\n public String decodeString(String s) {\n Stack stack = new Stack<>();\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == ']'){\n StringBuilder sb = new StringBuilder();\n StringBuilder count = new StringBuilder();\n\n while(!stack.isEmpty() && stack.peek() != '['){\n sb.append(stack.pop());\n } \n sb.reverse();\n stack.pop();\n while(!stack.isEmpty() && stack.peek() >= '0' && stack.peek() <= '9'){\n count.append(stack.pop());\n }\n count.reverse();\n int t = Integer.valueOf(count.toString());\n StringBuilder res = new StringBuilder();\n res.repeat(sb,t);\n\n for(char c : res.toString().toCharArray()){\n stack.push(c);\n }\n \n }else{\n stack.push(s.charAt(i));\n }\n }\n StringBuilder re = new StringBuilder();\n while(!stack.isEmpty()){\n re.append(stack.pop());\n }\n re.reverse();\n return re.toString();\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3095194789","body":"- push操作:输入栈入栈\n- pop操作:如果输出栈不为空,则直接输出输出栈的元素。如果输出栈为空,则把输入栈的数据全部导入到输出栈中\n- peek操作:如果输出栈不为空,则直接peek输出栈的元素。如果输出栈为空,则把输入栈的数据全部导出到输入栈中\n```java\nclass MyQueue {\n Stack stackIn;\n Stack stackOut;\n\n public MyQueue() {\n stackIn = new Stack<>();\n stackOut = new Stack<>();\n }\n \n public void push(int x) {\n stackIn.push(x);\n }\n \n public int pop() {\n refresh();\n return stackOut.pop();\n }\n \n public int peek() {\n refresh();\n return stackOut.peek();\n }\n \n public boolean empty() {\n return stackIn.isEmpty() && stackOut.isEmpty();\n }\n\n public void refresh(){\n if(!stackOut.isEmpty()){\n return;\n }\n while(!stackIn.isEmpty()){\n stackOut.push(stackIn.pop());\n }\n }\n}\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094513644","body":"想象成将原始数组和排序后的数组并列排在一起,切一刀。如果这刀的左侧两个数组的数字出现的频次相同,那么右侧的频次也一定相同。这里就是一个分割点。\n继续向右,有同样情况就切一刀。直到走到最后,一定会切最后一刀。记录的每一个分割点,就是分的组数。\n```java\nclass Solution {\n public int maxChunksToSorted(int[] arr) {\n Map map = new HashMap<>();\n int[] sortedArr = new int[arr.length];\n for(int i = 0;i < arr.length;i++){\n sortedArr[i] = arr[i];\n }\n Arrays.sort(sortedArr);\n\n int res = 0;\n for(int i = 0;i < arr.length;i++){\n map.put(arr[i],map.getOrDefault(arr[i],0) + 1);\n if(map.get(arr[i]) == 0){\n map.remove(arr[i]);\n }\n map.put(sortedArr[i],map.getOrDefault(sortedArr[i],0) - 1);\n if(map.get(sortedArr[i]) == 0){\n map.remove(sortedArr[i]);\n }\n if(map.isEmpty()){\n res++;\n }\n }\n return res;\n }\n}\n```\n因为存在sort排序,时间复杂度O(NlogN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095217604","body":"先将链表连成一个环,再找到需要断开的位置断开即可\n```java\nclass Solution {\n public ListNode rotateRight(ListNode head, int k) {\n if(head == null) return null;\n ListNode dummy = head;\n int count = 1;\n while(dummy.next != null){\n count++;\n dummy = dummy.next;\n }\n dummy.next = head;\n\n k = k % count;\n dummy = head;\n count = count - k;\n for(int i = 1;i < count;i++){\n dummy = dummy.next;\n }\n ListNode res = dummy.next;\n dummy.next = null;\n return res;\n }\n}\n```\n\n因为遍历了链表,时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100949135","body":"因为要交换两个节点,所以需要记录两个节点+两个节点前的节点+两个节点后的节点,一共四个节点。分别用cur,one,two,three记录\n交换完后,cur指向下一组需要交换节点的前一个节点\n```java\nclass Solution {\n public ListNode swapPairs(ListNode head) {\n ListNode dummy = new ListNode(0);\n dummy.next = head;\n ListNode cur = dummy;\n ListNode one = null;\n ListNode two = null;\n ListNode three = null;\n while(cur.next != null && cur.next.next != null)\n {\n one = cur.next;\n two = cur.next.next;\n three = cur.next.next.next;\n cur.next = two;\n cur.next.next = one;\n cur.next.next.next = three;\n cur = cur.next.next;\n }\n return dummy.next;\n }\n}\n```\n遍历了链表,时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105789931","body":"考验的是二分查找和分治构建二叉树,中间大小的数构成root根节点,左侧的数组部分分治构成左节点,右侧的数组部分分治构成右节点。这里用的是链表,只需要额外增加一些链表的操作(getMid函数)。也可以将链表转化为数组,再构造,查找起来就很快。以空间换时间\n```java\nclass Solution {\n public TreeNode sortedListToBST(ListNode head) {\n ListNode dummy = head;\n int end = 0;\n while(head != null){\n end++;\n head = head.next;\n }\n\n return dfs(dummy,0,end);\n }\n\n public TreeNode dfs(ListNode head,int start,int end){\n if(start >= end) return null;\n int mid = start + (end - start) / 2;\n ListNode midNode = getMid(head,mid);\n TreeNode node = new TreeNode(midNode.val);\n node.left = dfs(head,start,mid);\n node.right = dfs(head,mid+1,end);\n\n return node;\n }\n \n public ListNode getMid(ListNode head,int mid){\n while(mid > 0){\n mid--;\n head = head.next;\n }\n return head;\n }\n}\n```\n时间复杂度O(NlogN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111943009","body":"两个指针从head出发同时往前移动,当某一个指针指向null的时候,使其指向另一个head。直至两个指针相遇,该节点为相遇节点。直到相遇,第一个指针走了A+C+B的路程,另一个指针走了B+C+A的路程\n```java\npublic class Solution {\n public ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n ListNode A = headA;\n ListNode B = headB;\n while(A != B)\n {\n if(A == null) A = headB;\n else A = A.next;\n if(B == null) B = headA;\n else B = B.next;\n }\n return A;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116973002","body":"- 判断是否有环:两个快慢指针分别从头节点出发,慢指针一次走一格,快指针一次走两个,如果有环,则二者一定会在环内相遇,如果没环,则快指针会先到达null处。可以类比于跑步,跑得快的会套跑的慢的一圈\n- 判断环入口:快指针和慢指针相遇的时候,慢指针走了x+y步,快指针走了x+y+n*(y+z)步骤,n为圈数,大于等于1,如图所示,图片节选自代码随想录。因为快指针是慢指针的两倍速,所以2x+2y=x+y+n*(y+z)。化简后发现当n=1时,x=z,当n大于1时,x=z+(n-1)(y+z)。也就是说,头节点到环入口的距离等于z或z+多圈。因此,用两个指针,一个从头节点出发,一个从相遇节点出发,最终一定会相遇在环入口,无论第二个指针在环里绕了多少圈\n```java\npublic class Solution {\n public ListNode detectCycle(ListNode head) {\n ListNode fast = head;\n ListNode slow = head;\n while(fast != null && fast.next != null)\n {\n slow = slow.next;\n fast = fast.next.next;\n if(slow == fast){\n ListNode index1 = head;\n ListNode index2 = slow;\n while(index1 != index2)\n {\n index1 = index1.next;\n index2 = index2.next;\n }\n return index1;\n }\n }\n return null;\n }\n}\n```\n时间复杂度O(N) 空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121046113","body":"Java可以使用LinkedHashMap实现LRU,内置的函数就可以实现按插入顺序排列的hashmap,手动实现LinkedHashMap代码如下:\n```java\npublic class LRUCache {\n class DLinkedNode {\n int key;\n int value;\n DLinkedNode prev;\n DLinkedNode next;\n public DLinkedNode() {}\n public DLinkedNode(int _key, int _value) {key = _key; value = _value;}\n }\n\n private Map cache = new HashMap();\n private int size;\n private int capacity;\n private DLinkedNode head, tail;\n\n public LRUCache(int capacity) {\n this.size = 0;\n this.capacity = capacity;\n head = new DLinkedNode();\n tail = new DLinkedNode();\n head.next = tail;\n tail.prev = head;\n }\n\n public int get(int key) {\n DLinkedNode node = cache.get(key);\n if (node == null) {\n return -1;\n }\n moveToHead(node);\n return node.value;\n }\n\n public void put(int key, int value) {\n DLinkedNode node = cache.get(key);\n if (node == null) {\n DLinkedNode newNode = new DLinkedNode(key, value);\n cache.put(key, newNode);\n addToHead(newNode);\n ++size;\n if (size > capacity) {\n DLinkedNode tail = removeTail();\n cache.remove(tail.key);\n --size;\n }\n }\n else {\n node.value = value;\n moveToHead(node);\n }\n }\n\n private void addToHead(DLinkedNode node) {\n node.prev = head;\n node.next = head.next;\n head.next.prev = node;\n head.next = node;\n }\n\n private void removeNode(DLinkedNode node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n }\n\n private void moveToHead(DLinkedNode node) {\n removeNode(node);\n addToHead(node);\n }\n\n private DLinkedNode removeTail() {\n DLinkedNode res = tail.prev;\n removeNode(res);\n return res;\n }\n}\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123845190","body":"递归,每一层返回max(左子树深度,右子树深度)+1\n```java\nclass Solution {\n public int maxDepth(TreeNode root) {\n if (root == null) {\n return 0;\n }\n int leftDepth = maxDepth(root.left);\n int rightDepth = maxDepth(root.right);\n return Math.max(leftDepth, rightDepth) + 1;\n }\n}\n```\n层序遍历,使用队列。每遍历一层,深度+1,直到遍历到最下面一层\n\n```java\nclass Solution {\n public int maxDepth(TreeNode root) {\n if(root == null) return 0;\n Queue queue = new LinkedList<>();\n queue.add(root);\n int depth = 0;\n while(!queue.isEmpty())\n {\n int size = queue.size();\n for(int i = 0;i < size;i++){\n TreeNode node = queue.poll();\n if(node.left != null) queue.add(node.left);\n if(node.right != null) queue.add(node.right);\n }\n depth++;\n }\n\n return depth;\n }\n}\n```\n时间复杂度O(N) N为二叉树节点个数","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125223416","body":"先判断当前两个节点是否相同,如果不同,直接返回false。如果相同无法得出最终结论,需要递归进入下一层继续判断子树\n```java\nclass Solution {\n public boolean isSameTree(TreeNode p, TreeNode q) {\n if(p == null && q != null) return false;\n if(p != null && q == null) return false;\n if(p == null && q == null) return true;\n if(p.val != q.val) return false;\n\n boolean l = isSameTree(p.left,q.left);\n boolean r = isSameTree(p.right,q.right);\n\n return l && r;\n }\n}\n```\n时间复杂度O(N) N为树的节点数量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130457949","body":"回溯维护一个List,当递归到叶子节点时,List中保存的数字就是一路从root到当前根节点的所有数字。使用StringBbuilder拼接所有数字,即是当前路径表示的数字\n\n```java\nclass Solution {\n List path = new ArrayList<>();\n int res = 0;\n public int sumNumbers(TreeNode root) {\n path.add(root.val);\n recursion(root);\n return res;\n }\n\n public void recursion(TreeNode root){\n if(root.left == null && root.right == null){\n StringBuilder sb = new StringBuilder();\n for(int num : path){\n sb.append(num);\n }\n res += Integer.parseInt(sb.toString());\n return;\n }\n\n if(root.left != null){\n path.add(root.left.val);\n recursion(root.left);\n path.remove(path.size() - 1);\n }\n\n if(root.right != null){\n path.add(root.right.val);\n recursion(root.right);\n path.remove(path.size() - 1);\n }\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134853681","body":"层序遍历,记录每一层的最左侧的值,不断覆盖变量,最终记录的是最深一层的最左侧的值\n```java\nclass Solution {\n public int findBottomLeftValue(TreeNode root) {\n Queue queue = new LinkedList<>();\n queue.add(root);\n int res = 0;\n while(!queue.isEmpty())\n {\n int size = queue.size();\n for(int i = 0;i < size;i++){\n TreeNode node = queue.poll();\n if(i == 0){\n res = node.val;\n }\n if(node.left != null) queue.add(node.left);\n if(node.right != null) queue.add(node.right);\n }\n }\n\n return res;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138992061","body":"序列化时:前序遍历记录每个节点用逗号分开,空节点记为#\n反序列化:将序列化结果以逗号分开,存储进队列,用队列递归构造树\n```java\npublic class Codec {\n StringBuilder sb = new StringBuilder();\n int count = 1;\n\n public String serialize(TreeNode root) {\n if(root == null){\n sb.append(\"#\").append(\",\");\n return sb.toString();\n }\n\n sb.append(root.val).append(\",\");\n serialize(root.left);\n serialize(root.right);\n return sb.toString();\n }\n\n public TreeNode deserialize(String data) {\n Queue queue = new LinkedList<>();\n String[] pre = data.split(\",\");\n for(String s : pre){\n queue.offer(s);\n }\n return build(queue);\n }\n\n public TreeNode build(Queue queue){\n if(queue.isEmpty()) return null;\n String rootStringVal = queue.poll();\n if(rootStringVal.equals(\"#\")) return null;\n int rootVal = Integer.parseInt(rootStringVal);\n \n TreeNode root = new TreeNode(rootVal);\n root.left = build(queue);\n root.right = build(queue);\n\n return root;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3142198278","body":"遍历二叉树,记录一个三元组,分别表示列、行和节点的值。再按照要求进行排序,列升序,行升序,值升序。最后按规则放入List\n```java\nclass Solution {\n public List> verticalTraversal(TreeNode root) {\n List nodes = new ArrayList();\n dfs(root, 0, 0, nodes);\n Collections.sort(nodes, new Comparator() {\n public int compare(int[] tuple1, int[] tuple2) {\n if (tuple1[0] != tuple2[0]) {\n return tuple1[0] - tuple2[0];\n } else if (tuple1[1] != tuple2[1]) {\n return tuple1[1] - tuple2[1];\n } else {\n return tuple1[2] - tuple2[2];\n }\n }\n });\n List> ans = new ArrayList>();\n int size = 0;\n int lastcol = Integer.MIN_VALUE;\n for (int[] tuple : nodes) {\n int col = tuple[0], row = tuple[1], value = tuple[2];\n if (col != lastcol) {\n lastcol = col;\n ans.add(new ArrayList());\n size++;\n }\n ans.get(size - 1).add(value);\n }\n return ans;\n }\n\n public void dfs(TreeNode node, int row, int col, List nodes) {\n if (node == null) {\n return;\n }\n nodes.add(new int[]{col, row, node.val});\n dfs(node.left, row + 1, col - 1, nodes);\n dfs(node.right, row + 1, col + 1, nodes);\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146508830","body":"先将数组中所有值和其对应索引存入hashmap,再遍历一遍数组,如果遍历到的num对应的target-num在map中,即是找到的两个索引。注意要避免一个数算两次\n```java\nclass Solution {\n public int[] twoSum(int[] nums, int target) {\n Map map = new HashMap<>();\n for(int i = 0;i < nums.length;i++){\n map.put(nums[i],i);\n }\n\n for(int i = 0;i < nums.length;i++){\n if(map.containsKey(target - nums[i]) && map.get(target - nums[i]) != i){\n int[] res = new int[2];\n res[0] = i;\n res[1] = map.get(target - nums[i]);\n return res;\n }\n }\n return null;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148286271","body":"遍历数组,先用hashmap记录每个数字出现的次数。用优先队列定义好排序规则,将map中的内容放入优先队列中,再按照要求从队列中取\n```java\nclass Solution {\n public int[] topKFrequent(int[] nums, int k) {\n Map map = new HashMap<>();\n for(int num : nums){\n map.put(num,map.getOrDefault(num,0)+1);\n }\n PriorityQueue p = new PriorityQueue<>((a,b) -> (b[1]-a[1]));\n for(Map.Entry m : map.entrySet()){\n p.add(new int[]{m.getKey(),m.getValue()});\n }\n int[] result = new int[k];\n for(int i = 0;i < k;i++){\n result[i] = p.poll()[0];\n }\n return result;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149131512","body":"二层遍历,第一层遍历i,第二层遍历,使用map记录每个元组与第一层的i的距离dis出现的次数time。最终由i组成的回旋镖数量为time*(time-1)\n```java\nclass Solution {\n public int numberOfBoomerangs(int[][] points) {\n int res = 0;\n for(int[] a : points){\n Map map = new HashMap<>();\n for(int[] b : points){\n int dis = (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]);\n map.put(dis,map.getOrDefault(dis,0) + 1);\n }\n for(int key : map.keySet()){\n int val = map.get(key);\n res += val * (val - 1);\n }\n }\n return res;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153104469","body":"滑动窗口,定义left指针和right指针,两个指针窗口内即是符合题目要求的子串。不断向右移right指针,如果窗口内的子串不符合题目要求了,就右移left指针缩小窗口直到符合题目要求。\n在遍历过程中,记录窗口长度最大值\n使用hashSet判断窗口内是否符合题目要求\n```java\nclass Solution {\n public int lengthOfLongestSubstring(String s) {\n Set set = new HashSet<>();\n int left = 0;\n int res = 0;\n for(int right = 0;right < s.length();right++){\n char c = s.charAt(right);\n while(set.contains(c)){\n set.remove(s.charAt(left));\n left++;\n }\n\n set.add(c);\n res = Math.max(res,right - left + 1); \n }\n return res;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3157250607","body":"滑动窗口\n```java\nclass Solution {\n public List findSubstring(String s, String[] words) {\n int wordLen = words[0].length(); \n int windowLen = wordLen * words.length; \n\n Map targetCnt = new HashMap<>();\n for (String w : words) {\n targetCnt.put(w,targetCnt.getOrDefault(w,0) + 1);\n }\n\n List ans = new ArrayList<>();\n for (int start = 0; start < wordLen; start++) {\n Map cnt = new HashMap<>();\n int overload = 0;\n for (int right = start + wordLen; right <= s.length(); right += wordLen) {\n String inWord = s.substring(right - wordLen, right);\n if (cnt.getOrDefault(inWord, 0).equals(targetCnt.getOrDefault(inWord, 0))) {\n overload++;\n }\n cnt.merge(inWord, 1, Integer::sum); \n\n int left = right - windowLen;\n if (left < 0) { \n continue;\n }\n if (overload == 0) {\n ans.add(left);\n }\n\n String outWord = s.substring(left, left + wordLen);\n cnt.merge(outWord, -1, Integer::sum); \n if (cnt.get(outWord).equals(targetCnt.getOrDefault(outWord, 0))) {\n overload--;\n }\n }\n }\n\n return ans;\n }\n}\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162563860","body":"前缀和\n```java\nclass Solution {\n public int minSubarray(int[] nums, int p) {\n int n = nums.length;\n int[] s = new int[n + 1];\n for (int i = 0; i < n; i++) {\n s[i + 1] = (s[i] + nums[i]) % p;\n }\n int x = s[n];\n if (x == 0) {\n return 0; \n }\n\n int ans = n;\n Map last = new HashMap<>();\n for (int i = 0; i <= n; i++) {\n last.put(s[i], i);\n int j = last.getOrDefault((s[i] - x + p) % p, -n);\n ans = Math.min(ans, i - j);\n }\n return ans < n ? ans : -1;\n }\n}\n\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170443755","body":"双指针,慢指针用于存数字,快指针用于检验数字是否重复\n```java\nclass Solution {\n public int removeDuplicates(int[] nums) {\n if(nums.length == 1) return 1;\n int slow = 0;\n for(int fast = 1;fasttarget){\n right = middle;\n }else if(nums[middle] queue;\n public MyQueue(){\n queue = new LinkedList<>();\n } \n\n public void add(int val){\n while(!queue.isEmpty() && val > queue.getLast()){\n queue.removeLast();\n }\n queue.add(val);\n }\n\n public void poll(int val){\n if(queue.peek() == val){\n queue.poll();\n }\n }\n\n public int max(){\n return queue.peek();\n }\n}\n```\n时间复杂度O(nlogn)\n优先队列插入的复杂度是logn","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3177951924","body":"两个数组计算每个人的入度和出度\n```java\nclass Solution {\n public int findJudge(int n, int[][] trust) {\n int[] inDegrees = new int[n + 1];\n int[] outDegrees = new int[n + 1];\n for (int[] edge : trust) {\n int x = edge[0], y = edge[1];\n ++inDegrees[y];\n ++outDegrees[x];\n }\n for (int i = 1; i <= n; ++i) {\n if (inDegrees[i] == n - 1 && outDegrees[i] == 0) {\n return i;\n }\n }\n return -1;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182597716","body":"染色法,如果染色过程冲突,则无法实现、返回false\n```java\nclass Solution {\n boolean[] visited;\n boolean[] color;\n boolean flag = false;\n public boolean possibleBipartition(int n, int[][] dislikes) {\n List[] graph = build(dislikes,n);\n visited = new boolean[graph.length];\n color = new boolean[graph.length];\n for(int i = 1;i < graph.length;i++){\n if(visited[i] == false){\n traverse(graph,i);\n }\n }\n return !flag;\n }\n\n public List[] build(int[][] dislikes,int n){\n List[] graph = new List[n + 1];\n for(int i = 0;i < n + 1;i++){\n graph[i] = new LinkedList<>();\n }\n\n for(int[] edge : dislikes){\n int x = edge[0];\n int y = edge[1];\n graph[x].add(y);\n graph[y].add(x);\n }\n return graph;\n }\n\n public void traverse(List[] graph,int s){\n if(flag) return;\n visited[s] = true;\n for(int x : graph[s]){\n if(visited[x] == false){\n color[x] = !color[s];\n traverse(graph,x);\n }else{\n if(color[x] == color[s]) flag = true;\n }\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186848399","body":"拓扑排序\n```java\nclass Solution {\n public int[] sortItems(int n, int m, int[] group, List> beforeItems) {\n List> groupItem = new ArrayList>();\n for (int i = 0; i < n + m; ++i) {\n groupItem.add(new ArrayList());\n }\n\n // 组间和组内依赖图\n List> groupGraph = new ArrayList>();\n for (int i = 0; i < n + m; ++i) {\n groupGraph.add(new ArrayList());\n }\n List> itemGraph = new ArrayList>();\n for (int i = 0; i < n; ++i) {\n itemGraph.add(new ArrayList());\n }\n\n // 组间和组内入度数组\n int[] groupDegree = new int[n + m];\n int[] itemDegree = new int[n];\n \n List id = new ArrayList();\n for (int i = 0; i < n + m; ++i) {\n id.add(i);\n }\n\n int leftId = m;\n // 给未分配的 item 分配一个 groupId\n for (int i = 0; i < n; ++i) {\n if (group[i] == -1) {\n group[i] = leftId;\n leftId += 1;\n }\n groupItem.get(group[i]).add(i);\n }\n // 依赖关系建图\n for (int i = 0; i < n; ++i) {\n int curGroupId = group[i];\n for (int item : beforeItems.get(i)) {\n int beforeGroupId = group[item];\n if (beforeGroupId == curGroupId) {\n itemDegree[i] += 1;\n itemGraph.get(item).add(i); \n } else {\n groupDegree[curGroupId] += 1;\n groupGraph.get(beforeGroupId).add(curGroupId);\n }\n }\n }\n\n // 组间拓扑关系排序\n List groupTopSort = topSort(groupDegree, groupGraph, id); \n if (groupTopSort.size() == 0) {\n return new int[0];\n }\n int[] ans = new int[n];\n int index = 0;\n // 组内拓扑关系排序\n for (int curGroupId : groupTopSort) {\n int size = groupItem.get(curGroupId).size();\n if (size == 0) {\n continue;\n }\n List res = topSort(itemDegree, itemGraph, groupItem.get(curGroupId));\n if (res.size() == 0) {\n return new int[0];\n }\n for (int item : res) {\n ans[index++] = item;\n }\n }\n return ans;\n }\n\n public List topSort(int[] deg, List> graph, List items) {\n Queue queue = new LinkedList();\n for (int item : items) {\n if (deg[item] == 0) {\n queue.offer(item);\n }\n }\n List res = new ArrayList();\n while (!queue.isEmpty()) {\n int u = queue.poll(); \n res.add(u);\n for (int v : graph.get(u)) {\n if (--deg[v] == 0) {\n queue.offer(v);\n }\n }\n }\n return res.size() == items.size() ? res : new ArrayList();\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190861492","body":"模拟机器人移动\n```java\nclass Solution {\n public boolean judgeCircle(String moves) {\n int x = 0, y = 0;\n int length = moves.length();\n for (int i = 0; i < length; i++) {\n char move = moves.charAt(i);\n if (move == 'U') {\n y--;\n } else if (move == 'D') {\n y++;\n } else if (move == 'L') {\n x--;\n } else if (move == 'R') {\n x++;\n }\n }\n return x == 0 && y == 0;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193745750","body":"模拟\n```java\nclass Solution {\n public int[] getOrder(int[][] ts) {\n int n = ts.length;\n // 将 ts 转存成 nts,保留任务编号\n int[][] nts = new int[n][3];\n for (int i = 0; i < n; i++) nts[i] = new int[]{ts[i][0], ts[i][1], i};\n // 根据任务入队时间进行排序\n Arrays.sort(nts, (a,b)->a[0]-b[0]);\n // 根据题意,先按照「持续时间」排序,再根据「任务编号」排序\n PriorityQueue q = new PriorityQueue<>((a,b)->{\n if (a[1] != b[1]) return a[1] - b[1];\n return a[2] - b[2];\n });\n int[] ans = new int[n];\n for (int time = 1, j = 0, idx = 0; idx < n; ) {\n \t// 如果当前任务可以添加到「队列」中(满足入队时间)则进行入队\n while (j < n && nts[j][0] <= time) q.add(nts[j++]);\n if (q.isEmpty()) {\n\t // 如果当前「队列」没有任务,直接跳到下个任务的入队时间\n time = nts[j][0];\n } else {\n \t// 如果有可执行任务的话,根据优先级将任务出队(记录下标),并跳到该任务完成时间点\n int[] cur = q.poll();\n ans[idx++] = cur[2];\n time += cur[1];\n }\n }\n return ans;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194379645","body":"转化为分钟\n```java\nclass Solution {\n public int numberOfRounds(String loginTime, String logoutTime) {\n int loginHour = Integer.parseInt(loginTime.substring(0, 2));\n int loginMinute = Integer.parseInt(loginTime.substring(3));\n int logoutHour = Integer.parseInt(logoutTime.substring(0, 2));\n int logoutMinute = Integer.parseInt(logoutTime.substring(3));\n int loginTotalMinute = loginHour * 60 + loginMinute;\n int logoutTotalMinute = logoutHour * 60 + logoutMinute;\n if (loginTotalMinute > logoutTotalMinute) {\n logoutTotalMinute += 1440;\n }\n if (loginTotalMinute % 15 != 0) {\n loginTotalMinute += 15 - loginTotalMinute % 15;\n }\n logoutTotalMinute -= logoutTotalMinute % 15;\n return Math.max((logoutTotalMinute - loginTotalMinute) / 15, 0);\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3195332635","body":"分别模拟三个情况\n```java\nclass Solution {\n public int minCharacters(String a, String b) {\n int n = a.length(), m = b.length(), ans = 0x3f3f3f3f;\n int[] c1 = new int[26], c2 = new int[26];\n for (char c : a.toCharArray()) c1[c - 'a']++;\n for (char c : b.toCharArray()) c2[c - 'a']++;\n for (int i = 0; i < 26 && ans != 0; i++) {\n // 3\n int ca = n - c1[i], cb = m - c2[i];\n ans = Math.min(ans, ca + cb);\n if (i == 0) continue;\n int r1 = 0, r2 = 0;\n // 1\n for (int j = i; j < 26; j++) r1 += c1[j];\n for (int j = 0; j < i; j++) r1 += c2[j];\n // 2\n for (int j = i; j < 26; j++) r2 += c2[j];\n for (int j = 0; j < i; j++) r2 += c1[j];\n ans = Math.min(ans, Math.min(r1, r2));\n }\n return ans;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199298563","body":"归并排序\n\n```java\nclass Solution {\n public int[] sortArray(int[] nums) {\n sort(nums,0,nums.length - 1);\n return nums;\n }\n\n public void sort(int[] nums,int start,int end){\n if(start >= end) return;\n int p = para(nums,start,end);\n\n sort(nums,start,p - 1);\n sort(nums,p + 1,end);\n }\n\n public int para(int[] nums,int l,int h){\n\n int x = nums[l];\n int i = l,j = h;\n while(i < j)\n {\n while(i < j && nums[j] >= x) j--;\n if(i < j) nums[i++] = nums[j];\n\n while(i < j && nums[i] < x) i++;\n if(i < j) nums[j--] = nums[i];\n }\n\n nums[i] = x;\n return i;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204106258","body":"二分查找\n```java\nclass Solution {\n public int mySqrt(int x) {\n if(x == 0) return 0;\n if(x == 1) return 1;\n int left = 0;\n int right = x;\n while(left < right)\n {\n int middle = left + (right - left) / 2;\n if(middle > x / middle){\n right = middle;\n }else if(middle < x / middle){\n left = middle + 1;\n }else{\n return middle;\n }\n }\n if(right == x / right){\n return right;\n }else{\n return right - 1;\n }\n\n \n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208985528","body":"二分查找\n```java\npublic class Solution extends VersionControl {\n public int firstBadVersion(int n) {\n int left = 1, right = n;\n while (left < right) { \n int mid = left + (right - left) / 2; \n if (isBadVersion(mid)) {\n right = mid; \n } else {\n left = mid + 1; \n }\n }\n return left;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3213255556","body":"```java\nclass Solution {\n public int reversePairs(int[] nums) {\n if (nums.length == 0) {\n return 0;\n }\n return reversePairsRecursive(nums, 0, nums.length - 1);\n }\n\n public int reversePairsRecursive(int[] nums, int left, int right) {\n if (left == right) {\n return 0;\n } else {\n int mid = (left + right) / 2;\n int n1 = reversePairsRecursive(nums, left, mid);\n int n2 = reversePairsRecursive(nums, mid + 1, right);\n int ret = n1 + n2;\n\n // 首先统计下标对的数量\n int i = left;\n int j = mid + 1;\n while (i <= mid) {\n while (j <= right && (long) nums[i] > 2 * (long) nums[j]) {\n j++;\n }\n ret += j - mid - 1;\n i++;\n }\n\n // 随后合并两个排序数组\n int[] sorted = new int[right - left + 1];\n int p1 = left, p2 = mid + 1;\n int p = 0;\n while (p1 <= mid || p2 <= right) {\n if (p1 > mid) {\n sorted[p++] = nums[p2++];\n } else if (p2 > right) {\n sorted[p++] = nums[p1++];\n } else {\n if (nums[p1] < nums[p2]) {\n sorted[p++] = nums[p1++];\n } else {\n sorted[p++] = nums[p2++];\n }\n }\n }\n for (int k = 0; k < sorted.length; k++) {\n nums[left + k] = sorted[k];\n }\n return ret;\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216192351","body":"```java\nclass Solution {\n public int findRadius(int[] houses, int[] heaters) {\n int ans = 0;\n Arrays.sort(heaters);\n for (int house : houses) {\n int i = binarySearch(heaters, house);\n int j = i + 1;\n int leftDistance = i < 0 ? Integer.MAX_VALUE : house - heaters[i];\n int rightDistance = j >= heaters.length ? Integer.MAX_VALUE : heaters[j] - house;\n int curDistance = Math.min(leftDistance, rightDistance);\n ans = Math.max(ans, curDistance);\n }\n return ans;\n }\n\n public int binarySearch(int[] nums, int target) {\n int left = 0, right = nums.length - 1;\n if (nums[left] > target) {\n return -1;\n }\n while (left < right) {\n int mid = (right - left + 1) / 2 + left;\n if (nums[mid] > target) {\n right = mid - 1;\n } else {\n left = mid;\n }\n }\n return left;\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"falsity":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073705405","body":"# 思路\n\n从低位往高位计算, 每次计算保留进位数据,本位留下余数\n\n```python\nclass Solution(object):\n def addToArrayForm(self, num, k):\n \"\"\"\n :type num: List[int]\n :type k: int\n :rtype: List[int]\n \"\"\"\n result = []\n i = len(num) - 1\n while i >=0 or k > 0:\n if i >= 0:\n k += num[i]\n i -= 1\n result.append(k % 10)\n k = k // 10\n return result[::-1]\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3079013152","body":"# 【Day 2】821. 字符的最短距离\n\n## 思路\n\n先遍历一遍获取c的位置列表, 再遍历每个位置计算最近的距离\n\n```python\nclass Solution(object):\n def shortestToChar(self, s, c):\n \"\"\"\n :type s: str\n :type c: str\n :rtype: List[int]\n \"\"\"\n locations = []\n result = []\n for i, char in enumerate(s):\n if char == c:\n locations.append(i)\n \n for i in range(len(s)):\n shortest = min(abs(i - location) for location in locations)\n result.append(shortest)\n return result\n```\n\n时间复杂度: O(n*m), m为字符c出现次数,最差为O(n^2)\n\n空间复杂度: O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084580543","body":"**【Day 3】1381. 设计一个支持增量操作的栈**\n\n*** 思路***\n\n用数组模拟栈\n\n```python\nclass CustomStack(object):\n\n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def __init__(self, maxSize):\n \"\"\"\n :type maxSize: int\n \"\"\"\n self.stack = [0] * maxSize\n self.top = -1\n \n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n if self.top < len(self.stack) - 1:\n self.top += 1\n self.stack[self.top] = x\n \n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if self.top == -1:\n return -1\n value = self.stack[self.top]\n self.top -= 1\n return value\n \n # 时间复杂度: O(k)\n # 空间复杂度: O(n)\n def increment(self, k, val):\n \"\"\"\n :type k: int\n :type val: int\n :rtype: None\n \"\"\"\n lim = min(k, self.top + 1)\n for i in range(lim):\n self.stack[i] += val\n \n\n\n# Your CustomStack object will be instantiated and called as such:\n# obj = CustomStack(maxSize)\n# obj.push(x)\n# param_2 = obj.pop()\n# obj.increment(k,val)\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089882117","body":"**【Day 4】394. 字符串解码**\n\n**思路**\n\n参照[Krahets的字符串解码题解](https://leetcode.cn/problems/decode-string/solutions/19447/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd/)中的辅助栈解法,利用栈来存储每一层[]中的字符串和需要重复的次数逐层拼接字符串,最后得到结果.\n\n**代码**\n\n```python\nclass Solution(object):\n def decodeString(self, s):\n \"\"\"\n :type s: str\n :rtype: str\n \"\"\"\n stack, res, multi = [], \"\", 0\n for c in s:\n if c == '[':\n stack.append([multi, res])\n res, multi = \"\", 0\n elif c == ']':\n cur_multi, last_res = stack.pop()\n res = last_res + cur_multi * res\n elif '0' <= c <= '9':\n multi = multi * 10 + int(c)\n else:\n res += c\n return res \n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(N)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092420487","body":"**【Day 5】232. 用栈实现队列**\n\n**思路**\n\n利用栈先进后出的性质,通过stack1完成元素的倒序放置,再将stack1的元素放入stack2中,前面的元素就放在了栈顶. 此时经过两次入栈出栈的操作stack2中的元素就满足了先进先出的要求.\n\n但是要注意以下问题:\n\n1. 只有在stack2中元素为空时才能将stack1中的元素放入stack2中,这样才能保证有序性\n2. 遍历list元素要使用while, 不能用for,否则会有元素被跳过\n\n**代码**\n\n```python\nclass MyQueue(object):\n\n def __init__(self):\n self.stack1, self.stack2 = [], []\n \n\n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n self.stack1.append(x)\n \n\n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n res = self.peek()\n return self.stack2.pop()\n \n\n def peek(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if self.stack2:\n return self.stack2[-1]\n elif self.stack1:\n while self.stack1:\n self.stack2.append(self.stack1.pop())\n return self.stack2[-1]\n else:\n return -1\n \n\n def empty(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n return not self.stack1 and not self.stack2\n \n\n\n# Your MyQueue object will be instantiated and called as such:\n# obj = MyQueue()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.peek()\n# param_4 = obj.empty()\n```\n\n**复杂度分析**\n\n时间复杂度: push, empty 是O(1), pop, peek是O(N)\n空间复杂度: O(N)\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097331008","body":"**【Day 7】61. 旋转链表**\n\n**思路**\n\nk可能会大于链表长度导致循环遍历链表. 所以真实的旋转偏移是k%n,n为链表长度. 使用双指针找到需要断开的节点位置,将链表进行断开和重新拼接即可得到结果\n\n```pyth\nclass Solution(object):\n def rotateRight(self, head, k):\n \"\"\"\n :type head: Optional[ListNode]\n :type k: int\n :rtype: Optional[ListNode]\n \"\"\"\n if k == 0 or not head or not head.next:\n return head\n\n node = head\n l = 0\n while node:\n l += 1\n node = node.next\n \n if k % l == 0:\n return head\n k = k % l\n slow = fast = head\n for i in range(k):\n fast = fast.next\n \n while fast.next:\n slow = slow.next\n fast = fast.next\n\n new_head = slow.next\n slow.next = None\n fast.next = head\n return new_head\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103411213","body":"**【Day 8】24. 两两交换链表中的节点**\n\n**思路**\n\n类似于反转链表, 用两个指针来对链表指向进行修改,唯一的区别是cur需要间隔一个进行遍历,而不是逐个遍历\n\n```python\nclass Solution(object):\n def swapPairs(self, head):\n \"\"\"\n :type head: Optional[ListNode]\n :rtype: Optional[ListNode]\n \"\"\"\n dummy = ListNode()\n dummy.next = head\n pre = dummy\n cur = head\n while cur and cur.next:\n nxt = cur.next\n cur.next = nxt.next\n nxt.next = cur\n pre.next = nxt\n pre = cur\n cur = cur.next\n \n return dummy.next\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109176294","body":"**【Day 9】109. 有序链表转换二叉搜索树**\n\n**思路**\n\n首先获取链表的长度,再根据二叉树的中序遍历方式递归构建BST, 根节点的值在遍历完左子树后刚好移动了m次到达中间节点,即根节点位置\n\n\n\n```python\nclass Solution:\n def sortedListToBST(self, head: Optional[ListNode]) -> Optional[TreeNode]:\n def getLength(head: ListNode) -> int:\n count = 0\n while head:\n count += 1\n head = head.next\n return count\n\n def buildBST(left: int, right: int) -> TreeNode:\n if left > right:\n return None\n m = (left + right) // 2\n root = TreeNode()\n left_node = buildBST(left, m - 1)\n nonlocal head\n root.val = head.val\n head = head.next\n \n right_node = buildBST(m+1, right)\n root.left = left_node\n root.right = right_node\n return root\n\n l = getLength(head)\n return buildBST(0, l - 1)\n```\n\n**复杂度分析**\n\n时间复杂度: O(n)\n空间复杂度: O(log n)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3122088595","body":"**【Day 12】146. LRU 缓存机制**\n\n**思路**\n\n`get` 和 `put` 必须以 `O(1)` 的平均时间复杂度运行, 说明需要使用到map. 需要记录关键字使用过的顺序需要使用到链表\n\nget方法需要查询map, 如果key存在则返回值,如果不存在则返回-1. 查询完成后,需要把该节点移动到队首(删除后再插入队首)\n\nput方法需要先查询map容量,如果容量已满,需要通过list找到队尾元素删除, 并将新元素插入队首\n\nnode需要知道前后节点,所以使用双向链表,map和node之间建立映射方便查询数据\n\n\n\n需要的内部函数: 删除元素, 将元素插入队首\n\n```python\nclass LRUCache:\n class Node:\n def __init__(self, key: int, val: int):\n self.key = key\n self.val = val\n self.pre = pre\n self.next = next\n\n def __init__(self, capacity: int):\n self.capacity = capacity\n self.dummy = self.Node(-1, -1)\n self.dummy.pre = self.dummy\n self.dummy.next = self.dummy\n self.map = {}\n\n def add_node_to_head(self, node: Node):\n node.pre = self.dummy\n node.next = self.dummy.next\n self.dummy.next.pre = node\n self.dummy.next = node\n\n def remove_node(self, node: Node):\n node.pre.next = node.next\n node.next.pre = node.pre\n\n def get(self, key: int) -> int:\n if key not in self.map:\n return -1\n\n node = self.map[key]\n self.remove_node(node)\n self.add_node_to_head(node)\n return node.val\n\n def put(self, key: int, value: int) -> None:\n if key in self.map:\n node = self.map[key]\n node.val = value\n self.remove_node(node)\n self.add_node_to_head(node)\n return\n\n new_node = self.Node(key, value)\n self.map[key] = new_node\n self.add_node_to_head(new_node)\n\n if len(self.map) > self.capacity:\n tail = self.dummy.pre\n del self.map[tail.key]\n self.remove_node(tail)\n\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124440801","body":"**【Day 13】104. 二叉树的最大深度**\n\n**思路**\n\n二叉树的最大深度为max(左子树深度, 右子树深度) + 1, 这就变成了一个递归问题\n\n```python\nclass Solution(object):\n def maxDepth(self, root):\n \"\"\"\n :type root: Optional[TreeNode]\n :rtype: int\n \"\"\"\n if root is None:\n return 0\n if root is not None and root.left is None and root.right is None:\n return 1\n return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1\n\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127200969","body":"**【Day 14】100. 相同的树**\n\n**思路**\n\n相同的树一定根节点相同,并且左子树和右子树都相同, 可以进行递归判断所有子树是否相同\n\n```python\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if p is None or q is None:\n return p is q\n \n if p.val == q.val:\n return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)\n else:\n return False\n```\n\n**复杂度分析**\n\n时间复杂度: O(min(m,n)) m为p节点个数,n为q节点个数\n空间复杂度: O(min(m,n)) m为p节点个数,n为q节点个数","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136787502","body":"**【Day 16】513. 找树左下角的值**\n\n**思路**\n\n从右往左层序遍历,最后一个节点就是左下角的点\n\n```python\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n q = deque([root])\n while q:\n node = q.popleft()\n if node.right: q.append(node.right)\n if node.left: q.append(node.left)\n return node.val\n```\n\n**复杂度分析**\n\n时间复杂度: O(n) \n空间复杂度: O(n)\n\n","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3151014729","body":"**【Day 21】447. 回旋镖的数量**\n\n**思路**\n\n首先计算距离相等的点的数量,在计算相同距离点之间的排列组合数量\n\n```python\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n res = 0\n n = len(points)\n if n < 3:\n return 0\n \n for i in range(n):\n x0, y0 = points[i]\n dist_count = {}\n \n for j in range(n):\n if i == j:\n continue\n \n x1, y1 = points[j]\n dx = x1 - x0\n dy = y1 - y0\n dist_sq = dx * dx + dy * dy\n \n dist_count[dist_sq] = dist_count.get(dist_sq, 0) + 1\n \n for cnt in dist_count.values():\n res += cnt * (cnt - 1)\n \n return res\n```\n\n时间复杂度: O(n ^ 2)\n\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3175046868","body":"**【Day 28】239. 滑动窗口最大值**\n\n```python\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n n = len(nums)\n if n == 0 or k == 0:\n return []\n \n res = []\n q = deque() \n for i in range(n):\n while q and q[0] < i - k + 1:\n q.popleft()\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n if i >= k - 1:\n res.append(nums[q[0]])\n return res\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3179722453","body":"\n\n```python\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n in_list = [0] * (n + 1)\n out_list = [0] * (n + 1)\n for i in trust:\n in_list[i[1]] += 1\n out_list[i[0]] += 1\n\n for i in range(1, n+1):\n if in_list[i] == n - 1 and out_list[i] == 0:\n return i\n\n return -1\n```\n\n时间复杂度: O(n + m), m为trust列表长度\n\n空间复杂度: O(n)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194443006","body":"```python\nclass Solution:\n def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:\n start = 60 * int(loginTime[:2]) + int(loginTime[3:])\n end = 60 * int(logoutTime[:2]) + int(logoutTime[3:])\n if start > end:\n end += 24 * 60\n start = math.ceil(start / 15) * 15\n end = end // 15 * 15\n return max(0, (end - start) // 15)\n```\n\n时间复杂度: O(1)\n\n空间复杂度: O(1)\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3200900420","body":"快排\n```java\n class Solution {\n public int[] sortArray(int[] nums) {\n quickSort(nums, 0, nums.length - 1);\n return nums;\n }\n\n private void quickSort(int[] nums, int low, int high){\n if(low < high){\n int mid = partition(nums, low, high);\n quickSort(nums, low, mid - 1);\n quickSort(nums, mid + 1, high);\n }\n }\n\n private int partition(int[] nums, int low, int high){\n int pivot = low + (int) (Math.random() * (high - low + 1));\n swap(nums, pivot, low);\n int i = low, j = low + 1;\n while (j <= high){\n if(nums[j] < nums[low]){\n swap(nums, j, ++i);\n }\n j++;\n }\n swap(nums, low, i);\n return i;\n }\n\n private void swap(int[] nums, int i, int j){\n int tmp = nums[i];\n nums[i] = nums[j];\n nums[j] = tmp;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3224529913","body":"思路: 采用定长滑动窗口的做法, 先初始化定长窗口,再移动更新结果\n\n```python\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n ans = count = 0\n vowels = set(['a', 'e', 'i', 'o', 'u'])\n chars = list(s)\n n = len(chars)\n left = right = 0\n while right < k:\n if chars[right] in vowels:\n count += 1\n right += 1\n ans = count\n while right < n:\n if chars[right] in vowels:\n count += 1\n if chars[left] in vowels:\n count -= 1\n ans = max(count, ans)\n left += 1\n right += 1\n return ans\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3228513919","body":"\n\n```java\nclass Solution {\n public double new21Game(int n, int k, int maxPts) {\n if( k > n){\n return 0;\n }\n if((k == 0 && n >= 0) && n > k + maxPts){\n return 1;\n }\n\n int len = k + maxPts;\n double[] dp = new double[len];\n double sum = 0;\n\n for(int i = k; i < len && i <= n; i++){\n dp[i] = 1;\n sum++;\n }\n\n for(int i = k - 1; i >= 0; i--){\n dp[i] = sum / maxPts;\n sum = sum - dp[i + maxPts] + dp[i];\n }\n return dp[0];\n }\n}\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(n)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3240213950","body":"**\n\n```python\nclass Solution:\n def readBinaryWatch(self, turnedOn: int) -> List[str]:\n ans = []\n for h in range(12):\n for m in range(60):\n if bin(h).count('1') + bin(m).count('1') == turnedOn:\n ans.append(f\"{h}:{m:02d}\")\n \n return ans\n```\n\n时间复杂度: O(1)\n\n空间复杂度: O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245665636","body":"\n\n```python\nclass Solution:\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n # 时间复杂度: O(mn)\n # 空间复杂度: O(mn)\n ans = 0\n m, n = len(grid), len(grid[0])\n\n def dfs(i: int, j: int) -> int:\n count = 1\n grid[i][j] = 0\n for x, y in (i-1, j), (i+1, j), (i, j-1), (i, j+1):\n if 0<= x < m and 0 <= y < n and grid[x][y]:\n count += dfs(x, y)\n return count\n\n for i, row in enumerate(grid):\n for j, x in enumerate(row):\n if x:\n ans = max(ans, dfs(i, j))\n\n return ans\n \n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3253854706","body":"\n```python\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n # 时间复杂度: O(n)\n # 空间复杂度: O(n)\n ans = 0\n q = initialBoxes\n while q:\n p = []\n for i in q:\n if status[i] == 0:\n p.append(i)\n continue\n ans += candies[i]\n for key in keys[i]:\n status[key] = 1\n for c in containedBoxes[i]:\n p.append(c)\n if p == q or not p:\n break\n q = p\n return ans\n```","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3271174778","body":"\n\n```java\nclass Solution {\n public int longestCommonSubsequence(String text1, String text2) {\n # 时间复杂度: O(mn)\n # 空间复杂度: O(mn)\n int m = text1.length(), n = text2.length();\n int[][] dp = new int[m+1][n+1];\n for (int i = 1; i <= m; i++) {\n char c1 = text1.charAt(i - 1);\n for (int j = 1; j <= n; j++) {\n char c2 = text2.charAt(j - 1);\n if (c1 == c2){\n dp[i][j] = dp[i - 1][j-1] + 1;\n }else{\n dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);\n }\n\n }\n }\n return dp[m][n];\n }\n}\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3275118967","body":"时间复杂度: O(m * n)\n\n空间复杂度: ~~O(n)~~ 题解指正行列可以交换, 所以为O(min(m, n))\n\n```python\nclass Solution:\n def uniquePaths(self, m: int, n: int) -> int:\n f = [1] * n\n\n for i in range(1, m):\n for j in range(1, n):\n f[j] += f[j - 1]\n return f[n - 1]\n \n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289638493","body":"```python\nclass Solution:\n def findTargetSumWays(self, nums: List[int], target: int) -> int:\n # 时间复杂度: O(n * target)\n # 空间复杂度: O(n * target)\n @cache\n def dfs(i: int, c: int) -> int:\n if i < 0:\n return 1 if c == 0 else 0\n \n return dfs(i - 1, c - nums[i]) + dfs(i - 1, c + nums[i])\n \n return dfs(len(nums) - 1, target)\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3298968000","body":"```python\nclass Solution:\n def change(self, amount: int, coins: List[int]) -> int:\n \t# 时间复杂度(n * amount)\n # 空间复杂度(amount)\n f = [1] + [0] * amount\n for x in coins:\n for c in range(x, amount + 1):\n f[c] += f[c - x]\n return f[-1]\n```","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316065059","body":"```python\nclass Solution:\n def mergeTwoLists(self, list1:Optional[ListNode], list2:Optional[ListNode]) -> Optional[ListNode]:\n cur = dummy = ListNode()\n while list1 and list2:\n if list1.val < list2.val:\n cur.next = list1\n list1 = list1.next\n else:\n cur.next = list2\n list2 = list2.next\n cur = cur.next\n cur.next = list1 if list1 else list2\n return dummy.next\n\n def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:\n # 时间复杂度: O(L * logm) m 为 lists 的长度,L 为所有链表的长度之和\n # 空间复杂度: O(1)\n m = len(lists)\n if m == 0:\n return None\n step = 1\n while step < m:\n for i in range(0, m - step, step * 2):\n lists[i] = self.mergeTwoLists(lists[i], lists[i + step])\n step *= 2\n return lists[0]\n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3334653673","body":"思路: 用Node来创建一个树, 每个node下面可以存下一个字母的node, 并且每个node有个end标志位,用来表示单词结尾\n\n```python\nclass Node:\n __slots__ = \"son\", \"end\"\n\n def __init__(self):\n self.son = {}\n self.end = False\n\n\nclass Trie:\n def __init__(self):\n self.root = Node()\n\n # 时间复杂度: O(n)\n def insert(self, word: str) -> None:\n cur = self.root\n for c in word:\n if c not in cur.son:\n cur.son[c] = Node()\n cur = cur.son[c]\n cur.end = True\n\n # 时间复杂度: O(n)\n def find(self, word: str) -> int:\n cur = self.root\n for c in word:\n if c not in cur.son:\n return 0\n cur = cur.son[c]\n return 2 if cur.end else 1\n \n # 时间复杂度: O(n)\n def search(self, word: str) -> bool:\n return self.find(word) == 2\n\n # 时间复杂度: O(n)\n def startsWith(self, prefix: str) -> bool:\n return self.find(prefix) != 0\n```\n\n空间复杂度: O(m * n) m为insert次数, n为单词长度","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuetong3yu":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073754281","body":"```js\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(nums, k) {\n let str1 = '', str2 = String(k)\n for(let i = 0; i < nums.length; i++) {\n str1 += nums[i];\n }\n // swap to make sure str1 is longer than str2\n if (str1.length < str2.length) {\n const t = str1;\n str1 = str2;\n str2 = t;\n }\n const res = new Array(str1.length).fill(0);\n let p1 = str1.length - 1, p2 = str2.length - 1;\n while(p1 >= 0) {\n res[p1] = Number(str1[p1]) + Number(str2[p2] ?? 0);\n p1 --, p2 --;\n }\n const len = res.length\n let need_shift = false\n for (let i = len - 1; i >= 0; i--) {\n if (res[i] >= 10) {\n if (i === 0) {\n need_shift = true\n } else {\n res[i - 1] = res[i - 1] + 1;\n }\n res[i] = res[i] % 10\n }\n }\n if (need_shift) res.unshift(1)\n return res;\n};\n```\n\n尝试了几个不同的方法。。。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078802551","body":"模拟题意AC,但感觉第二遍 for 循环没必要循环整个 indexes 数组,indexes 数组是天然有序的,应该可以用双指针优化\n\n```js\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const indexes = []\n for(let i = 0; i < s.length; i++) {\n if (s[i] === c) indexes.push(i);\n }\n const res = [];\n for(let i = 0; i < s.length; i++) {\n let min = Infinity\n for(let j = 0; j < indexes.length; j++) {\n min = Math.min(min, Math.abs(i - indexes[j]));\n }\n res.push(min)\n }\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082104676","body":"思路一直接模拟题意,increment 操作循环遍历一遍让元素自增:\n\n```js\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.stack = []\n this.size = 0\n this.maxSize = maxSize\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.size === this.maxSize) return;\n this.stack.push(x);\n this.size ++\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.size === 0) return -1\n const res = this.stack.pop();\n this.size --\n return res;\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n for(let i = 0; i < this.size;i ++) {\n if (i < k) {\n this.stack[i] += val;\n }\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n---\n\n\n思路二使用一个 hashmap 维护自增量,只有在 pop 操作的时候才去运算:\n\n```js\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.stack = []\n this.size = 0\n this.maxSize = maxSize\n this.map = {}\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.size === this.maxSize) return;\n this.stack.push(x);\n this.size ++\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.size === 0) return -1\n const inc = this.map[this.size - 1] || 0;\n const res = this.stack.pop();\n // update inc\n if (inc) {\n this.map[this.size - 1] = 0;\n this.map[this.size - 2] = this.map[this.size - 2] ? this.map[this.size - 2] + inc : inc;\n }\n this.size --\n\n return res + inc;\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n const key = Math.min(k - 1, this.size - 1);\n this.map[key] = this.map[key] ? this.map[key] + val : val;\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n🥲 结果跑出来只打败了 18% 的人,应该是题目给的数据量量太小了 <= 1000,操作 hashmap 的 cost 超过了循环 stack 的时间,不如方法一暴力循环。。。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089570929","body":"用栈秒了\n\n```js\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let i = 0;\n while(i < s.length) {\n const char = s[i];\n if (char !== ']') {\n stack.push(char)\n i ++\n } else {\n let repeatStr = ''\n while(stack[stack.length - 1] !== '[') {\n const new_char = stack.pop();\n repeatStr = new_char + repeatStr;\n }\n // pop '['\n stack.pop()\n // get number \n let repeat_times = ''\n while(/[0-9]/.test(stack[stack.length - 1])) {\n repeat_times = stack.pop() + repeat_times\n }\n repeat_times = Number(repeat_times)\n stack.push(repeatStr.repeat(repeat_times));\n i ++\n }\n }\n let res = ''\n while(stack.length) {\n res = stack.pop() + res;\n }\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091373955","body":"思路:用两个栈模拟操作,在 peek 的时候出第二个栈的顶部即可\n\n\n```js\nvar MyQueue = function() {\n this.a = [];\n this.b = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.a.push(x);\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n this.peek();\n return this.b.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if (this.b.length) {\n return this.b[this.b.length - 1]\n } else {\n while(this.a.length) {\n this.b.push(this.a.pop())\n }\n return this.peek()\n }\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return !this.a.length && !this.b.length\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094511265","body":"用了一个简单的前缀和 AC 了,时间复杂度也是 NlogN\n\n```js\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const sorted_arr = [...arr].sort((a, b) => a - b);\n let count_a = count_b = res = 0;\n\n for(let i = 0; i < arr.length;i ++) {\n count_a += sorted_arr[i];\n count_b += arr[i];\n\n if (count_a === count_b) res ++ \n }\n\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3096927980","body":"```js\nvar rotateRight = function(head, k) {\n if (!head || !head.next || k === 0) return head;\n\n // Count the length of the list\n let length = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n length++;\n }\n\n // Normalize k\n k %= length;\n if (k === 0) return head;\n\n // Find the new tail: (length - k - 1)th node\n let newTail = head;\n for (let i = 0; i < length - k - 1; i++) {\n newTail = newTail.next;\n }\n\n // Rotate\n let newHead = newTail.next;\n newTail.next = null;\n tail.next = head;\n\n return newHead;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100186608","body":"考察交换链表节点的基本操作,需要注意的是“什么时候使用 dummy 节点”的技巧。我的理解是在需要涉及到头节点操作的时候,就创建 dummy 节点。比如这一题 - 交换头两个节点的时候就会涉及到头节点的变更。\n\n\n```js\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n const dummy = new ListNode(null, head);\n let p = dummy;\n while(p.next && p.next.next) {\n const p1 = p.next, p2 = p.next.next;\n p.next = p2;\n p1.next = p2.next;\n p2.next = p1;\n p = p1\n }\n return dummy.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3108866758","body":"Same solution with Problem108. But this problem is giving List instead plain array. So will need to use the trick of two pointers to get the mid node of a Single List.\n\n```js\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if (!head) return null\n return helper(head, null)\n\n function helper(head, tail) {\n if (head === tail) return null;\n let fast = head;\n let slow = head;\n while(fast !== tail && fast.next !== tail) {\n fast = fast.next.next;\n slow = slow.next;\n }\n const root = new TreeNode(slow.val);\n root.left = helper(head, slow);\n root.right = helper(slow.next, tail);\n return root\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111667789","body":"A small trick here is `pa !== pb` and `return pa`. For negative scenarios, if given Lists were not intersected, then one of the Lists must be pointing to `null`, and then returning `null` is expected answer. \n\n```js\nvar getIntersectionNode = function(headA, headB) {\n let pa = headA, pb = headB;\n while(pa !== pb) {\n pa = pa ? pa.next : headB;\n pb = pb ? pb.next : headA;\n }\n return pa\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3115364562","body":"Find the intersection node first, and move the slow pointer to the head, and slowly move both of the pointers till they meet each other(can be proved)\n\n```js\nvar detectCycle = function(head) {\n if (!head) return head;\n let fast = head, slow = head;\n // step1: find the intersection node\n while(fast && fast.next) {\n fast = fast.next.next;\n slow = slow.next;\n // step2: find the entry of the cycle\n if (fast === slow) {\n slow = head;\n while(fast !== slow) {\n fast = fast.next\n slow = slow.next\n }\n return slow;\n }\n }\n return null;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3120830111","body":"In JS, we need to build a double linked list data structure by our own. The rest of the logic is quite straight forward - which use hashmap to save key-node, and use linked list to store access frequency. \n\n```js\nclass DoubleLinkedListNode {\n constructor(key, value) {\n this.key = key;\n this.value = value;\n this.prev = null;\n this.next = null;\n }\n}\n\nclass LRUCache {\n constructor(capacity) {\n this.capacity = capacity;\n this.usedSpace = 0;\n\n this.hashmap = {};\n this.dummyHead = new DoubleLinkedListNode(null, null);\n this.dummyTail = new DoubleLinkedListNode(null, null);\n this.dummyHead.next = this.dummyTail;\n this.dummyTail.prev = this.dummyHead;\n }\n\n _isFull() {\n return this.usedSpace === this.capacity;\n }\n _addToHead(node) {\n const currentHead = this.dummyHead.next;\n\n node.next = currentHead;\n node.prev = this.dummyHead;\n currentHead.prev = node;\n this.dummyHead.next = node;\n\n return node;\n }\n _removeNode(node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n node.next = null\n node.prev = null\n return node\n }\n\n get(key) {\n if (this.hashmap[key] !== undefined) {\n const node = this.hashmap[key];\n this._addToHead(this._removeNode(node));\n return node.value\n } else {\n return -1\n }\n }\n put(key, value) {\n if (this.hashmap[key] !== undefined) {\n const node = this.hashmap[key];\n node.value = value;\n this._addToHead(this._removeNode(node))\n } else {\n if (this._isFull()) {\n const nodeNeedToEvict = this.dummyTail.prev;\n delete this.hashmap[nodeNeedToEvict.key];\n this._removeNode(nodeNeedToEvict);\n this.usedSpace --\n }\n const node = new DoubleLinkedListNode(key, value);\n this.hashmap[key] = node;\n this._addToHead(node);\n this.usedSpace ++\n }\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123671763","body":"Easy\n\n```js\nvar maxDepth = function(root) {\n if (!root) return 0\n return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3124879038","body":"DFS\n\n```js\nvar isSameTree = function(p, q) {\n if (!p && !q) return true\n if (!p || !q) return false\n return p.val === q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130312988","body":"DFS will be much simpler. BFS will need to pass a lot of context(params) into helper function which I don't like and not maintainable as well.\n\n\n```js\nvar sumNumbers = function(root) {\n const res = [];\n dfs(root, '')\n return res.reduce((prev, cur) => prev + cur, 0);\n\n\n function dfs(node, str) {\n if (!node.left && !node.right) {\n res.push(+`${str}${node.val}`);\n return;\n }\n if (node.left) dfs(node.left, `${str}${node.val}`);\n if (node.right) dfs(node.right, `${str}${node.val}`);\n } \n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135220392","body":"Using BFS when accessing the first in the queue, that's the leftest node. And because BFS is looping thru by level, so the last time going thru the queue is the most bottom level. \n\n```js\nvar findBottomLeftValue = function(root) {\n const queue = [root];\n let min = null;\n while(queue.length) {\n const size = queue.length;\n for(let i = 0; i < size; i++) {\n const node = queue.shift();\n if (i === 0) min = node.val\n \n\n if (node.left) queue.push(node.left);\n if (node.right) queue.push(node.right);\n }\n }\n return min;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138261960","body":"Can use either `DFS` or `BFS` to solve the problem. DFS is more simple to me: \n\n```js\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n let res = [];\n function dfs(node) {\n if (!node) {\n res.push('null');\n return;\n }\n res.push(String(node.val));\n dfs(node.left)\n dfs(node.right)\n }\n dfs(root);\n console.log(res.join(','))\n return res.join(',')\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n const datas = data.split(',');\n let i = 0;\n return dfs()\n\n function dfs() {\n const char = datas[i];\n if (char === 'null') {\n i ++\n return null\n }\n const node = new TreeNode(+char);\n i ++\n node.left = dfs()\n node.right = dfs()\n return node;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144933267","body":"Use BFS to save the row and column as index, and then sort these indexes. I think the complexity of this problem is how to mange those keys, 2 dimensions keys are quite intricate. \n\nRuntime complexity: O(nlogn), looping over the nodes is O(n), and using `sort` functions are O(nlogn), the bottle neck is sorting functions\nMemory complexity: O(n), use a hashmap to store all nodes\n\n```js\nvar verticalTraversal = function(root) {\n const map = {}\n const queue = [{\n node: root,\n col: 0,\n }];\n let row = 0;;\n while(queue.length) {\n const size = queue.length;\n for(let i = 0; i < size; i++) {\n const cur = queue.shift();\n const node = cur.node;\n if (map[cur.col]?.[row] === undefined) {\n map[cur.col] = {\n ...map[cur.col],\n [row]: [node.val]\n }\n } else {\n map[cur.col][row].push(node.val);\n }\n if (node.left) queue.push({\n node: node.left, \n col: cur.col - 1,\n })\n if (node.right) queue.push({\n node: node.right,\n col: cur.col + 1\n })\n }\n row ++\n }\n const orderByColumn = Object.entries(map).sort(([key1, _], [key2, __]) => Number(key1) - Number(key2));\n const flatternByColumn = orderByColumn.map(i => {\n const column = i[1];\n const arr = [];\n Object.entries(column).sort(([row1], [row2]) => row1 - row2).forEach(([_row, nodes]) => {\n const orderedNodes = nodes.sort((a, b) => a - b);\n arr.push(...orderedNodes)\n })\n return arr\n })\n return flatternByColumn\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146516199","body":"```js\nvar twoSum = function(nums, target) {\n const map = {}\n for(let i = 0; i < nums.length; i ++) {\n const num = nums[i];\n const diff = target - num\n if (map[diff] !== undefined) {\n return [map[diff], i];\n } else {\n map[num] = i;\n }\n }\n return [-1, -1]\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148419003","body":"```js\nvar topKFrequent = function(nums, k) {\n const map = {};\n for(let i = 0; i < nums.length; i++) {\n map[nums[i]] = map[nums[i]] ? map[nums[i]] + 1 : 1;\n }\n const maxCnt = Math.max(...Object.values(map));\n\n const buckets = Array.from({length: maxCnt + 1}, () => []);\n for(let [num, count] of Object.entries(map)) {\n buckets[count].push(num);\n }\n\n const res = [];\n for(let i = maxCnt; i >= 0 && res.length < k; i--) {\n res.push(...buckets[i])\n }\n \n return res.map(i => +i)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149124973","body":"Using brute force at the beginning, and didn't think of can use map to reduce runtime: \n\n```js\nvar numberOfBoomerangs = function(points) {\n let res = 0;\n let map = {}\n for(let [x1, y1] of points) {\n map = {}\n for(let [x2, y2] of points) {\n const distance = (x1 - x2) ** 2 + (y1 - y2) ** 2;\n const count = map[distance] ?? 0;\n res += count * 2;\n map[distance] = count + 1 \n }\n }\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3155367267","body":"Two pointers classic problem (sliding window): \n\n```js\nvar lengthOfLongestSubstring = function(s) {\n let left = 0, right = 0, res = 0\n const window = {};\n while(right < s.length) {\n const right_char = s[right ++];\n window[right_char] = window[right_char] ? window[right_char] + 1 : 1;\n while (window[right_char] > 1) {\n let remove_char = s[left ++];\n window[remove_char] --;\n }\n res = Math.max(right - left, res);\n }\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160227870","body":"so hard: \n\n\n```js\nvar findSubstring = function(s, words) {\n\n const wordLen = words[0].length;\n const numWords = words.length;\n const totalLen = wordLen * numWords;\n const n = s.length;\n const res = [];\n\n if (n < totalLen) return [];\n\n const wordCount = new Map();\n for (let word of words) {\n wordCount.set(word, (wordCount.get(word) || 0) + 1);\n }\n\n // we loop over wordLen offsets\n for (let offset = 0; offset < wordLen; offset++) {\n let left = offset, count = 0;\n const seen = new Map();\n\n for (let right = offset; right + wordLen <= n; right += wordLen) {\n const word = s.slice(right, right + wordLen);\n\n if (wordCount.has(word)) {\n seen.set(word, (seen.get(word) || 0) + 1);\n count++;\n\n // we shrink window if word is overused\n while (seen.get(word) > wordCount.get(word)) {\n const leftWord = s.slice(left, left + wordLen);\n seen.set(leftWord, seen.get(leftWord) - 1);\n left += wordLen;\n count--;\n }\n\n // Valid window\n if (count === numWords) {\n res.push(left);\n const firstWord = s.slice(left, left + wordLen);\n seen.set(firstWord, seen.get(firstWord) - 1);\n left += wordLen;\n count--;\n }\n } else {\n seen.clear();\n count = 0;\n left = right + wordLen;\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3164450266","body":"```js\nvar minSubarray = function(nums, p) {\n let totalSum = nums.reduce((a, b) => a + b, 0);\n\n // Find the remainder when total sum is divided by p\n let rem = totalSum % p;\n if (rem === 0) return 0; // If the remainder is 0, no subarray needs to be removed\n\n let prefixMod = new Map();\n prefixMod.set(0, -1); // Initialize to handle full prefix\n let prefixSum = 0;\n let minLength = nums.length;\n\n for (let i = 0; i < nums.length; i++) {\n prefixSum += nums[i];\n let currentMod = prefixSum % p;\n let targetMod = (currentMod - rem + p) % p;\n\n if (prefixMod.has(targetMod)) {\n minLength = Math.min(minLength, i - prefixMod.get(targetMod));\n }\n\n prefixMod.set(currentMod, i);\n }\n\n return minLength === nums.length ? -1 : minLength;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168150001","body":"```js\nvar middleNode = function(head) {\n if (!head || !head.next) return head;\n let fast = head, slow = head;\n while(fast && fast.next) {\n fast = fast.next.next;\n slow = slow.next\n } \n return slow;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170748221","body":"```js\nvar removeDuplicates = function(nums) {\n let fast = 0, slow = 0;\n while(fast < nums.length) {\n if (nums[slow] !== nums[fast]) {\n nums[++slow] = nums[fast];\n }\n fast ++\n }\n return slow + 1\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172646559","body":"Binary Search\n\n```js\nvar searchInsert = function(nums, target) {\n let left = 0, right = nums.length;\n while(left < right) {\n const mid = left + Math.floor((right - left) / 2);\n if (nums[mid] >= target) {\n right = mid\n } else {\n left = mid + 1\n }\n }\n return left;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173319860","body":" Too long to put down DeQueue implementation in JS. Don't think this will be asked in an interview: \n\n```js\nvar maxSlidingWindow = function (nums, k) {\n const res = [];\n const dequeue = new Dequeue([]);\n // 前 k - 1 个数入队\n for (let i = 0; i < k - 1; i++) {\n dequeue.push(nums[i]);\n }\n\n // 滑动窗口\n for (let i = k - 1; i < nums.length; i++) {\n dequeue.push(nums[i]);\n res.push(dequeue.max());\n dequeue.shift(nums[i - k + 1]);\n }\n return res;\n};\n\nclass Dequeue {\n constructor(nums) {\n this.list = nums;\n }\n\n push(val) {\n const nums = this.list;\n // 保证数据从队头到队尾递减\n while (nums[nums.length - 1] < val) {\n nums.pop();\n }\n nums.push(val);\n }\n\n // 队头出队\n shift(val) {\n let nums = this.list;\n if (nums[0] === val) {\n // 这里的js实现shift()理论上复杂度应该是O(k), 就不去真实实现一个O(1)出队的队列了,意思到位即可\n nums.shift();\n }\n }\n\n max() {\n return this.list[0];\n }\n}\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3179501468","body":"```js\nvar findJudge = function (n, trust) {\n const count = new Array(n + 1).fill(0);\n for (const edge of trust) {\n const x = edge[0];\n const y = edge[1];\n count[y]++;\n count[x]--;\n }\n for (let i = 1; i <= n; ++i) {\n if (count[i] === n - 1) {\n return i;\n }\n }\n return -1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3184086046","body":"```js\nvar possibleBipartition = function(N, dislikes) {\n const graph = [...Array(N+1)].map(() => []);\n const visited = Array(N+1).fill(false);\n const color = Array(N+1).fill(0);\n\n for(let [u, v] of dislikes) {\n graph[u].push(v);\n graph[v].push(u);\n }\n\n for(let i = 1; i <= N; i++) {\n if(!colorNodes(i)) return false;\n }\n return true;\n\n function colorNodes(node) {\n if(visited[node]) return true;\n const currColor = new Set([1, 2]);\n\n\t\t// remove colors used by neighbors\n for(let child of graph[node]) {\n if(color[child] === 1) currColor.delete(1);\n if(color[child] === 2) currColor.delete(2);\n }\n\n\t\t// no color is available return false\n if(currColor.size === 0) return false;\n\t\t\n\t\t// assign the smallest available color\n color[node] = Math.min(...currColor);\n visited[node] = true; \n\n for(let child of graph[node]) {\n if(!colorNodes(child)) return false; \n }\n return true;\n }\n};\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"stonehl":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073791924","body":"C++代码:\n`class Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n vector res;\n int n = num.size();\n for (int i=n-1; i>=0; --i) {\n int sum = num[i] + k % 10;\n k /= 10;\n if (sum >= 10) {\n k++;\n sum -= 10;\n }\n res.push_back(sum);\n }\n for (; k > 0; k /= 10) {\n res.push_back(k % 10);\n }\n reverse(res.begin(), res.end());\n return res;\n }\n};`","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097159903","body":"### 思路:\n1. 异常情况判断;\n2. 统计链表长度, 同时将链表的收尾相连;\n3. 将k对链表长度取余,余数为0表示刚好旋转了链表长度的整数倍,链表节点位置不变;\n4. 新的链表头节点是原链表中第 n - k 个节点。\n### C++代码\n```\nclass Solution {\npublic:\n ListNode* rotateRight(ListNode* head, int k) {\n if (head == nullptr || head->next == nullptr || k == 0)\n return head;\n int count = 1; // 用来统计链表长度\n ListNode* tmp = head;\n while (tmp->next != nullptr) {\n count++;\n tmp = tmp->next; // 滑动到链表尾部\n }\n k %= count;\n //如果刚好是链表长度的倍数,则不进行旋转\n if (k == 0)\n return head;\n tmp->next = head;\n // \n for (int i=0; i < count - k; i++) {\n tmp = tmp->next;\n }\n ListNode* newHead = tmp->next;\n tmp->next = nullptr;\n return newHead;\n }\n};\n```\n### 时间复杂度\nO(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103550594","body":"### 思路:\n使用递归的方法解题\n1. 找递归终止条件,当链表为空或链表只有一个元素时,没法交换,终止递归,返回当前节点;\n2. 每一次递归需要返回的值是交换后的子链表的头节点;\n\n### 代码:\n```\nclass Solution {\npublic:\n ListNode* swapPairs(ListNode* head) {\n if (head == nullptr || head->next == nullptr) {\n return head;\n }\n ListNode* next = head->next;\n head->next = swapPairs(next->next);\n next->next = head;\n return next;\n }\n};\n\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127754666","body":"### 思路:\n使用深度优先搜索的方法,\n1. 先找返回条件, 如果两个节点都为空,则返回true;\n2. 如果两个节点都不为空,并且这两个节点的值相等则分别递归判断这两个节点的左子树和右子树的值是否相等,如果相等,则返回true, 否则返回false。\n\n### 代码:\n```\nclass Solution {\npublic:\n bool isSameTree(TreeNode* p, TreeNode* q) {\n if(p==nullptr && q==nullptr) {\n return true;\n }\n if (p && q && (p->val == q->val)) {\n return isSameTree(p->right, q->right) && isSameTree(p->left, q->left);\n }\n return false;\n\n }\n};\n```\n### 复杂度分析:\n时间复杂度O(N),N为两棵树节点的最小值","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3151160755","body":"### 思路:\n将每个距离的出现次数记录在哈希表中,然后遍历哈希表,计算并累加回旋镖的个数。\n\n### 代码:\n```\nclass Solution {\npublic:\n int numberOfBoomerangs(vector>& points) {\n int n = points.size();\n int res = 0;\n if (n < 3)\n return res;\n\n int ans = 0;\n for (auto &p : points) {\n unordered_map cnt;\n for (auto &q : points) {\n int dis = (p[0] - q[0]) * (p[0] - q[0]) + (p[1] - q[1]) * (p[1] - q[1]);\n ++cnt[dis];\n }\n for (auto &[_, m] : cnt) {\n ans += m * (m - 1);\n }\n }\n return ans;\n\n }\n};\n```\n时间复杂度:O(n2)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3174960911","body":"### 思路:\n使用双端队列来维护滑动窗口内的最大值\n### 代码:\n```\nclass Solution {\npublic:\n vector maxSlidingWindow(vector& nums, int k) {\n deque q;\n int n = nums.size();\n vector res;\n for(int i = 0; i < n; i++) {\n if(q.size() && i - q.front() >= k)\n q.pop_front();\n while(q.size() && nums[q.back()] <= nums[i]) q.pop_back();\n q.push_back(i);\n if(i >= k - 1) {\n res.push_back(nums[q.front()]);\n }\n }\n return res;\n }\n};\n```\n### 复杂度:\n时间复杂度:O(n)","onTime":true},null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3201130868","body":"### 思路:\n基数排序\n### 代码:\n```\nclass Solution {\npublic:\n vector sortArray(vector& nums) {\n const int NUM = 50000;\n int arr[NUM*10+10];\n bzero(arr,sizeof(arr));\n for(int&num:nums){\n num+=NUM;\n arr[num]+=1;\n }\n int cur = 0;\n for(int i = 0;i<(NUM*10+10);++i){\n int tmp = arr[i];\n while(tmp--){\n nums[cur++] = i-NUM;\n }\n }\n return nums;\n }\n};\n```\n### 时间复杂度: O(N)","onTime":true},null,null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3234026083","body":"### 思路:\n1. 先统计t中每个字符出现的次数;\n2. 初始化左右指针,以及记录答案的变量;\n3. 右指针移动,更新计数。如果当前字符是t中的字符(即计数大于0),则减小cntT;\n4. 当cntT为0时,说明当前窗口包含了t的所有字符,然后尝试移动左指针缩小窗口;\n5. 在缩小窗口时,如果移除了t中的字符,则增加cntT,并更新答案;\n6. 最后根据是否找到答案返回相应的子串。\n### 代码:\n```\nclass Solution {\npublic:\n string minWindow(string s, string t) {\n vector cnt(128, 0);\n for (char c : t) {\n cnt[c]++;\n }\n \n int l = 0, r = 0, ansL = 0, ansR = 0, ans = INT_MAX, cntT = t.length();\n \n while (r < s.length()) {\n if (cnt[s[r]]-- > 0) {\n cntT--;\n }\n r++;\n \n while (cntT == 0) {\n if (r - l < ans) {\n ans = r - l;\n ansL = l;\n ansR = r;\n }\n if (cnt[s[l]]++ == 0) {\n cntT++;\n }\n l++;\n }\n }\n \n return ans == INT_MAX ? \"\" : s.substr(ansL, ansR - ansL);\n }\n};\n```\n### 时间复杂度:O(n)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245701951","body":"### 思路:\n1. 初始化标记数组 visited,避免重复访问;\n2. 遍历每个格子,使用DFS搜索整个岛屿。\n\n### 代码:\n```\nclass Solution {\nprivate:\n int count;\n int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向\n void dfs(vector>& grid, vector>& visited, int x, int y) {\n for (int i = 0; i < 4; i++) {\n int nextx = x + dir[i][0];\n int nexty = y + dir[i][1];\n if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过\n if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的\n\n visited[nextx][nexty] = true;\n count++;\n dfs(grid, visited, nextx, nexty);\n }\n }\n }\n\npublic:\n int maxAreaOfIsland(vector>& grid) {\n int n = grid.size(), m = grid[0].size();\n vector> visited = vector>(n, vector(m, false));\n\n int result = 0;\n for (int i = 0; i < n; i++) {\n for (int j = 0; j < m; j++) {\n if (!visited[i][j] && grid[i][j] == 1) {\n count = 1;\n visited[i][j] = true;\n dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true\n result = max(result, count);\n }\n }\n }\n return result;\n }\n};\n```\n### 时间复杂度: O(MN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249613575","body":"### 思路:\n使用多源广度优先搜索,先找到所有陆地放入队列,然后从陆地开始向外搜索,最后被触及的海洋就是离所有陆地最远的海洋。\n### 代码:\n```\nclass Solution {\npublic:\n int maxDistance(vector>& grid) {\n int n = grid.size();\n vector> directions = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};\n queue> q;\n \n for (int i = 0; i < n; i++) {\n for (int j = 0; j < n; j++) {\n if (grid[i][j] == 1) {\n q.push({i, j});\n }\n }\n }\n \n // 如果全是海洋或者全是陆地\n if (q.empty() || q.size() == n * n) return -1;\n \n int distance = -1;\n \n // 2. 多源 BFS\n while (!q.empty()) {\n int size = q.size();\n distance++;\n \n for (int s = 0; s < size; s++) {\n auto [x, y] = q.front();\n q.pop();\n \n for (auto [dx, dy] : directions) {\n int nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] == 0) {\n grid[nx][ny] = 1; // 标记为已访问(变为陆地)\n q.push({nx, ny});\n }\n }\n }\n }\n \n return distance;\n }\n};\n```\n### 时间复杂度: O(N²)","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3271218211","body":"### 代码:\n```\nclass Solution {\npublic:\n int longestCommonSubsequence(string text1, string text2) {\n int m = text2.length();\n vector f(m + 1);\n for (char x : text1) {\n for (int j = 0, pre = 0; j < m; j++) {\n int tmp = f[j + 1];\n f[j + 1] = x == text2[j] ? pre + 1 : max(f[j + 1], f[j]);\n pre = tmp;\n }\n }\n return f[m];\n }\n};\n```\n### 时间复杂度:O(nm)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289595360","body":"\n### 代码:\n```\nclass Solution {\npublic:\n int findTargetSumWays(vector& nums, int target) {\n int s = reduce(nums.begin(), nums.end()) - abs(target);\n if (s < 0 || s % 2) {\n return 0;\n }\n\n int m = s / 2; // 背包容量\n int n = nums.size();\n vector memo(n, vector(m + 1, -1)); // -1 表示没有计算过\n\n // lambda 递归函数\n auto dfs = [&](this auto&& dfs, int i, int c) -> int {\n if (i < 0) {\n return c == 0;\n }\n int& res = memo[i][c]; // 注意这里是引用\n if (res != -1) { // 之前计算过\n return res;\n }\n if (c < nums[i]) {\n return res = dfs(i - 1, c); // 只能不选\n }\n return res = dfs(i - 1, c) + dfs(i - 1, c - nums[i]); // 不选 + 选\n };\n\n return dfs(n - 1, m);\n }\n};\n```\n时间复杂度:O(nm)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316013499","body":"### 代码:\n```\nclass Solution {\npublic:\n ListNode* mergeKLists(vector& lists) {\n auto cmp = [](const ListNode* a, const ListNode* b) {\n return a->val > b->val; // 最小堆\n };\n priority_queue, decltype(cmp)> pq;\n for (auto head : lists) {\n if (head) {\n pq.push(head); // 把所有非空链表的头节点入堆\n }\n }\n\n ListNode dummy{}; // 哨兵节点,作为合并后链表头节点的前一个节点\n auto cur = &dummy;\n while (!pq.empty()) { // 循环直到堆为空\n auto node = pq.top(); // 剩余节点中的最小节点\n pq.pop();\n if (node->next) { // 下一个节点不为空\n pq.push(node->next); // 下一个节点有可能是最小节点,入堆\n }\n cur->next = node; // 把 node 添加到新链表的末尾\n cur = cur->next; // 准备合并下一个节点\n }\n return dummy.next; // 哨兵节点的下一个节点就是新链表的头节点\n }\n};\n```\n### 时间复杂度:\nO(Llogm),其中 m 为 lists 的长度,L 为所有链表的长度之和。","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuyuanzhang118":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074090351","body":"## 算法思路分析\n\n这是一个将数组形式的整数与普通整数相加的算法,采用了模拟手工加法的思路:\n\n### 核心思路\n1. **从右到左逐位相加**:模拟手工加法,从最低位开始处理\n2. **处理进位**:当两位数字相加结果 ≥ 10 时,产生进位\n3. **处理不同长度**:通过 `num[len-1] || 0` 处理数组已遍历完的情况\n4. **逆序构建结果**:由于是从低位到高位计算,最后需要反转数组\n\n```JavaScript\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(num, k) {\n let res = []\n let len = num.length\n let carry = 0\n while(len > 0 || k > 0) {\n let a = num[len - 1] || 0\n let b = k % 10\n let sum = a + b + carry\n res.push(sum % 10)\n carry = sum >= 10 ? 1 : 0\n len--\n k = Math.floor(k / 10)\n }\n if (carry) {\n res.push(1)\n }\n return res.reverse()\n};\n```\n\n### 时间复杂度\n**O(max(N, log K))**\n- N 是数组 `num` 的长度\n- log K 是整数 k 的位数\n- 循环次数取决于较长的那个数\n\n### 空间复杂度\n**O(max(N, log K))**\n- 结果数组 `res` 的长度最多为 max(N, log K) + 1\n- 其他变量占用常数空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3079209775","body":"## 算法思路分析\n核心思想:双向遍历\n\n这个算法使用了一种巧妙的双向遍历方法来解决问题:\n\n1. 第一次遍历(从左到右) :\n \n - 记录每个位置到其左边最近字符c的距离\n - 使用变量 prev 记录上一个字符c的位置\n - 对于每个位置i,距离为 i - prev\n2. 第二次遍历(从右到左) :\n \n - 计算每个位置到其右边最近字符c的距离\n - 与第一次遍历的结果取最小值,得到最终答案\n - 对于每个位置i,距离为 prev - i\n\n## 代码\n```Javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const n = s.length;\n const answer = new Array(n).fill(Infinity);\n \n // 第一次遍历:从左到右,记录每个位置到左边最近字符c的距离\n let prev = -Infinity;\n for (let i = 0; i < n; i++) {\n if (s[i] === c) {\n prev = i;\n }\n answer[i] = i - prev;\n }\n \n // 第二次遍历:从右到左,更新每个位置到右边最近字符c的距离\n prev = Infinity;\n for (let i = n - 1; i >= 0; i--) {\n if (s[i] === c) {\n prev = i;\n }\n answer[i] = Math.min(answer[i], prev - i);\n }\n \n return answer;\n};\n```\n\n## 复杂度分析\n\n时间复杂度:O(n)\n- 需要遍历字符串两次,每次遍历都是O(n)\n- 总时间复杂度为O(n) + O(n) = O(n)\n- 这是最优的时间复杂度,因为至少需要访问每个字符一次\n\n空间复杂度:O(n)\n- 需要创建一个长度为n的结果数组 answer\n- 除了结果数组外,只使用了常数个额外变量( prev , i , n )\n- 如果不计算返回值所需的空间,额外空间复杂度为O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084609047","body":"### 算法设计思路\n\n**核心数据结构:**\n- 使用数组 `stack` 作为底层存储结构\n- 使用 `maxSize` 记录栈的最大容量\n- 数组索引 0 为栈底,数组末尾为栈顶\n\n### 代码\n\n```JavaScript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.maxSize = maxSize;\n this.stack = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.stack.length < this.maxSize) {\n this.stack.push(x);\n }\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.stack.length === 0) {\n return -1;\n }\n return this.stack.pop();\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n // 对栈底的k个元素进行增量操作\n // 如果栈中元素总数小于k,则对所有元素进行增量操作\n const elementsToIncrement = Math.min(k, this.stack.length);\n for (let i = 0; i < elementsToIncrement; i++) {\n this.stack[i] += val;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n### 时间复杂度分析\n\n| 方法 | 时间复杂度 | 分析 |\n|------|------------|------|\n| **构造函数** | O(1) | 仅初始化两个变量 |\n| **push(x)** | O(1) | 数组末尾添加元素,均摊时间复杂度为 O(1) |\n| **pop()** | O(1) | 数组末尾删除元素 |\n| **increment(k, val)** | O(min(k, n)) | 需要遍历栈底的 k 个元素,n 为当前栈大小 |\n\n### 空间复杂度分析\n\n| 方面 | 空间复杂度 | 分析 |\n|------|------------|------|\n| **整体空间** | O(maxSize) | 最坏情况下数组存储 maxSize 个元素 |\n| **辅助空间** | O(1) | 除了存储栈元素外,只使用常数额外空间 |\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3092430277","body":"### 算法思路分析\n\n**核心思想:使用栈处理嵌套结构**\n\n这是一个典型的括号匹配问题,需要处理嵌套的编码结构。算法的关键在于:\n1. **识别模式** - `k[encoded_string]` 表示重复 k 次\n2. **处理嵌套** - 可能存在多层嵌套,如 `3[a2[c]]`\n3. **状态管理** - 需要记录当前的数字、字符串和历史状态\n\n**算法步骤:**\n1. 遍历字符串的每个字符\n2. 遇到数字:累积构建重复次数(支持多位数)\n3. 遇到 `[`:将当前状态(字符串和数字)压入栈,重置当前状态\n4. 遇到 `]`:从栈中弹出之前的状态,重复当前字符串并拼接\n5. 遇到字母:直接添加到当前字符串\n\n### 代码实现\n\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let currentNum = 0;\n let currentStr = '';\n \n for (let i = 0; i < s.length; i++) {\n const char = s[i];\n \n if (char >= '0' && char <= '9') {\n // 构建数字(可能是多位数)\n currentNum = currentNum * 10 + parseInt(char);\n } else if (char === '[') {\n // 遇到左括号,将当前状态入栈\n stack.push([currentStr, currentNum]);\n currentStr = '';\n currentNum = 0;\n } else if (char === ']') {\n // 遇到右括号,出栈并重复字符串\n const [prevStr, num] = stack.pop();\n currentStr = prevStr + currentStr.repeat(num);\n } else {\n // 普通字符,直接添加到当前字符串\n currentStr += char;\n }\n }\n \n return currentStr;\n};\n```\n\n### 复杂度分析\n\n**时间复杂度:O(n + m)**\n- n:输入字符串长度\n- m:输出字符串长度\n- 每个字符最多被处理一次\n- 字符串重复操作的总时间与最终输出长度成正比\n\n**空间复杂度:O(n + m)**\n- **栈空间**:O(d) - d 为最大嵌套深度,最坏情况 O(n)\n- **字符串存储**:O(m) - 存储中间结果和最终结果\n- **总空间**:O(n + m)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092434643","body":"## 核心算法思路\n\n使用两个栈实现队列:\n- `inStack`: 用于接收新元素的输入\n- `outStack`: 用于输出元素\n\n当需要 pop 或 peek 时,如果 outStack 为空,就将 inStack 中的所有元素转移到 outStack 中,这样就实现了先入先出的特性。\n\n## 代码实现\n\n```javascript\n\nvar MyQueue = function() {\n this.inStack = []; // 用于输入的栈\n this.outStack = []; // 用于输出的栈\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.inStack.push(x);\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n if (this.outStack.length === 0) {\n // 将inStack中的所有元素转移到outStack\n while (this.inStack.length > 0) {\n this.outStack.push(this.inStack.pop());\n }\n }\n return this.outStack.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if (this.outStack.length === 0) {\n // 将inStack中的所有元素转移到outStack\n while (this.inStack.length > 0) {\n this.outStack.push(this.inStack.pop());\n }\n }\n return this.outStack[this.outStack.length - 1];\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return this.inStack.length === 0 && this.outStack.length === 0;\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```\n\n## 复杂度分析\n\n**时间复杂度**:\n- push: O(1)\n- pop: 均摊 O(1)\n- peek: 均摊 O(1) \n- empty: O(1)\n\n**空间复杂度**: O(n)\n\n**均摊 O(1) 的原理**:虽然单次 pop 或 peek 操作在最坏情况下可能需要 O(n) 时间,但每个元素最多只会被转移一次,所以 n 个操作的总时间复杂度为 O(n),均摊下来每个操作为 O(1)。\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094581867","body":"## 算法思路\n- 关键观察:如果前缀[0...i]的最大值 ≤ 后缀[i+1...n-1]的最小值,则可以在位置i处分块\n- 这保证了前面块的所有元素都不大于后面块的任何元素,分别排序后连接仍然有序\n\n## 代码\n```javascript\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const n = arr.length;\n if (n <= 1) return n;\n \n // 计算前缀最大值数组\n const prefixMax = new Array(n);\n prefixMax[0] = arr[0];\n for (let i = 1; i < n; i++) {\n prefixMax[i] = Math.max(prefixMax[i-1], arr[i]);\n }\n \n // 计算后缀最小值数组\n const suffixMin = new Array(n);\n suffixMin[n-1] = arr[n-1];\n for (let i = n-2; i >= 0; i--) {\n suffixMin[i] = Math.min(suffixMin[i+1], arr[i]);\n }\n \n let chunks = 1; // 至少有一个分块\n \n // 检查每个可能的分块点\n for (let i = 0; i < n-1; i++) {\n // 如果前缀最大值 <= 后缀最小值,可以在i处分块\n if (prefixMax[i] <= suffixMin[i+1]) {\n chunks++;\n }\n }\n \n return chunks;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 需要三次遍历数组\n- 空间复杂度:O(n) - 需要两个额外数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097244383","body":"## 核心思路 :\n- 计算链表长度并找到尾节点\n- 优化k值避免重复旋转\n- 找到新的尾节点(第length-k个节点)\n- 重新连接:断开新尾节点与新头节点,原尾节点连接原头节点\n\n## 代码:\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n // 边界情况处理\n if (!head || !head.next || k === 0) {\n return head;\n }\n \n // 1. 计算链表长度并找到尾节点\n let length = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n length++;\n }\n \n // 2. 优化k值,避免不必要的旋转\n k = k % length;\n if (k === 0) {\n return head;\n }\n \n // 3. 找到新的尾节点(从头开始第length-k个节点)\n let newTail = head;\n for (let i = 0; i < length - k - 1; i++) {\n newTail = newTail.next;\n }\n \n // 4. 新的头节点是新尾节点的下一个节点\n let newHead = newTail.next;\n \n // 5. 断开连接并重新连接\n newTail.next = null; // 断开新尾节点与新头节点的连接\n tail.next = head; // 原尾节点连接到原头节点\n \n return newHead;\n};\n```\n\n## 复杂度分析 :\n- 时间复杂度 :O(n) - 需要遍历链表计算长度和找到切分点\n- 空间复杂度 :O(1) - 只使用常数个额外变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103625610","body":"## 算法思路\n- 虚拟头节点技巧: 简化边界条件处理\n- 三指针法: prev, first, second 精确控制交换过程\n- 原地交换: 只修改指针,不创建新节点\n- 边界处理: 空链表和单节点的特殊情况\n\n## 代码实现\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n // 边界情况:空链表或只有一个节点\n if (!head || !head.next) {\n return head;\n }\n \n // 创建虚拟头节点,简化操作\n let dummy = new ListNode(0);\n dummy.next = head;\n let prev = dummy;\n \n // 当存在至少两个节点时进行交换\n while (prev.next && prev.next.next) {\n // 定义要交换的两个节点\n let first = prev.next;\n let second = prev.next.next;\n \n // 执行交换操作\n // 步骤:prev -> first -> second -> ... \n // 变为:prev -> second -> first -> ...\n prev.next = second;\n first.next = second.next;\n second.next = first;\n \n // 移动prev指针到已交换的第二个节点(现在是first)\n prev = first;\n }\n \n return dummy.next;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) \n- 空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109219828","body":"## 算法思路\n- 算法的核心思想是利用有序链表的特性:\n- 选择中间节点作为根节点,保证树的平衡性\n- 递归地将左半部分构建为左子树,右半部分构建为右子树\n- 最优解使用中序遍历的特性,避免重复遍历链表\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n // 计算链表长度\n function getLength(head) {\n let length = 0;\n while (head) {\n length++;\n head = head.next;\n }\n return length;\n }\n \n const length = getLength(head);\n let current = head;\n \n // 中序遍历构建BST\n function buildBST(start, end) {\n if (start > end) return null;\n \n const mid = Math.floor((start + end) / 2);\n \n // 先构建左子树\n const left = buildBST(start, mid - 1);\n \n // 创建根节点(当前链表节点)\n const root = new TreeNode(current.val);\n current = current.next;\n \n // 再构建右子树\n const right = buildBST(mid + 1, end);\n \n root.left = left;\n root.right = right;\n \n return root;\n }\n \n return buildBST(0, length - 1);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 每个节点只访问一次\n- 空间复杂度:O(log n) - 仅递归栈深度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3117083288","body":"## 算法思路\n双指针法 :让两个指针分别从两个链表头部开始遍历,当指针到达链表末尾时跳转到另一个链表的头部。这样可以消除两个链表的长度差异,如果有交点,两个指针会在交点相遇;如果没有交点,两个指针最终都会变成 null。\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function(headA, headB) {\n // 如果任一链表为空,直接返回null\n if (!headA || !headB) {\n return null;\n }\n \n // 双指针法:让两个指针分别遍历两个链表\n // 当指针到达链表末尾时,跳转到另一个链表的头部\n // 这样可以消除长度差,如果有交点,两指针会在交点相遇\n let pA = headA;\n let pB = headB;\n \n // 当两个指针不相等时继续遍历\n while (pA !== pB) {\n // 如果pA到达末尾,跳转到headB;否则继续下一个节点\n pA = pA === null ? headB : pA.next;\n // 如果pB到达末尾,跳转到headA;否则继续下一个节点\n pB = pB === null ? headA : pB.next;\n }\n \n // 返回交点(如果没有交点,两指针都会变成null)\n return pA;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(m + n),其中 m 和 n 分别是两个链表的长度。每个指针最多遍历两个链表一次。\n- 空间复杂度 :O(1),只使用了两个指针变量,没有使用额外的数据结构。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3117100989","body":"## 算法思路\n- 第一阶段 :使用快慢指针检测是否有环\n- 慢指针每次移动1步,快指针每次移动2步\n- 如果有环,快慢指针必定会相遇\n- 第二阶段 :找到环的起始节点\n- 基于数学原理:从头节点到环入口的距离等于从相遇点到环入口的距离\n- 将一个指针重置到头节点,两指针同速移动直到相遇\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n // 边界情况:空链表或只有一个节点且无环\n if (!head || !head.next) {\n return null;\n }\n \n // 第一阶段:使用快慢指针检测是否有环\n let slow = head;\n let fast = head;\n \n // 快指针每次走两步,慢指针每次走一步\n while (fast && fast.next) {\n slow = slow.next;\n fast = fast.next.next;\n \n // 如果快慢指针相遇,说明存在环\n if (slow === fast) {\n break;\n }\n }\n \n // 如果没有环,返回null\n if (!fast || !fast.next) {\n return null;\n }\n \n // 第二阶段:找到环的起始节点\n // 将一个指针重置到头节点,两个指针同时以相同速度移动\n // 它们相遇的地方就是环的起始节点\n slow = head;\n while (slow !== fast) {\n slow = slow.next;\n fast = fast.next;\n }\n \n return slow; // 返回环的起始节点\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 最多遍历链表两次\n- 空间复杂度 :O(1) - 只使用常数个额外变量,满足进阶要求","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3124469572","body":"## 算法思路\n这个LRU(Least Recently Used)缓存实现采用了 哈希表 + 双向链表 的经典设计模式:\n数据结构组合 :\n - Map :用于O(1)时间复杂度的键值查找\n - 双向链表:用于维护访问顺序,支持O(1)的插入和删除操作\n - 虚拟头尾节点:简化边界条件处理\n\n## 代码\n```javascript\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.cache = new Map(); // 使用Map存储键值对\n this.head = {}; // 虚拟头节点\n this.tail = {}; // 虚拟尾节点\n this.head.next = this.tail;\n this.tail.prev = this.head;\n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n if (!this.cache.has(key)) {\n return -1;\n }\n \n // 存在则将节点移到链表头部(表示最近使用)\n const node = this.cache.get(key);\n this.removeFromList(node);\n this.addToHead(node);\n \n return node.value;\n};\n\n/** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\nLRUCache.prototype.put = function(key, value) {\n // 如果已存在,先删除旧节点\n if (this.cache.has(key)) {\n const oldNode = this.cache.get(key);\n this.removeFromList(oldNode);\n this.cache.delete(key);\n }\n \n // 创建新节点并添加到头部\n const newNode = { key, value, prev: null, next: null };\n this.cache.set(key, newNode);\n this.addToHead(newNode);\n \n // 如果超出容量,删除尾部节点(最久未使用)\n if (this.cache.size > this.capacity) {\n const tailNode = this.tail.prev;\n this.removeFromList(tailNode);\n this.cache.delete(tailNode.key);\n }\n};\n\n// 辅助方法:将节点添加到链表头部\nLRUCache.prototype.addToHead = function(node) {\n node.next = this.head.next;\n node.prev = this.head;\n this.head.next.prev = node;\n this.head.next = node;\n};\n\n// 辅助方法:从链表中删除节点\nLRUCache.prototype.removeFromList = function(node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n};\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```\n\n## 复杂度分析\n- 时间复杂度:O(1)\n- 空间复杂度:O(capacity)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124496973","body":"## 算法思路\n使用广度优先搜索(BFS)的方法来计算二叉树的最大深度:\n- 初始化 :如果根节点为空,直接返回0\n- 队列存储 :使用队列存储节点和对应的深度信息,初始将根节点和深度1入队\n- 层序遍历 :通过队列进行层序遍历,每次取出队首元素\n- 深度更新 :更新最大深度值,并将当前节点的左右子节点(如果存在)连同深度+1一起入队\n- 返回结果 :遍历完成后返回记录的最大深度\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if (!root) return 0;\n let queue = [[root, 1]];\n let maxDepth = 0;\n\n while (queue.length > 0) {\n let [node, depth] = queue.shift();\n if (node) {\n maxDepth = Math.max(maxDepth, depth);\n if (node.left) queue.push([node.left, depth + 1]);\n if (node.right) queue.push([node.right, depth + 1]);\n }\n }\n\n return maxDepth;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 O(n) ,其中n是二叉树中节点的总数\n- 空间复杂度 O(w) ,其中w是二叉树的最大宽度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3126191127","body":"## 算法思路\n使用递归的深度优先搜索(DFS)方法:\n- 基本情况 :如果两个节点都为空,返回 true\n- 边界情况 :如果只有一个节点为空,返回 false\n- 值比较 :如果两个节点的值不相等,返回 false\n- 递归检查 :同时检查左子树和右子树是否相同\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} p\n * @param {TreeNode} q\n * @return {boolean}\n */\nvar isSameTree = function(p, q) {\n if (p === null && q === null) {\n return true;\n }\n if (p === null || q === null || p.val !== q.val) {\n return false;\n }\n return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(min(m, n)),其中 m 和 n 分别是两棵树的节点数。在最坏情况下需要遍历较小树的所有节点。\n- 空间复杂度 :O(min(m, n)),递归调用栈的深度取决于树的高度。在完全平衡的树中为 O(log(min(m, n))),在完全不平衡的树中为 O(min(m, n))。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3133136375","body":"## 算法思路\n这是一个典型的二叉树深度优先搜索(DFS)问题。核心思想是:\n- 从根节点开始,沿着每条路径向下遍历\n- 在遍历过程中,将当前路径形成的数字逐步构建(当前数字 = 之前数字 × 10 + 当前节点值)\n- 当到达叶节点时,将该路径形成的完整数字加入总和\n- 递归处理左右子树,最终返回所有路径数字的总和\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root) {\n // 深度优先搜索函数\n function dfs(node, currentSum) {\n // 如果节点为空,返回0\n if (!node) {\n return 0;\n }\n \n // 计算当前路径的数字:之前的数字*10 + 当前节点值\n currentSum = currentSum * 10 + node.val;\n \n // 如果是叶节点(没有左右子树),返回当前路径形成的数字\n if (!node.left && !node.right) {\n return currentSum;\n }\n \n // 递归计算左右子树的路径数字之和\n return dfs(node.left, currentSum) + dfs(node.right, currentSum);\n }\n \n return dfs(root, 0);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) ,其中 n 是二叉树中节点的数量,需要访问每个节点一次\n- 空间复杂度:O(h) ,其中 h 是二叉树的高度,递归调用栈的深度等于树的高度\n - 最坏情况(完全不平衡的树):O(n)\n - 最好情况(完全平衡的树):O(log n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136794752","body":"## 算法思路\n广度优先搜索(BFS)\n- 使用层序遍历,从右到左遍历每一层\n- 通过队列实现,先添加右子节点再添加左子节点\n- 最后访问到的节点就是最底层最左边的节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n // 使用层序遍历(BFS)从右到左遍历每一层\n // 最后访问到的节点就是最底层最左边的节点\n let queue = [root];\n let result = root.val;\n \n while (queue.length > 0) {\n let levelSize = queue.length;\n \n // 遍历当前层的所有节点\n for (let i = 0; i < levelSize; i++) {\n let node = queue.shift();\n result = node.val; // 更新结果为当前节点值\n \n // 先添加右子节点,再添加左子节点\n // 这样在同一层中,左边的节点会后被访问到\n if (node.right) {\n queue.push(node.right);\n }\n if (node.left) {\n queue.push(node.left);\n }\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),需要遍历所有节点\n- 空间复杂度:O(w),w为树的最大宽度(队列空间)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3140223821","body":"## 算法思路\n序列化过程 :\n- 采用前序遍历(根-左-右)的方式遍历二叉树\n- 空节点用 'null' 字符串表示\n- 所有节点值用逗号连接成字符串\n- 前序遍历的优势是根节点总在最前面,便于重构\n\n反序列化过程 :\n- 将字符串按逗号分割成数组\n- 使用递归按前序遍历顺序重构二叉树\n- 维护索引指针依次处理数组元素\n- 遇到 'null' 返回空节点,否则创建新节点并递归构建左右子树\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n const result = [];\n \n function preorder(node) {\n if (node === null) {\n result.push('null');\n return;\n }\n \n result.push(node.val.toString());\n preorder(node.left);\n preorder(node.right);\n }\n \n preorder(root);\n return result.join(',');\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n if (!data || data === 'null') {\n return null;\n }\n \n const values = data.split(',');\n let index = 0;\n \n function buildTree() {\n if (index >= values.length || values[index] === 'null') {\n index++;\n return null;\n }\n \n const node = new TreeNode(parseInt(values[index]));\n index++;\n \n node.left = buildTree();\n node.right = buildTree();\n \n return node;\n }\n \n return buildTree();\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```\n\n## 复杂度分析\n时间复杂度 :\n- 序列化:O(n) - 需要访问每个节点一次\n- 反序列化:O(n) - 需要处理每个序列化值一次\n\n空间复杂度 :\n- 序列化:O(n) - 递归栈深度最坏情况为O(n),结果数组大小为O(n)\n- 反序列化:O(n) - 递归栈深度最坏情况为O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3148418818","body":"## 算法思路\n- DFS遍历 :使用深度优先搜索遍历二叉树,记录每个节点的坐标(row, col)和值\n- 坐标规则 :根据题目要求,左子节点坐标为(row+1, col-1),右子节点坐标为(row+1, col+1)\n- 分组排序 :将节点按列索引分组,对每列内的节点先按行排序,同行按值排序\n- 结果输出 :按列索引从小到大的顺序返回垂序遍历结果\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n if (!root) return [];\n \n // 存储节点信息:[row, col, val]\n const nodes = [];\n \n // DFS遍历,记录每个节点的坐标和值\n function dfs(node, row, col) {\n if (!node) return;\n \n nodes.push([row, col, node.val]);\n \n // 左子节点:row+1, col-1\n dfs(node.left, row + 1, col - 1);\n // 右子节点:row+1, col+1\n dfs(node.right, row + 1, col + 1);\n }\n \n // 从根节点开始遍历,根节点坐标为(0, 0)\n dfs(root, 0, 0);\n \n // 按列索引分组\n const columnMap = new Map();\n for (const [row, col, val] of nodes) {\n if (!columnMap.has(col)) {\n columnMap.set(col, []);\n }\n columnMap.get(col).push([row, val]);\n }\n \n // 获取所有列索引并排序\n const columns = Array.from(columnMap.keys()).sort((a, b) => a - b);\n \n const result = [];\n for (const col of columns) {\n const columnNodes = columnMap.get(col);\n // 对每列内的节点排序:先按行排序,同行按值排序\n columnNodes.sort((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按行排序\n }\n return a[1] - b[1]; // 同行按值排序\n });\n \n // 提取值\n result.push(columnNodes.map(node => node[1]));\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n log n),其中n是节点数,主要消耗在排序操作\n- 空间复杂度 :O(n),用于存储节点信息和分组数据","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3148426517","body":"## 算法思路\n- 使用哈希表存储已遍历的数值和索引\n- 对每个数值计算其配对数值,在哈希表中O(1)时间查找\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n // 创建哈希表,key为数值,value为索引\n const map = new Map();\n \n for (let i = 0; i < nums.length; i++) {\n // 计算当前数值需要配对的数值\n const complement = target - nums[i];\n \n // 在哈希表中查找配对数值\n if (map.has(complement)) {\n // 找到配对,返回两个索引\n return [map.get(complement), i];\n }\n \n // 将当前数值和索引存入哈希表\n map.set(nums[i], i);\n }\n \n return []; // 题目保证有解,这里不会执行到\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148432520","body":"## 算法思路\n采用桶排序的思想来实现:\n- 频率统计 :使用哈希表统计每个元素的出现频率\n- 桶排序 :创建频率桶,桶的索引表示频率,桶中存储具有该频率的元素\n- 结果收集 :从最高频率的桶开始遍历,收集前k个元素\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function(nums, k) {\n // 步骤1: 统计频率\n const freqMap = new Map();\n for (const num of nums) {\n freqMap.set(num, (freqMap.get(num) || 0) + 1);\n }\n \n // 步骤2: 创建频率桶\n // 桶的索引表示频率,桶中存储具有该频率的元素\n const buckets = new Array(nums.length + 1).fill(null).map(() => []);\n \n for (const [num, freq] of freqMap) {\n buckets[freq].push(num);\n }\n \n // 步骤3: 从高频率到低频率收集前k个元素\n const result = [];\n for (let i = buckets.length - 1; i >= 0 && result.length < k; i--) {\n if (buckets[i].length > 0) {\n result.push(...buckets[i]);\n }\n }\n \n // 返回前k个元素\n return result.slice(0, k);\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 满足题目要求的优于O(n log n)\n- 统计频率:O(n)\n- 创建桶并填充:O(n)\n- 收集结果:O(n)\n\n- 空间复杂度 :O(n)\n- 哈希表:O(n)\n- 桶数组:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3153115326","body":"## 算法思路\n- 核心思想 :枚举每个点作为回旋镖的中心点i\n- 距离计算 :计算中心点到所有其他点的欧式距离(使用距离平方避免开方运算)\n- 哈希统计 :使用Map统计相同距离的点的数量\n- 组合计算 :如果有n个点到中心点距离相同,可形成n×(n-1)个回旋镖\n- 顺序考虑 :回旋镖(i,j,k)和(i,k,j)是不同的,需要考虑j和k的顺序\n\n## 代码\n```javascript\n/**\n * @param {number[][]} points\n * @return {number}\n */\nvar numberOfBoomerangs = function(points) {\n let count = 0;\n \n // 遍历每个点作为回旋镖的中心点i\n for (let i = 0; i < points.length; i++) {\n // 使用Map记录从点i到其他点的距离及对应的点的数量\n const distanceMap = new Map();\n \n // 计算点i到其他所有点的距离\n for (let j = 0; j < points.length; j++) {\n if (i !== j) {\n // 计算欧式距离的平方(避免开方运算,提高效率)\n const distance = getDistanceSquared(points[i], points[j]);\n \n // 记录该距离对应的点的数量\n distanceMap.set(distance, (distanceMap.get(distance) || 0) + 1);\n }\n }\n \n // 对于每个距离,如果有n个点,则可以形成n*(n-1)个回旋镖\n // 因为回旋镖(i,j,k)中j和k的顺序是有意义的\n for (const [distance, pointCount] of distanceMap) {\n if (pointCount >= 2) {\n count += pointCount * (pointCount - 1);\n }\n }\n }\n \n return count;\n};\n\n/**\n * 计算两点间欧式距离的平方\n * @param {number[]} point1 \n * @param {number[]} point2 \n * @return {number}\n */\nfunction getDistanceSquared(point1, point2) {\n const dx = point1[0] - point2[0];\n const dy = point1[1] - point2[1];\n return dx * dx + dy * dy;\n}\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n²) - 外层循环n次,内层循环n-1次\n- 空间复杂度 :O(n) - 最坏情况下Map存储n-1个不同距离","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153126755","body":"## 算法思路\n- 滑动窗口技术 :使用双指针 left 和 right 构成滑动窗口\n- 哈希表优化 :记录每个字符最后出现的位置\n- 动态调整 :遇到重复字符时,将左指针移动到重复字符的下一个位置\n- 实时更新 :持续更新最大长度\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n if (s.length === 0) return 0;\n \n let left = 0; // 滑动窗口左指针\n let maxLength = 0; // 记录最大长度\n let charMap = new Map(); // 哈希表:字符 -> 最后出现的索引\n \n for (let right = 0; right < s.length; right++) {\n const char = s[right];\n \n // 如果字符已存在且在当前窗口内,移动左指针\n if (charMap.has(char) && charMap.get(char) >= left) {\n left = charMap.get(char) + 1;\n }\n \n // 更新字符的最新位置\n charMap.set(char, right);\n \n // 更新最大长度\n maxLength = Math.max(maxLength, right - left + 1);\n }\n \n return maxLength;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 每个字符最多被访问两次\n- 空间复杂度 :O(min(m,n)) - m是字符集大小,n是字符串长度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3158322222","body":"## 算法思路\n- 滑动窗口 + 哈希表 :避免生成所有排列组合,直接在原字符串上滑动匹配\n- 分层遍历 :由于words中所有单词长度相同,按单词长度为步长进行遍历\n- 频次匹配 :使用哈希表记录words中单词频次,滑动窗口中维护当前单词频次\n- 智能重置 :遇到不在words中的单词时,直接重置窗口位置\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n if (!s || !words || words.length === 0) return [];\n \n const wordLen = words[0].length;\n const totalLen = wordLen * words.length;\n const result = [];\n \n // 创建words的频次映射\n const wordCount = new Map();\n for (const word of words) {\n wordCount.set(word, (wordCount.get(word) || 0) + 1);\n }\n \n // 对于每个可能的起始位置(0到wordLen-1),使用滑动窗口\n for (let i = 0; i < wordLen; i++) {\n let left = i;\n let right = i;\n let validWords = 0;\n const windowCount = new Map();\n \n while (right + wordLen <= s.length) {\n // 扩展右边界,添加新单词\n const rightWord = s.substring(right, right + wordLen);\n right += wordLen;\n \n if (wordCount.has(rightWord)) {\n windowCount.set(rightWord, (windowCount.get(rightWord) || 0) + 1);\n if (windowCount.get(rightWord) <= wordCount.get(rightWord)) {\n validWords++;\n }\n \n // 如果窗口大小超过目标长度,收缩左边界\n while (right - left > totalLen) {\n const leftWord = s.substring(left, left + wordLen);\n left += wordLen;\n \n if (wordCount.has(leftWord)) {\n if (windowCount.get(leftWord) <= wordCount.get(leftWord)) {\n validWords--;\n }\n windowCount.set(leftWord, windowCount.get(leftWord) - 1);\n }\n }\n \n // 检查是否找到有效的串联子串\n if (validWords === words.length && right - left === totalLen) {\n result.push(left);\n }\n } else {\n // 遇到不在words中的单词,重置窗口\n windowCount.clear();\n validWords = 0;\n left = right;\n }\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n × m),其中n是字符串s的长度,m是单词长度\n- 外层循环m次(每个可能的起始偏移)\n- 内层每个字符最多被访问2次(加入和移出窗口)\n\n- 空间复杂度 :O(k),其中k是words数组的长度\n- 主要用于存储单词频次的哈希表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162949952","body":"## 算法思路\n- 数学原理 :如果数组总和 sum % p = remainder ,需要找到一个子数组,其和也等于 remainder ,移除后剩余部分就能被p整除\n- 技术方案 :使用前缀和 + 哈希表来高效查找目标子数组\n- 关键公式 : prefixSum[i] % p = (prefixSum[j] % p - remainder + p) % p\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar minSubarray = function(nums, p) {\n // 计算数组总和\n const totalSum = nums.reduce((sum, num) => sum + num, 0);\n \n // 如果总和已经能被p整除,不需要移除任何元素\n const remainder = totalSum % p;\n if (remainder === 0) {\n return 0;\n }\n \n // 使用哈希表记录前缀和的余数及其对应的索引\n const prefixMap = new Map();\n prefixMap.set(0, -1); // 初始化,前缀和为0时索引为-1\n \n let prefixSum = 0;\n let minLength = nums.length; // 初始化为数组长度(最坏情况)\n \n for (let i = 0; i < nums.length; i++) {\n prefixSum += nums[i];\n const currentRemainder = prefixSum % p;\n \n // 我们需要找到一个前缀和,使得当前前缀和减去它等于remainder\n // 即:currentRemainder - targetRemainder = remainder (mod p)\n // 所以:targetRemainder = (currentRemainder - remainder + p) % p\n const targetRemainder = (currentRemainder - remainder + p) % p;\n \n if (prefixMap.has(targetRemainder)) {\n const prevIndex = prefixMap.get(targetRemainder);\n const subarrayLength = i - prevIndex;\n minLength = Math.min(minLength, subarrayLength);\n }\n \n // 更新当前前缀和余数的索引\n prefixMap.set(currentRemainder, i);\n }\n \n // 如果最小长度等于数组长度,说明无法找到合适的子数组\n return minLength === nums.length ? -1 : minLength;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 只需要遍历数组一次,哈希表操作为O(1)\n- 空间复杂度 :O(min(n, p)) - 哈希表最多存储min(n, p)个不同的余数","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166733694","body":"## 算法思路\n使用 快慢指针 (Floyd's Tortoise and Hare Algorithm)技术:\n- 设置两个指针:慢指针每次移动一步,快指针每次移动两步\n- 当快指针到达链表末尾时,慢指针恰好位于链表的中间位置\n- 对于偶数长度的链表,返回第二个中间节点\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n // 使用快慢指针法(Floyd's Tortoise and Hare Algorithm)\n // 慢指针每次移动一步,快指针每次移动两步\n // 当快指针到达链表末尾时,慢指针正好在中间位置\n \n let slow = head; // 慢指针\n let fast = head; // 快指针\n \n // 当快指针和快指针的下一个节点都不为空时继续循环\n while (fast !== null && fast.next !== null) {\n slow = slow.next; // 慢指针移动一步\n fast = fast.next.next; // 快指针移动两步\n }\n \n // 当循环结束时,slow指针指向中间节点\n // 如果链表长度为奇数,slow指向唯一的中间节点\n // 如果链表长度为偶数,slow指向第二个中间节点\n return slow;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 需要遍历链表一次,其中n是链表的长度\n- 空间复杂度:O(1) - 只使用了两个额外的指针变量,不随输入规模增长","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3172634872","body":"## 算法思路\n- 双指针技术 :使用 slow 指针指向当前不重复元素的位置, fast 指针遍历数组\n- 原地修改 :当发现不重复元素时,将其复制到 slow+1 位置\n- 利用排序特性 :由于数组已排序,相同元素必然相邻,只需比较相邻元素\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n // 边界情况:空数组或只有一个元素\n if (nums.length <= 1) {\n return nums.length;\n }\n \n // slow指针指向当前不重复元素的位置\n let slow = 0;\n \n // fast指针遍历数组,从第二个元素开始\n for (let fast = 1; fast < nums.length; fast++) {\n // 如果当前元素与前一个不重复元素不同\n if (nums[fast] !== nums[slow]) {\n // 将slow指针向前移动一位\n slow++;\n // 将当前不重复元素复制到slow位置\n nums[slow] = nums[fast];\n }\n // 如果相同,fast继续向前,slow保持不变\n }\n \n // 返回不重复元素的个数(slow指向最后一个不重复元素的索引)\n return slow + 1;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 只需遍历数组一次\n- 空间复杂度 :O(1) - 只使用常数额外空间,符合原地修改要求","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172638327","body":"## 算法思路\n- 二分查找核心思想 :通过比较中间元素与目标值,每次排除一半搜索空间\n- 查找逻辑 :如果找到目标值返回索引,否则返回应插入的位置\n- 关键实现 :循环结束时left指针就是插入位置\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let left = 0;\n let right = nums.length - 1;\n \n // 二分查找\n while (left <= right) {\n // 计算中间位置,避免整数溢出\n let mid = Math.floor(left + (right - left) / 2);\n \n if (nums[mid] === target) {\n // 找到目标值,返回索引\n return mid;\n } else if (nums[mid] < target) {\n // 目标值在右半部分\n left = mid + 1;\n } else {\n // 目标值在左半部分\n right = mid - 1;\n }\n }\n \n // 没找到目标值,left就是应该插入的位置\n return left;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(log n) - 满足题目要求,每次迭代将搜索范围缩小一半\n- 空间复杂度 :O(1) - 只使用常数级别的额外变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3174034461","body":"## 算法思路\n使用双端队列维护一个单调递减的队列,队列中存储数组元素的索引:\n\n- 队首始终是当前窗口的最大值索引\n- 移除超出窗口范围的元素\n- 维护单调性:移除队尾所有小于等于当前元素的索引\n- 当窗口形成时,队首就是最大值\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar maxSlidingWindow = function(nums, k) {\n if (!nums || nums.length === 0 || k <= 0) {\n return [];\n }\n \n const result = [];\n const deque = []; // 存储数组索引的双端队列\n \n for (let i = 0; i < nums.length; i++) {\n // 移除队列中超出窗口范围的元素\n while (deque.length > 0 && deque[0] <= i - k) {\n deque.shift();\n }\n \n // 维护单调递减队列:移除队尾所有小于当前元素的索引\n while (deque.length > 0 && nums[deque[deque.length - 1]] <= nums[i]) {\n deque.pop();\n }\n \n // 将当前元素索引加入队尾\n deque.push(i);\n \n // 当窗口大小达到k时,开始记录结果\n if (i >= k - 1) {\n result.push(nums[deque[0]]); // 队首是当前窗口最大值\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 每个元素最多进队列和出队列各一次\n- 空间复杂度 :O(k) - 队列最多存储k个元素","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178188012","body":"## 算法思路:\n- 使用度数统计法,将问题转化为图论中的入度和出度计算\n- 法官的特征:不信任任何人(出度=0)+ 被所有其他人信任(入度=n-1)\n- 通过计算每个人的\"信任度\"(入度-出度)来找到法官\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n // 特殊情况:只有一个人且没有信任关系,那么这个人就是法官\n if (n === 1 && trust.length === 0) {\n return 1;\n }\n \n // 初始化信任度数组,trustScore[i] = 入度 - 出度\n const trustScore = new Array(n + 1).fill(0);\n \n // 遍历所有信任关系\n for (const [a, b] of trust) {\n trustScore[a]--; // a信任别人,出度+1,所以信任度-1\n trustScore[b]++; // b被信任,入度+1,所以信任度+1\n }\n \n // 查找信任度为n-1的人(法官候选人)\n for (let i = 1; i <= n; i++) {\n if (trustScore[i] === n - 1) {\n return i;\n }\n }\n \n // 没有找到法官\n return -1;\n};\n```\n\n## 算法复杂度分析\n- 时间复杂度: O(E + n)\n- 遍历trust数组:O(E),其中E是信任关系数量\n- 查找法官:O(n)\n\n- 空间复杂度: O(n)\n- 需要额外的信任度数组存储每个人的统计信息","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182100538","body":"## 算法思路\n这是一个经典的二分图判断问题。核心思想是:\n\n- 将问题转化为图着色问题\n- 构建无向图,其中dislikes数组中的每一对表示图中的一条边\n- 使用DFS图着色算法判断是否能用两种颜色给所有节点着色\n- 如果相邻节点都能着不同颜色,则可以分成两组\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nvar possibleBipartition = function(n, dislikes) {\n // 构建邻接表表示图\n const graph = new Array(n + 1).fill(null).map(() => []);\n for (const [a, b] of dislikes) {\n graph[a].push(b);\n graph[b].push(a);\n }\n \n // 用于记录每个节点的颜色,0表示未着色,1和-1表示两种不同的颜色\n const colors = new Array(n + 1).fill(0);\n \n // DFS着色函数\n const dfs = (node, color) => {\n colors[node] = color;\n \n // 遍历所有邻接节点\n for (const neighbor of graph[node]) {\n if (colors[neighbor] === 0) {\n // 如果邻接节点未着色,给它着相反的颜色\n if (!dfs(neighbor, -color)) {\n return false;\n }\n } else if (colors[neighbor] === color) {\n // 如果邻接节点已经着色且颜色相同,说明不能构成二分图\n return false;\n }\n }\n return true;\n };\n \n // 遍历所有节点,处理可能存在的多个连通分量\n for (let i = 1; i <= n; i++) {\n if (colors[i] === 0) {\n if (!dfs(i, 1)) {\n return false;\n }\n }\n }\n \n return true;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(V + E),其中V是节点数量(n个人),E是边的数量(dislikes数组长度)\n- 空间复杂度 :O(V + E),主要用于邻接表存储、颜色数组和DFS递归栈","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186630947","body":"## 算法思路分析:\n这是一个双层拓扑排序问题\n- 首先需要对小组进行拓扑排序,确保依赖的小组在前面\n- 然后对每个小组内的项目进行拓扑排序\n- 最后按小组顺序合并结果\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n // 为没有小组的项目分配虚拟小组ID\n let groupId = m;\n for (let i = 0; i < n; i++) {\n if (group[i] === -1) {\n group[i] = groupId++;\n }\n }\n \n // 构建小组图和项目图\n const groupGraph = new Array(groupId).fill(0).map(() => []);\n const groupIndegree = new Array(groupId).fill(0);\n const itemGraph = new Array(n).fill(0).map(() => []);\n const itemIndegree = new Array(n).fill(0);\n \n // 构建依赖关系图\n const groupEdges = new Set(); // 用于去重小组间的边\n \n for (let i = 0; i < n; i++) {\n for (const beforeItem of beforeItems[i]) {\n const beforeGroup = group[beforeItem];\n const currentGroup = group[i];\n \n // 项目依赖关系\n itemGraph[beforeItem].push(i);\n itemIndegree[i]++;\n \n // 小组依赖关系(只有当项目属于不同小组时)\n if (beforeGroup !== currentGroup) {\n const edgeKey = `${beforeGroup}->${currentGroup}`;\n if (!groupEdges.has(edgeKey)) {\n groupEdges.add(edgeKey);\n groupGraph[beforeGroup].push(currentGroup);\n groupIndegree[currentGroup]++;\n }\n }\n }\n }\n \n // 拓扑排序函数\n function topologicalSort(graph, indegree) {\n const queue = [];\n const result = [];\n \n // 找到所有入度为0的节点\n for (let i = 0; i < indegree.length; i++) {\n if (indegree[i] === 0) {\n queue.push(i);\n }\n }\n \n while (queue.length > 0) {\n const node = queue.shift();\n result.push(node);\n \n // 更新相邻节点的入度\n for (const neighbor of graph[node]) {\n indegree[neighbor]--;\n if (indegree[neighbor] === 0) {\n queue.push(neighbor);\n }\n }\n }\n \n return result.length === graph.length ? result : [];\n }\n \n // 对小组进行拓扑排序\n const sortedGroups = topologicalSort(groupGraph, [...groupIndegree]);\n if (sortedGroups.length === 0) {\n return []; // 小组间存在循环依赖\n }\n \n // 对项目进行拓扑排序\n const sortedItems = topologicalSort(itemGraph, [...itemIndegree]);\n if (sortedItems.length === 0) {\n return []; // 项目间存在循环依赖\n }\n \n // 按小组分类项目\n const groupToItems = new Map();\n for (const item of sortedItems) {\n const itemGroup = group[item];\n if (!groupToItems.has(itemGroup)) {\n groupToItems.set(itemGroup, []);\n }\n groupToItems.get(itemGroup).push(item);\n }\n \n // 按小组顺序合并结果\n const result = [];\n for (const groupId of sortedGroups) {\n if (groupToItems.has(groupId)) {\n result.push(...groupToItems.get(groupId));\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n时间复杂度:O(n + E)\n- 构建图:O(E),E为所有依赖关系总数\n- 小组拓扑排序:O(V_g + E_g)\n- 项目拓扑排序:O(V_i + E_i)\n- 结果合并:O(n)\n\n空间复杂度:O(n + E + m)\n- 图存储:O(n + E)\n- 入度数组:O(n + m)\n- 辅助数据结构:O(n + m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3191484423","body":"## 算法思路\n机器人要回到原点(0,0),必须满足两个条件:\n- 向左移动的次数 = 向右移动的次数\n- 向上移动的次数 = 向下移动的次数\n\n## 代码\n```javascript\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let x = 0, y = 0; // 当前坐标\n \n for (let move of moves) {\n switch (move) {\n case 'L':\n x--;\n break;\n case 'R':\n x++;\n break;\n case 'U':\n y++;\n break;\n case 'D':\n y--;\n break;\n }\n }\n \n return x === 0 && y === 0;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n),其中n是moves字符串的长度,需要遍历一次字符串\n- 空间复杂度 :O(1),只使用了常数个额外变量,不随输入规模变化","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3194108225","body":"## 算法思路\n- 预处理 :为每个任务添加原始索引,按进入时间排序\n- 模拟执行 :使用最小堆维护可执行任务队列,按执行时间最短优先、索引最小优先的规则选择任务\n- 时间管理 :CPU空闲时直接跳转到下一个任务的进入时间,避免无效等待\n\n## 代码\n```javascript\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n const n = tasks.length;\n \n // 为每个任务添加原始索引,然后按进入时间排序\n const taskWithIndex = tasks.map((task, index) => [task[0], task[1], index]);\n taskWithIndex.sort((a, b) => a[0] - b[0]); // 按enqueueTime排序\n \n const result = [];\n // 优先队列:按执行时间升序,相同时按索引升序\n const availableTasks = new MinHeap((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按processingTime升序\n }\n return a[1] - b[1]; // 按originalIndex升序\n });\n \n let currentTime = 0;\n let taskIndex = 0; // 指向下一个要加入队列的任务\n \n while (result.length < n) {\n // 将所有在当前时间或之前进入队列的任务加入可执行队列\n while (taskIndex < n && taskWithIndex[taskIndex][0] <= currentTime) {\n const [enqueueTime, processingTime, originalIndex] = taskWithIndex[taskIndex];\n availableTasks.push([processingTime, originalIndex]);\n taskIndex++;\n }\n \n if (availableTasks.size() === 0) {\n // CPU空闲,直接跳到下一个任务的进入时间\n if (taskIndex < n) {\n currentTime = taskWithIndex[taskIndex][0];\n }\n } else {\n // 从可执行任务中选择执行时间最短的(相同时选择索引最小的)\n const [processingTime, originalIndex] = availableTasks.pop();\n result.push(originalIndex);\n currentTime += processingTime;\n }\n }\n \n return result;\n};\n\n// 最小堆实现\nclass MinHeap {\n constructor(compareFn) {\n this.heap = [];\n this.compare = compareFn || ((a, b) => a - b);\n }\n \n push(val) {\n this.heap.push(val);\n this.bubbleUp(this.heap.length - 1);\n }\n \n pop() {\n if (this.heap.length === 0) return undefined;\n if (this.heap.length === 1) return this.heap.pop();\n \n const top = this.heap[0];\n this.heap[0] = this.heap.pop();\n this.bubbleDown(0);\n return top;\n }\n \n size() {\n return this.heap.length;\n }\n \n bubbleUp(index) {\n while (index > 0) {\n const parentIndex = Math.floor((index - 1) / 2);\n if (this.compare(this.heap[index], this.heap[parentIndex]) >= 0) break;\n \n [this.heap[index], this.heap[parentIndex]] = [this.heap[parentIndex], this.heap[index]];\n index = parentIndex;\n }\n }\n \n bubbleDown(index) {\n while (true) {\n let minIndex = index;\n const leftChild = 2 * index + 1;\n const rightChild = 2 * index + 2;\n \n if (leftChild < this.heap.length && \n this.compare(this.heap[leftChild], this.heap[minIndex]) < 0) {\n minIndex = leftChild;\n }\n \n if (rightChild < this.heap.length && \n this.compare(this.heap[rightChild], this.heap[minIndex]) < 0) {\n minIndex = rightChild;\n }\n \n if (minIndex === index) break;\n \n [this.heap[index], this.heap[minIndex]] = [this.heap[minIndex], this.heap[index]];\n index = minIndex;\n }\n }\n}\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n log n)\n - 排序:O(n log n)\n - 堆操作:每个任务最多进出堆一次,总计O(n log n)\n- 空间复杂度 :O(n)\n - 存储任务信息、最小堆和结果数组","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194111949","body":"## 算法核心思路\n- 1.时间转换 :将 \"HH:MM\" 格式转换为分钟数便于计算\n- 2.对局编号计算 :\n - 开始时间: Math.ceil(minutes / 15) 确保只计算完整参与的对局\n - 结束时间: Math.floor(minutes / 15) 确保只计算完整参与的对局\n- 3.分情况处理 :\n - 同一天:结束时间对局编号 - 开始时间对局编号\n - 跨夜:(96 - 开始时间对局编号) + 结束时间对局编号\n\n## 代码\n```javascript\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n // 将时间字符串转换为分钟数\n function timeToMinutes(time) {\n const [hours, minutes] = time.split(':').map(Number);\n return hours * 60 + minutes;\n }\n \n const startMinutes = timeToMinutes(loginTime);\n const endMinutes = timeToMinutes(logoutTime);\n \n // 如果结束时间早于开始时间,说明跨越了午夜\n if (endMinutes < startMinutes) {\n // 跨夜情况:从开始时间到午夜 + 从午夜到结束时间\n // 计算从开始时间到午夜能完成的对局数\n const roundsBeforeMidnight = 96 - Math.ceil(startMinutes / 15);\n // 计算从午夜到结束时间能完成的对局数\n const roundsAfterMidnight = Math.floor(endMinutes / 15);\n return roundsBeforeMidnight + roundsAfterMidnight;\n } else {\n // 同一天情况\n // 能完成的对局数 = 结束时间所在的对局编号 - 开始时间所在的对局编号\n const result = Math.floor(endMinutes / 15) - Math.ceil(startMinutes / 15);\n return Math.max(0, result); // 确保不返回负数\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(1) - 所有操作都是常数时间的数学计算\n- 空间复杂度 :O(1) - 只使用固定数量的变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3197064559","body":"## 算法思路\n- 1.统计字符频率\n- 2.条件三:变成同一个字母\n- 3.条件一 & 条件二:字母严格大小比较\n- 4.综合最优解\n\n## 代码\n```javascript\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n let n = a.length, m = b.length;\n\n let freqA = new Array(26).fill(0);\n let freqB = new Array(26).fill(0);\n\n for (let ch of a) freqA[ch.charCodeAt(0) - 97]++;\n for (let ch of b) freqB[ch.charCodeAt(0) - 97]++;\n\n // 前缀和\n let prefixA = new Array(27).fill(0);\n let prefixB = new Array(27).fill(0);\n for (let i = 0; i < 26; i++) {\n prefixA[i+1] = prefixA[i] + freqA[i];\n prefixB[i+1] = prefixB[i] + freqB[i];\n }\n\n // 条件三:相同字母\n let ops3 = Infinity;\n for (let i = 0; i < 26; i++) {\n ops3 = Math.min(ops3, n + m - (freqA[i] + freqB[i]));\n }\n\n // 条件一 & 二\n let ops1 = Infinity, ops2 = Infinity;\n for (let c = 0; c < 25; c++) { // 0~24,分割点\n // a < b\n ops1 = Math.min(ops1, (n - prefixA[c+1]) + prefixB[c+1]);\n // b < a\n ops2 = Math.min(ops2, (m - prefixB[c+1]) + prefixA[c+1]);\n }\n\n return Math.min(ops1, ops2, ops3);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n + m)\n- 空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199072283","body":"## 算法思路\n- 1.将数组构建为一个 最大堆(heapify)\n 最大堆性质:父节点值 ≥ 子节点值。\n- 2.交换堆顶(最大值)和堆尾元素,把最大值放到最终位置。\n- 3.缩小堆的范围(长度减 1),重新 heapify。\n- 4.重复步骤 2–3,直到整个数组有序。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function(nums) {\n let n = nums.length;\n\n // 建堆(从最后一个非叶子节点开始向下调整)\n for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {\n heapify(nums, n, i);\n }\n\n // 不断取出堆顶(最大值)放到数组末尾\n for (let i = n - 1; i > 0; i--) {\n // 交换堆顶和堆尾\n [nums[0], nums[i]] = [nums[i], nums[0]];\n // 调整剩余部分\n heapify(nums, i, 0);\n }\n\n return nums;\n};\n\n// 调整为最大堆\nfunction heapify(arr, heapSize, root) {\n let largest = root;\n let left = 2 * root + 1;\n let right = 2 * root + 2;\n\n if (left < heapSize && arr[left] > arr[largest]) {\n largest = left;\n }\n\n if (right < heapSize && arr[right] > arr[largest]) {\n largest = right;\n }\n\n if (largest !== root) {\n [arr[root], arr[largest]] = [arr[largest], arr[root]];\n heapify(arr, heapSize, largest);\n }\n}\n```\n\n## 复杂度分析\n- 时间复杂度\n建堆:O(n)\n每次取出最大值并 heapify:O(log n),共 n 次\n总计:O(n log n)\n- 空间复杂度\n堆排序在原数组上操作,只需要 O(1) 额外空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204787436","body":"## 算法思路:\n- 平方根一定在 1 ~ x/2 之间(除了 0 和 1 特殊处理)。\n- 用二分查找,比较 mid * mid 与 x。\n- 如果等于就直接返回。\n- 如果小于,就把 mid 作为候选答案,继续往右找。\n- 如果大于,就往左缩。\n\n## 代码\n```javascript\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n if (x < 2) return x; // 0 -> 0, 1 -> 1\n\n let left = 1, right = Math.floor(x / 2), ans = 0;\n while (left <= right) {\n let mid = Math.floor((left + right) / 2);\n let square = mid * mid;\n\n if (square === x) {\n return mid;\n } else if (square < x) {\n ans = mid; // mid 可能是答案\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 O(log n)\n- 空间复杂度 O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3209498631","body":"## 算法思路\n- 设定搜索区间 [1, n]。\n- 取中点 mid = Math.floor((left + right) / 2)。\n- 调用 isBadVersion(mid):\n- 如果是坏的(true),说明答案在 左边或就是 mid,更新 right = mid。\n- 如果不是坏的(false),说明答案在 右边,更新 left = mid + 1。\n- 循环直到 left == right,此时 left 就是第一个坏版本。\n\n## 代码\n```javascript\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let left = 1, right = n;\n while (left < right) {\n let mid = Math.floor((left + right) / 2);\n if (isBadVersion(mid)) {\n // mid 可能是第一个坏版本,所以不能跳过它\n right = mid;\n } else {\n // mid 不是坏的,第一个坏版本在右边\n left = mid + 1;\n }\n }\n return left; // 或者 right,二者相等\n };\n};\n```\n\n## 复杂度分析\n- 时间复杂度:每次二分区间缩小一半,最多调用 isBadVersion O(log n) 次。\n- 空间复杂度:我们只用到了几个变量,额外空间复杂度是 O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3214357168","body":"## 算法思路\n- 1.分治思想(归并排序)\n- 把数组分为两半,分别统计左半部分和右半部分的翻转对数量。\n- 在合并的时候,再统计「跨左右两部分」的翻转对数量。\n- 2.跨区间统计方法\n- 假设左半部分是 left[],右半部分是 right[],它们都是有序的。\n- 对于每个 left[i],我们需要统计右边有多少个 right[j] 满足left[i]>2×right[j]\n- 因为 right[] 已经排序,可以用一个指针 双指针扫描,避免嵌套循环。\n- 3.合并排序\n- 统计完跨区间的翻转对数量后,把两个有序数组合并,递归回溯。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n if (!nums || nums.length === 0) return 0;\n\n const mergeSort = (arr, left, right) => {\n if (left >= right) return 0;\n\n let mid = Math.floor((left + right) / 2);\n let count = mergeSort(arr, left, mid) + mergeSort(arr, mid + 1, right);\n\n // 统计跨区间翻转对\n let j = mid + 1;\n for (let i = left; i <= mid; i++) {\n while (j <= right && arr[i] > 2 * arr[j]) {\n j++;\n }\n count += (j - (mid + 1));\n }\n\n // 合并两个有序数组\n let temp = [];\n let p1 = left, p2 = mid + 1;\n while (p1 <= mid && p2 <= right) {\n if (arr[p1] <= arr[p2]) {\n temp.push(arr[p1++]);\n } else {\n temp.push(arr[p2++]);\n }\n }\n while (p1 <= mid) temp.push(arr[p1++]);\n while (p2 <= right) temp.push(arr[p2++]);\n\n for (let i = 0; i < temp.length; i++) {\n arr[left + i] = temp[i];\n }\n\n return count;\n };\n\n return mergeSort(nums, 0, nums.length - 1);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(nlogn)\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3218651000","body":"## 算法思路\n\n- 排序\n- 对 houses 和 heaters 进行排序,方便二分查找。\n- 二分查找\n- 对于每个房屋 h,在 heaters 中二分查找,找到最接近 h 的供暖器位置。\n- 计算 |h - heater_left| 和 |h - heater_right| 的最小值。\n- 得到该房屋的最小供暖距离。\n- 取最大值\n- 遍历所有房屋,取最小距离的最大值。\n\n## 代码\n```javascript\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n houses.sort((a, b) => a - b);\n heaters.sort((a, b) => a - b);\n\n let radius = 0;\n\n for (let house of houses) {\n // 二分查找\n let left = 0, right = heaters.length - 1;\n while (left <= right) {\n let mid = Math.floor((left + right) / 2);\n if (heaters[mid] < house) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n // left 是第一个 >= house 的位置\n let dist1 = (left < heaters.length) ? Math.abs(heaters[left] - house) : Infinity;\n let dist2 = (right >= 0) ? Math.abs(heaters[right] - house) : Infinity;\n\n let nearest = Math.min(dist1, dist2);\n radius = Math.max(radius, nearest);\n }\n\n return radius;\n};\n```\n\n## 复杂度分析\n- 排序\n- houses 排序:O(n log n)\n- heaters 排序:O(m log m)\n- 二分查找\n- 每个房屋做一次二分:O(log m)\n- 共 n 个房屋:O(n log m)\n- 总时间复杂度:O(nlogn+mlogm+nlogm)\n- 空间复杂度:O(1)(除了排序外,常数额外空间)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3218659174","body":"## 排序数组\n- 先对 nums 排序。这样数对距离 = 两个数的差,可以利用单调性。\n- 二分查找答案\n- 距离范围:最小值 0,最大值 max(nums) - min(nums)。\n- 设二分中间值为 mid,问题转化为:\n- 数组中有多少对数对距离 ≤ mid。\n- 双指针统计 ≤ mid 的数对数量\n- 排序后数组 nums 单调递增。\n- 用两个指针 i、j:\n- 固定右端点 j,向左找满足 nums[j] - nums[i] <= mid 的最小 i。\n- 那么从 i 到 j-1 的所有元素都和 j 构成合法数对,总数是 j - i。\n- 整个过程是 O(n)。\n- 二分逻辑\n- 如果 ≤ mid 的数对数目 ≥ k,说明答案可能更小,右边界收缩。\n- 否则说明距离太小,左边界右移。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a, b) => a - b);\n\n // 统计差值 <= mid 的数对个数\n function countPairs(mid) {\n let count = 0;\n let i = 0;\n for (let j = 0; j < nums.length; j++) {\n while (nums[j] - nums[i] > mid) {\n i++;\n }\n count += j - i;\n }\n return count;\n }\n\n let left = 0, right = nums[nums.length - 1] - nums[0];\n while (left < right) {\n let mid = Math.floor((left + right) / 2);\n if (countPairs(mid) >= k) {\n right = mid; // 答案可能是 mid 或更小\n } else {\n left = mid + 1;\n }\n }\n return left;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 排序:O(n log n)\n- 二分查找:查找范围是 max(nums) - min(nums),最大 1e6,二分次数约 log(1e6) ≈ 20。\n- 每次 countPairs:O(n)(双指针扫描一遍)。\n- 总复杂度:O(n log n + n log W),其中 W = max(nums) - min(nums)。对 n = 1e4,完全可行。\n- 空间复杂度\n- 只用了常数级变量,O(1)(不算排序)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218668542","body":"## 算法思路\n- 二分 + BFS/DFS\n- 时间范围是 [max(grid[0][0], grid[n-1][n-1]), n^2-1]。\n- 二分水位 mid,检查是否能在 mid 水位下从 (0,0) 到 (n-1,n-1)。\n- 如果可以,则收缩右边界,否则收缩左边界。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n const n = grid.length;\n const directions = [[1,0],[-1,0],[0,1],[0,-1]];\n \n // 检查是否能在水位 t 下到达终点\n function canReach(t) {\n if (grid[0][0] > t) return false;\n const visited = Array.from({length: n}, () => Array(n).fill(false));\n const queue = [[0,0]];\n visited[0][0] = true;\n\n while (queue.length > 0) {\n const [x, y] = queue.shift();\n if (x === n-1 && y === n-1) return true;\n for (const [dx, dy] of directions) {\n const nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n &&\n !visited[nx][ny] && grid[nx][ny] <= t) {\n visited[nx][ny] = true;\n queue.push([nx, ny]);\n }\n }\n }\n return false;\n }\n\n // 二分查找最小可行水位\n let low = Math.max(grid[0][0], grid[n-1][n-1]);\n let high = n * n - 1;\n let ans = high;\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (canReach(mid)) {\n ans = mid;\n high = mid - 1; // 尝试更小的水位\n } else {\n low = mid + 1;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- BFS 最多访问 n^2 个格子,复杂度 O(n^2)。\n- 二分查找 范围大小约为 n^2,二分次数 O(log(n^2)) = O(log n)。\n- 总时间复杂度:O(n^2 log n)。\n- 空间复杂度:需要 visited 数组 O(n^2)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3226685252","body":"## 核心思路\n- 滑动窗口(Sliding Window)\n- 定义元音集合\n- vowels = new Set(['a','e','i','o','u'])\n- 初始化窗口\n- 先统计前 k 个字符里元音的数量 count。\n- 这就是第一个窗口的元音数。\n- 滑动窗口\n- 从 i = k 开始,窗口向右滑动:\n- 移除窗口最左边的字符(如果它是元音则 count--)。\n- 加入窗口最右边的字符(如果它是元音则 count++)。\n- 每次更新最大值 maxCount = Math.max(maxCount, count)。\n- 提前终止\n- 如果 maxCount === k,说明某个窗口里全是元音,直接返回结果(不可能更大了)。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n const vowels = new Set(['a', 'e', 'i', 'o', 'u']);\n let count = 0, maxCount = 0;\n\n // 初始化前 k 个字符\n for (let i = 0; i < k; i++) {\n if (vowels.has(s[i])) count++;\n }\n maxCount = count;\n\n // 滑动窗口\n for (let i = k; i < s.length; i++) {\n if (vowels.has(s[i - k])) count--; // 移除最左边\n if (vowels.has(s[i])) count++; // 加入最右边\n maxCount = Math.max(maxCount, count);\n if (maxCount === k) return k; // 提前终止\n }\n\n return maxCount;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 初始化前 k 个字符统计需要 O(k)。\n- 然后遍历整个字符串一次 O(n)。\n- 总体复杂度:O(n)。\n- 空间复杂度:\n- 仅使用一个集合 Set 存元音,空间 O(1)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3226702074","body":"## 思路分析\n- 边界情况\n- 如果 k == 0:Alice 一开始就停,不抽牌,分数是 0。如果 0 <= n,返回 1;否则返回 0。\n- 如果 n >= k - 1 + maxPts:Alice 不可能超过 n,因为最大分数就是 k-1 + maxPts。此时概率是 1。\n- 动态规划建模\n- 定义 dp[i] = 从分数 i 出发,Alice 最终分数不超过 n 的概率。\n- 最终答案是 dp[0]。\n- 如果 i >= k:表示 Alice 已经停了。\n- 如果 i <= n:返回 1(安全)。\n- 否则返回 0(爆掉)。\n- 如果 i < k:Alice 会继续抽。\n- 优化:滑动窗口\n- 用一个变量 windowSum 维护滑动和,就能做到 O(n)。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n // 速返:一开始就停;或最高可能分也不超过 n\n if (k === 0 || n >= k - 1 + maxPts) return 1.0;\n\n const dp = new Array(n + 1).fill(0.0);\n // 终止区间:达到/超过 k 后立即停;在 [k, n] 内都是成功状态\n for (let i = k; i <= n; i++) dp[i] = 1.0;\n\n // 初始窗口和:dp[k]..dp[k+maxPts-1],这些里面只有 <= n 的是 1\n let windowSum = Math.min(n - k + 1, maxPts);\n\n // 从后往前做滑动平均\n for (let i = k - 1; i >= 0; i--) {\n dp[i] = windowSum / maxPts;\n // 更新窗口:加上新放入的 dp[i],减去滑出窗口的 dp[i + maxPts](越界视为 0)\n windowSum += dp[i] - (i + maxPts <= n ? dp[i + maxPts] : 0);\n // 也可写成:windowSum += dp[i] - (dp[i + maxPts] ?? 0);\n }\n return dp[0];\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 只遍历了一次数组,每个状态 O(1) 计算。\n- 时间复杂度:O(n)\n- 空间复杂度\n- 需要一个 dp 数组大小为 O(n)。\n- 也可以优化成 O(maxPts)(因为只依赖一个窗口)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3231363055","body":"## 算法思路\n- 核心观察\n- 一个字符串的异位词就是 字符相同但顺序不同 的字符串。\n- 如果子串和 p 的 字符频率统计完全相同,那么它就是一个异位词。\n- 滑动窗口\n- 用两个数组(或哈希表)存放字符频率:\n- pCount 记录 p 中各字符出现次数。\n- sCount 记录当前窗口(长度等于 p.length)的各字符出现次数。\n- 每次窗口滑动:\n- 移入一个字符,更新 sCount。\n- 移出一个字符,更新 sCount。\n- 如果 sCount 和 pCount 相等,则记录当前窗口起始位置。\n- 优化比较\n- 不需要每次都完整比较两个数组(O(26))。\n- 但因为字符集仅 26 个,比较成本很小,可以直接比较数组,整体复杂度依旧可接受。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nvar findAnagrams = function(s, p) {\n let res = [];\n let m = p.length, n = s.length;\n if (n < m) return res;\n\n // 频次数组,26个小写字母\n let pCount = new Array(26).fill(0);\n let sCount = new Array(26).fill(0);\n\n // 统计 p 的频率\n for (let ch of p) {\n pCount[ch.charCodeAt(0) - 97]++;\n }\n\n // 初始化第一个窗口\n for (let i = 0; i < m; i++) {\n sCount[s.charCodeAt(i) - 97]++;\n }\n\n // 比较初始窗口\n if (sCount.join() === pCount.join()) res.push(0);\n\n // 滑动窗口\n for (let i = m; i < n; i++) {\n sCount[s.charCodeAt(i) - 97]++; // 加入右边字符\n sCount[s.charCodeAt(i - m) - 97]--; // 移出左边字符\n\n if (sCount.join() === pCount.join()) {\n res.push(i - m + 1);\n }\n }\n\n return res;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 初始化统计频率:O(m)\n- 滑动窗口遍历 s:O(n)\n- 每次比较频率数组:O(26) = O(1)\n- 总复杂度:O(n + m)\n- 空间复杂度\n- 两个长度为 26 的数组:O(26) ≈ O(1)\n- 结果数组存储下标,最坏情况 O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3236034367","body":"## 算法思路\n- 核心思想:滑动窗口\n- 我们在字符串 s 上维护一个动态窗口 [left, right)。\n- 用 need 记录字符串 t 中每个字符需要的次数。\n- 用 window 记录当前窗口中每个字符出现的次数。\n- 不断扩展 right 指针,直到窗口内满足 t 的要求。\n- 然后收缩 left,尽量缩小窗口,直到不满足要求为止。\n- 在满足要求的情况下,更新最小子串。\n- 满足条件的判断\n- 我们可以维护一个 valid 变量,表示窗口中满足 need 的字符种类数。\n- 当 valid === need.size 时,说明窗口包含了所有需要的字符。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nvar minWindow = function(s, t) {\n let need = new Map();\n let window = new Map();\n\n for (let c of t) {\n need.set(c, (need.get(c) || 0) + 1);\n }\n\n let left = 0, right = 0;\n let valid = 0;\n let start = 0, len = Infinity;\n\n while (right < s.length) {\n let c = s[right];\n right++;\n if (need.has(c)) {\n window.set(c, (window.get(c) || 0) + 1);\n if (window.get(c) === need.get(c)) {\n valid++;\n }\n }\n\n // 收缩左边界\n while (valid === need.size) {\n if (right - left < len) {\n start = left;\n len = right - left;\n }\n let d = s[left];\n left++;\n if (need.has(d)) {\n if (window.get(d) === need.get(d)) {\n valid--;\n }\n window.set(d, window.get(d) - 1);\n }\n }\n }\n\n return len === Infinity ? \"\" : s.substr(start, len);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 每个字符最多被左右指针访问一次,所以是 O(m + n),其中 m = s.length, n = t.length。\n- 空间复杂度:\n- 哈希表 need 和 window 至多包含全部字符,大小为 O(Σ),Σ 是字符集大小(对英文就是 O(26) 或 O(52) 或 O(128))。\n- 所以空间复杂度 O(Σ)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/50#issuecomment-3247555036","body":"## 算法思路\n- 一共要拿 k 张牌,可以从数组两端取。\n- 等价于:我们留下 n - k 张牌(连续子数组),这些是不能拿的。\n- 因此,最大得分 = 总和 - 最小的长度为 (n - k) 的子数组的和。\n- 先计算数组总和 total。\n- 如果 k == n,那就直接返回 total。\n- 否则,使用滑动窗口大小为 (n - k),找到 最小窗口和。\n- 答案就是 total - min_window_sum。\n\n## 代码\n```javascript\n/**\n * @param {number[]} cardPoints\n * @param {number} k\n * @return {number}\n */\nvar maxScore = function(cardPoints, k) {\n const n = cardPoints.length;\n const total = cardPoints.reduce((a, b) => a + b, 0);\n \n // 特殊情况:拿所有卡牌\n if (k === n) return total;\n \n const windowSize = n - k;\n // 初始化窗口和\n let windowSum = 0;\n for (let i = 0; i < windowSize; i++) {\n windowSum += cardPoints[i];\n }\n let minWindowSum = windowSum;\n \n // 滑动窗口\n for (let i = windowSize; i < n; i++) {\n windowSum += cardPoints[i] - cardPoints[i - windowSize];\n minWindowSum = Math.min(minWindowSum, windowSum);\n }\n \n return total - minWindowSum;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 计算总和 O(n)\n- 滑动窗口遍历一次数组 O(n)\n- 总复杂度 O(n)\n- 空间复杂度:\n- 只用常数级变量存储 O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3247564267","body":"## 算法思路\n- 枚举所有可能的小时和分钟\n- 小时范围:0–11\n- 分钟范围:0–59\n- 总共 12 × 60 = 720 种组合。\n- 统计二进制表示中 1 的个数\n- bitCount(h) + bitCount(m) == turnedOn 才是合法解。\n- 其中 bitCount(x) 表示数字 x 的二进制中 1 的数量。\n- 格式化输出\n- 小时 h 直接转成字符串(不能有前导零)。\n- 分钟 m 必须是两位数,若小于 10 需在前面补 0。\n\n## 代码\n```javascript\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n const res = [];\n // 遍历所有可能的时间\n for (let h = 0; h < 12; h++) {\n for (let m = 0; m < 60; m++) {\n // 检查是否满足亮灯数量\n if (bitCount(h) + bitCount(m) === turnedOn) {\n // 格式化分钟(必须两位数)\n const time = `${h}:${m.toString().padStart(2, '0')}`;\n res.push(time);\n }\n }\n }\n return res;\n};\n\n// 计算二进制数中 1 的个数\nfunction bitCount(num) {\n let count = 0;\n while (num > 0) {\n count += num & 1;\n num >>= 1;\n }\n return count;\n}\n```\n\n## 复杂度分析\n- 外层遍历所有 12 × 60 = 720 种时间组合 → O(720) ≈ O(1) (常数级,最多 720 次)。\n- 每次计算 bitCount(h) 和 bitCount(m),\n- h < 12(最多 4 bit),m < 60(最多 6 bit),所以计算一次 bitCount 的复杂度 ≤ 10。\n- 总复杂度依然是常数级。\n- 时间复杂度:O(1) (严格来说是 O(720×10),但近似常数)\n- 空间复杂度:O(1) (除返回结果外仅使用常量存储)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3247575227","body":"## 算法思路(回溯法)\n- 逐行放置:从第 0 行开始,尝试在每一列放置皇后。\n- 约束检查:放置前,检查当前列和对角线是否已有皇后。\n- 列冲突:用一个集合 cols 记录已占用的列。\n- 主对角线冲突:行号 - 列号 相同的点在同一主对角线上,用 diag1 集合。\n- 副对角线冲突:行号 + 列号 相同的点在同一副对角线上,用 diag2 集合。\n- 递归搜索:如果当前行放置成功,递归尝试下一行。\n- 回溯:如果无法继续,撤销放置,尝试下一个位置。\n- 统计解法数:当所有行都成功放置皇后时,计数 +1。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n const cols = new Set(); // 记录已占用的列\n const diag1 = new Set(); // 记录主对角线 (row - col)\n const diag2 = new Set(); // 记录副对角线 (row + col)\n\n function backtrack(row) {\n if (row === n) { \n count++;\n return;\n }\n for (let col = 0; col < n; col++) {\n if (cols.has(col) || diag1.has(row - col) || diag2.has(row + col)) {\n continue; // 冲突,不能放\n }\n // 选择\n cols.add(col);\n diag1.add(row - col);\n diag2.add(row + col);\n\n backtrack(row + 1);\n\n // 回溯\n cols.delete(col);\n diag1.delete(row - col);\n diag2.delete(row + col);\n }\n }\n\n backtrack(0);\n return count;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 每行必须放置一个皇后,因此每一行尝试 n 种列的可能性。\n- 在冲突检测 O(1) 的情况下,最坏情况回溯树的大小接近 O(n!)。\n- 实际上,由于剪枝(冲突检测),复杂度会远小于 n!,但仍然是 指数级。\n- 时间复杂度:O(n!) (上界)。\n- 空间复杂度:\n- cols、diag1、diag2 最多各存储 n 个元素。\n- 递归栈深度最大为 n。\n- 空间复杂度:O(n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3247583590","body":"## 算法思路\n- 遍历整个网格,当遇到值为 1 的格子时,说明找到了新的岛屿。\n- 使用 DFS(深度优先搜索)或 BFS(广度优先搜索)来扩展整个岛屿,计算其面积,并更新最大值。\n- 为避免重复计算,我们要将访问过的格子标记为 0(淹没)或使用 visited 数组。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n let m = grid.length, n = grid[0].length;\n let maxArea = 0;\n\n function dfs(i, j) {\n // 边界条件\n if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] === 0) {\n return 0;\n }\n // 标记访问过\n grid[i][j] = 0;\n let area = 1;\n // 四个方向\n area += dfs(i + 1, j);\n area += dfs(i - 1, j);\n area += dfs(i, j + 1);\n area += dfs(i, j - 1);\n return area;\n }\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n maxArea = Math.max(maxArea, dfs(i, j));\n }\n }\n }\n\n return maxArea;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 遍历整个矩阵,每个元素最多被访问一次(因为访问后会被置为 0)。\n- 每个格子在 DFS 中的递归调用也是 O(1)(最多 4 次相邻扩展)。\n- 总时间复杂度: O(m * n)\n- 空间复杂度:\n- 递归栈的深度,最坏情况是整个矩阵都是 1,即 O(m * n)。\n- 如果用 BFS + 队列,也需要 O(m * n) 的空间。\n- 空间复杂度: O(m * n)(递归栈 / 队列空间)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247593268","body":"## 算法思路\n- 使用多源 BFS(广度优先搜索)来解决。\n- 找到所有陆地格子,放入队列(多源 BFS 起点)。\n- 从陆地开始向外扩展,遇到海洋格子时更新它的距离。\n- 记录 BFS 扩展到的最大层数,即最大距离。\n- 最后如果没有海洋或没有陆地,返回 -1。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxDistance = function(grid) {\n const n = grid.length;\n const directions = [[1,0],[-1,0],[0,1],[0,-1]];\n const queue = [];\n\n // 1. 把所有陆地加入队列\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n queue.push([i, j]);\n }\n }\n }\n\n // 如果全是海洋或者全是陆地\n if (queue.length === 0 || queue.length === n * n) return -1;\n\n let distance = -1;\n\n // 2. 多源 BFS\n while (queue.length > 0) {\n let size = queue.length;\n distance++; // 每一层扩展一次\n for (let s = 0; s < size; s++) {\n const [x, y] = queue.shift();\n for (let [dx, dy] of directions) {\n const nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] === 0) {\n grid[nx][ny] = 1; // 标记为已访问(变为陆地)\n queue.push([nx, ny]);\n }\n }\n }\n }\n\n return distance;\n};\n```\n\n## 复杂度分析\n- BFS 遍历整个网格,每个格子最多入队一次。\n- 时间复杂度:O(n^2)\n- 空间复杂度(队列 + 访问标记):O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3270177258","body":"## 思路\n- 一开始手上有一些 初始盒子,目标是最大化能获得的糖果数。关键点是:\n- 盒子可能是 开着的(status[i] = 1)或者 关着的(status[i] = 0)。\n- 你只有在盒子开着时,才能取走里面的糖果。\n- 打开盒子后,你可能获得 钥匙,可以解锁更多盒子。\n- 打开盒子后,你可能获得 更多盒子,这些盒子可能要等钥匙解锁才能用。\n- 所以整个过程就是一个 BFS / 队列模拟,类似 “不断解锁和探索”的过程。\n\n## 代码\n```javascript\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n let n = status.length;\n let res = 0;\n\n let haveKey = new Set();\n let haveBox = new Set(initialBoxes);\n let visited = new Array(n).fill(false);\n\n let queue = [...initialBoxes];\n\n while (queue.length > 0) {\n let box = queue.shift();\n if (visited[box]) continue;\n\n // 如果箱子是锁着的且没钥匙 -> 跳过\n if (status[box] === 0 && !haveKey.has(box)) continue;\n\n // 打开箱子\n visited[box] = true;\n res += candies[box];\n\n // 获得钥匙\n for (let k of keys[box]) {\n if (!haveKey.has(k)) {\n haveKey.add(k);\n // 如果之前已经有这个盒子但是打不开,现在可以打开了\n if (haveBox.has(k) && !visited[k]) {\n queue.push(k);\n }\n }\n }\n\n // 获得新的盒子\n for (let b of containedBoxes[box]) {\n if (!haveBox.has(b)) haveBox.add(b);\n if ((status[b] === 1 || haveKey.has(b)) && !visited[b]) {\n queue.push(b);\n }\n }\n }\n\n return res;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 每个盒子最多被处理一次,O(n)。\n- 钥匙和 containedBoxes 总长度之和最多 O(n)。\n- 所以总 时间复杂度 = O(n)。\n- 空间复杂度分析\n- visited / haveKey / haveBox 都是 O(n)。\n- 队列最多 O(n)。\n- 所以 空间复杂度 = O(n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3270189042","body":"/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n if (!root) return [];\n \n // 存储节点信息:[row, col, val]\n const nodes = [];\n \n // DFS遍历,记录每个节点的坐标和值\n function dfs(node, row, col) {\n if (!node) return;\n \n nodes.push([row, col, node.val]);\n \n // 左子节点:row+1, col-1\n dfs(node.left, row + 1, col - 1);\n // 右子节点:row+1, col+1\n dfs(node.right, row + 1, col + 1);\n }\n \n // 从根节点开始遍历,根节点坐标为(0, 0)\n dfs(root, 0, 0);\n \n // 按列索引分组\n const columnMap = new Map();\n for (const [row, col, val] of nodes) {\n if (!columnMap.has(col)) {\n columnMap.set(col, []);\n }\n columnMap.get(col).push([row, val]);\n }\n \n // 获取所有列索引并排序\n const columns = Array.from(columnMap.keys()).sort((a, b) => a - b);\n \n const result = [];\n for (const col of columns) {\n const columnNodes = columnMap.get(col);\n // 对每列内的节点排序:先按行排序,同行按值排序\n columnNodes.sort((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按行排序\n }\n return a[1] - b[1]; // 同行按值排序\n });\n \n // 提取值\n result.push(columnNodes.map(node => node[1]));\n }\n \n return result;\n};","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ariana850409":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074225557","body":"思維:\n以十進位的相加方式,將 k 拆解成字串,從個位數開始與 num 相加,最後再處理一次 num 的進位\n\n代碼:\n```\nclass Solution(object):\n def addToArrayForm(self, num, k):\n k = str(k)\n for i in range(-1, -(len(k)+1), -1):\n number = int(k[i])\n if abs(i) > len(num):\n num.insert(0, number)\n else:\n num[i] = num[i] + number\n\n for i in range(-1, -(len(num)+1), -1):\n temp = num[i]\n if temp >= 10:\n num[i] = temp - 10\n if abs(i-1) > len(num):\n num.insert(0, 1)\n else:\n num[i-1] += 1\n\n return num\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078087647","body":"思維:\n先找出所有符合字符 c 的 index,再判斷字符串 s 中每個字符跟要拿來比較的 index 的最短距離\n\n代碼:\n```\nclass Solution:\n def shortestToChar(self, s: str, c: str) -> List[int]:\n target = []\n for i, char in enumerate(s):\n if char == c:\n target.append(i)\n\n res = []\n t = 0\n for i in range(len(s)):\n tar = target[t]\n if i < tar:\n res.append(tar-i)\n elif i == tar:\n res.append(0)\n elif t+1 >= len(target):\n res.append(i-tar)\n else:\n next_tar = target[t+1]\n res.append(min(i-tar, next_tar-i))\n if i == next_tar:\n t += 1\n return res\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3083166293","body":"思維一:單純依照題義用最直接的想法來實作各函式,increment 用遍歷去直接改變列表中的值\n\n代碼:\n```python\nclass CustomStack:\n def __init__(self, maxSize: int):\n self.maxSize = maxSize\n self.stack = []\n \n def push(self, x: int) -> None:\n if if len(self.stack) < self.maxSize:\n self.stack.append(x)\n\n def pop(self) -> int:\n if not self.stack:\n return -1\n return self.stack.pop()\n \n def increment(self, k: int, val: int) -> None:\n k = min(k, len(self.stack))\n for i in range(k):\n self.stack[i] += val\n```\n時間複雜度:push, pop: O(1) / increment: O(N)\n\n空間複雜度:O(N)\n\n-----\n思維二:優化 increment 的時間複雜度,將 increment value 另存在一個列表,等 pop 時才判斷需加多少值\n\n代碼:\n```python\nclass CustomStack:\n def __init__(self, maxSize: int):\n self.maxSize = maxSize\n self.stack = []\n self.inc = [0] * maxSize\n \n def push(self, x: int) -> None:\n if not len(self.stack) >= self.maxSize:\n self.stack.append(x)\n\n def pop(self) -> int:\n if not self.stack:\n return -1\n inc_idx = len(self.stack)-1\n inc_val = self.inc[inc_idx]\n if inc_idx > 0:\n self.inc[inc_idx-1] += inc_val\n self.inc[inc_idx] = 0\n return self.stack.pop() + inc_val\n \n def increment(self, k: int, val: int) -> None:\n k = min(k, len(self.stack))\n if k > 0:\n self.inc[k-1] += val\n```\n時間複雜度:push, pop, increment: O(1)\n\n空間複雜度:O(N)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087613442","body":"思維:使用兩個 stack 模擬進入與退出重複區塊的過程,每遇到 [ 就壓入當下狀態,遇到 ] 就彈出並拼接,逐步建立出完整的解碼字串\n\n代碼:\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n cnt_stack = []\n str_stack = []\n cnt = ''\n temp = ''\n for c in s:\n if c.isdigit():\n cnt += c\n elif c == '[':\n cnt_stack.append(int(cnt))\n str_stack.append(temp)\n cnt = ''\n temp = ''\n elif c == ']':\n times = cnt_stack.pop()\n prev_str = str_stack.pop()\n temp = prev_str + temp * times\n else:\n temp += c\n\n return temp\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091473302","body":"思維一:以暴力解的方式在 peek 或 pop 的操作時,用另一個陣列依序存目前 stack pop 出來的所有元素,操作結果後再依序新增回去,時間及空間複雜度皆為 O(N)(無實作)
\n思維二:使用兩個 stack 來操作存取,當有 peek 或 pop 的操作時,從 out_stack 拿取,判斷 out_stack 為空時再一次性的把當前 in_stack 的所有元素倒進 out_stack\n\n代碼:\n```python\nclass MyQueue(object):\n\n def __init__(self):\n self.in_stack = []\n self.out_stack = []\n \n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n self.in_stack.append(x)\n \n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack.pop()\n \n def peek(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack[-1]\n \n def empty(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n return not (self.in_stack + self.out_stack)\n```\n時間複雜度:O(1) (Amortized)\n\n空間複雜度:O(N)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3096165781","body":"思維:\n1. 空串列直接回傳\n2. 先計算鏈結長度 length\n3. 把 k 對 length 取餘,因為旋轉 length 次等於沒動\n4. 用兩個指針 slow 和 fast 找到新的頭 new_head 的位置\n5. 將鏈結斷開重新連接,完成旋轉\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode(object):\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution(object):\n def rotateRight(self, head, k):\n \"\"\"\n :type head: Optional[ListNode]\n :type k: int\n :rtype: Optional[ListNode]\n \"\"\"\n if not head: \n return head\n\n length = 1\n temp = head\n while temp.next:\n length += 1\n temp = temp.next\n\n slow, fast = head, head\n for _ in range(k % length):\n if fast.next:\n fast = fast.next\n else:\n fast = head\n\n if slow == fast: \n return head\n\n while fast.next:\n slow = slow.next\n fast = fast.next\n\n new_head = slow.next\n slow.next = None\n fast.next = head\n return new_head\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100848058","body":"思維:先處理無需交換的情況,透過一個 dummy 節點統一處理頭節點與後續節點的交換邏輯,每次迴圈交換一對相鄰節點,並用 pre 將已處理區與未處理區銜接起來,最後回傳 dummy 的下一個節點作為新鏈表的頭\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if not head or not head.next:\n return head\n\n left = head\n right = head.next\n dummy = ListNode(None, head)\n pre = dummy\n while right:\n left.next = right.next\n right.next = left\n pre.next = right\n pre = left\n left = left.next\n right = left.next if left else None\n\n return dummy.next\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109165432","body":"思維:有想到要計算遞迴的中心點,但一開始解不出來,參考官方題解的思路加上畫圖後思路有比較清晰\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode(object):\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution(object):\n def sortedListToBST(self, head):\n \"\"\"\n :type head: Optional[ListNode]\n :rtype: Optional[TreeNode]\n \"\"\"\n if not head:\n return head\n\n pre, slow, fast = None, head, head\n while fast and fast.next:\n fast = fast.next.next\n pre = slow\n slow = slow.next\n if pre:\n pre.next = None\n\n node = TreeNode(slow.val)\n if slow == fast:\n return node\n \n node.left = self.sortedListToBST(head)\n node.right = self.sortedListToBST(slow.next)\n return node\n```\n時間複雜度:O(NlogN)\n\n空間複雜度:O(logN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112948103","body":"思維:\n1. 使用兩個指標 a 和 b,分別從 headA 和 headB 開始走。\n2. 每當指標走到自己 linked list 的結尾時,跳到另一條 linked list 的頭部繼續走。\n3. 最終:
\n a. 若兩條 list 有交點,a 和 b 會在同一個節點交會(因為走過的總長度相同)。
\n b. 若沒有交點,a 和 b 都會變成 None,同時結束迴圈。\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, x):\n# self.val = x\n# self.next = None\n\nclass Solution:\n def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:\n a, b = headA, headB\n a_switch, b_switch = False, False\n \n while a and b:\n if a == b:\n return a\n\n a = a.next if a.next else None\n if not a and not a_switch:\n a = headB\n a_switch = True\n \n b = b.next if b.next else None\n if not b and not b_switch:\n b = headA\n b_switch = True\n\n return None\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3114228960","body":"思維:使用快慢指針來偵測是否有環存在,若有找到相遇點的話,把 fast 指針重新指向 head 後找環的起點,兩個指針 slow 和 fast 都改成一次走一步,再次相遇時就是環的起始節點\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, x):\n# self.val = x\n# self.next = None\n\nclass Solution:\n def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if not head or not head.next:\n return None\n\n slow, fast = head, head\n while fast:\n slow = slow.next\n fast = fast.next.next if fast.next else None\n if slow and slow == fast:\n fast = head \n while fast != slow:\n fast = fast.next\n slow = slow.next\n return fast\n\n return None\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3122031171","body":"思維:使用雙向鏈表搭配 Hash Map 實作 LRU Cache,讓每次的 get 和 put 操作都能在 O(1) 時間內完成。最近使用的節點會被移到鏈表頭部,當容量超過時,就從尾部刪除最久未使用的節點。\n\n代碼:\n```python\nclass ListNode:\n def __init__(self, key, value):\n self.key = key\n self.val = value\n self.next = None\n self.pre = None\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.capacity = capacity\n self.length = 0\n self.head = ListNode(None, None)\n self.tail = ListNode(None, None)\n self.head.next = self.tail\n self.tail.pre = self.head\n self.map = {}\n\n def _add_to_head(self, key: int, value: int):\n node = ListNode(key, value)\n node.next = self.head.next\n self.head.next = node\n node.next.pre = node\n node.pre = self.head\n self.map[key] = node\n self.length += 1\n\n def _remove_from_tail(self, key: int):\n remove_key = self.tail.pre.key\n self.tail.pre = self.tail.pre.pre\n self.tail.pre.next = self.tail\n self.map.pop(remove_key)\n self.length -= 1\n\n def _move_node_to_head(self, node: ListNode):\n node.pre.next = node.next\n node.next.pre = node.pre\n self.head.next.pre = node\n node.pre = self.head\n node.next = self.head.next\n self.head.next = node\n \n def get(self, key: int) -> int:\n if key in self.map:\n node = self.map[key]\n self._move_node_to_head(node)\n return self.map[key].val\n return -1\n \n def put(self, key: int, value: int) -> None:\n node = self.map.get(key)\n if node:\n self._move_node_to_head(node)\n node.val = value\n else:\n if self.length >= self.capacity:\n self._remove_from_tail(key) \n self._add_to_head(key, value)\n```\n時間複雜度:O(1)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124493359","body":"思維:DFS,透過遞迴分別計算左右子樹的最大深度,然後回傳較大的一邊再加 1(代表當前節點這一層),最終得到整棵樹的最大深度。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def maxDepth(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n return max(self.maxDepth(root.left), self.maxDepth(root.right))+1\n```\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127762191","body":"思維:DFS,透過遞歸比對兩棵樹的每個對應節點是否完全一樣,一層層往下檢查,直到整棵樹都比對完或中途不符合就結束。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if not p and not q:\n return True\n \n if p and q and p.val == q.val:\n res_left = self.isSameTree(p.left, q.left)\n res_right = self.isSameTree(p.right, q.right)\n return res_left and res_right\n\n return False\n```\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3133090654","body":"思維:DFS,透過遞歸保存當前數字的狀態,每走到下一層就把目前的 current_num 乘上 10 再加上當前節點的值,當走到葉子節點時就可以回傳目前這條路徑的數字,最後把左右子樹的 dfs 結果加總起來。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n def dfs(node, current_num):\n if not node:\n return 0\n current_num = current_num * 10 + node.val\n if not node.left and not node.right:\n return current_num\n return dfs(node.left, current_num) + dfs(node.right, current_num)\n return dfs(root, 0)\n```\n時間複雜度:O(N)\n\n空間複雜度:O(d) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135855226","body":"思維一:BFS,使用廣度優先搜尋一層層遍歷二元樹節點,並記錄每一層最先遇到的節點。每當進入新的一層,就更新目前儲存的節點為該層最左側的節點。最終回傳的是最底層最左邊那個節點的值。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n q = deque()\n res = (root,0)\n q.append((root,0))\n while q:\n node, level = q.popleft()\n cur_level = res[1]\n if level > cur_level:\n res = (node, level)\n\n if node.left:\n q.append((node.left, level+1))\n if node.right:\n q.append((node.right, level+1))\n\n return res[0].val\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(w) (max width of tree)\n\n---------\n思維二:DFS,使用深度優先搜尋遍歷整顆樹,每當遇到更深層的節點,就更新目前記錄的最左邊節點值,最終返回的是整棵樹最深層最左邊的節點值。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n def dfs(node, cur_depth, leftmost, depthest):\n if cur_depth > depthest:\n leftmost = node.val\n depthest = cur_depth\n\n if node.left:\n leftmost, depthest = dfs(node.left, cur_depth+1, leftmost, depthest)\n if node.right:\n leftmost, depthest = dfs(node.right, cur_depth+1, leftmost, depthest)\n return leftmost, depthest\n\n leftmost, depthest = dfs(root, 1, root.val, 1)\n return leftmost\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max height of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3140470104","body":"思維一:DFS
\nserialize: 使用 前序遍歷(DFS) 將樹的結構與節點值轉成 list,再轉為 JSON 字串,None 用來記錄空節點保證可逆。
\ndeserialize: 根據前序順序,遇到 None 表示空節點,遞迴還原出整棵樹的結構。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n def dfs(node):\n if not node:\n res.append(None)\n return\n\n res.append(node.val)\n dfs(node.left)\n dfs(node.right)\n\n dfs(root)\n return json.dumps(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n data = deque(json.loads(data))\n def dfs(data):\n val = data.popleft()\n if val is None:\n return\n\n node = TreeNode(val)\n node.left = dfs(data)\n node.right = dfs(data)\n return node\n \n return dfs(data)\n\n# Your Codec object will be instantiated and called as such:\n# ser = Codec()\n# deser = Codec()\n# ans = deser.deserialize(ser.serialize(root))\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)\n\n-----------------\n\n思維二:BFS
\nserialize:利用 BFS(層序遍歷)將每層節點值與空位(None)一起寫入 list,最後轉成 JSON 字串。
\ndeserialize:讀回字串後同樣使用 BFS,按順序建立節點並接上左右子節點,重建出原始二叉樹。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n queue = deque([root])\n while queue:\n node = queue.popleft()\n if node:\n res.append(node.val)\n queue.append(node.left)\n queue.append(node.right)\n else:\n res.append(None)\n\n return json.dumps(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n data = deque(json.loads(data))\n root_val = data.popleft()\n if root_val is None:\n return None\n \n root = TreeNode(root_val)\n queue = deque([root])\n while queue:\n node = queue.popleft()\n if data:\n left_val = data.popleft()\n right_val = data.popleft()\n if left_val is not None:\n left_node = TreeNode(left_val)\n node.left = left_node\n queue.append(left_node)\n if right_val is not None:\n right_node = TreeNode(right_val)\n node.right = right_node\n queue.append(right_node)\n\n return root\n\n# Your Codec object will be instantiated and called as such:\n# ser = Codec()\n# deser = Codec()\n# ans = deser.deserialize(ser.serialize(root))\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148593193","body":"思維:\n1. 對每個點 i 當作中心,計算它與所有其他點的距離\n2. 用 distance_map 統計,有多少個點與 i 的距離相同(也就是距離為 d 的點出現了幾次)\n3. 如果某個距離出現了 count 次(基本上就是超過一次的次數才會被納入計算),就能組出 count * (count - 1) 種 (j, k) boomerang(因為 (j, k), (k, j) 視為兩種組合,(count - 1) 為要扣掉已經放在前一個位置的元素)\n4. 最後把所有距離的組合數加總起來即可\n\n代碼:\n```python\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n res = 0\n for i, x in enumerate(points):\n distance_map = defaultdict(int)\n for j, y in enumerate(points):\n if i != j:\n distance_map[(y[0] - x[0])**2 + (y[1] - x[1])**2] += 1\n\n for count in distance_map.values():\n res += count * (count-1)\n\n return res\n```\n時間複雜度:O(N^2)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153175756","body":"思維:\n1. 使用雙指針 left 和 right 維護一個「不含重複字元的滑動視窗」\n2. 不斷將 right 指向的字元加入 seen\n3. 一旦發現重複字元,就從 left 開始依序從 seen 移除字元,直到這個重複字元被清掉\n4. 每次 right 移動後,更新視窗大小 right - left,維護一個最大值 max_str\n\n代碼:\n```python\nclass Solution:\n def lengthOfLongestSubstring(self, s: str) -> int:\n max_str = 0\n left = 0\n right = 0\n seen = set()\n while right < len(s):\n while s[right] in seen:\n seen.remove(s[left])\n left += 1\n seen.add(s[right])\n right += 1\n max_str = max(max_str, right-left)\n return max_str\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k) (k for number of character types)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160705635","body":"思維:\n1. 多組偏移掃描:使用 i in range(word_len) 對字串做「分組」掃描,防止錯過合法起始點\n2. 滑動視窗掃描:每次從 j 開始擷取一個單字(長度 word_len),如果這個字在 words 裡,放進 window_counter,若某個單字超出次數,移動 left(左指針)來縮小視窗,如果視窗內剛好有 word_count 個單字,加入結果\n3. 如果不是合法單字,清空 window_counter,重設 count 和 left(下一次從這個位置繼續)\n\n代碼:\n```python\nclass Solution:\n def findSubstring(self, s: str, words: List[str]) -> List[int]:\n word_len = len(words[0])\n word_count = len(words)\n total_len = word_len * word_count\n target_counter = Counter(words)\n res = []\n\n for i in range(word_len):\n left = i\n window_counter = Counter()\n count = 0\n\n for j in range(i, len(s) - word_len + 1, word_len):\n word = s[j:j+word_len]\n if word in target_counter:\n window_counter[word] += 1\n count += 1\n\n while window_counter[word] > target_counter[word]:\n left_word = s[left:left+word_len]\n window_counter[left_word] -= 1\n count -= 1\n left += word_len\n\n if count == word_count:\n res.append(left)\n\n else:\n window_counter.clear()\n count = 0\n left = j + word_len\n\n return res\n```\n時間複雜度:O(N × W) (N is length of s, W is length of words)\n\n空間複雜度:O(W)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166506559","body":"思維:使用快慢指標 (two pointers) 技巧,設兩個指標 slow 和 fast 同時指向鏈表頭,每次 slow 走一步、fast 走兩步,當 fast 到達鏈表尾時,slow 正好在中間節點。\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n\n return slow \n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172494360","body":"思維:使用雙指針來實行二分搜尋法,設定左右邊界取中間位置\n1. 如果 nums[mid] == target,直接回傳 mid(找到目標)。\n2. 如果 nums[mid] > target,代表目標在左半邊,更新 right = mid - 1。\n3. 如果 nums[mid] < target,代表目標在右半邊,更新 left = mid + 1。\n4. 迴圈結束後(left > right),left 就是目標應插入的位置。\n\n代碼:\n```python\nclass Solution:\n def searchInsert(self, nums: List[int], target: int) -> int:\n left = 0\n right = len(nums)-1\n while left <= right:\n mid = (left+right)//2\n if nums[mid] == target:\n return mid\n elif nums[mid] > target:\n right = mid-1\n else:\n left = mid+1\n return left\n```\n時間複雜度:O(logN)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173687770","body":"思維:使用單調遞減隊列來維護視窗內最大值的 index\n1. 前 k 個元素先初始化隊列:維持隊列的遞減性,每次新來的元素會移除尾部比它小的元素,q[0] 永遠是最大值的 index\n2. 接下來從 k 到結尾,維持單調性並移除過期元素:新元素進來時維持單調隊列,移除滑出視窗的 index,每次把 nums[q[0]](視窗最大值)加入結果\n\n代碼:\n```python\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n res = []\n q = deque()\n for i in range(k):\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n res.append(nums[q[0]])\n\n for i in range(k, len(nums)):\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n while q[0] <= i-k:\n q.popleft()\n res.append(nums[q[0]])\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178842909","body":"思維:\n1. 使用兩個表分別紀錄信任他人及被信任的計數\n2. 之後尋找一個人 x,滿足:trusted_tables[x] == n - 1(被其他人信任)以及 trust_tables[x] == 0:(自己沒信任任何人)\n3. 若找到這樣的人,回傳他的編號;否則回傳 -1\n\n代碼:\n```python\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n if n == 1:\n return 1\n\n trust_tables = defaultdict(int)\n trusted_tables = defaultdict(int)\n for [trust_a, trust_b] in trust:\n trust_tables[trust_a] += 1\n trusted_tables[trust_b] += 1\n\n for trusted_person, trusted_ticket in trusted_tables.items():\n if trusted_ticket == n-1 and trust_tables[trusted_person] == 0:\n return trusted_person\n return -1\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3188960333","body":"思維:\n1. 把沒群組的 item 分配新的唯一群組:這樣後面只需處理群組 id,不用特別分支處理 -1。\n2. 建立 item graph:由 prev -> curr(prev 必須在 curr 前面)。\n3. 建立 group graph:當 prev 與 curr 屬不同群組時,建立 g_prev -> g_curr 的依賴邊;用 set 避免重複邊。\n4. 對 group graph 做拓撲排序:得出 group 的一個合法順序;若有 cycle,無解回 []。\n5. 對 item graph 做拓撲排序:得出 items 在全域上的合法相對順序(若有 cycle,無解回 [])。\n6. 把 items 按 item_order 分桶到對應 group,再按 group_order 串接:同 group items 會連在一起且保持 item 之間的依賴。\n\n代碼:\n```python\nclass Solution:\n def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:\n new_group_id = m\n for i in range(n):\n if group[i] == -1:\n group[i] = new_group_id\n new_group_id += 1\n total_groups = new_group_id\n\n item_adj = [[] for _ in range(n)]\n item_indeg = [0] * n\n\n group_adj = [[] for _ in range(total_groups)]\n group_indeg = [0] * total_groups\n\n added_group_edges = set()\n\n for curr in range(n):\n for prev in beforeItems[curr]:\n item_adj[prev].append(curr)\n item_indeg[curr] += 1\n\n g_prev = group[prev]\n g_curr = group[curr]\n if g_prev != g_curr:\n if (g_prev, g_curr) not in added_group_edges:\n added_group_edges.add((g_prev, g_curr))\n group_adj[g_prev].append(g_curr)\n group_indeg[g_curr] += 1\n\n def topo_sort(num_nodes, adj, indeg):\n q = deque([i for i in range(num_nodes) if indeg[i] == 0])\n order = []\n while q:\n u = q.popleft()\n order.append(u)\n for v in adj[u]:\n indeg[v] -= 1\n if indeg[v] == 0:\n q.append(v)\n if len(order) == num_nodes:\n return order\n else:\n return []\n\n group_order = topo_sort(total_groups, group_adj, group_indeg[:])\n if not group_order:\n return []\n\n item_order = topo_sort(n, item_adj, item_indeg[:])\n if not item_order:\n return []\n\n items_by_group = defaultdict(list)\n for item in item_order:\n items_by_group[group[item]].append(item)\n\n result = []\n for g in group_order:\n result.extend(items_by_group[g])\n\n return result\n```\n時間複雜度:O(n + E)\n\n空間複雜度:O(n + m + E)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3191064414","body":"思維:依照題意模擬路徑\n\n代碼:\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n spot = [0, 0]\n for move in moves:\n if move == 'R':\n spot[0] += 1\n elif move == 'L':\n spot[0] -= 1\n elif move == 'U':\n spot[1] += 1\n else:\n spot[1] -= 1\n \n return spot == [0, 0]\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194164140","body":"思維:\n1. 解析登入、登出時間(時、分),如果登出時間早於登入時間,代表跨過午夜就加 24 小時。\n2. 重新計算登入時間:向上取整到最近的 15 分鐘倍數(因為要等到下一個完整的 15 分鐘才算開始一局)。\n3. 重新計算登出時間:向下取整到最近的 15 分鐘倍數(因為超過的部分不算完整一局)。\n4. 計算完整局數,如果結果為負數則返回 0。\n\n這裡用 (logout_hour-login_hour)*4 - login_minute/15 + logout_minute/15 直接換算成以「15 分鐘為單位」的差距。\n\n代碼:\n```python\nclass Solution:\n def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:\n login_hour, login_minute = map(int, loginTime.split(':'))\n logout_hour, logout_minute = map(int, logoutTime.split(':'))\n if logout_hour < login_hour or logout_hour == login_hour and logout_minute < login_minute:\n logout_hour += 24\n\n login_hour, login_minute = self.narrow_down_time(login_hour, login_minute, True)\n logout_hour, logout_minute = self.narrow_down_time(logout_hour, logout_minute, False)\n\n return max(0, int((logout_hour-login_hour)*4 - login_minute/15 + logout_minute/15))\n\n def narrow_down_time(self, login_hour: int, login_minute: int, is_login: bool):\n if is_login:\n login_minute = ceil(login_minute/15) * 15\n if login_minute == 60:\n login_hour += 1\n login_minute = 0\n else:\n login_minute = floor(login_minute/15) * 15\n\n return login_hour, login_minute\n```\n時間複雜度:O(1)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3196258303","body":"思維:\n1. 函式 compare_less(a_counter, b_counter):模擬條件 1、2,對所有可能分界點 ch(從 'b' 到 'z')進行遍歷
\n讓 a 的所有字母 < ch,讓 b 的所有字母 ≥ ch,使用 prefix sum 避免重複運算,計算出最少需要修改的字元數\n2. 函式 compare_distinct(a_counter, b_counter):模擬條件 3,讓兩字串變成同一種字母
\n對所有字母出現次數總和 Counter 做合併,找出現次數最多的字母後,將其餘字母通通改成這個字母,修改次數 = 總數量 - 該字母出現次數\n3. 分別計算三個條件需要的修改次數,回傳三者中的最小值\n\n代碼:\n```python\nclass Solution:\n def minCharacters(self, a: str, b: str) -> int:\n a_counter = Counter(ord(ch) for ch in a)\n b_counter = Counter(ord(ch) for ch in b)\n\n goal_a = self.compare_less(a_counter, b_counter)\n goal_b = self.compare_less(b_counter, a_counter)\n goal_c = self.compare_distinct(a_counter, b_counter)\n return min(goal_a, goal_b, goal_c)\n\n def compare_less(self, a_counter, b_counter):\n a_freq = [0] * 26\n b_freq = [0] * 26\n for k, v in a_counter.items():\n a_freq[k - ord('a')] = v\n for k, v in b_counter.items():\n b_freq[k - ord('a')] = v\n\n a_prefix = list(itertools.accumulate(a_freq))\n b_prefix = list(itertools.accumulate(b_freq))\n move = float('inf')\n for ch in range(1, 26):\n move_a = a_prefix[25] - a_prefix[ch-1]\n move_b = b_prefix[ch-1]\n move = min(move, move_a + move_b)\n return move\n\n def compare_distinct(self, a_counter, b_counter):\n all_counter = a_counter + b_counter\n most_key = max(all_counter, key=all_counter.get)\n total = sum(all_counter.values())\n return total - all_counter[most_key]\n```\n時間複雜度:O(n+m)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3201266614","body":"思維:先把所有數字用 heappush 丟進最小堆,維護「父節點 ≤ 子節點」,接著每次 heappop 拿走堆頂(最小值),直到堆空,收集出來的數列 res 就是升序排序。\n\n代碼:\n```python\nclass Solution:\n def sortArray(self, nums: List[int]) -> List[int]:\n min_heap = []\n res = []\n for num in nums:\n self.heappush(min_heap, num)\n\n while min_heap:\n res.append(self.heappop(min_heap))\n\n return res\n \n def heappush(self, h, x):\n h.append(x)\n i = len(h)-1\n\n while i > 0:\n p = (i - 1) // 2\n if h[i] < h[p]:\n h[i], h[p] = h[p], h[i]\n i = p\n else:\n break\n\n def heappop(self, h):\n last = h.pop()\n if not h:\n return last\n root = h[0]\n h[0] = last\n i = 0\n n = len(h)\n while True:\n left = 2*i + 1\n right = 2*i + 2\n if left >= n:\n break\n\n child = left\n if right < n and h[right] < h[left]:\n child = right\n if h[child] < h[i]:\n h[i], h[child] = h[child], h[i]\n i = child\n else:\n break\n return root\n```\n時間複雜度:O(n log n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204542831","body":"思維:使用二分搜尋法,對於 x ≥ 2 的情況,設定搜尋範圍為 [1, x // 2],如果 mid^2 太大,就向左縮小範圍,如果太小,就向右移動範圍,當搜尋結束(left > right)時,right 就是最接近但不超過 √x 的整數\n\n代碼:\n```python\nclass Solution:\n def mySqrt(self, x: int) -> int:\n if x < 2:\n return x\n \n left, right = 1, x // 2\n while left <= right:\n mid = (left + right) // 2\n if mid * mid == x:\n return mid\n elif mid * mid > x:\n right = mid - 1\n else:\n left = mid + 1\n\n return right\n```\n時間複雜度:O(log x)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3211104911","body":"思維:使用二分搜尋法,如果 mid 是壞的:可能是答案,但還要往左找,right = mid - 1,如果 mid 是好的:答案一定在右邊,left = mid + 1,最後 left 會停在第一個壞版本的位置。\n\n代碼:\n```python\nclass Solution:\n def firstBadVersion(self, n: int) -> int:\n left, right = 1, n\n while left <= right:\n mid = (left + right) // 2\n if isBadVersion(mid):\n right = mid - 1\n else:\n left = mid + 1\n return left\n```\n時間複雜度:O(log n)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216087383","body":"思維:\n1. 先對加熱器位置排序,才能用二分搜尋快速找到每個房子最近的加熱器\n2. 遍歷每個房子,使用二分搜尋找到第一個 heaters[mid] 大於等於當前 house 的位置(也就是最接近右邊的加熱器)\n3. 再往回看一個位置 heaters[r],也就是最接近左邊的加熱器\n4. 比較左右加熱器距離,選擇較小者\n5. 更新最大加熱半徑(最小距離中的最大值)\n\n代碼:\n```python\nclass Solution:\n def findRadius(self, houses: List[int], heaters: List[int]) -> int:\n res = 0\n heaters.sort()\n \n for house in houses:\n l, r = 0, len(heaters) - 1\n while l <= r:\n mid = (l + r) // 2\n if house <= heaters[mid]:\n r = mid - 1\n else:\n l = mid + 1\n\n l_res, r_res = inf, inf\n if 0 <= l <= len(heaters)-1:\n l_res = abs(heaters[l] - house)\n if 0 <= r <= len(heaters)-1:\n r_res = abs(heaters[r] - house)\n\n res = max(res, min(l_res, r_res))\n\n return res\n```\n時間複雜度:O(M log M + N log M) (M for length of heaters, N for length of houses)\n\n空間複雜度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3223499698","body":"思維:先初始化前 k 個字元中有多少母音,用滑動視窗維持長度為 k 的區間往右滑動,每次移動一格,視窗左邊出去一個字元、右邊進來一個字元,如果左邊移出的是母音即減 1,如果右邊移入的是母音即加 1,並且更新最大值,直到滑到最後一格為止\n\n代碼:\n```python\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n vowels = set('aeiou')\n count = sum(1 for c in s[:k] if c in vowels)\n max_count = count\n\n for i in range(k, len(s)):\n if s[i-k] in vowels:\n count -= 1\n if s[i] in vowels:\n count += 1\n max_count = max(max_count, count)\n\n return max_count\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3227824002","body":"思維:\n1. 邊界判斷:若 k == 0,不會抽牌,分數永遠是 0,且一定 ≤ n,直接回傳 1.0。若 n ≥ k + maxPts - 1,最多只能拿到 k - 1 + maxPts 分,而這些都 ≤ n,直接回傳 1.0\n2. 初始化:建立一個長度 n + 1 的 dp 陣列,dp[i] 表示拿到 i 分的機率,設定 dp[0] = 1.0(初始在 0 分),window_sum = 1.0 表示 dp[0] 的值,res = 0.0,用來累加最終結果(分數 ≥ k 的機率)\n3. 進入迴圈,從 i = 1 到 n:使用滑動視窗平均法計算 dp[i] = window_sum / maxPts,如果 i < k 代表還會繼續抽牌 → 將 dp[i] 加入 window_sum,影響後續機率,如果 i ≥ k,代表不能再抽牌了 → 將 dp[i] 加入 res,因為這是可能的最終分數\n4. 維護滑動視窗:若 i - maxPts ≥ 0,將前方的 dp[i - maxPts] 從 window_sum 中扣除,保持視窗大小為 maxPts\n5. 迴圈結束後,回傳累積的結果:回傳 res,即所有停在 k 到 n 分的總機率\n\n代碼:\n```python\nclass Solution:\n def new21Game(self, n: int, k: int, maxPts: int) -> float:\n if k == 0 or n >= k + maxPts - 1:\n return 1\n \n dp = [0.0] * (n + 1)\n dp[0] = 1.0\n window_sum = 1.0\n res = 0.0\n\n for i in range(1, n + 1):\n dp[i] = window_sum / maxPts\n if i < k:\n window_sum += dp[i]\n else:\n res += dp[i]\n\n if i - maxPts >= 0:\n window_sum -= dp[i-maxPts]\n\n return res\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3232431244","body":"思維:透過固定長度為 len(p) 的滑動視窗掃過整個字串 s,用 Counter 統計當前視窗的字元分佈\n1. 初始化兩個 Counter:target 記錄 p 的字元分佈,cur 動態維護視窗內的字元分佈\n2. 向右移動右指標 r 更新 cur,每次移動後如果 cur == target,代表此視窗是一個 anagram,res 加入 l\n3. 視窗長度若達到 len(p),就縮左邊,如果左邊的字元也在 p 中,從 cur 中減一,移動左指標 l,確保視窗長度維持為 len(p)\n\n代碼:\n```python\nclass Solution:\n def findAnagrams(self, s: str, p: str) -> List[int]:\n res = []\n target = Counter(p)\n cur = Counter()\n l, r = 0, 0\n\n while r < len(s):\n if s[r] in p:\n cur[s[r]] += 1\n \n if cur == target:\n res.append(l)\n\n r += 1\n if r - l >= len(p):\n if s[l] in p:\n cur[s[l]] -= 1\n l += 1\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235535873","body":"思維:\n1. 使用 target 記錄 t 中每個字元需要出現幾次,required 為需要達成的字元種類數,formed 表示目前有多少種字元達到目標需求\n2. 用滑動視窗 [l, r] 掃過 s\n3. 視窗內使用 cur 統計目前出現的字元次數\n4. 每當 formed == required(即目前視窗內已滿足所有字元需求),就嘗試更新最短子字串\n5. 然後移動左指標 l,直到不再滿足條件,再往右擴張 r\n\n代碼:\n```python\nclass Solution:\n def minWindow(self, s: str, t: str) -> str:\n if not s or not t or len(t) > len(s):\n return ''\n\n res = ''\n target = Counter(t)\n cur = Counter()\n required = len(target)\n formed = 0\n l = 0\n\n for r in range(len(s)):\n char = s[r]\n if char in target:\n cur[char] += 1\n if cur[char] == target[char]:\n formed += 1\n\n while formed == required:\n window = s[l:r+1]\n if not res or len(window) < len(res):\n res = window\n\n if s[l] in target:\n cur[s[l]] -= 1\n if cur[s[l]] < target[s[l]]:\n formed -= 1\n l += 1\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3241211135","body":"思維:\n1. 每一層遞迴代表一個 row(橫列),每一層嘗試在該 row 的每一個 col(直行)上放一個 Q\n2. 使用三個集合記錄不能放的位置(剪枝):used_cols:欄位不能重複、used_diag1:↘ 對角線(row - col)不能重複、used_diag2:↙ 對角線(row + col)不能重複\n3. 如果當前格子合法:將當前 col 與對角線加入對應集合,進入下一 row 繼續放皇后\n4. 如果成功放到第 n 行,代表一種合法放法,count += 1\n5. 每個回合結束後回溯:移除當前狀態,嘗試下一個 col\n\n代碼:\n```python\nclass Solution:\n def totalNQueens(self, n: int) -> int:\n count = 0\n\n def backtracking(row, used_cols, used_diag1, used_diag2):\n if row == n:\n nonlocal count \n count += 1\n return\n\n for col in range(n):\n if col in used_cols or row - col in used_diag1 or row + col in used_diag2:\n continue\n \n used_cols.add(col)\n used_diag1.add(row - col)\n used_diag2.add(row + col)\n\n backtracking(row + 1, used_cols, used_diag1, used_diag2)\n\n used_cols.remove(col)\n used_diag1.remove(row - col)\n used_diag2.remove(row + col)\n\n backtracking(0, set(), set(), set())\n\n return count\n```\n時間複雜度:O(n!)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3244207256","body":"思維:深度優先搜尋(DFS)\n1. 初始化變數: seen 避免重複拜訪相同格子、max_area記錄最大島嶼面積\n2. 走過整張地圖: 雙層 for loop,遍歷每一格 (i, j)\n3. 找到新的島嶼起點就 DFS: 如果是還沒拜訪過的陸地,就從這裡開始 DFS,算面積,回傳面積後更新 max_area\n4. DFS 拜訪所有相連陸地: 每次進來的 (row, col) 都會標記為已拜訪,area = 1 表示這一格自己先算進面積\n5. 遞迴搜尋上下左右的相連格子: 檢查鄰近 4 格是否可以繼續走,遞迴地累加 area\n6. DFS 結束後回傳這座島的面積\n\n代碼:\n```python\nclass Solution:\n direction = [(1, 0), (-1, 0), (0, 1), (0, -1)]\n\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n seen = set()\n max_area = 0\n for i in range(len(grid)):\n for j in range(len(grid[0])):\n if grid[i][j] == 1 and (i, j) not in seen:\n area = self.dfs(i, j, seen, grid)\n max_area = max(max_area, area)\n \n return max_area\n\n def dfs(self, row, col, seen, grid):\n seen.add((row, col))\n area = 1\n for dx, dy in self.direction:\n x, y = row + dx, col + dy\n if 0 <= x < len(grid) and 0 <= y < len(grid[0]) and grid[x][y] == 1 and (x, y) not in seen:\n area += self.dfs(x, y, seen, grid)\n \n return area\n```\n時間複雜度:O(m × n)\n\n空間複雜度:O(m × n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249687017","body":"思維:多源 BFS\n1. 把所有的陸地格(值為 1)當作起點,加入 queue 中\n2. 先判斷若陸地為空(全是水)或全是陸地,回傳 -1\n3. BFS 擴展每一層水格:每次從 queue 拿一個格子出來,對四個方向進行探索,如果是水(值為 0),就更新它為「距離 = 前一格 + 1」,並將它加入 queue,等下繼續擴展\n4. 最後回傳最大距離 -1:因為初始的陸地值是 1,所以水格的距離是從 2 開始計算,因此真正的距離 = 格子值 - 1\n\n代碼:\n```python\nclass Solution:\n def maxDistance(self, grid: List[List[int]]) -> int:\n q = deque()\n for i in range(len(grid)):\n for j in range(len(grid[0])):\n if grid[i][j] == 1:\n q.append((i, j))\n \n if not q or len(q) == len(grid) * len(grid):\n return -1\n\n directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]\n max_dist = 0\n while q:\n x, y = q.popleft()\n for dx, dy in directions:\n nx = x + dx\n ny = y + dy\n if 0 <= nx < len(grid) and 0 <= ny < len(grid[0]) and grid[nx][ny] == 0:\n grid[nx][ny] = grid[x][y] + 1\n q.append((nx, ny))\n max_dist = max(max_dist, grid[nx][ny])\n\n return max_dist - 1\n```\n時間複雜度:O(n^2)\n\n空間複雜度:O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251575584","body":"思維:\n1. 把初始擁有箱子(initialBoxes)能打開的箱子(status = 1)加入 queue\n2. 使用 queue 處理可以打開的箱子,如果已經處理過的話則跳過\n3. 開箱拿糖果後,處理新拿到的箱子鑰匙,把鑰匙對應到已擁有且未開啟過的 box 加入 queue\n4. 處理新拿到的箱子,如果箱子可以直接打開或擁有鑰匙就加進 queue,否則放進 own_boxes 等待日後有拿到 key 再打開\n5. 整個流程直到 queue 為空,表示目前已經沒能力再開更多箱子了,回傳總糖果數量\n\n代碼:\n```python\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n own_boxes = set(initialBoxes)\n own_keys = set()\n visited = set()\n q = deque()\n total_candies = 0\n\n for box in initialBoxes:\n if status[box] == 1:\n q.append(box)\n \n while q:\n box = q.popleft()\n if box in visited:\n continue\n\n total_candies += candies[box]\n visited.add(box)\n \n for key in keys[box]:\n own_keys.add(key)\n if key in own_boxes and key not in visited:\n q.append(key)\n\n for new_box in containedBoxes[box]:\n own_boxes.add(new_box)\n if (status[new_box] == 1 or new_box in own_keys) and new_box not in visited:\n q.append(new_box) \n\n return total_candies\n```\n時間複雜度:O(n+k)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3256863525","body":"思維:\n1. 廣度優先搜尋 (BFS) 遍歷樹,使用 deque 從 root 開始,記錄每個節點的座標\n2. 收集節點資訊,每個節點存成 (x, y, val),加入 nodes 列表\n3. 排序節點,按照題目規則排序:y(由左到右),x(由上到下),val(同位置時數字小的先)\n4. 按列分組,掃描排序後的 nodes,根據 y 值變化劃分列表\n5. 回傳結果,res 即 vertical order traversal 的輸出。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:\n nodes = []\n q = deque([(root, 0, 0)])\n while q:\n node, x, y = q.popleft()\n nodes.append((x, y, node.val))\n if node.left:\n q.append((node.left, x+1, y-1))\n if node.right:\n q.append((node.right, x+1, y+1))\n\n nodes.sort(key=lambda x: (x[1], x[0], x[2]))\n res = []\n cur_y = None\n for _, y, val in nodes:\n if y != cur_y:\n res.append([val])\n cur_y = y\n else:\n res[-1].append(val)\n\n return res\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260998230","body":"思維:\n1. 定義狀態 dp[i] 表示「到達第 i 階的最小花費」\n2. 每次要到達第 i 階,有兩種方式:從第 i-1 階踩一階上來 → 花費 = dp[i-1] + cost[i-1] or 從第 i-2 階踩兩階上來 → 花費 = dp[i-2] + cost[i-2]\n3. 所以取較小值 dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n4. 我們要到達頂樓 = len(cost),因此答案是 dp[-1](即 dp[len(cost)])\n\n代碼:\n```python3\nclass Solution:\n def minCostClimbingStairs(self, cost: List[int]) -> int:\n dp = [0] * (len(cost) + 1)\n for i in range(2, len(cost) + 1):\n dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n\n return dp[-1]\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263817074","body":"思維:\n1. 如果只有一間房子,直接回傳 nums[0]\n2. 初始化 dp 陣列,建立一個長度與 nums 相同的陣列 dp,dp[i] 表示考慮到第 i 間房子時,選擇偷這間房子,能得到的最大金額\n3. 填入前兩個房子:如果 i < 2,直接偷這間房子\n4. 狀態轉移(從 i=2 開始),偷第 i 間房的前提是不能偷相鄰的,所以考慮搭配 i-2 或搭配 i-3 的最佳解\n5. 最後答案一定是偷到倒數第 1 間(dp[-1])或倒數第 2 間(dp[-2]),取最大值\n\n代碼:\n```python\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n if len(nums) == 1:\n return nums[0]\n\n dp = [0] * len(nums)\n for i, num in enumerate(nums):\n if i < 2:\n dp[i] = num\n else:\n dp[i] = max(dp[i-2] + num, dp[i-3] + num)\n\n return max(dp[-1], dp[-2])\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3264481892","body":"思維:\n1. dp[i]: 表示以 nums[i] 結尾的 LIS 最長長度、count[i]: 表示有多少組 LIS 長度等於 dp[i] 是以 nums[i] 結尾的\n2. 對每個 i,檢查它前面的每個 j,如果 nums[j] < nums[i],則可以將 nums[i] 接在 nums[j] 後面\n3. 如果接在 j 後面可以讓序列更長(dp[j] + 1 > dp[i]),則更新 dp[i] = dp[j] + 1,並且把組數設為 count[i] = count[j]\n4. 如果接在 j 後面剛好等長(dp[j] + 1 == dp[i]),則表示找到另一條一樣長的走法,所以把組數加進來 count[i] += count[j]\n5. 最後找出所有 dp[i] == max_len 的位置,把它們對應的 count[i] 加總起來\n\n代碼:\n```python\nclass Solution:\n def findNumberOfLIS(self, nums: List[int]) -> int:\n n = len(nums)\n dp = [1] * n\n count = [1] * n\n\n for i in range(n):\n for j in range(i):\n if nums[j] < nums[i]:\n if dp[j] + 1 > dp[i]:\n dp[i] = dp[j] + 1\n count[i] = count[j]\n elif dp[j] + 1 == dp[i]:\n count[i] += count[j]\n\n max_len = max(dp)\n return sum(c for i, c in enumerate(count) if dp[i] == max_len)\n```\n時間複雜度:O(n^2)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269134596","body":"思維:\n1. 設 dp[i][j] = text1[:i] 與 text2[:j] 的最長共同子序列長度\n2. 如果其中一個字串長度為 0 → LCS = 0,所以 dp[0][*] 和 dp[*][0] 全部設為 0\n3. 如果 text1[i-1] == text2[j-1],這個字元可以加入 LCS → dp[i][j] = dp[i-1][j-1] + 1\n4. 否則這個字元不能同時出現在 LCS,只能丟掉其中一個字元,取兩種情況最大值 → dp[i][j] = max(dp[i-1][j], dp[i][j-1])\n5. 回傳 dp[-1][-1](表格右下角)就是最終答案\n\n代碼:\n```python\nclass Solution:\n def longestCommonSubsequence(self, text1: str, text2: str) -> int:\n m = len(text1)\n n = len(text2)\n dp = [[0]*(n+1) for _ in range(m+1)]\n \n for i in range(1, m+1):\n for j in range(1, n+1):\n if text1[i-1] == text2[j-1]:\n dp[i][j] = dp[i-1][j-1] + 1\n else:\n dp[i][j] = max(dp[i-1][j], dp[i][j-1])\n\n return dp[-1][-1]\n```\n時間複雜度:O(m * n)\n\n空間複雜度:O(m * n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273520377","body":"思維:\n1. 機器人從左上角走到右下角,只能往下或往右,所以每個格子的路徑數 = 從上方來的路徑數 + 從左方來的路徑數\n2. 狀態定義:dp[i][j] = 從起點 (0,0) 到 (i,j) 的路徑數\n3. 初始化所有路徑都是 1,主要是第一行、第一列只能直走一條路徑因此都是 1\n4. dp[i][j] 的路徑數就等於 dp[i−1][j] (從上方來的路徑數) + dp[i][j−1] (從左方來的路徑數)\n5. 最後答案取右下角 dp[m-1][n-1]\n\n代碼:\n```python\nclass Solution:\n def uniquePaths(self, m: int, n: int) -> int:\n dp = [[1] * n for _ in range(m)]\n for i in range(1, m):\n for j in range(1, n):\n dp[i][j] = dp[i-1][j] + dp[i][j-1]\n \n return dp[m-1][n-1]\n```\n時間複雜度:O(m * n)\n\n空間複雜度:O(m * n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3278614246","body":"思維:\n1. 狀態定義:dp[r][c] = 騎士在走了 t 步之後,位於 (r,c) 的機率\n2. 初始化:t=0 時,起點 (row, column) 的機率 = 1.0,其他位置 = 0.0\n3. 狀態轉移:從 (r,c) 出發,分散到 8 個可能位置。每一個合法位置的機率 += dp[r][c] / 8\n4. 重複 k 次:每一步產生新的棋盤機率分佈,並用新的棋盤機率更新 dp 陣列\n5. 回傳答案:把整個棋盤上機率加總,就是騎士還在棋盤上的總機率\n\n代碼:\n```python\nclass Solution:\n def knightProbability(self, n: int, k: int, row: int, column: int) -> float:\n dp = [[0.0] * n for _ in range(n)]\n dp[row][column] = 1.0\n positions = [(-1, 2), (-1, -2), (-2, 1), (-2, -1), (1, 2), (1, -2), (2, 1), (2, -1)]\n\n for i in range(k):\n next_dp = [[0.0] * n for _ in range(n)]\n for r in range(n):\n for c in range(n):\n if dp[r][c] > 0:\n for dr, dc in positions:\n nr, nc = r + dr, c + dc\n if 0 <= nr < n and 0 <= nc < n:\n next_dp[nr][nc] += dp[r][c] / 8.0\n dp = next_dp \n\n return sum(sum(row) for row in dp)\n```\n時間複雜度:O(k * n^2)\n\n空間複雜度:O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3285759121","body":"思維:\n1. 如果 1+2+…+max < desiredTotal → 永遠湊不到目標 → return False\n2. 如果 desiredTotal ≤ maxChoosableInteger → 先手一次就贏 → return True\n3. 用 bitmask mask 記錄哪些數字已被選過,用 remain 記錄距離目標還差多少\n4. 遞迴判斷 (dfs) 嘗試每一個未被選過的數字 num\n5. 如果 num ≥ remain → 我馬上贏 → return True,否則進入新狀態 (new_mask, remain-num),讓對手繼續\n6. 如果對手在新狀態輸(dfs 回 False)→ 我必勝 → return True\n7. 如果沒有任何選擇能讓我贏 → return False\n\n代碼:\n```python\nclass Solution:\n def canIWin(self, maxChoosableInteger: int, desiredTotal: int) -> bool: \n total_sum = (1 + maxChoosableInteger) * maxChoosableInteger / 2\n if total_sum < desiredTotal:\n return False\n if desiredTotal <= maxChoosableInteger:\n return True\n \n @lru_cache(None)\n def dfs(mask, remain):\n for num in range(1, maxChoosableInteger + 1):\n if not mask & (1 << (num-1)):\n if num >= remain:\n return True\n new_mask = mask | (1 << (num-1))\n if not dfs(new_mask, remain - num):\n return True\n return False\n\n return dfs(0, desiredTotal)\n```\n時間複雜度:O(m * 2^m)\n\n空間複雜度:O(2^m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3287665138","body":"思維:\n1. 如果 nums 的總和是奇數,不可能分成兩組相等 → return False\n2. 否則,目標和 = 總和 / 2\n3. 狀態定義:dp[i][j] = 是否可以用前 i 個數字湊出和 j\n4. 初始化:dp[0][0] = True(不用任何數字就能湊出 0),dp[0][j>0] = False(不用數字不可能湊出正數)\n5. 若 j < nums[i-1] → 這個數太大,不能用因此只能 → dp[i][j] = dp[i-1][j]\n6. 若 j ≥ nums[i-1] → 可以選用或不用這個數 → dp[i][j] = dp[i-1][j] or dp[i-1][j - nums[i-1]]\n7. 最後看 dp[n][target],如果 True → 代表能找到一個子集和 = target → 表示 nums 可分成兩組\n\n代碼:\n```python\nclass Solution:\n def canPartition(self, : List[int]) -> bool:\n if sum(nums) % 2 > 0:\n return False\n target = sum(nums) // 2\n\n dp = [[False] * (target + 1) for _ in range(len(nums) + 1)]\n dp[0][0] = True\n for i in range(1, len(nums) + 1):\n for j in range(target + 1):\n if j < nums[i-1]:\n dp[i][j] = dp[i-1][j]\n else:\n dp[i][j] = dp[i-1][j] or dp[i-1][j-nums[i-1]]\n\n return dp[len(nums)][target]\n```\n時間複雜度:O(n * m) (n for length of nums, m for target)\n\n空間複雜度:O(n * m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289413390","body":"思維:\n1. 要找能不能在 nums 前加上 + 或 -,最後湊成 target,等價於找一個子集,使總和 = (sum(nums)+target)/2 = p\n2. 如果 abs(target) > sum → 超過總和,必然無解,如果 sum + target 是奇數 → p 不是整數,也必然無解\n3. 狀態定義:dp[j] = 方法數,表示能湊出和為 j 的子集數量\n4. 初始化:dp[0] = 1 → 空集合能湊出 0 的方法只有 1 種\n5. 狀態轉移:遍歷每個數字 num,倒序更新,如果能湊出 j-num,再加上 num 就能湊出 j\n6. 答案回傳 dp[p],也就是湊出和為 p 的方法數\n\n代碼:\n```python\nclass Solution:\n def findTargetSumWays(self, nums: List[int], target: int) -> int:\n if abs(target) > sum(nums) or (sum(nums) + target) % 2 > 0:\n return 0\n\n p = (sum(nums) + target) // 2\n dp = [0] * (p + 1)\n dp[0] = 1\n for i in range(len(nums)):\n for j in range(p, nums[i]-1, -1):\n dp[j] += dp[j-nums[i]]\n\n return dp[p]\n``` \n時間複雜度:O(n * p) \n\n空間複雜度:O(p)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290383887","body":"思維:\n1. 初始化建立 dp 陣列,長度為 amount+1,全部設成無窮大 inf,代表一開始不可達\n2. 設 dp[0] = 0,表示湊 0 元不需要硬幣\n3. 外層金額 i 從 1 跑到 amount,內層對每個硬幣 coin 嘗試\n4. 如果 i - coin >= 0,表示可用這枚硬幣,更新 dp[i] = min(dp[i], dp[i - coin] + 1) (選湊出 i 元的最少硬幣數,看最後一枚硬幣選哪個面額)\n5. 回傳答案如果 dp[amount] 還是 inf,代表不可達回傳 -1,否則回傳 dp[amount]\n\n代碼:\n```python\nclass Solution:\n def coinChange(self, coins: List[int], amount: int) -> int:\n dp = [inf] * (amount + 1)\n dp[0] = 0\n for i in range(1, amount+1):\n for coin in coins:\n if i - coin >= 0:\n dp[i] = min(dp[i], dp[i - coin]+1)\n \n return dp[amount] if dp[amount] != inf else -1\n```\n時間複雜度:O(m × n) (m for amount, n for length of coins)\n\n空間複雜度:O(m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3299125872","body":"思維:\n1. 昨天的題目需考慮排列數(考慮順序),今天的題目僅需考慮組合數(不考慮順序)\n2. 定義 dp[i] = 湊出金額 i 的 組合數\n3. dp[0] = 1:湊出 0 元只有一種方式,什麼都不拿,其餘 dp[i] = 0,表示一開始還沒有任何組合\n4. 外層迴圈:逐一考慮硬幣 coin,內層迴圈:從金額 coin 開始到 amount 逐步更新\n5. dp[i] += dp[i - coin]:若要湊出金額 i,可以先用一個 coin,剩下的 i - coin 由之前的組合補上\n6. 避免重複排列,因為外層是硬幣,每一種硬幣只能在自己之後加入,確保順序不會被重複計算\n7. 回傳答案 dp[amount] 即為湊出總金額的組合數\n\n代碼:\n```python\nclass Solution:\n def change(self, amount: int, coins: List[int]) -> int:\n dp = [0] * (amount + 1)\n dp[0] = 1\n for coin in coins:\n for i in range(coin, amount+1):\n dp[i] += dp[i - coin]\n\n return dp[amount]\n```\n時間複雜度:O(m × n) (m for amount, n for length of coins)\n\n空間複雜度:O(m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3301195823","body":"思維:\n1. 排序貪心:把 g(貪心值)與 s(餅乾大小)都排序\n2. 從大的開始配對:i 指向最大餅乾,j 指向最難滿足的小孩\n3. 若 s[i] >= g[j],就把這片大餅乾給這個小孩,否則,去嘗試滿足下一個(較不貪心)孩子\n5. 結束條件:任一方用完即停止,輸出成功配對數 res\n\n代碼:\n```python\nclass Solution:\n def findContentChildren(self, g: List[int], s: List[int]) -> int:\n g.sort()\n s.sort()\n i = len(s)-1\n j = len(g)-1\n res = 0\n \n while i >= 0 and j >= 0:\n if s[i] >= g[j]:\n res += 1\n i -= 1\n j -= 1\n\n return res\n```\n時間複雜度:O(nlogn+mlogm) (sorting)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3305048523","body":"思維:\n1. 先依 start 排序,若 start 相同則依 end 排序\n2. 用 prev_end 記錄上一次保留的區間結束\n3. 遍歷:如果當前區間 cur_start < prev_end → 代表重疊\n4. 若 cur_end < prev_end → 保留更早結束的區間(更新 prev_end)\n5. 不管怎樣,重疊就要刪掉一個,res += 1\n6. 否則(不重疊) → 更新 prev_end = cur_end\n7. 回傳刪除數量\n\n代碼:\n```python\nclass Solution:\n def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:\n intervals = sorted(intervals)\n prev_end = intervals[0][1]\n res = 0\n\n for i in range(1, len(intervals)):\n cur_start, cur_end = intervals[i]\n if cur_start < prev_end:\n if cur_end < prev_end:\n prev_end = cur_end\n res += 1\n else:\n prev_end = cur_end\n \n return res\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3310296356","body":"思維:\n1. 初始化設定 farthest = 0,代表目前能到達的最遠位置(初始只能到 index 0)\n2. 遍歷陣列依序檢查每個位置檢查是否可達:i = 當前所在索引,step = 在這個位置能往前跳的最大步數\n3. 如果 i > farthest,表示這個位置已經超過了之前能到的最遠範圍 → 代表根本走不到這裡 → 直接回傳 False\n4. 否則更新最遠範圍 farthest = max(farthest, i + step)\n5. 結束迴圈能完整跑完,代表沒有遇到無法到達的位置,直接回傳 True(一定能到達最後一格)\n\n代碼:\n```python\nclass Solution:\n def canJump(self, nums: List[int]) -> bool:\n farthest = 0\n for i, step in enumerate(nums):\n if i > farthest:\n return False\n farthest = max(farthest, i + step)\n return True\n```\n時間複雜度:O(n)\n\n空間複雜度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/73#issuecomment-3317351262","body":"思維:\n1. Base Case: n=1 → [1]、n=2 → [1,2]\n2. 把問題拆成奇數子問題 (長度 = (n+1)//2) 和偶數子問題 (長度 = n//2),避免等差數列的產生\n3. 奇數組跟偶數組內分別都是從一個更小的 beautiful array 轉換來的,本身不會產生違規的等差數列\n4. 如果一邊是奇數、一邊是偶數,它們的平均數會是小數(不是整數),但我們的陣列只包含整數,不可能命中,所以跨組之間絕對安全\n5. 奇數子問題的結果全部轉換成奇數(2*x-1)\n6. 偶數子問題的結果全部轉換成偶數(2*x)\n7. 把奇數陣列與偶數陣列串接在一起,得到長度 n 的 beautiful array\n\n代碼:\n```python\nclass Solution:\n def beautifulArray(self, n: int) -> List[int]:\n if n == 1:\n return [1]\n if n == 2:\n return [1, 2]\n\n odd_arr = [x*2 -1 for x in self.beautifulArray((n+1) // 2)]\n even_arr = [x*2 for x in self.beautifulArray(n // 2)]\n \n return odd_arr + even_arr\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322731377","body":"思維:\n1. 所有數字 XOR 一遍,因為成對的數字會抵消掉 (a ^ a = 0),最後剩下的是 xor_all = x ^ y\n2. 這裡的 x, y 就是我們要找的兩個只出現一次的數字\n3. 找到一個區分 x, y 的 bit,因為 x != y,xor_all 至少有一個 bit = 1,代表 x 和 y 在那一位不同\n4. 用 diff_bit = xor_all & (-xor_all) 取出最低 set bit (最右邊的 1)\n5. 根據這個 diff_bit 把數字分組,如果 (num & diff_bit) != 0 → 放在組 A,否則 → 放在組 B\n6. 各組再 XOR 一遍,成對數字會互相抵消,只剩下唯一的 x 或 y\n7. 最後兩組結果就是 [x, y]\n\n代碼:\n```python\nclass Solution:\n def singleNumber(self, nums: List[int]) -> List[int]:\n xor_all = 0\n for num in nums:\n xor_all ^= num\n\n diff_bit = xor_all & (-xor_all)\n\n x, y = 0, 0\n for num in nums:\n if num & diff_bit:\n x ^= num\n else:\n y ^= num\n\n return [x, y]\n```\n時間複雜度:O(n)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3326355904","body":"思維:\n1. 把長度為 n 的陣列 nums 想成有 n 個開關(bit),一個整數 mask 的二進位表示,就代表一個子集合,mask 從 0 走到 (1<> i) & 1 == 1,代表第 i 位被選中 → subset.append(nums[i]),最後把 subset 加進 res\n4. 回傳結果 res\n\n代碼:\n```python\nclass Solution:\n def subsets(self, nums: List[int]) -> List[List[int]]:\n n = len(nums)\n res = []\n for mask in range(1 << n):\n subset = []\n for i in range(n):\n if (mask >> i) & 1:\n subset.append(nums[i])\n res.append(subset)\n\n return res\n```\n時間複雜度:O(n · 2^n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3332654533","body":"思維:\n1. TrieNode 結構:children 字典,用來存放「下一個字元 → 子節點」,hasword 標記當前節點是否對應一個完整單詞\n2. Trie 主類別:insert(word) 從 root 出發逐字檢查,若不存在就新建節點,最後節點標記 hasword = True\n3. search(word) 從 root 出發逐字檢查,若遇到缺失字元,直接回傳 False,結束後檢查最後節點的 hasword,若 True 表示單詞存在\n4. startsWith(prefix) 與 search 類似,但不需檢查 hasword,只要能走到 prefix 的最後一個節點就回傳 True\n\n代碼:\n```python\nclass TrieNode:\n def __init__(self):\n self.children = {}\n self.hasword = False\n\n\nclass Trie:\n def __init__(self):\n self.head = TrieNode()\n \n def insert(self, word: str) -> None:\n cur = self.head\n for c in word:\n if c not in cur.children:\n cur.children[c] = TrieNode()\n cur = cur.children[c]\n cur.hasword = True\n\n def search(self, word: str) -> bool:\n cur = self.head\n for c in word:\n if c not in cur.children:\n return False\n cur = cur.children[c]\n\n return cur.hasword\n\n def startsWith(self, prefix: str) -> bool:\n cur = self.head\n for c in prefix:\n if c not in cur.children:\n return False\n cur = cur.children[c]\n return True\n \n\n# Your Trie object will be instantiated and called as such:\n# obj = Trie()\n# obj.insert(word)\n# param_2 = obj.search(word)\n# param_3 = obj.startsWith(prefix)\n```\n時間複雜度:O(n) (Insert, search, startsWith)\n\n空間複雜度:O(n) (Insert) / O(1) (search, startsWith)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3337545631","body":"思維:\n1. TrieNode 結構:children 存子節點,precount 紀錄該節點以下所有 key 對應值的總和(前綴總和),count 紀錄如果這裡是完整單字,記錄它的 value\n2. insert(key, val):逐字往下走,若不存在就新建節點,每走過一個節點 → precount += val(加上新值)\n3. 如果這個 key 之前沒出現過 → 直接存 count = val,如果 key 已經存在 → 先取出舊值 deduct = cur.count,再更新 count = val\n4. 最後重新走一遍 key,把前綴總和扣掉原本的舊值 precount -= deduct\n5. sum(prefix):從 root 開始逐字走 prefix,如果 prefix 路徑不存在 → 回傳 0,如果存在 → 回傳最後節點的 precount\n\n代碼:\n```python\nclass TrieNode:\n def __init__(self):\n self.children = {}\n self.precount = 0\n self.count = 0\n\nclass MapSum:\n\n def __init__(self):\n self.head = TrieNode()\n\n def insert(self, key: str, val: int) -> None:\n cur = self.head\n for c in key:\n if c not in cur.children:\n cur.children[c] = TrieNode()\n cur = cur.children[c]\n cur.precount += val\n\n if not cur.count:\n cur.count = val\n else:\n deduct = cur.count\n cur.count = val\n cur = self.head\n for c in key:\n cur = cur.children[c]\n cur.precount -= deduct\n \n\n def sum(self, prefix: str) -> int:\n cur = self.head\n for c in prefix:\n if c not in cur.children:\n return 0\n cur = cur.children[c]\n return cur.precount\n\n\n# Your MapSum object will be instantiated and called as such:\n# obj = MapSum()\n# obj.insert(key,val)\n# param_2 = obj.sum(prefix)\n```\n時間複雜度:O(n) (Insert, sum)\n\n空間複雜度:O(n) (Insert) / O(1) (sum)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3355772609","body":"思維:\n1. 任何不包含 1 的子樹應該被刪掉,若節點值是 0,且左右子樹都不存在或都被刪光,那這個節點也該刪\n2. 從下往上考慮 → 遞迴後序遍歷 (post-order),先處理左右子樹,回傳「修剪後的子樹」,再決定當前節點要不要刪除\n3. 若節點是 None,直接回傳 None\n4. 遞迴:修剪左子樹 root.left = pruneTree(root.left)、修剪右子樹 root.right = pruneTree(root.right)\n5. 判斷若 root.val == 0 且 root.left == None 且 root.right == None → 回傳 None,否則保留節點\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def pruneTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:\n if not root:\n return None\n\n root.left = self.pruneTree(root.left)\n root.right = self.pruneTree(root.right)\n\n if root.val == 0 and not root.left and not root.right:\n return None\n\n return root\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null],"zechengze":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074243047","body":"### Time complexity\nO(max(n, log₁₀(k)))\n\n### Space complexity\nO(max(n, log₁₀(k)))\n\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n ans = []\n n = len(num)\n carry = 0\n i = n - 1\n while k > 0 or i >= 0 or carry > 0:\n sum = carry\n if k > 0:\n rem = k % 10\n sum += rem\n k //= 10\n if i >= 0:\n sum += num[i]\n i -= 1\n carry = sum // 10\n ans.insert(0, sum % 10)\n return ans","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092419843","body":"使用兩個 stack:\n- in_stack: 用來接收 push\n- out_stack: 用來處理 pop 和 peek\n- 當 out_stack 為空時,將 in_stack 的所有元素彈出並倒序放入 out_stack,用來模擬 queue 的 FIFO\n\n - push:O(1)\n - pop:O(1)\n - peek:O(1)\n - empty :O(1)\n\n---\n\n### Python code\n\n```python\nclass MyQueue:\n\n def __init__(self):\n self.in_stack = []\n self.out_stack = []\n\n def push(self, x: int) -> None:\n self.in_stack.append(x)\n\n def pop(self) -> int:\n self.peek() # 確保 out_stack 有東西\n return self.out_stack.pop()\n\n def peek(self) -> int:\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack[-1]\n\n def empty(self) -> bool:\n return not self.in_stack and not self.out_stack","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109185662","body":"### 解題思路\n- 先統計整個 linked list 長度。\n- 使用遞迴,每次選擇區間的中間當作 root。\n- 左子樹遞迴後才處理當前節點。\n\n時間 O(n) 每個節點遍歷一次\n\n```python\nclass Solution:\n def sortedListToBST(self, head: ListNode) -> TreeNode:\n def getLength(node: ListNode) -> int:\n length = 0\n while node:\n length += 1\n node = node.next\n return length\n\n def buildBST(start: int, end: int) -> TreeNode:\n nonlocal head\n if start > end:\n return None\n\n mid = (start + end) // 2\n # 先建左子樹\n left = buildBST(start, mid - 1)\n\n # 再建 root(中序)\n root = TreeNode(head.val)\n head = head.next\n\n # 最後建右子樹\n root.left = left\n root.right = buildBST(mid + 1, end)\n return root\n\n length = getLength(head)\n return buildBST(0, length - 1)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124485354","body":"### 思路\n- 遞迴 DFS\n- 如果節點為空,深度為 0。\n- 遞迴左右子樹的最大深度,取最大值後 +1。\n\n---\n\n### 遞迴 DFS(Top-down)\n\n```python\nclass Solution:\n def maxDepth(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136873834","body":"### BFS(反向遍歷)\n\n- 一般 BFS 是左先入,改為右先入左後入\n- 最後訪問的節點就是最底層最左側的節點\n- 每次 `popleft()` 拿出的節點覆蓋 `leftmost`\n- 時間複雜度 : O(n)\n---\n\n```python\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n if not root:\n return None\n \n queue = deque([root])\n leftmost = None\n\n while queue:\n leftmost = queue.popleft()\n if leftmost.right:\n queue.append(leftmost.right)\n if leftmost.left:\n queue.append(leftmost.left)\n\n return leftmost.val\n","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146260024","body":"### 解題思路:哈希表(一次遍歷)\n\n1. 初始化一個空dict h\n2. 遍歷陣列 nums,對每個元素 nums[i]:\n - 計算 plus = target - nums[i]\n - 如果 plus 的值在字典中,回傳 [h[plus], i]\n - else 將 nums[i] 存入 dict 中\n\n- 時間、空間複雜度:O(n)\n\n---\n```python\nclass Solution:\n def twoSum(self, nums: List[int], target: int) -> List[int]:\n h = {}\n for i in range(len(nums)):\n plus = target - nums[i]\n if plus in h:\n return [h[plus], i]\n else:\n h[nums[i]] = i","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148509431","body":"### 解題思路:哈希表 + 排序\n\n1. 先用 dict 統計每個元素出現的次數\n2. 使用 sorted 對 dict 依據頻率降序排序\n3. 取出前 k 個 keys 回傳\n\n- 時間複雜度:O(n log n)\n\n---\n\n```python\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n h_map = {}\n for i in nums:\n if i in h_map:\n h_map[i] += 1\n else:\n h_map[i] = 1\n\n h_map = dict(sorted(h_map.items(), key=lambda x: x[1], reverse=True))\n ans = list(h_map.keys())[:k]\n return ans\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170662667","body":"## 解題思路\n陣列已排序,相同的元素一定會相鄰,因此可以使用雙指針: \n1. 設定指標 `init` 指向下個唯一值要放置的位置,初始為 1。 \n2. 從第二個元素開始遍歷,若與前一個元素不同,則將該元素放到 `init` 位置並將 `init` 加 1。 \n3. 最後 `init` 即為去重後的長度。\n\n---\n\n## 時間複雜度\n- **O(n)**:只需遍歷一次陣列。\n\n## 空間複雜度\n- **O(1)**:在原陣列上進行操作,未使用額外空間。\n\n---\n\n## 程式碼\n```python\nfrom typing import List\n\nclass Solution:\n def removeDuplicates(self, nums: List[int]) -> int:\n init = 1\n for i in range(1, len(nums)):\n if nums[i] != nums[i - 1]:\n nums[init] = nums[i]\n init += 1\n return init\n```\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182007045","body":"### 解題思路\n1. 將 `dislikes` 轉換為 **圖的鄰接表** `dislike_table`。\n2. 使用顏色標記(`BLUE = 1`, `GREEN = -1`)來表示兩組人。\n3. 對每個尚未染色的人進行 DFS:\n - 將當前人染色為某一顏色。\n - 對於他不喜歡的人,必須染成相反顏色。\n - 如果發現相鄰節點顏色與自己相同,則表示無法二分。\n4. 如果所有人都能正確染色,則回傳 `True`。\n\n---\n\n```python\nfrom collections import defaultdict\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, N: int, dislikes: List[List[int]]) -> bool:\n BLUE, GREEN = 1, -1\n \n def draw(person_id, color):\n color_of[person_id] = color\n for the_other in dislike_table[person_id]:\n if color_of[the_other] == color:\n return False\n if not color_of[the_other] and not draw(the_other, -color):\n return False\n return True\n \n if N == 1 or not dislikes:\n return True\n \n dislike_table = defaultdict(list)\n color_of = defaultdict(int)\n \n for p1, p2 in dislikes:\n dislike_table[p1].append(p2)\n dislike_table[p2].append(p1)\n \n for person_id in range(1, N + 1):\n if not color_of[person_id] and not draw(person_id, BLUE):\n return False\n \n return True","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mr-kient":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074503694","body":"### 【Day 1】989. 数组形式的整数加法\n\n#### Main Idea\n\n1. Since the length of `num` can reach 10000, a brute-force approach of adding each digit of `num` multiplied by 10^[n-i] to form a number and then adding it to K is not feasible, as it would cause an overflow.\n\n2. We can simulate manual vertical calculation by reversing the array and starting the addition from the last digit of both `num` and `k`.\n\n3. Set a global variable `ex` to determine if a carry is needed when adding each digit.\n\n > [!NOTE]\n > Remember to check if there is a carry after adding the first digit.\n\n4. If an array index exceeds the limit, treat it as 0; if `k` is shorter than `num`, treat the remaining digits of `k` as 0.\n\n\n#### Code\n\n```cpp\nclass Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n int n = num.size();\n vector res;\n int ex = 0;\n int i = n - 1;\n\n while (i >= 0 || k > 0) {\n int x = (i >= 0) ? num[i] : 0; //k可能比num长\n int y = k % 10;\n int sum = x + y + ex;\n res.push_back(sum % 10);\n ex = sum / 10;\n k /= 10;\n i--;\n }\n\n if (ex)\n res.push_back(ex);\n\n reverse(res.begin(), res.end());\n\n return res;\n }\n};\n```\n\n#### Complexity\n\n$O(Max(num.size(), log(k)))$","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3076134448","body":"### **【Day 2】821. 字符的最短距离**\n\n#### Main idea\n\n1. Two linear traversals: The first one records the distance from each `s[i]` to the previous `c` from left to right; The second time, from right to left, update the minimum distance compared to the previous distance\n2. ⚠️ Note: During the two initializations, the first initialization should be very small because there will be no appearance of `c` after traversing to the right for a long time. If the setting is not small enough, it will result in an insufficiently large distance value, which will affect the update of the correct value from right to left in the second traversal\n\n```cpp\nclass Solution {\npublic:\n vector shortestToChar(string s, char c) {\n int n = s.size();\n vector res(n, n);\n int c_id = -n;\n\n for (int i = 0; i < n; i++) {\n\n if (s[i] == c) {\n c_id = i;\n }\n res[i] = i - c_id;\n }\n\n c_id = 2 * n;\n\n for (int j = n - 1; j >= 0; j--) {\n if (s[j] == c) {\n c_id = j;\n }\n\n res[j] = min(res[j], c_id - j);\n }\n\n return res;\n }\n};\n```\n\n#### Complexity\n\nLoop twice: $O(2*s.szie())$","onTime":true},null,null,null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124415547","body":"### 【Day 13】[104. 二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/)\n\n#### Main Idea \n\n1. 首先考虑到递归即遍历二叉树的左右子树,计算每个节点的左右子树的最大深度\n\n - **递归终止条件**:如果当前节点为空,则返回0(表示当前路径长度为0)。\n - **递归逻辑**:对于当前节点,递归计算左子树的最大深度和右子树的最大深度,取较大值并加1(当前节点本身)\n - **时间复杂度**:O(n),其中n是二叉树的节点总数。每个节点被访问一次。\n\n2. DFS\n\n ```c++\n /**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\n \n class Solution {\n public:\n int maxDepth(TreeNode* root) {\n if (!root) return 0;\n \n std::stack> s;\n s.push({root, 1});\n int max_depth = 0;\n \n while (!s.empty()) {\n auto [node, depth] = s.top();\n s.pop();\n max_depth = std::max(max_depth, depth);\n \n if (node->left) {\n s.push({node->left, depth + 1});\n }\n if (node->right) {\n s.push({node->right, depth + 1});\n }\n }\n \n return max_depth;\n }\n };\n ```\n\n \n\n#### 时间复杂度\n\n要计算二叉树的最大深度,必须访问每一个节点一次,因为最长路径可能出现在任意位置。**没有比O(n)更优的时间复杂度**,因为无论如何都需要遍历所有节点以确认最长路径。","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146453148","body":"### 【Day 19】两数之和\n\n#### Main Idea\n\n1. **暴力枚举**\n - 遍历数组中的每一个元素 `nums[i]`,再对其后续所有元素 `nums[j]`(`j > i`)进行遍历,判断 `nums[i] + nums[j] == target` 时返回 `[i, j]`。\n - **时间复杂度**:O(n²),最坏情况下需要检查所有的元素对。\n2. **哈希表(一遍扫描)**\n - 利用一个哈希表 `mp` 存储 <数值 → 下标 >的映射。\n - 遍历数组,令 `complement = target - nums[i]`:\n - 如果哈希表中已存在 `complement`,说明之前遇到过这么一个数,二者之和等于 `target`,直接返回对应的下标。\n - 否则将当前元素 `nums[i]` 及其下标 `i` 存入哈希表,继续扫描。\n - **优点**:一次遍历搞定,时间和空间都最优。\n\n```c++\n#include \n#include \nusing namespace std;\n\nclass Solution {\npublic:\n vector twoSum(vector& nums, int target) {\n unordered_map mp; // 存储 已访问的数值 → 下标\n for (int i = 0; i < nums.size(); ++i) {\n int complement = target - nums[i];\n // 如果哈希表中已有 complement,则直接返回答案\n if (mp.find(complement) != mp.end()) {\n return { mp[complement], i };\n }\n // 否则将当前数及下标存入\n mp[nums[i]] = i;\n }\n return {}; // 根据题意不会走到这里\n }\n};\n```\n\n#### 时间复杂度\n\n- **哈希表解法**:O(n),只需一次遍历即可完成查找与存储操作。\n- **空间复杂度**:O(n),最坏情况下哈希表需存储 n 个元素。","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168242525","body":"Main Idea\n\n1. 快慢指针法\n\n设置两个指针 slow 和 fast,初始都指向链表头结点。\n\nfast 每次向前移动 两步,slow 每次向前移动 一步。\n\n当 fast 到达链表末尾时,slow 恰好位于链表的中间位置。\n\n由于题目要求 当有两个中间结点时返回第二个,快慢指针法天然满足这一条件:当链表长度为偶数时,fast 会先到 NULL,此时 slow 指向的就是第二个中间结点。\n\n\n\n2. 时间复杂度\n\nO(n):每个结点最多被访问一次(快指针访问 n/2 次,慢指针访问 n 次)。\n\n\n\n3. 空间复杂度\n\nO(1):只使用了两个额外指针,不需要额外的数据结构。\n\n\n\n\n\n---\n\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode() : val(0), next(nullptr) {}\n * ListNode(int x) : val(x), next(nullptr) {}\n * ListNode(int x, ListNode *next) : val(x), next(next) {}\n * };\n */\nclass Solution {\npublic:\n ListNode* middleNode(ListNode* head) {\n ListNode* slow = head;\n ListNode* fast = head;\n while (fast != nullptr && fast->next != nullptr) {\n slow = slow->next; // 慢指针走一步\n fast = fast->next->next; // 快指针走两步\n }\n return slow; // slow 即为中间结点\n }\n};\n\n\n---\n\n时间复杂度分析\n\n访问链表的所有节点至少需要一次遍历,因此 没有比 O(n) 更优的时间复杂度。\n\n快慢指针法通过一次遍历同时得到中间节点,避免了额外的存储或两次遍历,比先统计长度再走一半更高效。\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3188424726","body":"#### Main Idea\n\n1. **把未分组项目“补组”**:对 `group[i] == -1` 的项目,给它们分配新的组号(从 `m` 开始递增),这样每个项目都有归属组,最终组的总数记为 `G`。\n2. **两层拓扑排序(Group 拓扑 + Item 拓扑)**:\n\n * **项目层图**:对每条依赖 `u ∈ beforeItems[v]`,连边 `u → v`,统计项目入度。\n * **组层图**:若 `group[u] != group[v]`,再在组图里连边 `group[u] → group[v]`,统计组入度。\n * **先对项目图做一次拓扑排序(得到全局项目顺序)**,再对组图做一次拓扑排序(得到组顺序)。\n3. **按组拼接**:将“项目拓扑序”按照其组别分桶(保持项目拓扑中的相对顺序),再按“组拓扑序”依次把每个桶拼接起来即为答案。\n4. **不可行判定**:任一拓扑排序失败(存在环)则返回空数组。\n\n* **关键点**:跨组依赖只影响组与组的先后关系(由组图保证),组内项目的详细先后由项目图保证。用“两层图”可同时满足“组块相邻”和“依赖有序”。\n\n---\n\n2. **实现**\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n vector sortItems(int n, int m, vector& group, vector>& beforeItems) {\n // 1) 给未分组的项目分配新组号\n int gid = m;\n for (int i = 0; i < n; ++i) {\n if (group[i] == -1) group[i] = gid++;\n }\n int G = gid; // 组总数\n\n // 2) 建立项目图 & 组图\n vector> itemAdj(n), groupAdj(G);\n vector itemIn(n, 0), groupIn(G, 0);\n\n for (int v = 0; v < n; ++v) {\n for (int u : beforeItems[v]) {\n itemAdj[u].push_back(v);\n itemIn[v]++;\n if (group[u] != group[v]) {\n groupAdj[group[u]].push_back(group[v]);\n groupIn[group[v]]++;\n }\n }\n }\n\n // 通用 Kahn 拓扑\n auto topo = [](const vector>& adj, vector indeg) -> vector {\n int N = (int)adj.size();\n queue q;\n for (int i = 0; i < N; ++i) if (indeg[i] == 0) q.push(i);\n vector order;\n order.reserve(N);\n while (!q.empty()) {\n int x = q.front(); q.pop();\n order.push_back(x);\n for (int y : adj[x]) {\n if (--indeg[y] == 0) q.push(y);\n }\n }\n if ((int)order.size() != N) return {}; // 有环\n return order;\n };\n\n // 3) 分别对 项目图、组图 做拓扑排序\n vector itemOrder = topo(itemAdj, itemIn);\n if (itemOrder.empty()) return {};\n vector groupOrder = topo(groupAdj, groupIn);\n if (groupOrder.empty()) return {};\n\n // 4) 按项目拓扑序分桶到各组里,保持项目相对次序\n vector> bucket(G);\n for (int x : itemOrder) bucket[group[x]].push_back(x);\n\n // 5) 按组拓扑序拼接\n vector ans;\n ans.reserve(n);\n for (int g : groupOrder) {\n for (int x : bucket[g]) ans.push_back(x);\n }\n return ans;\n }\n};\n```\n\n#### 时间复杂度\n\n* 建图与两次拓扑排序总计 **O(n + E)**,其中 `E = Σ |beforeItems[i]|`。\n* 额外空间用于邻接表、入度数组与分桶,均为 **O(n + E + G)**。\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3205439203","body":"#### Main Idea\n\n1. **线性扫描 (超时)**\n - 从 0 开始向上遍历整数 `i`。\n - 检查 `i * i` 的值。当第一次出现 `i * i > x` 时,那么 `i-1` 就是我们要求的平方根的整数部分。\n - **注意**:`i * i` 的计算可能会导致整数溢出。为避免此问题,应将判断条件改为 `i > x / i`。\n - **缺点**:当 `x` 非常大时,循环次数过多,会导致执行超时,无法通过所有测试用例。\n\n2. **二分查找**\n - `x` 的平方根一定在 `[0, x]` 这个区间内。\n - 我们可以将问题转化为:**在一个有序的范围内(`0` 到 `x`),寻找最大的整数 `k`,使得 `k² <= x`**。\n - 这正是二分查找的经典应用场景。设置搜索区间的左右边界 `left` 和 `right`,计算中间值 `mid`:\n - 如果 `mid² <= x`,说明 `mid` 是一个可能的解,但我们还想尝试更大的值,因此记录当前解,并在右半部分继续搜索:`ans = mid`, `left = mid + 1`。\n - 如果 `mid² > x`,说明 `mid` 太大了,解一定在左半部分,因此缩小搜索范围:`right = mid - 1`。\n - **优点**:每次都将搜索范围减半,时间复杂度低,效率极高。\n\n```c++\nclass Solution {\npublic:\n int mySqrt(int x) {\n if (x == 0) {\n return 0;\n }\n\n int left = 1, right = x;\n int ans = 0;\n\n while (left <= right) {\n int mid = left + (right - left) / 2;\n\n // 为防止 mid * mid 溢出,使用除法来判断\n // mid <= x / mid 等价于 mid * mid <= x\n if (mid <= x / mid) {\n ans = mid; // mid 是一个可能的解\n left = mid + 1; // 尝试在右侧寻找更大的解\n } else {\n right = mid - 1; // mid 太大,到左侧去寻找\n }\n }\n return ans;\n }\n};\n```\n\n#### 时间复杂度\n\n- **二分查找解法**:O(log n),其中 n 为输入值 `x`。二分查找每次都将搜索空间减半,因此时间复杂度是对数级别的。\n- **空间复杂度**:O(1),解法只使用了常数个额外变量,与输入 `x` 的大小无关。","onTime":true},null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3237241808","body":"#### Main Idea\n\n1. 滑动窗口 + 计数\n\n - 用两个计数器统计字符需求:`need[c]` 表示目标串 `t` 中每个字符需要的数量,`have[c]` 表示当前窗口中已有的数量。\n - 扩张右端:右指针 `r` 逐步右移,把字符加入窗口,并在 `have[c]` 达到 `need[c]` 时,更新已满足的种类数 `formed`。\n - 收缩左端:当窗口已满足 `t` 的全部字符需求(`formed == required`,其中 `required` 为 `t` 中不同字符的个数)时,尽量左移 `l` 缩小窗口并更新最优答案。\n - 唯一性:题目保证若存在答案则唯一,我们只需在收缩时维护最短长度即可。\n\n ```cpp\n #include \n using namespace std;\n \n class Solution {\n public:\n string minWindow(string s, string t) {\n if (t.empty() || s.size() < t.size()) return \"\";\n \n // 统计目标需求\n vector need(128, 0), have(128, 0);\n int required = 0; // 需要满足的不同字符的种类数\n for (char c : t) {\n if (need[c] == 0) required++;\n need[c]++;\n }\n \n int formed = 0; // 当前窗口中已满足 need 的种类数\n int bestLen = INT_MAX, bestL = 0;\n int l = 0;\n \n for (int r = 0; r < (int)s.size(); ++r) {\n char cr = s[r];\n have[cr]++;\n \n // 当某字符数量刚好达到需求,更新 formed\n if (need[cr] > 0 && have[cr] == need[cr]) {\n formed++;\n }\n \n // 若已满足所有字符需求,尽量收缩左端\n while (formed == required) {\n if (r - l + 1 < bestLen) {\n bestLen = r - l + 1;\n bestL = l;\n }\n char cl = s[l];\n have[cl]--;\n // 收缩导致某字符不足,formed 减一\n if (need[cl] > 0 && have[cl] < need[cl]) {\n formed--;\n }\n l++;\n }\n }\n \n return bestLen == INT_MAX ? \"\" : s.substr(bestL, bestLen);\n }\n };\n ```\n\n#### 时间复杂度\n\n双指针各自只右移且不回退,整体 **O(m + n)**;计数数组为常数空间。","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240735616","body":"#### Main Idea\n\n1. **逐行放置**\n - 每一行选择一个不与已放皇后冲突的列。冲突规则:同列、主对角线(r−c)、次对角线(r+c)。\n - **递归终止**:当行号 `row == n`,说明已成功放置 n 个皇后,计数 +1。\n - **选择与撤销**:在当前行尝试所有合法列,递归下一行,回退继续尝试。\n2. **位运算优化**\n - 用 n 位二进制位掩码表示列与对角线占用:\n - `cols`:哪些列被占。\n - `diag1`:主对角线占用(相当于下一行左移一位)。\n - `diag2`:次对角线占用(相当于下一行右移一位)。\n - 可放置位置:`bits = ~(cols | diag1 | diag2) & mask`,其中 `mask = (1<> 1`。\n\n#### 回溯 + 位运算\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int totalNQueens(int n) {\n int mask = (1 << n) - 1;\n return dfs(0, 0, 0, 0, mask, n);\n }\n\nprivate:\n // row: 当前行号;cols/diag1/diag2:占用掩码;mask:仅保留 n 位\n int dfs(int row, int cols, int diag1, int diag2, int mask, int n) {\n if (row == n) return 1;\n\n int count = 0;\n int bits = (~(cols | diag1 | diag2)) & mask; // 当前行可放置的位置集合\n\n while (bits) {\n int p = bits & -bits; // 取最低位可行位置\n bits -= p; // 移除该位置\n\n count += dfs(row + 1,\n cols | p,\n ((diag1 | p) << 1) & mask, // 主对角线左移并截断\n (diag2 | p) >> 1, // 次对角线右移\n mask, n);\n }\n return count;\n }\n};\n```\n\n#### 时间复杂度\n\n- **时间**:回溯搜索的上界接近 **O(n!)**,但位运算将冲突判断降为 O(1) 常数,n ≤ 9 时非常快。\n- **空间**:**O(n)**(递归深度 n,掩码为常数额外空间)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247569627","body":"#### Main Idea\n\n1. BFS(从所有陆地同时出发)\n\n * 把所有值为 `1` 的格子(陆地)一起入队,距离视作 0;像海浪一样一圈圈向外扩散。\n * 第一次被扩散到的海洋格子的距离,就是它到最近陆地的最短曼哈顿距离。\n * 最后被访问到的海洋格子的距离即为答案。\n * **边界**:若全为陆地或全为海洋,返回 `-1`。\n\n2. 实现\n\n ```cpp\n #include \n using namespace std;\n\n class Solution {\n public:\n int maxDistance(vector>& grid) {\n int n = grid.size();\n queue> q;\n vector> dist(n, vector(n, -1));\n\n // 把所有陆地入队,距离置 0\n for (int i = 0; i < n; ++i) {\n for (int j = 0; j < n; ++j) {\n if (grid[i][j] == 1) {\n q.push({i, j});\n dist[i][j] = 0;\n }\n }\n }\n\n // 若全海或全陆,直接返回 -1\n if (q.empty() || (int)q.size() == n * n) return -1;\n\n int ans = -1;\n int dirs[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};\n\n // 多源 BFS\n while (!q.empty()) {\n auto [x, y] = q.front(); q.pop();\n for (auto& d : dirs) {\n int nx = x + d[0], ny = y + d[1];\n if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue;\n if (dist[nx][ny] != -1) continue; // 访问过\n dist[nx][ny] = dist[x][y] + 1; // 最近陆地距离\n ans = max(ans, dist[nx][ny]);\n q.push({nx, ny});\n }\n }\n return ans;\n }\n };\n ```\n\n#### 时间复杂度\n\n* 时间:每个格子最多入队一次,四邻检查常数次,整体 **O(N²)**。\n\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263627488","body":"#### Main Idea\n\n1. **线性决策(相邻不能同抢)**\n\n * 到第 `i` 间房时只有两种选择:\n\n * **不抢它**:收益等于前一间的最佳收益 `dp[i-1]`\n * **抢它**:收益等于“到 i-2 的最佳收益 + 本屋金额” → `dp[i-2] + nums[i]`\n * 所以转移式:`dp[i] = max(dp[i-1], dp[i-2] + nums[i])`\n2. **初值与边界**\n\n * 空数组 → 答案 `0`\n * `dp[0] = nums[0]`\n * `dp[1] = max(nums[0], nums[1])`(如果存在)\n3. **滚动变量优化空间**\n\n * 只依赖 `i-1` 和 `i-2`,用两个变量就够了:\n\n * `prev2` 表示 `dp[i-2]`,`prev1` 表示 `dp[i-1]`\n * 新值 `cur = max(prev1, prev2 + nums[i])`,随后前移指针\n\n#### 动态规划(滚动变量,O(1) 空间)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int rob(vector& nums) {\n if (nums.empty()) return 0;\n int n = nums.size();\n if (n == 1) return nums[0];\n\n int prev2 = 0; // dp[i-2]\n int prev1 = 0; // dp[i-1]\n for (int x : nums) {\n int cur = max(prev1, prev2 + x);\n prev2 = prev1;\n prev1 = cur;\n }\n return prev1;\n }\n};\n```\n\n#### 时间复杂度\n\n* **时间**:`O(n)`(单次线性扫描)\n* **空间**:`O(1)`(滚动变量),如需恢复路径则 `O(n)` 用于记录选择","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3284142988","body":"#### Main idea\n\n**把局面想成“还差多少 + 已用过哪些数”**\n\n- 每次你从公共池里挑一个数,目标值就相应减少;被挑过的数以后都不能再用。\n- 于是每一步其实就是在“还差的分数”和“哪些数已被拿走”的组合之间转换。\n\n**当前能赢的充要条件**\n\n- 如果你现在能直接拿到一个数,使得**累计和立刻达到/超过目标**,你马上赢。\n- 否则,你希望找到一个数字,让对手接下来面对的局面是**必输局**。\n 换句话说:**存在**一个选择能把对手“送进死局”,那你这一步就是必赢;\n 如果**所有**选择都会把对手“送进稳赢局”,那你这一步就是必输。\n\n**两条简单但很有用的剪枝**\n\n- **总和不够就别想了**:如果 1 到 `maxChoosableInteger` 的总和都达不到目标,先手必输。\n- **目标非正直接赢**:如果目标本来就 ≤ 0(或被前人操作减到 ≤ 0),先手已满足条件,直接判赢。\n\n**记住算过的局面,别重复思考(记忆化)**\n\n- 同一组“已用过的数字 + 还差多少”的局面,赢或输的结论是固定的。\n- 把每个局面的输赢结果记下来,后面再遇到就直接用,避免在相同分支上反复推演。\n\n**直觉理解(以示例 1 为例)**\n\n- `max=10, 目标=11`:无论先手先拿哪个数 `x`,后手都能立刻拿到 `11-x`(且该数仍在 1..10 且未被用),直接结束游戏。\n- 所以先手无解——这就是“把对手送进稳赢局”在反方向上的体现。\n\n#### Implementation(cpp)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n bool canIWin(int maxChoosableInteger, int desiredTotal) {\n if (desiredTotal <= 0) return true;\n\n int n = maxChoosableInteger;\n int sum = n * (n + 1) / 2;\n if (sum < desiredTotal) return false; // 全拿都不够,必输\n\n // 2^n 状态;-1=未知,0=必败,1=必胜\n vector memo(1 << n, -1);\n return dfs(0, desiredTotal, n, memo);\n }\n\nprivate:\n // mask: 已用集合(第 i 位表示数字 i+1 是否已用)\n // remain: 距离目标还差多少\n bool dfs(int mask, int remain, int n, vector& memo) {\n char &res = memo[mask];\n if (res != -1) return res;\n\n // 枚举当前可选的每个数 i\n for (int i = 1; i <= n; ++i) {\n int bit = 1 << (i - 1);\n if (mask & bit) continue; // 已用,跳过\n if (i >= remain) return res = 1; // 直接到达/超过目标,当前玩家赢\n // 若选 i 之后对手必败,则当前必胜\n if (!dfs(mask | bit, remain - i, n, memo)) return res = 1;\n }\n return res = 0; // 所有选择都会让对手必胜 => 当前必败\n }\n};\n\n```\n\n#### 复杂度\n\nO(n · 2^n)","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3306753472","body":"#### Main Idea\n\n1. **把“最少删除”转化为“最多保留”**\n\n * 经典区间调度:**按右端点升序**排序,**尽可能先选结束早的区间**,就能在不重叠前提下**保留最多**的区间。\n * 需要移除的最小数量 = `总数 n - 能保留的最大不重叠数量 keep`。\n\n2. **为什么按右端点排是最优的**\n\n * 选更早结束的区间,给后面的区间留下**更多起始空间**,不比选结束晚的更差。\n * 可用“**交换论证**”:若最优解里某一步没有选最早结束者,换成结束更早的,不减少可选余地,解仍最优。\n\n3. **边界与定义(开闭性)**\n\n * 本题规定:端点相同只**接触不重叠**(`[1,2]` 与 `[2,3]` 可共存),因此判断不重叠条件是 `start >= lastEnd`。\n * 允许负数坐标;`1 <= n <= 1e5`,需 `O(n log n)` 排序 + `O(n)` 一次扫描。\n\n---\n\n#### 贪心(按右端点排序)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int eraseOverlapIntervals(vector>& intervals) {\n if (intervals.empty()) return 0;\n\n // 1) 按 end 升序排\n sort(intervals.begin(), intervals.end(),\n [](const vector& a, const vector& b){\n if (a[1] != b[1]) return a[1] < b[1];\n return a[0] < b[0];\n });\n\n // 2) 贪心选择:尽量保留更多不重叠区间\n int keep = 0;\n int lastEnd = INT_MIN; // 当前已选集合的最后一个区间的 end\n for (auto &it : intervals) {\n int s = it[0], e = it[1];\n if (s >= lastEnd) { // 与上一个选择不重叠(端点相接也可)\n ++keep;\n lastEnd = e;\n }\n }\n return (int)intervals.size() - keep; // 最少删除 = 总数 - 最多保留\n }\n};\n```\n\n---\n\n#### 等价实现(按左端点排序的“原地计数删谁”)\n\n* 也可以**按起点升序**,一遍扫描:\n\n * 若当前 `s < prevEnd` 发生**重叠** ⇒ 必须删一个;\n * **删谁?** 删右端点更大的那个(保留 `end` 更小者),将 `prevEnd = min(prevEnd, e)`。\n * 计数 `remove++`。\n* 与前法等价,常用于不想单独计“keep”的写法。\n\n```cpp\nint eraseOverlapIntervals(vector>& intervals) {\n if (intervals.empty()) return 0;\n sort(intervals.begin(), intervals.end()); // 默认按 start,再按 end\n\n int remove = 0;\n int prevEnd = intervals[0][1];\n for (int i = 1; i < (int)intervals.size(); ++i) {\n int s = intervals[i][0], e = intervals[i][1];\n if (s < prevEnd) { // 重叠了,需要删一个\n ++remove;\n prevEnd = min(prevEnd, e); // 删 end 较大的那个,保留更早结束\n } else {\n prevEnd = e; // 不重叠,正常推进\n }\n }\n return remove;\n}\n```\n\n#### 复杂度\n\n* 排序 `O(n log n)`,单扫 `O(n)`;总 `O(n log n)`。\n* 额外空间 `O(1)`(除了排序)。\n\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3332731592","body":"#### Main Idea\n\n1. **字母映射到孩子指针(26 叉树)**\n\n * 每个结点保存 `children[26]` 与 `isEnd`。\n * `insert(word)`:从根逐字符走,若孩子不存在就新建;末结点标记 `isEnd = true`。\n * `search(word)`:逐字符走,若中途缺结点则 `false`;走完返回末结点 `isEnd`。\n * `startsWith(prefix)`:逐字符走,若中途缺结点则 `false`;都能走到则 `true`(无需 `isEnd`)。\n\n2. **正确性与边界**\n\n * 仅小写字母 → 直接用 `idx = c - 'a'`。\n * `search` 必须要求完整单词结束处 `isEnd == true`,否则只是前缀命中。\n * 空间按需分配:只有路径上用到的结点才创建。\n\n\n---\n\n#### 实现(C++,指针版)\n\n```cpp\n#include \nusing namespace std;\n\nstruct TrieNode {\n bool isEnd = false;\n TrieNode* ch[26];\n TrieNode() : isEnd(false) {\n memset(ch, 0, sizeof(ch));\n }\n};\n\nclass Trie {\npublic:\n Trie() { root = new TrieNode(); }\n\n // 插入单词\n void insert(const string& word) {\n TrieNode* p = root;\n for (char c : word) {\n int idx = c - 'a';\n if (!p->ch[idx]) p->ch[idx] = new TrieNode();\n p = p->ch[idx];\n }\n p->isEnd = true;\n }\n\n // 完整匹配\n bool search(const string& word) {\n TrieNode* p = walk(word);\n return p && p->isEnd;\n }\n\n // 前缀匹配\n bool startsWith(const string& prefix) {\n return walk(prefix) != nullptr;\n }\n\nprivate:\n TrieNode* root;\n\n // 沿字符串行走,走不到返回空\n TrieNode* walk(const string& s) {\n TrieNode* p = root;\n for (char c : s) {\n int idx = c - 'a';\n if (!p->ch[idx]) return nullptr;\n p = p->ch[idx];\n }\n return p;\n }\n};\n```\n#### 复杂度\n\n * 设字符串长度为 `L`:\n\n * `insert / search / startsWith` 都是 **O(L)**。\n * 空间:创建的结点数 ≤ 所有插入字符串长度之和。\n\n","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"leohongyi":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3076771871","body":"【Day 1】989. 数组形式的整数加法\nmain idea 从最低位开始加,如果还有进位,将其添加到结果前面 使用逆序遍历 range(len(num) - 1, -1, -1) 从数组的最后一个元素(最低位)开始\ndivmod(num[i] + k, 10) 计算当前位置的数字与 k 相加后的结果,返回商和余数 如果处理完数组中所有位后仍有进位(k > 0)\n从 k 中提取最低位数字,并插入到数组最前面\n继续处理 k 的下一位,直到 k 变为 0\n余数 num[i] 保存在当前位置\n商 k 作为进位传递给下一个更高位\n整体时间复杂度为 O(max(n, log k))。\ncode\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n for i in range(len(num) - 1, -1, -1):\n k, num[i] = divmod(num[i] + k, 10)\n \n while k > 0:\n k, digit = divmod(k, 10)\n num.insert(0, digit)\n return num\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077014132","body":"main idea:\n创建 ret 数组,长度为len(s)\n再次遍历s的过程中,我们需要判断当满足以下两点条件时,指针 p 右移一位\np小于arr最大下标\n前下标i 到 p + 1的绝对距离比到 p 的绝对距离小\n每次将 p - i 的绝对距离添加至 ret[i] 中\n\n def shortestToChar(self, s: str, c: str) -> List[int]:\n ret, p, arr = [], 0, [i for i in range(len(s)) if s[i] == c]\n for i, j in enumerate(s):\n if p < len(arr) - 1 and abs(arr[p] - i) > abs(arr[p + 1] - i):\n p += 1\n ret.append(abs(arr[p] - i))\n return ret\nTime Complexity: O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082831029","body":"使用数组的栈结构,self.top作为栈顶指针\n进出栈分别通过简单的数组赋值与读取进行操作\nincrement函数通过一个循环进行赋值操作\nclass CustomStack:\n\n def __init__(self, maxSize: int):\n self.stack = [0]*maxSize\n self.top = -1\n\n def push(self, x: int) -> None:\n if self.top < len(self.stack) - 1:\n self.top += 1\n self.stack[self.top] = x\n\n def pop(self) -> int:\n if self.top is -1:\n return self.top\n else:\n self.top -= 1\n return self.stack[self.top+1]\n \n\n def increment(self, k: int, val: int) -> None:\n for i in range(min(k, self.top + 1)):\n self.stack[i] += val\n\n\n\nTime complexity: O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3092615113","body":"算法步骤:\n利用current string, current number 记录所有不同的括号层级内的string和num;\n使用stk来记录之前的数字和前置str;推荐先push num, 后push str 至 stack;\nO(n)\n代码:\nclass Solution:\n def decodeString(self, s: str) -> str:\n cur_str, cur_num = \"\", \"\"\n stk = []\n for c in s:\n if c.isdigit():\n cur_num += c\n elif c == '[':\n stk.append(cur_str)\n stk.append(cur_num)\n cur_str, cur_num = \"\", \"\"\n elif c == ']':\n cur_str *= int(stk.pop())\n cur_str = stk.pop() + cur_str\n else:\n cur_str += c\n return cur_str\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092624509","body":"算法设计\n加入队尾 push() : 将数字 val 加入栈 A 即可。\n获取队首元素 peek() :\n当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。\n否则,当 A 为空: 即两个栈都为空,无元素,因此返回 -1 。\n否则: 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。\n弹出队首元素 pop() :\n执行 peek() ,获取队首元素。\n弹出 B 的栈顶元素。\n队列判空 empty() : 当栈 A 和 B 都为空时,队列为空。\n\nclass MyQueue:\n\n def __init__(self):\n self.A, self.B = [], []\n\n def push(self, x: int) -> None:\n self.A.append(x)\n\n def pop(self) -> int:\n peek = self.peek()\n self.B.pop()\n return peek\n\n def peek(self) -> int:\n if self.B: return self.B[-1]\n if not self.A: return -1\n # 将栈 A 的元素依次移动至栈 B\n while self.A:\n self.B.append(self.A.pop())\n return self.B[-1]\n def empty(self) -> bool:\n return not self.A and not self.B\n\n\n# Your MyQueue object will be instantiated and called as such:\n# obj = MyQueue()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.peek()\n# param_4 = obj.empty()\n时间复杂度: push(), empty() 函数的时间复杂度为 O(1) ;peek() , pop() 函数在 N 次队首元素删除操作中总共需完成 N 个元素的倒序,均摊时间复杂度为 O(1) 。\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3105379844","body":"main: 如果当前元素大于或者等于maxx,入栈, 更新最大值maxx\n如果当前元素小于栈顶元素,循环弹出栈顶元素,直到当前元素大于或等于栈顶元素,注意不用将当前元素入栈!!不过要再将maxx压入栈,因为刚刚pop时肯定把maxx弹出栈了\n\n。class Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n maxx, stk = arr[0], [arr[0]]\n for i in range(1, len(arr)):\n if arr[i] >= maxx:\n maxx = arr[i]\n stk.append(arr[i])\n else:\n while stk and stk[-1] > arr[i]:\n stk.pop()\n stk.append(maxx)\n return len(stk)\n 时间复杂度O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3111913253","body":"找到尾结点 形成环形链表\n尾结点移动length - k 步 有移动k步 == 左移length - k 步\n找到头结点 断开头尾链接\n\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:\n if not head or not head.next:\n return head\n tail = head\n length = 1\n while tail.next:\n length += 1\n tail = tail.next\n tail.next = head\n\n k = k % length\n for _ in range(length - k):\n tail = tail.next\n \n head = tail.next\n tail.next = None\n return head\n ","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3111983736","body":"先交换以node3为头结点的链表 \nnode1指向地柜返回的链表头\n把node2指向node1\n返回node2 作为交换完成的链表头结点\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if head is None or head.next is None:\n return head\n node1 = head\n node2 = head.next\n node3 = node2.next\n\n node1.next = self.swapPairs(node3)\n node2.next = node1\n\n return node2\n ","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dmax1314":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3082278662","body":"1. 第一个想法是数组转换数字然后相加再转换回去\n时间和空间复杂度都应该是O(n)\n```python\nfrom typing import List\n\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n # 1. 数组 -> 字符串 -> 数字\n # 首先将列表中的每个数字转换为字符串,然后拼接成一个完整的字符串\n # [1, 2, 0, 0] -> [\"1\", \"2\", \"0\", \"0\"] -> \"1200\"\n s = \"\".join(map(str, num))\n \n num_val = int(s)\n \n # 2. 数字相加\n result_val = num_val + k\n \n # 3. 数字 -> 字符串 -> 数组\n # 将结果数字转换回字符串\n # 1234 -> \"1234\"\n result_s = str(result_val)\n \n # 将结果字符串中的每个字符转换回整数,并放入列表中\n # \"1234\" -> [\"1\", \"2\", \"3\", \"4\"] -> [1, 2, 3, 4]\n result_array = [int(digit) for digit in result_s]\n \n return result_array\n```\n但是似乎换其他的语言会溢出\n2. 第二个想法就是模拟加法操作,从个位数加起,关键问题在于处理进位\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n result = []\n carry = 0\n i = len(num) - 1 # 指向 num 的最后一位\n \n while i >= 0 or k > 0 or carry > 0:\n digit = carry # 初始化为进位\n \n if i >= 0: # 如果 num 中还有数字\n digit += num[i]\n i -= 1\n \n if k > 0: # 如果 k 中还有数字\n digit += k % 10\n k //= 10 # 整个 k 除以 10\n \n # 处理进位\n result.append(digit % 10)\n carry = digit // 10\n \n result.reverse() # 因为是从个位到十位添加的,最后需要反转\n return result # 返回结果\n```\n这里是要反转的 我一开始忘了这个事情,因为数组把个位的和放在了第一位和实际数字反过来了\n时间复杂度: O(max(N, M)),其中 N 是 num 的长度,M 是 k 的数字长度。我们需要遍历这两个数的每一位。\n空间复杂度: O(max(N, M)),用于存储结果数组。\n\n---\n在看lc题解的时候发现一个很有趣的模板可能以后会用到\n ```\nwhile ( A 没完 || B 没完)\n A 的当前位\n B 的当前位\n\n 和 = A 的当前位 + B 的当前位 + 进位carry\n\n 当前位 = 和 % 10;\n 进位 = 和 / 10;\n\n判断还有进位吗\n```\n>作者:lilyunoke\n>链接:https://leetcode.cn/problems/add-to-array-form-of-integer/solutions/570659/989-ji-zhu-zhe-ge-jia-fa-mo-ban-miao-sha-8y9r/\n>来源:力扣(LeetCode)\n>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n\n稍微改了一下得到一个python加法模板,\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n n = len(num)\n res = []\n i = n - 1\n s = 0\n carry = 0\n while i >= 0 or k != 0:\n x = num[i] if i >= 0 else 0\n y = k % 10 if k != 0 else 0\n\n s = x + y + carry\n carry = s // 10\n k //= 10\n\n i -= 1\n res.insert(0, s % 10)\n\n if carry != 0:\n res.insert(0, carry)\n return res\n```\n据说这个模板还可以用到[2](https://leetcode.com/problems/add-two-numbers/description/),[165](https://leetcode.com/problems/compare-version-numbers/)和[809](https://leetcode.com/problems/expressive-words/)这周末抽空可以做一下","onTime":false},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3086540520","body":"# 第四天\n构造栈结构,利用先入后出的特性来实现括号匹配\n大概做法就是\n1. 使用栈来存放数字、字符以及中间结果。\n2. 遇到数字时,解析出完整的k值(可能是多位数)。\n3. 遇到开括号 `[` 时,将当前构建的字符串入栈,重置字符串。\n4. 遇到闭括号 `]` 时,出栈,形成一个新的字符串并重复生成。\n5. 最终合并所有字符串返回结果。\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n stack = [] # 初始化栈\n current_num = 0 # 当前数字\n current_str = '' # 当前构建的字符串\n\n for char in s:\n if char.isdigit(): # 如果是数字\n current_num = current_num * 10 + int(char) # 处理多位数\n elif char == '[': # 遇到左括号\n stack.append(current_str) # 存储当前字符串\n stack.append(current_num) # 存储当前数字\n current_str = '' # 重置字符串\n current_num = 0 # 重置数字\n elif char == ']': # 遇到右括号\n num = stack.pop() # 弹出数字\n prev_str = stack.pop() # 弹出前一个字符串\n current_str = prev_str + current_str * num # 生成新的字符串\n else:\n current_str += char # 累加字符\n\n return current_str # 返回解码后的字符串\n```\n时间复杂度是 O(n),其中 n 是字符串 s 的长度。每个字符都被处理一次。\n空间复杂度是 O(n),在最坏情况下,栈可能会存储所有字符和数字。\n\n---\n读了题解发现还存在递归法,也就是用[]来决定递归的开头和结束\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n def dfs(s,i):\n res,multi='',0\n while i str:\n def dfs(s, i):\n res, multi = \"\", 0\n while i < len(s):\n if '0' <= s[i] <= '9':\n multi = multi * 10 + int(s[i])\n elif s[i] == '[':\n i, tmp = dfs(s, i + 1)\n res += multi * tmp\n multi = 0\n elif s[i] == ']':\n return i, res\n else:\n res += s[i]\n i += 1\n return res\n return dfs(s,0)\n```\n时间复杂度是 O(n),其中 n 是字符串 s 的长度。每个字符都被处理一次。\n空间复杂度是 O(n),在最坏情况下,递归调用栈可能会存储所有字符和数字。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091499578","body":"用两个模拟栈的队列来实现栈的基本操作。一个用于添加尾部元素,另一个用于弹出头部元素。即一个近栈stack in和一个出栈stack out。\n```python\nclass MyQueue:\n\n def __init__(self):\n \"\"\"\n in主要负责push,out主要负责pop\n \"\"\"\n self.stack_in = []\n self.stack_out = []\n\n\n def push(self, x: int) -> None:\n \"\"\"\n 有新元素进来,就往in里面push\n \"\"\"\n self.stack_in.append(x)\n\n\n def pop(self) -> int:\n \"\"\"\n Removes the element from in front of queue and returns that element.\n \"\"\"\n if self.empty():\n return None\n \n if self.stack_out:\n return self.stack_out.pop()\n else:\n for i in range(len(self.stack_in)):\n self.stack_out.append(self.stack_in.pop())\n return self.stack_out.pop()\n\n\n def peek(self) -> int:\n \"\"\"\n Get the front element.\n \"\"\"\n ans = self.pop()\n self.stack_out.append(ans)\n return ans\n\n\n def empty(self) -> bool:\n \"\"\"\n 只要in或者out有元素,说明队列不为空\n \"\"\"\n return not (self.stack_in or self.stack_out)\n```\n时间复杂度:\n- `push` 操作的时间复杂度是 O(1),因为我们只是将元素添加到 `stack_in` 的末尾。\n- `pop` 和 `peek` 操作的平均时间复杂度是 O(1),但在最坏情况下(当 `stack_out` 为空时),需要将 `stack_in` 中的所有元素转移到 `stack_out`,这需要 O(n) 的时间,其中 n 是 `stack_in` 中的元素数量。然而,这种情况不会频繁发生,因此平均时间复杂度仍然是 O(1)。\n- `empty` 操作的时间复杂度是 O(1),因为我们只是检查两个栈是否为空。\n\n空间复杂度是 O(n),其中 n 是队列中的元素数量,因为我们需要存储所有元素在两个栈中。\n\n但是我有个问题,不知道为什么用lc自己的time complexity分析出来是O(n)的时间和空间复杂度,可能是因为lc的分析是基于最坏情况的分析?","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094285074","body":"题目的核心是找到最多的分块数量,使得将每个块独立排序后,拼接起来的结果与整个数组排序后的结果相同。\n\n第一个想法是利用排序后的性质。一个块可以被成功分割的条件是:块内所有元素的原数组最大值,小于等于它右边所有元素的最小值。如果满足这个条件,那么这个块排序后,所有元素就都会在它们最终应该在的位置的左边。\n\n为了实现这个想法,我们可以预处理两个数组:\n\n- max_of_left[i]:表示原数组 arr[0...i] 中的最大值。\n- min_of_right[i]:表示原数组 arr[i...n-1] 中的最小值。\n\n然后遍历数组,如果在 i 位置,满足 max_of_left[i] <= min_of_right[i+1],就说明我们可以在 i 和 i+1 之间切一刀。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n n = len(arr)\n if n <= 1:\n return 1\n\n # 1. 计算从左到右每个位置的最大值\n max_of_left = [0] * n\n max_of_left[0] = arr[0]\n for i in range(1, n):\n max_of_left[i] = max(max_of_left[i-1], arr[i])\n\n # 2. 计算从右到左每个位置的最小值\n min_of_right = [0] * n\n min_of_right[n-1] = arr[n-1]\n for i in range(n-2, -1, -1):\n min_of_right[i] = min(min_of_right[i+1], arr[i])\n\n # 3. 遍历查找可以分割的点\n # 如果 max_of_left[i] <= min_of_right[i+1],说明 arr[0...i] 的所有元素\n # 都小于等于 arr[i+1...n-1] 的所有元素,可以切分\n chunks = 0\n for i in range(n - 1):\n if max_of_left[i] <= min_of_right[i+1]:\n chunks += 1\n\n # 总块数 = 分割点数量 + 1\n return chunks + 1\n```\n时间复杂度:O(N),其中 N 是数组的长度。我们需要三次独立的 O(N) 遍历。\n空间复杂度:O(N),用于存储 max_of_left 和 min_of_right 两个辅助数组。\n\n---\n在看题解的时候,发现了一个更巧妙的解法,虽然时间复杂度稍高,但是代码非常简洁。它的思路是比较原数组和排序后数组的元素和。\n\n如果 arr[0...i] 的元素和等于 sorted_arr[0...i] 的元素和,这意味着 arr[0...i] 中的元素集合和 sorted_arr[0...i] 中的元素集合是完全相同的(只是顺序不同)。因为 sorted_arr[0...i] 包含了整个数组中最小的 i+1 个元素,所以 arr[0...i] 也必然包含了这 i+1 个最小元素。这就保证了 arr[0...i] 中的任意元素都小于等于 arr[i+1...n-1] 中的任意元素,因此可以在 i 处进行分割。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n sorted_arr = sorted(arr)\n \n sum_arr = 0\n sum_sorted = 0\n chunks = 0\n \n for i in range(len(arr)):\n sum_arr += arr[i]\n sum_sorted += sorted_arr[i]\n \n if sum_arr == sum_sorted:\n chunks += 1\n \n return chunks\n```\n时间复杂度:O(N log N),瓶颈在于对数组的排序。\n\n空间复杂度:O(N),用于存储排序后的数组副本。\n\n还有一个基于单调栈的解法,时间复杂度可以做到 O(N)。\n\n思路是遍历数组,用一个栈来维护每个块的最大值。\n\n1. 如果当前元素 num 大于或等于栈顶元素,说明 num 可以自己形成一个新的块(或者加入前一个块且不影响排序性),直接将 num 入栈。\n2. 如果当前元素 num 小于栈顶元素,说明 num 必须和前面的块合并,直到栈顶元素小于或等于 num。在合并过程中,需要记录被弹出的那些块中的最大值 head,因为这个 head 将成为合并后新块的最大值,然后将 head 入栈。\n\n最终栈的大小就是块的数量。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n stack = []\n for num in arr:\n if not stack or num >= stack[-1]:\n stack.append(num)\n else:\n # 当前元素num比栈顶小,需要合并\n head = stack.pop()\n # 持续弹出所有大于num的元素\n while stack and stack[-1] > num:\n stack.pop()\n # 将原先这些块的最大值head作为新块的代表入栈\n stack.append(head)\n return len(stack)\n```\n\n时间复杂度:O(N),因为每个元素最多入栈和出栈一次。\n\n空间复杂度:O(N),在最坏的情况下(例如数组本身有序),栈的大小会等于数组长度。\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112533354","body":"双指针\n1. 创建两个指针 pA 和 pB,分别指向两个链表的头节点 headA 和 headB。\n2. 同时向前移动这两个指针,pA 每次走一步,pB 每次也走一步。\n3. 核心操作:如果 pA 指针走到了链表 A 的末尾(即 pA 变为 None),则将它重定向到链表 B 的头节点 headB。同样,如果 pB 指针走到了链表 B 的末尾,则将它重定向到链表 A 的头节点 headA。\n4. 两个指针最终会在相交点相遇。如果两个链表不相交,它们会同时在路径的最后变为 None,此时循环结束。\n\n```python\nclass Solution:\n def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:\n if not headA or not headB:\n return None\n\n pA = headA\n pB = headB\n\n # 当 pA 和 pB 相等时循环终止(可能是在交点,也可能同为 None)\n while pA is not pB:\n # 如果pA走到头,就让他从headB开始走;否则,pA正常往下走\n pA = headB if pA is None else pA.next\n # 如果pB走到头,就让他从headA开始走;否则,pB正常往下走\n pB = headA if pB is None else pB.next\n \n # 返回相遇点\n return pA\n```\n时间复杂度:O(m+n)。在最坏的情况下(例如,两个链表不相交),每个指针都需要遍历两个链表的总长度。\n空间复杂度:O(1)。只使用了两个额外的指针,没有使用其他数据结构。","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121201700","body":"为了实现一个支持 O(1) 时间复杂度的查找插入和删除,可以用hash map去记录key和value之间的映射关系。但是hash map是无序的,没有办法记录各项的使用顺序,可以一个双向链表来记录使用顺序。这样就可以在插入和删除的时候,快速地调整链表的顺序。\n\n```python\nclass DLinkedNode:\n def __init__(self, key=0, value=0):\n self.key = key\n self.value = value\n self.prev = None\n self.next = None\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.cache = dict()\n self.capacity = capacity\n # 使用伪头部和伪尾部节点,简化边界条件处理\n self.head = DLinkedNode()\n self.tail = DLinkedNode()\n self.head.next = self.tail\n self.tail.prev = self.head\n\n def _add_to_head(self, node: DLinkedNode):\n # 将节点添加到头部\n node.prev = self.head\n node.next = self.head.next\n self.head.next.prev = node\n self.head.next = node\n\n def _remove_node(self, node: DLinkedNode):\n # 从链表中删除一个节点\n node.prev.next = node.next\n node.next.prev = node.prev\n\n def _move_to_head(self, node: DLinkedNode):\n # 将一个存在的节点移动到头部\n self._remove_node(node)\n self._add_to_head(node)\n\n def get(self, key: int) -> int:\n if key not in self.cache:\n return -1\n \n node = self.cache[key]\n # 访问过后,变为最近使用,移动到头部\n self._move_to_head(node)\n return node.value\n\n def put(self, key: int, value: int) -> None:\n if key in self.cache:\n # 如果 key 存在,更新值并移动到头部\n node = self.cache[key]\n node.value = value\n self._move_to_head(node)\n else:\n # 如果 key 不存在\n if len(self.cache) == self.capacity:\n # 缓存已满,淘汰最久未使用的节点(尾部节点)\n removed_node = self.tail.prev\n self._remove_node(removed_node)\n # 不要忘了从哈希表中也删除\n del self.cache[removed_node.key]\n\n # 创建新节点并添加到头部\n new_node = DLinkedNode(key, value)\n self._add_to_head(new_node)\n self.cache[key] = new_node\n```\n时间复杂度:get 和 put 操作都是 O(1)。所有操作都是哈希表查找和链表头尾操作的组合。\n空间复杂度:O(capacity),因为哈希表和双向链表最多存储 capacity 个元素。","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3132881592","body":"DFS - 递归\n这道题的结构天然适合使用递归来解决。我们可以定义一个函数,该函数接收一个节点和从根到该节点父节点所构成的数字。\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n \n def dfs(node: Optional[TreeNode], current_path_sum: int) -> int:\n if not node:\n return 0\n \n # 计算到达当前节点的路径代表的数字\n new_sum = current_path_sum * 10 + node.val\n \n # 如果是叶子节点,返回当前路径的数字\n if not node.left and not node.right:\n return new_sum\n \n # 如果不是叶子节点,返回左右子树的路径数字之和\n else:\n return dfs(node.left, new_sum) + dfs(node.right, new_sum)\n\n return dfs(root, 0)\n```\n时间复杂度:O(N),其中 N 是树中节点的数量。我们需要访问每个节点一次。\n空间复杂度:O(H),其中 H 是树的高度。这部分空间用于递归调用栈。在最坏的情况下(树退化成链表),空间复杂度为 O(N);在最好的情况下(完全二叉树),空间复杂度为 O(log N)。\n\n---\n\nDFS - 迭代\n> 递归可能导致的栈溢出问题(在树极深的情况下),我们可以将递归转换为迭代\n\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n \n total_sum = 0\n stack = [(root, root.val)] # 栈中存储 (节点, 到达该节点的路径数值)\n\n while stack:\n node, current_number = stack.pop()\n\n # 如果是叶子节点,将路径数值加入总和\n if not node.left and not node.right:\n total_sum += current_number\n\n # 将右子节点压栈\n if node.right:\n stack.append((node.right, current_number * 10 + node.right.val))\n \n # 将左子节点压栈\n if node.left:\n stack.append((node.left, current_number * 10 + node.left.val))\n \n return total_sum\n```\n时间复杂度:O(N),每个节点入栈和出栈一次。\n空间复杂度:O(H),栈在最坏情况下存储 H 个节点,H 是树的高度。与递归版本类似,最好情况 O(log N),最坏情况 O(N)。\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134942374","body":"因为题目中提到了**行**,我们可以用bfs一行一行地处理树的节点\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\nimport collections\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n \n queue = collections.deque([root])\n bottom_left_val = 0\n \n while queue:\n # 当前层的节点数量\n level_size = len(queue)\n \n # 每一层的第一个节点就是该层的最左侧节点\n # 我们只需要记录它,然后继续遍历\n bottom_left_val = queue[0].val\n \n # 遍历当前层的所有节点\n for _ in range(level_size):\n node = queue.popleft()\n \n # 将下一层的节点加入队列\n if node.left:\n queue.append(node.left)\n if node.right:\n queue.append(node.right)\n \n return bottom_left_val\n```\n时间复杂度:O(N),其中 N 是树中节点的总数。因为每个节点都会入队和出队一次。\n空间复杂度:O(W),其中 W 是树的最大宽度。在最坏的情况下(一个完整的二叉树),队列的大小可以达到 N/2。\n\n---\n当然dfs也是可以做的,要记录目前为止发现的最深层级max_depth和最深层级最左边节点的值result_val,先左后右地进行递归\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n self.max_depth = -1 # 记录最大深度,初始化为-1\n self.result_val = 0 # 记录结果值\n \n def dfs(node: Optional[TreeNode], current_depth: int):\n if not node:\n return\n \n # 如果当前深度大于已记录的最大深度\n # 说明我们第一次到达这个新深度,且由于先序遍历的顺序,这一定是该层最左的节点\n if current_depth > self.max_depth:\n self.max_depth = current_depth\n self.result_val = node.val\n \n # 必须先遍历左子树,再遍历右子树\n dfs(node.left, current_depth + 1)\n dfs(node.right, current_depth + 1)\n \n dfs(root, 0)\n return self.result_val\n```\n时间复杂度:O(N),因为我们仍然需要访问树中的每一个节点。\n空间复杂度:O(H),其中 H 是树的高度。这部分空间是递归调用栈所占用的。最坏情况下,树呈链状,空间复杂度为 O(N)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3146236433","body":"```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n def dfs(node):\n if not node:\n res.append(\"null\")\n return\n res.append(str(node.val))\n dfs(node.left)\n dfs(node.right)\n \n dfs(root)\n return \",\".join(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n if not data:\n return None\n \n # 使用列表模拟一个队列,方便 pop(0)\n node_list = data.split(',')\n \n def build_tree():\n val = node_list.pop(0)\n if val == \"null\":\n return None\n \n node = TreeNode(int(val))\n node.left = build_tree()\n node.right = build_tree()\n return node\n \n return build_tree()\n```\n复杂度 空间和时间都是 O(N)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3141867802","body":"坐标记录 + 排序\n为每一个节点确定其坐标 (row, col),并记录下 (row, col, val) 这个三元组。最后BFS即可(DFS应该也行)\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import List, Optional\nimport collections\n\nclass Solution:\n def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:\n if not root:\n return []\n \n # 1. 遍历与记录\n # 使用 BFS 遍历树,记录每个节点的 (col, row, val)\n nodes_info = []\n queue = collections.deque([(root, 0, 0)]) # (node, row, col)\n \n while queue:\n node, row, col = queue.popleft()\n nodes_info.append((col, row, node.val))\n \n if node.left:\n queue.append((node.left, row + 1, col - 1))\n if node.right:\n queue.append((node.right, row + 1, col + 1))\n \n # 2. 排序\n # 对记录下来的节点信息进行排序\n # Python 的元组排序默认按元素顺序比较,完美符合题目要求\n nodes_info.sort()\n \n # 3. 分组\n # 将排序后的结果按列分组\n result_map = collections.OrderedDict()\n for col, row, val in nodes_info:\n if col not in result_map:\n result_map[col] = []\n result_map[col].append(val)\n \n return list(result_map.values())\n```\n时间复杂度:O(N log N)。\nBFS 遍历需要 O(N) 的时间,其中 N 是节点数。nodes_info.sort() 是整个算法的瓶颈,对 N 个元素排序需要 O(N log N) 的时间。最后的分组步骤需要 O(N) 的时间。\n因此,总时间复杂度为 O(N log N)。\n\n空间复杂度:O(N)。\nBFS 的队列在最坏情况下需要存储 O(W) 个节点,W 是树的最大宽度。nodes_info 列表需要存储所有 N 个节点的信息,因此需要 O(N) 的空间。result_map 也需要 O(N) 的空间来存储所有节点的值。\n因此,总空间复杂度为 O(N)。\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146235205","body":"```python\nfrom typing import List, Set\n\nclass Solution:\n def generateParenthesis(self, n: int) -> List[str]:\n # 使用列表来模拟dp数组,每个元素是一个哈希集合\n dp: List[Set[str]] = [set() for _ in range(n + 1)]\n \n # 基础情况:0对括号只有一种组合,即空字符串\n dp[0].add(\"\")\n \n # 从1对括号开始,迭代到n对\n for i in range(1, n + 1):\n # 遍历所有可能的分割点 j\n for j in range(i):\n # A 部分有 j 对括号,B 部分有 i-1-j 对\n list_p = dp[j]\n list_q = dp[i - 1 - j]\n \n # 组合 p 和 q\n for p in list_p:\n for q in list_q:\n # 使用哈希集合 dp[i] 自动去重\n dp[i].add(f\"({p}){q}\")\n \n return list(dp[n])\n```\n复杂度好像有点难算 看看大家有没有什么想法 我再算一算","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3147359265","body":"首先想到的是26字母那道题一样开一个数组然后建一个数组索引转换hash map去做 但是我不清楚是不是升序 所以要用min和max 那这样的效果肯定很差 内存会超 结果没想到居然能过\n```python\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n if not nums:\n return []\n \n # -----------------------------------------------------------------\n # 步骤 1: 使用“数组哈希”(直接寻址法)统计频率\n # -----------------------------------------------------------------\n \n # a. 找到数值范围以确定数组大小\n min_val = min(nums)\n max_val = max(nums)\n \n # b. 定义偏移量,将所有数值映射到数组的非负索引\n offset = -min_val\n \n # c. 创建计数数组\n count_array_size = max_val - min_val + 1\n count_array = [0] * count_array_size\n \n # d. 遍历原数组,完成计数\n for num in nums:\n # 将 num 通过偏移量映射到数组索引\n index = num + offset\n count_array[index] += 1\n\n # -----------------------------------------------------------------\n # 步骤 2: 使用桶排序来找到前 K 个高频元素\n # -----------------------------------------------------------------\n\n # a. 创建桶,桶的索引代表频率\n # 桶的数量是 len(nums) + 1,因为一个元素的频率不可能超过总数\n buckets = [[] for _ in range(len(nums) + 1)]\n\n # b. 遍历计数数组,将元素放入对应频率的桶中\n for i in range(count_array_size):\n freq = count_array[i]\n if freq > 0:\n # 将索引 i 转换回原始数字\n num = i - offset\n buckets[freq].append(num)\n\n # -----------------------------------------------------------------\n # 步骤 3: 从后往前收集结果\n # -----------------------------------------------------------------\n \n result = []\n # 从最高频率的桶开始遍历\n for i in range(len(buckets) - 1, 0, -1):\n # 如果当前频率的桶中有元素\n if buckets[i]:\n # 将这个桶里的所有元素加入结果集\n result.extend(buckets[i])\n \n # 如果结果集大小已经足够,可以提前退出\n if len(result) >= k:\n break\n \n # 返回前 k 个元素,如果最后一个桶加入了多余元素,用切片保证只返回k个\n return result[:k]\n```\n---\n然后我想到遍历数组 建一个hash map(元素,频率) 然后按频率降序排序提出来前k个\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n # 1. 使用 collections.Counter 快速统计频率,O(N)\n freq_map = collections.Counter(nums)\n \n # 2. 对哈希表按值(频率)进行排序\n # sorted 函数的时间复杂度是 O(M log M),其中 M 是不同元素的数量\n # M <= N,所以最坏是 O(N log N)\n sorted_items = sorted(freq_map.items(), key=lambda item: item[1], reverse=True)\n \n # 3. 提取前 k 个元素\n result = [item[0] for item in sorted_items[:k]]\n \n return result\n```\n空间复杂度:O(N)\n时间复杂度:O(NlogN)。其中 N 是数组 nums 的长度。瓶颈在于排序那一步,即使只有 M 个独立元素,在最坏情况下 M 可能等于 N。这个复杂度不满足题目进阶要求。\n\n---\n可以看到关键问题在于排序,想办法避免排序 我就可以用最小堆来做\n维护一个最小的heapq 按频率存入 如果堆的大小超过k了就把频率最低的pop out就行\n```python\nimport collections\nimport heapq\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n # 1. 统计频率,O(N)\n freq_map = collections.Counter(nums)\n \n # 2. 维护一个大小为 k 的最小堆,O(M log k),M是不同元素的数量\n min_heap = []\n for num, freq in freq_map.items():\n # Python的heapq是最小堆,所以我们存入(频率, 数字)\n # 这样堆会根据频率排序\n heapq.heappush(min_heap, (freq, num))\n if len(min_heap) > k:\n heapq.heappop(min_heap) # pop out频率最小的元素\n \n # 3. 提取结果\n # 此时堆中的k个元素就是频率最高的k个\n result = [item[1] for item in min_heap]\n return result\n```\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3156822202","body":"双指针滑动窗口\n```python\nclass Solution:\n def lengthOfLongestSubstring(self, s: str) -> int:\n # 哈希表存储 {字符: 最后出现的位置索引}\n char_map = {}\n max_len = 0\n left = 0 # 窗口的左边界\n \n # right 是窗口的右边界,不断向右移动\n for right in range(len(s)):\n char = s[right]\n \n # 如果当前字符已经存在于哈希表中,并且其位置在当前窗口内\n if char in char_map and char_map[char] >= left:\n # 遇到重复字符,收缩窗口\n # 将左边界移动到重复字符上一次出现位置的下一个位置\n left = char_map[char] + 1\n \n # 更新字符的最新位置\n char_map[char] = right\n \n # 更新最大长度\n current_len = right - left + 1\n max_len = max(max_len, current_len)\n \n return max_len\n```\n时间复杂度:O(N)。left 和 right 两个指针都只会从头到尾遍历字符串一次,每个字符最多被访问两次。\n\n空间复杂度:O(k),其中 k 是字符串中不同字符的数量。在最坏的情况下(所有字符都不同),空间复杂度为 O(N)。如果字符集有限(例如 ASCII 码共 128 个),则空间复杂度为常数 O(128)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3156831483","body":"这道题和上一题的区别一个是子字符串(3)一个是子序列(30)\n解法还是双指针滑动窗口 只不过需要改造一下,现在要独立扫描word_len 次\n即\n>第一次扫描:从索引 0 开始,窗口每次移动 word_len,检查的子串是 s[0...], s[word_len...], s[2*word_len...] ...\n第二次扫描:从索引 1 开始,窗口每次移动 word_len,检查的子串是 s[1...], s[1+word_len...], s[1+2*word_len...] ...\n\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def findSubstring(self, s: str, words: List[str]) -> List[int]:\n if not s or not words:\n return []\n\n word_len = len(words[0])\n num_words = len(words)\n total_len = word_len * num_words\n words_freq = collections.Counter(words)\n result = []\n\n # 我们需要进行 word_len 次扫描\n for i in range(word_len):\n left = i # 当前扫描的窗口左边界\n seen = collections.Counter() # 当前窗口内单词的频率\n count = 0 # 当前窗口内有效单词的数量\n\n # 窗口右边界以 word_len 为步长滑动\n for j in range(i, len(s) - word_len + 1, word_len):\n word = s[j : j + word_len]\n \n if word in words_freq:\n seen[word] += 1\n count += 1\n \n # 如果一个单词的数量超了,就从左边收缩窗口\n while seen[word] > words_freq[word]:\n left_word = s[left : left + word_len]\n seen[left_word] -= 1\n count -= 1\n left += word_len\n \n # 如果窗口内单词数量正好,说明找到了一个解\n if count == num_words:\n result.append(left)\n # 为了继续搜索,将窗口最左边的单词移出\n left_word = s[left : left + word_len]\n seen[left_word] -= 1\n count -= 1\n left += word_len\n\n else:\n # 如果遇到的单词不在 words 列表中,则当前窗口作废\n # 直接将左边界移动到这个坏单词的后面\n seen.clear()\n count = 0\n left = j + word_len\n \n return result\n```\n时间复杂度O(N),N是字符串s的长度\n空间复杂度O(ML),M是words列表里的单词数量 L是每个单词长度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3161453831","body":"```python\nfrom typing import List\n\nclass Solution:\n def minSubarray(self, nums: List[int], p: int) -> int:\n n = len(nums)\n # 1. 同余定理:计算目标余数\n target_rem = sum(nums) % p\n \n # 如果总和已经能被 p 整除,无需移除\n if target_rem == 0:\n return 0\n \n # 2. 哈希表:存储 {余数: 最后一次出现的索引}\n # 初始化 {0: -1} 来处理从开头开始的子数组\n rem_map = {0: -1}\n min_len = n # 初始化为一个最大值\n \n # 3. 前缀和:用一个变量 current_sum 动态计算\n current_sum = 0\n \n for i, num in enumerate(nums):\n current_sum += num\n current_rem = current_sum % p\n \n # 计算需要寻找的配对余数\n needed_rem = (current_rem - target_rem + p) % p\n \n # 如果找到了配对\n if needed_rem in rem_map:\n prev_index = rem_map[needed_rem]\n # 更新最短长度\n min_len = min(min_len, i - prev_index)\n \n # 更新当前余数的最新索引\n rem_map[current_rem] = i\n \n # 如果 min_len 没有被更新过,或者更新后的值等于n(意味着要移除整个数组)\n # 则说明找不到合适的“真”子数组\n return min_len if min_len < n else -1\n```\n时间复杂度:O(N),因为我们只遍历了数组一次。\n空间复杂度:O(min(N,p)),因为哈希表中最多存储 p 个不同的余数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3169922808","body":"双指针\n```python\nfrom typing import Optional\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\n\nclass Solution:\n def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n # 初始化快慢指针\n slow = head\n fast = head\n \n # 当快指针没有走到链表末尾时\n while fast and fast.next:\n # 慢指针走一步\n slow = slow.next\n # 快指针走两步\n fast = fast.next.next\n \n # 当循环结束时,慢指针正好在中间位置\n return slow\n```\n时间复杂度:O(N)。虽然有两个指针,但我们只对链表进行了一次单向遍历。\n空间复杂度:O(1)。只使用了两个额外的指针变量,没有使用额外的存储空间。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169886502","body":"双指针/快慢指针\n快的去遍历 慢的维护只出现一次的元素\n```python\nfrom typing import List\n\nclass Solution:\n def removeDuplicates(self, nums: List[int]) -> int:\n # 如果数组为空,直接返回 0\n if not nums:\n return 0\n \n # slow 指针指向下一个将要被赋值的、新的不重复元素的位置。\n # nums[0] 默认是第一个不重复的元素,所以 slow 从 1 开始。\n slow = 1\n \n # fast 指针从第二个元素开始,遍历整个数组\n for fast in range(1, len(nums)):\n if nums[fast] != nums[fast - 1]:\n nums[slow] = nums[fast]\n slow += 1\n \n return slow","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173197055","body":"我们可以用单调队列(双端队列 (deque))来维护窗口内的“候选最大值”,使得获取当前最大值的操作是 O(1) 的\n>双端队列 (deque)\n队列中存储的是数组元素的索引,而不是元素本身。\n队列中的索引所对应的 nums 数组中的值,是从头到尾单调递减的。\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n n = len(nums)\n if n * k == 0:\n return []\n \n # 单调队列,存储的是元素的索引\n # 队列中的索引对应的 nums 值是单调递减的\n deque = collections.deque()\n result = []\n\n for i in range(n):\n # 1. 维护单调性:移除队尾所有小于当前值的元素\n while deque and nums[deque[-1]] <= nums[i]:\n deque.pop()\n \n # 2. 当前元素索引入队\n deque.append(i)\n \n # 3. 维护窗口大小:移除已经滑出窗口的队头元素\n if deque[0] <= i - k:\n deque.popleft()\n \n # 4. 记录结果:当窗口完全形成后开始记录\n if i >= k - 1:\n # 队头元素永远是当前窗口的最大值\n result.append(nums[deque[0]])\n \n return result\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3187054447","body":"```python\nfrom typing import List\n\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n # 使用一个数组记录每个人的信任差额\n trust_scores = [0] * (n + 1)\n \n for a, b in trust:\n trust_scores[a] -= 1 # 信任别人,分数-1\n trust_scores[b] += 1 # 被人信任,分数+1\n \n # 寻找分数为 n-1 的法官\n for i in range(1, n + 1):\n if trust_scores[i] == n - 1:\n return i\n \n return -1\n```\n时间复杂度: O(n + m), m为trust列表长度\n空间复杂度: O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3187045338","body":"这道题的本质是判断一个图是否为二分图 (Bipartite Graph)。\n n 个人看作是图的 n 个节点 (Vertex),每一对 dislike关系 [a, b] 看作是连接节点 a 和 b 的一条无向边 (Edge)。\n判断由人和他们之间的“不喜欢”关系构成的图,是否是一个二分图。\nDFS着色\n```python\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:\n # 1. 构建图的邻接表\n graph = [[] for _ in range(n + 1)]\n for u, v in dislikes:\n graph[u].append(v)\n graph[v].append(u)\n \n # 2. 创建 colors 数组,0:未着色, 1:颜色A, -1:颜色B\n colors = [0] * (n + 1)\n \n # 3. 遍历所有节点\n for i in range(1, n + 1):\n # 如果节点未被着色,从它开始进行DFS\n if colors[i] == 0:\n if not self.dfs(i, 1, colors, graph):\n return False\n \n return True\n\n def dfs(self, node: int, color: int, colors: List[int], graph: List[List[int]]) -> bool:\n # 给当前节点染色\n colors[node] = color\n \n # 遍历所有邻居\n for neighbor in graph[node]:\n # 如果邻居颜色与当前节点相同,产生冲突\n if colors[neighbor] == color:\n return False\n # 如果邻居未被染色,对其进行DFS\n if colors[neighbor] == 0:\n # 给邻居染上相反的颜色\n if not self.dfs(neighbor, -color, colors, graph):\n return False\n \n return True\n```\nBFS着色\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:\n # 1. 构建图的邻接表\n graph = [[] for _ in range(n + 1)]\n for u, v in dislikes:\n graph[u].append(v)\n graph[v].append(u)\n \n # 2. 创建 colors 数组\n colors = [0] * (n + 1)\n \n # 3. 遍历所有节点\n for i in range(1, n + 1):\n if colors[i] == 0: # 未被染色,开始BFS\n queue = collections.deque([i])\n colors[i] = 1 # 染上颜色A\n \n while queue:\n node = queue.popleft()\n # 遍历邻居\n for neighbor in graph[node]:\n # 如果邻居颜色与当前节点相同,冲突\n if colors[neighbor] == colors[node]:\n return False\n # 如果邻居未染色,染上相反颜色并入队\n if colors[neighbor] == 0:\n colors[neighbor] = -colors[node]\n queue.append(neighbor)\n \n return True\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3187051602","body":"双层拓扑排序 关键在于排序的规则\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:\n \n # 1. 数据预处理:为没有团队的项目分配新团队ID\n new_group_id = m\n for i in range(n):\n if group[i] == -1:\n group[i] = new_group_id\n new_group_id += 1\n \n num_groups = new_group_id\n\n # 2. 构建项目图和团队图及其入度数组\n item_graph = [[] for _ in range(n)]\n item_indegree = [0] * n\n group_graph = [[] for _ in range(num_groups)]\n group_indegree = [0] * num_groups\n\n for i in range(n):\n for prev_item in beforeItems[i]:\n # 项目图依赖\n item_graph[prev_item].append(i)\n item_indegree[i] += 1\n \n # 如果属于不同团队,则产生团队图依赖\n if group[prev_item] != group[i]:\n group_graph[group[prev_item]].append(group[i])\n group_indegree[group[i]] += 1\n\n # 3. 通用的拓扑排序函数\n def topological_sort(graph, indegree):\n num_nodes = len(graph)\n queue = collections.deque([i for i in range(num_nodes) if indegree[i] == 0])\n sorted_order = []\n while queue:\n u = queue.popleft()\n sorted_order.append(u)\n for v in graph[u]:\n indegree[v] -= 1\n if indegree[v] == 0:\n queue.append(v)\n \n return sorted_order if len(sorted_order) == num_nodes else []\n\n # 4. 执行两次拓扑排序\n item_order = topological_sort(item_graph, item_indegree)\n group_order = topological_sort(group_graph, group_indegree)\n\n if not item_order or not group_order:\n return []\n\n # 5. 合并结果\n # a. 将排好序的项目按团队分组\n items_by_group = collections.defaultdict(list)\n for item in item_order:\n items_by_group[group[item]].append(item)\n \n # b. 根据团队顺序,拼接项目\n final_result = []\n for group_id in group_order:\n final_result.extend(items_by_group[group_id])\n \n return final_result\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3193081347","body":"模拟\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n # 初始化坐标\n x, y = 0, 0\n \n # 遍历每一步\n for move in moves:\n if move == 'U':\n y += 1\n elif move == 'D':\n y -= 1\n elif move == 'L':\n x -= 1\n elif move == 'R':\n x += 1\n \n # 检查最终位置是否为原点\n return x == 0 and y == 0\n```\n或者直接看字符串里面是否满足U==D, L==R\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n # Python 的 count() 方法让这个思路的实现非常简洁\n # 检查向上和向下的步数是否相等\n vertical_balance = (moves.count('U') == moves.count('D'))\n \n # 检查向左和向右的步数是否相等\n horizontal_balance = (moves.count('L') == moves.count('R'))\n \n return vertical_balance and horizontal_balance\n```\n两个复杂度是一样的\n时间复杂度:O(N)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193084373","body":"排序 + 最小堆\nmin_heap存放已到达但未执行的任务(processingTime, original_index) 按照时间、索引排序\n```python\nimport heapq\nfrom typing import List\n\nclass Solution:\n def getOrder(self, tasks: List[List[int]]) -> List[int]:\n # 1. 数据预处理:附加原始索引并按入队时间排序\n # tasks_with_indices 的格式: [[enqueueTime, processingTime, original_index], ...]\n tasks_with_indices = sorted(\n [(tasks[i][0], tasks[i][1], i) for i in range(len(tasks))]\n )\n \n result_order = []\n min_heap = [] # 优先队列,存储 (processingTime, original_index)\n \n task_pointer = 0 # 指向下一个要检查的任务\n current_time = 0 # 当前时间\n \n # 当还有任务未处理或未入队时,循环继续\n while task_pointer < len(tasks) or min_heap:\n \n # 如果CPU空闲且没有任务在等待,快进到下一个任务的到达时间\n if not min_heap and current_time < tasks_with_indices[task_pointer][0]:\n current_time = tasks_with_indices[task_pointer][0]\n\n # 2. 将所有已到达的任务加入最小堆\n while task_pointer < len(tasks) and tasks_with_indices[task_pointer][0] <= current_time:\n enqueue_time, process_time, original_index = tasks_with_indices[task_pointer]\n heapq.heappush(min_heap, (process_time, original_index))\n task_pointer += 1\n \n # 3. 从堆中取出最优任务执行\n if min_heap:\n process_time, original_index = heapq.heappop(min_heap)\n current_time += process_time\n result_order.append(original_index)\n \n return result_order\n```\n复杂度:假设N个任务,那么时间复杂度是O(NlogN)有排序造成的,空间是O(N) tasks列表和min_heap都需要O(N)的空间","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3204406944","body":"a->c,需要len(a) - a中c的个数\nb->c需要len(b) - b中c的个数\n我们需要考虑len(a) + len(b) - (a中c的个数 + b中c的个数)\n此外还可以优化一下\n如果a= c 的字符。\nb 中需要改变的,是那些 < c 的字符。\na>=b同理\n```python\nimport collections\n\nclass Solution:\n def minCharacters(self, a: str, b: str) -> int:\n n, m = len(a), len(b)\n freq_a = collections.Counter(a)\n freq_b = collections.Counter(b)\n\n # --- 计算条件 3 的最小代价 ---\n # 代价 = 总长度 - 两个字符串中某个字符的最大总频次\n max_combined_freq = 0\n for i in range(26):\n char = chr(ord('a') + i)\n max_combined_freq = max(max_combined_freq, freq_a[char] + freq_b[char])\n \n cost3 = n + m - max_combined_freq\n\n # --- 计算条件 1 (a < b) 和 条件 2 (b < a) 的最小代价 ---\n cost1 = float('inf') # a < b\n cost2 = float('inf') # b < a\n \n # 使用前缀/后缀和的思想来优化计数\n a_lt_count = 0 # a 中 < 当前分界线的字符数\n b_lt_count = 0\n \n # 遍历所有 25 个可能的分界线 ('b' 到 'z')\n for i in range(25):\n char = chr(ord('a') + i)\n a_lt_count += freq_a[char]\n b_lt_count += freq_b[char]\n \n # 分界线是 char_next = chr(ord('a') + i + 1)\n # 条件 1 (a < char_next, b >= char_next):\n # - a 中要改的是 >= char_next 的, 即 (n - a_lt_count)\n # - b 中要改的是 < char_next 的, 即 b_lt_count\n current_cost1 = (n - a_lt_count) + b_lt_count\n cost1 = min(cost1, current_cost1)\n \n # 条件 2 (b < char_next, a >= char_next):\n # - b 中要改的是 >= char_next 的, 即 (m - b_lt_count)\n # - a 中要改的是 < char_next 的, 即 a_lt_count\n current_cost2 = (m - b_lt_count) + a_lt_count\n cost2 = min(cost2, current_cost2)\n\n return min(cost1, cost2, cost3)\n```\n时间复杂度:O(N+M),其中 N 和 M 分别是两个字符串的长度。\n空间复杂度:O(1),大小为 26 的频率表\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3208576782","body":"堆排序\n```python\nclass Solution:\n def sortArray(self, nums: List[int]) -> List[int]:\n def heapify(nums, n, i):\n largest = i\n left = 2 * i + 1\n right = 2 * i + 2\n\n if left < n and nums[left] > nums[largest]:\n largest = left\n if right < n and nums[right] > nums[largest]:\n largest = right\n if largest != i:\n nums[i], nums[largest] = nums[largest], nums[i]\n heapify(nums, n, largest)\n\n n = len(nums)\n for i in range(n // 2 - 1, -1, -1):\n heapify(nums, n, i)\n\n for i in range(n - 1, 0, -1):\n nums[i], nums[0] = nums[0], nums[i]\n heapify(nums, i, 0)\n```\n时间复杂度:O(NlogN)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3208555582","body":"二分\n```python\nclass Solution:\n def mySqrt(self, x: int) -> int:\n\n if x == 0:\n return 0\n \n # 定义二分查找的左右边界\n left, right = 0, x\n ans = 0\n \n while left <= right:\n # 计算中间值\n mid = left + (right - left) // 2\n \n # 避免 mid 为 0 的情况,或者直接判断 mid * mid\n if mid == 0:\n left = mid + 1\n continue\n \n # 比较 mid 的平方与 x\n # 为了防止 mid * mid 溢出(在某些语言中),可以写成 mid <= x / mid\n if mid * mid > x:\n # mid 太大,搜索左半部分\n right = mid - 1\n else:\n # mid 是一个可能的答案,尝试寻找更大的\n ans = mid\n left = mid + 1\n \n return ans\n```\n时间复杂度:O(logN)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208553626","body":"二分查找\n```python\nclass Solution:\n def firstBadVersion(self, n: int) -> int:\n left, right = 1, n\n \n while left < right:\n mid = left + (right - left) // 2\n \n if isBadVersion(mid):\n # 如果 mid 是坏的,那第一个坏版本在 [left, mid] 区间内\n # 我们不能排除 mid,所以 right = mid\n right = mid\n else:\n # 如果 mid 是好的,那第一个坏版本在 [mid + 1, right] 区间内\n left = mid + 1\n \n return left\n```\n时间复杂度:O(logN)\n空间复杂度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3222475353","body":"排除法\n排除掉卡片的正面和背面是同一个数字 X的卡片\n```python\nfrom typing import List\n\nclass Solution:\n def flipgame(self, fronts: List[int], backs: List[int]) -> int:\n # 1. 找出所有“不可能的”数字\n impossible_nums = set()\n for i in range(len(fronts)):\n if fronts[i] == backs[i]:\n impossible_nums.add(fronts[i])\n \n # 2. 寻找最小的“好”数字\n min_good_num = float('inf')\n found_good_num = False\n \n # 遍历所有出现过的数字\n all_nums = fronts + backs\n \n for num in all_nums:\n # 如果这个数字不是“不可能的”\n if num not in impossible_nums:\n found_good_num = True\n min_good_num = min(min_good_num, num)\n \n # 3. 返回结果\n return min_good_num if found_good_num else 0\n```\n时间复杂度:O(N),其中 N 是卡片的数量。\n空间复杂度:O(N)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3222461055","body":"二分 + DFS/BFS\n```python\nfrom typing import List\n\nclass Solution:\n def swimInWater(self, grid: List[List[int]]) -> int:\n n = len(grid)\n left, right = grid[0][0], n * n - 1\n ans = right\n\n def is_possible(t):\n # 检查在时间 t 是否能从 (0,0) 到达 (n-1, n-1)\n if grid[0][0] > t:\n return False\n \n stack = [(0, 0)]\n visited = {(0, 0)}\n \n while stack:\n r, c = stack.pop()\n if r == n - 1 and c == n - 1:\n return True\n \n for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:\n nr, nc = r + dr, c + dc\n if 0 <= nr < n and 0 <= nc < n and (nr, nc) not in visited and grid[nr][nc] <= t:\n visited.add((nr, nc))\n stack.append((nr, nc))\n return False\n\n while left <= right:\n mid = left + (right - left) // 2\n if is_possible(mid):\n ans = mid\n right = mid - 1\n else:\n left = mid + 1\n \n return ans\n```\n时间复杂度:O($n^2logn$)\n空间复杂度:O($n^2$)\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222456504","body":"Sliding Window\n维护一个固定大小为 k 的窗口,在字符串上滑动。当窗口向右移动一格时,只需要考虑移出窗口的字符和移入窗口的字符对元音数量的影响即可。\n```python\nfrom typing import List\n\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n vowels = {'a', 'e', 'i', 'o', 'u'}\n \n # 1. 初始化:计算第一个窗口的元音数\n current_vowels = 0\n for i in range(k):\n if s[i] in vowels:\n current_vowels += 1\n \n max_vowels = current_vowels\n \n # 2. 滑动窗口\n # 从第 k 个字符开始,模拟窗口向右滑动\n for i in range(k, len(s)):\n # a. 处理新移入的字符 s[i]\n if s[i] in vowels:\n current_vowels += 1\n \n # b. 处理被移出的字符 s[i-k]\n if s[i-k] in vowels:\n current_vowels -= 1\n \n # c. 更新最大值\n max_vowels = max(max_vowels, current_vowels)\n \n return max_vowels\n```\n时间复杂度:O(N)\n空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3232274052","body":"动态规划 + 滑动窗口\n定义 dp[i] 为:爱丽丝最终得分恰好为 i 的概率,最后要计算$\\sum_i=k^n dp[i]$,dp[0] = 1\n```python\nclass Solution:\n def new21Game(self, n: int, k: int, maxPts: int) -> float:\n # 如果 k=0,开始就是 >=k,游戏直接结束,得分为0,概率为1\n if k == 0:\n return 1.0\n \n # dp[i] 表示得到分数 i 的概率\n dp = [0.0] * (n + 1)\n dp[0] = 1.0\n \n # window_sum 维护一个大小为 maxPts 的滑动窗口内 dp 值的和\n window_sum = 1.0\n result = 0.0\n \n for i in range(1, n + 1):\n # 计算 dp[i]\n dp[i] = window_sum / maxPts\n \n # 如果 i < k,dp[i] 会对后续的 dp 值产生贡献,加入窗口\n if i < k:\n window_sum += dp[i]\n \n # 如果 i >= k,这是一个最终得分,累加到结果中\n # 注意:题目求的是 <= n 的概率,而 dp 数组只到 n,所以循环内累加即可\n if i >= k:\n result += dp[i]\n \n # 如果 i >= maxPts,需要将滑出窗口的 dp 值减去\n if i >= maxPts:\n window_sum -= dp[i - maxPts]\n \n return result\n```\n时间复杂度:O(n)。我们只对 dp 数组进行了一次遍历。\n空间复杂度:O(n)。用于存储 dp 数组。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3232278119","body":"滑动窗口 + 字符频率统计\n```python\nfrom typing import List\n\nclass Solution:\n def findAnagrams(self, s: str, p: str) -> List[int]:\n s_len, p_len = len(s), len(p)\n \n # 边缘情况:如果 s 比 p 短,不可能找到异位词\n if s_len < p_len:\n return []\n \n result = []\n # 使用大小为 26 的数组作为频率统计表\n p_counts = [0] * 26\n s_window_counts = [0] * 26\n \n # 1. & 2. 初始化 p 的频率表和 s 的第一个窗口的频率表\n for i in range(p_len):\n p_counts[ord(p[i]) - ord('a')] += 1\n s_window_counts[ord(s[i]) - ord('a')] += 1\n \n # 3. 第一次比较\n if p_counts == s_window_counts:\n result.append(0)\n \n # 4. 滑动窗口\n for i in range(p_len, s_len):\n # a. 移入新字符\n s_window_counts[ord(s[i]) - ord('a')] += 1\n # b. 移出旧字符\n s_window_counts[ord(s[i - p_len]) - ord('a')] -= 1\n \n # c. 再次比较\n if p_counts == s_window_counts:\n # 当前窗口的起始索引是 i - p_len + 1\n result.append(i - p_len + 1)\n \n return result\n```\n时间复杂度:O(textlen(s)+textlen(p))\n空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235951126","body":"用一个 right 指针不断地扩展窗口,直到窗口内的子串满足了“包含 t 中所有字符”的条件。一旦窗口满足条件,就记录下这个“可行解”,然后开始移动 left 指针,收缩窗口\n```python\nimport collections\n\nclass Solution:\n def minWindow(self, s: str, t: str) -> str:\n # need 存储 t 中字符的需求数量\n need = collections.Counter(t)\n # window 存储当前窗口中字符的数量\n window = collections.Counter()\n\n left, right = 0, 0\n valid = 0 # 记录 window 中有多少字符已经满足了 need 的要求\n \n # 记录最小覆盖子串的起始索引和长度\n start = 0\n min_len = float('inf')\n\n while right < len(s):\n # c 是将移入窗口的字符\n c = s[right]\n right += 1\n \n # 扩展窗口\n if c in need:\n window[c] += 1\n if window[c] == need[c]:\n valid += 1\n \n # 判断左侧窗口是否要收缩\n while valid == len(need):\n # 在这里更新最小覆盖子串\n if right - left < min_len:\n start = left\n min_len = right - left\n\n # d 是将移出窗口的字符\n d = s[left]\n left += 1\n \n # 收缩窗口\n if d in need:\n if window[d] == need[d]:\n valid -= 1\n window[d] -= 1\n\n # 返回最小覆盖子串,如果 min_len 还是初始值,说明没有找到\n return \"\" if min_len == float('inf') else s[start : start + min_len]\n```\n时间复杂度: O(len(s)+len(t))\n空间复杂度: O(N), N是字符集的大小","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3244023262","body":"dfs\n```python\nfrom typing import List\n\nclass Solution:\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n if not grid:\n return 0\n \n rows, cols = len(grid), len(grid[0])\n max_area = 0\n \n def dfs(r, c):\n # 边界条件检查 & 终止条件 (遇到水或已访问过的陆地)\n if not (0 <= r < rows and 0 <= c < cols and grid[r][c] == 1):\n return 0\n \n # 将当前单元格标记为已访问 (沉岛)\n grid[r][c] = 0\n \n # 当前单元格面积为 1,并递归探索四个方向\n return (1 + dfs(r + 1, c) +\n dfs(r - 1, c) +\n dfs(r, c + 1) +\n dfs(r, c - 1))\n\n # 遍历整个网格\n for r in range(rows):\n for c in range(cols):\n if grid[r][c] == 1:\n current_area = dfs(r, c)\n max_area = max(max_area, current_area)\n \n return max_area\n```\n时间复杂度O(MN)\n空间复杂度最坏O(MN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3251910064","body":"Multi-Source BFS\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxDistance(self, grid: List[List[int]]) -> int:\n n = len(grid)\n queue = collections.deque()\n \n # 1. 初始化:将所有陆地加入队列\n for r in range(n):\n for c in range(n):\n if grid[r][c] == 1:\n queue.append((r, c))\n \n # 边缘情况:如果全是陆地或全是海洋\n if len(queue) == 0 or len(queue) == n * n:\n return -1\n \n distance = -1\n # 2. 多源 BFS\n while queue:\n distance += 1\n # 遍历当前层的所有节点\n for _ in range(len(queue)):\n r, c = queue.popleft()\n \n # 探索四个方向的邻居\n for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:\n nr, nc = r + dr, c + dc\n \n if 0 <= nr < n and 0 <= nc < n and grid[nr][nc] == 0:\n grid[nr][nc] = 1 # 标记为已访问\n queue.append((nr, nc))\n \n return distance\n```\n时间复杂度:O(N^2)\n空间复杂度:O(N^2)\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251914219","body":"模拟+bfs\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n \n total_candies = 0\n \n # 我们拥有的、但未打开的盒子\n my_closed_boxes = set()\n # 可以打开并处理的盒子队列\n queue = collections.deque()\n\n # 初始化\n for box_idx in initialBoxes:\n if status[box_idx] == 1:\n queue.append(box_idx)\n else:\n my_closed_boxes.add(box_idx)\n\n while queue:\n box_idx = queue.popleft()\n \n # 1. 拿糖果\n total_candies += candies[box_idx]\n \n # 2. 拿钥匙,并用新钥匙尝试打开已有的盒子\n for key in keys[box_idx]:\n status[key] = 1 \n if key in my_closed_boxes:\n queue.append(key)\n my_closed_boxes.remove(key)\n \n # 3. 拿新盒子\n for contained_box in containedBoxes[box_idx]:\n if status[contained_box] == 1:\n queue.append(contained_box)\n else:\n my_closed_boxes.add(contained_box)\n \n return total_candies\n```\n时间复杂度: O(盒子数+钥匙数+内涵盒子数)\n\n空间复杂度: O(盒子数)。最坏情况下要存储所有盒子的信息。\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260205356","body":"dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n```python\nclass Solution:\n def minCostClimbingStairs(self, cost: List[int]) -> int:\n n = len(cost)\n dp = [0] * (n + 1)\n \n # dp[0] 和 dp[1] 默认为 0,因为可以从这两级开始\n \n # 从第 2 级台阶开始,应用转移方程\n for i in range(2, n + 1):\n dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n \n return dp[n]\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3276673110","body":"dp[i] = max(nums[i-1] + dp[i-2], dp[i-1])\n\n```python\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n n = len(nums)\n if n == 0: return 0\n if n == 1: return nums[0]\n \n dp = [0] * (n + 1)\n dp[0] = 0\n dp[1] = nums[0]\n \n for i in range(2, n + 1):\n dp[i] = max(nums[i-1] + dp[i-2], dp[i-1])\n \n return dp[n]\n```\n可以优化到只依赖前两个状态来节省内存空间\n```python\nfrom typing import List\n\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n # rob_prev 代表 dp[i-2],rob_curr 代表 dp[i-1]\n rob_prev, rob_curr = 0, 0\n \n for num in nums:\n # 计算 dp[i] = max(num + dp[i-2], dp[i-1])\n temp = max(num + rob_prev, rob_curr)\n # 更新状态,为下一次循环做准备\n rob_prev = rob_curr\n rob_curr = temp\n \n return rob_curr\n```\n时间复杂度: O(N)\n空间复杂度: O(1)\n\n\n\n\n\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3276687323","body":"dp[i] = 1 + max(dp[j]),其中 0 <= j < i 且 nums[j] < nums[i]。\n```python\nfrom typing import List\n\nclass Solution:\n def findNumberOfLIS(self, nums: List[int]) -> int:\n n = len(nums)\n if n <= 1:\n return n\n \n # lengths[i]: 以 nums[i] 结尾的 LIS 长度\n # counts[i]: 以 nums[i] 结尾的 LIS 个数\n lengths = [1] * n\n counts = [1] * n\n\n # 填充 DP 数组\n for i in range(n):\n for j in range(i):\n if nums[j] < nums[i]:\n # 情况一:发现更长的子序列\n if lengths[j] + 1 > lengths[i]:\n lengths[i] = lengths[j] + 1\n counts[i] = counts[j] # 路径数继承\n # 情况二:发现另一条同样长的子序列\n elif lengths[j] + 1 == lengths[i]:\n counts[i] += counts[j] # 路径数累加\n\n max_len = max(lengths)\n result = 0\n for i in range(n):\n if lengths[i] == max_len:\n result += counts[i]\n \n return result\n```\n时间复杂度: O(N^2)\n\n空间复杂度: O(N)\n\n","onTime":false},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3276694316","body":"dp[r][c] =骑士当前位于棋盘上 (r, c) 位置的概率\n从 (r, c) 出发,能为下一个状态 dp_curr 中的 (nr, nc) 贡献 dp_prev[r][c] / 8 的概率\ndp_curr[nr][nc]=\\sum dp(nr, nc)\n```python\nfrom typing import List\n\nclass Solution:\n def knightProbability(self, n: int, k: int, row: int, column: int) -> float:\n # dp[r][c] 表示骑士在 (r, c) 位置的概率\n dp = [[0.0] * n for _ in range(n)]\n dp[row][column] = 1.0\n \n # 骑士的8个移动方向\n moves = [(-2, -1), (-2, 1), (-1, -2), (-1, 2),\n (1, -2), (1, 2), (2, -1), (2, 1)]\n \n # 迭代 k 步\n for _ in range(k):\n # dp_next 用于存储下一步的概率分布\n dp_next = [[0.0] * n for _ in range(n)]\n \n # 遍历棋盘上所有位置\n for r in range(n):\n for c in range(n):\n # 如果当前位置有概率 > 0\n if dp[r][c] > 0:\n # 尝试8种移动\n for dr, dc in moves:\n nr, nc = r + dr, c + dc\n \n # 如果移动后的位置在棋盘内\n if 0 <= nr < n and 0 <= nc < n:\n # 将概率贡献给下一个状态\n dp_next[nr][nc] += dp[r][c] / 8.0\n \n # 用新状态覆盖旧状态\n dp = dp_next\n \n # 计算最终仍在棋盘上的总概率\n total_probability = sum(sum(row) for row in dp)\n return total_probability\n```\n时间复杂度 O(kn^2)\n空间复杂度: O(n^2)","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gjwang224":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3086564307","body":"## Code\n```cpp\nclass Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n int len = num.size()-1;\n vector returnNum;\n int tmp=0;\n \n while(k && len>=0){\n returnNum.push_back((num[len] + k%10 + tmp)%10);\n tmp = (num[len] + k%10 + tmp)/10;\n len--;\n k = k/10;\n }\n\n while(k){\n returnNum.push_back((k%10 + tmp)%10);\n tmp = (k%10 + tmp)/10;\n k = k/10;\n }\n \n while(len>=0){\n returnNum.push_back((num[len] + tmp)%10);\n tmp = (num[len] + tmp)/10;\n len--;\n }\n \n if(tmp) returnNum.push_back(tmp);\n reverse(returnNum.begin(), returnNum.end());\n return returnNum;\n }\n};","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3093190969","body":"#### C++\n``` C++\nclass Solution {\npublic:\n vector shortestToChar(string s, char c) {\n vector dis, rearr;\n for(int i = 0; i < s.size(); i++) if(s.at(i) == c) dis.push_back(i);\n for(int i = 0; i < s.size(); i++){\n int minn = 1e5+5;\n for(int j = 0; j < dis.size(); j++){\n minn = min(minn, abs(i-dis.at(j)));\n }\n rearr.push_back(minn);\n }\n return rearr;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3087031064","body":"### C++ 代码\n``` C++\nclass CustomStack {\npublic:\n int stack[1005];\n int size = -1, mS;\n CustomStack(int maxSize) {\n mS = maxSize;\n }\n \n void push(int x) {\n if(size < mS-1){\n stack[++size] = x;\n }\n }\n \n int pop() {\n if(size < 0) return -1;\n else return stack[size--];\n }\n \n void increment(int k, int val) {\n for(int i = 0; i < k; i++){\n stack[i] += val;\n }\n }\n};\n\n/**\n * Your CustomStack object will be instantiated and called as such:\n * CustomStack* obj = new CustomStack(maxSize);\n * obj->push(x);\n * int param_2 = obj->pop();\n * obj->increment(k,val);\n */\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3086899860","body":"### 思路 \n遍历整个字符串,总共有四种可能,分别是 数字 字母 左括号 右括号\n1. 数字:定义`digit`存储读取到的数字\n2. 字母:可以直接读取累加至`res`\n3. 左括号:需要将前面的`res`和`digit`分别入栈,并将其赋为0和”“\n4. 右括号:读取栈顶元素,循环拼接后,累加至`res`\n### C++ 代码\n``` C++\nclass Solution {\npublic:\n string decodeString(string s) {\n stack numStack;\n stack strStack;\n int digit=0;\n string res=\"\";\n\n for(int i = 0; i < s.size(); i++){\n if(s.at(i) >= '0' && s.at(i) <= '9'){// 数字\n digit = digit*10+s.at(i)-'0';\n } else if(s.at(i) >= 'a' && s.at(i) <= 'z'){// 字符\n res += s.at(i);\n } else if(s.at(i) == '['){// 左括号\n numStack.push(digit);\n strStack.push(res);\n res = \"\";\n digit=0;\n } else {// 右括号\n int count = numStack.top();\n numStack.pop();\n string outString = strStack.top();\n strStack.pop();\n for(int i = 0; i < count; i++) outString += res;\n res = outString;\n }\n }\n return res;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092046146","body":"#### 思路\n\n1. `push`和`empty`可以直接进行操作。\n2. `pop`和 `peek`需要得到入栈的第一个元素,可以使用一个辅助栈,对第一个栈进行出栈同时第二个栈进行入栈操作,这样第二个栈`top`得到的元素就是第一个栈入栈的第一个元素。\n\n``` C++\nclass MyQueue {\npublic:\n stack tmp;\n stack stack;\n MyQueue() {\n }\n \n void push(int x) {\n tmp.push(x);\n }\n \n int pop() {\n while(!tmp.empty()){\n stack.push(tmp.top());\n tmp.pop();\n }\n int a = stack.top();\n stack.pop();\n while(!stack.empty()){\n tmp.push(stack.top());\n stack.pop();\n }\n return a;\n }\n \n int peek() {\n while(!tmp.empty()){\n stack.push(tmp.top());\n tmp.pop();\n }\n int a = stack.top();\n while(!stack.empty()){\n tmp.push(stack.top());\n stack.pop();\n }\n return a;\n }\n \n bool empty() {\n return tmp.empty();\n }\n};\n\n/**\n * Your MyQueue object will be instantiated and called as such:\n * MyQueue* obj = new MyQueue();\n * obj->push(x);\n * int param_2 = obj->pop();\n * int param_3 = obj->peek();\n * bool param_4 = obj->empty();\n */\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094511890","body":"#### 哈希\n\n```c++\nclass Solution {\npublic:\n int maxChunksToSorted(vector& arr) {\n unordered_map ans;\n vector tmp = arr;\n sort(tmp.begin(), tmp.end());\n int cnt=0;\n for(int i = 0; i < arr.size(); i++){\n ans[arr[i]]++;\n ans[tmp[i]]--;\n if(ans[arr[i]]==0) ans.erase(arr[i]);\n if(ans[tmp[i]]==0) ans.erase(tmp[i]);\n if(ans.empty()) cnt++;\n }\n return cnt;\n }\n};\n```\n时间复杂度 nlog(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095832085","body":"#### 思路\n\n先将链表变为首尾相连循环链表,然后通过`k`找到断开位置的前一个元素,断开,返回头节点即可。\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * struct ListNode *next;\n * };\n */\nstruct ListNode* rotateRight(struct ListNode* head, int k) {\n if(head==NULL || k==0) return head;\n int len=1;\n struct ListNode * p=head;\n if(p) len=1;\n while(p->next){\n len++;\n p = p->next;\n }\n //printf(\"%d\\n\", len);\n p->next = head;\n k = k%len;\n for(int i = 0; i < len-k-1; i++){\n head = head->next;\n }\n p = head->next;\n head->next = NULL;\n return p;\n}\n```\n\n时间复杂度O(n)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3102195778","body":"#### C代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * struct ListNode *next;\n * };\n */\nstruct ListNode* swapPairs(struct ListNode* head) {\n //struct ListNode Node;\n //Node.next = head;\n //struct ListNode* tmp = &Node;\n struct ListNode* Node=(struct ListNode*)malloc(sizeof(struct ListNode));\n Node->next = head;\n struct ListNode* tmp = Node;\n while(tmp->next && tmp->next->next){\n struct ListNode* first = tmp->next;\n struct ListNode* second = tmp->next->next;\n tmp->next = second;\n first->next = second->next;\n second->next = first;\n tmp = first;\n }\n return Node->next;\n}\n```\n\n时间复杂度O(n)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3106692662","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode() : val(0), next(nullptr) {}\n * ListNode(int x) : val(x), next(nullptr) {}\n * ListNode(int x, ListNode *next) : val(x), next(next) {}\n * };\n */\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n TreeNode* sortedListToBST(ListNode* head) {\n if(head==NULL) return NULL;\n int n = 0;\n for(auto p=head; p; p=p->next){\n n++;\n }\n if(n==1) return new TreeNode(head->val);\n auto cur = head;\n for(int i = 0; i < n/2-1; i++) cur = cur->next;\n auto root = new TreeNode(cur->next->val);\n root->right = sortedListToBST(cur->next->next);\n cur->next = NULL;\n root->left = sortedListToBST(head);\n return root;\n }\n};\n```\n\n时间复杂度O(nlog(n))","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112024319","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode(int x) : val(x), next(NULL) {}\n * };\n */\nclass Solution {\npublic:\n ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {\n if(headA==NULL || headB==NULL) return NULL;\n ListNode *a = headA, *b = headB;\n while(a!=b){\n if(a == NULL) a = headB;\n a = a->next;\n if(b == NULL) b = headA;\n b = b->next;\n }\n return a;\n }\n};\n```\n\n时间复杂度O(n+m)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116982615","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode(int x) : val(x), next(NULL) {}\n * };\n */\nclass Solution {\npublic:\n ListNode *detectCycle(ListNode *head) {\n unordered_map visit;\n while(head){\n visit[head]++;\n if(visit[head]==2) return head;\n head=head->next;\n } \n return NULL;\n }\n};\n```\n\n时间复杂度O(n)\n\n空间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121297965","body":"#### C++代码\n\n- hash表: `unordered_map hash;`\n- 双向链表用来 将`Node` 根据 使用时间 进行排序。靠近左端表示最近使用,靠近右端表示较长时间没有使用。\n\n``` c\nclass LRUCache {\npublic:\n struct Node {\n int key, val;\n Node *prev, *next;\n Node(int _key, int _val): key(_key), val(_val), prev(NULL), next(NULL){}\n }*L, *R; //L头节点 R尾节点\n\n unordered_map hash;\n int n;\n\n void delete_node(Node *p){\n p->next->prev = p->prev;\n p->prev->next = p->next;\n }\n\n void insert_node(Node *p){ //链表头插入\n p->next = L->next;\n L->next->prev = p;\n p->prev = L;\n L->next = p;\n }\n\n LRUCache(int capacity) {\n n = capacity;\n L = new Node(-1, -1);\n R = new Node(-1, -1);\n L->next = R;\n R->prev = L;\n }\n \n int get(int key) {\n if(!hash.count(key)) return -1;\n else{\n auto p = hash[key];\n delete_node(p);\n insert_node(p);\n return p->val;\n }\n }\n \n void put(int key, int value) {\n if(!hash.count(key)){\n if(hash.size()==n){\n auto p = R->prev;\n delete_node(p);\n hash.erase(p->key);\n }\n auto p = new Node(key, value);\n hash[key] = p;\n insert_node(p);\n }else {\n auto p = hash[key];\n p->val = value;\n delete_node(p);\n insert_node(p);\n }\n }\n};\n\n/**\n * Your LRUCache object will be instantiated and called as such:\n * LRUCache* obj = new LRUCache(capacity);\n * int param_1 = obj->get(key);\n * obj->put(key,value);\n */\n```\n\n时间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124142122","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n int maxDepth(TreeNode* root) {\n if(root == NULL) return 0;\n return max(maxDepth(root->left), maxDepth(root->right)) + 1;\n }\n};\n```\n\n时间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125702334","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n bool isSameTree(TreeNode* p, TreeNode* q) {\n if(p==NULL && q==NULL) return true;\n else if(p==NULL && q!=NULL) return false;\n else if(p!=NULL && q==NULL) return false;\n else if(q->val != p->val) return false;\n else return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);\n }\n};\n```\n\n时间复杂度O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130752830","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n int dfs(TreeNode *root, int sum) {\n if(root == nullptr) return 0;\n int tmp = sum*10+root->val;\n if(root->left==nullptr && root->right==nullptr) return tmp;\n return dfs(root->left, tmp) + dfs(root->right, tmp);\n }\n int sumNumbers(TreeNode* root) {\n return dfs(root, 0);\n }\n};\n```\n\n时间复杂度O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135775890","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n void dfs(TreeNode* root, int height, int &curVal, int &curHeight){\n if(root==nullptr) return ;\n height++;\n dfs(root->left, height, curVal, curHeight);\n dfs(root->right, height, curVal, curHeight);\n if (height > curHeight) {\n curHeight = height;\n curVal = root->val;\n }\n }\n int findBottomLeftValue(TreeNode* root) {\n int curVal=0, curHeight=0;\n dfs(root, 0, curVal, curHeight);\n return curVal;\n }\n};\n```\n\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3139476046","body":"#### C++代码\n\n``` c\nclass Codec {\npublic:\n\n // Encodes a tree to a single string.\n void rserialize(TreeNode* root, string& str) {\n // 前序遍历(中左右,遇到空节点输入None),用逗号隔开\n if (root == NULL) str += \"None,\";\n else {\n str += to_string(root->val) + \",\";\n rserialize(root->left, str);\n rserialize(root->right, str);\n } \n }\n string serialize(TreeNode* root) {\n string ret;\n rserialize(root, ret);\n return ret;\n }\n\n // Decodes your encoded data to tree.\n\n TreeNode* rdeserialize(list& dataArray) {\n if(dataArray.front() == \"None\") {\n dataArray.erase(dataArray.begin());\n return NULL;\n }\n // 前序遍历(中左右)恢复树结构\n TreeNode* root = new TreeNode(stoi(dataArray.front()));\n dataArray.erase(dataArray.begin());\n root->left = rdeserialize(dataArray);\n root->right = rdeserialize(dataArray);\n return root;\n }\n\n TreeNode* deserialize(string data) {\n list dataArray;\n string str;\n // 添加各节点val\n // 按引用传递,按值传递会增加耗时\n for (auto& c : data) {\n if (c == ',') {\n // 以逗号作为节点分割\n dataArray.push_back(str);\n str.clear();\n } else {\n str.push_back(c);\n }\n }\n // 添加尾部节点val\n if (!str.empty()) {\n dataArray.push_back(str);\n str.clear();\n }\n return rdeserialize(dataArray);\n }\n};\n\n\n//参考链接:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/solutions/1536508/by-peaceful-thompsonfsu-8143/\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144061296","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n // 深度优先搜索函数 参数:当前节点、当前行号、当前列号、存储节点信息的map\n void dfs(TreeNode* node, int row, int col, map>>& colNodes) {\n // 若节点为空,直接返回\n if (node == nullptr) {\n return;\n }\n \n // 记录当前节点的信息:(行号, 值) 存入对应列的列表中\n colNodes[col].push_back({row, node->val});\n \n // 递归处理左子树:行号+1,列号-1\n dfs(node->left, row + 1, col - 1, colNodes);\n \n // 递归处理右子树:行号+1,列号+1\n dfs(node->right, row + 1, col + 1, colNodes);\n }\n\n // 自定义比较函数:用于对同一列的节点进行排序\n static bool compareNodes(const pair& a, const pair& b) {\n // 若行号相同,按节点值从小到大排序\n if (a.first == b.first) {\n return a.second < b.second;\n }\n // 否则按行号从小到大排序\n return a.first < b.first;\n }\n\n vector> verticalTraversal(TreeNode* root) {\n // 存储列号到节点信息的映射:key=列号,value=该列所有节点的(行号, 值)\n map>> colNodes;\n \n // 深度优先遍历树,记录每个节点的位置和值\n dfs(root, 0, 0, colNodes);\n \n // 最终结果容器\n vector> result;\n \n // 遍历每一列\n for (auto& entry : colNodes) {\n // 对当前列的节点按规则排序(使用自定义比较函数)\n sort(entry.second.begin(), entry.second.end(), compareNodes);\n \n // 提取排序后的节点值,组成当前列的结果\n vector colValues;\n for (auto& node : entry.second) {\n colValues.push_back(node.second); // node.second是节点值\n }\n result.push_back(colValues);\n }\n \n return result;\n }\n};\n\n//参考链接:https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/solutions/3739810/dui-wo-lai-shuo-huan-shi-fu-za-liao-xie-iar46/\n\n```\n\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146382948","body":"#### C++代码\n\n``` c\nclass Solution {\npublic:\n vector twoSum(vector& nums, int target) {\n unordered_map hash;\n for(int i = 0; i < nums.size(); i++){\n auto iter = hash.find(target-nums[i]);\n if(iter != hash.end()) return {iter->second, i};\n hash[nums[i]] = i;\n }\n return {};\n }\n};\n```\n\n时间复杂度:O(n)\n\n空间复杂度:O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148379333","body":"#### C++\n\n``` c\nclass Solution {\npublic:\n vector topKFrequent(vector& nums, int k) {\n vector ans;\n unordered_map f;\n for(int i = 0;i < nums.size();i++) {\n f[nums[i]]++;\n }\n priority_queue, vector >, greater > > q;\n for(auto& [num, count] : f) {\n if(q.size() < k)\n q.push({count, num});\n else {\n if(q.top().first < count) {\n q.pop();\n q.push({count, num});\n }\n }\n }\n while(!q.empty()) {\n //cout<>& points) {\n int result=0;\n for(vector P : points){\n unordered_map map;\n for(vector Q : points){\n int dis = (P[0]-Q[0])*(P[0]-Q[0])+(P[1]-Q[1])*(P[1]-Q[1]);\n map[dis]++;\n }\n for(auto [a,b] : map){\n result+=b*(b-1);\n }\n }\n return result;\n }\n};\n```\n\n时间复杂度:O(n2)\n空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3154861022","body":"``` c\nclass Solution {\npublic:\n int lengthOfLongestSubstring(string s) {\n unordered_map dic;\n int i = -1, res = 0, len = s.size();\n for(int j = 0; j < len; j++) {\n if (dic.find(s[j]) != dic.end())\n i = max(i, dic.find(s[j])->second);\n dic[s[j]] = j;\n res = max(res, j - i);\n }\n return res;\n }\n};\n```\n\n时间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3158408178","body":"\n\n``` c\nclass Solution {\npublic:\n vector findSubstring(string s, vector& words) {\n unordered_map hash;\n vector res;\n int n = s.length(), m = words.size();\n if (n == 0 || m == 0)\n return res;\n int len = words[0].length(), end = n - m * len;\n if (n < m * len)\n return res;\n for (auto word : words)\n hash[word]++;\n int size = hash.size();\n for (int k = 0; k < len; k++) {\n unordered_map cur_hash;\n int satisfy = 0;\n for (int i = k, j = k; j <= n - len;) {\n string cur = s.substr(j, len);\n if (hash.find(cur) == hash.end()) {\n j = j + len;\n i = j;\n cur_hash.clear();\n satisfy = 0;\n } else {\n cur_hash[cur]++;\n if (cur_hash[cur] == hash[cur])\n satisfy++;\n else if (cur_hash[cur] > hash[cur]) {\n while (i < j && cur_hash[cur] > hash[cur]) {\n string temp = s.substr(i, len);\n i += len;\n cur_hash[temp]--;\n if (cur_hash[temp] == hash[temp] - 1)\n satisfy--;\n }\n }\n if (satisfy == size) {\n string temp = s.substr(i, len);\n cur_hash[temp]--;\n satisfy--;\n res.push_back(i);\n i = i + len;\n }\n j = j + len;\n }\n }\n }\n return res;\n }\n};\n```\n\n时间复杂度O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3163210992","body":"\n\n``` c\nclass Solution {\npublic:\n int minSubarray(vector &nums, int p) {\n int n = nums.size(), s[n + 1];\n s[0] = 0;\n for (int i = 0; i < n; i++) s[i + 1] = (s[i] + nums[i]) % p;\n int x = s[n];\n\n int ans = n;\n unordered_map last;\n for (int i = 0; i <= n; ++i) {\n last[s[i]] = i;\n auto it = last.find((s[i] - x + p) % p);\n if (it != last.end()) {\n ans = min(ans, i - it->second);\n }\n }\n return ans < n ? ans : -1;\n }\n};\n```\n\n时间复杂度O(n)\n空间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3167368429","body":"\n\n``` c\nclass Solution {\npublic:\n ListNode* middleNode(ListNode* head) {\n int len = 0;\n ListNode* p = head;\n while (p != nullptr) {\n len++;\n p = p->next;\n }\n int k = 0;\n p = head;\n while (k < len / 2) {\n k++;\n p = p->next;\n }\n return p;\n }\n};\n```\n\n时间复杂度O(n)\n空间复杂度O(1)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169793378","body":"```c\nclass Solution {\npublic:\n int removeDuplicates(vector& nums) {\n if (nums.empty()) {\n return 0;\n }\n int slow = 0;\n for (int fast = 1; fast < nums.size(); fast++) {\n if (nums[fast] != nums[slow]) {\n slow++;\n nums[slow] = nums[fast];\n }\n }\n return slow + 1;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172513759","body":"```c\n\nclass Solution {\npublic:\n int searchInsert(vector& nums, int target) {\n int n = nums.size();\n int left = 0, right = n - 1, ans = n;\n while (left <= right) {\n int mid = ((right - left) / 2) + left;\n if (target <= nums[mid]) {\n ans = mid;\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n return ans;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173606055","body":"```c\nclass Solution {\npublic:\n vector maxSlidingWindow(vector& nums, int k) {\n if(nums.size() == 0 || k == 0) return {};\n deque deque;\n vector res(nums.size() - k + 1);\n for(int j = 0, i = 1 - k; j < nums.size(); i++, j++) {\n if(i > 0 && deque.front() == nums[i - 1])\n deque.pop_front();\n while(!deque.empty() && deque.back() < nums[j])\n deque.pop_back();\n deque.push_back(nums[j]);\n if(i >= 0)\n res[i] = deque.front();\n }\n return res;\n }\n }\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178242802","body":"```c\nclass Solution {\npublic:\n int findJudge(int n, vector>& trust) {\n vector inDegrees(n + 1);\n vector outDegrees(n + 1);\n for (auto& edge : trust) {\n int x = edge[0], y = edge[1];\n ++inDegrees[y];\n ++outDegrees[x];\n }\n for (int i = 1; i <= n; ++i) {\n if (inDegrees[i] == n - 1 && outDegrees[i] == 0) {\n return i;\n }\n }\n return -1;\n }\n};\n\n```","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3213208919","body":"```C++\nclass Solution {\npublic:\n bool judgeCircle(string moves) {\n int R=0,L=0,U=0,D=0;\n for(int i = 0; i < moves.size(); i++){\n if(moves[i]=='R') R++;\n if(moves[i]=='L') L++;\n if(moves[i]=='U') U++;\n if(moves[i]=='D') D++;\n }\n if(R==L&&U==D) return true;\n else return false;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193632408","body":"```c\n\nclass Solution {\npublic:\n vector getOrder(vector>& tasks) {\n long now = 0; \n priority_queue, vector>, greater> >entry, ready;\n int size = tasks.size();\n\n for (int i = 0; i < size; ++i){\n entry.push(make_pair(tasks[i][0], i));\n }\n\n vector res;\n while(!entry.empty() or !ready.empty()){\n if (ready.empty()){\n now = entry.top().first;\n while (!entry.empty() && now == entry.top().first){ \n ready.push(make_pair(tasks[entry.top().second][1], entry.top().second));\n entry.pop();\n }\n }\n res.emplace_back(ready.top().second);\n now += ready.top().first;\n ready.pop();\n\n while(!entry.empty() && entry.top().first <= now){ \n ready.push(make_pair(tasks[entry.top().second][1], entry.top().second));\n entry.pop();\n }\n }\n\n return res;\n }\n};\n\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3213243204","body":"```C++\nclass Solution {\npublic:\n int numberOfRounds(string startTime, string finishTime) {\n // 转化为分钟\n int t0 = 60 * stoi(startTime.substr(0, 2)) + stoi(startTime.substr(3, 2));\n int t1 = 60 * stoi(finishTime.substr(0, 2)) + stoi(finishTime.substr(3, 2));\n if (t1 < t0){\n t1 += 1440;\n }\n // 第一个小于等于 finishTime 的完整对局的结束时间\n t1 = t1 / 15 * 15;\n return max(0, (t1 - t0)) / 15;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3213232703","body":"```C++\nclass Solution {\npublic:\n int minCharacters(string a, string b) {\n int n = a.size(), m = b.size();\n vector cntA(26, 0), cntB(26, 0);\n for (char c : a)\n ++cntA[c - 'a'];\n for (char c : b)\n ++cntB[c - 'a'];\n\n // 计算前缀和\n vector preA(27, 0), preB(27, 0);\n for (int i = 0; i < 26; ++i) {\n preA[i + 1] = preA[i] + cntA[i];\n preB[i + 1] = preB[i] + cntB[i];\n }\n\n int ans = INT_MAX;\n\n // 条件 1\n for (int k = 1; k < 26; ++k) {\n int costA = n - preA[k];\n int costB = preB[k];\n ans = min(ans, costA + costB);\n }\n\n // 条件 2\n for (int k = 0; k < 25; ++k) {\n int costA = preA[k + 1];\n int costB = m - preB[k + 1];\n ans = min(ans, costA + costB);\n }\n\n // 条件 3\n for (int ch = 0; ch < 26; ++ch) {\n int costA = n - cntA[ch];\n int costB = m - cntB[ch];\n ans = min(ans, costA + costB);\n }\n\n return ans;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3213189716","body":"```c++\nclass Solution {\npublic:\n vector sortArray(vector& nums) {\n if (nums.empty()) return nums;\n quickSort(nums, 0, static_cast(nums.size()) - 1);\n return nums;\n }\n\nprivate:\n void quickSort(vector& nums, int l, int r) {\n if (l >= r) return;\n int p = partition(nums, l, r);\n quickSort(nums, l, p - 1);\n quickSort(nums, p + 1, r);\n }\n\n int partition(vector& nums, int l, int r) {\n int idx = l + rand() % (r - l + 1);\n swap(nums[idx], nums[r]);\n int pivot = nums[r];\n\n int i = l - 1;\n for (int j = l; j < r; ++j) {\n if (nums[j] < pivot) {\n ++i;\n swap(nums[i], nums[j]);\n }\n }\n swap(nums[i + 1], nums[r]);\n return i + 1;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3213176894","body":"```c++\nclass Solution {\npublic:\n int mySqrt(int x) {\n int l = 0, r = x, ans=0;\n while(l<=r){\n int mid = l + (r-l)/2;\n if((long long)mid*mid<=x){\n ans = mid;\n l = mid+1;\n } else{\n //ans = mid;\n r = mid-1;\n }\n \n }\n return ans;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3213126368","body":"```c++\nclass Solution {\npublic:\n int firstBadVersion(int n) {\n int l = 1, r = n;\n while(l w;\n\n int reversePairs(vector& nums) {\n return merge_sort(nums, 0, nums.size()-1);\n }\n\n int merge_sort(vector &nums, int l, int r) {\n if(l>=r) return 0;\n int mid = l+r>>1;\n int res = merge_sort(nums, l, mid) + merge_sort(nums, mid+1, r);\n for(int i = l, j = mid+1; i <= mid; i++){\n while(j<=r && nums[j]*2ll& houses, vector& heaters) {\n for (int i = 0, j = 0; i < houses.size(); i ++ ) {\n while (j < heaters.size() && abs(heaters[j] - houses[i]) > mid)\n j ++ ;\n if (j >= heaters.size()) return false;\n }\n return true;\n }\n\n int findRadius(vector& houses, vector& heaters) {\n sort(houses.begin(), houses.end());\n sort(heaters.begin(), heaters.end());\n int l = 0, r = INT_MAX;\n while (l < r) {\n int mid = (long long)l + r >> 1;\n if (check(mid, houses, heaters)) r = mid;\n else l = mid + 1;\n }\n return r;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217486441","body":"```C++\nclass Solution {\npublic:\n bool check(vector& nums,int n,int k,int mid)\n {\n int cnt = 0;\n for(int i = 0,j = 1; i < n - 1 ; i ++)\n {\n while(j < n && nums[j] - nums[i] <= mid)\n j ++;\n cnt += j - i - 1;\n j = max(j,i + 1);\n }\n return cnt >= k;\n }\n int smallestDistancePair(vector& nums, int k)\n {\n int n = nums.size();\n sort(nums.begin(),nums.end());\n int left = 0,right = nums[n - 1] - nums[0];\n while(left < right)\n {\n int mid = (left + right) >> 1;\n if(check(nums,n,k,mid)) right = mid;\n else left = mid + 1;\n }\n return left;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3219872784","body":"```C++\nclass Solution {\npublic:\n int swimInWater(vector>& grid) {\n int m = grid.size(), n = grid[0].size();\n vector> dis(m, vector(n, INT_MAX));\n dis[0][0] = grid[0][0];\n vector> dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};\n priority_queue, vector>, greater<>> pq;\n pq.emplace(grid[0][0], 0, 0);\n while (!pq.empty()) {\n auto [d, x, y] = pq.top();\n pq.pop();\n if (x == m - 1 && y == n - 1) {\n return d;\n }\n if (d > dis[x][y]) {\n continue;\n }\n for (auto& dir : dirs) {\n int nx = x + dir[0], ny = y + dir[1];\n if (nx >= 0 && nx < m && ny >= 0 && ny < n) {\n int nd = max(d, grid[nx][ny]);\n if (nd < dis[nx][ny] ) {\n dis[nx][ny] = nd;\n pq.emplace(nd, nx, ny);\n }\n }\n }\n }\n return -1;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3223228330","body":"```C++\nclass Solution {\npublic:\n bool pd(char a){\n if(a == 'a'||a == 'e'||a == 'i'||a == 'o'||a == 'u') return true;\n return false;\n }\n int maxVowels(string s, int k) {\n int count = 0, cnt=0;\n int l = 0, r = k-1;\n for(int i = 0; i <= r; i++) if(pd(s.at(i))) count++;\n cnt = count;\n if(s.size() == k) return count;\n while(++r != s.size()){\n if(pd(s.at(l))) count--;\n if(pd(s.at(r))) count++;\n l++;\n cnt = max(cnt, count);\n }\n return cnt;\n }\n};\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243929010","body":"```C++\nclass Solution {\npublic:\n int getArea(vector>& grid, int i, int j) {\n if (i == grid.size() || i < 0)\n return 0;\n else if (j == grid[0].size() || j < 0)\n return 0;\n if (grid[i][j] == 1) {\n grid[i][j] = 0;\n return 1 + getArea(grid, i + 1, j) + getArea(grid, i - 1, j) +\n getArea(grid, i, j + 1) + getArea(grid, i, j - 1);\n }\n return 0;\n }\n int maxAreaOfIsland(vector>& grid) {\n int maxArea = 0;\n int area = 0;\n for (int i = 0; i < grid.size(); i++) {\n for (int j = 0; j < grid[0].size(); j++) {\n if (grid[i][j] == 1) {\n area = getArea(grid, i, j);\n maxArea = maxArea > area ? maxArea : area;\n }\n }\n }\n return maxArea;\n }\n};\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3268602696","body":"```C++\nclass Solution {\npublic:\n int longestCommonSubsequence(string text1, string text2) {\n int n = (int)text1.size(), m = (int)text2.size();\n vector dp(m + 1, 0);\n for (int i = 1; i <= n; ++i) {\n int prev = 0; // 相当于 dp[i-1][j-1]\n for (int j = 1; j <= m; ++j) {\n int tmp = dp[j];\n if (text1[i - 1] == text2[j - 1]) dp[j] = prev + 1;\n else dp[j] = max(dp[j], dp[j - 1]);\n prev = tmp;\n }\n }\n return dp[m];\n }\n};\n\n```\n时间复杂度O(n*m)\n空间复杂度O(min(n,m))","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290572491","body":"```C++\nclass Solution {\npublic:\n int coinChange(vector& coins, int amount) {\n vector dp(amount+1,INT_MAX);\n dp[0]=0;\n for(int i=0;i addToArrayForm(int[] num, int k) {\n int n = num.length, carry = 0, i = n - 1;\n List res = new ArrayList<>();\n \n while (i >= 0 || k > 0 || carry > 0) {\n int kDigit = k % 10;\n k /= 10;\n int sum = i >= 0 ? carry + kDigit + num[i] : carry + kDigit;\n res.add(sum % 10);\n carry = sum >= 10 ? 1 : 0;\n --i;\n }\n \n Collections.reverse(res);\n return res;\n }\n}\n```\n\n## Complexity Analysis\nTime: `O(2*max(N, log(K)))`\n* Given a number `K`, its length will be `O(log_{2}(K))`, the time complexity depends on the length of `N` and `K`, whichever is longer.\n* Notice we want to insert digits at the end of the array and then reverse it after we finish the addition (reverse takes `O(res.size())`). If we insert at the head of array, then it will take `O(n^2)` of time.\n\nSpace: `O(1)`, as we didn't use additional spaces except the return array.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077454608","body":"#### Main Idea\nThe problem asks for the shortest distance from each character in a string s to a given character c. Since c may appear multiple times, we must compute the shortest distance to any occurrence of c for each index.\n\nThe key idea is to perform two passes over the string:\n\nLeft-to-right pass: Calculate distance from the nearest c to the left.\n\nRight-to-left pass: Refine the distance by checking for any closer c on the right.\n\nBy using two passes, we can efficiently compute the minimal distance to the nearest c for each character.\n\n#### Code\n\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n int n = s.length();\n int[] dist = new int[n];\n Arrays.fill(dist, Integer.MAX_VALUE);\n for (int i = 0; i < n; ++i) {\n if (s.charAt(i) == c) {\n dist[i] = 0;\n } else if (i > 0 && dist[i - 1] < Integer.MAX_VALUE) {\n dist[i] = dist[i - 1] + 1;\n }\n }\n\n for (int i = n - 1; i >= 0; --i) {\n if (i < n - 1 && dist[i + 1] != Integer.MAX_VALUE) {\n dist[i] = Math.min(dist[i], dist[i + 1] + 1);\n }\n }\n\n return dist;\n }\n}\n```\n\n#### Complexity\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082949045","body":"## Main Idea\nA stack can be implemented with an array, but usually we only have access to stack top due to encapsulation, while we can actually access/modify any elements in the array internally.\n\nWe can implement the stack API with `array`:\n* `push()`: append at the end of array (`O(1)`)\n* `pop()`: remove the end of array (`O(1)`)\n* `increment()`: use a for loop to increment `array[0:k]` (`O(k)`).\n\n### Optimization. Range Update && Lazy Evaluation\nNotice the time complexity of `increment()` is too high due to range update, and we can use a difference array to optimize it.\n\nAlso we don't really care about the values of elements until we `pop` them, so we can evaluate them when we pop them out of the stack.\n\n## Code\n```java\nclass CustomStack {\n private Deque stack;\n private int[] arr;\n public CustomStack(int maxSize) {\n stack = new ArrayDeque<>();\n arr = new int[maxSize];\n }\n \n public void push(int x) {\n if (stack.size() < arr.length) {\n stack.push(x);\n } \n }\n \n public int pop() {\n if (stack.isEmpty()) {\n return -1;\n }\n int index = stack.size() - 1, ret = stack.pop() + arr[index];\n if (index > 0) {\n arr[index - 1] += arr[index];\n }\n arr[index] = 0;\n return ret;\n }\n \n public void increment(int k, int val) {\n k = Math.min(k - 1, stack.size() - 1);\n if (k >= 0) {\n arr[k] += val;\n }\n }\n}\n```\n## Complexity Analysis\nTime: `O(1)` for all operations\nSpace: `O(n)` as we used 2 arrays.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087312725","body":"### Main Idea\n\nStoring everything in one stack will lead to so many pushes/pops, so we can use two stacks, one stack for string, one stack for number.\n\nIterate the input string:\n\n* If `str[i]` is a number, parse the number, push that number to number stack, and push current string to string stack, then empty the string to start over.\n* If `str[i]` is a closed bracket, then we pop the number stack to get `count`, pop the string stack to get `str`, then append the current string with `count` times to the `str`.\n* Else, append the character to current string.\n\n### Code\n\n* Java\n\n```java\nclass Solution {\n public String decodeString(String s) {\n int n = s.length();\n Deque strStack = new ArrayDeque<>();\n Deque numStack = new ArrayDeque<>();\n StringBuilder sb = new StringBuilder();\n \n for (int i = 0; i < n; i++) {\n if (Character.isDigit(s.charAt(i))) {\n int j = i + 1;\n while (Character.isDigit(s.charAt(j))) {\n j++;\n }\n int count = Integer.parseInt(s.substring(i, j));\n numStack.push(count);\n strStack.push(sb);\n sb = new StringBuilder();\n i = j - 1;\n } else if (s.charAt(i) == ']') {\n int count = numStack.pop();\n StringBuilder top = strStack.isEmpty() ? new StringBuilder() : strStack.pop();\n while (count-- > 0) {\n top.append(sb);\n }\n sb = top;\n } else {\n if (s.charAt(i) != '[') {\n sb.append(s.charAt(i));\n }\n }\n }\n \n return sb.toString();\n }\n}\n```\n\n### Complexity Analysis\n\nTime: `O(max(k) * n)`, each digit will be pushed/popped at most `max(k)` times","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092141722","body":"## Main Idea\nWe can use `stack1` as the input stack, and `stack2` as the output stack. \n\n* `push()`: Push to `stack1`, so this new element will be on the stack top of `stack1` (which is the end of our queue).\n* `pop()` and `peek()`: Since we use `stack2` as our output stack, when we call `pop()` or `peek()`:\n* If `stack2` is empty, we want to move all elements from `stack1` to `stack2`, and their order will be reversed, so the bottom of `stack1` will be the top of `stack2`, which is the head of our queue.\n* If not, then we have access to the top of `stack2` already.\n\n## Code\n\n```java\nclass MyQueue {\n Deque stack1;\n Deque stack2;\n \n public MyQueue() {\n stack1 = new ArrayDeque<>();\n stack2 = new ArrayDeque<>();\n }\n \n public void push(int x) {\n stack1.push(x);\n }\n \n public int pop() {\n if (stack2.isEmpty()) {\n move();\n }\n return stack2.pop();\n }\n \n public int peek() {\n if (stack2.isEmpty()) {\n move();\n }\n \n return stack2.peek();\n }\n \n public boolean empty() {\n return stack1.isEmpty() && stack2.isEmpty();\n }\n \n private void move() {\n while (!stack1.isEmpty()) {\n stack2.push(stack1.pop());\n }\n }\n}\n```\n## Complexity Analysis\nTime:\n* `push()`: `O(1)`\n* `pop()` and `peek()`: \n\t* The **worst case** of `pop()` and `peek()` will be `O(n)`, where we have to move all elements from `stack1` to `stack2`.\n\t* **Amortized Analysis**: Say we have `n` elements in `stack1`, and `0` elements in `stack2`, and we want to call `pop()` or `peek()` `n` times. The first call will take `n` operations to move all elements from `stack2` to `stack1`. But after the first call we will have at least `n - 1` elemetns in `stack2`, which makes the next `n - 1` calls `O(1)`. So the amrotized time will be `O(n + 1 + 1 +...+1 / n) = O((2n-1)/n) = O(1)`.\n\nSpace: `O(1)`, the two stacks are given and we didn't use any extra spaces.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3093992695","body":"### Main Idea\nFor chunks `[c1, c2, c3, ..., cn]`, we have to maintain the property: `max(ci) <= min(cj)` if `i < j`. So we can create a monotonously increasing stack `stack` to **keep track of the max value for each previous chunk**. \n\nIf `arr[i] >= stack.peek()`, we can greedily create a new chunk and `stack.push(arr[i])`. Else, we need to find the previous chunk with max value smaller or equal to `arr[i]`, say `ck`, and we need to merge all the chunks `[c_k+1, ... c_cur]` with `arr[i]`.\n\nTo merge chunks, we can just pop all the max values representing those chunks off the stack, and push back the max among them (in our case, it will be stack top cuz this stack is increasing) as the max of the new chunk. \n\nFinally the size of the stack will be the number of chunks.\n### Code\n```java\nclass Solution {\n public int maxChunksToSorted(int[] arr) {\n int n = arr.length;\n Deque stack = new ArrayDeque<>();\n for (int num : arr) {\n int max = num;\n while (!stack.isEmpty() && stack.peek() > num) {\n max = Math.max(max, stack.pop());\n }\n stack.push(max);\n }\n return stack.size();\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095444824","body":"\n### Main Idea\n1. Find the length of the linked list. If `length == 0`, return `head`.\n2. If `k >= n`, then we can do `k = k % n` which doesn't affect the final result but reduce the number of rotations.\n3. Use two pointers to traverse the linked list to find the last kth element and its previous node.\n4. Modify the linked list.\n\n\n### Code\n```java\nclass Solution {\n public ListNode rotateRight(ListNode head, int k) {\n int n = getLength(head);\n if (n == 0) return head;\n k %= n;\n \n // Find the last kth element as new head\n ListNode fast = head, slow = head;\n for (int i = 0; i < k; ++i) {\n fast = fast.next;\n }\n \n while (fast.next != null) {\n fast = fast.next;\n slow = slow.next;\n }\n \n fast.next = head;\n ListNode newHead = slow.next;\n slow.next = null;\n return newHead;\n \n }\n \n private int getLength(ListNode head) {\n int len = 0;\n while (head != null) {\n ++len;\n head = head.next;\n }\n return len;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(1)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100701991","body":"### Main Idea\n1. If the current list has length smaller than 2, don't need to swap.\n2. Else, recursivly swap the list `head.next.next`, and the swap function should return the `next` node.\n3. Swap the current 2 nodes, `newHead = head.next`, `newHead.next = head` and `head.next = next`.\n\n### Code\n```java\nclass Solution {\n public ListNode swapPairs(ListNode head) {\n if (head == null || head.next == null) return head;\n ListNode next = swapPairs(head.next.next);\n ListNode newHead = head.next;\n newHead.next = head;\n head.next = next;\n return newHead;\n }\n}\n```\n\n### Complexity Analysis\n* Time: `O(n)`\n* Space: `O(n)` for the recursive call.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109183645","body":"### Main Idea\n1. Define `inOrder(int i, int j)` to be the problem of the converting `list[i:j]` to BST.\n2. Base case: if `i > j`, return `null`.\n3. Calculate `mid = i + (j - i) / 2`, left subtree will be `inOrder(i, mid - 1)`, and then we create our root with the current node `cur`, then the next node to create will be `cur.next`, and we build the right sutree with `inOrder(mid + 1, j)`.\n\n### Code\n```java\nclass Solution {\n private ListNode cur;\n public TreeNode sortedListToBST(ListNode head) {\n if (head == null) return null;\n cur = head;\n int n = getLength(head);\n return inOrder(0, n - 1);\n }\n\n private TreeNode inOrder(int l, int r) {\n if (l > r) return null;\n int m = l + (r - l) / 2;\n TreeNode left = inOrder(l, m - 1);\n TreeNode root = new TreeNode(cur.val);\n cur = cur.next;\n TreeNode right = inOrder(m + 1, r);\n root.left = left;\n root.right = right;\n return root;\n }\n\n private int getLength(ListNode head) {\n int cnt = 0;\n while (head != null) {\n head = head.next;\n ++cnt;\n }\n return cnt;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(logn)` for recursive calls.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112278406","body":"Say the length of `a_1` to `a_i` is `a`, `b_1` to `b_i` is `b`, and `c_1` to `c_n` is `c`. If there is no interseciton, then `c = 0`. And `a + b = b + a`. If there is an intersection, then `a + c + b = b + c + a`, and the two pointers will meet at the intersection point.\n```\npublic ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n ListNode h1 = headA, h2 = headB;\n while (h1 != h2) {\n\n h1 = h1 == null ? headB : h1.next;\n h2 = h2 == null ? headA : h2.next;\n }\n return h1; \n }\n```\n\nSo we can just go over both linked list once, and switch the pointers.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3118087746","body":"### Main Idea\nDefine two pointers `fast` and `slow`, each iteration, `fast` moves 2 steps forward while `slow` moves 1 step. If there is a cycle, then `fast` will equals `slow` eventually, and if not, we will exit the loop.\n\nIf a cycle is detected, we need to find the starting point. \n\n```\nfast = 2 * slow\n\nfast = l + n1 * c + t\nslow = l + n2 * c + t\n\n\nl + n1 * c + t = 2 * l + 2 * n2 * c + 2 * t\nl = n1 * c - 2 * n2 * c = c * (n1 - 2 * n2) = n' * c - t\n```\n\n```\n L\n-------- ----I-----\n | | D\n ----------\n```\n### Code\n```java\npublic class Solution {\n public ListNode detectCycle(ListNode head) {\n if (head == null) return null;\n ListNode fast = head, slow = head;\n while (fast != null && fast.next != null) {\n fast = fast.next.next;\n slow = slow.next;\n if (fast == slow) {\n while (slow != head) {\n slow = slow.next;\n head = head.next;\n }\n return head;\n }\n }\n return null;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(1)`","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3126063970","body":"### Main Idea\n* Base case 1, both `p` and `q` are `null`, return `true`.\n* Base case 2, else if either of them is `null` or their values are not equal, return `false`.\n* Recursive case: both left and right subtrees are equal.\n\n### Code\n```java\nclass Solution {\n public boolean isSameTree(TreeNode p, TreeNode q) {\n if (p == null && q == null) {\n return true;\n } else if (p == null || q == null || p.val != q.val) {\n return false;\n }\n return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n }\n}\n```\n\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(h) = O(n)`","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136827599","body":"### Main Idea\nThis problem is asking for the leftmost node of the last layer, and when it comes to traversal by layer, BFS comes in handy.\n\nIn a standard BFS algorithm, we use a queue to keep track of the nodes on each layer, we just need to modify the algorithm to record the first node of the current layer, and if we exit the loop from the current layer, that means this is the last layer, and the node we recorded will be the one we want to find.\n\n### Code\n```java\nclass Solution {\n public int findBottomLeftValue(TreeNode root) {\n Queue q = new ArrayDeque<>();\n q.offer(root);\n int res = 0;\n while (!q.isEmpty()) {\n res = q.peek().val;\n int size = q.size();\n for (int i = 0; i < size; ++i) {\n TreeNode n = q.poll();\n if (n.left != null) q.offer(n.left);\n if (n.right != null) q.offer(n.right);\n }\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144871038","body":"### main Idea\n1. We store `Pair` in our pq, where `TreeNode` is the node and `int[]` is its coordinate.\n2. Since we want to maintain the row order, we compare pairs by their row order, smaller row has higher priority.\n3. If row numbers are the same, we compare values, since we don't really care about the order we process columns each row.\n4. Use a map that maps `col` to `list` to store the node values.\n\n\n### Code\n* Java\n\n```java\nclass Solution {\n public List> verticalTraversal(TreeNode root) {\n // column -> list\n Map> map = new HashMap<>();\n PriorityQueue> queue = new PriorityQueue<>((p1, p2) -> {\n int loc1[] = p1.getValue();\n int loc2[] = p2.getValue();\n if (loc1[0] == loc2[0]) {\n return p1.getKey().val - p2.getKey().val;\n } else {\n return loc1[0] - loc2[0];\n }\n });\n queue.offer(new Pair(root, new int[] {0, 0}));\n while (!queue.isEmpty()) {\n int size = queue.size();\n for (int i = 0; i < size; ++i) {\n Pair p = queue.poll();\n TreeNode node = p.getKey();\n int loc[] = p.getValue();\n List list = map.getOrDefault(loc[1], new ArrayList<>());\n list.add(node.val);\n map.put(loc[1], list);\n if (node.left != null) {\n queue.offer(new Pair(node.left, new int[] {loc[0] + 1, loc[1] - 1}));\n }\n\n if (node.right != null) {\n queue.offer(new Pair(node.right, new int[] {loc[0] + 1, loc[1] + 1}));\n }\n }\n }\n\n List> res = new ArrayList<>();\n for (int i = -1000; i <= 1000; ++i) {\n if (map.containsKey(i)) {\n res.add(map.get(i));\n }\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(nlogn)`\nSpace: `O(n)`","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162435845","body":"```java\nclass Solution {\n public int minSubarray(int[] nums, int p) {\n int n = nums.length;\n long arraySum = Arrays.stream(nums).asLongStream().sum(); \n int targetRemainder = (int) (arraySum % p);\n if (targetRemainder == 0) {\n return 0;\n } else if (arraySum < p) {\n return -1;\n }\n \n Map remainderToIndex = new HashMap<>();\n remainderToIndex.put(0, -1);\n \n long preSum = 0;\n int minLen = Integer.MAX_VALUE;\n for (int i = 0; i < n; ++i) {\n preSum += nums[i];\n int remainder = (int) (preSum % p);\n int remainderToCheck = (int) (remainder - targetRemainder);\n if (remainderToCheck < 0) {\n remainderToCheck += p;\n }\n \n if (remainderToIndex.containsKey(remainderToCheck)) {\n int index = remainderToIndex.get(remainderToCheck);\n minLen = Math.min(minLen, i - index);\n }\n \n remainderToIndex.put(remainder, i);\n }\n \n return minLen >= n ? -1 : minLen;\n }\n}\n\n/*\n [3, 1, 4, 2], p = 6\n \n arraySum = 10, targetRemainder = 4\n \n preSum = 3,\n\n [3, 1, 4, 2] = 10\n \n [0, 3, 4, 8, 10]\n \n [7, ]\n \n Sum: 9 p=6\n \n a mod b = (a + b) mod b\n \n (S_j - S_i) mod p == sum mod p\n \n \n x mod p = a\n y mod p = b\n \n (x - y) mod p = a - b (if a >= b)\n a - b + p (if a < b)\n*/\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182362544","body":"## Method 1. BFS\n### Main Idea\nBasically, this problem is asking if we can mark the graph with 2 colors, where adjacent vertices can't have the same color.\n\nSo we can apply BFS to traverse the graph, say we mark a vertex `v` with color 1, then we have to mark all its neighbors with color 2. If any of them was marked color 1, then we know it's impossible to mark the graph with 2 colors, so we can return `false`.\n\nIf no such contradictions found, that means the graph can be 2-colored, so return `true`.\n### Code\n* Java\n\n```java\nclass Solution {\n public boolean possibleBipartition(int n, int[][] dislikes) {\n List[] graph = new ArrayList[n + 1];\n for (int i = 0; i <= n; ++i) graph[i] = new ArrayList<>();\n \n for (int[] edge : dislikes) {\n graph[edge[0]].add(edge[1]);\n graph[edge[1]].add(edge[0]);\n }\n \n int[] colors = new int[n + 1];\n for (int i = 1; i <= n; ++i) {\n if (colors[i] != 0) continue;\n Queue q = new ArrayDeque<>();\n q.offer(i);\n colors[i] = 1;\n while (!q.isEmpty()) {\n int size = q.size();\n while (size-- > 0) {\n int v = q.poll(), c = colors[v];\n for (int nei : graph[v]) {\n if (colors[nei] == c) return false;\n if (colors[nei] != 0) continue;\n colors[nei] = -1 * c;\n q.offer(nei);\n }\n }\n }\n }\n return true;\n }\n}\n```\n### Complexity Analysis\nTime: `O(E + V)`\n\nSpace: `O(E + V)`","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204204644","body":"```java\nclass Solution {\n public int mySqrt(int x) {\n int left = 0, right = x;\n\n while (left < right - 1) {\n int mid = left + (right - left) / 2;\n long midSquare = 1l * mid * mid;\n if (midSquare == x) {\n return mid;\n } else if (midSquare < x) {\n left = mid;\n } else {\n right = mid - 1;\n }\n }\n long rightSqaure = 1l * right * right;\n return rightSqaure > x ? left : right;\n }\n}\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222726555","body":"```java\nclass Solution {\n public int maxVowels(String s, int k) {\n String vowels = \"aeiou\";\n int n = s.length(), l = 0, r = 0, res = 0, cnt = 0;\n while (r < n) {\n while (r < n && r - l < k) {\n if (vowels.indexOf(s.charAt(r)) != -1) {\n ++cnt;\n }\n ++r;\n }\n\n res = Math.max(res, cnt);\n if (vowels.indexOf(s.charAt(l)) != -1) {\n --cnt;\n }\n ++l;\n }\n\n return res;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243695565","body":"```java\nclass Solution {\n public int maxAreaOfIsland(int[][] grid) {\n int m = grid.length, n = grid[0].length;\n int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};\n \n int ret = 0;\n for (int i = 0; i < m; i++) {\n for (int j = 0; j < n; j++) {\n if (grid[i][j] == 0) {\n continue;\n }\n \n Queue queue = new ArrayDeque<>();\n queue.offer(new int[] {i, j});\n grid[i][j] = 0;\n int area = 1;\n while (!queue.isEmpty()) {\n int[] loc = queue.poll();\n for (int[] dir : dirs) {\n int x = loc[0] + dir[0], y = loc[1] + dir[1];\n if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == 0) {\n continue;\n }\n queue.offer(new int[] {x, y});\n grid[x][y] = 0;\n area++;\n }\n }\n \n ret = Math.max(ret, area);\n }\n }\n \n return ret;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269054068","body":"## Method 1. DP + Count\n### Main Idea\nSimilar to the DP solution of the LIS problem, but we also need to count how many shorter subsequences contribute to each subsequence ending at index `i`.\n\nSo we define `dp[i][0]` to be the max len of subsequence ending at `i`, and `dp[i][1]` to be the number of shorter subsequences contributing to \n### Code\n* Java\n\n```java\nclass Solution {\n public int findNumberOfLIS(int[] nums) {\n int n = nums.length, res = 0, max = 0;\n // \n int[][] dp = new int[n][2];\n \n for (int i = 0; i < n; ++i) {\n dp[i][0] = 1;\n int cnt = 1;\n for (int j = 0; j < i; ++j) {\n if (nums[i] > nums[j]) {\n if (dp[j][0] + 1 > dp[i][0]) {\n dp[i][0] = dp[j][0] + 1;\n cnt = dp[j][1];\n } else if (dp[j][0] + 1 == dp[i][0]) {\n cnt += dp[j][1];\n }\n }\n }\n \n if (dp[i][0] > max) {\n max = dp[i][0];\n res = cnt;\n } else if (dp[i][0] == max) {\n res += cnt;\n }\n dp[i][1] = cnt;\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n^2)`\n\nSpace: `O(n)`","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3295757426","body":"```java\nclass Solution {\n public int change(int amount, int[] coins) {\n int n = coins.length;\n int[] dp1 = new int[amount + 1], dp2 = new int[amount +1];\n for (int i = 0; i < n; i++) {\n for (int j = 0; j <= amount; j++) {\n if (i == 0 || j == 0) {\n if (j % coins[i] == 0) {\n dp2[j] = 1;\n }\n continue;\n }\n \n if (j - coins[i] >= 0) {\n dp2[j] = dp1[j] + dp2[j - coins[i]];\n } else {\n dp2[j] = dp1[j];\n }\n }\n \n int[] tmp = dp1;\n dp1 = dp2;\n dp2 = tmp;\n }\n return dp1[amount];\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322650611","body":"```java\nclass Solution {\n public int[] singleNumber(int[] nums) {\n int xor = 0;\n for (int num : nums) {\n xor ^= num;\n }\n \n\n int rightmostBit = xor & (-xor);\n \n int num1 = 0, num2 = 0;\n for (int num : nums) {\n if ((num & rightmostBit) != 0) {\n num1 ^= num;\n } else {\n num2 ^= num;\n }\n }\n \n return new int[]{num1, num2};\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"suukii":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mirrors-cl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xqy97":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jakkiabc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyoneday":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chouqin99":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhaogeg111":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawnhu23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ye2222":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uyplayer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guixian001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"serena9":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"junzmer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hx-code":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"admu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xxiaomm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pgquestions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eldinzhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiangwenzhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawnwu6688":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tomtao626":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aiweng1981":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richard-lime":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"acoada":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"duanyaqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ccslience":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaiykk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cachezhou0617":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangtuo1999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cytrue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyryan-web":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"naomiwufzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuajingliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miss1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"johnxizhao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"incipe-win":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"revisegoal":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckysq999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dereklisdr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"perfqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mryao1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"likeyousmile":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhg1992":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liquanluo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aq666888":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"samlu-ecnu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhongxiangxiang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hatorimain":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"neado":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaojunjun1110":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wxleah":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunl1ght":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kerrhl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"orangejuz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flyzenr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"c1f2h3":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dlm001128":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuxy94":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aconcert":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"linjunhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hyqqq22":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yibenxiao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elon-lau":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nowkizzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gsgtgyb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"irenia111":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"suiyi8760":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"saltychess":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rabbit2010520":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ellie-wu05":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yopming":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckytwj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzz607":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zoulufeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xxoojs":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"okkband":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wyz999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hacker90":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ricjli":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luhaoling":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flaming-cl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gelxgx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gaominghao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jessie725":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lsunxh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lanceli424":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qycoder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qilin88":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hengheng-yun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"smz1995":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"size-of":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"moyuanhua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"9vivian88":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guxuehua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kirosola":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"biscuit279":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maoting":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"youzhaing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jawn-ha":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hanwangxxx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dujt-x":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"degndaixingqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gzgzgzgzgzgz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gentleman-goodman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xinyi-arch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zenwangzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"andyyxw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fourierhai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yangz001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mannnn6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"haoyangxie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chjillout":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wenjialu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mhcn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"coconutice":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jackgaoyuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xingzhan0312":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yufeng727":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fontendart":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yingchehu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cobayaz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tomato-tomato":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xfliudx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"djd28176":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xilutian":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xy147":[null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091443042","body":"### js代码\n```JavaScript\n\nvar MyQueue = function() {\n this.inStack = [];\n this.outStack = [];\n};\nMyQueue.prototype.push = function(x) {\n this.inStack.push(x);\n};\n\nMyQueue.prototype.pop = function() {\n if (!this.outStack.length) {\n this.in2out();\n }\n return this.outStack.pop();\n};\n\nMyQueue.prototype.peek = function() {\n if (!this.outStack.length) {\n this.in2out();\n }\n return this.outStack[this.outStack.length - 1];\n};\n\nMyQueue.prototype.empty = function() {\n return this.outStack.length === 0 && this.inStack.length === 0;\n};\n\nMyQueue.prototype.in2out = function() {\n while (this.inStack.length) {\n this.outStack.push(this.inStack.pop());\n }\n};\n\n```\n\n### 复杂度分析\n时间复杂度:O(1)\n空间复杂度:O(n)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3120847716","body":"```\nclass ListNode {\n constructor(key, value) {\n this.key = key\n this.value = value\n this.next = null\n this.prev = null\n }\n}\n\nclass LRUCache {\n constructor(capacity) {\n this.capacity = capacity\n this.hash = {}\n this.count = 0\n this.dummyHead = new ListNode()\n this.dummyTail = new ListNode()\n this.dummyHead.next = this.dummyTail\n this.dummyTail.prev = this.dummyHead\n }\n\n get(key) {\n let node = this.hash[key]\n if (node == null) return -1\n this.moveToHead(node)\n return node.value\n }\n\n put(key, value) {\n let node = this.hash[key]\n if (node == null) {\n if (this.count == this.capacity) {\n this.removeLRUItem()\n }\n let newNode = new ListNode(key, value)\n this.hash[key] = newNode\n this.addToHead(newNode)\n this.count++\n } else {\n node.value = value\n this.moveToHead(node)\n }\n }\n\n moveToHead(node) {\n this.removeFromList(node)\n this.addToHead(node)\n }\n \n removeFromList(node) {\n let temp1 = node.prev\n let temp2 = node.next\n temp1.next = temp2\n temp2.prev = temp1\n }\n\n addToHead(node) {\n node.prev = this.dummyHead\n node.next = this.dummyHead.next\n this.dummyHead.next.prev = node\n this.dummyHead.next = node\n }\n\n removeLRUItem() {\n let tail = this.popTail()\n delete this.hash[tail.key]\n this.count--\n }\n\n popTail() {\n let tail = this.dummyTail.prev\n this.removeFromList(tail)\n return tail\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146107002","body":"```const twoSum = (nums, target) => {\n const prevNums = {};\n\n for (let i = 0; i < nums.length; i++) {\n const curNum = nums[i];\n const targetNum = target - curNum;\n const targetNumIndex = prevNums[targetNum];\n if (targetNumIndex !== undefined) {\n return [targetNumIndex, i];\n } else {\n prevNums[curNum] = i;\n }\n }\n}```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3167532564","body":"### js代码\n```JavaScript\nvar middleNode = function(head) {\n let slow = fast = head\n while(fast && fast.next){\n slow = slow.next\n fast = fast.next.next\n }\n return slow\n};\n\n```\n\n### 复杂度分析\n时间复杂度:O(N)\n空间复杂度:O(1)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190926614","body":"### js代码\n```JavaScript\nvar judgeCircle = function(moves) {\n return moves.split('L').length === moves.split('R').length && moves.split('U').length === moves.split('D').length\n};\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"itsjacob":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shunanch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yppah-eb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"raychenlei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"woshichuanqilz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"willuuu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"christina-soda":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jia98shanliang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"user-vannnn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tobepellucid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"johnvsd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yueza":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawyuan97":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"victorhuang99":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cusanity":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jay-xzj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shiradaone":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xinyue-ma":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"taojin1992":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joyce94":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"steven72574":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tian-pengfei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"asuka1h":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaowangcoding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"james0608":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaneyang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"azl397985856":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whgsh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chengfengfengwang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bulingbulingbuling":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"c2tr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eden-ye":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"codingtrains":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"starorbiting":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mo-xiaoxiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"passengersa":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073445770","body":"思维:\n1、将数组num和k转换为字符,\n2、使用BigInt方法相加\n3、最后使用将相加得到转换为数字数组\n时间复杂度:O(n)\n代码:\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function (num, k) {\n let numStr = num.join('')\n let sum = BigInt(numStr) + BigInt(k)\n return sum.toString().split('').map(Number)\n};","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084084442","body":"时间复杂度:O(n)\n代码:\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.maxSize = maxSize;\n this.stack = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.stack.length < this.maxSize) {\n this.stack.push(x);\n }\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.stack.length === 0) {\n return -1;\n }\n return this.stack.pop();\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n const len = this.stack.length;\n const count = Math.min(k, len);\n for (let i = 0; i < count; i++) {\n this.stack[i] += val;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097108121","body":"思路:\n首先,计算链表的长度 n。\n接着,将 k 对 n 取模,因为旋转 n 次后链表会回到原来的状态,所以取模可以避免不必要的旋转操作。\n然后,找到新的链表头节点和尾节点。新的链表头节点是原链表中第 n - k 个节点,新的链表尾节点是原链表的最后一个节点。\n最后,将原链表的尾节点连接到原链表的头节点,形成一个环形链表,再从新的链表头节点处断开,得到旋转后的链表。\n时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表两次,第一次计算链表的长度,第二次找到新的链表头节点的前一个节点。\n代码:\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n // 定义链表节点类\nclass ListNode {\n constructor(val = 0, next = null) {\n this.val = val;\n this.next = next;\n }\n}\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n if (!head || !head.next) return head;\n\n // 计算链表的长度\n let n = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n n++;\n }\n\n // 对 k 取模\n k %= n;\n\n // 如果 k 为 0,说明不需要旋转,直接返回原链表\n if (k === 0) return head;\n\n // 找到新的链表头节点的前一个节点\n let newTail = head;\n for (let i = 0; i < n - k - 1; i++) {\n newTail = newTail.next;\n }\n\n // 新的链表头节点\n let newHead = newTail.next;\n\n // 断开原链表,形成新的链表\n newTail.next = null;\n tail.next = head;\n\n return newHead; \n};\n\n// 辅助函数:将数组转换为链表\nfunction arrayToList(arr) {\n if (arr.length === 0) return null;\n let head = new ListNode(arr[0]);\n let current = head;\n for (let i = 1; i < arr.length; i++) {\n current.next = new ListNode(arr[i]);\n current = current.next;\n }\n return head;\n}\n\n// 辅助函数:将链表转换为数组\nfunction listToArray(head) {\n let result = [];\n let current = head;\n while (current) {\n result.push(current.val);\n current = current.next;\n }\n return result;\n}","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shellylcooper":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"testplm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tom-zhouch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"skylarxu214":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"taihui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huaxueguakele":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yang-chenyu104":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mlking15":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"-3":[],"cyonline":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rzhao010":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zywang0":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jetery":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"klspta":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bookyue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jancerwu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"buer1121":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ceramickitten":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gg925407590":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alyenor":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chenming-cao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ggohem":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dark-volute":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ronething":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jmastella":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"paopaohua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dd2001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mayloveless":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuexi001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nineis7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"abby-xu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gsw9818":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaomingshixiaotang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"snmyj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flipn9":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wabw1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xqmmy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"a-pricity":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sclihuiming":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"amazeding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"astrking":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tzuikuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ringo1597":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brucezhang-utf-8":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luanxing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"moin-jer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lihua1997":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cuizezhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xuanaxuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tiandao043":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"restlessbreeze":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ruikiwi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huiminren":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"saitochen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wtdcai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"albert556":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wuxiaoshawn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zrtch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhuzhu096":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whoam-challenge":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weisday":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"syh-coder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaaller":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kyrie96521":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cavecrypto":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cxgbro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erjian96":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"a-polarbear":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alexno1no2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yetfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhiyuanpeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bwspsu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"arinzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mdge":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allenfeng666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yin02":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elsa-zhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"asur4s":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"littlesugarman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhihaowan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"apockira":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guowei0223":[null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077086971","body":"```\n首先需要找到所有c出现的index,存在c_index list里为后续的pointer搜索做好准备\npointer = 0 定义好pointer的起点\n遍历s,在c_index的范围内,对比pointer和pointer + 1 和s中各个位置的绝对距离,如果发现pointer和s的距离大于pointer +1,那么说明s的index已经走到了离pointer+1更近的距离,那么这时候我们更新pointer,+ 1, 指到下一个c_index中c的位置。\nres.append()c_index中pointer和s中index的距离\n\nclass Solution:\n def shortestToChar(self, s: str, c: str) -> List[int]:\n c_index = []\n for i in range(len(s)):\n if s[i] == c:\n c_index.append(i)\n pointer = 0\n res = []\n for i in range(len(s)):\n if pointer < len(c_index) -1:\n if abs(i-c_index[pointer])> abs(i-c_index[pointer+1]):\n pointer += 1\n res.append(abs(i-c_index[pointer]))\n return res\n\n因为用了指针,所以时间复杂度 O(n)。 空间复杂度 O(n)。 \n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087516204","body":"```\n使用栈的经典题型。遇见数字就num*10 + item处理。 遇见【 左括号说明要开始处理括号内部,用stack先存好之前已经处理的结果,遇见】后括号说明括号完成,则需要stack。pop()出保存的结果加上括号里的内容。是字母的话,则res+ item更新括号内信息。\n空间复杂度 O(n)\n时间复杂度 O(n)\n\nclass Solution:\n def decodeString(self, s: str) -> str:\n res = \"\"\n stack = []\n num = 0\n for item in s:\n if item.isdigit():\n num = num * 10 + int(item)\n elif item == \"[\":\n stack.append([num, res])\n num = 0\n res = \"\"\n elif item == \"]\":\n pre_num, pre_res = stack.pop()\n res = pre_res + pre_num * res\n else:\n res += item\n return res\n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3101341120","body":"还是链表的老套路,设置一个dummy head。 判断cur.next and cur.next.next: 是否存在,存在了再进行下一步。\n用tmp,tmp1 来保存cur。next和cur.next.next.next。 然后我们开始进行交换步骤。\n\n```\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n dummy_head = ListNode(next =head)\n cur = dummy_head\n while cur.next and cur.next.next:\n temp = cur.next\n temp1 = cur.next.next.next\n cur.next = cur.next.next\n cur.next.next = temp\n temp.next = temp1\n cur = cur.next.next\n return dummy_head.next\n\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125611734","body":"可以利用bfs的方法解决。 把每个点放入queue中,然后popleft()两个node进行比较。\n\n```\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if not p and not q:\n return True\n if not p or not q:\n return False\n \n que = deque([p,q])\n \n while que:\n cur1 = que.popleft()\n cur2 = que.popleft()\n if not cur1 and not cur2:\n continue\n\n if not cur1 or not cur2 or cur1.val != cur2.val:\n return False\n \n que.append(cur1.left)\n que.append(cur2.left)\n que.append(cur1.right)\n que.append(cur2.right)\n return True\n\n```\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148705374","body":"```\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n ans = 0\n for x1, y1 in points:\n cnt = defaultdict(int)\n for x2, y2 in points:\n d2 = (x1 - x2) ** 2 + (y1 - y2) ** 2\n ans += cnt[d2] * 2\n cnt[d2] += 1\n return ans\n\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuqianyang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sj941127":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zjsuper":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yongxi-zhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"darwintk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"h-steven":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mischaqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wurongronga":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miduoliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyshenzhengkang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"y4h2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yoco323":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"forschers":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shanshuiqiankun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"annabellhyx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hwfrankfung":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"frederickfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huibinny":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ggmybro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"myleetcodejourney":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"want2333":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"staringwhere":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allenfeng8":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ryanbaiyansong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dou-yu-xuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hyxupup":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cs12300":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chiehw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aesir-idun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaldsk12":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hxj2001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"for123s":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzhilin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yfu6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mengsixing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"import-ant":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joriscai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangqianqian202301":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"airwalkers":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhumengcheng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kofzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"leonalhq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hjy-u":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"csthaha":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zepherust":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"feefeefee":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hughlin07":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huizsh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chanceyliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hshen11":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"horace7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangzh0114":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dragonfcl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huifeng248":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sarah11qing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"el1as7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zcytm3000":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pangjiadai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xb798298436":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ywang525":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"limbo42":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dorapocket":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zoeyzyzyzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jasonqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lp1506947671":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"texamc2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joemonkeylee":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"northseacoder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dominique9898":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wl678":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"meisgithub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sye9286":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fuku-l":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kangliqi1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richardtaok":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chocolate-emperor":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lydia61":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangjiahuan17":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"seanutf":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangyong-hub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erquaner":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiujingxukong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"x1aox1a":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"drinkmorekaik":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dinjufen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuzmt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"munmust":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yan-jie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hktangshuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zpbc007":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"linlizzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"krabbejing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"firehaosky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chao-cc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jinjin680":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cruiseyugh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"quieter2018":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jadeliu13":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaoq777":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiangyanlineu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuxiner":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yufanzh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"franciszq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kangqinsen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"manwzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jerry9926":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"soso1105":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pkuphy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhenya-zhu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wty9sky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"skyoct":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bingzxy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaodingc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jyjsunny":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aoxiangw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"enrilwang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aswrise":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aneureka":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ljqchlsw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jingyuzhou123":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dianlandu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jameswangxin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhenxied":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nuozhouzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shin-guid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bochengwan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kyo-tom":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uratora":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guitarys":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sosdogecoin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zol013":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lrwhc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wwewwt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cyk1337":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangyu1131":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"diana21170648":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"61hhh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"quaaaaaack":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"acy925":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bi9potato":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guangsizhongbin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhaoygcq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"catkathy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yqycs":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhuxinyu-znb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"freesan44":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mo660":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sencc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"randong22":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"beginner-jamji":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yzhyzhyzh123":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunstrongchina":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dongzegithub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"metsystem":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miller-em":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dorian-byte":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yizhewill":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qiaojunch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhouliuhuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"beanza":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kingxiaozhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ygnauh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wzbwzt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"iambigchen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weiboshi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"master-guang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jennyjgao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangjay408":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chang-you":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rocjemaintiendrai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ainfinitedz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"christ36":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hengistchan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huiyingc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"andyli4":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"momogir":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jamjid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"freeroo2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ycan253":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"laurallalala":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"danielyan86":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rennzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"larscheng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qingkediguo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"adfvcdxv":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"javajianghu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chloe-c11":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"verkru":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eggeggliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dr-kkk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jinhma":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"emergence23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"0christ1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"junru281":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joe-the-plumber":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jsaki":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"witerth":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ludwig-ll":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luster-lyl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"smallppgirl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"realduxy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"awilekong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wwz223":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangjinzhepro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"atom-set":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"coderxiaowq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hillsonziqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alexzhang-mini":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xil324":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bordergong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hawkins-hjq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cathyshang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"greyqt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yanglimbo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rao-qianlin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dtjk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"martina001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lxy1108":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"franklinsworld666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brainlds":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huamulanyyds":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eclairs46":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maike-hps":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sanjiu81":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qinmengx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yashuning":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luzhaofeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lizhao-liu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yukibei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hermione666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yyyyytc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zin-next":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pandapls":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jackinai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"godkun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dadahui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"akxuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fightforcoding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jialigogogo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"celestexiong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zjy-debug":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"peggyhao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sleepydog25":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"edwineo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"panfx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liudi9047":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allanli-lhh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xchen172":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qiaoeve":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tangyi23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shangjiaw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tongxw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"haodongwang1995":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuichicx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qunshanhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hebingliang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"baiqz":[null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092397229","body":"\n### 思路:\n通过元素在栈之间的转移来模拟队列的先进先出。\n\n\n```python\nclass MyQueue:\n \"\"\"使用两个栈实现的队列类\"\"\"\n\n def __init__(self):\n # 初始化两个栈:stack_in 用于入队操作,stack_out 用于出队操作\n self.stack_in = []\n self.stack_out = []\n\n def push(self, x: int) -> None:\n \"\"\"将元素 x 添加到队列的尾部\n 直接将元素压入 stack_in\n \"\"\"\n self.stack_in.append(x)\n\n def pop(self) -> int:\n \"\"\"移除并返回队列头部的元素\n 1. 如果 stack_out 为空,将 stack_in 中的所有元素弹出并压入 stack_out\n 2. 这样能确保元素以先进先出的顺序出栈\n 3. 弹出 stack_out 的栈顶元素\n \"\"\"\n if not self.stack_out:\n while self.stack_in:\n self.stack_out.append(self.stack_in.pop())\n return self.stack_out.pop()\n\n def peek(self) -> int:\n \"\"\"返回队列头部的元素,但不删除它\n 复用 pop 方法获取队首元素,然后将其压回 stack_out 以保持队列状态不变\n \"\"\"\n res = self.pop()\n self.stack_out.append(res)\n return res\n\n def empty(self) -> bool:\n \"\"\"检查队列是否为空\n 当且仅当两个栈都为空时,队列为空\n \"\"\"\n return not (self.stack_in or self.stack_out)\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaogaoddd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tuuna":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lxy12l":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chxbilly":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sentiy-hub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fea1220":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wtbkevin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"awenbocc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hallcia":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huzhipeng-hu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tongtz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lindo146":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"heye0507":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lmw6412036":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/1#issuecomment-3072932165","body":"@azl397985856 需要建day1啦","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3076893308","body":"## 思路1\n\n枚举每个普通字符,分别找到其左侧,右侧**最近**特殊字符的位置,求出距离,并取最小值。\n\n1. 预处理每个特殊字符的位置,保存至数组data;\n2. 枚举每个普通字符,在data中查找其左侧,右侧**最近**特殊字符的位置,求出距离,并取最小值。查找过程用可以**二分**实现,也可以用\n **单个指针记录最后一次位置**实现;\n3. 返回结果。\n\n## 思路1代码\n\n```javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function (s, c) {\n let n = s.length, data = [];\n for (let i = 0; i < n; i++) {\n if (s[i] === c) data.push(i);\n }\n\n // 双指针\n // left 左侧最近的c索引\n // right 右侧最近的c索引 right = left + 1\n let left = -1, right = -1, m = data.length;\n let ans = new Array(n).fill(0);\n for (let i = 0; i < n; i++) {\n let char = s[i];\n if (char === c) continue;\n\n let ldis = Infinity, rdis = Infinity;\n // 在data中寻找左侧最近的c索引\n // left 指针移动的条件:data[left + 1] < i,确保data[left] 是在i的左侧,距离i更近\n while (left + 1 < m && data[left + 1] < i) left++;\n if (left >= 0) ldis = i - data[left];\n \n right = left + 1;\n if (right < m) rdis = data[right] - i;\n ans[i] = Math.min(ldis, rdis);\n }\n return ans;\n };\n```\n\n## 思路1复杂度分析\n\n- 时间复杂度:O(n + m),n为字符串s的长度,m为data的长度,遍历字符串s2次,left也只是从左往右移动一次,为O(m),所以总的时间复杂度为O(n + m)。\n- 空间复杂度:O(m),m为data的长度,不考虑返回值的话,需要一个额外的长度为m的数组来保存c的位置,所以空间复杂度为O(m);考虑返回值,需要一个额外的长度为n的数组来保存结果,间复杂度为O(n)。\n\n---\n\n## 思路2\n\n也可以枚举每个特殊字符c的位置,处理c往左、往右能覆盖的普通字符,记录每个普通字符的最小值即可。\n\n1. 预处理每个特殊字符的位置,保存至数组data;\n2. 从左往右遍历data,处理每个特殊字符c左侧的普通字符的距离,保存至数组答案ans;可以使用思路1单指针记录最后一个位置的方式,降低时间复杂度;具体可以看代码;\n3. 从右往左遍历data,处理每个特殊字符c右侧的普通字符的距离,与答案ans对应位置比较,取最小值;\n4. 返回答案ans。\n\n## 思路2代码\n```javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function (s, c) {\n let n = s.length, data = [], ans = new Array(n).fill(Infinity);\n for (let i = 0; i < n; i++) {\n if (s[i] === c) {\n ans[i] = 0;\n data.push(i);\n }\n }\n\n const m = data.length;\n\n // 从左往右遍历\n let left = 0;//从左往右开始,第一个普通字符的索引\n for (let j of data) {\n while (left < n && s[left] === c) left++;\n while (left < n && s[left] !== c && left < j) {\n // console.log('处理left',left,j);\n ans[left] = Math.min(ans[left], j - left);\n left++;\n }\n }\n\n // 从右往左遍历\n let right = n - 1;// 从右往左开始,第一个普通字符的索引\n for (let i = m - 1; i >= 0; i--) {\n let j = data[i];\n while (right >= 0 && s[right] === c) right--;\n while (right >= 0 && s[right] !== c && right > j) {\n ans[right] = Math.min(ans[right], right - j);\n right--;\n }\n }\n return ans;\n };\n```\n## 思路2复杂度分析\n\n- 时间复杂度:O(n + m),n为字符串s的长度,遍历字符串s1次,遍历data两次,left、right也只是各移动一次,所以总的时间复杂度为O(n + m)。\n- 空间复杂度:O(m),m为data的长度,不考虑返回值的话,需要一个额外的长度为m的数组来保存c的位置,所以空间复杂度为O(m);考虑返回值,需要一个额外的长度为n的数组来保存结果,间复杂度为O(n)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082655797","body":"## 思路1\n这是一个典型的栈设计题,数据规模不大的情况下,按照常规操作即可。可以使用数组或链表来存储。\n## 代码1\n```javascript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.data = []\n this.maxSize = maxSize;\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if(this.data.length < this.maxSize) this.data.push(x);\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if(this.data.length === 0) return -1;\n return this.data.pop(); \n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n let n = this.data.length;\n for(let i = 0;i < k;i++){\n if(i < n) this.data[i] += val;\n else break;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n## 复杂度分析1\n* 时间复杂度:O(n*k)。n表示操作次数。插入和删除的时间复杂度都是O(1),每次increment都要遍历数组,时间复杂度是O(k);所以总的复杂度为O(n*k)。\n* 空间复杂度:O(n)。n为maxSize。\n---\n## 思路2\n如果k较大,increment是个非常耗时的操作,所以我们需要优化increment的操作。\n优化思路:increment是批量更新的,可以用差分数组来实现。但是又要支持高效的查询与删除操作,所以可以用树状数组来维护这个差分数组。\n## 代码2\n```javascript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function (maxSize) {\n this.cnt = 0;\n this.data = new Array(maxSize + 1).fill(0);\n this.maxSize = maxSize;\n};\n\n/**\n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function (x) {\n if (this.cnt === this.maxSize) return;\n this.cnt++;\n this.update(this.cnt - 1, x);\n if(this.cnt <= this.maxSize - 1) this.update(this.cnt, -x);\n //console.log('push ',x,this.data);\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function () {\n if(this.cnt === 0) return -1;\n let ans = this.query(this.cnt - 1);\n this.update(this.cnt - 1, -ans);\n if(this.cnt <= this.maxSize - 1) this.update(this.cnt,ans);\n this.cnt--;\n //console.log('pop ',ans,this.data);\n return ans;\n};\n\n/**\n * @param {number} k\n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function (k, val) {\n if(this.cnt === 0) return;\n this.update(0, val);\n let r = Math.min(k,this.maxSize,this.cnt);\n if(r <= this.maxSize - 1) this.update(r,-val);\n};\n\n\nCustomStack.prototype.query = function (i) {\n i = i + 1;\n let ans = 0;\n while (i) {\n ans += this.data[i];\n i -= this.lowbit(i);\n }\n return ans;\n}\n\nCustomStack.prototype.update = function (i, val) {\n i = i + 1;\n while (i <= this.maxSize) {\n this.data[i] += val;\n i += this.lowbit(i);\n }\n}\n\n\nCustomStack.prototype.lowbit = function (i) {\n return i & (-i);\n}\n\n/**\n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n\n```\n\n## 复杂度分析2\n* 时间复杂度:O(n*log(maxSize))。n表示操作次数。插入、删除、批量更新的时间复杂度都是O(log(maxSize));所以总的复杂度为O(n*log(maxSize))。\n* 空间复杂度:O(n)。n为maxSize。\n---\n## 思路3\n有没有保持插入,删除O(1),批量更新O(1)的算法呢?官方题解给出了一个懒删除的技巧。小伙伴们可以尝试一下。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087040795","body":"## 思路一:栈\n这是一个典型的括号匹配问题,可以用栈来解决。 \n步骤:\n1. 创建一个栈sStack,栈顶元素标示当前答案,初始元素为空字符串;\n2. 创建一个栈nStack,存储需要重复的数字k;\n3. 声明一个全局变量num,用来记录数字。遍历字符串:\n 1. 如果当前字符为数字,追加到num中;\n 2. 如果当前字符为左括号,将num压入栈nStack,将一个新的空字符串压入栈sStack,并清空num。**遇到左括号表示要开启新一轮的字符串重复过程,因此数字栈压入需要重复的数字k,字符串栈压入一个空字符串来存储本轮重复过程产生的答案**;\n 3. 如果当前字符为字母,追加到栈sStack的栈顶元素中;\n 4. 如果当前字符为右括号,取出栈sStack的栈顶元素s,取出栈nStack的栈顶元素k,s重复k次;并追加到栈sStack的栈顶元素中。**遇到右括号表示本轮重复过程结束,因此将栈sStack的栈顶元素重复k次,并追加到栈sStack的栈顶元素中,继续前一轮的重复**。\n 5. 最后栈sStack的栈顶元素即为结果。\n## 代码一\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n let sStack = [''],nStack = [],n = s.length;\n let num = 0;\n for(let i = 0;i < n;i++){\n let c = s[i];\n if(/\\d/.test(c)) num = num * 10 + Number(c);\n else if(c === '[') {\n nStack.push(num);\n num = 0;\n sStack.push('');\n }else if(/[a-z]/.test(c)){\n // console.log(sStack)\n sStack[sStack.length - 1] += c;\n }else{\n let s = sStack.pop(),k = nStack.pop();\n // console.log(s,k);\n if(s) s = s.repeat(k);\n sStack[sStack.length - 1] += s;\n // console.log(sStack)\n }\n }\n return sStack[0];\n };\n```\n## 复杂度分析一\n* 时间复杂度:O(n),其中n为字符串s的长度。\n* 空间复杂度:O(n),需要两个最长长度为n的栈保存答案及数字,其中n为字符串s的长度。\n--- \n## 思路二:递归\n括号匹配问题,一般可以用递归来解决。 \n步骤:\n1. 预处理字符串s,记录与每个“\\[”匹配的“\\]”的位置,保存至数组left中。\n> 预处理匹配括号位置是这类递归问题常见的技巧。\n2. 从左往右遍历字符串s: \n 1. 如果当前字符为字母,则将当前字符添加到结果res中;\n 2. 如果当前字符为数字,则将数字保存在变量num中;\n 3. 如果当前字符为左括号,递归调用f,处理\\[i + 1, left\\[i] - 1]的子串,得到的结果重复num次,并追加到结果res中;num清空;\n4. 返回res。\n\n## 代码二\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n let stack = [],n = s.length,left = new Array(n).fill(-1);\n for(let i = 0;i < n;i++){\n let c = s[i];\n if(c === '[') stack.push(i);\n else if(c === ']') left[stack.pop()] = i;\n }\n return f(0,n - 1);\n // -----------------------------------\n function f(l,r){\n let ans = '',num = 0;\n for(let i = l;i <= r;i++){\n let c = s[i];\n if(/\\d/.test(c)) num = num * 10 + Number(c);\n else if(c === '['){\n ans += f(i + 1,left[i] - 1).repeat(num);\n num = 0;\n i = left[i];\n }else if(/[a-z]/.test(c)) ans += c;\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析二\n* 时间复杂度:O(n),其中n为字符串s的长度。\n* 空间复杂度:O(n),即递归栈深度,最大为n,其中n为字符串s的长度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091479392","body":"## 思路\n1. 设计双栈,一个用于存放入队数据,一个用于存放出队数据。\n2. 各个操作的实现思路:\n 1. push:将数据压入pushData栈中。\n 2. pop:如果popData栈为空,则将pushData栈中的数据全部弹出并压入popData栈中。然后弹出popData栈的栈顶元素。\n 3. peek:同pop操作,最后一步返回popData栈的栈顶元素。 \n 4. empty:判断两个栈是否为空。 \n\n> js中可以用数组模拟栈。\n## 代码\n```javascript\nvar MyQueue = function() {\n this.pushData = []\n this.popData = [] \n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.pushData.push(x) \n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n if(this.popData.length === 0 && this.pushData.length) while(this.pushData.length) this.popData.push(this.pushData.pop());\n return this.popData.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if(this.popData.length === 0 && this.pushData.length) while(this.pushData.length) this.popData.push(this.pushData.pop());\n return this.popData[this.popData.length - 1];\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return this.pushData.length === 0 && this.popData.length === 0\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```\n## 复杂度分析\n- 时间复杂度:O(1):插入、删除、查找操作的均摊时间复杂度都是O(1)\n- 空间复杂度:O(n):栈的存储空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094576990","body":"## 思路\n比较容易的思路是,排序后,每个块和排序前元素的种类和数量完全相同,可以用哈希表或前缀和来求解。此思路的时间复杂度是O(n),空间复杂度是O(nlog(n))。 \n后来看了看题解,发现可以用单调栈或维护前后缀的思路来求解。\n\n### 排序块性质\n**我们要想划分最多的块,并且保证排序后的结果和原数组的排序结果相同,则块中的元素必须保证,块中的最大值都比右边的元素小或者相同,块中的最小值都比左边的元素大或者相同。**\n则我们维护一个前缀最大值和后缀最小值两个数组,只要前缀的最大值,小于等于后缀的最小值,则可划分(相当于给数组划一条线)。\n## 代码\n```javascript\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n let n = arr.length, prefixMax = new Array(n).fill(-Infinity),suffixMin = new Array(n).fill(Infinity);\n for(let i = 0;i < n;i++){\n prefixMax[i] = Math.max(i ? prefixMax[i - 1] : -Infinity,arr[i]);\n let j = n - 1 - i;\n suffixMin[j] = Math.min(j + 1 < n ? suffixMin[j + 1] : Infinity,arr[j]);\n }\n\n let ans = 1;\n for(let i = 0;i < n - 1;i++){\n if(prefixMax[i] <= suffixMin[i + 1]) ans++;\n }\n return ans\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(n)\n\n## 参考题解\n[https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solutions/1/zui-duo-neng-wan-cheng-pai-xu-de-kuai-by-z0wz/](https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solutions/1/zui-duo-neng-wan-cheng-pai-xu-de-kuai-by-z0wz/)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095130877","body":"## 思路\n旋转链表的本质上是将链表尾部k个节点移动到链表头部。按照这个思路步骤如下:\n1. 计算链表长度l;\n2. 如果 k % l === 0 或者 l === 0,即k为l的整数倍,或者链表为空,则不需要旋转,直接返回head;否则 k = k % l;\n3. 声明两个指针fast、slow,fast先移动k步;\n4. fast、slow同时移动,直到fast到达链表末尾;\n5. 此时:\n 1. slow的下一个节点即为新的头结点\n 2. slow.next 指向 null\n 3. fast.next 指向 head\n 4. 返回新的头结点\n\n## JavaScript代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n if(!head || k === 0) return head;\n let l = 0,curr = head;\n while(curr){\n l++;\n curr = curr.next;\n }\n k = k % l;\n if(k === 0) return head;\n let fast = head,slow = head;\n while(k){\n fast = fast.next;\n k--;\n }\n\n while(fast.next){\n fast = fast.next;\n slow = slow.next;\n }\n\n let newHead = slow.next;\n slow.next = null;\n fast.next = head;\n return newHead;\n\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中n为链表的长度。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100439586","body":"## 思路\n因为是两两交换,所以可以声明四个指针记录涉及到交换的节点,修改相关指针的next指向即可。具体步骤如下:\n1. 特判:链表为空或链表只有一个节点,直接返回原链表。\n2. 为了简化代码,声明一个哨兵节点dummy,dummy.next = head,方便统一处理。\n3. 声明指针prev,指向前一次交换后的结束节点;声明指针curr,指向本次交换的开始节点。初始值prev = dummy,curr = head,开始循环:\n 1. 循环终止条件:curr为空或者curr的下一个节点为空(即curr没有可以交换的节点了)。\n 2. 声明next指针,next = curr.next;声明nextCurr指针,nextCurr = curr.next.next;\n 3. 两两交换:curr.next = nextCurr,next.next = curr;\n 4. 重新设置头尾指向,确保下一轮循环正确执行:prev.next = next;\n 5. 重新设置prev,curr:prev = curr; curr = nextCurr;继续循环,直到循环终止条件。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n if(!head || !head.next) return head;\n const dummy = new ListNode();\n dummy.next = head;\n \n let prev = dummy,curr = dummy.next;\n while(curr && curr.next){\n let next = curr.next,nextCurr = next.next;\n curr.next = nextCurr;\n next.next = curr;\n \n prev.next = next;\n\n prev = curr;\n curr = curr.next;\n }\n\n return dummy.next;\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是链表的长度。\n- 空间复杂度:O(1),仅使用有限个指针。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105520636","body":"## 思路\n* 本题目标是将一个有序单链表(升序排列)转换为一棵高度平衡的二叉搜索树(Height Balanced Binary Search Tree)。\n* 核心思想是使用递归方式构建树,每次选择链表的中间节点作为当前子树的根节点,以保证左右子树的高度差不超过 1。\n* 利用快慢指针(slow 和 fast)找到链表的中间节点,并将链表分割为左子链表和右子链表,分别递归构建左右子树。\n* 实现步骤如下:\n 1. 递归终止条件:\n * 如果链表为空(!head),返回 null。\n * 如果只有一个节点(!head.next),直接构建一个 TreeNode 返回。\n 2. 寻找中间节点:\n * 使用快慢指针法,fast 每次走两步,slow 每次走一步,当 fast 到达末尾时,slow 正好指向中间节点。使用一个临时变量 prev 记录 slow 的前一个节点,方便后续断开连接。\n 3. 分割链表:\n * 将 slow 前面的节点作为左子链表,断开连接。\n * slow.next 作为右子链表继续递归处理。\n 4. 构建树节点:\n * 当前 slow.val 作为根节点,递归构建左右子树。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if(!head) return head;\n // display(head)\n if(!head.next) return new TreeNode(head.val);\n\n // 寻找中间节点\n let slow = head,fast = head,prev = null;\n while(fast.next && fast.next.next){\n fast = fast.next.next;\n prev = slow;\n slow = slow.next;\n }\n // 此时,slow是中间节点,slow.next是右子树的根\n let next = slow.next;\n if(prev) prev.next = null;\n slow.next = null;\n\n const root = new TreeNode(slow.val);\n root.left = sortedListToBST(prev ? head : null);\n root.right = sortedListToBST(next);\n return root;\n};\n\nfunction display(head){\n let ans = [],p = head;\n while(p){\n ans.push(p.val);\n p = p.next;\n }\n console.log('处理的树:',ans)\n}\n```\n## 复杂度分析\n* 时间复杂度:O(n log n)\n * 每一层递归都需要遍历链表的一半来找中间节点(O(n)),递归深度为 log n,因此总时间复杂度为 O(n log n)。\n* 空间复杂度:O(log n)\n * 主要是递归调用栈的空间,取决于树的高度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111762311","body":"## 思路\n- 定义两个指针 `pA` 和 `pB`,分别从 `headA` 和 `headB` 开始遍历。\n- 当 `pA` 和 `pB` 不相遇时,它们会继续向前移动:\n - 如果 `pA` 到达末尾 (`null`),则跳转到 `headB`。\n - 如果 `pB` 到达末尾 (`null`),则跳转到 `headA`。\n- 这样,两个指针最终会在相交点相遇,或者同时到达末尾 (`null`),从而退出循环。\n- 返回 `pA`,即相交节点或 `null`。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function (headA, headB) {\n let pA = headA, pB = headB;\n while (pA !== pB) {\n pA = pA ? pA.next : headB;\n pB = pB ? pB.next : headA;\n }\n return pA;\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n + m),其中 n 和 m 分别为链表 headA 和 headB 的长度。\n- 空间复杂度:O(1),只使用了两个指针变量,没有额外的空间。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116200386","body":"## 思路\n- 首先处理边界情况:如果head为空,直接返回\n- 快慢指针同时遍历链表,快指针每次走两步,慢指针每次走一步\n- 当两指针相遇时停止第一阶段\n- 如果fast为null,说明无环,返回null\n- 将slow重置为head,两个指针以相同速度继续移动直到相遇\n- 相遇点即为环的起始节点\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n if(!head) return head;\n let slow = head,fast = head;\n while(fast){\n fast = fast.next;\n if(fast) fast = fast.next;\n\n slow = slow.next;\n\n if(slow === fast) break;\n }\n\n if(!fast) return fast;\n\n slow = head;\n\n while(slow !== fast){\n slow = slow.next;\n fast = fast.next;\n }\n\n return slow\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3125594702","body":"## LRU Cache 算法思路分析\n\nLRU (Least Recently Used) 缓存是一种常用的缓存淘汰策略,当缓存满时,会优先淘汰最近最少使用的元素。\n\n### 核心数据结构\n\n1. **双向链表**:维护元素的访问顺序,头部是最近最少使用的元素,尾部是最近使用的元素\n2. **哈希表(Map)**:提供O(1)时间复杂度的元素查找\n\n### 主要操作实现\n\n#### 1. 初始化\n- 设置缓存容量\n- 初始化当前元素计数器\n- 创建哈希表存储键值对\n- 创建虚拟头节点和尾节点,方便操作\n\n#### 2. 获取元素get\n- 如果元素不存在,返回-1\n- 如果元素存在:\n - 将该节点从当前位置删除\n - 将该节点插入到链表尾部(标记为最近使用)\n - 返回节点值\n\n#### 3. 插入/更新元素put\n- **新元素插入**:\n - 如果缓存已满,删除链表头部节点(最近最少使用的元素)\n - 创建新节点并添加到哈希表\n - 将新节点插入链表尾部\n- **更新元素**:\n - 更新节点值\n - 将节点从当前位置删除并移到链表尾部\n\n#### 4. 辅助方法\n- insertToTail:将节点插入链表尾部\n- deleteFromHead:删除链表头部节点\n- deleteNode:删除指定节点\n\n## 代码\n```javascript\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.cnt = 0;\n this.map = new Map();\n this.head = new DoubleNode();\n this.tail = new DoubleNode();\n this.head.next = this.tail;\n this.tail.prev = this.head; \n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n // console.log('get',key)\n \n if(this.map.has(key) === false) return -1;\n let node = this.map.get(key);\n\n this.deleteNode(node);\n \n this.insertToTail(node);\n // this.map.set(key,node);\n \n // this.display();\n\n return node.val;\n};\n\n/** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\nLRUCache.prototype.put = function(key, value) {\n if(this.map.has(key) === false){// 插入操作\n let node = new DoubleNode(key,value);\n if(this.cnt === this.capacity) this.deleteFromHead(); \n else this.cnt++\n this.map.set(key,node);\n this.insertToTail(node);\n }else{\n let node = this.map.get(key);\n node.val = value;\n\n this.deleteNode(node);\n\n this.insertToTail(node);\n // this.map.set(key,node);\n }\n\n // console.log('put',key,value);\n // this.display();\n};\n\nLRUCache.prototype.insertToTail = function(node){\n let prev = this.tail.prev;\n \n prev.next = node;\n node.next = this.tail;\n \n this.tail.prev = node;\n node.prev = prev;\n}\n\nLRUCache.prototype.deleteFromHead = function(){\n let node = this.head.next;\n let next = node.next;\n \n this.head.next = next;\n next.prev = this.head;\n\n this.map.delete(node.key);\n}\n\nLRUCache.prototype.deleteNode = function(node){\n let prev = node.prev,next = node.next;\n prev.next = next;\n next.prev = prev;\n\n node.prev = null;\n node.next = null;\n\n // this.map.delete(node.key);\n}\n\nLRUCache.prototype.display = function(){\n let k = this.cnt,p = this.head.next;\n let ans = []\n while(k){\n ans.push(p.key + '=>' + p.val);\n k--;\n p = p.next;\n }\n console.log(ans);\n}\n\nfunction DoubleNode(key,val){\n this.key = key;\n this.val = val;\n this.next = null;\n this.prev = null;\n}\n\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```\n## 复杂度分析\n### 时间复杂度\n- get操作:O(1)\n- put操作:O(1)\n\n### 空间复杂度\n- O(capacity),需要存储最多capacity个元素\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123739061","body":"## 思路\n\n使用了递归的思想来解决问题:\n\n1. **基础情况(Base Case)**:如果当前节点为空(`!root`),则返回深度0,因为空节点没有深度。\n\n2. **递归关系(Recursive Relation)**:\n - 分别计算左子树和右子树的最大深度:`maxDepth(root.left)` 和 `maxDepth(root.right)`\n - 取两者中的较大值:`Math.max(maxDepth(root.left), maxDepth(root.right))`\n - 加上当前节点的1层高度:`+1`\n\n### 算法执行过程\n\n1. 对于任意节点,先递归计算其左子树的最大深度\n2. 再递归计算其右子树的最大深度\n3. 比较左右子树的深度,取较大值\n4. 将较大值加1(代表当前节点所在的层),作为以当前节点为根的子树的最大深度\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if(!root) return 0;\n return Math.max(maxDepth(root.left),maxDepth(root.right))+1;\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n),其中n是二叉树的节点数。因为需要遍历每个节点一次。\n- **空间复杂度**:O(h),其中h是二叉树的高度。这是由于递归调用栈的深度,最坏情况下(完全不平衡的树)可能达到O(n),最好情况下(完全平衡的树)为O(log n)。\n\n这是一个典型的分治算法应用,将问题分解为更小的子问题(左右子树的深度),然后合并结果得到最终答案。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125568669","body":"## 代码思路分析\n\n这是一个经典的二叉树递归问题,采用深度优先搜索(DFS)的方式解决:\n\n1. **基本情况处理**:\n - 如果两个节点都为null,则认为相同,返回true\n - 如果其中一个节点为null,另一个不是,则不同,返回false\n\n2. **递归比较**:\n - 比较当前节点的值是否相等\n - 递归比较左子树是否相同\n - 递归比较右子树是否相同\n - 只有当值相等且左右子树都相同时,才返回true\n\n## 代码实现\n\n```javascript\nvar isSameTree = function(p, q) {\n // 如果两个节点都为空,则相同\n if(p===null && q===null) return true;\n // 如果只有一个节点为空,则不同\n if(p===null) return false;\n if(q===null) return false;\n // 比较当前节点值,并递归比较左右子树\n return p.val===q.val && isSameTree(p.left,q.left) && isSameTree(p.right,q.right);\n};\n```\n\n\n## 复杂度分析\n\n- **时间复杂度**:O(min(m,n)),其中m和n分别是两个二叉树的节点数。在最坏情况下,需要遍历两个树中所有节点。\n- **空间复杂度**:O(min(m,n)),递归调用的层数最多为较小树的高度,最坏情况下为O(min(m,n))。\n\n这个算法通过递归方式同时遍历两棵树的相同位置节点,并比较它们的值是否相等,从而判断两棵树是否完全相同。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130348089","body":"## 思路\n\n### 核心思路\n- 使用深度优先搜索(DFS)遍历二叉树\n- 在遍历过程中维护从根节点到当前节点形成的数字\n- 当到达叶节点时,将形成的数字加到结果中\n\n### 具体实现\n\n1. **函数定义与参数**:\n - `sumNumbers(root, prev = 0)` 接收当前节点 `root` 和之前形成的数字 `prev`\n - `prev` 参数有默认值 0,用于累积从根到当前节点的数字\n\n2. **边界条件处理**:\n ```javascript\n if(!root) return 0;\n ```\n\n - 如果当前节点为空,返回 0\n\n3. **数字累积**:\n ```javascript\n prev = prev * 10 + root.val;\n ```\n\n - 将当前节点值添加到路径数字中\n - 通过 `prev * 10 + root.val` 实现数字的逐位构建\n\n4. **叶节点判断**:\n ```javascript\n if(!root.left && !root.right) return prev;\n ```\n\n - 如果当前节点是叶节点(无左右子节点),返回累积的数字\n\n5. **递归处理**:\n ```javascript\n return sumNumbers(root.left,prev) + sumNumbers(root.right,prev);\n ```\n\n - 分别递归处理左右子树\n - 将左右子树的结果相加返回\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root,prev = 0) {\n if(!root) return 0;\n prev = prev * 10 + root.val;\n if(!root.left && !root.right) return prev;\n return sumNumbers(root.left,prev) + sumNumbers(root.right,prev);\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n),其中 n 是二叉树的节点数,需要遍历每个节点一次\n- **空间复杂度**:O(h),其中 h 是二叉树的高度,主要是递归调用栈的空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134622736","body":"## 思路\n\n### 1. 核心思想\n使用深度优先搜索(DFS)遍历二叉树,记录每一层最左边的节点值。\n\n### 2. 关键实现点\n\n- **层级记录**:通过 `level` 参数跟踪当前节点所在的层级\n- **每层只记录一次**:利用 `level === left.length` 条件确保每层只记录第一个访问的节点值\n- **先左后右遍历**:先遍历左子树再遍历右子树,保证每层第一个访问的是最左边的节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let left = [];\n dfs(root,0)\n return left[left.length - 1];\n // ----------------------\n function dfs(root,level){\n if(!root) return;\n if(level === left.length) left.push(root.val);\n dfs(root.left,level + 1);\n dfs(root.right,level + 1);\n }\n};\n```\n## 优化后的代码\n优化思路:没必要用数组保存整个左侧值,只需要记录左侧值第一次出现即可\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let left = 0,ans;\n dfs(root,0)\n return ans;\n // ----------------------\n function dfs(root,level){\n if(!root) return;\n if(level === left) {\n left++;\n ans = root.val;\n }\n dfs(root.left,level + 1);\n dfs(root.right,level + 1);\n }\n};\n```\n\n\n## 复杂度分析\n- **时间复杂度**:O(n),其中 n 是二叉树的节点数,需要遍历每个节点一次\n- **空间复杂度**:O(h),其中 h 是二叉树的高度,主要是递归调用栈的空间开销","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138308014","body":"## 思路\n\n### 1. 序列化 (`serialize`)\n- 使用前序遍历(根-左-右)遍历二叉树\n- 对于每个节点:\n - 如果节点为空,将 `null` 添加到结果数组\n - 如果节点不为空,将节点值添加到结果数组,然后递归处理左右子树\n- 最后将数组转换为 JSON 字符串返回\n\n### 2. 反序列化 (`deserialize`)\n- 将 JSON 字符串解析为数组\n- 使用递归方式重建二叉树:\n - 按顺序读取数组元素\n - 如果当前元素是 `null`,返回 `null`\n - 如果当前元素不是 `null`,创建新节点,并递归构建左右子树\n - 利用前序遍历的特点,按顺序处理就能重建原来的树结构\n\n## 关键特点\n\n1. **前序遍历**:保证了根节点在子节点之前被处理,便于重建时确定父子关系\n2. **空节点标记**:用 `null` 标记空节点,确保能完全还原树的结构\n3. **递归实现**:两个函数都使用递归方式实现,代码简洁清晰\n\n## 示例说明\n\n假设有一棵二叉树:\n```\n 1\n / \\\n 2 3\n / \\\n 4 5\n```\n\n\n- 序列化结果:`[1,2,null,null,3,4,null,null,5,null,null]`\n- 反序列化时按此顺序重建树结构\n\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n let ans = [];\n dfs(root);\n return JSON.stringify(ans);\n // -----------------\n function dfs(root){\n if(!root){\n ans.push(null);\n return;\n }\n ans.push(root.val);\n dfs(root.left);\n dfs(root.right);\n }\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n let arr = JSON.parse(data),i = 0;\n //console.log(arr);\n return dfs();\n // if(arr.length === 0) return null;\n // ---------------------\n function dfs(){\n let node;\n // console.log(i,arr[i]);\n if(arr[i] === null) node = null;\n else node = new TreeNode(arr[i]);\n i++;\n if(node) {\n node.left = dfs();\n node.right = dfs();\n }\n return node;\n }\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```\n\n## 复杂度分析\n- 时间复杂度:序列化和反序列化的时间复杂度都是 O(n),其中 n 是二叉树的节点数。\n- 空间复杂度:考虑到返回值的话,序列化和反序列化的空间复杂度都是 O(n),其中 n 是二叉树的节点数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3141895435","body":"## 思路\n\n### 具体实现步骤\n\n1. **数据结构选择**\n - 使用一个大小为2001的数组 cols 每个元素是一个优先队列 `PriorityQueue`\n - 优先队列用于处理同一列中节点的排序问题\n\n2. **排序规则**\n - 主要按行号 row 排序(上到下)\n - 行号相同时按节点值 `node.val` 排序\n\n3. **DFS遍历**\n - 通过 dfs 函数遍历整个二叉树\n - 将每个节点按其列号存入对应的优先队列中\n - 列号通过 `col + 1000` 映射到数组索引,处理负数列号\n\n4. **结果构建**\n - 遍历 cols 数组,跳过空队列\n - 从每个非空队列中依次取出元素,构建每列的结果\n - 按列顺序组合成最终结果\n\n## 关键点\n\n- **坐标系统**:以根节点为原点(0,0),向左列号减1,向右列号加1,向下行号加1\n- **偏移处理**:通过 `col + 1000` 将可能的负数列号映射到正数索引\n- **排序逻辑**:同一位置优先按行排序,其次按值排序\n\n这种方法确保了垂直遍历的正确顺序。\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n let cols = new Array(2000 + 1).fill(0).map(()=>new PriorityQueue((a,b)=>{\n if(a[0] !== b[0]) return a[0] - b[0];\n return a[2] - b[2];\n }));\n\n dfs(root,0,0);\n let ans = [];\n for(let i = 0;i <= 2000;i++){\n let data = cols[i];\n if(data.size() === 0) continue;\n let temp = []\n while(data.size()) temp.push(data.dequeue()[2]);\n ans.push(temp);\n }\n return ans;\n\n // --------------------------------\n function dfs(node,row,col){\n if(!node) return;\n cols[col + 1000].enqueue([row,col,node.val]);\n dfs(node.left,row + 1,col - 1);\n dfs(node.right,row + 1,col + 1);\n }\n \n};\n```\n\n## 复杂度分析\n\n### 时间复杂度\n\n1. **初始化阶段**\n - 创建大小为2001的数组并初始化优先队列:O(2001) = O(1)\n\n2. **DFS遍历阶段**\n - 对每个节点执行一次 dfs 调用\n - 假设树有 N 个节点,则 DFS 总共执行 N 次\n - 每次 enqueue 操作在优先队列中的时间复杂度为 O(log M),其中 M 是队列中元素个数\n - 最坏情况下,所有节点都在同一列,M 最大为 N\n - 因此 DFS 阶段时间复杂度为 O(N log N)\n\n3. **结果构建阶段**\n - 遍历2001个位置的数组:O(2001) = O(1)\n - 从优先队列中 dequeue 所有元素:每个元素 dequeue 一次,总共 N 个元素\n - 每次 dequeue 操作为 O(log M)\n - 总时间复杂度为 O(N log N)\n\n**总时间复杂度:O(N log N)**,其中 N 是二叉树中节点的数量\n\n### 空间复杂度\n\n1. **存储结构**\n - cols 数组:大小固定为 2001,每个元素是一个优先队列\n - 所有优先队列总共存储 N 个节点信息:O(N)\n - 每个节点信息是一个包含3个元素的数组:O(1) 每节点\n\n2. **递归调用栈**\n - dfs 函数的递归深度最多为树的高度 H\n - 在最坏情况下(树退化为链表),H = N\n - 平均情况下,对于平衡二叉树,H = log N\n\n3. **结果数组**\n - ans 数组存储最终结果:O(N)\n\n**总空间复杂度:O(N)**,其中 N 是二叉树中节点的数量\n\n### 总结\n\n- **时间复杂度:O(N log N)**\n- **空间复杂度:O(N)**\n\n其中 N 为二叉树的节点总数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146457266","body":"## 思路:\n\n1. **使用哈希表存储已遍历元素**:\n - 创建一个空对象 [map](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\454\\2.js#L5-L5) 作为哈希表\n - 用于存储已经遍历过的元素值和其对应的索引\n\n2. **一次遍历查找**:\n - 遍历数组中的每个元素 `nums[i]`,记为 [a](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\1.js#L14-L14)\n - 计算目标差值 `b = target - a`\n - 检查 `b` 是否已经在哈希表中存在\n - 如果存在,说明找到了两个数,它们的和等于目标值,直接返回这两个数的索引 `[map[b], i]`\n - 如果不存在,将当前元素 [a](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\1.js#L14-L14) 和它的索引 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 存入哈希表,继续遍历\n\n### 算法优势:\n1. **时间复杂度优化**:从暴力解法的 O(n²) 降低到 O(n)\n2. **空间换时间**:使用额外的哈希表存储,换取查找时间的优化\n3. **一次遍历**:只需要遍历一次数组就能得到结果\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n let map = {}\n for(let i = 0;i < nums.length;i++){\n let a = nums[i],b = target - a;\n if(map[b] !== undefined) return [map[b],i];\n map[a] = i;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是数组的长度。\n- 空间复杂度:O(n),哈希表 map 的大小为 n。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3146924002","body":"## 思路\n### 主要步骤:\n\n1. **统计频次**:使用 [map](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题04.01.节点间通路/main.js#L13-L13) 对象统计每个数字在数组中出现的频次\n ```javascript\n let map = {};\n for(let i of nums) map[i] = (map[i] || 0) + 1;\n ```\n\n\n2. **维护大小为 K 的最小堆**:使用最小堆来保存频率最高的 K 个元素\n ```javascript\n let q = new MinPriorityQueue(v=>v[1]); // 基于元素出现频次的优先队列\n ```\n\n\n遍历统计结果,将元素和其频次作为数组加入堆中,当堆的大小超过 K 时,移除堆顶(即当前堆中频次最低的元素):\n ```javascript\n for(let key in map){\n q.enqueue([+key,map[key]]);\n if(q.size() > k) q.dequeue();\n }\n ```\n\n\n3. **构建结果数组**:依次从堆中取出元素,因为是最小堆,所以频次低的先出堆,最终得到的就是频次最高的 K 个元素\n ```javascript\n let ans = [];\n while(q.size()){\n ans.push(q.dequeue()[0]);\n }\n ```\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function(nums, k) {\n let q = new MinPriorityQueue(v=>v[1]);\n let map = {};\n for(let i of nums) map[i] = (map[i] || 0) + 1;\n for(let key in map){\n q.enqueue([+key,map[key]]);\n if(q.size() > k) q.dequeue();\n } \n let ans = [];\n while(q.size()){\n ans.push(q.dequeue()[0]);\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(N log K),其中 N 是数组的长度\n- 空间复杂度:O(N),用于存储频次映射表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148902680","body":"## 思路\n\n### 1. 数据结构选择\n- 使用 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 数组存储每个点到其他点的距离统计\n- `map[i]` 是一个 Map,记录第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 个点到其他各点的距离及出现次数\n\n### 2. 核心逻辑\n- **距离计算**:遍历所有点对,计算两点间距离的平方(避免开根号运算)\n- **距离统计**:将每对点的距离信息分别记录到两个点的统计中\n- **结果计算**:对于每个点,如果到其他点有相同距离的点超过1个,则可以组成回旋镖\n\n### 3. 关键步骤详解\n\n```javascript\n// 计算两点间距离的平方\nfunction calc(i,j){\n let a = Math.abs(points[i][0] - points[j][0]),b = Math.abs(points[i][1] - points[j][1]);\n return a * a + b * b;\n}\n```\n这段代码计算两个点之间的欧几里得距离的平方,使用平方避免浮点运算。\n\n```javascript\n// 统计每个点到其他点的距离\nfunction addMap(i,dis){\n let m = map[i];\n m.set(dis,(m.get(dis) || 0) + 1);\n}\n```\n将距离信息记录到对应点的统计Map中。\n\n### 4. 结果计算原理\n\n对于每个点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6),如果存在 `v` 个点与它距离相同(`v>1`),则可以从这 `v` 个点中选择 2 个点与点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 组成回旋镖,选择方式有 `v*(v-1)` 种。\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} points\n * @return {number}\n */\nvar numberOfBoomerangs = function(points) {\n let n = points.length;\n if(n < 3) return 0;\n let map = new Array(n).fill(0).map(()=>new Map());\n for(let i = 0;i < n;i++){\n for(let j = i + 1;j < n;j++){\n let dis = calc(i,j);\n addMap(i,dis);\n addMap(j,dis);\n }\n }\n let ans = 0;\n for(let i = 0;i < n;i++){\n for(let [k,v] of map[i]){\n if(v <= 1) continue;\n ans += v * (v - 1);\n }\n }\n\n return ans;\n\n \n\n\n // ------------------------------\n function calc(i,j){\n let a = Math.abs(points[i][0] - points[j][0]),b = Math.abs(points[i][1] - points[j][1]);\n return a * a + b * b;\n }\n\n function addMap(i,dis){\n let m = map[i];\n m.set(dis,(m.get(dis) || 0) + 1);\n\n }\n};\n```\n\n## 算法复杂度\n- 时间复杂度:O(n²)\n- 空间复杂度:O(n²)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3152979976","body":"## 思路\n\n### 核心思想\n使用**滑动窗口**(Sliding Window)技术配合**哈希表**来解决这个问题。\n\n### 关键变量说明\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31): 滑动窗口的左边界\n- [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6): 滑动窗口的右边界(循环变量)\n- [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5): 用于记录窗口内每个字符出现的次数\n- `ans`: 记录最长无重复子串的长度\n\n### 算法步骤\n\n1. **初始化**:设置左边界 `l = 0`,创建字符计数的 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5),初始化结果 `ans = 0`\n\n2. **扩展窗口**:使用 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 从左到右遍历字符串,逐步扩展窗口右边界\n\n3. **处理重复字符**:\n - 当遇到重复字符时(`map.has(c)` 为 true),不断右移左边界 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31)\n - 移动过程中减少对应字符的计数,如果计数为0则从 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 中删除\n - 直到窗口中不再包含当前字符为止\n\n4. **更新结果**:\n - 计算当前窗口长度 `i - l + 1`\n - 与历史最大值比较,更新 `ans`\n\n5. **维护窗口状态**:将当前字符加入 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 并增加其计数\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n let l = 0, map = new Map(),n = s.length,ans = 0;\n for(let i = 0;i < n;i++){\n let c = s[i]\n while(map.has(c)){\n map.set(s[l],map.get(s[l]) - 1);\n if(map.get(s[l]) === 0) map.delete(s[l]);\n l++;\n }\n // console.log(l,i,s.slice(l,i + 1));\n ans = Math.max(i - l + 1,ans);\n map.set(c,(map.get(c) || 0 ) + 1)\n }\n return ans;\n};\n```\n\n\n## 复杂度分析\n- **时间复杂度**: O(n),其中 n 是字符串长度,每个字符最多被访问两次\n- **空间复杂度**: O(min(m,n)),其中 m 是字符集大小","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3157255368","body":"## 思路\n\n### 1. 建立单词频次映射\n```javascript\nlet map = new Map();\nwords.forEach((word,i)=>{\n map.set(word,(map.get(word) || 0) + 1);\n});\n```\n\n- 使用 `Map` 统计 `words` 数组中每个单词的出现次数\n- 处理 `words` 中可能存在重复单词的情况\n\n### 2. 初始化参数\n```javascript\nlet n = s.length,m = words.length,k = words[0].length,l = k * m;\n```\n\n- [n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6): 字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- `m`: 单词数组的长度\n- `k`: 每个单词的长度(题目保证所有单词等长)\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31): 所有单词连接后的总长度\n\n### 3. 遍历可能的起始位置\n```javascript\nfor(let i = 0;i <= n - l;i++){}\n```\n\n- 只需检查到 `n - l` 位置,因为更后面不可能容纳完整的连接串\n\n### 4. 检查每个窗口\n```javascript\nlet j = i,result = new Map(),total = 0;\nwhile(j < i + l){\n let c = s.slice(j,j + k);\n if(map.has(c) === false) break;\n let found = false;\n result.set(c,(result.get(c) || 0) + 1);\n if(result.get(c) <= map.get(c)) found = true;\n if(found === false) break;\n j += k;\n total++;\n}\n```\n\n- 从位置 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 开始,每次取长度为 `k` 的子串进行匹配\n- 使用 `result` 记录当前窗口中各单词的出现次数\n- 如果遇到不在 `words` 中的单词或某个单词出现次数超过要求,则提前终止\n- `total` 记录成功匹配的单词数\n\n### 5. 判断结果\n```javascript\nif(total === m) ans.push(i);\n```\n\n- 当成功匹配的单词数等于 `words` 长度时,说明找到了一个有效子串\n\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n let map = new Map();\n words.forEach((word,i)=>{\n map.set(word,(map.get(word) || 0) + 1);\n });\n let n = s.length,m = words.length,k = words[0].length,l = k * m;\n if(n < l) return [];\n let ans = [];\n for(let i = 0;i <= n - l;i++){\n let j = i,result = new Map(),total = 0;\n while(j < i + l){\n // console.log('check',s.slice(i,i + m * k));\n let c = s.slice(j,j + k);\n if(map.has(c) === false) break;\n let found = false;\n result.set(c,(result.get(c) || 0) + 1);\n if(result.get(c) <= map.get(c)) found = true;\n if(found === false) break;\n j += k;\n total++;\n }\n if(total === m) ans.push(i); \n }\n return ans;\n};\n```\n## 复杂度分析\n### 时间复杂度\n- 外层循环: O(n - l)\n- 内层循环: O(m)\n- 总体复杂度: O((n - l) × m)\n### 空间复杂度\nO(n):存储单词频次映射和结果数组\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162347437","body":"## 思路\n\n使用前缀和 + 哈希表的方法,基于以下数学原理:\n\n1. 如果总和 `totalSum % p = delta`,我们需要找到一个子数组,其和模 `p` 也等于 `delta`\n2. 这样删除该子数组后,剩余元素和就能被 `p` 整除\n\n## 代码步骤分析\n\n### 1. 前缀和计算\n```javascript\nlet n = nums.length, sum = new Array(n + 1).fill(0);\nfor(let i = 0; i < n; i++) sum[i + 1] = sum[i] + nums[i];\n```\n\n- 构建前缀和数组 `sum`,其中 `sum[i]` 表示前 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 个元素的和\n- `sum[0] = 0`,`sum[i] = nums[0] + nums[1] + ... + nums[i-1]`\n\n### 2. 计算目标余数\n```javascript\nlet delta = sum[n] % p;\nif(delta === 0) return 0;\n```\n\n- `sum[n]` 是所有元素的总和\n- `delta` 是总和对 `p` 的余数\n- 如果 `delta` 为 0,说明总和已能被 `p` 整除,返回 0\n\n### 3. 寻找最短子数组\n```javascript\nlet ans = Infinity;\nlet map = new Map();\nfor(let i = 0; i <= n; i++){\n let b = sum[i], a = (b % p - delta % p + p) % p;\n map.set(b % p, i);\n if(map.has(a)) ans = Math.min(ans, i - map.get(a));\n}\n```\n\n\n关键数学关系:\n- 对于子数组 `nums[j...i-1]`,其和为 `sum[i] - sum[j]`\n- 我们希望 `(sum[i] - sum[j]) % p = delta`\n- 即 `sum[i] % p = (sum[j] + delta) % p`\n- 变形得:`sum[j] % p = (sum[i] % p - delta) % p`\n\n具体实现:\n- `b = sum[i]`:当前前缀和\n- `a = (b % p - delta % p + p) % p`:需要找到的前缀和余数\n- 用 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 记录每个余数值最后一次出现的位置\n- 如果找到对应的余数 [a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27),则更新最短长度\n\n### 4. 返回结果\n```javascript\nreturn ans === n ? -1 : ans;\n```\n\n- 如果最短长度等于数组长度,说明需要删除整个数组,返回 -1\n- 否则返回找到的最短子数组长度\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar minSubarray = function(nums, p) {\n let n = nums.length,sum = new Array(n + 1).fill(0);\n for(let i = 0;i < n;i++) sum[i + 1] = sum[i] + (nums[i]);\n // p = BigInt(p);\n let delta = sum[n] % p;\n if(delta === 0) return 0;\n let ans = Infinity;\n let map = new Map();\n for(let i = 0;i <= n;i++){\n let b = sum[i],a = (b % p - delta % p + p) % p;\n map.set(b % p,i);\n if(map.has(a)) ans = Math.min(ans,i - map.get(a));\n }\n return ans === n ? -1 : ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),只需遍历一次数组\n- 空间复杂度:O(n),用于存储前缀和数组和哈希表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166424389","body":"\n## 思路\n使用了经典的**快慢指针**(龟兔赛跑)算法。\n\n1. **双指针技巧**:\n - `slow` 指针每次移动一步\n - `fast` 指针每次移动两步\n - 当 `fast` 到达链表末尾时,`slow` 正好在中间位置\n\n## 代码执行流程\n\n- **初始化**:两个指针 `slow` 和 `fast` 都指向链表头节点 [head](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题02.04.分割链表\\main.js#L50-L50)\n- **循环条件**:`while (fast && fast.next)` 确保 `fast` 可以安全地移动两步\n- **指针移动**:\n - `fast` 连续移动两步:`fast = fast.next; fast = fast.next;`\n - `slow` 移动一步:`slow = slow.next;`\n- **返回结果**:当循环结束时,`slow` 指向中间节点\n\n## 处理奇偶数节点的情况\n\n- **奇数个节点**:返回正中间的节点\n- **偶数个节点**:返回第二个中间节点(如链表有4个节点,则返回第3个节点)\n\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n let slow = head,fast = head;\n while(fast && fast.next){\n fast = fast.next;\n fast = fast.next;\n slow = slow.next;\n }\n return slow;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是链表的节点数。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169628215","body":"## 思路\n\n1. 使用双指针技术:\n - [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 指针(慢指针):指向不重复序列的最后一个元素位置\n - [i](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题08.07.无重复字符串的排列组合/main.js#L9-L22) 指针(快指针):用于遍历整个数组\n\n2. 初始化:\n - [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 从 0 开始,表示第一个元素肯定是要保留的\n - [i](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题08.07.无重复字符串的排列组合/main.js#L9-L22) 从 1 开始遍历\n\n3. 核心逻辑:\n - 当 `nums[i] > nums[r]` 时,说明找到了一个新的不重复元素\n - 此时将 [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 向前移动一位,并将 `nums[i]` 与 `nums[r]` 交换\n - 由于数组是排序的,所以只需要比较大小就能判断是否是新元素\n\n4. 返回值:\n - 返回 [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) + 1,即不重复元素的个数\n\n### 示例演示:\n\n假设数组为 [0, 0, 1, 1, 2, 2]:\n\n1. 初始:r = 0, i = 1,nums[1] = 0, nums[0] = 0,不满足 `nums[i] > nums[r]`\n2. i = 2,nums[2] = 1, nums[0] = 0,满足 `nums[2] > nums[0]`,r 变为 1,交换 nums[2] 和 nums[1]\n - 数组变为 [0, 1, 0, 1, 2, 2],r = 1\n3. i = 3,nums[3] = 1, nums[1] = 1,不满足 `nums[i] > nums[r]`\n4. i = 4,nums[4] = 2, nums[1] = 1,满足 `nums[4] > nums[1]`,r 变为 2,交换 nums[4] 和 nums[2]\n - 数组变为 [0, 1, 2, 1, 0, 2],r = 2\n5. i = 5,nums[5] = 2, nums[2] = 2,不满足 `nums[i] > nums[r]`\n6. 结束,返回 r + 1 = 3\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n let n = nums.length,r = 0;\n for(let i = 1;i < n;i++){\n if(nums[i] > nums[r]) {\n r++;\n swap(i,r);\n }\n //console.log(nums);\n }\n return r + 1;\n // ------------------------\n function swap(i,j){\n [nums[i],nums[j]] = [nums[j],nums[i]]\n }\n};\n```\n\n### 复杂度分析:\n\n- 时间复杂度:O(n),只需要遍历一次数组\n- 空间复杂度:O(1),只使用了常数级别的额外空间\n- 利用了数组已经排序的特性,通过比较大小判断是否重复\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172297646","body":"## 思路\n经典的二分查找算法,用于在有序数组中找到目标值的插入位置\n1. **初始化变量**:\n - `n`:数组长度\n - `l`:左边界,初始为0\n - `r`:右边界,初始为n-1\n - `ans`:结果位置,初始为n(表示插入到数组末尾)\n\n2. **二分查找逻辑**:\n - 使用标准二分查找模板,当`l <= r`时继续查找\n - `mid = (l + r) >> 1`:计算中间位置(相当于除以2取整)\n - 关键判断:`if(nums[mid] >= target)`\n - 如果中间元素大于等于目标值,说明目标值应该在左半部分(包括mid位置)\n - 更新`ans = mid`,并将右边界移动到`mid - 1`\n - 否则,目标值在右半部分,将左边界移动到`mid + 1`\n\n3. **返回结果**:\n - 返回找到的插入位置`ans`\n\n### 特殊情况处理\n\n- 如果target小于所有元素,ans保持为0(正确位置)\n- 如果target大于所有元素,ans保持为n(数组长度,正确位置)\n- 如果target等于某个元素,ans为该元素的索引\n- 如果target介于两个元素之间,ans为较大元素的位置\n\n这个实现非常优雅,通过一个变量ans记录可能的答案,避免了在循环外再进行额外判断,使得代码简洁且易于理解。\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let n = nums.length;\n let l = 0, r = n - 1,ans = n;\n while(l <= r){\n let mid = (l + r) >> 1;\n if(nums[mid] >= target){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n};\n```\n\n### 复杂度分析\n\n1. **时间复杂度**:O(log n),典型的二分查找时间复杂度\n2. **空间复杂度**:O(1),只使用了常数级别的额外空间\n3. **核心思想**:寻找第一个大于等于target的元素位置","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173065451","body":"## 思路\n\n这段代码使用**单调队列**(双端队列)来解决滑动窗口最大值问题,时间复杂度为 O(n)。\n\n### 实现步骤\n\n1. **数据结构选择**\n - 使用 `q` 数组作为双端队列,存储数组元素的**索引**\n - 队列中保持索引对应的值**单调递减**的特性\n\n2. **维护单调性**\n ```javascript\n while(q.length && back() < nums[i]) q.pop();\n q.push(i);\n ```\n\n - 在每次添加新元素前,移除队尾所有小于当前元素的索引\n - 这样保证队首始终是当前窗口的最大值索引\n\n3. **窗口处理**\n ```javascript\n if(i >= k - 1){\n ans.push(nums[q[0]]); // 队首即为窗口最大值\n if(i - q[0] + 1 === k) q.shift(); // 移除窗口外的元素\n }\n ```\n\n - 当达到窗口大小时开始记录结果\n - 及时移除超出窗口范围的索引\n\n### 关键技巧\n\n- 存储索引而非值,便于判断元素是否在窗口范围内\n- 利用单调性快速获取窗口最大值(队首元素)\n- 通过索引差值判断元素是否需要移出窗口\n\n### 缺陷\n在javascript中,使用数组模拟双端队列,队首出队、入队的时间复杂度均为O(n),性能较差,可以考虑手动实现一个双端队列,例如使用双向链表,优化性能。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar maxSlidingWindow = function(nums, k) {\n let q = [],n = nums.length;\n let ans = [];\n for(let i = 0;i < n;i++){\n while(q.length && back() < nums[i]) q.pop();\n q.push(i);\n if(i >= k - 1){\n ans.push(nums[q[0]]);\n if(i - q[0] + 1 === k) q.shift();\n }\n }\n return ans;\n // ------------------------\n function back(){\n return nums[q[q.length - 1]];\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是数组的长度。单调队列的维护时间复杂度为 O(n),窗口处理时间复杂度为 O(n),因此总时间复杂度为 O(n)。\n- 空间复杂度:O(n),单调队列最多存储 n 个元素,因此空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3177500710","body":"## 思路\n\n### 1. 数据结构设计\n- 使用两个数组 `ind` 和 `outd` 分别记录每个人的入度和出度\n- 数组长度为 `n+1` 是为了方便使用1到n的索引对应人编号\n\n### 2. 统计过程\n```javascript\nfor(let [a,b] of trust){\n outd[a]++; // a相信别人,出度+1\n ind[b]++; // b被别人相信,入度+1\n}\n```\n\n- 遍历信任关系数组,统计每个人的入度和出度\n\n### 3. 法官判断\n```javascript\nfor(let i = 1;i <= n;i++){\n if(outd[i] === 0 && ind[i] === n - 1) return i;\n}\n```\n\n- 遍历所有人,寻找满足条件的人:\n - `outd[i] === 0`:不相信任何人\n - `ind[i] === n - 1`:被其他所有人相信\n\n这是典型的图论中利用入度出度解决问题的方法。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n let ind = new Array(n + 1).fill(0),// 入度\n outd = new Array(n + 1).fill(0);// 出度\n for(let [a,b] of trust){\n outd[a]++;\n ind[b]++;\n }\n for(let i = 1;i <= n;i++){\n if(outd[i] === 0 && ind[i] === n - 1) return i;\n }\n return -1;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(T + N),其中T是信任关系数,N是人数\n- 空间复杂度:O(N),用于存储入度和出度数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182022991","body":"## 思路\n\n### 1. 图的构建\n- 使用邻接表`g`存储不喜欢关系\n- 对于每一对`[a,b]`,在[a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27)的邻接表中添加`b`,在`b`的邻接表中添加[a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27)\n- 这样构建出一个无向图,表示不喜欢关系\n\n### 2. 二分图判断\n- 使用染色法判断是否为二分图\n- `color`数组记录每个节点的颜色状态:\n - `0`表示未染色\n - `1`表示第一组\n - `2`表示第二组\n\n### 3. DFS遍历\n- 遍历所有节点,对未染色节点开始DFS\n- [f(i, val)](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)函数:\n - 将节点[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)染成颜色[val](file://E:\\其他项目\\algorithm_exercises\\libs\\LinkedList.js#L34-L34)\n - 遍历[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)的所有邻居节点`j`\n - 如果邻居`j`已有颜色且与[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)相同,返回`false`\n - 如果邻居`j`未染色,递归将其染成相反颜色\n - 所有情况满足则返回`true`\n\n### 4. 核心逻辑\n- 主函数中遍历所有节点,对未染色节点调用[f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)函数\n- 如果任何一次调用返回`false`,说明无法二分,返回`false`\n- 全部成功则返回`true`\n\n这是典型的二分图判定问题,通过图的遍历和染色来解决。\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nvar possibleBipartition = function(n, dislikes) {\n let g = new Array(n + 1).fill(0).map(()=>[]);\n for(let [a,b] of dislikes){\n g[a].push(b);\n g[b].push(a);\n }\n let color = new Array(n + 1).fill(0);\n for(let i = 1;i <= n;i++){\n if(color[i] === 0 && !f(i,1)) return false;\n }\n return true;\n\n // ------------------------\n function f(i,val){\n color[i] = val;\n for(let j of g[i]){\n if(color[j] && color[j] === val) return false;\n if(!color[j] && !f(j,val === 1 ? 2 : 1)) return false; \n }\n return true;\n }\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n + dislikes.length) - 线性时间复杂度\n- 空间复杂度:O(n + dislikes.length) - 主要用于存储图结构和递归栈","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186678361","body":"## 主要思路\n\n### 1. 预处理阶段\n- **处理未分配项目**:将 `group[i] === -1` 的项目分配给新的虚拟组\n- **构建组内项目映射**:建立 `groupItems` 数组,记录每个组包含的项目\n\n### 2. 构建依赖图\n- **项目依赖图** (`itemG`):记录项目间的依赖关系\n- **小组依赖图** (`groupG`):记录小组间的依赖关系\n- **计算入度**:\n - `inID`:每个项目的入度\n - `inGD`:每个小组的入度\n\n### 3. 双层拓扑排序\n- **组间拓扑排序**:先对小组进行拓扑排序\n- **组内拓扑排序**:对每个小组内的项目进行拓扑排序\n\n## 关键函数分析\n\n### 主函数流程\n```javascript\n// 初始化和构建图结构\n// ...\n\n// 组间拓扑排序\nfor(let i = 0;i <= m;i++){\n if(inGD[i] === 0) qG.enqueue(i);\n}\nwhile(qG.size()){\n let i = qG.dequeue();\n getItemsFromGroup(i); // 处理组内项目\n // 更新小组依赖\n}\n```\n\n\n### 组内拓扑排序函数 `getItemsFromGroup`\n```javascript\nfunction getItemsFromGroup(g){\n // 对特定组内的项目进行拓扑排序\n // 只处理组内依赖关系\n}\n```\n\n## 核心思想\n采用**分层拓扑排序**策略:\n1. 先确保小组间的依赖关系满足\n2. 再确保每个小组内部的项目依赖关系满足\n3. 通过双层 BFS 实现完整的排序逻辑\n\n这种解法有效地将复杂的依赖关系分解为两个相对简单的拓扑排序问题。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n for(let i = 0;i < n;i++){\n if(group[i] === -1) group[i] = m++;\n }\n\n let groupItems = new Array(m).fill(0).map(()=>[]);\n for(let i = 0;i < n;i++){\n groupItems[group[i]].push(i);\n }\n\n\n\n let itemG = new Array(n).fill(0).map(()=>[]);// 项目依赖关系建图\n let groupG = new Array(m).fill(0).map(()=>new Set());// 小组依赖关系建图\n let inID = new Array(n).fill(0);//每个项目的入度\n let inGD = new Array(m).fill(0);//每个小组的入度\n beforeItems.forEach((prevs,curr)=>{\n inID[curr] += prevs.length;\n for(let prev of prevs) {\n itemG[prev].push(curr);\n let u = group[prev],v = group[curr];\n if(u === v) continue;\n if(groupG[u].has(v)) continue;\n groupG[u].add(v);\n inGD[v]++;\n }\n });\n\n //console.log('小组依赖',groupG,groupItems);\n\n let ans = [],qG = new Queue();\n\n\n for(let i = 0;i <= m;i++){\n if(inGD[i] === 0) qG.enqueue(i);\n }\n while(qG.size()){\n let i = qG.dequeue();\n getItemsFromGroup(i);\n for(let j of groupG[i]){\n inGD[j]--;\n if(inGD[j] === 0) qG.enqueue(j);\n }\n }\n return ans.length === n ? ans : [];\n\n // ---------------------------------\n function getItemsFromGroup(g){\n let items = groupItems[g];\n let qI = new Queue();\n for(let i of items){\n if(inID[i] === 0) qI.enqueue(i);\n }\n while(qI.size()){\n let i = qI.dequeue();\n ans.push(i);\n for(let j of itemG[i]){\n inID[j]--;\n if(inID[j] === 0 && group[j] === g) qI.enqueue(j);\n }\n }\n }\n\n };\n```\n## 复杂度分析\n- **时间复杂度**:O(n + m + |beforeItems|) - 每个项目和依赖关系只被处理一次\n- **空间复杂度**:O(n + m) - 存储图结构和队列","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190382685","body":"## 思路\n没啥好说的,模拟就完了\n## 代码\n```javascript\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let x = 0,y = 0;\n for(let move of moves){\n if(move === 'U') x--;\n else if(move === 'D') x++;\n else if(move === 'L') y--;\n else y++;\n } \n return x === 0 && y === 0\n};\n```\n## 复杂度分析\n- 时间复杂度O(n)\n- 空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193453621","body":"## 思路\n\n### 主要步骤:\n\n1. **数据预处理**:\n - 将原始任务数组 [enqueueTime, processingTime] 扩展为 [enqueueTime, processingTime, index],保留原始索引信息\n - 按照入队时间(enqueueTime)对任务进行排序\n\n2. **使用优先队列**:\n - 创建一个优先队列,排序规则是:\n - 首先按处理时间(processingTime)升序排列\n - 如果处理时间相同,则按下标(index)升序排列\n\n3. **任务处理逻辑**:\n - 初始化结果数组和当前时间点(end)\n - 当还有未处理任务或优先队列不为空时:\n - 如果优先队列为空,将当前时间点更新为下一个任务的入队时间\n - 将所有在当前时间点之前或刚好到达的未处理任务加入优先队列\n - 从优先队列中取出优先级最高的任务执行\n - 更新当前时间点(加上该任务的处理时间)\n - 将该任务的原始索引加入结果数组\n\n### 关键点解释:\n\n- **优先队列的作用**:确保在可执行的任务中,总是选择处理时间最短的任务执行(最短作业优先调度算法)\n- **时间管理**:通过 [end] 变量追踪当前时间点,确保任务按时间顺序被考虑\n- **边界处理**:当优先队列为空时,直接跳转到下一个任务的入队时间,避免不必要的循环\n\n## 代码\n```javascript\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n let data = [],n = tasks.length;\n // 按任务入队时间排序,同时不丢失下标信息。\n tasks.forEach((v,i)=>data.push([...v,i])); \n data.sort((a,b)=>a[0] - b[0]);\n // 优先队列,优先级为:先按任务时长,再按下标\n let i = 0,q = new PriorityQueue((a,b)=>{\n if(a[1] !== b[1]) return a[1] - b[1];\n return a[2] - b[2];\n });\n\n let ans = [],end = 0;\n while(i < n || q.size()){\n if(q.size() === 0) end = Math.max(end,data[i][0]);\n while(i < n && data[i][0] <= end) q.enqueue(data[i++]);\n let [_,p,index] = q.dequeue();\n ans.push(index);\n end += p;\n }\n return ans;\n};\n```\n\n## 复杂度分析\n### 时间复杂度:\n- 排序:O(n log n)\n- 优先队列操作:每个任务最多入队和出队一次,每次操作 O(log n)\n- 总体复杂度:O(n log n)\n### 空间复杂度:\n- 需要一个优先队列及一个数组保存数据,空间复杂度为 O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194152066","body":"## 思路\n\n### 主要函数功能\n\n1. [numberOfRounds](file:///E:/力扣刷题/algorithm_exercises/.md#L4-L13) - 主函数,计算从登录到登出之间的完整游戏回合数\n2. [parseTime](file:///E:/力扣刷题/algorithm_exercises/.md#L16-L18) - 辅助函数,将时间字符串解析为小时和分钟\n3. [calc](file:///E:/力扣刷题/algorithm_exercises/.md#L20-L37) - 核心计算函数,计算两个时间之间的回合数\n\n### 解题思路\n\n1. **时间解析**:首先将登录时间和登出时间解析为小时和分钟的数组\n2. **跨天处理**:如果登出时间早于登录时间,说明跨越了午夜,需要在登出时间上加24小时\n3. **回合计算**:\n - 将登录时间向上取整到最近的15分钟倍数(下一回合开始时间)\n - 计算登出时间和登录时间之间的15分钟间隔数\n - 如果结果为负数,则返回0\n\n### 代码细节\n\n```javascript\n// 时间取整逻辑\nif(m1 <= 0) m1 = 0;\nelse if(m1 <= 15) m1 = 15;\nelse if(m1 <= 30) m1 = 30;\nelse if(m1 <= 45) m1 = 45;\nelse {\n m1 = 0;\n h1++;\n}\n```\n\n这个逻辑将登录时间向上取整到下一个回合开始时间(每15分钟为一个回合)。\n\n```javascript\nlet ans = Math.floor((h2 * 60 + m2 - (h1 * 60 + m1)) / 15);\n```\n这行代码计算两个时间点之间有多少个完整的15分钟时间段。\n\n## 代码\n```javascript\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n let [h1,m1] = parseTime(loginTime),[h2,m2] = parseTime(logoutTime);\n if(h1 < h2 || h1 === h2 && m1 < m2) return calc(h1,m1,h2,m2);\n return calc(h1,m1,h2 + 24,m2);\n // -------------------------\n function parseTime(time){\n return time.split(':').map(v=>Number(v));\n }\n\n function calc(h1,m1,h2,m2){\n if(m1 <= 0) m1 = 0;\n else if(m1 <= 15) m1 = 15;\n else if(m1 <= 30) m1 = 30;\n else if(m1 <= 45) m1 = 45;\n else {\n m1 = 0;\n h1++;\n }\n // console.log(h1,m1,h2,m2)\n let ans = Math.floor((h2 * 60 + m2 - (h1 * 60 + m1)) / 15);\n if(ans < 0) return 0;\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(1),因为解析时间和计算都是常数时间操作。\n- 空间复杂度:O(1),因为只使用了常数个变量。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3195140726","body":"## 思路\n\n### 主函数 `minCharacters`\n- 通过比较三种情况的最小值来得到最终答案:\n - `altb(a,b)`: 使 a 中所有字符 < b 中所有字符需要的操作数\n - `altb(b,a)`: 使 b 中所有字符 < a 中所有字符需要的操作数\n - `aeqb(a,b)`: 使两个字符串都由同一字符组成需要的操作数\n\n### 辅助函数分析\n\n1. **`altb(a,b)` 函数**\n - 遍历分割点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) (1-25,对应字符 'b'-'z')\n - 计算需要修改的字符数:\n - [a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27) 中所有 ≥ i 的字符都需要修改\n - `b` 中所有 < i 的字符都需要修改\n - 返回最小操作数\n\n2. **`aeqb(a,b)` 函数**\n - 统计两个字符串中各字符出现次数\n - 找到出现频率最高的字符\n - 将其他所有字符都修改为该字符即为最少操作数\n\n3. **`getCharValue` 函数**\n - 将字符转换为对应的数值 (a=0, b=1, ..., z=25)\n\n## 代码\n```javascript\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n return Math.min(altb(a,b),altb(b,a),aeqb(a,b));\n // --------------------------------------\n function altb(a,b){\n let ans = Infinity;\n for(let i = 1;i < 26;i++){\n let temp = 0;\n for(let c of a) if(getCharValue(c) >= i) temp++;\n for(let c of b) if(getCharValue(c) < i) temp++;\n ans = Math.min(ans,temp);\n }\n return ans;\n }\n\n function aeqb(a,b){\n let data = new Array(26).fill(0);\n for(let c of a) data[getCharValue(c)]++;\n for(let c of b) data[getCharValue(c)]++;\n let max = data.reduce((a,b)=>Math.max(a,b),0);\n return a.length + b.length - max;\n }\n\nfunction getCharValue(char){\n return char.charCodeAt(0) - 'a'.charCodeAt(0);\n }\n};\n```\n\n\n## 复杂度分析\n- 时间复杂度:O((m+n)×26) = O(m+n),其中 m 和 n 分别是字符串 a 和 b 的长度\n- 空间复杂度:O(1),只使用了固定大小的额外空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199063845","body":"## 思路\n使用**三路快排(Three-way QuickSort)**的实现,主要通过以下步骤完成排序:\n1. **选择基准值(pivot)**:使用 `viot` 函数选择一个合适的基准值\n2. **分区操作(partition)**:将数组分为三部分:小于基准值、等于基准值、大于基准值\n3. **递归排序**:对小于和大于基准值的两个子数组递归进行快排\n\n## 关键函数分析\n\n### 1. 主排序函数 `quickSort`\n```javascript\nfunction quickSort(l,r){\n if(l >= r) return;\n let i = viot(l,r); // 选择基准值位置\n if(r - l === 1) return;\n if(i !== l) swap(i,l); // 将基准值移到最左边\n let [low,up] = partition(l,r); // 三路分区\n quickSort(l,low - 1); // 递归排序小于基准值的部分\n quickSort(up + 1,r); // 递归排序大于基准值的部分\n}\n```\n\n\n### 2. 基准值选择 `viot`\n```javascript\nfunction viot(l,r){\n // 选择左、中、右三个元素作为候选\n let a = nums[l], c = nums[r];\n let mid = (l + r) >> 1, b = nums[mid];\n \n // 通过比较这三个值选择一个较优的基准值位置\n // 实现了三数取中法的思想\n}\n```\n\n\n### 3. 三路分区 [partition](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题02.04.分割链表\\main.js#L15-L48)\n```javascript\nfunction partition(i,j){\n let viot = nums[i], l = i - 1, r = j + 1;\n for(let k = i; k < r; k++){\n let c = nums[k];\n if(c > viot){\n r--;\n swap(k,r);\n k--; // 交换后需要重新检查当前位置\n }else if(c < viot){\n l++;\n swap(k,l);\n }\n // c === viot 时,元素保持在中间区域\n }\n return [l + 1, r - 1]; // 返回等于基准值的区间边界\n}\n```\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function(nums) {\n quickSort(0,nums.length - 1);\n return nums;\n // -------------------------\n function quickSort(l,r){\n if(l >= r) return;\n // console.log(l,r,nums);\n // 找基准值位置\n let i = viot(l,r);\n if(r - l === 1) return;\n if(i !== l) swap(i,l);\n // console.log('viot',nums[l]);\n let [low,up] = partition(l,r);\n // console.log(mid,nums);\n quickSort(l,low - 1);\n quickSort(up + 1,r);\n }\n\n function partition(i,j){\n let viot = nums[i],l = i - 1,r = j + 1;\n for(let k = i;k < r;k++){\n let c = nums[k];\n if(c > viot){\n r--;\n swap(k,r);\n k--;\n }else if(c < viot){\n l++;\n swap(k,l);\n }\n }\n return [l + 1,r - 1];\n }\n\n function viot(l,r){\n let a = nums[l],c = nums[r];\n if(a > c){\n swap(l,r);\n a = nums[l];\n c = nums[r];\n }\n if(r - l === 1) return;\n let mid = (l + r) >> 1,b = nums[mid];\n // if(a === c && a === b) return l;\n if(a === c) return a < b ? l : mid;\n if(b === a || b === c) return l;\n else if(b < a) return l;\n else if(b > a && b < c) return mid;\n return r;\n }\n\n function swap(l,r){\n [nums[l],nums[r]] = [nums[r],nums[l]];\n }\n };\n```\n\n## 复杂度分析\n- **三路快排**:能够很好地处理有重复元素的数组,将相等元素聚集在一起\n- **优化的基准值选择**:使用三数取中法减少最坏情况的发生\n- **原地排序**:不需要额外的存储空间\n- **时间复杂度**:平均 O(n log n),最坏 O(n²)\n- **空间复杂度**:O(log n)(递归调用栈)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204104013","body":"## 思路\n\n### 2. 初始化变量\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31):二分查找的左边界,初始值为 `0`。\n- `r`:二分查找的右边界,初始值为 `x`。\n- `ans`:用于记录当前找到的满足条件的最大整数平方根,初始值为 `0`。\n\n### 3. 二分查找过程\n- 循环条件为 `l <= r`,表示在左边界小于等于右边界时继续查找。\n- 计算中间值 `mid`:\n ```javascript\n let mid = l + ((r - l) >> 1);\n ```\n\n 这里使用了位运算 `>> 1` 来代替除以 `2` 的操作,目的是提高计算效率。\n- 判断逻辑:\n - 如果 `mid * mid <= x`,说明 `mid` 可能是答案,但还可能有更大的值满足条件,因此更新 `ans = mid` 并将左边界右移:`l = mid + 1`。\n - 否则,说明 `mid` 太大,需要将右边界左移:`r = mid - 1`。\n\n### 4. 返回结果\n- 最终返回 `ans`,即找到的满足条件的最大整数平方根。\n\n\n## 代码\n```javascript\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n let l = 0,r = x,ans = 0;\n while(l <= r){\n let mid = l + ((r - l) >> 1);\n if(mid * mid <= x){\n ans = mid\n l = mid + 1;\n }else{\n r = mid - 1;\n }\n }\n return ans;\n};\n```\n### 复杂度分析\n- 时间复杂度为 `O(log x)`,因为采用了二分查找策略。\n- 空间复杂度为 `O(1)`,只使用了常数级别的额外空间。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208885502","body":"## 思路\n\n### 1. 二分查找策略\n- 使用 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31) 和 `r` 维护搜索区间 `[1, n]`\n- 通过 `mid = l + ((r - l) >> 1)` 计算中点,避免整数溢出\n- 根据 `isBadVersion(mid)` 的结果调整搜索区间\n\n### 2. 搜索逻辑\n- 如果 `isBadVersion(mid)` 返回 `true`(当前版本是错误的):\n - 记录当前版本为候选答案 `ans = mid`\n - 在左半区间继续搜索 `r = mid - 1`\n- 如果返回 `false`(当前版本是正确的):\n - 在右半区间继续搜索 `l = mid + 1`\n\n\n\n## 代码\n```javascript\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let l = 1,r = n,ans = 1;\n while(l <= r){\n let mid = l + ((r - l) >> 1);\n if(isBadVersion(mid)){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n };\n};\n```\n## 复杂度分析\n- 时间复杂度:O(log n)\n- 空间复杂度:O(1)\n- 通过不断缩小区间范围,最终找到第一个错误版本","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3213065724","body":"## 思路\n\n1. **归并排序框架**:使用分治思想,将数组不断二分,递归处理左右两部分\n2. **关键逻辑**:在合并两个有序数组时,统计满足 `nums[i] > 2 * nums[j]` 条件的翻转对数量\n\n## 代码结构分析\n\n### 主函数 `reversePairs`\n- 初始化变量和临时数组\n- 调用 `sort` 函数进行归并排序\n- 返回统计结果 `ans`\n\n### 排序函数 `sort`\n- 标准的归并排序递归结构\n- 将数组 `[l, r]` 分为 `[l, mid]` 和 `[mid+1, r]` 两部分\n- 递归排序后调用 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 合并\n\n### 合并函数 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37)\n包含两个主要步骤:\n\n1. **统计翻转对**:\n ```javascript\n if(nums[i] / 2 > nums[j]){\n ans += mid - i + 1;\n j++;\n }else i++;\n ```\n\n - 利用左右两部分已排序的特性\n - 当 `nums[i] > 2 * nums[j]` 时,说明从 `i` 到 `mid` 的所有元素都与 `nums[j]` 构成翻转对\n\n2. **标准归并**:\n - 将两个有序数组合并为一个有序数组\n - 使用 `temp` 数组作为临时存储\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n let n = nums.length,ans = 0;\n let temp = new Array(n);\n sort(0,n - 1);\n return ans;\n // -----------------------\n function sort(l,r){\n if(l >= r) return;\n let mid = (l + r) >> 1;\n sort(l,mid);\n sort(mid + 1,r);\n merge(l,r,mid);\n }\n\n function merge(left,right,mid){\n let i = left,j = mid + 1,p = left;\n while(i <= mid && j <= right){\n if(nums[i] / 2 > nums[j]){\n ans += mid - i + 1;\n j++;\n }else i++;\n }\n\n i = left;\n j = mid + 1;\n while(i <= mid || j <= right){\n if(j > right || i <= mid && nums[i] < nums[j]) temp[p++] = nums[i++];\n else temp[p++] = nums[j++];\n }\n\n for(let i = left;i <= right;i++) nums[i] = temp[i];\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n)\n- 空间复杂度:O(n)\n- 利用归并排序过程中数组局部有序的特性,高效统计翻转对\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216251902","body":"\n## 思路\n\n1. **排序处理**:\n - 首先对供暖器数组进行排序,这样便于后续的二分查找操作。\n\n2. **边界处理**:\n - 在供暖器数组的两端分别添加`-Infinity`和`Infinity`,这样可以简化边界条件的处理,避免在查找过程中需要特殊判断边界情况。\n\n3. **核心算法**:\n - 对每个房屋,通过[egt](file:///E:/力扣刷题/algorithm_exercises/91天学算法/day40/.md#L22-L33)函数找到第一个大于等于该房屋位置的供暖器位置\n - 然后比较该房屋与前一个供暖器和后一个供暖器的距离,取较小值作为该房屋所需的最小加热半径\n - 在所有房屋所需的最小加热半径中取最大值,就是能覆盖所有房屋的最小加热半径\n\n4. **二分查找优化**:\n - [egt](file:///E:/力扣刷题/algorithm_exercises/91天学算法/day40/.md#L22-L33)函数使用二分查找来快速定位第一个大于等于目标值的供暖器位置,时间复杂度从O(n)降低到O(log n)\n\n## 具体实现细节\n\n- `heaters[j] - house`表示房屋到右边最近供暖器的距离\n- `house - heaters[i]`表示房屋到左边最近供暖器的距离\n- `Math.min(heaters[j] - house, house - heaters[i])`得到该房屋需要的最小加热半径\n- `Math.max(ans, r)`维护所有房屋中需要的最大加热半径\n\n## 代码\n```javascript\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n const compare = (a,b) => a - b;\n heaters.sort(compare);\n heaters.push(Infinity);\n heaters.unshift(-Infinity);\n let ans = -Infinity;\n for(let house of houses){\n let j = egt(house),i = j - 1;\n r = Math.min(heaters[j] - house,house - heaters[i]);\n ans = Math.max(ans,r);\n }\n return ans;\n // -------------------------\n function egt(target){\n let l = 0,r = heaters.length - 1,ans = r + 1;\n while(l <= r){\n let mid = (l + r) >> 1\n if(heaters[mid] >= target){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(mlogn + nlogn),其中m是房屋数量。排序的时间复杂度为O(nlogn),二分查找的时间复杂度为O(logn),因此总时间复杂度为O(nlogn + mlogn)。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217776735","body":"## 思路\n\n使用了**二分搜索 + 双指针**的方法来解决问题:\n\n### 1. 排序\n```javascript\nnums.sort((a,b) => a - b);\n```\n\n首先对数组进行排序,这样可以方便后续计算距离和使用双指针技巧。\n\n### 2. 二分搜索框架\n```javascript\nlet n = nums.length;\nlet r = nums[n - 1] - nums[0], l = 0, ans = 0;\nwhile(l <= r){\n let mid = (l + r) >> 1;\n let cnt = calc(mid);\n if(cnt >= k){\n ans = mid;\n r = mid - 1;\n } else {\n l = mid + 1;\n }\n}\n```\n\n这里使用二分搜索来查找第k小的距离:\n- 搜索范围是 `[0, max_distance]`,其中 `max_distance = nums[n-1] - nums[0]`\n- 对于每个中间值 `mid`,计算有多少个数对的距离小于等于 `mid`\n- 如果数量大于等于 `k`,说明第k小的距离可能就是 `mid` 或者比 `mid` 更小\n- 如果数量小于 `k`,说明第k小的距离一定比 `mid` 更大\n\n### 3. 计算函数 calc\n```javascript\nfunction calc(mid){\n let l = 0, r = -1, ans = 0;\n while(l < n){\n while(r + 1 < n && nums[r + 1] - nums[l] <= mid) r++;\n if(r >= l) ans += r - l;\n l++;\n }\n return ans\n}\n```\n\n这个函数使用双指针技巧计算有多少个数对的距离小于等于给定值 [mid](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\462\\2.js#L20-L20):\n- 外层循环固定左指针 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\461\\3.js#L34-L34)\n- 内层循环移动右指针 `r`,直到 `nums[r] - nums[l] > mid`\n- 此时对于固定的 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\461\\3.js#L34-L34),有 `r - l` 个数对的距离小于等于 [mid](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\462\\2.js#L20-L20)\n- 累加所有可能的数对数量\n\n\n\n## 举例说明\n\n以 `nums = [1,3,1]`, `k = 1` 为例:\n1. 排序后:`[1,1,3]`\n2. 距离范围:`[0, 2]`\n3. 二分搜索过程:\n - `mid = 1`,计算距离 <= 1 的数对有 1 个(`(1,1)`)\n - 因为 1 >= k(1),所以 `ans = 1`,继续搜索左半部分\n - `mid = 0`,计算距离 <= 0 的数对有 1 个(`(1,1)`)\n - 因为 1 >= k(1),所以 `ans = 0`\n4. 返回结果 0\n\n这个解法非常巧妙地结合了二分搜索和双指针技巧,避免了直接计算所有数对距离的 O(n²) 复杂度。\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a,b) => a - b);\n let n = nums.length;\n let r = nums[n - 1] - nums[0],l = 0,ans = 0;\n while(l <= r){\n let mid = (l + r) >> 1;\n let cnt = calc(mid);\n if(cnt >= k){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n // ----------------------\n function calc(mid){\n let l = 0,r = -1,ans = 0;\n while(l < n){\n while(r + 1 < n && nums[r + 1] - nums[l] <= mid) r++;\n if(r >= l) ans += r - l;\n l++;\n }\n return ans\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n + n log D),其中 n 是数组长度,D 是最大距离\n - 排序需要 O(n log n)\n - 二分搜索需要 log D 次,每次调用 calc 函数需要 O(n)\n- 空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218701829","body":"## 思路\n\n1. **使用优先队列的BFS**:\n - 采用 `MinPriorityQueue` 实现 Dijkstra 算法变体\n - 每个元素存储 `[行, 列, 高度]`,按高度排序\n\n2. **状态表示**:\n - `vis` 数组标记已访问的格子,防止重复访问\n - `ans` 记录到达当前位置所需的最大高度(即所需最低水位)\n\n3. **搜索过程**:\n - 从起点 `(0,0)` 开始,每次选择高度最低的相邻格子\n - 更新所需最低水位为路径上遇到的最大高度\n - 直到到达终点 `(n-1,n-1)`\n\n## 关键步骤\n\n- **初始化**:标记起点已访问,将起点加入优先队列\n- **主循环**:不断取出队列中高度最低的位置\n- **更新答案**:记录路径上的最大高度值\n- **探索邻居**:向四个方向扩展未访问的邻居节点\n- **终止条件**:到达右下角时结束搜索\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n let n = grid.length,vis = new Array(n).fill(0).map(()=>new Array(n).fill(0));\n vis[0][0] = 1;\n const q = new MinPriorityQueue(v=>v[2]);\n q.enqueue([0,0,grid[0][0]]);\n let ans = 0;\n const direction = [[0,1],[1,0],[0,-1],[-1,0]];\n while(q.size()){\n let [i,j,t] = q.dequeue();\n ans = Math.max(ans,t);\n if(i === n - 1 && j === n - 1) break;\n for(let d of direction){\n let x = d[0] + i,y = d[1] + j;\n if(x >= 0 && x < n && y >= 0 && y < n){\n if(vis[x][y]) continue;\n vis[x][y] = 1;\n q.enqueue([x,y,grid[x][y]]);\n }\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n²logn),其中 n 是矩阵的边长。\n- 空间复杂度:O(n²),用于存储 vis 数组和优先队列。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222257413","body":"## 思路\n\n使用**滑动窗口**(Sliding Window)技术来解决这个问题,通过维护一个固定大小为 `k` 的窗口来遍历整个字符串。\n\n## 关键变量说明\n\n- `r`: 右指针,初始化为 -1\n- [n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6): 字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- `ans`: 记录找到的最大元音字母数\n- `total`: 当前窗口内元音字母的总数\n- [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6): 左指针,表示窗口的起始位置\n\n## 算法流程\n\n1. **外层循环**:[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 从 0 到 `n-k`,表示窗口的左边界\n ```javascript\n for(let i = 0; i <= n - k; i++)\n ```\n\n\n2. **扩展窗口**:使用 `while` 循环将右指针 `r` 向右扩展,直到窗口大小达到 `k`\n ```javascript\n while(r + 1 < n && r - i + 1 < k){\n r++;\n if(isYuanYin(s[r])) total++;\n }\n ```\n\n - 条件 `r + 1 < n` 确保不越界\n - 条件 `r - i + 1 < k` 确保窗口大小不超过 `k`\n - 每次扩展时检查新加入的字符是否为元音,并更新 `total`\n\n3. **更新最大值**:比较当前窗口的元音数量与历史最大值\n ```javascript\n ans = Math.max(ans, total);\n ```\n\n\n4. **收缩窗口**:移动左指针前,如果当前左边界字符是元音,则从总数中减去\n ```javascript\n if(isYuanYin(s[i])) total--;\n ```\n\n\n## 辅助函数\n\n```javascript\nfunction isYuanYin(c){\n return ['a','e','i','o','u'].includes(c);\n}\n```\n\n用于判断字符是否为元音字母。\n\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n let r = -1, n = s.length,ans = 0,total = 0;\n for(let i = 0;i <= n - k;i++){\n while(r + 1 < n && r - i + 1 < k){\n r++;\n if(isYuanYin(s[r])) total++;\n }\n ans = Math.max(ans,total);\n if(isYuanYin(s[i])) total--;\n }\n return ans;\n // -------------------------\n function isYuanYin(c){\n return ['a','e','i','o','u'].includes(c);\n }\n };\n```\n## 复杂度分析\n\n- 时间复杂度:O(n),其中 n 是字符串长度,每个字符最多被访问两次\n- 空间复杂度:O(1),只使用了常数额外空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3227100052","body":"## 思路\n\n### 核心技巧\n- 维护一个大小为maxPts的滑动窗口\n- 使用`sum`变量维护当前窗口内所有可能结果的概率和\n- 通过`sum -= r`和`sum += dp[i]`维护窗口滑动\n\n### 1. 边界条件处理\n```javascript\nif(0 >= k) return 0 <= n ? 1 : 0;\n```\n\n- 当目标分数`k`为0或负数时,游戏一开始就结束\n- 如果[n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6)非负,则概率为1,否则为0\n\n### 2. 初始化阶段\n```javascript\nlet sum = 0;\nfor(let i = k;i < k + maxPts;i++){\n if(i <= n) sum += 1;\n}\n```\n\n- 计算从刚好达到`k`分开始,可能到达的最高分数范围`[k, k+maxPts-1]`中满足≤n的数目\n- 这些状态的概率都是1(因为游戏结束)\n\n### 3. 动态规划倒推\n```javascript\nlet j = k + maxPts - 1, r = j <= n ? 1 : 0;\nlet dp = new Array(k).fill(0);\nfor(let i = k - 1;i >= 0;i--){\n dp[i] = sum / maxPts;\n sum -= r;\n sum += dp[i];\n j--;\n if(j >= k) r = j <= n ? 1 : 0;\n else r = dp[j];\n}\n```\n\n\n- 从`k-1`分开始倒推到0分\n- `dp[i]`表示从[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)分开始游戏获胜的概率\n- 状态转移方程:`dp[i] = (dp[i+1] + dp[i+2] + ... + dp[i+maxPts]) / maxPts`\n- 使用滑动窗口优化:维护`sum`为窗口内所有概率之和\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n if(0 >= k) return 0 <= n ? 1 : 0;\n \n let sum = 0;\n for(let i = k;i < k + maxPts;i++){\n if(i <= n) sum += 1;\n }\n let j = k + maxPts - 1, r = j <= n ? 1 : 0;\n let dp = new Array(k).fill(0);\n for(let i = k - 1;i >= 0;i--){\n dp[i] = sum / maxPts;\n sum -= r;\n sum += dp[i];\n j--;\n if(j >= k) r = j <= n ? 1 : 0;\n else r = dp[j];\n }\n return dp[0];\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(k + maxPts),其中k为`k`的取值范围\n- 空间复杂度:O(k)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3231026577","body":"## 思路\n\n1. **滑动窗口 + 字符频次统计**\n - 使用两个长度为26的数组(`pMap` 和 `sMap`)分别统计模式串 `p` 和当前窗口内子串的字符频次\n - 通过滑动窗口在 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 中寻找与 `p` 字符频次完全相同的子串\n\n2. **算法流程**\n - 首先调用 `getPmap()` 统计 `p` 中各字符出现次数\n - 初始化滑动窗口左右边界 `l=0, r=-1`\n - 在每次循环中:\n - 扩展右边界直到窗口大小等于 `p` 的长度\n - 比较当前窗口字符频次与 `p` 的字符频次是否相同\n - 如果相同,则将左边界位置加入结果数组\n - 移动左边界,更新窗口字符频次\n\n## 关键函数说明\n\n- `getPmap()`: 统计模式串 `p` 中每个字符的出现次数\n- `equal(arr1, arr2)`: 比较两个字符频次数组是否完全相同\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nvar findAnagrams = function(s, p) {\n const pMap = new Array(26).fill(0),k = p.length;\n getPmap();\n let ans = []\n let n = s.length,l = 0,r = -1,sMap = new Array(26).fill(0);\n while(l <= n - k){\n while(r + 1 < n && r - l + 1 < k){\n r++;\n let c = s[r]\n sMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;\n }\n if(equal(pMap,sMap)) ans.push(l);\n let c = s[l++];\n sMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]--;\n }\n return ans;\n // --------------------------------------------------------\n function getPmap(){\n for(let c of p){\n pMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;\n }\n }\n function equal(arr1,arr2){\n for(let i = 0;i < 26;i++){\n if(arr1[i] !== arr2[i]) return false;\n }\n return true;\n }\n };\n```\n## 复杂度分析\n\n- 时间复杂度:O(n),其中 n 是字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- 空间复杂度:O(1),只使用了固定大小的数组存储字符频次","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235816649","body":"## 思路\n\n### 核心思想\n- 使用**滑动窗口**技术\n- 维护一个动态窗口 `[l, r]`,通过双指针扩展和收缩窗口\n- 统计窗口内字符频次,确保包含 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中所有字符及其所需数量\n\n### 主要步骤\n\n1. **初始化阶段**\n - `tMap`:统计字符串 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中各字符出现次数\n - `LIMIT`:记录 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中不同字符的数量\n - `sMap`:统计当前窗口中各字符出现次数\n - `total`:记录窗口中已满足数量要求的字符种类数\n\n2. **滑动窗口主循环**\n - 外层循环移动左指针 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31)\n - 内层循环扩展右指针 `r`,直到窗口包含 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的所有字符\n - 当窗口满足条件时,尝试更新最优解\n\n3. **结果更新**\n - 使用 `check` 函数比较当前窗口与历史最优解\n - 选择更短的子串,长度相同时选择字典序更小的\n\n### check函数作用\n用于比较两个子串,选择更优的结果:\n- 优先选择长度更短的子串\n- 长度相同时选择字典序更小的\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nvar minWindow = function(s, t) {\n let tMap = {},ans = '';\n for(let c of t) tMap[c] = (tMap[c] || 0) + 1;\n const LIMIT = Object.keys(tMap).length;\n let n = s.length,l = 0,r = -1,total = 0,sMap = {};\n while(l < n){\n while(r + 1 < n && total < LIMIT){\n r++;\n let c = s[r];\n sMap[c] = (sMap[c] || 0) + 1;\n if(sMap[c] === tMap[c]) total++;\n }\n if(total === LIMIT){\n let tmp = s.slice(l,r + 1);\n if(check(tmp)) ans = tmp;\n }\n let c = s[l];\n if(sMap[c] === tMap[c]) total--;\n sMap[c]--;\n l++;\n }\n return ans;\n // ------------------------\n function check(tmp){\n if(ans === '') return true;\n if(tmp.length < ans.length) return true;\n if(tmp.length > ans.length) return false;\n for(let i = 0;i < tmp.length;i++){\n let a = tmp.charCodeAt(i),b = ans.charCodeAt(i);\n if(a < b) return true;\n if(a === b) continue;\n if(a > b) return false;\n }\n return false;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是字符串 [s](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的长度。\n- 空间复杂度:O(t),其中 t 是字符串 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的字符串种类。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/50#issuecomment-3238889944","body":"## 思路\n\n1. **前缀和与后缀和预处理**:\n - [preSum](file:///E:/力扣刷题/algorithm_exercises/周赛/458/2.js#L10-L10)数组存储从左端开始的前缀和\n - [sufSum](file:///E:/力扣刷题/algorithm_exercises/周赛/458/2.js#L15-L15)数组存储从右端开始的后缀和\n\n2. **核心思想**:\n - 我们需要从两端取k张卡牌,可以是左边取i张,右边取k-i张(i从0到k)\n - 通过预处理的前缀和与后缀和数组,可以快速计算任意数量卡牌的点数和\n\n3. **遍历所有可能的组合**:\n - 遍历i从0到k,表示从左边取i张卡牌\n - 对应从右边取k-i张卡牌\n - 计算总和并更新最大值\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} cardPoints\n * @param {number} k\n * @return {number}\n */\nvar maxScore = function(cardPoints, k) {\n let n = cardPoints.length;\n const preSum = new Array(n + 1).fill(0),sufSum = new Array(n + 1).fill(0);\n for(let i = 0;i < n;i++){\n preSum[i + 1] = preSum[i] + cardPoints[i];\n sufSum[i + 1] = sufSum[i] + cardPoints[n - i - 1];\n }\n let ans = -Infinity;\n for(let i = 0;i <= k;i++){\n ans = Math.max(ans,preSum[i] + sufSum[k - i]);\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(n+k),\n- 空间复杂度是O(n),其中n是数组长度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3239927488","body":"## 代路\n\n采用预计算和枚举的方法来解决问题:\n\n1. **预计算 *<60* 以内每个数字的二进制1的个数**:\n ```javascript\n const CNT = new Array(60).fill(0);\n for(let i = 0;i <= 59;i++){\n let n = i,t = 0;\n while(n){\n if(n & 1) t++;\n n >>= 1;\n }\n CNT[i] = t;\n }\n ```\n\n\n2. **枚举小时和分钟的分配**:\n ```javascript\n for(let i = 0;i <= 4;i++){\n let j = turnedOn - i;\n if(j > 6) continue;\n // ...\n }\n ```\n\n 这里将turnedOn个LED灯分为两部分:i个给小时部分,j个给分钟部分。由于小时最多由4个LED表示,分钟最多由6个LED表示,所以i最多为4,j最多为6。\n\n3. **获取符合条件的小时和分钟**:\n 通过`getHour(cnt)`和`getM(cnt)`函数获取二进制中恰好有cnt个1的小时数和分钟数。\n\n4. **组合时间**:\n 将符合条件的小时和分钟组合成时间字符串,格式为`H:MM`。\n\n## 代码优点\n\n1. **预计算优化**:提前计算所有0-59数字的二进制1的个数,避免重复计算\n2. **分离关注点**:将获取小时和分钟的逻辑分别封装在独立函数中\n3. **合理的边界处理**:考虑到小时(0-11)和分钟(0-59)的范围限制\n4. **正确的格式化**:分钟数始终显示为两位数\n\n\n## 代码\n```javascript\nconst CNT = new Array(60).fill(0);\nfor(let i = 0;i <= 59;i++){\n let n = i,t = 0;\n while(n){\n if(n & 1) t++;\n n >>= 1;\n }\n CNT[i] = t;\n}\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n let ans = []\n for(let i = 0;i <= 4;i++){\n let j = turnedOn - i;\n if(j > 6) continue;\n for(let h of getHour(i)){\n for(let m of getM(j)){\n ans.push(`${h}:${m}`)\n }\n }\n }\n return ans;\n\n // ------------------------------\n function getHour(cnt){\n let ans = [];\n for(let i = 0;i <= 11;i++){\n if(CNT[i] === cnt) ans.push(i);\n }\n return ans\n }\n\n function getM(cnt){\n let ans = [];\n for(let i = 0;i <= 59;i++){\n if(CNT[i] === cnt) ans.push(i < 10 ? '0' + i : i);\n }\n return ans\n }\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(1),因为小时和分钟的范围是固定的(12*60种组合)\n- **空间复杂度**:O(1),只使用了固定大小的额外空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240725656","body":"\n## 思路\n\n### 1. 位运算优化\n- 使用位运算来表示和检查约束条件:\n - `colSet`:记录已被占用的列\n - `pieSet`:记录已被占用的主对角线(撇)\n - `naSet`:记录已被占用的副对角线(捺)\n\n### 2. 对角线编号\n- 主对角线(撇):用 `i + j` 编号\n- 副对角线(捺):用 `i - j + N` 编号(确保非负)\n\n### 3. DFS 回溯过程\n- 逐行放置皇后(第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 行)\n- 对每行的每一列 `j` 检查是否可放置:\n - 通过位运算检查列、主对角线、副对角线是否冲突\n- 若无冲突则放置皇后并更新状态,递归处理下一行\n- 回溯时撤销状态更改\n\n### 4. 位操作技巧\n- `(x >> k) & 1`:检查第 k 位是否为 1\n- `x ^= (1 << k)`:翻转第 k 位(设置或取消占用)\n\n当成功放置完所有 n 行皇后时,返回 1(找到一种方案),最终统计所有可行方案数。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let colSet = 0,N = 2 * n - 1,pieSet = 0,naSet = 0;\n return dfs(0);\n // -------------------\n function dfs(i){\n if(i === n) return 1;\n let ans = 0;\n for(let j = 0;j < n;j++){\n let col = j,pie = i + j,na = (i - j + N) % N;\n if(((colSet >> col) & 1) || ((pieSet >> pie) & 1) ||((naSet >> na) & 1)) continue;\n colSet ^= (1 << col);\n pieSet ^= (1 << pie);\n naSet ^= (1 << na);\n ans += dfs(i + 1);\n colSet ^= (1 << col);\n pieSet ^= (1 << pie);\n naSet ^= (1 << na);\n }\n return ans;\n }\n};\n```\n## 复杂度分析\n- 时间复杂度:O(N!),其中 N 为输入的行数。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243912780","body":"## 思路\n\n1. **初始化**:\n - 获取网格的行数(m)和列数(n)\n - 创建访问标记数组vis,避免重复访问\n - 初始化最大面积ans为0\n\n2. **遍历网格**:\n - 遍历每个格子,如果当前格子是0(海洋)或已被访问,则跳过\n - 否则,从当前位置开始进行BFS搜索整个岛屿\n\n3. **BFS搜索**:\n - 使用队列实现广度优先搜索\n - 从起始点开始,向四个方向扩展\n - 对于每个有效的相邻陆地格子(值为1且未访问),标记为已访问并加入队列\n - 统计当前岛屿的面积\n\n4. **更新结果**:\n - 每次BFS完成后,比较当前岛屿面积和已知最大面积,保留较大值\n\n## 具体实现细节\n\n- 使用Queue数据结构实现BFS\n- 四个方向数组dirs用于简化方向处理\n- vis数组防止重复访问同一格子\n- 边界检查确保不越界\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n let m = grid.length,n = grid[0].length;\n let ans = 0;\n let vis = new Array(m).fill(0).map(()=>new Array(n).fill(0));\n for(let i = 0;i < m;i++){\n for(let j = 0;j = 0 && r < m && c >= 0 && c < n){\n if(grid[r][c] === 0) continue;\n if(vis[r][c]) continue;\n vis[r][c] = 1;\n q.enqueue([r,c]);\n }\n }\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(m×n)\n- 空间复杂度是O(m×n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247579876","body":"## 思路\n\n这是一个典型的多源BFS(广度优先搜索)问题。代码采用逆向思维,不是从海洋格子找最近的陆地,而是从所有陆地格子出发,向外扩展到海洋格子,计算每个海洋格子到最近陆地的距离。\n\n## 算法步骤\n\n1. 初始化一个与原网格同样大小的距离矩阵`dis`,所有值初始化为无穷大\n2. 遍历原网格,将所有陆地格子(值为1)的坐标和距离0加入队列,作为BFS的起点\n3. 使用BFS遍历:\n - 从队列中取出一个位置\n - 如果当前位置的距离小于记录的距离,则更新距离\n - 如果当前位置是海洋,则更新最大距离\n - 向四个方向扩展,将合法的海洋格子加入队列\n4. 返回找到的最大距离,如果不存在海洋或陆地则返回-1\n\n## 代码\n\n```javascript\nvar maxDistance = function(grid) {\n let n = grid.length;\n // 创建一个距离矩阵,初始化为无穷大\n let dis = new Array(n).fill(0).map(()=>new Array(n).fill(Infinity));\n let q = new Queue();\n \n // 将所有陆地格子(值为1)作为BFS的起始点\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(grid[i][j] === 0) continue;\n q.enqueue([i,j,0]); // [行, 列, 距离]\n }\n }\n\n // 四个方向的移动:右、下、左、上\n const dirs = [[0,1],[1,0],[0,-1],[-1,0]];\n let ans = -Infinity;\n \n // BFS遍历\n while(q.size()){\n let [i,j,d] = q.dequeue();\n \n // 如果当前距离大于等于已记录的距离,则跳过\n if(d >= dis[i][j]) continue;\n \n // 更新当前位置的距离\n dis[i][j] = d;\n \n // 如果当前位置是海洋(值为0),更新最大距离\n if(grid[i][j] === 0) ans = Math.max(ans,dis[i][j]);\n \n // 向四个方向扩展\n for(let [x,y] of dirs.map(v=>[v[0] + i,v[1] + j])){\n // 检查边界\n if(x < 0 || x >= n || y < 0 || y >= n) continue;\n // 如果是陆地则跳过\n if(grid[x][y] === 1) continue;\n // 如果新距离大于等于已记录距离则跳过\n if(d + 1 >= dis[x][y]) continue;\n // 将新位置加入队列\n q.enqueue([x,y,d + 1]);\n }\n }\n \n // 返回结果,如果没找到海洋格子则返回-1\n return ans === -Infinity ? -1 : ans === Infinity ? -1 : ans; \n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n²),每个格子最多被访问一次\n- 空间复杂度:O(n²),需要存储距离矩阵和队列\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251721463","body":"## 问题理解\n\n这个问题是一个图遍历问题,涉及以下概念:\n- 有n个盒子,每个盒子可能包含糖果、钥匙和内部盒子\n- 某些盒子是打开的(status[i] = 1),某些是关闭的(status[i] = 0)\n- 只有拿到钥匙才能打开关闭的盒子\n- 初始时有一些盒子(initialBoxes)\n- 目标是获得尽可能多的糖果\n\n## 思路\n\n### 1. 初始化阶段\n```javascript\nlet n = status.length, ans = 0,\nhas_key = new Array(n).fill(0),\nhas_box = new Array(n).fill(0);\n```\n\n- `n`: 盒子总数\n- `ans`: 最终获得的糖果总数\n- `has_key`: 标记是否拥有某个盒子的钥匙\n- `has_box`: 标记是否拥有某个盒子\n\n### 2. 设置初始状态\n```javascript\nfor(let i = 0; i < n; i++) if(status[i]) has_key[i] = 1;\nfor(let i of initialBoxes) has_box[i] = 1;\n```\n\n- 将所有本来就是打开状态的盒子(status[i] = 1)标记为拥有钥匙\n- 将初始拥有的盒子标记为已拥有\n\n### 3. DFS遍历获取糖果\n```javascript\nlet vis = new Array(n).fill(0);\nfor(let i of initialBoxes){\n if(has_box[i] && has_key[i] && !vis[i]) dfs(i);\n}\n```\n\n- `vis`: 标记盒子是否已经访问过\n- 对于每个初始盒子,如果既拥有盒子又有钥匙且未访问过,则进行DFS\n\n### 4. DFS函数实现\n```javascript\nfunction dfs(i){\n ans += candies[i]; // 收集当前盒子的糖果\n vis[i] = 1; // 标记为已访问\n for(let j of keys[i]){ // 遍历当前盒子中的钥匙\n has_key[j] = 1; // 获得钥匙\n if(has_box[j] && !vis[j]) dfs(j); // 如果拥有对应盒子且未访问,则继续DFS\n }\n for(let j of containedBoxes[i]){ // 遍历当前盒子中的内部盒子\n has_box[j] = 1; // 获得盒子\n if(has_key[j]&& !vis[j]) dfs(j); // 如果拥有对应钥匙且未访问,则继续DFS\n }\n}\n```\n\n\n## 算法流程总结\n\n1. **初始化状态**:记录每个盒子的初始状态(是否打开)和初始拥有的盒子\n2. **深度优先搜索**:从初始盒子开始,只有当同时拥有盒子和钥匙时才能打开盒子\n3. **收集资源**:打开盒子后获得糖果、钥匙和内部盒子\n4. **继续探索**:利用新获得的钥匙或盒子继续打开新的盒子\n5. **避免重复**:使用vis数组确保每个盒子只被访问一次\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n let n = status.length,ans = 0,\n has_key = new Array(n).fill(0),\n has_box = new Array(n).fill(0);\n for(let i = 0;i < n;i++) if(status[i]) has_key[i] = 1;\n for(let i of initialBoxes) has_box[i] = 1;\n let vis = new Array(n).fill(0);\n for(let i of initialBoxes){\n if(has_box[i] && has_key[i] && !vis[i]) dfs(i);\n }\n return ans;\n // ----------------------------------------\n function dfs(i){\n ans += candies[i];\n vis[i] = 1;\n for(let j of keys[i]){\n has_key[j] = 1;\n if(has_box[j] && !vis[j]) dfs(j);\n }\n for(let j of containedBoxes[i]){\n has_box[j] = 1;\n if(has_key[j]&& !vis[j]) dfs(j);\n }\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度为O(N + E),其中N是盒子数量,E是钥匙和内部盒子的总数。\n- 空间复杂度为O(N)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3257477257","body":"\n## 思路\n\n1. **坐标系统设定**:\n - 为每个节点分配坐标,根节点为原点(0, 0)\n - 向左子树移动时,列坐标减1;向右子树移动时,列坐标加1\n - 行坐标随着深度增加而增加(向下为正方向)\n\n2. **DFS遍历收集信息**:\n - 使用深度优先搜索遍历所有节点\n - 记录每个节点的值、行坐标、列坐标\n\n3. **自定义排序**:\n - 按列坐标升序排列(从左到右)\n - 列相同时按行坐标升序(从上到下)\n - 行列都相同时按节点值升序\n\n4. **分组输出**:\n - 将相同列坐标的节点值归为一组\n - 每组构成结果数组中的一个子数组\n\n## 代码:\n\n```javascript\nvar verticalTraversal = function(root) {\n let ans = [] // 存储[节点值, 行, 列]信息\n \n // DFS遍历,收集每个节点的值和坐标\n dfs(root,0,0);\n \n // 自定义排序:先按列,再按行,最后按值\n ans.sort((a,b)=>a[2] - b[2] || a[1] - b[1] || a[0] - b[0]);\n \n let col = Infinity, res = [];\n // 按列分组,将相同列的节点值组成子数组\n for(let [v,r,c] of ans){\n if(col === c) res[res.length - 1].push(v);\n else{\n res.push([v]);\n col = c;\n }\n }\n return res;\n \n // 辅助函数:深度优先遍历并记录坐标\n function dfs(root,row,col){\n if(!root) return;\n ans.push([root.val,row,col]);\n dfs(root.left,row + 1,col - 1) // 左子树:行+1,列-1\n dfs(root.right,row + 1,col + 1) // 右子树:行+1,列+1\n }\n};\n```\n## 复杂度分析\n### 时间复杂度:\n- DFS遍历:O(N),N为节点数\n- 排序:O(N log N)\n- 分组:O(N)\n- 总体:O(N log N)\n\n### 空间复杂度:\n- 存储信息:O(N)\n- 递归栈:O(H),H为树高度\n- 总体:O(N)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260240769","body":"\n\n## 思路\n\n使用了动态规划的思想,并进行了空间优化:\n\n## 具体分析\n\n1. **状态定义**:\n - `prevprev` 表示到达第 i-2 个位置的最小花费\n - `prev` 表示到达第 i-1 个位置的最小花费\n - `curr` 表示到达当前位置的最小花费\n\n2. **状态转移方程**:\n - `curr = v + Math.min(prevprev, prev)`\n - 其中 v 是当前位置的花费(顶部为0)\n\n3. **优化点**:\n - 使用滚动数组优化空间复杂度,从O(n)降到O(1)\n - 只保存前两个状态值,而不是整个dp数组\n\n4. **边界处理**:\n - 当 i < n 时,v = cost[i](正常台阶费用)\n - 当 i = n 时,v = 0(到达楼顶,没有费用)\n - 最后的返回值根据数组长度做了特殊处理\n\n\n这是一个经典的空间优化动态规划解法,通过只保留必要的状态值来减少空间使用。\n## 代码\n```javascript\nvar minCostClimbingStairs = function(cost) {\n let n = cost.length,\n prevprev = cost[0], // 表示到达第0个台阶的最小花费\n prev = cost[1], // 表示到达第1个台阶的最小花费\n curr;\n \n // 从第2个台阶开始遍历到楼梯顶部\n for(let i = 2;i <= n;i++){\n let v = 0;\n // 当i[1,1]);\n```\n\n\n1. 创建一个二维DP数组`dp`,其中`dp[i][0]`表示以`nums[i]`结尾的最长递增子序列的长度,`dp[i][1]`表示以`nums[i]`结尾的最长递增子序列的个数。\n2. 初始时,每个元素自身构成一个长度为1的递增子序列,所以都初始化为`[1,1]`。\n\n```javascript\n for(let i = 1; i < n; i++){\n for(j = i - 1; j >= 0; j--){\n if(nums[i] > nums[j]){\n if(dp[j][0] + 1 > dp[i][0]){\n dp[i][0] = dp[j][0] + 1;\n dp[i][1] = dp[j][1];\n }else if(dp[j][0] + 1 === dp[i][0]){\n dp[i][1] += dp[j][1];\n }\n }\n }\n }\n```\n\n\n3. 对于每个位置[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6),遍历它之前的所有位置`j`:\n - 如果`nums[i] > nums[j]`,说明可以将`nums[i]`接在以`nums[j]`结尾的递增子序列后面\n - 如果通过`j`得到的子序列长度(`dp[j][0] + 1`)比当前记录的长度(`dp[i][0]`)更长,则更新长度和数量\n - 如果长度相等,则将通过`j`得到的子序列数量加到当前的数量上\n\n```javascript\n let ans = 0, max = -Infinity;\n for(let [len,cnt] of dp){\n if(len > max){\n max = len;\n ans = cnt;\n }else if(max === len){\n ans += cnt;\n }\n }\n return ans;\n```\n\n\n4. 最后遍历整个DP数组,找出最长的递增子序列长度,并累加所有具有该长度的子序列的数量。\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findNumberOfLIS = function(nums) {\n let n = nums.length,dp = new Array(n).fill(0).map(()=>[1,1]);\n for(let i = 1;i < n;i++){\n for(j = i - 1;j >= 0;j--){\n if(nums[i] > nums[j]){\n if(dp[j][0] + 1 > dp[i][0]){\n dp[i][0] = dp[j][0] + 1;\n dp[i][1] = dp[j][1];\n }else if(dp[j][0] + 1 === dp[i][0]){\n dp[i][1] += dp[j][1];\n }\n }\n }\n }\n let ans = 0,max = -Infinity;\n for(let [len,cnt] of dp){\n if(len > max){\n max = len;\n ans = cnt;\n }else if(max === len){\n ans += cnt;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(n²),\n- 空间复杂度是O(n)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269148142","body":"\n## 思路\n\n### 1. 问题定义\n最长公共子序列是找出两个字符串中最长的共同子序列(不要求连续,但要保持相对顺序)。\n\n### 2. 动态规划状态定义\n```javascript\nlet m = text1.length, n = text2.length, dp = new Array(m).fill(0).map(() => new Array(n).fill(0));\n```\n\n创建一个二维数组 `dp[i][j]`,表示 `text1[0...i]` 和 `text2[0...j]` 的最长公共子序列长度。\n\n### 3. 初始化边界条件\n```javascript\nif(text1[0] === text2[0]) dp[0][0] = 1;\n\nfor(let i = 1;i < m;i++) {\n dp[i][0] = text1[i] === text2[0] ? 1 : dp[i - 1][0];\n}\nfor(let i = 1;i < n;i++) {\n dp[0][i] = text1[0] === text2[i] ? 1 : dp[0][i - 1];\n}\n```\n\n- 首先处理两个字符串的第一个字符,如果相同则 `dp[0][0] = 1`\n- 分别初始化第一列和第一行:\n - 如果当前字符匹配,则值为1\n - 否则继承前一个位置的值\n\n### 4. 状态转移方程\n```javascript\nfor(let i = 1;i < m;i++){\n for(let j = 1;j < n;j++){\n if(text1[i] === text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;\n else dp[i][j] = Math.max(\n dp[i - 1][j],\n dp[i][j - 1],\n dp[i - 1][j - 1]\n );\n }\n}\n```\n\n对于每个位置 `(i,j)`:\n- 如果 `text1[i] === text2[j]`,说明当前字符匹配,则 `dp[i][j] = dp[i-1][j-1] + 1`\n- 否则取三种情况的最大值:\n - `dp[i-1][j]`:text1[0...i-1] 与 text2[0...j] 的LCS长度\n - `dp[i][j-1]`:text1[0...i] 与 text2[0...j-1] 的LCS长度\n - `dp[i-1][j-1]`:text1[0...i-1] 与 text2[0...j-1] 的LCS长度\n\n### 5. 返回结果\n```javascript\nreturn dp[m - 1][n - 1];\n```\n\n返回 `dp[m-1][n-1]` 即为两个完整字符串的最长公共子序列长度。\n\n\n## 代码\n```javascript\n/**\n * @param {string} text1\n * @param {string} text2\n * @return {number}\n */\nvar longestCommonSubsequence = function(text1, text2) {\n let m = text1.length,n = text2.length,dp = new Array(m).fill(0).map(() => new Array(n).fill(0));\n if(text1[0] === text2[0]) dp[0][0] = 1;\n\n for(let i = 1;i < m;i++) {\n dp[i][0] = text1[i] === text2[0] ? 1 : dp[i - 1][0];\n }\n for(let i = 1;i < n;i++) {\n dp[0][i] = text1[0] === text2[i] ? 1 : dp[0][i - 1];\n }\n for(let i = 1;i < m;i++){\n for(let j = 1;j < n;j++){\n if(text1[i] === text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;\n else dp[i][j] = Math.max(\n dp[i - 1][j],\n dp[i][j - 1],\n dp[i - 1][j - 1]\n );\n }\n }\n return dp[m - 1][n - 1];\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(m×n),其中 m 和 n 分别是两个字符串的长度\n- 空间复杂度:O(m×n),用于存储 dp 数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273217746","body":"## 思路\n使用了组合数学的方法来解决不同路径问题:\n\n1. **问题转换**:\n - 机器人需要从左上角走到右下角,总共需要向右走 (n-1) 步,向下走 (m-1) 步\n - 总共需要走 (m-1)+(n-1) = m+n-2 步\n - 问题转化为:在这 m+n-2 步中,如何选择 m-1 步向下走(或 n-1 步向右走)\n\n2. **数学公式**:\n - 这是一个组合问题,答案是 C(m+n-2, m-1) 或 C(m+n-2, n-1)\n - 组合数公式:C(n,k) = n! / (k! * (n-k)!)\n - 为了避免计算阶乘导致的溢出,代码采用了逐步相乘的方式\n\n3. **实现细节**:\n - `k = m + n - 2` 表示总步数\n - `t = m - 1` 表示需要选择的步数(向下走的步数)\n - 通过循环计算组合数,每次将 `k/t` 的值乘到结果中,并递减 k 和 t\n - 最后使用 `Math.round()` 是为了处理浮点数计算可能产生的精度误差\n\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} m\n * @param {number} n\n * @return {number}\n */\nvar uniquePaths = function(m, n) {\n let k = m + n - 2;\n if(k === 0) return 1;\n let t = Math.min(m - 1,n - 1), ans = 1;\n while (t){\n ans *= k / t;\n k--;\n t--;\n }\n return Math.round(ans);\n};\n```\n\n## 复杂度分析\n- 时间复杂度为 O(min(m,n)),\n- 空间复杂度为 O(1)。\n相比动态规划方法,这种方法更加高效。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3277237117","body":"## 思路\n\n### 问题理解\n1. 骑士按照象棋规则移动(日字形,8个方向)\n2. 骑士从 (row, column) 位置开始\n3. 骑士进行 K 次随机移动\n4. 求骑士最终仍在棋盘上的概率\n\n### 解决方案\n使用记忆化递归(动态规划):\n\n1. **状态定义**:f(i, j, k) 表示骑士在位置 (i, j) 并且还能移动 k 步时,在棋盘上的概率\n\n2. **边界条件**:\n - 当 k = 0 时,如果位置在棋盘内则返回 1,否则返回 0\n - 当位置超出棋盘边界时,返回 0\n\n3. **状态转移**:\n - 对于骑士的 8 个可能移动方向,递归计算每个方向移动后的情况\n - 结果为所有可能移动结果的平均值(除以 8)\n\n4. **记忆化优化**:\n - 使用 memo 三维数组存储已经计算过的结果,避免重复计算\n\n## 代码\n\n```javascript\nvar knightProbability = function(n, k, row, column) {\n // 骑士的8个移动方向\n const dirs = [[1,2],[2,1],[1,-2],[2,-1],[-1,2],[-2,1],[-1,-2],[-2,-1]];\n \n // 记忆化数组,存储 (i,j,k) 状态下的结果\n const memo = new Array(n + 1).fill(0).map(()=>{\n return new Array(n + 1).fill(0).map(()=>{\n return new Array(k + 1).fill(-1);\n })\n })\n \n // 调用递归函数\n return f(row, column, k);\n \n function f(i, j, k) {\n // 基础情况:没有移动次数了\n if (k === 0) return i >= 0 && i < n && j >= 0 && j < n ? 1 : 0;\n \n // 超出边界\n if (i < 0 || i >= n || j < 0 || j >= n) return 0;\n \n // 已经计算过该状态\n if (memo[i][j][k] !== -1) return memo[i][j][k];\n \n let ans = 0;\n // 遍历8个方向\n for (let d of dirs) {\n let x = d[0] + i, y = d[1] + j;\n ans += f(x, y, k - 1);\n }\n \n // 每个方向的概率是 1/8,所以取平均值\n memo[i][j][k] = ans / 8;\n return ans / 8;\n } \n};\n```\n\n\n### 复杂度分析\n- 时间复杂度:O(N²×K),因为有 N×N 个位置和 K 步\n- 空间复杂度:O(N²×K),用于存储记忆化数组\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3283550644","body":"## 思路\n\n### 1. 初始判断\n```javascript\nif((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;\n```\n\n首先计算所有可选数字的总和,如果总和小于目标值,则无论如何都无法达到目标,返回false。\n\n### 2. 核心递归函数f\n```javascript\nfunction f(type,total,state){}\n```\n\n- `type`: 当前玩家类型(0表示我方,1表示对方)\n- `total`: 剩余需要达到的目标值\n- `state`: 用位掩码表示的已选择数字状态\n\n### 3. 记忆化搜索\n使用`memo`来存储已经计算过的状态结果,避免重复计算。通过`query`和[add](file://E:\\其他项目\\algorithm_exercises\\9.js#L13-L21)函数来操作这个多层Map结构。\n\n### 4. 状态转移\n对于每个未选择的数字:\n- 如果选择该数字可以直接获胜(`i + 1 >= total`),则当前玩家获胜\n- 否则,递归调用[f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)计算对手在新状态下的结果\n- 如果存在一种选择使得对手必败,则当前玩家必胜\n\n### 5. 博弈论思想\n这是一个典型的极小化极大算法应用:\n- 当前玩家希望找到至少一种选择使得对手必败(返回false)\n- 如果所有选择都导致对手必胜(都返回false),则当前玩家必败\n\n## 代码\n```javascript\n/**\n * @param {number} maxChoosableInteger\n * @param {number} desiredTotal\n * @return {boolean}\n */\nvar canIWin = function(maxChoosableInteger, desiredTotal) {\n let memo = new Map();\n if((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;\n return f(0,desiredTotal,0);\n // -------------------------------\n function f(type,total,state){\n let params = [state];\n if(query(params) !== -1) return query(params);\n let ans = false;\n for(let i = 0;i < maxChoosableInteger;i++){\n if(state & (1 << i)) continue;\n if(i + 1 >= total) {\n ans = true;\n break;\n }\n let a = f(type === 0 ? 1 : 0,total - i - 1, state | (1 << i));\n if(a === false) {\n ans = true;\n break;\n }\n }\n add(params,ans)\n return ans;\n }\n\n function query(params){\n let ans = memo;\n for(let param of params){\n if(ans.has(param) === false) return -1;\n ans = ans.get(param);\n }\n return ans;\n }\n\n function add(params,val){\n let m = memo,n = params.length, rest = params.slice(0,n - 1),last = params[n - 1];\n for(let param of rest){\n if(m.has(param) === false) m.set(param,new Map());\n m = m.get(param);\n }\n m.set(last,val);\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:$O(n*2^{n})$\n- 空间复杂度:$O(n)$","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3287375518","body":"## 思路\n\n\n1. **预处理**:\n - 计算数组总和,如果为奇数则直接返回false\n - 确定目标值target为总和的一半\n\n2. **初始化DP数组**:\n - dp[j]表示是否可以用数组中的元素组成和为j的子集\n - 初始时只考虑第一个元素nums[0],只有当j等于nums[0]时才为true\n\n3. **状态转移**:\n - 对于每个元素nums[i],更新dp数组\n - 从target到0逆序遍历,避免重复使用同一元素\n - 状态转移方程:`dp[j] = dp[j] || dp[j - nums[i]]`\n - 要么不使用当前元素,保持原来的状态dp[j]\n - 要么使用当前元素,前提是dp[j - nums[i]]为true\n\n4. **返回结果**:\n - 如果dp[target]为true,表示可以组成和为target的子集,返回true\n - 否则返回false\n\n\n## 代码\n```javascript\nvar canPartition = function(nums) {\n // 获取数组长度和总和\n let n = nums.length,sum = nums.reduce((a,b)=>a + b,0);\n \n // 如果总和是奇数,则无法分成两个相等的子集\n if(sum & 1) return false;\n \n // 目标是找到和为总和一半的子集\n const target = sum / 2;\n \n // 创建dp数组,dp[j]表示是否可以用前面的数字组成和为j的子集\n const dp = new Array(target + 1).fill(false);\n \n // 初始化:第一个数字能否组成和为j的子集\n for(let j = 0;j <= target;j++) dp[j] = nums[0] === j;\n \n // 从第二个数字开始遍历\n for(let i = 1;i < n;i++){\n // 从target到0逆序遍历(避免重复使用同一元素)\n for(let j = target;j >= 0;j--){\n // 状态转移方程:\n // dp[j] = dp[j] || dp[j - nums[i]]\n // 要么之前就能组成j,要么使用当前数字nums[i]组成j\n dp[j] = dp[j] || (j - nums[i] >= 0 ? dp[j - nums[i]] : false);\n }\n }\n \n // 返回是否能组成和为target的子集\n return dp[target];\n};\n```\n\n## 时间和空间复杂度\n\n- 时间复杂度:O(n × target),其中n是数组长度,target是数组元素和的一半\n- 空间复杂度:O(target),只使用了一维dp数组\n\n这是一个经典的0-1背包问题的应用,通过动态规划解决了分割等和子集问题。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289197873","body":"\n## 思路\n\n\n1. **递归函数 [f(i, total)](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\2.js#L16-L29)**:\n - [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 表示当前处理到数组中的第 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素\n - [total](file://E:\\力扣刷题\\algorithm_exercises\\双周赛\\165\\3.js#L5-L5) 表示前 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素通过添加 '+' 或 '-' 符号后得到的总和\n - 函数返回从第 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素开始到最后一个元素,能够得到目标值的方案数\n\n2. **边界条件**:\n - 当 `i === n` 时,表示已经处理完所有元素,如果 `total === target` 则找到一种有效方案,返回 1,否则返回 0\n\n3. **状态转移**:\n - 对于当前元素 `nums[i]`,可以选择加上它或减去它\n - 所以递归调用 `f(i+1, total-nums[i]) + f(i+1, total+nums[i])`\n\n4. **记忆化优化**:\n - 使用 [memo](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\430\\2.js#L7-L7) 数组存储已经计算过的状态,避免重复计算\n - `memo[i][total + abs_sum]` 中使用 `total + abs_sum` 是为了避免负数索引\n\n## 代码亮点\n\n1. 计算 `abs_sum` 来确定可能的和的范围,这样可以正确地映射负数到数组索引\n2. 使用记忆化递归避免重复计算,提高效率\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar findTargetSumWays = function(nums, target) {\n let n = nums.length;\n let abs_sum = nums.reduce((prev,curr)=>{\n if(curr >= 0) return curr + prev;\n return prev - curr;\n },0)\n // console.log(abs_sum);\n let memo = new Array(n + 1).fill(0).map(()=>new Array(2 * abs_sum + 1).fill(-1));\n return f(0,0);\n // ---------------------------\n function f(i,total){\n if(i === n) return target === total ? 1 : 0;\n let t = memo[i][total + abs_sum];\n // console.log(i,target,target + abs_sum,t);\n if(t !== -1) return t;\n let ans = f(i + 1,total - nums[i]) + f(i + 1,total + nums[i]);\n memo[i][total + abs_sum] = ans; \n return ans;\n }\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n × S),其中 n 是数组长度,S 是数组元素绝对值之和\n- **空间复杂度**:O(n × S),主要由 memo 数组占用","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290259438","body":"## 思路\n\n这是一个典型的完全背包问题:\n1. **状态定义**:`dp[i][j]` 表示使用前 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 种硬币凑成金额 `j` 所需的最少硬币数\n2. **状态转移**:对于第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 种硬币,我们有两种选择:\n - 不使用该硬币:`dp[i-1][j]`\n - 使用该硬币:`1 + dp[i][j-coins[i-1]]`(因为硬币可以重复使用,所以是`dp[i]`而不是`dp[i-1]`)\n3. **边界条件**:`dp[0][0] = 0`,表示不使用任何硬币凑成金额0需要0个硬币\n## 代码\n\n```javascript\nvar coinChange = function(coins, amount) {\n let n = coins.length;\n // 创建二维DP数组,dp[i][j]表示使用前i种硬币凑成金额j的最少硬币数\n let dp = new Array(n + 1).fill(0).map(()=>new Array(amount + 1).fill(Infinity));\n // 初始状态:使用0种硬币凑成金额0需要0个硬币\n dp[0][0] = 0;\n \n // 遍历每种硬币\n for(let i = 1; i <= n; i++){\n // 遍历所有可能的金额\n for(let j = 0; j <= amount; j++){\n // 状态转移方程:\n // 1. 不使用第i种硬币:dp[i - 1][j]\n // 2. 使用第i种硬币:1 + dp[i][j - coins[i - 1]] (前提是j - coins[i - 1] >= 0)\n dp[i][j] = Math.min(\n dp[i - 1][j],\n j - coins[i - 1] >= 0 ? 1 + dp[i][j - coins[i - 1]] : Infinity\n );\n }\n }\n \n // 返回结果,如果为无穷大说明无法凑成,返回-1\n return dp[n][amount] === Infinity ? -1 : dp[n][amount]\n};\n```\n\n## 时间和空间复杂度\n- 时间复杂度:O(n × amount),其中 n 是硬币种类数\n- 空间复杂度:O(n × amount)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3295404263","body":"## 思路\n\n### 状态定义\n\n- `dp[i][j]` 表示使用前 i 种硬币凑成金额 j 的组合数\n\n### 初始化\n\n- `dp[0][0] = 1`:使用 0 种硬币凑成金额 0 的方法数为 1(即什么都不选)\n\n### 状态转移方程\n\n对于第 i 种硬币(面值为 c):\n\n- `dp[i][j] = dp[i-1][j] + (j-c >= 0 ? dp[i][j-c] : 0)`\n- 其中:\n - `dp[i-1][j]`:不使用第 i 种硬币,仅使用前 i-1 种硬币凑成金额 j 的组合数\n - `dp[i][j-c]`:使用第 i 种硬币,即在凑成金额 j-c 的基础上再加一个第 i 种硬币\n\n### 关键点\n\n1. 这是一个\"完全背包\"问题:每种硬币可以使用无限次\n2. 使用的是二维DP,其中行代表硬币种类,列代表金额\n3. 转移方程中 `dp[i][j-c]`(而非 `dp[i-1][j-c]`)体现了每种硬币可重复使用的特性\n\n## 代码\n\n```javascript\n/**\n * @param {number} amount\n * @param {number[]} coins\n * @return {number}\n */\nvar change = function (amount, coins) {\n let n = coins.length, dp = new Array(n + 1).fill(0).map(() => new Array(amount + 1).fill(0));\n dp[0][0] = 1;\n for (let i = 1; i <= n; i++) {\n let c = coins[i - 1]\n for (let j = 0; j <= amount; j++) dp[i][j] = dp[i - 1][j] + (j - c >= 0 ? dp[i][j - c] : 0);\n }\n return dp[n][amount];\n };\n```\n### 时间和空间复杂度\n\n- 时间复杂度:O(n × amount),其中 n 是硬币种类数\n- 空间复杂度:O(n × amount)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3300884457","body":"## 思路\n\n1. **排序策略**:将孩子贪心值数组`g`和饼干尺寸数组[s](file://E:\\其他项目\\algorithm_exercises\\1.js)都按降序排列\n2. **贪心策略**:用最大的饼干去满足贪心值最大的孩子(即最难以满足的孩子)\n3. **双指针遍历**:使用两个指针分别遍历孩子和饼干数组\n4. **匹配逻辑**:如果当前饼干能满足当前孩子,则两个指针都前进;否则只移动孩子指针(尝试用同一块饼干满足贪心值更低的孩子)\n\n这种从最大到最小的分配方式体现了贪心思想:优先满足需求大的孩子,这样能保证整体效果最优。\n\n## 代码\n```javascript\n/**\n * @param {number[]} g\n * @param {number[]} s\n * @return {number}\n */\nvar findContentChildren = function(g, s) {\n const compare = (a,b)=>b - a;\n g.sort(compare);\n s.sort(compare);\n let i = 0,j = 0,m = g.length,n = s.length;\n let ans = 0;\n while(i < m && j < n){\n if(s[j] >= g[i]){\n ans++;\n j++;\n i++;\n }else i++;\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度为O(m log m + n log n),主要消耗在排序上,\n- 空间复杂度为O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3305173933","body":"\n## 思路\n\n贪心策略是:**尽可能选择结束时间早的区间,这样能为后续区间留出更多空间**。\n\n\n1. **按结束时间排序**:\n ```javascript\n intervals.sort((a,b)=>a[1] - b[1]);\n ```\n\n 将所有区间按照结束时间升序排列,优先考虑结束早的区间。\n\n2. **贪心选择**:\n ```javascript\n let lastEnd = -Infinity;\n for(let [s,e] of intervals){\n if(s >= lastEnd) {\n ans++;\n lastEnd = e;\n }\n }\n ```\n\n 遍历排序后的区间,如果当前区间的开始时间不早于上一个选中区间的结束时间,就选择这个区间。这确保了选中的区间互不重叠。\n\n3. **计算结果**:\n ```javascript\n return n - ans;\n ```\n\n 返回总区间数减去可以保留的区间数,即需要移除的区间数。\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} intervals\n * @return {number}\n */\nvar eraseOverlapIntervals = function(intervals) {\n intervals.sort((a,b)=>a[1] - b[1]);\n let ans = 0,n = intervals.length;\n let lastEnd = -Infinity;\n for(let [s,e] of intervals){\n if(s >= lastEnd) {\n ans++;\n lastEnd = e;\n }\n }\n return n - ans;\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n),主要消耗在排序上\n- 空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3312499521","body":"## 思路-:动态规划\n\n1. **问题目标**:判断是否能从数组的第一个位置跳到最后一个位置\n2. **解法**:使用动态规划从后往前推导\n3. **状态定义**:`dp[i]` 表示从位置 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 是否能到达最后一个位置\n4. **状态转移**:\n - 从倒数第二个位置开始往前推导\n - 对于每个位置 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22),检查能否通过跳跃到达后续的某个可达位置\n - 如果能跳到某个 `dp[j]` 为 `true` 的位置,则 `dp[i]` 也为 `true`\n\n```javascript\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canJump = function(nums) {\n let n = nums.length, dp = new Array(n).fill(false);\n dp[n - 1] = true;\n \n // 从倒数第二个位置开始向前遍历\n for(let i = n - 2; i >= 0; i--){\n let steps = nums[i];\n \n // 检查从当前位置 i 能否跳到某个可达的位置\n for(let delta = 1; delta <= steps && i + delta < n; delta++){\n let j = i + delta;\n if(dp[j]) {\n dp[i] = true;\n break;\n }\n }\n }\n \n return dp[0];\n};\n```\n\n\n## 思路总结\n\n1. **初始化**:创建一个布尔数组 [dp](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\467\\3.js#L22-L22),长度与输入数组相同,所有元素初始化为 `false`\n2. **边界条件**:最后一个位置默认为 `true`(已经在最后一个位置了)\n3. **状态转移**:从倒数第二个位置开始,对每个位置检查:\n - 根据当前位置的值,确定可以跳跃的步数范围\n - 在这个范围内,检查是否存在某个可达的位置(`dp[j]` 为 `true`)\n - 如果存在,则当前位置也是可达的\n4. **结果**:返回 `dp[0]`,即从起始位置是否可达\n\n## 复杂度分析\n这是一种典型的动态规划解法,\n- 时间复杂度为 O(n²),\n- 空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/71#issuecomment-3314420253","body":"## 思路:\n\n1. **状态定义**:`dp[i]` 表示由 i 个不同节点能构成的不同二叉搜索树的数量\n\n2. **状态转移方程**:\n - 对于 i 个节点,我们可以让其中任意一个节点 j (1 ≤ j ≤ i) 作为根节点\n - 当节点 j 作为根时:\n - 左子树包含比 j 小的 j-1 个节点,能构成 `dp[j-1]` 种不同的二叉搜索树\n - 右子树包含比 j 大的 i-j 个节点,能构成 `dp[i-j]` 种不同的二叉搜索树\n - 根据乘法原理,以 j 为根的二叉搜索树总数为 `dp[j-1] * dp[i-j]`\n - 遍历所有可能的根节点,将结果累加得到 `dp[i]`\n\n3. **边界条件**:\n - `dp[0] = 1`:空树也算一种情况\n - `dp[1] = 1`:只有一个节点时,只能构成一种二叉搜索树\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar numTrees = function(n) {\n // 创建dp数组,dp[i]表示由i个不同节点能构成的不同二叉搜索树的数量\n let dp = new Array(n + 1).fill(0);\n \n // 边界条件:0个节点可以构成1棵空树,1个节点只能构成1种二叉搜索树\n dp[0] = 1;\n dp[1] = 1;\n \n // 计算2到n个节点能构成的不同二叉搜索树数量\n for(let i = 2; i <= n; i++){\n // 对于i个节点,尝试让每个节点作为根节点\n for(let j = 1; j <= i; j++){\n // 当第j个节点作为根时:\n // 左子树有j-1个节点,可以构成dp[j-1]种不同的二叉搜索树\n // 右子树有i-j个节点,可以构成dp[i-j]种不同的二叉搜索树\n // 根据乘法原理,以j为根的二叉搜索树数量为dp[j-1] * dp[i-j]\n dp[i] += dp[j - 1] * dp[i - j]\n }\n }\n \n // 返回n个节点能构成的不同二叉搜索树数量\n return dp[n]\n};\n```\n\n\n\n\n\n## 复杂度分析\n- 时间复杂度为 O(n²),\n- 空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3315877464","body":"\n## 思路\n\n使用了**最小优先队列**来解决合并K个有序链表的问题,这是一种非常高效的解决方案。\n\n### 核心思想\n\n1. **使用最小优先队列维护所有链表的头部节点**:\n - 将K个链表的头节点都放入最小优先队列中\n - 优先队列会根据节点值进行排序,确保队首始终是最小值节点\n\n2. **逐步构建结果链表**:\n - 每次从优先队列中取出值最小的节点\n - 将该节点连接到结果链表末尾\n - 如果该节点还有后续节点,则将后续节点加入优先队列\n\n3. **重复过程直到优先队列为空**:\n - 当优先队列为空时,说明所有节点都已处理完毕\n\n### 代码详解\n\n```javascript\nvar mergeKLists = function(lists) {\n // 创建虚拟头节点,便于操作\n let dummy = new ListNode(), dh = dummy;\n \n // 创建最小优先队列,比较函数是基于节点值\n let q = new MinPriorityQueue(v => v.val);\n \n // 将所有非空链表的头节点加入优先队列\n for(let i = 0; i < lists.length; i++) \n if(lists[i]) q.enqueue(lists[i]);\n \n // 当优先队列不为空时继续处理\n while(q.size()){\n // 取出值最小的节点\n let n = q.dequeue();\n \n // 将该节点连接到结果链表\n dh.next = n;\n dh = dh.next;\n \n // 如果该节点有后续节点,将其加入优先队列\n if(n.next) q.enqueue(n.next);\n }\n \n // 返回合并后的链表\n return dummy.next;\n};\n```\n\n\n## 复杂度分析\n\n1. **时间复杂度优化**:\n - 时间复杂度为 O(N log K),其中 N 是所有节点总数,K 是链表数量\n\n2. **空间复杂度**:\n - 空间复杂度为 O(K),只需要存储K个链表的头部节点\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/73#issuecomment-3322038797","body":"## 思路:\n\n1. **分治思想**:\n - 将问题分解为两个子问题:分别处理奇数和偶数\n - `oushu = n >> 1` 计算偶数的个数(相当于 n/2 的整数部分)\n - `jishu = n - oushu` 计算奇数的个数\n\n2. **递归处理**:\n - `l1 = beautifulArray(jishu)` 递归生成奇数个数对应的漂亮数组\n - `l2 = beautifulArray(oushu)` 递归生成偶数个数对应的漂亮数组\n\n3. **映射构造**:\n - 对于奇数部分:`for(let i of l1) ans.push(2 * i - 1)` 将每个元素映射为奇数\n - 对于偶数部分:`for(let i of l2) ans.push(2 * i)` 将每个元素映射为偶数\n\n4. **核心思想**:\n - 通过将数组分为奇数和偶数两部分,确保不会在奇数和偶数之间形成等差数列\n - 因为如果一个数是奇数,另一个是偶数,那么它们的平均数不可能是整数,也就不可能在数组中找到第三个数构成等差数列\n\n## 关键点:\n\n- 基础情况:当 n=1 时,直接返回 [1]\n- 使用位运算 `>>` 实现整数除法,提高效率\n- 通过分别处理奇数和偶数部分,巧妙地避免了等差数列的形成\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number[]}\n */\nvar beautifulArray = function(n) {\n if(n === 1) return [1];\n let oushu = n >> 1,jishu = n - oushu;\n let l1 = beautifulArray(jishu),l2 = beautifulArray(oushu);\n let ans = [];\n for(let i of l1) ans.push(2 * i - 1);\n for(let i of l2) ans.push(2 * i);\n return ans\n};\n```\n\n## 复杂度分析\n- 时间复杂度为 O(n log n)。\n- 空间复杂度为 O(n log n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322078023","body":"## 思路:\n\n1. **异或运算的性质**:\n - 相同数字异或结果为0:`a ^ a = 0`\n - 任何数字与0异或等于自身:`a ^ 0 = a`\n - 异或运算满足交换律和结合律\n\n2. **第一步:计算所有数字的异或结果**:\n ```javascript\n let xor = 0;\n nums.forEach(n=>xor = xor ^ n);\n ```\n\n 这一步得到的是两个只出现一次的数字的异或结果,因为出现两次的数字都会相互抵消。\n\n3. **第二步:找到区分两个目标数字的位**:\n ```javascript\n let type = xor & (-xor);\n ```\n\n 这一步很关键,通过 `xor & (-xor)` 找到 `xor` 中最右边的1位。这个位必定在两个目标数字中一个为1,一个为0,因为只有这样它们的异或结果才会是1。\n\n4. **第三步:根据该位将数组分为两组**:\n ```javascript\n let a = 0, b = 0;\n for(let num of nums){\n if(type & num) a = a ^ num; // 该位为1的数字分为一组\n else b ^= num; // 该位为0的数字分为一组\n }\n ```\n\n 通过这种方式,将两个目标数字分到不同的组中,而相同的数字由于该位相同会被分到同一组,在组内异或后会被抵消,最终每组只剩下各自的目标数字。\n\n## 复杂度分析\n\n- 时间复杂度是 O(n),\n- 空间复杂度是 O(1),非常高效。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar singleNumber = function(nums) {\n let xor = 0;\n nums.forEach(n=>xor = xor ^ n);\n let type = xor & (-xor);\n let a = 0,b = 0;\n for(let num of nums){\n if(type & num) a = a ^ num;\n else b ^= num;\n }\n return [a,b];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3326222352","body":"## 思路\n\n1. `let n = 1 << (nums.length)`:通过左移运算计算出子集的总数。对于长度为n的数组,其子集总数为2^n。这里使用位运算`1 << nums.length`等价于2的nums.length次方。\n\n2. 外层循环`for(let i = 0;i < n;i++)`:遍历从0到2^n-1的每个数字,每个数字代表一个子集。\n\n3. 对于每个数字i(用变量j来操作):\n - 使用`j & 1`检查j的最低位是否为1\n - 如果是1,则将nums[k]加入当前子集temp中\n - 然后将j右移一位(`j >>= 1`),检查下一位\n - 同时k递增,指向nums中的下一个元素\n\n4. 内层while循环结束后,将生成的子集temp添加到结果数组ans中。\n\n## 复杂度分析\n使用位运算生成所有子集的方法,\n- 时间复杂度为O(n*2^n),\n- 空间复杂度为O(n*2^n)。\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[][]}\n */\nvar subsets = function(nums) {\n let n = 1 << (nums.length),ans = [];\n for(let i = 0;i < n;i++){\n let temp = [],j = i,k = 0;\n while(j){\n if(j & 1) temp.push(nums[k]);\n j >>= 1;\n k++;\n }\n ans.push(temp);\n }\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3331626491","body":"## 思路\n\n1. **TrieNode(Trie节点)**\n - `isEnd`:标记该节点是否为某个单词的结尾\n - `children`:大小为26的数组,存储指向子节点的指针(对应26个小写字母)\n\n2. **辅助函数**\n - `getCharIndex(c)`:将字符转换为其在字母表中的索引(0-25)\n\n### 1. 初始化(`Trie`构造函数)\n- 创建一个根节点 `root`,作为整个Trie树的起点\n\n### 2. 插入单词(`insert`方法)\n- 从根节点开始,逐字符遍历要插入的单词\n- 对于每个字符:\n - 计算其在字母表中的索引\n - 如果对应子节点不存在,则创建新节点\n - 移动到该子节点\n- 遍历完所有字符后,将最后一个节点标记为单词结尾(`isEnd = true`)\n\n### 3. 搜索单词(`search`方法)\n- 从根节点开始,逐字符遍历要搜索的单词\n- 对于每个字符:\n - 计算索引并检查对应子节点是否存在\n - 如果不存在,返回 `false`\n - 如果存在,移动到该子节点\n- 遍历完所有字符后,检查最后一个节点是否为单词结尾(`isEnd`为`true`)\n\n### 4. 前缀匹配(`startsWith`方法)\n- 与`search`类似,但不检查最后一个节点是否为单词结尾\n- 只要能完整遍历前缀中的所有字符,就返回`true`\n\n## 时间复杂度\n- 插入和搜索操作的时间复杂度均为O(m),其中m为单词或前缀的长度\n\n## 空间复杂度\n- O(ALPHABET_SIZE × N × M),其中N为插入的单词数,M为平均单词长度\n\n## 代码\n```javascript\nfunction TrieNode(){\n this.isEnd = false;\n this.children = new Array(26);\n}\n\nfunction getCharIndex(c){\n return c.charCodeAt(0) - 'a'.charCodeAt(0);\n}\n\nvar Trie = function() {\n this.root = new TrieNode();\n};\n\n/** \n * @param {string} word\n * @return {void}\n */\nTrie.prototype.insert = function(word) {\n let root = this.root;\n for(let c of word){\n let i = getCharIndex(c);\n if(!root.children[i]) root.children[i] = new TrieNode();\n root = root.children[i];\n }\n root.isEnd = true;\n};\n\n/** \n * @param {string} word\n * @return {boolean}\n */\nTrie.prototype.search = function(word) {\n let root = this.root;\n for(let c of word){\n let i = getCharIndex(c);\n if(!root.children[i]) return false;\n root = root.children[i];\n }\n return root.isEnd;\n};\n\n/** \n * @param {string} prefix\n * @return {boolean}\n */\nTrie.prototype.startsWith = function(prefix) {\n let root = this.root;\n for(let c of prefix){\n let i = getCharIndex(c);\n if(!root.children[i]) return false;\n root = root.children[i];\n }\n return !!root\n};\n\n/** \n * Your Trie object will be instantiated and called as such:\n * var obj = new Trie()\n * obj.insert(word)\n * var param_2 = obj.search(word)\n * var param_3 = obj.startsWith(prefix)\n */\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3336492052","body":"## 思路\n\n### 1. TrieNode 结构\n- `TrieNode` 是一个前缀树节点结构。\n- 每个节点包含:\n - `value`: 当前节点对应的值总和。\n - [end](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14): 标记该节点是否为某个单词的结尾。\n - `children`: 长度为26的数组,存储子节点(对应字母a-z)。\n\n### 2. MapSum 类\n- 使用前缀树(Trie)和哈希表(Map)实现键值映射与前缀求和功能。\n- `root`: Trie树的根节点。\n- [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5): 存储已插入的键值对。\n\n## 核心方法\n\n### insert(key, val)\n- 插入或更新键值对:\n - 如果键已存在,更新所有相关节点的值(先减去旧值,再加上新值)。\n - 如果是新键,则在Trie中创建路径,并在路径上的每个节点累加值。\n - 最后更新哈希表中的键值对。\n\n### sum(prefix)\n- 查询指定前缀的所有键值总和:\n - 遍历前缀,在Trie中查找对应的节点。\n - 若找不到完整前缀则返回0。\n - 返回前缀末尾节点的 `value` 值(即以该前缀开头的所有键的值总和)。\n\n## 工具函数\n\n### getCharIndex(char)\n- 将字符转换为其在字母表中的索引(0-25)。\n\n\n\n\n## 代码\n```javascript\nfunction TrieNode(){\n this.value = 0;\n this.end = false;\n this.children = new Array(26);\n}\n\nfunction getCharIndex(a){return a.charCodeAt(0) - 'a'.charCodeAt(0)}\nvar MapSum = function() {\n this.root = new TrieNode();\n this.map = new Map();\n};\n\n/** \n * @param {string} key \n * @param {number} val\n * @return {void}\n */\nMapSum.prototype.insert = function(key, val) {\n if(this.map.has(key)){\n let root = this.root;\n for(let c of key){\n let i = getCharIndex(c);\n root.children[i].value -= this.map.get(key);\n root.children[i].value += val;\n root = root.children[i];\n }\n }else{\n let root = this.root;\n for(let c of key){\n let i = getCharIndex(c);\n if(!root.children[i]) root.children[i] = new TrieNode();\n root = root.children[i];\n root.value += val;\n }\n root.end = true;\n }\n this.map.set(key,val);\n};\n\n/** \n * @param {string} prefix\n * @return {number}\n */\nMapSum.prototype.sum = function(prefix) {\n let root = this.root;\n let ans = 0\n for(let c of prefix){\n let i = getCharIndex(c);\n if(!root.children[i]) return 0;\n root = root.children[i];\n }\n return root.value;\n};\n\n/** \n * Your MapSum object will be instantiated and called as such:\n * var obj = new MapSum()\n * obj.insert(key,val)\n * var param_2 = obj.sum(prefix)\n */\n```\n\n\n## 复杂度分析\n- 时间复杂度:O(n),n位单词的长度。\n- 空间复杂度:O(m * n),m为单词个数,n为单词长度。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/78#issuecomment-3340984021","body":"## 算法思路\n\n1. **构建 Trie 树**:\n - 将 `smalls` 数组中的所有字符串插入到 Trie 树中\n - 每个节点记录是否为单词结尾([end](file://E:\\力扣刷题\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14) 标志)以及对应的索引位置([i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22))\n\n2. **搜索过程**:\n - 遍历 `big` 字符串的每个位置作为起始点\n - 对每个起始点,使用 [dfs](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\465\\2.js#L9-L25) 函数在 Trie 树中进行匹配\n - 当匹配到完整单词时,将起始位置记录到对应的结果数组中\n\n3. **Trie 树结构**:\n - `TrieNode`:包含 [end](file://E:\\力扣刷题\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14) 标志、子节点数组和索引 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22)\n - `Trie`:提供插入方法,将单词和其索引存储到树中\n\n## 关键函数分析\n\n- **`multiSearch` 主函数**:\n - 初始化 Trie 树并插入所有 smalls 单词\n - 遍历 big 字符串每个位置进行搜索\n\n- **[dfs](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\465\\2.js#L9-L25) 辅助函数**:\n - 从当前 Trie 节点继续匹配字符\n - 找到匹配单词时记录位置信息\n\n## 时间复杂度\n\n- **构建 Trie**:O(∑|smalls[i]|),即所有 smalls 字符串长度之和\n- **搜索过程**:O(|big| × max_match_length)\n - 外层循环遍历 `big` 字符串:O(|big|)\n - 每次 dfs 最坏情况遍历到最长匹配:O(max_match_length)\n- **总体复杂度**:O(∑|smalls[i]| + |big| × max_match_length)\n\n## 空间复杂度\n\n- **Trie 树存储**:O(∑|smalls[i]| × 26) = O(∑|smalls[i]|)\n- **结果数组**:O(∑结果数量)\n- **总体空间复杂度**:O(∑|smalls[i]| + 结果数量)\n\n## 代码\n```javascript\n/**\n * @param {string} big\n * @param {string[]} smalls\n * @return {number[][]}\n */\nvar multiSearch = function(big, smalls) {\n let trie = new Trie(),n = smalls.length;\n for(let i = 0;i < n;i++) trie.insert(smalls[i],i);\n let ans = new Array(n).fill(0).map(()=>[]);\n for(let i = 0;i < big.length;i++){\n let root = trie.root;\n let c = big[i],j = getCharIndex(c);\n if(!root.children[j]) continue;\n dfs(root,i,i);\n }\n\n return ans;\n\n // --------------------------\n function dfs(root,index,j){\n if(index === big.length) return;\n let c = big[index],i = getCharIndex(c);\n if(!root.children[i]) return;\n root = root.children[i];\n if(root.end) ans[root.i].push(j);\n dfs(root,index + 1,j);\n }\n};\n\n\n\n\nfunction Trie(){\n this.root = new TrieNode();\n}\n\nTrie.prototype.insert = function(word,i){\n let root = this.root;\n for(let c of word){\n let j = getCharIndex(c);\n if(!root.children[j]) root.children[j] = new TrieNode();\n root = root.children[j]\n }\n root.i = i;\n root.end = true;\n}\n\n\nfunction TrieNode(){\n this.end = false;\n this.children = new Array(26);\n this.i = -1;\n}\n\nfunction getCharIndex(c){\n return c.charCodeAt(0) - 'a'.charCodeAt(0);\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/79#issuecomment-3342189359","body":"## 思路\n\n1. **并查集初始化**:\n - 创建一个长度为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6) 的数组 [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17),其中 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6) 是城市数量\n - 初始化时,每个城市都指向自己,即 `f[i] = i`,表示每个城市初始时都是独立的集合\n\n2. **连接城市**:\n - 遍历 `isConnected` 矩阵,对于每一对相连的城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 和 `j`\n - 调用 [merge(i, j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28) 函数将它们合并到同一个集合中\n\n3. **并查集操作**:\n - [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24) 函数:查找城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 所属集合的根节点,并进行路径压缩优化\n - [merge(i, j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28) 函数:将城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 和 `j` 所在的集合合并\n\n## 关键点分析\n\n- **路径压缩**:在 [find](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\2.js#L26-L29) 函数中使用了 `f[i] = find(f[i])` 来压缩路径,提高查找效率\n- **集合合并**:每次成功合并两个不同的集合时,省份数量 [ans](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6) 减一\n- **初始值**:[ans](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6) 初始化为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6),表示最坏情况下每个城市都是一个独立省份\n\n## 代码\n```javascript\n/**\n * @param {number[][]} isConnected\n * @return {number}\n */\nvar findCircleNum = function(isConnected) {\n let n = isConnected.length,f = new Array(n).fill(0).map((_,i)=>i);\n let ans = n;\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(isConnected[i][j]) merge(i,j);\n }\n }\n return ans;\n // ------------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n let fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n ans--;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n^2),其中 n 是城市数量\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/80#issuecomment-3344661787","body":"## 思路\n\n1. **并查集初始化**\n - 使用并查集(Union-Find)数据结构来管理节点连接关系\n - [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17) 数组存储每个节点的父节点,初始时每个节点的父节点是自身\n - [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 数组存储每个连通分量的大小,初始时每个分量大小为1\n\n2. **构建连通分量**\n - 遍历 `graph` 矩阵,对于每条边 `graph[i][j]`,将节点 i 和 j 合并到同一连通分量中\n - 通过 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 函数实现节点合并,并更新连通分量大小\n\n3. **统计初始感染节点**\n - 使用 `initialMap` 统计每个连通分量中有多少个初始感染节点\n - 通过 [find](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\2.js#L26-L29) 函数找到每个初始感染节点所属的连通分量\n\n4. **选择最优移除节点**\n - 遍历所有初始感染节点,寻找满足以下条件的节点:\n - 所在连通分量只有1个初始感染节点(否则移除该节点无法减少传播)\n - 能够拯救最多节点的连通分量\n - 如果拯救数量相同,选择索引最小的节点\n\n5. **边界情况处理**\n - 如果所有初始感染节点所在的连通分量都包含多个感染节点,则返回 `initial` 中的最小索引\n\n## 关键函数\n\n- [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24): 查找节点 i 的根节点(带路径压缩优化)\n- [merge(i,j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28): 合并节点 i 和 j 所在的连通分量\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} graph\n * @param {number[]} initial\n * @return {number}\n */\nvar minMalwareSpread = function(graph, initial) {\n let n = graph.length;\n let f = new Array(n).fill(0).map((_,i)=>i);\n let s = new Array(n).fill(1);\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(graph[i][j]) merge(i,j);\n }\n }\n\n\n let initialMap = new Map();\n for(let i of initial){\n let fi = find(i);\n initialMap.set(fi,initialMap.has(fi) ? initialMap.get(fi) + 1 : 1);\n }\n let ans = n,max = 0;\n for(let i of initial){\n let fi = find(i);\n if(initialMap.get(fi) > 1) continue;\n if(s[fi] > max || s[fi] === max && i < ans) {\n max = s[fi];\n ans = i\n }\n }\n\n return ans === n ? initial.reduce((prev,curr)=>Math.min(prev,curr),n) : ans;\n\n\n\n // -----------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n let fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n s[fj] += s[fi];\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n^2),\n- 空间复杂度:O(n),其中 n 是节点数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/81#issuecomment-3349592362","body":"\n\n## 思路\n\n1. **并查集数据结构**:\n - 使用数组 [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17) 实现并查集,初始化时每台计算机的父节点是自身\n - [size](file://E:\\其他项目\\algorithm_exercises\\libs\\Stack.js#L19-L21) 记录当前连通分量的数量,初始为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6)\n\n2. **可行性判断**:\n - 如果连接数 `cnt` 小于 `n-1`,则无法连接所有计算机,返回 `-1`\n\n3. **连通分量合并**:\n - 遍历所有连接关系,通过 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 函数合并对应的计算机\n - 每次成功合并都会减少连通分量数量\n\n4. **结果计算**:\n - 最终需要的操作次数等于连通分量数减一(`size - 1`)\n\n## 关键函数\n\n- [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24):查找计算机 [i](file://E:\\其他项目\\algorithm_exercises\\周赛\\469\\2.js#L23-L23) 所在集合的根节点(带路径压缩优化)\n- [merge(i,j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28):合并计算机 [i](file://E:\\其他项目\\algorithm_exercises\\周赛\\469\\2.js#L23-L23) 和 `j` 所在的集合\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} connections\n * @return {number}\n */\nvar makeConnected = function(n, connections) {\n const cnt = connections.length;\n if(cnt < n - 1) return -1;\n const f = new Array(n).fill(0).map((_,i)=>i);\n let size = n;\n for(let [i,j] of connections) merge(i,j);\n return size - 1;\n\n // ----------------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n const fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n size--;\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(m×α(n)),其中 m 是连接数,α 是阿克曼函数的反函数\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3354314699","body":"## 思路\n\n使用**后序遍历**的方式递归处理二叉树,删除所有值为0的叶子节点及其所属的全0子树。\n\n## 具体实现分析\n\n1. **基础情况处理**\n - `if(!root) return root;` - 空节点直接返回\n - `if(root && !root.left && !root.right) return root.val === 0 ? null : root;` - 叶子节点判断:如果是值为0的叶子节点则删除\n\n2. **递归处理**\n - `let l = pruneTree(root.left), r = pruneTree(root.right);` - 递归处理左右子树\n - 处理后的左右子树结果保存在 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\468\\2.js#L7-L7) 和 [r](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\447\\1.js#L31-L31) 中\n\n3. **当前节点判断**\n - `if(!l && !r && root.val === 0) return null;` - 如果左右子树都被删除且当前节点值为0,则删除当前节点\n - 否则更新当前节点的左右子树引用并返回当前节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {TreeNode}\n */\nvar pruneTree = function(root) {\n if(!root) return root;\n if(root && !root.left && !root.right) return root.val === 0 ? null : root;\n\n let l = pruneTree(root.left),r = pruneTree(root.right);\n if(!l && !r && root.val === 0) return null;\n root.left = l;\n root.right = r;\n return root;\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**: O(n),需要访问每个节点一次\n- **空间复杂度**: O(h),h为树的高度,递归调用栈的深度\n- **关键点**: 后序遍历确保了从叶子节点开始处理,逐步向上删除符合条件的节点","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null],"haoyuliaocurb":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073435345","body":"```\n// Time Complexity: O(max(num.length, k))\n// Space Complexity: O(max(num.length, k))\n\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(num, k) {\n const num1 = num;\n const num2 = String(k).split('').map(v => Number(v));\n const sum = [];\n\n for (let i = 0; i < Math.max(num1.length, num2.length); i += 1) {\n const s = (num1[num1.length - 1 - i] ?? 0) + (num2[num2.length - 1 - i] ?? 0) + (sum[i] ?? 0);\n\n sum[i] = s % 10;\n sum[i + 1] = (s - (s % 10)) / 10;\n }\n\n if (sum[sum.length - 1] === 0) sum.pop();\n sum.reverse();\n\n return sum;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078842293","body":"【解題方向】\n\n第一想法:對於每一個 s[i] 都遍歷一次找最近的 c,Time Complexity 為 O(n^2) \n\n第二想法:先遍歷一遍 s 找到所有的 c,然後從所有的 c 開始向兩邊走\n\t=> 不過想到如何記錄狀態就覺得太複雜,而且可能最糟情況還是 Time Complexity 為 O(n^2) \n\n第三想法:看了提示,想到正向遍歷、反向遍歷一次,記錄 s[i] 與左右兩邊的 c 的最小距離\n\t=> 由於題目保證至少有一個 s 中至少有一個 c,對於每個 s[i],其左或右必然會有一個 c\n\n【程式碼】\n```\n// Time Complexity: O(n), n = s.length;\n// Space Complexity: O(n), n = s.length;\n\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const chars = s.split('');\n const res = new Array(chars.length).fill(Infinity);\n\n let leftTargetCharIndex = -1;\n for (let i = 0; i < chars.length; i += 1) {\n if (chars[i] === c) leftTargetCharIndex = i;\n if (leftTargetCharIndex > -1) {\n res[i] = Math.min(res[i], Math.abs(leftTargetCharIndex - i));\n }\n }\n\n let rightTargetCharIndex = -1;\n for (let i = chars.length - 1; i > -1; i -= 1) {\n if (chars[i] === c) rightTargetCharIndex = i;\n if (rightTargetCharIndex > -1) {\n res[i] = Math.min(res[i], Math.abs(rightTargetCharIndex - i));\n }\n }\n\n return res;\n};\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089452516","body":"1. 第一個直覺是用 recursion 來解題,不過過程中會遇到很多 edge case 沒有考慮到而 error thrown\n2. 後來改用 stack 來實踐,也很清楚,不過需要搞懂什麼應該被放進 stack,以及 pop and push 的時機\n\n```\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * Recursive version of decodeString\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const helper = (str, index) => {\n let result = '';\n let num = 0;\n \n while (index < str.length) {\n const char = str[index];\n \n if (char >= '0' && char <= '9') {\n num = num * 10 + parseInt(char);\n index++;\n } else if (char === '[') {\n // Recursively decode the content inside brackets\n const [decodedStr, newIndex] = helper(str, index + 1);\n result += decodedStr.repeat(num);\n num = 0; // Reset number after using it\n index = newIndex;\n } else if (char === ']') {\n // End of current bracket section - return result and current index\n return [result, index + 1];\n } else {\n // Regular character\n result += char;\n index++;\n }\n }\n \n return [result, index];\n };\n \n return helper(s, 0)[0];\n};\n\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let currentStr = '';\n let currentNum = 0;\n \n for (let i = 0; i < s.length; i++) {\n const char = s[i];\n \n if (char >= '0' && char <= '9') {\n currentNum = currentNum * 10 + parseInt(char);\n } else if (char === '[') {\n // Push current state to stack\n stack.push([currentStr, currentNum]);\n currentStr = '';\n currentNum = 0;\n } else if (char === ']') {\n // Pop from stack and decode\n const [prevStr, num] = stack.pop();\n currentStr = prevStr + currentStr.repeat(num);\n } else {\n // Regular character\n currentStr += char;\n }\n }\n \n return currentStr;\n};\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091467280","body":"透過第二個 stack 倒轉第一個 in-stack 的順序,以達到 FIFO 的效果\n```\n// Time Complexity: O(1) for push, pop, peek, empty;\n// Space Complexity: O(n)\n\nclass MyQueue {\n constructor() {\n this.inStack = [];\n this.outStack = [];\n }\n\n /** \n * @param {number} x\n * @return {void}\n */\n push(x) {\n this.inStack.push(x);\n }\n\n /**\n * @return {number}\n */\n pop() {\n if (!this.outStack.length) {\n this.pushToOutStack();\n }\n\n return this.outStack.pop();\n }\n\n /**\n * @return {number}\n */\n peek() {\n if (!this.outStack.length) {\n this.pushToOutStack();\n }\n\n return this.outStack[this.outStack.length - 1];\n }\n\n /**\n * @return {boolean}\n */\n empty() {\n return this.peek() === undefined;\n }\n\n pushToOutStack() {\n while (this.inStack.length) {\n this.outStack.push(this.inStack.pop());\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094426027","body":"// Time Complexity: O(n);\n// Space Complexity: O(n);\n\n```\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const sortedArr = [...arr].sort((a, b) => a - b);\n let counts = {};\n let chunkAmount = 0;\n\n for (let i = 0; i < arr.length; i += 1) {\n counts[arr[i]] = (counts[arr[i]] ?? 0) + 1;\n counts[sortedArr[i]] = (counts[sortedArr[i]] ?? 0) - 1;\n\n if (Object.values(counts).every((value) => value === 0)) {\n chunkAmount += 1;\n }\n }\n\n return chunkAmount;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095908728","body":"```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\nvar rotateRight = function (head, k) {\n if (!head || !head.next) return head;\n\n let length = 0;\n let cur = head;\n\n while (cur) {\n cur = cur.next;\n length += 1;\n }\n\n k = k % length;\n let left = head;\n let right = head;\n\n while (right.next) {\n if (k <= 0) left = left.next;\n right = right.next;\n k -= 1;\n }\n\n right.next = head; // Handle the case when left and right point to the same node.\n let res = left.next;\n left.next = null;\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3102283858","body":"建立一個 dummy 連結在 head 之前,便可以將 head 當作中間節點處理。每次互換節點會牽涉四個節點,pre, cur, next, next.next,其中 pre 的初始值為 dummy,因此在每個迴圈保證有值,而真正要互換的 cur, next,其兩有值為 while 迴圈繼續的必要條件,next.next 為 null 則沒關係。\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n const dummy = { val: 0, next: head };\n\n let pre = dummy;\n let cur = pre.next;\n let next = cur?.next;\n\n while (cur && next) {\n pre.next = next;\n cur.next = next.next;\n next.next = cur;\n\n [pre, cur, next] = [cur, cur.next, cur.next?.next];\n }\n\n return dummy.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105649705","body":"# 想法\n轉換成 Height Balanced Binary Search Tree 會需要進行 Binary Search,考慮到單向鏈錶不方便直接存取 node,因此直接將鏈錶轉成數組,並直接以數組配合 Binary Search 遞迴建立樹。\n\n```\n\n// Time Complexity: O(n);\n// Space Complexity: O(n);\n\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if (head === null) return null;\n\n const dummy = new ListNode(0, head);\n const arr = [];\n\n let tail = dummy;\n\n while (tail) {\n const next = tail.next;\n next && arr.push(next.val);\n tail = next;\n }\n\n const inner = (l, r) => {\n if (l > r) return null;\n if (l === r) return new TreeNode(arr[r]);\n\n const m = Math.ceil((l + r) / 2);\n\n return new TreeNode(arr[m], inner(l, m - 1), inner(m + 1, r));\n };\n\n return inner(0, arr.length - 1);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112936097","body":"## 思考方向\n### 雙指針\n用兩個指針分別從 headA, headB 開始走,走到盡頭換到另一個 head。過程中若指向同一個點則為兩鏈錶的交點,若皆遍歷一遍後無交點,則兩鏈錶無相交。\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function(headA, headB) {\n let pointerA = headA;\n let pointerB = headB;\n let switchCounts = 0;\n\n while (switchCounts < 3) {\n if (pointerA === pointerB) return pointerA;\n\n if (pointerA?.next) {\n pointerA = pointerA.next;\n } else {\n switchCounts += 1;\n pointerA = headB;\n }\n\n if (pointerB?.next) {\n pointerB = pointerB.next;\n } else {\n switchCounts += 1;\n pointerB = headA;\n }\n }\n\n return null;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116343077","body":"## 解題方向\n- 快慢指針法\n\n## Edge Cases\n- 當快指針走到 null 代表沒有環\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n let fast = head;\n let slow = head;\n\n do {\n if (fast === null) return null;\n\n fast = fast?.next?.next ?? null;\n slow = slow?.next ?? null;\n } while (fast !== slow);\n\n fast = head;\n\n while (fast !== slow) {\n fast = fast?.next ?? null;\n slow = slow?.next ?? null;\n }\n\n return fast;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121584769","body":"## 解題方向\n- 看到 FISO 的第一個想法是用 Queue,搭配 hash 也可以達到 get O(1) 的要求,不過 put 更新既有的值,就沒辦法 O(1)。\n若是 put 更新既有的值要 O(1),還是需要使用鏈表。\n- 中間有一度 debug 卡關,主要是原本在 put 時無論如何都先把既有的 node 刪掉再新增,但這可能造成一些 state 更新上的錯誤,後來簡化為直接移動 node 才 AC。\n\n```\n// Time Complexity: O(1) for LRUCache.prototype.get, put\n// Space Complexity: O(n)\n\nfunction ListNode(key, val) {\n this.key = key;\n this.val = val;\n this.next = null;\n this.pre = null;\n }\n\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.length = 0;\n this.head = new ListNode();\n this.tail = new ListNode();\n this.head.next = this.tail;\n this.tail.pre = this.head;\n this.map = {};\n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n const node = this.map[key];\n\n if (node !== undefined) {\n this.appendToTail(this.remove(node));\n return node.val\n };\n\n return -1;\n};\n\n/** \n * @param {number} key \n * @param {number} val\n * @return {void}\n */\nLRUCache.prototype.put = function(key, val) {\n const node = this.map[key];\n\n if (node !== undefined) {\n node.val = val;\n this.appendToTail(this.remove(node));\n } else {\n if (this.length === this.capacity) {\n const old = this.head.next;\n delete this.map[old.key];\n this.length -= 1;\n this.remove(old);\n }\n\n const node = new ListNode(key, val);\n this.map[key] = node;\n this.length += 1;\n this.appendToTail(node);\n }\n};\n\nLRUCache.prototype.appendToTail = function(node) {\n if (node.pre) node.pre.next = node.next;\n if (node.next) node.next.pre = node.pre;\n this.tail.pre.next = node;\n node.pre = this.tail.pre;\n node.next = this.tail;\n this.tail.pre = node;\n}\n\nLRUCache.prototype.remove = function(node) {\n node.pre.next = node.next;\n node.next.pre = node.pre;\n node.pre = null;\n node.next = null;\n\n return node;\n}\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123752698","body":"## 解題方向\n### DFS\n- 需注意當 helper 的 params root 為 null 時,應回傳 0\n\n```\n// Time Complexity: O(n), n for numbers of nodes.\n// Space Complexity: O(h), h for the max depth of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n const helper = (root) => {\n if (!root) return 0;\n if (!root.left && !root.right) return 1;\n return Math.max(helper(root.left), helper(root.right)) + 1;\n };\n\n return helper(root);\n};\n```\n\n### Layer Iteration\n- 由於 stack 的起始值就有一個 root node,因此要先處理 root 為 null 的狀況\n\n```\n// Time Complexity: O(n), n for numbers of nodes.\n// Space Complexity: O(w), w for the max numbers of nodes in the same layer of tree.\n\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if (!root) return 0;\n\n const stack = [{ node: root, depth: 1 }];\n let maxDepth = 0;\n\n while (stack.length) {\n const { node, depth } = stack.shift();\n if (node.left) stack.push({ node: node.left, depth: depth + 1 });\n if (node.right) stack.push({ node: node.right, depth: depth + 1 });\n maxDepth = Math.max(maxDepth, depth);\n }\n\n return maxDepth;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125050709","body":"## 解題方向\n- 須理解兩棵樹一樣的意思是,其遍歷的結果會一樣,又題目有提到左右節點位置不同也不行,因此可以用多個遍歷結果來確認,或者可以將中間的空節點印出。可優化空間是不需要若於遍歷過程比較兩棵樹的節點,就不需要儲存遍歷結果。\n\n```javascript\n// Time Complexity: O(m + n), m, n are numbers of two tree nodes respectively.\n// Space Complexity: O(m + n)\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} p\n * @param {TreeNode} q\n * @return {boolean}\n */\nvar isSameTree = function(p, q) {\n const iterate = (root) => {\n const arr = [];\n const stack = [root];\n\n while (stack.length) {\n const node = stack.shift();\n\n arr.push(node?.val);\n\n if (node?.left || node?.right) {\n stack.push(node?.left);\n stack.push(node?.right);\n }\n }\n\n return arr;\n };\n\n return JSON.stringify(iterate(p)) === JSON.stringify(iterate(q));\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3131156971","body":"## 解題方向\n- 需要計算所有從 root 走到 leaf 的路線,這可以用 Recursion 來完成(回溯)\n- 用一個數字來紀錄 state:增加位數為「runningNumber * 10 + node.val」,減去位數為「Math.floor(runningNumber / 10)」\n\n```javascript\n// Time Complexity: O(n), n is the number of the tree nodes\n// Space Complexity: O(d), d is the depth of the tree\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root) {\n let sum = 0;\n let runningNumber = 0;\n\n const inner = (root) => {\n if (root) {\n runningNumber = runningNumber * 10 + root.val;\n\n if (!root.left && !root.right) {\n sum += runningNumber;\n } else {\n inner(root.left);\n inner(root.right);\n }\n\n runningNumber = Math.floor(runningNumber / 10);\n }\n };\n\n inner(root);\n\n return sum;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134845036","body":"## 解題方向\n- 可以使用 DFS 或 BFS 來解題\n- DFS 記錄最深深度的第一個節點數值,深度可作為參數於每次遞迴時傳遞\n- BFS 紀錄每層第一個節點數值\n- 題目保證 root 一定不為 null\n\n### DFS\n```javascript\n// Time Complexity: O(n), n is the number of tree nodes.\n// Space Complexity: O(d), d is the max depth of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let maxDepth = 0;\n let res = null;\n\n const dfs = (root, depth) => {\n if (depth > maxDepth) {\n maxDepth = depth;\n res = root.val;\n }\n\n root.left && dfs(root.left, depth + 1);\n root.right && dfs(root.right, depth + 1);\n };\n\n dfs(root, 1);\n\n return res;\n};\n```\n\n### BFS\n```javascript\n// Time Complexity: O(n), n is the number of tree nodes.\n// Space Complexity: O(w), w is the max width of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n const stack = [[root]];\n let res = null;\n\n while (stack.length) {\n const nodes = stack.pop();\n\n res = nodes[0].val;\n\n const nextNodes = [];\n\n for (const node of nodes) {\n node.left && nextNodes.push(node.left);\n node.right && nextNodes.push(node.right);\n }\n\n nextNodes.length && stack.push(nextNodes);\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138426787","body":"## 解題方向\n* 使用 DNS 前序遍歷,在 deserialize 時透過遞迴建立樹會較 BFS 容易。\n* 使用原生的 JSON.stringify and JSON.parse 來轉換 array 及 string\n* 優化方向:優化 Space Complexity 至 O(h),h 為樹的高度\n * 能直接產生 serialized string 而非在最後轉化\n * 一邊 deserialize 需要的 string 部分,而不需要在一開始開一個 array 儲存\n\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n// Time Complexity: O(n), n is number of tree nodes.\n// Space Complexity: O(n), n is number of tree nodes.\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n const preOrder = [];\n const dns = (root) => {\n preOrder.push(root?.val);\n if (root) {\n dns(root.left);\n dns(root.right);\n }\n };\n dns(root);\n\n return JSON.stringify(preOrder);\n};\n\n// Time Complexity: O(n), n is number of tree nodes.\n// Space Complexity: O(n), n is number of tree nodes.\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n const preOrder = JSON.parse(data);\n\n if (preOrder[0] === null || preOrder[0] === undefined) return preOrder[0];\n\n const createNode = () => {\n const val = preOrder.shift();\n\n if (val === null) return null;\n\n const node = new TreeNode(val);\n node.left = createNode();\n node.right = createNode();\n return node;\n };\n\n return createNode();\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144639245","body":"## 解題方向\n- 不一樣的遍歷方式會有差嗎? => 由於打算取值後再排序,因此沒差\n- 如何儲存最後的輸出最省力 => 用 hashmap\n\n```javascript\n// Time Complexity: O(nlogn), n is the number of tree.\n// Space Complexity: O(n), n is the number of tree.\n\n// /**\n// * Definition for a binary tree node.\n// * function TreeNode(val, left, right) {\n// * this.val = (val===undefined ? 0 : val)\n// * this.left = (left===undefined ? null : left)\n// * this.right = (right===undefined ? null : right)\n// * }\n// */\n// /**\n// * @param {TreeNode} root\n// * @return {number[][]}\n// */\nvar verticalTraversal = function(root) {\n const map = {};\n\n const traverse = (root, row, col) => {\n if (!root) return;\n\n if (!map[col]) {\n map[col] = [];\n }\n\n map[col].push([row, root.val]);\n traverse(root.left, row + 1, col - 1);\n traverse(root.right, row + 1, col + 1);\n };\n\n traverse(root, 0, 0);\n\n const keys = Object.keys(map).sort((a, b) => a - b);\n\n const res = keys.map((k) => {\n const arr = map[k];\n\n return arr.sort(([rowA, valA], [rowB, valB]) => {\n if (rowA === rowB) return valA - valB;\n return rowA - rowB;\n }).map(([,val]) => val);\n });\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146092009","body":"## 解題方向\n- 遍歷 nums 時使用 hashmap 來記錄曾出現過的數字及其 index,並看 hashmap 是否記錄 target - nums[i] 是否曾出現過\n- 可以特別注意題目要求同個元素不能被使用兩次,所以應將配對到的元素移出 hashmap(不過因為題目也說只有一組數字為答案,所以不做也沒關係)\n\n```javascript\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(1) \n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n const map = {};\n const res = [];\n\n for (let i = 0; i < nums.length; i += 1) {\n const num = nums[i];\n\n if (map[target - num] !== undefined) {\n res.push(i, map[target - num]);\n delete map[target - num];\n } else {\n map[num] = i;\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3146907342","body":"## 解法\n- 第一個想法是遍歷後得到 num 與其 frequency 的 hashmap,將其轉成 array 後排序並取前 k 者\n- 看了題解後可優化部分是,由於題目允許回傳值不需要依據 frequency 排序,因此可將原解法 sort 的部分改成 quick selection,將平均時間複查度從 O(nlogn) 將至 O(n)\n```javascript\n// Time Complexity: O(nlogn), n is nums.length.\n// Space Complexity: O(n), n is nums.length.\n\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function (nums, k) {\n const map = {};\n\n for (const num of nums) {\n map[num] = (map[num] ?? 0) + 1;\n }\n\n return Object.entries(map)\n .sort(([numA, freqA], [numB, freqB]) => {\n return freqB - freqA;\n })\n .filter((_, i) => i < k)\n .map(([num]) => Number(num));\n};\n```\n\n## 解法\n- 找 max frequent num\n- 回傳 left, right index range\n- 需要考慮當兩個 num frequency 相等時,應保留 range 較小者!\n```javascript\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(n), n is nums.length.\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findShortestSubArray = function (nums) {\n let maxFreqNum = nums[0];\n const map = {};\n\n for (let i = 0; i < nums.length; i += 1) {\n const num = nums[i];\n const { freq, left, right } = map[num] ?? { freq: 0, left: i, right: i };\n map[num] = {\n freq: freq + 1,\n left: i < left ? i : left,\n right: i > right ? i : right,\n };\n\n if (map[num].freq > map[maxFreqNum].freq) {\n maxFreqNum = num;\n } else if (map[num].freq === map[maxFreqNum].freq) {\n if (\n map[num].right - map[num].left <\n map[maxFreqNum].right - map[maxFreqNum].left\n ) {\n maxFreqNum = num;\n }\n }\n }\n\n const { left, right } = map[maxFreqNum];\n\n return right - left + 1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149617346","body":"```javascript\n// Time Complexity: O(n^2), n is points.length.\n// Space Complexity: O(n), n is points.length.\n\n/**\n * @param {number[][]} points\n * @return {number}\n */\nfunction numberOfBoomerangs(points) {\n const n = points.length;\n let ans = 0;\n \n for (let i = 0; i < n; i++) {\n const distanceMap = {};\n \n for (let j = 0; j < n; j++) {\n const dist = Math.pow(points[i][0] - points[j][0], 2) + Math.pow(points[i][1] - points[j][1], 2);\n distanceMap[dist] = (distanceMap[dist] ?? 0) + 1;\n }\n \n for (const count of Object.values(distanceMap)) {\n ans += count * (count - 1);\n }\n }\n \n return ans;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153048738","body":"## 解法\n- 經典的滑動視窗題目,與用 hashmap 紀錄字元的出現次數,並於迴圈中判斷下個字元是否已出現過,無則加入,有則刪除。\n- 需要特別注意\n- (1) 迴圈的邊界條件應為 right < s.length - 1,不然會讓 right 跑到 s.length\n- (2) 應先刪掉 map[s[left]] 再 left++\n\n```javascript\n// Time Complexity: O(n), n is s.length.\n// Space Complexity: O(m), m is types of characters in s.\n\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n if (!s.length) return 0;\n \n const chars = new Map();\n chars.set(s[0], 1);\n\n let max = 1;\n let left = 0;\n let right = 0;\n\n while (right < s.length - 1) {\n const cond = !chars.has(s[right + 1]);\n if (!chars.has(s[right + 1])) {\n right++;\n chars.set(s[right], 1);\n } else {\n chars.delete(s[left]);\n left++;\n }\n\n const number = right - left + 1;\n if (number > max) max = number;\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160434225","body":"## 解法\n- 一開始分析方向錯了,以為每個 substring 間不可重疊\n- 之後想到的是用 hashmap 存可能 substring 的結果,再遍歷一次,但是時間複雜度為階乘\n- 最後則是直接遍歷,再驗證 substring 是否正確,然而需考慮 words 的 element 是否會重複\n\n```javascript\n// Time Complexity: O(n * m * k), n is s.length, m is words[0].length, k is words.lenght.\n// Space Complexity: O(m).\n\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n const defaultMap = (() => {\n const m = {};\n for (const word of words) {\n m[word] = (m[word] ?? 0) + 1;\n }\n return m;\n })();\n let map = JSON.parse(JSON.stringify(defaultMap));\n const wordLength = words[0].length;\n const substringLength = wordLength * words.length;\n\n const validate = (substring) => {\n let cur = 0;\n map = JSON.parse(JSON.stringify(defaultMap));\n\n while (cur < substring.length) {\n const target = substring.substring(cur, cur + wordLength);\n if (map[target]) {\n map[target] -= 1;\n cur += wordLength;\n } else return false;\n }\n\n return true;\n };\n\n const res = []\n\n for (let i = 0; i < s.length - substringLength + 1; i++) {\n const substring = s.substring(i, i + substringLength);\n if (validate(substring)) res.push(i);\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3164019442","body":"## 解法\n- 一開始漏看了連續短數組的條件,之後想到暴力法,也有個感覺優化必定涉及數學技巧,因此直接看題解\n- 需要理解兩個技巧:負數取模 floorMod 和 map.set(0, -1) 以處理欲從 sum[i] - sum[j] 計算 i 至 j 範圍時,當 j 為 0 遇到的計算問題\n\n```javasciprt\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(min(n, k))\n\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar floorMod = function (a, b) {\n return ((a % b) + b) % b;\n};\n\nfunction minSubarray(nums, k) {\n var map = new Map();\n map.set(0, -1);\n var res = nums.length;\n var target = 0;\n var currSum = 0;\n for (let i = 0; i < nums.length; i++) {\n target += nums[i];\n }\n target = target % k;\n if (target === 0) return 0;\n for (let i = 0; i < nums.length; i++) {\n currSum = (nums[i] + currSum) % k;\n\n var prevSum = floorMod(currSum - target, k);\n if (map.has(prevSum)) {\n res = Math.min(res, i - map.get(prevSum));\n }\n map.set(currSum, i);\n }\n return res === nums.length ? -1 : res;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168248088","body":"## 解法\n- 窮舉前面的例子就可以得到規律:先處理只有一個 node 的 edge case,當 fast.next?.next 不為 null,即存在下下個 node 的情況下移動快慢指針,不然慢指針的下個 node 即是中間節點。\n```javascript\n// 1 => 1\n\n// 1, 2 => 2 => slow 1, fast 2\n// 1, 2, 3 => 2 => slow 1, fast 2\n\n// 1, 2, 3, 4 => 3 => slow 2, fast 4\n// 1, 2, 3, 4, 5 => 3 => slow 2, fast 4\n\n// 1, 2, 3, 4, 5, 6 => 4\n// 1, 2, 3, 4, 5, 6, 7 => 4\n\n// 1, 2, 3, 4, 5, 6, 7, 8 => 5\n// 1, 2, 3, 4, 5, 6, 7, 8, 9 => 5\n```\n\n```javascript\n// Time Complexity: O(n), n is linked list length,\n// Space Complexity: O(1)\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n if (!head.next) return head;\n\n let slow = head;\n let fast = head.next;\n\n while (fast.next?.next) {\n slow = slow.next;\n fast = fast.next.next;\n };\n\n return slow.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170547569","body":"## 解法\n- 一開始沒注意到 Space Complexity O(1) 的要求,因此用 map 來記錄曾遍歷過的數字,並使用 nums.splice 來原地刪除重複元素\n- 若限制 Space Complexity 為 O(1),則需要如題解用快慢指針來做\n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n let slow = 0;\n let fast = 0;\n\n while (fast < nums.length) {\n if (nums[fast] !== nums[slow]) {\n slow++;\n nums[slow] = nums[fast];\n }\n \n fast++;\n }\n\n return slow + 1;\n};\n\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n const map = {};\n let res = 0;\n let i = nums.length - 1;\n\n while (i >= 0) {\n const num = nums[i];\n\n if (map[num]) {\n nums.splice(i, 1);\n } else {\n map[num] = 1;\n res += 1;\n };\n\n i--;\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172259657","body":"## 解法\n- 經典的二分查找,需注意沒有找到 target 的 edge case\n\n```javascript\n// Time Complexity: O(logn), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let l = 0;\n let r = nums.length - 1;\n let m = -1;\n\n while (l <= r) {\n m = l + Math.floor((r - l) / 2);\n\n if (nums[m] === target) return m;\n else if (nums[m] > target) r = m - 1;\n else l = m + 1;\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173778506","body":"## 解法\n- 第一泡茶的確是暴力解,之後會想到 max heap,但每次 push 仍需要耗費 O(logn)\n- 有想過使用 monotonic stack 來做,但卡沒仔細想就覺得可能無法正確排除 sliding window 外的元素而作罷,而這其實可以靠題解中的 shift 來完成,又因為不是嚴格遞增棧,所以遇到相等數值時,前者仍會被保留,而確保 shift 的操作都是正確的\n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(k)\n\nvar maxSlidingWindow = function (nums, k) {\n const res = [];\n const dequeue = new Dequeue([]);\n\n for (let i = 0; i < k - 1; i++) {\n dequeue.push(nums[i]);\n }\n\n for (let i = k - 1; i < nums.length; i++) {\n dequeue.push(nums[i]);\n res.push(dequeue.max());\n dequeue.shift(nums[i - k + 1]);\n }\n\n return res;\n};\n\nclass Dequeue {\n constructor(nums) {\n this.list = nums; // Should be implemented as a linked list to make time complexity of dequeue.shift() as O(1).\n }\n\n push(val) {\n const nums = this.list;\n\n while (nums[nums.length - 1] < val) {\n nums.pop();\n }\n\n nums.push(val);\n }\n\n shift(val) {\n let nums = this.list;\n\n if (nums[0] === val) {\n nums.shift();\n }\n }\n\n max() {\n return this.list[0];\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178234382","body":"## 解法\n- 第一泡茶,可以透過紀錄一個人信任及被信任的人數來解題。其中可以不斷紀錄目前被信任人數最高者方便最後判斷是否為法官\n- 看了題解後發現可以用圖來解,之後補上\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n const trustFroms = new Array(n).fill(0);\n const trustTos = new Array(n).fill(0);\n let maybeJudge = { index: 0, trustTo: 0 };\n\n for (const t of trust) {\n const [from, to] = [t[0] - 1, t[1] - 1];\n trustFroms[from]++;\n trustTos[to]++;\n if (trustTos[to] > maybeJudge.trustTo) maybeJudge = { index: to, trustTo: trustTos[to] };\n }\n\n if (maybeJudge.trustTo === n - 1) {\n if (trustFroms[maybeJudge.index] === 0) return maybeJudge.index + 1;\n }\n\n return -1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3184149014","body":"```javascript\n// Time Complexity: O(v + e)\n// Space Complexity: O(v + e)\n\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nconst possibleBipartition = (n, dislikes) => {\n const graph = new Array(n + 1).fill().map(() => new Array())\n const colors = new Array(n + 1).fill(-1);\n\n for (const [a, b] of dislikes) {\n graph[a].push(b);\n graph[b].push(a);\n }\n\n const dfs = (cur, color = 0) => {\n colors[cur] = color;\n\n for (const nxt of graph[cur]) {\n if (colors[nxt] !== -1 && colors[nxt] === color) return false;\n if (colors[nxt] === -1 && !dfs(nxt, color ^ 1)) return false;\n }\n\n return true;\n };\n\n for (let i = 0; i < n + 1; i++) {\n if (colors[i] === -1 && !dfs(i, 0)) return false;\n }\n\n return true;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186799518","body":"```javascript\n// Time Complexity: O(n + e), e is sum of beforeItems.flat().length\n// Space Complexity: O(n + e)\n\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n const topologicalSort = (items, indegree, neighbors) => {\n const queue = [];\n const result = [];\n \n for (const item of items) {\n if (indegree[item] === 0) {\n queue.push(item);\n }\n }\n \n while (queue.length > 0) {\n const current = queue.shift();\n result.push(current);\n \n const currentNeighbors = neighbors[current] || [];\n for (const neighbor of currentNeighbors) {\n indegree[neighbor]--;\n if (indegree[neighbor] === 0) {\n queue.push(neighbor);\n }\n }\n }\n \n return result;\n };\n \n let maxGroupId = m;\n for (let item = 0; item < n; item++) {\n if (group[item] === -1) {\n group[item] = maxGroupId;\n maxGroupId++;\n }\n }\n \n const itemIndegree = Array.from({length: n}, () => 0);\n const groupIndegree = Array.from({length: maxGroupId}, () => 0);\n const itemNeighbors = Array.from({length: n}, () => []);\n const groupNeighbors = Array.from({length: maxGroupId}, () => []);\n const groupItems = Array.from({length: maxGroupId}, () => []);\n \n for (let item = 0; item < n; item++) {\n groupItems[group[item]].push(item);\n }\n \n for (let item = 0; item < n; item++) {\n const dependencies = beforeItems[item] || [];\n \n for (const dependency of dependencies) {\n if (group[dependency] !== group[item]) {\n groupIndegree[group[item]]++;\n groupNeighbors[group[dependency]].push(group[item]);\n } else {\n itemIndegree[item]++;\n itemNeighbors[dependency].push(item);\n }\n }\n }\n \n const groups = Array.from({length: maxGroupId}, (_, i) => i);\n const sortedGroups = topologicalSort(groups, groupIndegree, groupNeighbors);\n \n if (sortedGroups.length !== maxGroupId) {\n return [];\n }\n \n const result = [];\n \n for (const groupId of sortedGroups) {\n const items = groupItems[groupId];\n const sorteditems = topologicalSort(items, itemIndegree, itemNeighbors);\n \n if (sorteditems.length !== items.length) {\n return [];\n }\n \n result.push(...sorteditems);\n }\n \n return result;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190479297","body":"```javascript\n// Time Complexity: O(n), n is moves.length\n// Space Complexity: O(1)\n\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let [x, y] = [0, 0];\n\n for (let i = 0; i < moves.length; i++) {\n const action = moves.substring(i, i + 1);\n if (action === 'R') x++;\n if (action === 'L') x--;\n if (action === 'U') y++;\n if (action === 'D') y--;\n }\n\n return x === 0 && y === 0;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193447956","body":"## 題解\n- 一開始使用 Array + Sort 的方法實作,不過由於 Time Complexity 為 O(n^2logn),在資料量 1 <= n <= 10^5 的條件下,會沒辦法 AC\n- 需要將資料結構改成 Min Heap 來降低時間複雜度\n\n```javascript\n// Min Heap\n// Time Complexity: O(nlogn)\n// Space Complexity: O(logn)\n\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function (tasks) {\n const indices = Array.from({ length: tasks.length }, (_, i) => i);\n\n indices.sort((a, b) => { return tasks[a][0] - tasks[b][0] });\n\n const minHeap = new PriorityQueue((a, b) => {\n if (tasks[a][1] !== tasks[b][1]) {\n return tasks[a][1] - tasks[b][1];\n }\n return a - b;\n });\n\n const res = [];\n let time = 0;\n let i = 0;\n\n while (!minHeap.isEmpty() || i < tasks.length) {\n while (i < tasks.length && tasks[indices[i]][0] <= time) {\n minHeap.enqueue(indices[i]);\n i++;\n }\n\n if (minHeap.size() === 0) {\n time = tasks[indices[i]][0];\n } else {\n const nextIndex = minHeap.dequeue();\n time += tasks[nextIndex][1];\n res.push(nextIndex);\n }\n }\n\n return res;\n};\n\n// Array + Sort\n// Time Complexity: O(n^2logn)\n// Space Complexity: O(n)\n\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n tasks = tasks.map((t, i) => [...t, i]);\n tasks.sort((a, b) => a[0] === b[0] ? a[2] - b[2] : a[0] - b[0]);\n\n let i = 0;\n let curTime = 0;\n const queue = [];\n const res = [];\n\n while (i < tasks.length || queue.length) {\n while (i < tasks.length && tasks[i][0] <= curTime) {\n queue.push(tasks[i]);\n queue.sort((a, b) => a[1] === b[1] ? a[2] - b[2] : a[1] - b [1]);\n i++;\n }\n\n if (!queue.length) {\n curTime = tasks[i][0];\n } else {\n const curTask = queue.shift();\n res.push(curTask[2]);\n curTime += curTask[1];\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194091917","body":"```javascript\n// Time Complexity: O(1)\n// Space Complexity: O(1)\n\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n const getMinSum = (time, carry) => {\n let [hour, min] = time.split(':').map(s => Number(s));\n const remainer = min % 15;\n const q = (min - remainer) / 15;\n\n if (!carry) {\n return (hour * 60) + min;\n } else if (remainer && carry === 'ceil') {\n return (hour * 4 + q + 1) * 15;\n } else {\n return (hour * 4 + q) * 15;\n }\n };\n\n let [loginMinSum, logoutMinSum] = [getMinSum(loginTime, 'ceil'), getMinSum(logoutTime, 'floor')];\n\n if (getMinSum(loginTime) > getMinSum(logoutTime)) {\n logoutMinSum += 24 * 60;\n }\n\n return Math.max((logoutMinSum - loginMinSum) / 15, 0)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3196057927","body":"## 題解\n- 原本想針對三種狀況,直接找 a 和 b 中最符合的 char 來做計算,但會發現很多 edge case 要考量,要一直修正\n- 看題解之後,在有限的解空間中(頂多常數 26),枚舉的確是一個簡單、可讀性更好的做法\n\n```javascript\n// Time Complexity: O(n + m), n is a.length, m is b.length\n// Space Complexity: O(26)\n\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n const createCounter = (str) => {\n const counter = {};\n\n for (let i = 0; i < 26; i++) {\n counter[String.fromCharCode(97 + i)] = 0;\n }\n\n for (const char of str) {\n counter[char]++;\n }\n return counter;\n };\n \n const ca = createCounter(a);\n const cb = createCounter(b);\n\n const greaterCost = (ca, cb) => {\n let ans = Infinity;\n\n for (let i = 1; i < 26; i++) {\n let count = 0;\n \n for (let j = 0; j < i; j++) {\n count += ca[String.fromCharCode(97 + j)];\n }\n \n for (let j = i; j < 26; j++) {\n count += cb[String.fromCharCode(97 + j)];\n }\n ans = Math.min(ans, count);\n }\n return ans;\n };\n \n const equalCost = (ca, cb) => {\n let ans = Infinity;\n for (let i = 0; i < 26; i++) {\n const char = String.fromCharCode(97 + i);\n ans = Math.min(ans, a.length + b.length - ca[char] - cb[char]);\n }\n return ans;\n };\n \n return Math.min(\n greaterCost(ca, cb),\n greaterCost(cb, ca),\n equalCost(ca, cb)\n );\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199125049","body":"## 題解\n- 直覺就是用快速排序來做,不過實踐上,這次發現 partition 有兩種方法可以做:hoarePartition、lomutoPartition。其中 lomutoPartition 普遍認為較簡單,但因為交換數值的次數較多,會遇到 TLE,因此此題需用 hoarePartition 來做。\n\n```javascript\nconst lomutoPartition = (nums, left, right) => {\n const pivot = nums[right];\n let i = left - 1;\n\n for (let j = left; j < right; j++) {\n if (nums[j] <= pivot) {\n i++;\n [nums[i], nums[j]] = [nums[j], nums[i]];\n }\n }\n\n i++;\n [nums[i], nums[right]] = [nums[right], nums[i]];\n\n return i;\n};\n\nconst hoarePartition = (nums, left, right) => {\n const p = left + ((right - left) >>> 1);\n const pivot = nums[p];\n let [i, j] = [left, right];\n\n while (i <= j) {\n while (nums[i] < pivot) i++;\n while (nums[j] > pivot) j--;\n if (i <= j) {\n [nums[i], nums[j]] = [nums[j], nums[i]];\n i++;\n j--;\n }\n }\n\n return [i, j];\n};\n\nconst quickSort = (nums, left, right) => {\n // if (left < right) {\n // const p = lomutoPartition(nums, left, right);\n // quickSort(nums, left, p - 1);\n // quickSort(nums, p + 1, right);\n // }\n\n if (left < right) {\n const [i, j] = hoarePartition(nums, left, right);\n quickSort(nums, left, j);\n quickSort(nums, i, right);\n }\n};\n\n// Time Complexity: O(nlogn), n is nums.length\n// Space Complexity: O(logn)\n\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function (nums) {\n quickSort(nums, 0, nums.length - 1);\n return nums;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204182883","body":"```javascript\n// Time Complexity: O(logn)\n// Space Complexity: O(1)\n\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n let res = 0;\n let l = 0;\n let r = x;\n\n while (l <= r) {\n const m = l + ((r - l) >>> 2);\n\n if (m * m > x) {\n r = m - 1;\n } else {\n res = m;\n l = m + 1;\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3209343494","body":"## 題解\n- 可以將這題轉化成「尋找最左邊符合條件者」,即可套入模板\n\n```javascript\n// Time Complexity: O(logn)\n// Space Complexity: O(1)\n\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let [l, r] = [1, n];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 2);\n\n if (isBadVersion(m)) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n };\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3212999531","body":"## 題解\n- 二分:對於每一個元素前者排序,並找到大於 a * 2 者(重複 a * 2 的右界)。需注意是,應在每次加入新元素時,直接尋找其應該插入的位置,而非將整個陣列排序,不然會 TLE。\n\n```javascript\nclass SortedList {\n constructor() {\n this.arr = [];\n }\n\n bisectRight(target) {\n let [l, r] = [0, this.arr.length - 1];\n\n while (l <= r) {\n const mid = l + ((r - l) >>> 1);\n\n if (this.arr[mid] <= target) {\n l = mid + 1;\n } else {\n r = mid - 1;\n }\n }\n\n return l;\n }\n \n push(value) {\n const pos = this.bisectRight(value);\n this.arr.splice(pos, 0, value);\n }\n \n get length() {\n return this.arr.length;\n }\n}\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n const sortedRunningNums = new SortedList();\n sortedRunningNums.push(nums[0]);\n let ans = 0;\n\n for (let i = 1; i < nums.length; i++) {\n ans += (i - sortedRunningNums.bisectRight(nums[i] * 2));\n sortedRunningNums.push(nums[i]);\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216534944","body":"## 題解\n- 依序遍歷 houses,尋找每個 house 與 heater 最近距離,最大者為答案。其中尋找最近距離的實踐,可以使用 bisectRight 來做\n\n```javascript\n// Time Complexity: O(nlog m + mlog m), n is houses.length, m is heaters.length\n// Space Complexity: O(1)\n\nconst getHouseHeaterMinDistance = (house, heaters) => {\n if (heaters.length === 0) return Infinity;\n if (heaters.length === 1) return Math.abs(house - heaters[0]);\n\n let [l, r] = [0, heaters.length - 1];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (house === heaters[m]) {\n return 0;\n } else if (house > heaters[m]) {\n l = m + 1;\n } else {\n r = m - 1;\n };\n }\n\n const leftDistance = l === 0 ? Infinity : house - heaters[l - 1];\n const rightDistance = r === heaters.length - 1 ? Infinity : heaters[l] - house;\n\n return Math.min(leftDistance, rightDistance);\n};\n\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n heaters.sort((a, b) => a - b);\n\n let maxRadius = 0;\n\n for (const house of houses) {\n const minDistance = getHouseHeaterMinDistance(house, heaters);\n maxRadius = Math.max(maxRadius, minDistance);\n }\n\n return maxRadius;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217908480","body":"## 題解\n- 計數二分經典的題目,排序後解空間為 0 至 nums[lnums.ength - 1] - nums[0]\n\n```javascript\n// Time Complexity: O(nlogn)\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a, b) => a - b);\n\n const countDistanceNotGreaterThan = (maxDistance) => {\n let count = 0;\n let l = 0;\n\n for (let r = 1; r < nums.length; r++) {\n while (nums[r] - nums[l] > maxDistance) {\n l++;\n }\n\n count += r - l;\n }\n\n return count;\n };\n\n let [l, r] = [0, nums[nums.length - 1] - nums[0]];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (countDistanceNotGreaterThan(m) >= k) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218836123","body":"## 題解\n- 用二分在解空間 [0, maxElevation] 中尋找答案,對於每個可能的 m,再 dns 尋找可能路徑\n- 需注意因為 dns 時多了 grid[ni][nj] <= elevation 的條件,不需重置 visited[i][j],因為就算從其他點進來該點,依舊會沒辦法繼續走下去,與尋找所有路徑的 dns 略有不同\n\n```javascript\n// Time Complexity: O(n^2logn)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n const n = grid.length;\n\n const maxElevation = (() => {\n let e = 0;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n e = Math.max(e, grid[i][j]);\n }\n }\n return e;\n })();\n\n const canReachBottomRight = (elevation) => {\n const visited = Array.from({ length: n}).map(() => Array.from({ length: n }).map(() => false));\n\n const dns = (i, j) => {\n if (i === n - 1 && j === n - 1) return true;\n\n visited[i][j] = true;\n\n const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];\n\n for (const [di, dj] of directions) {\n const ni = i + di;\n const nj = j + dj;\n\n if (ni >= 0 && ni < n && nj >= 0 && nj < n) {\n if (!visited[ni][nj] && grid[ni][nj] <= elevation) {\n if (dns(ni, nj)) return true;\n }\n }\n }\n\n // visited[i][j] = false;\n\n return false;\n };\n\n if (grid[0][0] <= elevation) return dns(0, 0);\n else return false;\n };\n\n let l = 0;\n let r = maxElevation;\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (canReachBottomRight(m)) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222489820","body":"## 題解\n- 典型的 sliding window 題型\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(1)\n\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n const vowel = 'aeiou';\n let l = 0;\n let r = 0;\n let cur = 0;\n let max = cur;\n\n while (r < s.length) {\n if (vowel.includes(s.charAt(r))) cur++;\n r++;\n\n if (r - l > k) {\n if (vowel.includes(s.charAt(l))) cur--;\n l++;\n }\n\n max = Math.max(max, cur);\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3226683449","body":"```javascript\n// Time Complexity: O(k + maxPts)\n// Space Complexity: O(k + maxPts)\n\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n const dp = Array.from({ length: k + maxPts }).map(() => 0);\n let sum = 0;\n\n for (let i = k; i < k + maxPts; i++) {\n if (i <= n) dp[i] = 1;\n sum += dp[i];\n }\n\n for (let j = k - 1; j >= 0; j--) {\n dp[j] = sum / maxPts;\n sum -= dp[j + maxPts];\n sum += dp[j];\n }\n\n return dp[0];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3234016259","body":"```javascript\n// Time Complexity: O(n), n is s.length\n// Space COmplexity: O(1)\n\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nfunction findAnagrams(s, p) {\n function arraysEqual(arr1, arr2) {\n for (let i = 0; i < 26; i++) {\n if (arr1[i] !== arr2[i]) return false;\n }\n return true;\n }\n\n const result = [];\n const sLen = s.length;\n const pLen = p.length;\n \n if (sLen < pLen) return result;\n \n const pCount = new Array(26).fill(0);\n const windowCount = new Array(26).fill(0);\n \n for (let i = 0; i < pLen; i++) {\n pCount[p.charCodeAt(i) - 97]++;\n }\n \n let left = 0;\n \n for (let right = 0; right < sLen; right++) {\n const rightIndex = s.charCodeAt(right) - 97;\n windowCount[rightIndex]++;\n \n if (right - left + 1 > pLen) {\n const leftIndex = s.charCodeAt(left) - 97;\n windowCount[leftIndex]--;\n left++;\n }\n \n if (right - left + 1 === pLen) {\n if (arraysEqual(windowCount, pCount)) {\n result.push(left);\n }\n }\n }\n \n return result;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3237104151","body":"```javascript\n// Time Complexity: O(n + m), n is s.length, m is t.length\n// Space Complexity: O(k), k is different char count in t\n\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nfunction minWindow(s, t) {\n let l = 0;\n const counter = {};\n const N = s.length;\n const ct = {};\n \n for (let char of t) {\n ct[char] = (ct[char] || 0) + 1;\n }\n \n let k = 0;\n let ret = Infinity;\n let ans = \"\";\n \n for (let r = 0; r < N; r++) {\n counter[s[r]] = (counter[s[r]] || 0) + 1;\n \n if (s[r] in ct && counter[s[r]] === ct[s[r]]) {\n k++;\n }\n \n while (k === Object.keys(ct).length) {\n if (r - l + 1 < ret) {\n ans = s.substring(l, r + 1);\n ret = r - l + 1;\n }\n \n counter[s[l]]--;\n if (s[l] in ct && counter[s[l]] === ct[s[l]] - 1) {\n k--;\n }\n l++;\n }\n }\n \n return ans;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3239924106","body":"```javascript\n// Time Complexity: O(1)\n// Space Complexity: O(1)\n\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n const countBits = (num) => {\n let count = 0;\n while (num) {\n count += num & 1;\n num >>= 1;\n }\n return count;\n };\n\n const res = [];\n\n for (let hour = 0; hour < 12; hour++) {\n for (let minute = 0; minute < 60; minute++) {\n if ((countBits(hour) + countBits(minute)) === turnedOn) {\n const formattedMinute = minute < 10 ? `0${minute}` : `${minute}`\n res.push(`${hour}:${formattedMinute}`);\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240825737","body":"```javascript\n// Time Complexity: O(n!)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n\n const backtrack = (row, cols, dias1, dias2) => {\n if (row === n) {\n count++;\n return;\n }\n\n let availablePostions = ((1 << n) - 1) & (~(cols | dias1 | dias2));\n\n while (availablePostions) {\n const position = availablePostions & (-availablePostions);\n availablePostions &= availablePostions - 1;\n\n backtrack(\n row + 1,\n cols | position,\n (dias1 | position) << 1,\n (dias2 | position) >> 1,\n );\n }\n };\n\n backtrack(0, 0, 0, 0);\n\n return count;\n};\n\n// Time Complexity: O(n!)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n const cols = new Array(n).fill(false);\n const dias1 = new Array(2 * n - 1).fill(false); // row - col\n const dias2 = new Array(2 * n - 1).fill(false); // row + col\n\n const backtrack = (row) => {\n if (row === n) {\n count++;\n return;\n }\n\n for (let col = 0; col < n; col++) {\n const d1 = row - col + n - 1;\n const d2 = row + col;\n\n if (cols[col] || dias1[d1] || dias2[d2]) continue;\n\n cols[col] = dias1[d1] = dias2[d2] = true;\n backtrack(row + 1);\n cols[col] = dias1[d1] = dias2[d2] = false;\n }\n };\n\n backtrack(0);\n\n return count;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245083899","body":"## 題解\n- 遍歷每個 (i, j) 進行 dfs,遇到邊界或 grid[i][j] === 0 者即返回 0,反之則返回 1 加四個方向 dns 的結果\n- 優化:訪問過者可將原 grid[i][j] 改成 0,如此便不需要重新宣告一個空間來存取\n\n```javascript\n// Time Complexity: O(m * n)\n// Space Complexity: O(m * n)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n const [m, n] = [grid.length, grid[0].length];\n const direction = [[1, 0], [-1, 0], [0, 1], [0, -1]];\n let max = 0;\n\n const dfs = (x, y) => {\n if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y]) {\n grid[x][y] = 0;\n\n let area = 1;\n\n for (const [dx, dy] of direction) {\n area += dfs(x + dx, y + dy);\n }\n\n return area;\n }\n\n return 0;\n };\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n max = Math.max(max, dfs(i, j));\n }\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249843138","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nfunction maxDistance(grid) {\n const n = grid.length;\n const queue = [];\n \n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n queue.push([i, j, 0]);\n }\n }\n }\n \n if (queue.length === 0 || queue.length === n * n) {\n return -1;\n }\n \n const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];\n let maxDist = 0;\n \n while (queue.length > 0) {\n const [x, y, dist] = queue.shift();\n maxDist = Math.max(maxDist, dist);\n \n for (const [dx, dy] of directions) {\n const nx = x + dx;\n const ny = y + dy;\n \n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] === 0) {\n grid[nx][ny] = 1;\n queue.push([nx, ny, dist + 1]);\n }\n }\n }\n \n return maxDist;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251291240","body":"```javascript\n// Time Complexity: O(n + k), n is candies.length, k is number of keys\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n const boxes = new Set(initialBoxes);\n const q = [];\n \n for (const i of boxes) {\n if (status[i]) {\n q.push(i);\n }\n }\n \n for (let idx = 0; idx < q.length; idx++) {\n const i = q[idx];\n \n for (const j of containedBoxes[i]) {\n boxes.add(j);\n if (status[j]) {\n q.push(j);\n }\n }\n \n for (const j of keys[i]) {\n if (status[j] === 0 && boxes.has(j)) {\n q.push(j);\n }\n status[j] = 1;\n }\n }\n \n return q.reduce((sum, i) => sum + candies[i], 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3258808498","body":"```javascript\n// Time Complexity: O(nlogn), n is the number of tree.\n// Space Complexity: O(n), n is the number of tree.\n\n// /**\n// * Definition for a binary tree node.\n// * function TreeNode(val, left, right) {\n// * this.val = (val===undefined ? 0 : val)\n// * this.left = (left===undefined ? null : left)\n// * this.right = (right===undefined ? null : right)\n// * }\n// */\n// /**\n// * @param {TreeNode} root\n// * @return {number[][]}\n// */\nvar verticalTraversal = function(root) {\n const map = {};\n\n const traverse = (root, row, col) => {\n if (!root) return;\n\n if (!map[col]) {\n map[col] = [];\n }\n\n map[col].push([row, root.val]);\n traverse(root.left, row + 1, col - 1);\n traverse(root.right, row + 1, col + 1);\n };\n\n traverse(root, 0, 0);\n\n const keys = Object.keys(map).sort((a, b) => a - b);\n\n const res = keys.map((k) => {\n const arr = map[k];\n\n return arr.sort(([rowA, valA], [rowB, valB]) => {\n if (rowA === rowB) return valA - valB;\n return rowA - rowB;\n }).map(([,val]) => val);\n });\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3262161616","body":"## 題解\n- 重點是找到 dp 的關鍵核心 d[i] = Math.min(d[i - 1] + cost[i], d[i - 2] + cost[i]);\n- 需注意 cost[i] 為空值的情況\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} cost\n * @return {number}\n */\nvar minCostClimbingStairs = function(cost) {\n const n = cost.length;\n const d = [];\n\n d[0] = cost[0];\n d[1] = Math.min(d[0] + cost[1], cost[1]);\n\n for (let i = 2; i <= n; i++) {\n const c = cost[i] ?? 0;\n d[i] = Math.min(d[i - 1] + c, d[i - 2] + c);\n }\n\n return d[n];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263843103","body":"## 解題\n- 一樣需要去辨認 dp 的關係式,d[i] = Math.max(d[i - 1], d[i - 2] + nums[i])\n- 需要特別注意 n 為 1, 2 的 edge case \n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar rob = function(nums) {\n const n = nums.length;\n\n if (n === 1) return nums[0];\n if (n === 2) return Math.max(nums[0], nums[1]);\n\n const d = [];\n\n d[0] = nums[0];\n d[1] = Math.max(nums[0], nums[1]);\n\n for (i = 2; i < n; i++) {\n d[i] = Math.max(d[i - 1], d[i - 2] + nums[i])\n }\n\n return d[n - 1];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3266927805","body":"```javascript\n// Time Complexity: O(n^2), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findNumberOfLIS = function(nums) {\n const n = nums.length;\n const dp = Array(n).fill(null).map(() => [1, 1]);\n let longest = 1;\n \n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n if (nums[j] > nums[i]) {\n if (dp[i][0] + 1 > dp[j][0]) {\n dp[j][0] = dp[i][0] + 1;\n dp[j][1] = dp[i][1];\n longest = Math.max(longest, dp[j][0]);\n } else if (dp[i][0] + 1 === dp[j][0]) {\n dp[j][1] += dp[i][1];\n }\n }\n }\n }\n \n return dp.reduce((sum, [length, count]) => {\n return length === longest ? sum + count : sum;\n }, 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3270111521","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n)\n\n/**\n * @param {string} text1\n * @param {string} text2\n * @return {number}\n */\nvar longestCommonSubsequence = function(text1, text2) {\n const [n, m] = [text1.length, text2.length];\n const dp = Array.from({ length: n + 1 }).map(() => new Array(m + 1).fill(0));\n let res = 0;\n\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n if (text1.charAt(i - 1) === text2.charAt(j - 1)) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n res = Math.max(res, dp[i][j]);\n } else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273250794","body":"## 題解\n- dp 的遞增式為 `d[i][j] = d[i - 1][j] + d[i][j - 1];`,意思是,dp[i][j] 表示能到達該格子的路線數量,其為 d[i - 1][j] 和 d[i][j - 1] 的總和(從其左或其上格子來)\n- 其中需注意當 i 或 j 為 0,即最上或最左列的格子,其 d[i][j] 值為 1,因為只可能從其上或其左格子而來\n\n```javascript\n// Time Complexity: O(m * n)\n// Space Complexity: O(m * n)\n\n/**\n * @param {number} m\n * @param {number} n\n * @return {number}\n */\nvar uniquePaths = function(m, n) {\n const d = Array.from({ length: m }).map(() => new Array(n).fill(1));\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (i !== 0 && j !== 0) {\n d[i][j] = d[i - 1][j] + d[i][j - 1];\n }\n }\n }\n\n return d[m - 1][n - 1];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3279921315","body":"```javascript\n// Time Complexity: O(n^2 * k)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} row\n * @param {number} column\n * @return {number}\n */\nvar knightProbability = function(n, k, row, column) {\n let dp = Array.from({ length: n }, () => new Array(n).fill(0));\n const directions = [[2, 1], [1, 2], [-1, 2], [-2, 1], [-2, -1], [-1, -2], [1, -2], [2, -1]];\n\n dp[row][column] = 1;\n\n for (let step = 0; step < k; step++) {\n let dpTemp = Array.from({ length: n }, () => new Array(n).fill(0));\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n for (const [dx, dy] of directions) {\n const [px, py] = [i - dx, j - dy];\n\n if (px >= 0 && px < n && py >= 0 && py < n) {\n dpTemp[i][j] += dp[px][py] * 0.125;\n }\n }\n }\n }\n\n dp = dpTemp;\n }\n\n let sumProp = 0;\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n sumProp += dp[i][j];\n }\n }\n\n return sumProp;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3285364984","body":"```javascript\n/**\n * @param {number} maxChoosableInteger\n * @param {number} desiredTotal\n * @return {boolean}\n */\nvar canIWin = function(maxChoosableInteger, desiredTotal) {\n if (maxChoosableInteger >= desiredTotal) {\n return true;\n }\n \n const totalSum = (maxChoosableInteger * (maxChoosableInteger + 1)) / 2;\n if (totalSum < desiredTotal) {\n return false;\n }\n \n const memo = new Map();\n \n const dfs = (used, currentSum) => {\n if (memo.has(used)) {\n return memo.get(used);\n }\n \n for (let i = 1; i <= maxChoosableInteger; i++) {\n const bit = 1 << (i - 1);\n \n if ((used & bit) === 0) {\n if (currentSum + i >= desiredTotal) {\n memo.set(used, true);\n return true;\n }\n \n if (!dfs(used | bit, currentSum + i)) {\n memo.set(used, true);\n return true;\n }\n }\n }\n \n memo.set(used, false);\n return false;\n };\n \n return dfs(0, 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3288487076","body":"```javascript\n// Time Complexity: O(n * k), n is nums.length, k is sum of nums / 2\n// Space Complexity: O(n * k)\n\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canPartition = function (nums) {\n let sum = nums.reduce((acc, num) => acc + num, 0);\n\n if (sum % 2) return false;\n else sum = sum / 2;\n\n const dp = Array.from(nums).map(() => Array.from({ length: sum + 1 }).fill(false));\n\n for (let i = 0; i < nums.length; i++) {\n dp[i][0] = true;\n }\n\n for (let i = 0; i < dp.length - 1; i++) {\n for (let j = 0; j < dp[0].length; j++) {\n dp[i + 1][j] = j - nums[i] >= 0 ? dp[i][j] || dp[i][j - nums[i]] : dp[i][j];\n }\n }\n\n return dp[nums.length - 1][sum];\n};\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289632643","body":"```javascript\n// Time Complexity: O(n * k), n is nums.length, k is sum of nums\n// Space Complexity: O(k)\n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar findTargetSumWays = function(nums, target) {\n const total = nums.reduce((sum, num) => sum + num, 0);\n \n if (Math.abs(target) > total || (total + target) % 2 !== 0) {\n return 0;\n }\n \n const sum = (total + target) / 2;\n const dp = new Array(sum + 1).fill(0);\n dp[0] = 1;\n \n for (const num of nums) {\n for (let j = sum; j >= num; j--) {\n dp[j] += dp[j - num];\n }\n }\n \n return dp[sum];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3292845699","body":"```javascript\n/**\n * @param {number[]} coins\n * @param {number} amount\n * @return {number}\n */\nvar coinChange = function(coins, amount) {\n const dp = new Array(amount + 1).fill(Infinity);\n\n dp[0] = 0;\n\n for (i = 1; i <= amount; i += 1) {\n for (const coin of coins) {\n if (i - coin >= 0 && dp[i - coin] !== Infinity) {\n dp[i] = Math.min(dp[i - coin] + 1, dp[i]);\n }\n }\n }\n\n return dp[amount] === Infinity ? -1 : dp[amount];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3297467048","body":"```javascript\n// Time Complexity: O(n * m), n is amount, m is coins.length\n// Space Complexity: O(n)\n\n/**\n * @param {number} amount\n * @param {number[]} coins\n * @return {number}\n */\nvar change = function(amount, coins) {\n const dp = new Array(amount + 1).fill(0);\n dp[0] = 1;\n\n for (const coin of coins) {\n for (let i = coin; i <= amount; i++) {\n dp[i] += dp[i - coin];\n }\n }\n \n return dp[amount];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3303059077","body":"## 題解\n- 先排序,以 g[j] 為主,遍歷符合的 s[i]\n```javascript\n// Time Complexity: O(nlogn + mlogm), n is g.length, m is s.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} g\n * @param {number[]} s\n * @return {number}\n */\nvar findContentChildren = function(g, s) {\n g.sort((a, b) => a - b);\n s.sort((a, b) => a - b);\n\n let [i, j] = [0, 0];\n let ans = 0;\n\n while (i < s.length && j < g.length) {\n if (s[i] >= g[j]) {\n ans++;\n j++;\n }\n\n i++;\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3307711246","body":"```javascript\n// Time Complexity: O(nlogn)\n// Space Complexity: O(1)\n\n/**\n * @param {number[][]} intervals\n * @return {number}\n */\nfunction eraseOverlapIntervals(intervals) {\n if (intervals.length <= 1) return 0;\n \n intervals.sort((a, b) => a[1] - b[1]);\n \n let count = 0;\n let end = intervals[0][1];\n \n for (let i = 1; i < intervals.length; i++) {\n if (intervals[i][0] < end) {\n count++;\n } else {\n end = intervals[i][1];\n }\n }\n \n return count;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3311687568","body":"```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canJump = function (nums) {\n let max = 0;\n\n for (let i = 0; i < nums.length; i++) {\n if (max < i) return false;\n\n max = Math.max(nums[i] + i, max);\n }\n\n return max >= nums.length - 1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/71#issuecomment-3314986282","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nconst memories = {};\nvar numTrees = function(n) {\n if (memories[n] !== undefined) return memories[n];\n if (n <= 1) return 1;\n\n let ans = 0;\n\n for (let i = 1; i <= n; i++) {\n ans += numTrees(i - 1) * numTrees(n - i);\n }\n\n memories[n] = ans;\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316043984","body":"```javascript\n// Time Complexity: O(nlogk), n is total number of nodes across all lists, k is number of lists\n// Space Complexity: O(1)\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode[]} lists\n * @return {ListNode}\n */\nvar mergeKLists = function(lists) {\n if (!lists || lists.length === 0) return null;\n \n while (lists.length > 1) {\n let mergedLists = [];\n \n for (let i = 0; i < lists.length; i += 2) {\n let l1 = lists[i];\n let l2 = i + 1 < lists.length ? lists[i + 1] : null;\n mergedLists.push(mergeTwoLists(l1, l2));\n }\n \n lists = mergedLists;\n }\n \n return lists[0];\n};\n\nfunction mergeTwoLists(l1, l2) {\n let dummy = new ListNode(0);\n let current = dummy;\n \n while (l1 && l2) {\n if (l1.val <= l2.val) {\n current.next = l1;\n l1 = l1.next;\n } else {\n current.next = l2;\n l2 = l2.next;\n }\n current = current.next;\n }\n \n current.next = l1 || l2;\n return dummy.next;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3324003764","body":"```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar singleNumber = function(nums) {\n let bitmask = 0;\n\n for (let n of nums) {\n bitmask ^= n;\n }\n\n bitmask &= -bitmask;\n\n const ans = [0, 0];\n\n for (let n of nums) {\n if ((n & bitmask) === 0) ans[0] ^= n;\n else ans[1] ^= n;\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3327535650","body":"```javascript\n// Time Complexity: O(n * 2^n)\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number[][]}\n */\nfunction subsets(nums) {\n const result = [];\n \n function backtrack(start, current) {\n result.push([...current]);\n \n for (let i = start; i < nums.length; i++) {\n current.push(nums[i]);\n backtrack(i + 1, current);\n current.pop();\n }\n }\n \n backtrack(0, []);\n return result;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3338173897","body":"```javascript\n// Time Complexity\n// - insert: O(k), k is key.length\n// - searchValue: O(k), k is key.length\n// - sum: O(p), p is prefix.length\n\n// Space Complexity: O(n * m), n is the number of unique keys inserted, m is the average length of the keys\n\nclass MapSum {\n constructor() {\n this.root = new TrieNode();\n }\n \n insert(key, val) {\n let temp = this.root;\n \n let oldVal = this.searchValue(key);\n \n for (let i = 0; i < key.length; i++) {\n if (temp.children[key.charCodeAt(i) - 97] == null)\n temp.children[key.charCodeAt(i) - 97] = new TrieNode();\n \n temp = temp.children[key.charCodeAt(i) - 97];\n \n temp.count = temp.count - oldVal + val;\n }\n \n temp.val = val;\n temp.isWord = true;\n }\n\n searchValue(key) {\n let temp = this.root;\n for (let i = 0; i < key.length; i++) {\n if (temp.children[key.charCodeAt(i) - 97] == null)\n return 0;\n \n temp = temp.children[key.charCodeAt(i) - 97];\n }\n \n return temp.isWord ? temp.val : 0;\n }\n\n sum(prefix) {\n let temp = this.root;\n \n for (let i = 0; i < prefix.length; i++) {\n if (temp.children[prefix.charCodeAt(i) - 97] == null)\n return 0;\n \n temp = temp.children[prefix.charCodeAt(i) - 97];\n }\n \n return temp.count;\n }\n}\n\nclass TrieNode {\n constructor() {\n this.count = 0;\n this.children = new Array(26);\n this.isWord = false;\n this.val = 0;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/78#issuecomment-3341802963","body":"```javascript\n// Time Complexity: O(n*m + b*b + n)\n// - Building Trie: O(n*m) where n = number of smalls, m = average length of smalls\n// - Searching: O(b*b) where b = length of big string (worst case: check every position against every possible substring)\n// - Converting result: O(n)\n\n// Space Complexity: O(n*m + n*k)\n// - Trie storage: O(n*m) for storing all small strings\n// - Result storage: O(n*k) where k = average number of matches per small string\n\n\nclass Node {\n constructor() {\n this.children = new Array(26).fill(null);\n this.isWord = false;\n this.id = 0;\n }\n}\n\nclass Solution {\n constructor() {\n this.root = new Node();\n }\n\n multiSearch(big, smalls) {\n const n = smalls.length;\n const res = Array(n).fill().map(() => []);\n \n for (let i = 0; i < smalls.length; i++) {\n this.insert(smalls[i], i);\n }\n\n for (let i = 0; i < big.length; i++) {\n let tmp = this.root;\n\n for (let j = i; j < big.length; j++) {\n if (tmp.children[big.charCodeAt(j) - 97] === null) {\n break;\n }\n\n tmp = tmp.children[big.charCodeAt(j) - 97];\n\n if (tmp.isWord) {\n res[tmp.id].push(i);\n }\n }\n }\n\n const ret = new Array(n);\n\n for (let i = 0; i < n; i++) {\n ret[i] = new Array(res[i].length);\n for (let j = 0; j < ret[i].length; j++) {\n ret[i][j] = res[i][j];\n }\n }\n\n return ret;\n }\n\n insert(word, id) {\n let tmp = this.root;\n\n for (let i = 0; i < word.length; i++) {\n if (tmp.children[word.charCodeAt(i) - 97] === null) {\n tmp.children[word.charCodeAt(i) - 97] = new Node();\n }\n\n tmp = tmp.children[word.charCodeAt(i) - 97];\n }\n\n tmp.isWord = true;\n tmp.id = id;\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wutxuan":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073568207","body":"第一次思路:将num数组转换为int数字A,计算A+K,将A+K结果转换为List类型,但没有观察数据范围,导致int类型溢出,没有通过全部样例\n第二次思路:从后往前,逐位相加K%10,直到遍历完全部数组,再判断K是否还有,通过全部样例\n第三次思路:看完题解后,学习到了可以将k和某一位看作一个整体,不用每次计算k%10,而是k+num[i]","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078154786","body":"第一次思路:遍历每个字符,在每个字符上向左向右移动,直到找到字符c,继续遍历下一个字符,但想到时间复杂度一定很高,因此继续想其他方法\n\n第二次思路:先遍历字符串,用List先记录每个字符c的索引。然后遍历字符串每个字符,计算这个字符的位置距离List中位置的最小距离,通过全部用例,时间复杂度O(N*K) N为字符串长度,K为c在字符串中出现的次数\n\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n List indexList = new ArrayList<>();\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == c){\n indexList.add(i);\n }\n }\n\n int[] res = new int[s.length()];\n Arrays.fill(res,10001);\n for(int i = 0;i < res.length;i++){\n for(int index : indexList){\n res[i] = Math.min(res[i],Math.abs(i - index));\n }\n \n }\n return res;\n }\n}\n\n```\n第三次思路:看完题解后,学习到了两次遍历求解,从左到右记录每个字符左侧最近的字符c的距离,记为left数组,从右到左记录每个字符右侧最近的字符c的距离,记为right数组。再遍历一遍整个字符串,在left数组和right数组中取最小值为最终结果。在代码实现时,省去了记录right数组再比较,而是直接比较。时间复杂度O(N)\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n int index = -s.length();\n int[] left = new int[s.length()];\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == c){\n index = i;\n }\n left[i] = i - index;\n }\n\n index = 2 * s.length();\n for(int i = s.length() - 1;i >= 0;i--){\n if(s.charAt(i) == c){\n index = i;\n }\n left[i] = Math.min(left[i],index - i);\n }\n return left;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3083567541","body":"因为要设计的栈有最大长度,因此使用数组来模拟栈。否则使用栈或List来模拟。\n使用数组模拟:使用一个指针变量,指向当前栈顶。入栈时,val存入栈顶处,指针++,出栈时,指针- -,返回栈顶元素。实现inc函数时,只需要对数组中0-k位置的数每个+val即可。通过全部样例\n```java\nclass CustomStack {\n int size = 0; // 指向第一个空位置\n int[] arr;\n\n public CustomStack(int maxSize) {\n arr = new int[maxSize];\n }\n \n public void push(int x) {\n if(size < arr.length){\n arr[size] = x;\n size++;\n }\n }\n \n public int pop() {\n if(size > 0){\n size--;\n return arr[size];\n }else{\n return -1;\n }\n }\n \n public void increment(int k, int val) {\n int cut = Math.min(k,size);\n\n for(int i = 0;i < cut;i++){\n arr[i] += val;\n }\n }\n}\n```\n\n看完题解后学会了前缀和方法:- 因为每次的increment函数都会对栈底[0,k]的数据val操作,而是否val操作了只有在pop时才会体现。所以我们可以通过一个数组incremental记录每个val,即第i位置下面的元素都要加incremental[i]。在pop第i个数的时候加上它需要加的所有val,即incremental[i]。 所以increment函数只需要维护incremental数组。但要记得记得pop后,incremental函数用过的地方要清零,并且得累加到前面一位\n\n```java\nclass CustomStack {\n\n Stack stack;\n int[] incremental;\n\n public CustomStack(int maxSize) {\n stack = new Stack();\n incremental = new int[maxSize];\n }\n \n public void push(int x) {\n if(stack.size() < incremental.length){\n stack.push(x);\n }\n }\n \n public int pop() {\n int cut = stack.size() - 1;\n if(cut < 0) return -1;\n\n int res = stack.pop() + incremental[cut];\n\n if(cut > 0){\n incremental[cut-1] += incremental[cut]; \n }\n incremental[cut] = 0;\n return res;\n\n }\n \n public void increment(int k, int val) {\n int cut = Math.min(k,stack.size())-1;\n if(cut >= 0){\n incremental[cut] += val;\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089071815","body":"看到有括号,需要对括号匹配,则优先想到栈。遍历字符串,当遇到非】字符时,全部入栈。当遇到】字符时,开始向回看,取出字符c,构成字符串s。再向回看,取出数字x,重复x次字符串s得到字符串ss,再将ss入栈,继续遍历,直到遍历结束。\n \n最后得到的栈,就是存储了最终解码后的字符串。取出栈后记得反转字符串\n```java\nclass Solution {\n public String decodeString(String s) {\n Stack stack = new Stack<>();\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == ']'){\n StringBuilder sb = new StringBuilder();\n StringBuilder count = new StringBuilder();\n\n while(!stack.isEmpty() && stack.peek() != '['){\n sb.append(stack.pop());\n } \n sb.reverse();\n stack.pop();\n while(!stack.isEmpty() && stack.peek() >= '0' && stack.peek() <= '9'){\n count.append(stack.pop());\n }\n count.reverse();\n int t = Integer.valueOf(count.toString());\n StringBuilder res = new StringBuilder();\n res.repeat(sb,t);\n\n for(char c : res.toString().toCharArray()){\n stack.push(c);\n }\n \n }else{\n stack.push(s.charAt(i));\n }\n }\n StringBuilder re = new StringBuilder();\n while(!stack.isEmpty()){\n re.append(stack.pop());\n }\n re.reverse();\n return re.toString();\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3095194789","body":"- push操作:输入栈入栈\n- pop操作:如果输出栈不为空,则直接输出输出栈的元素。如果输出栈为空,则把输入栈的数据全部导入到输出栈中\n- peek操作:如果输出栈不为空,则直接peek输出栈的元素。如果输出栈为空,则把输入栈的数据全部导出到输入栈中\n```java\nclass MyQueue {\n Stack stackIn;\n Stack stackOut;\n\n public MyQueue() {\n stackIn = new Stack<>();\n stackOut = new Stack<>();\n }\n \n public void push(int x) {\n stackIn.push(x);\n }\n \n public int pop() {\n refresh();\n return stackOut.pop();\n }\n \n public int peek() {\n refresh();\n return stackOut.peek();\n }\n \n public boolean empty() {\n return stackIn.isEmpty() && stackOut.isEmpty();\n }\n\n public void refresh(){\n if(!stackOut.isEmpty()){\n return;\n }\n while(!stackIn.isEmpty()){\n stackOut.push(stackIn.pop());\n }\n }\n}\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094513644","body":"想象成将原始数组和排序后的数组并列排在一起,切一刀。如果这刀的左侧两个数组的数字出现的频次相同,那么右侧的频次也一定相同。这里就是一个分割点。\n继续向右,有同样情况就切一刀。直到走到最后,一定会切最后一刀。记录的每一个分割点,就是分的组数。\n```java\nclass Solution {\n public int maxChunksToSorted(int[] arr) {\n Map map = new HashMap<>();\n int[] sortedArr = new int[arr.length];\n for(int i = 0;i < arr.length;i++){\n sortedArr[i] = arr[i];\n }\n Arrays.sort(sortedArr);\n\n int res = 0;\n for(int i = 0;i < arr.length;i++){\n map.put(arr[i],map.getOrDefault(arr[i],0) + 1);\n if(map.get(arr[i]) == 0){\n map.remove(arr[i]);\n }\n map.put(sortedArr[i],map.getOrDefault(sortedArr[i],0) - 1);\n if(map.get(sortedArr[i]) == 0){\n map.remove(sortedArr[i]);\n }\n if(map.isEmpty()){\n res++;\n }\n }\n return res;\n }\n}\n```\n因为存在sort排序,时间复杂度O(NlogN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095217604","body":"先将链表连成一个环,再找到需要断开的位置断开即可\n```java\nclass Solution {\n public ListNode rotateRight(ListNode head, int k) {\n if(head == null) return null;\n ListNode dummy = head;\n int count = 1;\n while(dummy.next != null){\n count++;\n dummy = dummy.next;\n }\n dummy.next = head;\n\n k = k % count;\n dummy = head;\n count = count - k;\n for(int i = 1;i < count;i++){\n dummy = dummy.next;\n }\n ListNode res = dummy.next;\n dummy.next = null;\n return res;\n }\n}\n```\n\n因为遍历了链表,时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100949135","body":"因为要交换两个节点,所以需要记录两个节点+两个节点前的节点+两个节点后的节点,一共四个节点。分别用cur,one,two,three记录\n交换完后,cur指向下一组需要交换节点的前一个节点\n```java\nclass Solution {\n public ListNode swapPairs(ListNode head) {\n ListNode dummy = new ListNode(0);\n dummy.next = head;\n ListNode cur = dummy;\n ListNode one = null;\n ListNode two = null;\n ListNode three = null;\n while(cur.next != null && cur.next.next != null)\n {\n one = cur.next;\n two = cur.next.next;\n three = cur.next.next.next;\n cur.next = two;\n cur.next.next = one;\n cur.next.next.next = three;\n cur = cur.next.next;\n }\n return dummy.next;\n }\n}\n```\n遍历了链表,时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105789931","body":"考验的是二分查找和分治构建二叉树,中间大小的数构成root根节点,左侧的数组部分分治构成左节点,右侧的数组部分分治构成右节点。这里用的是链表,只需要额外增加一些链表的操作(getMid函数)。也可以将链表转化为数组,再构造,查找起来就很快。以空间换时间\n```java\nclass Solution {\n public TreeNode sortedListToBST(ListNode head) {\n ListNode dummy = head;\n int end = 0;\n while(head != null){\n end++;\n head = head.next;\n }\n\n return dfs(dummy,0,end);\n }\n\n public TreeNode dfs(ListNode head,int start,int end){\n if(start >= end) return null;\n int mid = start + (end - start) / 2;\n ListNode midNode = getMid(head,mid);\n TreeNode node = new TreeNode(midNode.val);\n node.left = dfs(head,start,mid);\n node.right = dfs(head,mid+1,end);\n\n return node;\n }\n \n public ListNode getMid(ListNode head,int mid){\n while(mid > 0){\n mid--;\n head = head.next;\n }\n return head;\n }\n}\n```\n时间复杂度O(NlogN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111943009","body":"两个指针从head出发同时往前移动,当某一个指针指向null的时候,使其指向另一个head。直至两个指针相遇,该节点为相遇节点。直到相遇,第一个指针走了A+C+B的路程,另一个指针走了B+C+A的路程\n```java\npublic class Solution {\n public ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n ListNode A = headA;\n ListNode B = headB;\n while(A != B)\n {\n if(A == null) A = headB;\n else A = A.next;\n if(B == null) B = headA;\n else B = B.next;\n }\n return A;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116973002","body":"- 判断是否有环:两个快慢指针分别从头节点出发,慢指针一次走一格,快指针一次走两个,如果有环,则二者一定会在环内相遇,如果没环,则快指针会先到达null处。可以类比于跑步,跑得快的会套跑的慢的一圈\n- 判断环入口:快指针和慢指针相遇的时候,慢指针走了x+y步,快指针走了x+y+n*(y+z)步骤,n为圈数,大于等于1,如图所示,图片节选自代码随想录。因为快指针是慢指针的两倍速,所以2x+2y=x+y+n*(y+z)。化简后发现当n=1时,x=z,当n大于1时,x=z+(n-1)(y+z)。也就是说,头节点到环入口的距离等于z或z+多圈。因此,用两个指针,一个从头节点出发,一个从相遇节点出发,最终一定会相遇在环入口,无论第二个指针在环里绕了多少圈\n```java\npublic class Solution {\n public ListNode detectCycle(ListNode head) {\n ListNode fast = head;\n ListNode slow = head;\n while(fast != null && fast.next != null)\n {\n slow = slow.next;\n fast = fast.next.next;\n if(slow == fast){\n ListNode index1 = head;\n ListNode index2 = slow;\n while(index1 != index2)\n {\n index1 = index1.next;\n index2 = index2.next;\n }\n return index1;\n }\n }\n return null;\n }\n}\n```\n时间复杂度O(N) 空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121046113","body":"Java可以使用LinkedHashMap实现LRU,内置的函数就可以实现按插入顺序排列的hashmap,手动实现LinkedHashMap代码如下:\n```java\npublic class LRUCache {\n class DLinkedNode {\n int key;\n int value;\n DLinkedNode prev;\n DLinkedNode next;\n public DLinkedNode() {}\n public DLinkedNode(int _key, int _value) {key = _key; value = _value;}\n }\n\n private Map cache = new HashMap();\n private int size;\n private int capacity;\n private DLinkedNode head, tail;\n\n public LRUCache(int capacity) {\n this.size = 0;\n this.capacity = capacity;\n head = new DLinkedNode();\n tail = new DLinkedNode();\n head.next = tail;\n tail.prev = head;\n }\n\n public int get(int key) {\n DLinkedNode node = cache.get(key);\n if (node == null) {\n return -1;\n }\n moveToHead(node);\n return node.value;\n }\n\n public void put(int key, int value) {\n DLinkedNode node = cache.get(key);\n if (node == null) {\n DLinkedNode newNode = new DLinkedNode(key, value);\n cache.put(key, newNode);\n addToHead(newNode);\n ++size;\n if (size > capacity) {\n DLinkedNode tail = removeTail();\n cache.remove(tail.key);\n --size;\n }\n }\n else {\n node.value = value;\n moveToHead(node);\n }\n }\n\n private void addToHead(DLinkedNode node) {\n node.prev = head;\n node.next = head.next;\n head.next.prev = node;\n head.next = node;\n }\n\n private void removeNode(DLinkedNode node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n }\n\n private void moveToHead(DLinkedNode node) {\n removeNode(node);\n addToHead(node);\n }\n\n private DLinkedNode removeTail() {\n DLinkedNode res = tail.prev;\n removeNode(res);\n return res;\n }\n}\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123845190","body":"递归,每一层返回max(左子树深度,右子树深度)+1\n```java\nclass Solution {\n public int maxDepth(TreeNode root) {\n if (root == null) {\n return 0;\n }\n int leftDepth = maxDepth(root.left);\n int rightDepth = maxDepth(root.right);\n return Math.max(leftDepth, rightDepth) + 1;\n }\n}\n```\n层序遍历,使用队列。每遍历一层,深度+1,直到遍历到最下面一层\n\n```java\nclass Solution {\n public int maxDepth(TreeNode root) {\n if(root == null) return 0;\n Queue queue = new LinkedList<>();\n queue.add(root);\n int depth = 0;\n while(!queue.isEmpty())\n {\n int size = queue.size();\n for(int i = 0;i < size;i++){\n TreeNode node = queue.poll();\n if(node.left != null) queue.add(node.left);\n if(node.right != null) queue.add(node.right);\n }\n depth++;\n }\n\n return depth;\n }\n}\n```\n时间复杂度O(N) N为二叉树节点个数","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125223416","body":"先判断当前两个节点是否相同,如果不同,直接返回false。如果相同无法得出最终结论,需要递归进入下一层继续判断子树\n```java\nclass Solution {\n public boolean isSameTree(TreeNode p, TreeNode q) {\n if(p == null && q != null) return false;\n if(p != null && q == null) return false;\n if(p == null && q == null) return true;\n if(p.val != q.val) return false;\n\n boolean l = isSameTree(p.left,q.left);\n boolean r = isSameTree(p.right,q.right);\n\n return l && r;\n }\n}\n```\n时间复杂度O(N) N为树的节点数量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130457949","body":"回溯维护一个List,当递归到叶子节点时,List中保存的数字就是一路从root到当前根节点的所有数字。使用StringBbuilder拼接所有数字,即是当前路径表示的数字\n\n```java\nclass Solution {\n List path = new ArrayList<>();\n int res = 0;\n public int sumNumbers(TreeNode root) {\n path.add(root.val);\n recursion(root);\n return res;\n }\n\n public void recursion(TreeNode root){\n if(root.left == null && root.right == null){\n StringBuilder sb = new StringBuilder();\n for(int num : path){\n sb.append(num);\n }\n res += Integer.parseInt(sb.toString());\n return;\n }\n\n if(root.left != null){\n path.add(root.left.val);\n recursion(root.left);\n path.remove(path.size() - 1);\n }\n\n if(root.right != null){\n path.add(root.right.val);\n recursion(root.right);\n path.remove(path.size() - 1);\n }\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134853681","body":"层序遍历,记录每一层的最左侧的值,不断覆盖变量,最终记录的是最深一层的最左侧的值\n```java\nclass Solution {\n public int findBottomLeftValue(TreeNode root) {\n Queue queue = new LinkedList<>();\n queue.add(root);\n int res = 0;\n while(!queue.isEmpty())\n {\n int size = queue.size();\n for(int i = 0;i < size;i++){\n TreeNode node = queue.poll();\n if(i == 0){\n res = node.val;\n }\n if(node.left != null) queue.add(node.left);\n if(node.right != null) queue.add(node.right);\n }\n }\n\n return res;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138992061","body":"序列化时:前序遍历记录每个节点用逗号分开,空节点记为#\n反序列化:将序列化结果以逗号分开,存储进队列,用队列递归构造树\n```java\npublic class Codec {\n StringBuilder sb = new StringBuilder();\n int count = 1;\n\n public String serialize(TreeNode root) {\n if(root == null){\n sb.append(\"#\").append(\",\");\n return sb.toString();\n }\n\n sb.append(root.val).append(\",\");\n serialize(root.left);\n serialize(root.right);\n return sb.toString();\n }\n\n public TreeNode deserialize(String data) {\n Queue queue = new LinkedList<>();\n String[] pre = data.split(\",\");\n for(String s : pre){\n queue.offer(s);\n }\n return build(queue);\n }\n\n public TreeNode build(Queue queue){\n if(queue.isEmpty()) return null;\n String rootStringVal = queue.poll();\n if(rootStringVal.equals(\"#\")) return null;\n int rootVal = Integer.parseInt(rootStringVal);\n \n TreeNode root = new TreeNode(rootVal);\n root.left = build(queue);\n root.right = build(queue);\n\n return root;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3142198278","body":"遍历二叉树,记录一个三元组,分别表示列、行和节点的值。再按照要求进行排序,列升序,行升序,值升序。最后按规则放入List\n```java\nclass Solution {\n public List> verticalTraversal(TreeNode root) {\n List nodes = new ArrayList();\n dfs(root, 0, 0, nodes);\n Collections.sort(nodes, new Comparator() {\n public int compare(int[] tuple1, int[] tuple2) {\n if (tuple1[0] != tuple2[0]) {\n return tuple1[0] - tuple2[0];\n } else if (tuple1[1] != tuple2[1]) {\n return tuple1[1] - tuple2[1];\n } else {\n return tuple1[2] - tuple2[2];\n }\n }\n });\n List> ans = new ArrayList>();\n int size = 0;\n int lastcol = Integer.MIN_VALUE;\n for (int[] tuple : nodes) {\n int col = tuple[0], row = tuple[1], value = tuple[2];\n if (col != lastcol) {\n lastcol = col;\n ans.add(new ArrayList());\n size++;\n }\n ans.get(size - 1).add(value);\n }\n return ans;\n }\n\n public void dfs(TreeNode node, int row, int col, List nodes) {\n if (node == null) {\n return;\n }\n nodes.add(new int[]{col, row, node.val});\n dfs(node.left, row + 1, col - 1, nodes);\n dfs(node.right, row + 1, col + 1, nodes);\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146508830","body":"先将数组中所有值和其对应索引存入hashmap,再遍历一遍数组,如果遍历到的num对应的target-num在map中,即是找到的两个索引。注意要避免一个数算两次\n```java\nclass Solution {\n public int[] twoSum(int[] nums, int target) {\n Map map = new HashMap<>();\n for(int i = 0;i < nums.length;i++){\n map.put(nums[i],i);\n }\n\n for(int i = 0;i < nums.length;i++){\n if(map.containsKey(target - nums[i]) && map.get(target - nums[i]) != i){\n int[] res = new int[2];\n res[0] = i;\n res[1] = map.get(target - nums[i]);\n return res;\n }\n }\n return null;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148286271","body":"遍历数组,先用hashmap记录每个数字出现的次数。用优先队列定义好排序规则,将map中的内容放入优先队列中,再按照要求从队列中取\n```java\nclass Solution {\n public int[] topKFrequent(int[] nums, int k) {\n Map map = new HashMap<>();\n for(int num : nums){\n map.put(num,map.getOrDefault(num,0)+1);\n }\n PriorityQueue p = new PriorityQueue<>((a,b) -> (b[1]-a[1]));\n for(Map.Entry m : map.entrySet()){\n p.add(new int[]{m.getKey(),m.getValue()});\n }\n int[] result = new int[k];\n for(int i = 0;i < k;i++){\n result[i] = p.poll()[0];\n }\n return result;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149131512","body":"二层遍历,第一层遍历i,第二层遍历,使用map记录每个元组与第一层的i的距离dis出现的次数time。最终由i组成的回旋镖数量为time*(time-1)\n```java\nclass Solution {\n public int numberOfBoomerangs(int[][] points) {\n int res = 0;\n for(int[] a : points){\n Map map = new HashMap<>();\n for(int[] b : points){\n int dis = (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]);\n map.put(dis,map.getOrDefault(dis,0) + 1);\n }\n for(int key : map.keySet()){\n int val = map.get(key);\n res += val * (val - 1);\n }\n }\n return res;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153104469","body":"滑动窗口,定义left指针和right指针,两个指针窗口内即是符合题目要求的子串。不断向右移right指针,如果窗口内的子串不符合题目要求了,就右移left指针缩小窗口直到符合题目要求。\n在遍历过程中,记录窗口长度最大值\n使用hashSet判断窗口内是否符合题目要求\n```java\nclass Solution {\n public int lengthOfLongestSubstring(String s) {\n Set set = new HashSet<>();\n int left = 0;\n int res = 0;\n for(int right = 0;right < s.length();right++){\n char c = s.charAt(right);\n while(set.contains(c)){\n set.remove(s.charAt(left));\n left++;\n }\n\n set.add(c);\n res = Math.max(res,right - left + 1); \n }\n return res;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3157250607","body":"滑动窗口\n```java\nclass Solution {\n public List findSubstring(String s, String[] words) {\n int wordLen = words[0].length(); \n int windowLen = wordLen * words.length; \n\n Map targetCnt = new HashMap<>();\n for (String w : words) {\n targetCnt.put(w,targetCnt.getOrDefault(w,0) + 1);\n }\n\n List ans = new ArrayList<>();\n for (int start = 0; start < wordLen; start++) {\n Map cnt = new HashMap<>();\n int overload = 0;\n for (int right = start + wordLen; right <= s.length(); right += wordLen) {\n String inWord = s.substring(right - wordLen, right);\n if (cnt.getOrDefault(inWord, 0).equals(targetCnt.getOrDefault(inWord, 0))) {\n overload++;\n }\n cnt.merge(inWord, 1, Integer::sum); \n\n int left = right - windowLen;\n if (left < 0) { \n continue;\n }\n if (overload == 0) {\n ans.add(left);\n }\n\n String outWord = s.substring(left, left + wordLen);\n cnt.merge(outWord, -1, Integer::sum); \n if (cnt.get(outWord).equals(targetCnt.getOrDefault(outWord, 0))) {\n overload--;\n }\n }\n }\n\n return ans;\n }\n}\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162563860","body":"前缀和\n```java\nclass Solution {\n public int minSubarray(int[] nums, int p) {\n int n = nums.length;\n int[] s = new int[n + 1];\n for (int i = 0; i < n; i++) {\n s[i + 1] = (s[i] + nums[i]) % p;\n }\n int x = s[n];\n if (x == 0) {\n return 0; \n }\n\n int ans = n;\n Map last = new HashMap<>();\n for (int i = 0; i <= n; i++) {\n last.put(s[i], i);\n int j = last.getOrDefault((s[i] - x + p) % p, -n);\n ans = Math.min(ans, i - j);\n }\n return ans < n ? ans : -1;\n }\n}\n\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170443755","body":"双指针,慢指针用于存数字,快指针用于检验数字是否重复\n```java\nclass Solution {\n public int removeDuplicates(int[] nums) {\n if(nums.length == 1) return 1;\n int slow = 0;\n for(int fast = 1;fasttarget){\n right = middle;\n }else if(nums[middle] queue;\n public MyQueue(){\n queue = new LinkedList<>();\n } \n\n public void add(int val){\n while(!queue.isEmpty() && val > queue.getLast()){\n queue.removeLast();\n }\n queue.add(val);\n }\n\n public void poll(int val){\n if(queue.peek() == val){\n queue.poll();\n }\n }\n\n public int max(){\n return queue.peek();\n }\n}\n```\n时间复杂度O(nlogn)\n优先队列插入的复杂度是logn","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3177951924","body":"两个数组计算每个人的入度和出度\n```java\nclass Solution {\n public int findJudge(int n, int[][] trust) {\n int[] inDegrees = new int[n + 1];\n int[] outDegrees = new int[n + 1];\n for (int[] edge : trust) {\n int x = edge[0], y = edge[1];\n ++inDegrees[y];\n ++outDegrees[x];\n }\n for (int i = 1; i <= n; ++i) {\n if (inDegrees[i] == n - 1 && outDegrees[i] == 0) {\n return i;\n }\n }\n return -1;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182597716","body":"染色法,如果染色过程冲突,则无法实现、返回false\n```java\nclass Solution {\n boolean[] visited;\n boolean[] color;\n boolean flag = false;\n public boolean possibleBipartition(int n, int[][] dislikes) {\n List[] graph = build(dislikes,n);\n visited = new boolean[graph.length];\n color = new boolean[graph.length];\n for(int i = 1;i < graph.length;i++){\n if(visited[i] == false){\n traverse(graph,i);\n }\n }\n return !flag;\n }\n\n public List[] build(int[][] dislikes,int n){\n List[] graph = new List[n + 1];\n for(int i = 0;i < n + 1;i++){\n graph[i] = new LinkedList<>();\n }\n\n for(int[] edge : dislikes){\n int x = edge[0];\n int y = edge[1];\n graph[x].add(y);\n graph[y].add(x);\n }\n return graph;\n }\n\n public void traverse(List[] graph,int s){\n if(flag) return;\n visited[s] = true;\n for(int x : graph[s]){\n if(visited[x] == false){\n color[x] = !color[s];\n traverse(graph,x);\n }else{\n if(color[x] == color[s]) flag = true;\n }\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186848399","body":"拓扑排序\n```java\nclass Solution {\n public int[] sortItems(int n, int m, int[] group, List> beforeItems) {\n List> groupItem = new ArrayList>();\n for (int i = 0; i < n + m; ++i) {\n groupItem.add(new ArrayList());\n }\n\n // 组间和组内依赖图\n List> groupGraph = new ArrayList>();\n for (int i = 0; i < n + m; ++i) {\n groupGraph.add(new ArrayList());\n }\n List> itemGraph = new ArrayList>();\n for (int i = 0; i < n; ++i) {\n itemGraph.add(new ArrayList());\n }\n\n // 组间和组内入度数组\n int[] groupDegree = new int[n + m];\n int[] itemDegree = new int[n];\n \n List id = new ArrayList();\n for (int i = 0; i < n + m; ++i) {\n id.add(i);\n }\n\n int leftId = m;\n // 给未分配的 item 分配一个 groupId\n for (int i = 0; i < n; ++i) {\n if (group[i] == -1) {\n group[i] = leftId;\n leftId += 1;\n }\n groupItem.get(group[i]).add(i);\n }\n // 依赖关系建图\n for (int i = 0; i < n; ++i) {\n int curGroupId = group[i];\n for (int item : beforeItems.get(i)) {\n int beforeGroupId = group[item];\n if (beforeGroupId == curGroupId) {\n itemDegree[i] += 1;\n itemGraph.get(item).add(i); \n } else {\n groupDegree[curGroupId] += 1;\n groupGraph.get(beforeGroupId).add(curGroupId);\n }\n }\n }\n\n // 组间拓扑关系排序\n List groupTopSort = topSort(groupDegree, groupGraph, id); \n if (groupTopSort.size() == 0) {\n return new int[0];\n }\n int[] ans = new int[n];\n int index = 0;\n // 组内拓扑关系排序\n for (int curGroupId : groupTopSort) {\n int size = groupItem.get(curGroupId).size();\n if (size == 0) {\n continue;\n }\n List res = topSort(itemDegree, itemGraph, groupItem.get(curGroupId));\n if (res.size() == 0) {\n return new int[0];\n }\n for (int item : res) {\n ans[index++] = item;\n }\n }\n return ans;\n }\n\n public List topSort(int[] deg, List> graph, List items) {\n Queue queue = new LinkedList();\n for (int item : items) {\n if (deg[item] == 0) {\n queue.offer(item);\n }\n }\n List res = new ArrayList();\n while (!queue.isEmpty()) {\n int u = queue.poll(); \n res.add(u);\n for (int v : graph.get(u)) {\n if (--deg[v] == 0) {\n queue.offer(v);\n }\n }\n }\n return res.size() == items.size() ? res : new ArrayList();\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190861492","body":"模拟机器人移动\n```java\nclass Solution {\n public boolean judgeCircle(String moves) {\n int x = 0, y = 0;\n int length = moves.length();\n for (int i = 0; i < length; i++) {\n char move = moves.charAt(i);\n if (move == 'U') {\n y--;\n } else if (move == 'D') {\n y++;\n } else if (move == 'L') {\n x--;\n } else if (move == 'R') {\n x++;\n }\n }\n return x == 0 && y == 0;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193745750","body":"模拟\n```java\nclass Solution {\n public int[] getOrder(int[][] ts) {\n int n = ts.length;\n // 将 ts 转存成 nts,保留任务编号\n int[][] nts = new int[n][3];\n for (int i = 0; i < n; i++) nts[i] = new int[]{ts[i][0], ts[i][1], i};\n // 根据任务入队时间进行排序\n Arrays.sort(nts, (a,b)->a[0]-b[0]);\n // 根据题意,先按照「持续时间」排序,再根据「任务编号」排序\n PriorityQueue q = new PriorityQueue<>((a,b)->{\n if (a[1] != b[1]) return a[1] - b[1];\n return a[2] - b[2];\n });\n int[] ans = new int[n];\n for (int time = 1, j = 0, idx = 0; idx < n; ) {\n \t// 如果当前任务可以添加到「队列」中(满足入队时间)则进行入队\n while (j < n && nts[j][0] <= time) q.add(nts[j++]);\n if (q.isEmpty()) {\n\t // 如果当前「队列」没有任务,直接跳到下个任务的入队时间\n time = nts[j][0];\n } else {\n \t// 如果有可执行任务的话,根据优先级将任务出队(记录下标),并跳到该任务完成时间点\n int[] cur = q.poll();\n ans[idx++] = cur[2];\n time += cur[1];\n }\n }\n return ans;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194379645","body":"转化为分钟\n```java\nclass Solution {\n public int numberOfRounds(String loginTime, String logoutTime) {\n int loginHour = Integer.parseInt(loginTime.substring(0, 2));\n int loginMinute = Integer.parseInt(loginTime.substring(3));\n int logoutHour = Integer.parseInt(logoutTime.substring(0, 2));\n int logoutMinute = Integer.parseInt(logoutTime.substring(3));\n int loginTotalMinute = loginHour * 60 + loginMinute;\n int logoutTotalMinute = logoutHour * 60 + logoutMinute;\n if (loginTotalMinute > logoutTotalMinute) {\n logoutTotalMinute += 1440;\n }\n if (loginTotalMinute % 15 != 0) {\n loginTotalMinute += 15 - loginTotalMinute % 15;\n }\n logoutTotalMinute -= logoutTotalMinute % 15;\n return Math.max((logoutTotalMinute - loginTotalMinute) / 15, 0);\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3195332635","body":"分别模拟三个情况\n```java\nclass Solution {\n public int minCharacters(String a, String b) {\n int n = a.length(), m = b.length(), ans = 0x3f3f3f3f;\n int[] c1 = new int[26], c2 = new int[26];\n for (char c : a.toCharArray()) c1[c - 'a']++;\n for (char c : b.toCharArray()) c2[c - 'a']++;\n for (int i = 0; i < 26 && ans != 0; i++) {\n // 3\n int ca = n - c1[i], cb = m - c2[i];\n ans = Math.min(ans, ca + cb);\n if (i == 0) continue;\n int r1 = 0, r2 = 0;\n // 1\n for (int j = i; j < 26; j++) r1 += c1[j];\n for (int j = 0; j < i; j++) r1 += c2[j];\n // 2\n for (int j = i; j < 26; j++) r2 += c2[j];\n for (int j = 0; j < i; j++) r2 += c1[j];\n ans = Math.min(ans, Math.min(r1, r2));\n }\n return ans;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199298563","body":"归并排序\n\n```java\nclass Solution {\n public int[] sortArray(int[] nums) {\n sort(nums,0,nums.length - 1);\n return nums;\n }\n\n public void sort(int[] nums,int start,int end){\n if(start >= end) return;\n int p = para(nums,start,end);\n\n sort(nums,start,p - 1);\n sort(nums,p + 1,end);\n }\n\n public int para(int[] nums,int l,int h){\n\n int x = nums[l];\n int i = l,j = h;\n while(i < j)\n {\n while(i < j && nums[j] >= x) j--;\n if(i < j) nums[i++] = nums[j];\n\n while(i < j && nums[i] < x) i++;\n if(i < j) nums[j--] = nums[i];\n }\n\n nums[i] = x;\n return i;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204106258","body":"二分查找\n```java\nclass Solution {\n public int mySqrt(int x) {\n if(x == 0) return 0;\n if(x == 1) return 1;\n int left = 0;\n int right = x;\n while(left < right)\n {\n int middle = left + (right - left) / 2;\n if(middle > x / middle){\n right = middle;\n }else if(middle < x / middle){\n left = middle + 1;\n }else{\n return middle;\n }\n }\n if(right == x / right){\n return right;\n }else{\n return right - 1;\n }\n\n \n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208985528","body":"二分查找\n```java\npublic class Solution extends VersionControl {\n public int firstBadVersion(int n) {\n int left = 1, right = n;\n while (left < right) { \n int mid = left + (right - left) / 2; \n if (isBadVersion(mid)) {\n right = mid; \n } else {\n left = mid + 1; \n }\n }\n return left;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3213255556","body":"```java\nclass Solution {\n public int reversePairs(int[] nums) {\n if (nums.length == 0) {\n return 0;\n }\n return reversePairsRecursive(nums, 0, nums.length - 1);\n }\n\n public int reversePairsRecursive(int[] nums, int left, int right) {\n if (left == right) {\n return 0;\n } else {\n int mid = (left + right) / 2;\n int n1 = reversePairsRecursive(nums, left, mid);\n int n2 = reversePairsRecursive(nums, mid + 1, right);\n int ret = n1 + n2;\n\n // 首先统计下标对的数量\n int i = left;\n int j = mid + 1;\n while (i <= mid) {\n while (j <= right && (long) nums[i] > 2 * (long) nums[j]) {\n j++;\n }\n ret += j - mid - 1;\n i++;\n }\n\n // 随后合并两个排序数组\n int[] sorted = new int[right - left + 1];\n int p1 = left, p2 = mid + 1;\n int p = 0;\n while (p1 <= mid || p2 <= right) {\n if (p1 > mid) {\n sorted[p++] = nums[p2++];\n } else if (p2 > right) {\n sorted[p++] = nums[p1++];\n } else {\n if (nums[p1] < nums[p2]) {\n sorted[p++] = nums[p1++];\n } else {\n sorted[p++] = nums[p2++];\n }\n }\n }\n for (int k = 0; k < sorted.length; k++) {\n nums[left + k] = sorted[k];\n }\n return ret;\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216192351","body":"```java\nclass Solution {\n public int findRadius(int[] houses, int[] heaters) {\n int ans = 0;\n Arrays.sort(heaters);\n for (int house : houses) {\n int i = binarySearch(heaters, house);\n int j = i + 1;\n int leftDistance = i < 0 ? Integer.MAX_VALUE : house - heaters[i];\n int rightDistance = j >= heaters.length ? Integer.MAX_VALUE : heaters[j] - house;\n int curDistance = Math.min(leftDistance, rightDistance);\n ans = Math.max(ans, curDistance);\n }\n return ans;\n }\n\n public int binarySearch(int[] nums, int target) {\n int left = 0, right = nums.length - 1;\n if (nums[left] > target) {\n return -1;\n }\n while (left < right) {\n int mid = (right - left + 1) / 2 + left;\n if (nums[mid] > target) {\n right = mid - 1;\n } else {\n left = mid;\n }\n }\n return left;\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"falsity":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073705405","body":"# 思路\n\n从低位往高位计算, 每次计算保留进位数据,本位留下余数\n\n```python\nclass Solution(object):\n def addToArrayForm(self, num, k):\n \"\"\"\n :type num: List[int]\n :type k: int\n :rtype: List[int]\n \"\"\"\n result = []\n i = len(num) - 1\n while i >=0 or k > 0:\n if i >= 0:\n k += num[i]\n i -= 1\n result.append(k % 10)\n k = k // 10\n return result[::-1]\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3079013152","body":"# 【Day 2】821. 字符的最短距离\n\n## 思路\n\n先遍历一遍获取c的位置列表, 再遍历每个位置计算最近的距离\n\n```python\nclass Solution(object):\n def shortestToChar(self, s, c):\n \"\"\"\n :type s: str\n :type c: str\n :rtype: List[int]\n \"\"\"\n locations = []\n result = []\n for i, char in enumerate(s):\n if char == c:\n locations.append(i)\n \n for i in range(len(s)):\n shortest = min(abs(i - location) for location in locations)\n result.append(shortest)\n return result\n```\n\n时间复杂度: O(n*m), m为字符c出现次数,最差为O(n^2)\n\n空间复杂度: O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084580543","body":"**【Day 3】1381. 设计一个支持增量操作的栈**\n\n*** 思路***\n\n用数组模拟栈\n\n```python\nclass CustomStack(object):\n\n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def __init__(self, maxSize):\n \"\"\"\n :type maxSize: int\n \"\"\"\n self.stack = [0] * maxSize\n self.top = -1\n \n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n if self.top < len(self.stack) - 1:\n self.top += 1\n self.stack[self.top] = x\n \n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if self.top == -1:\n return -1\n value = self.stack[self.top]\n self.top -= 1\n return value\n \n # 时间复杂度: O(k)\n # 空间复杂度: O(n)\n def increment(self, k, val):\n \"\"\"\n :type k: int\n :type val: int\n :rtype: None\n \"\"\"\n lim = min(k, self.top + 1)\n for i in range(lim):\n self.stack[i] += val\n \n\n\n# Your CustomStack object will be instantiated and called as such:\n# obj = CustomStack(maxSize)\n# obj.push(x)\n# param_2 = obj.pop()\n# obj.increment(k,val)\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089882117","body":"**【Day 4】394. 字符串解码**\n\n**思路**\n\n参照[Krahets的字符串解码题解](https://leetcode.cn/problems/decode-string/solutions/19447/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd/)中的辅助栈解法,利用栈来存储每一层[]中的字符串和需要重复的次数逐层拼接字符串,最后得到结果.\n\n**代码**\n\n```python\nclass Solution(object):\n def decodeString(self, s):\n \"\"\"\n :type s: str\n :rtype: str\n \"\"\"\n stack, res, multi = [], \"\", 0\n for c in s:\n if c == '[':\n stack.append([multi, res])\n res, multi = \"\", 0\n elif c == ']':\n cur_multi, last_res = stack.pop()\n res = last_res + cur_multi * res\n elif '0' <= c <= '9':\n multi = multi * 10 + int(c)\n else:\n res += c\n return res \n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(N)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092420487","body":"**【Day 5】232. 用栈实现队列**\n\n**思路**\n\n利用栈先进后出的性质,通过stack1完成元素的倒序放置,再将stack1的元素放入stack2中,前面的元素就放在了栈顶. 此时经过两次入栈出栈的操作stack2中的元素就满足了先进先出的要求.\n\n但是要注意以下问题:\n\n1. 只有在stack2中元素为空时才能将stack1中的元素放入stack2中,这样才能保证有序性\n2. 遍历list元素要使用while, 不能用for,否则会有元素被跳过\n\n**代码**\n\n```python\nclass MyQueue(object):\n\n def __init__(self):\n self.stack1, self.stack2 = [], []\n \n\n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n self.stack1.append(x)\n \n\n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n res = self.peek()\n return self.stack2.pop()\n \n\n def peek(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if self.stack2:\n return self.stack2[-1]\n elif self.stack1:\n while self.stack1:\n self.stack2.append(self.stack1.pop())\n return self.stack2[-1]\n else:\n return -1\n \n\n def empty(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n return not self.stack1 and not self.stack2\n \n\n\n# Your MyQueue object will be instantiated and called as such:\n# obj = MyQueue()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.peek()\n# param_4 = obj.empty()\n```\n\n**复杂度分析**\n\n时间复杂度: push, empty 是O(1), pop, peek是O(N)\n空间复杂度: O(N)\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097331008","body":"**【Day 7】61. 旋转链表**\n\n**思路**\n\nk可能会大于链表长度导致循环遍历链表. 所以真实的旋转偏移是k%n,n为链表长度. 使用双指针找到需要断开的节点位置,将链表进行断开和重新拼接即可得到结果\n\n```pyth\nclass Solution(object):\n def rotateRight(self, head, k):\n \"\"\"\n :type head: Optional[ListNode]\n :type k: int\n :rtype: Optional[ListNode]\n \"\"\"\n if k == 0 or not head or not head.next:\n return head\n\n node = head\n l = 0\n while node:\n l += 1\n node = node.next\n \n if k % l == 0:\n return head\n k = k % l\n slow = fast = head\n for i in range(k):\n fast = fast.next\n \n while fast.next:\n slow = slow.next\n fast = fast.next\n\n new_head = slow.next\n slow.next = None\n fast.next = head\n return new_head\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103411213","body":"**【Day 8】24. 两两交换链表中的节点**\n\n**思路**\n\n类似于反转链表, 用两个指针来对链表指向进行修改,唯一的区别是cur需要间隔一个进行遍历,而不是逐个遍历\n\n```python\nclass Solution(object):\n def swapPairs(self, head):\n \"\"\"\n :type head: Optional[ListNode]\n :rtype: Optional[ListNode]\n \"\"\"\n dummy = ListNode()\n dummy.next = head\n pre = dummy\n cur = head\n while cur and cur.next:\n nxt = cur.next\n cur.next = nxt.next\n nxt.next = cur\n pre.next = nxt\n pre = cur\n cur = cur.next\n \n return dummy.next\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109176294","body":"**【Day 9】109. 有序链表转换二叉搜索树**\n\n**思路**\n\n首先获取链表的长度,再根据二叉树的中序遍历方式递归构建BST, 根节点的值在遍历完左子树后刚好移动了m次到达中间节点,即根节点位置\n\n\n\n```python\nclass Solution:\n def sortedListToBST(self, head: Optional[ListNode]) -> Optional[TreeNode]:\n def getLength(head: ListNode) -> int:\n count = 0\n while head:\n count += 1\n head = head.next\n return count\n\n def buildBST(left: int, right: int) -> TreeNode:\n if left > right:\n return None\n m = (left + right) // 2\n root = TreeNode()\n left_node = buildBST(left, m - 1)\n nonlocal head\n root.val = head.val\n head = head.next\n \n right_node = buildBST(m+1, right)\n root.left = left_node\n root.right = right_node\n return root\n\n l = getLength(head)\n return buildBST(0, l - 1)\n```\n\n**复杂度分析**\n\n时间复杂度: O(n)\n空间复杂度: O(log n)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3122088595","body":"**【Day 12】146. LRU 缓存机制**\n\n**思路**\n\n`get` 和 `put` 必须以 `O(1)` 的平均时间复杂度运行, 说明需要使用到map. 需要记录关键字使用过的顺序需要使用到链表\n\nget方法需要查询map, 如果key存在则返回值,如果不存在则返回-1. 查询完成后,需要把该节点移动到队首(删除后再插入队首)\n\nput方法需要先查询map容量,如果容量已满,需要通过list找到队尾元素删除, 并将新元素插入队首\n\nnode需要知道前后节点,所以使用双向链表,map和node之间建立映射方便查询数据\n\n\n\n需要的内部函数: 删除元素, 将元素插入队首\n\n```python\nclass LRUCache:\n class Node:\n def __init__(self, key: int, val: int):\n self.key = key\n self.val = val\n self.pre = pre\n self.next = next\n\n def __init__(self, capacity: int):\n self.capacity = capacity\n self.dummy = self.Node(-1, -1)\n self.dummy.pre = self.dummy\n self.dummy.next = self.dummy\n self.map = {}\n\n def add_node_to_head(self, node: Node):\n node.pre = self.dummy\n node.next = self.dummy.next\n self.dummy.next.pre = node\n self.dummy.next = node\n\n def remove_node(self, node: Node):\n node.pre.next = node.next\n node.next.pre = node.pre\n\n def get(self, key: int) -> int:\n if key not in self.map:\n return -1\n\n node = self.map[key]\n self.remove_node(node)\n self.add_node_to_head(node)\n return node.val\n\n def put(self, key: int, value: int) -> None:\n if key in self.map:\n node = self.map[key]\n node.val = value\n self.remove_node(node)\n self.add_node_to_head(node)\n return\n\n new_node = self.Node(key, value)\n self.map[key] = new_node\n self.add_node_to_head(new_node)\n\n if len(self.map) > self.capacity:\n tail = self.dummy.pre\n del self.map[tail.key]\n self.remove_node(tail)\n\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124440801","body":"**【Day 13】104. 二叉树的最大深度**\n\n**思路**\n\n二叉树的最大深度为max(左子树深度, 右子树深度) + 1, 这就变成了一个递归问题\n\n```python\nclass Solution(object):\n def maxDepth(self, root):\n \"\"\"\n :type root: Optional[TreeNode]\n :rtype: int\n \"\"\"\n if root is None:\n return 0\n if root is not None and root.left is None and root.right is None:\n return 1\n return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1\n\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127200969","body":"**【Day 14】100. 相同的树**\n\n**思路**\n\n相同的树一定根节点相同,并且左子树和右子树都相同, 可以进行递归判断所有子树是否相同\n\n```python\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if p is None or q is None:\n return p is q\n \n if p.val == q.val:\n return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)\n else:\n return False\n```\n\n**复杂度分析**\n\n时间复杂度: O(min(m,n)) m为p节点个数,n为q节点个数\n空间复杂度: O(min(m,n)) m为p节点个数,n为q节点个数","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136787502","body":"**【Day 16】513. 找树左下角的值**\n\n**思路**\n\n从右往左层序遍历,最后一个节点就是左下角的点\n\n```python\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n q = deque([root])\n while q:\n node = q.popleft()\n if node.right: q.append(node.right)\n if node.left: q.append(node.left)\n return node.val\n```\n\n**复杂度分析**\n\n时间复杂度: O(n) \n空间复杂度: O(n)\n\n","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3151014729","body":"**【Day 21】447. 回旋镖的数量**\n\n**思路**\n\n首先计算距离相等的点的数量,在计算相同距离点之间的排列组合数量\n\n```python\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n res = 0\n n = len(points)\n if n < 3:\n return 0\n \n for i in range(n):\n x0, y0 = points[i]\n dist_count = {}\n \n for j in range(n):\n if i == j:\n continue\n \n x1, y1 = points[j]\n dx = x1 - x0\n dy = y1 - y0\n dist_sq = dx * dx + dy * dy\n \n dist_count[dist_sq] = dist_count.get(dist_sq, 0) + 1\n \n for cnt in dist_count.values():\n res += cnt * (cnt - 1)\n \n return res\n```\n\n时间复杂度: O(n ^ 2)\n\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3175046868","body":"**【Day 28】239. 滑动窗口最大值**\n\n```python\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n n = len(nums)\n if n == 0 or k == 0:\n return []\n \n res = []\n q = deque() \n for i in range(n):\n while q and q[0] < i - k + 1:\n q.popleft()\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n if i >= k - 1:\n res.append(nums[q[0]])\n return res\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3179722453","body":"\n\n```python\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n in_list = [0] * (n + 1)\n out_list = [0] * (n + 1)\n for i in trust:\n in_list[i[1]] += 1\n out_list[i[0]] += 1\n\n for i in range(1, n+1):\n if in_list[i] == n - 1 and out_list[i] == 0:\n return i\n\n return -1\n```\n\n时间复杂度: O(n + m), m为trust列表长度\n\n空间复杂度: O(n)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194443006","body":"```python\nclass Solution:\n def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:\n start = 60 * int(loginTime[:2]) + int(loginTime[3:])\n end = 60 * int(logoutTime[:2]) + int(logoutTime[3:])\n if start > end:\n end += 24 * 60\n start = math.ceil(start / 15) * 15\n end = end // 15 * 15\n return max(0, (end - start) // 15)\n```\n\n时间复杂度: O(1)\n\n空间复杂度: O(1)\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3200900420","body":"快排\n```java\n class Solution {\n public int[] sortArray(int[] nums) {\n quickSort(nums, 0, nums.length - 1);\n return nums;\n }\n\n private void quickSort(int[] nums, int low, int high){\n if(low < high){\n int mid = partition(nums, low, high);\n quickSort(nums, low, mid - 1);\n quickSort(nums, mid + 1, high);\n }\n }\n\n private int partition(int[] nums, int low, int high){\n int pivot = low + (int) (Math.random() * (high - low + 1));\n swap(nums, pivot, low);\n int i = low, j = low + 1;\n while (j <= high){\n if(nums[j] < nums[low]){\n swap(nums, j, ++i);\n }\n j++;\n }\n swap(nums, low, i);\n return i;\n }\n\n private void swap(int[] nums, int i, int j){\n int tmp = nums[i];\n nums[i] = nums[j];\n nums[j] = tmp;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3224529913","body":"思路: 采用定长滑动窗口的做法, 先初始化定长窗口,再移动更新结果\n\n```python\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n ans = count = 0\n vowels = set(['a', 'e', 'i', 'o', 'u'])\n chars = list(s)\n n = len(chars)\n left = right = 0\n while right < k:\n if chars[right] in vowels:\n count += 1\n right += 1\n ans = count\n while right < n:\n if chars[right] in vowels:\n count += 1\n if chars[left] in vowels:\n count -= 1\n ans = max(count, ans)\n left += 1\n right += 1\n return ans\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3228513919","body":"\n\n```java\nclass Solution {\n public double new21Game(int n, int k, int maxPts) {\n if( k > n){\n return 0;\n }\n if((k == 0 && n >= 0) && n > k + maxPts){\n return 1;\n }\n\n int len = k + maxPts;\n double[] dp = new double[len];\n double sum = 0;\n\n for(int i = k; i < len && i <= n; i++){\n dp[i] = 1;\n sum++;\n }\n\n for(int i = k - 1; i >= 0; i--){\n dp[i] = sum / maxPts;\n sum = sum - dp[i + maxPts] + dp[i];\n }\n return dp[0];\n }\n}\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(n)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3240213950","body":"**\n\n```python\nclass Solution:\n def readBinaryWatch(self, turnedOn: int) -> List[str]:\n ans = []\n for h in range(12):\n for m in range(60):\n if bin(h).count('1') + bin(m).count('1') == turnedOn:\n ans.append(f\"{h}:{m:02d}\")\n \n return ans\n```\n\n时间复杂度: O(1)\n\n空间复杂度: O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245665636","body":"\n\n```python\nclass Solution:\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n # 时间复杂度: O(mn)\n # 空间复杂度: O(mn)\n ans = 0\n m, n = len(grid), len(grid[0])\n\n def dfs(i: int, j: int) -> int:\n count = 1\n grid[i][j] = 0\n for x, y in (i-1, j), (i+1, j), (i, j-1), (i, j+1):\n if 0<= x < m and 0 <= y < n and grid[x][y]:\n count += dfs(x, y)\n return count\n\n for i, row in enumerate(grid):\n for j, x in enumerate(row):\n if x:\n ans = max(ans, dfs(i, j))\n\n return ans\n \n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3253854706","body":"\n```python\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n # 时间复杂度: O(n)\n # 空间复杂度: O(n)\n ans = 0\n q = initialBoxes\n while q:\n p = []\n for i in q:\n if status[i] == 0:\n p.append(i)\n continue\n ans += candies[i]\n for key in keys[i]:\n status[key] = 1\n for c in containedBoxes[i]:\n p.append(c)\n if p == q or not p:\n break\n q = p\n return ans\n```","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3271174778","body":"\n\n```java\nclass Solution {\n public int longestCommonSubsequence(String text1, String text2) {\n # 时间复杂度: O(mn)\n # 空间复杂度: O(mn)\n int m = text1.length(), n = text2.length();\n int[][] dp = new int[m+1][n+1];\n for (int i = 1; i <= m; i++) {\n char c1 = text1.charAt(i - 1);\n for (int j = 1; j <= n; j++) {\n char c2 = text2.charAt(j - 1);\n if (c1 == c2){\n dp[i][j] = dp[i - 1][j-1] + 1;\n }else{\n dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);\n }\n\n }\n }\n return dp[m][n];\n }\n}\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3275118967","body":"时间复杂度: O(m * n)\n\n空间复杂度: ~~O(n)~~ 题解指正行列可以交换, 所以为O(min(m, n))\n\n```python\nclass Solution:\n def uniquePaths(self, m: int, n: int) -> int:\n f = [1] * n\n\n for i in range(1, m):\n for j in range(1, n):\n f[j] += f[j - 1]\n return f[n - 1]\n \n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289638493","body":"```python\nclass Solution:\n def findTargetSumWays(self, nums: List[int], target: int) -> int:\n # 时间复杂度: O(n * target)\n # 空间复杂度: O(n * target)\n @cache\n def dfs(i: int, c: int) -> int:\n if i < 0:\n return 1 if c == 0 else 0\n \n return dfs(i - 1, c - nums[i]) + dfs(i - 1, c + nums[i])\n \n return dfs(len(nums) - 1, target)\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3298968000","body":"```python\nclass Solution:\n def change(self, amount: int, coins: List[int]) -> int:\n \t# 时间复杂度(n * amount)\n # 空间复杂度(amount)\n f = [1] + [0] * amount\n for x in coins:\n for c in range(x, amount + 1):\n f[c] += f[c - x]\n return f[-1]\n```","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316065059","body":"```python\nclass Solution:\n def mergeTwoLists(self, list1:Optional[ListNode], list2:Optional[ListNode]) -> Optional[ListNode]:\n cur = dummy = ListNode()\n while list1 and list2:\n if list1.val < list2.val:\n cur.next = list1\n list1 = list1.next\n else:\n cur.next = list2\n list2 = list2.next\n cur = cur.next\n cur.next = list1 if list1 else list2\n return dummy.next\n\n def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:\n # 时间复杂度: O(L * logm) m 为 lists 的长度,L 为所有链表的长度之和\n # 空间复杂度: O(1)\n m = len(lists)\n if m == 0:\n return None\n step = 1\n while step < m:\n for i in range(0, m - step, step * 2):\n lists[i] = self.mergeTwoLists(lists[i], lists[i + step])\n step *= 2\n return lists[0]\n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3334653673","body":"思路: 用Node来创建一个树, 每个node下面可以存下一个字母的node, 并且每个node有个end标志位,用来表示单词结尾\n\n```python\nclass Node:\n __slots__ = \"son\", \"end\"\n\n def __init__(self):\n self.son = {}\n self.end = False\n\n\nclass Trie:\n def __init__(self):\n self.root = Node()\n\n # 时间复杂度: O(n)\n def insert(self, word: str) -> None:\n cur = self.root\n for c in word:\n if c not in cur.son:\n cur.son[c] = Node()\n cur = cur.son[c]\n cur.end = True\n\n # 时间复杂度: O(n)\n def find(self, word: str) -> int:\n cur = self.root\n for c in word:\n if c not in cur.son:\n return 0\n cur = cur.son[c]\n return 2 if cur.end else 1\n \n # 时间复杂度: O(n)\n def search(self, word: str) -> bool:\n return self.find(word) == 2\n\n # 时间复杂度: O(n)\n def startsWith(self, prefix: str) -> bool:\n return self.find(prefix) != 0\n```\n\n空间复杂度: O(m * n) m为insert次数, n为单词长度","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuetong3yu":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073754281","body":"```js\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(nums, k) {\n let str1 = '', str2 = String(k)\n for(let i = 0; i < nums.length; i++) {\n str1 += nums[i];\n }\n // swap to make sure str1 is longer than str2\n if (str1.length < str2.length) {\n const t = str1;\n str1 = str2;\n str2 = t;\n }\n const res = new Array(str1.length).fill(0);\n let p1 = str1.length - 1, p2 = str2.length - 1;\n while(p1 >= 0) {\n res[p1] = Number(str1[p1]) + Number(str2[p2] ?? 0);\n p1 --, p2 --;\n }\n const len = res.length\n let need_shift = false\n for (let i = len - 1; i >= 0; i--) {\n if (res[i] >= 10) {\n if (i === 0) {\n need_shift = true\n } else {\n res[i - 1] = res[i - 1] + 1;\n }\n res[i] = res[i] % 10\n }\n }\n if (need_shift) res.unshift(1)\n return res;\n};\n```\n\n尝试了几个不同的方法。。。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078802551","body":"模拟题意AC,但感觉第二遍 for 循环没必要循环整个 indexes 数组,indexes 数组是天然有序的,应该可以用双指针优化\n\n```js\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const indexes = []\n for(let i = 0; i < s.length; i++) {\n if (s[i] === c) indexes.push(i);\n }\n const res = [];\n for(let i = 0; i < s.length; i++) {\n let min = Infinity\n for(let j = 0; j < indexes.length; j++) {\n min = Math.min(min, Math.abs(i - indexes[j]));\n }\n res.push(min)\n }\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082104676","body":"思路一直接模拟题意,increment 操作循环遍历一遍让元素自增:\n\n```js\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.stack = []\n this.size = 0\n this.maxSize = maxSize\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.size === this.maxSize) return;\n this.stack.push(x);\n this.size ++\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.size === 0) return -1\n const res = this.stack.pop();\n this.size --\n return res;\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n for(let i = 0; i < this.size;i ++) {\n if (i < k) {\n this.stack[i] += val;\n }\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n---\n\n\n思路二使用一个 hashmap 维护自增量,只有在 pop 操作的时候才去运算:\n\n```js\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.stack = []\n this.size = 0\n this.maxSize = maxSize\n this.map = {}\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.size === this.maxSize) return;\n this.stack.push(x);\n this.size ++\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.size === 0) return -1\n const inc = this.map[this.size - 1] || 0;\n const res = this.stack.pop();\n // update inc\n if (inc) {\n this.map[this.size - 1] = 0;\n this.map[this.size - 2] = this.map[this.size - 2] ? this.map[this.size - 2] + inc : inc;\n }\n this.size --\n\n return res + inc;\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n const key = Math.min(k - 1, this.size - 1);\n this.map[key] = this.map[key] ? this.map[key] + val : val;\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n🥲 结果跑出来只打败了 18% 的人,应该是题目给的数据量量太小了 <= 1000,操作 hashmap 的 cost 超过了循环 stack 的时间,不如方法一暴力循环。。。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089570929","body":"用栈秒了\n\n```js\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let i = 0;\n while(i < s.length) {\n const char = s[i];\n if (char !== ']') {\n stack.push(char)\n i ++\n } else {\n let repeatStr = ''\n while(stack[stack.length - 1] !== '[') {\n const new_char = stack.pop();\n repeatStr = new_char + repeatStr;\n }\n // pop '['\n stack.pop()\n // get number \n let repeat_times = ''\n while(/[0-9]/.test(stack[stack.length - 1])) {\n repeat_times = stack.pop() + repeat_times\n }\n repeat_times = Number(repeat_times)\n stack.push(repeatStr.repeat(repeat_times));\n i ++\n }\n }\n let res = ''\n while(stack.length) {\n res = stack.pop() + res;\n }\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091373955","body":"思路:用两个栈模拟操作,在 peek 的时候出第二个栈的顶部即可\n\n\n```js\nvar MyQueue = function() {\n this.a = [];\n this.b = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.a.push(x);\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n this.peek();\n return this.b.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if (this.b.length) {\n return this.b[this.b.length - 1]\n } else {\n while(this.a.length) {\n this.b.push(this.a.pop())\n }\n return this.peek()\n }\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return !this.a.length && !this.b.length\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094511265","body":"用了一个简单的前缀和 AC 了,时间复杂度也是 NlogN\n\n```js\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const sorted_arr = [...arr].sort((a, b) => a - b);\n let count_a = count_b = res = 0;\n\n for(let i = 0; i < arr.length;i ++) {\n count_a += sorted_arr[i];\n count_b += arr[i];\n\n if (count_a === count_b) res ++ \n }\n\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3096927980","body":"```js\nvar rotateRight = function(head, k) {\n if (!head || !head.next || k === 0) return head;\n\n // Count the length of the list\n let length = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n length++;\n }\n\n // Normalize k\n k %= length;\n if (k === 0) return head;\n\n // Find the new tail: (length - k - 1)th node\n let newTail = head;\n for (let i = 0; i < length - k - 1; i++) {\n newTail = newTail.next;\n }\n\n // Rotate\n let newHead = newTail.next;\n newTail.next = null;\n tail.next = head;\n\n return newHead;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100186608","body":"考察交换链表节点的基本操作,需要注意的是“什么时候使用 dummy 节点”的技巧。我的理解是在需要涉及到头节点操作的时候,就创建 dummy 节点。比如这一题 - 交换头两个节点的时候就会涉及到头节点的变更。\n\n\n```js\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n const dummy = new ListNode(null, head);\n let p = dummy;\n while(p.next && p.next.next) {\n const p1 = p.next, p2 = p.next.next;\n p.next = p2;\n p1.next = p2.next;\n p2.next = p1;\n p = p1\n }\n return dummy.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3108866758","body":"Same solution with Problem108. But this problem is giving List instead plain array. So will need to use the trick of two pointers to get the mid node of a Single List.\n\n```js\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if (!head) return null\n return helper(head, null)\n\n function helper(head, tail) {\n if (head === tail) return null;\n let fast = head;\n let slow = head;\n while(fast !== tail && fast.next !== tail) {\n fast = fast.next.next;\n slow = slow.next;\n }\n const root = new TreeNode(slow.val);\n root.left = helper(head, slow);\n root.right = helper(slow.next, tail);\n return root\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111667789","body":"A small trick here is `pa !== pb` and `return pa`. For negative scenarios, if given Lists were not intersected, then one of the Lists must be pointing to `null`, and then returning `null` is expected answer. \n\n```js\nvar getIntersectionNode = function(headA, headB) {\n let pa = headA, pb = headB;\n while(pa !== pb) {\n pa = pa ? pa.next : headB;\n pb = pb ? pb.next : headA;\n }\n return pa\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3115364562","body":"Find the intersection node first, and move the slow pointer to the head, and slowly move both of the pointers till they meet each other(can be proved)\n\n```js\nvar detectCycle = function(head) {\n if (!head) return head;\n let fast = head, slow = head;\n // step1: find the intersection node\n while(fast && fast.next) {\n fast = fast.next.next;\n slow = slow.next;\n // step2: find the entry of the cycle\n if (fast === slow) {\n slow = head;\n while(fast !== slow) {\n fast = fast.next\n slow = slow.next\n }\n return slow;\n }\n }\n return null;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3120830111","body":"In JS, we need to build a double linked list data structure by our own. The rest of the logic is quite straight forward - which use hashmap to save key-node, and use linked list to store access frequency. \n\n```js\nclass DoubleLinkedListNode {\n constructor(key, value) {\n this.key = key;\n this.value = value;\n this.prev = null;\n this.next = null;\n }\n}\n\nclass LRUCache {\n constructor(capacity) {\n this.capacity = capacity;\n this.usedSpace = 0;\n\n this.hashmap = {};\n this.dummyHead = new DoubleLinkedListNode(null, null);\n this.dummyTail = new DoubleLinkedListNode(null, null);\n this.dummyHead.next = this.dummyTail;\n this.dummyTail.prev = this.dummyHead;\n }\n\n _isFull() {\n return this.usedSpace === this.capacity;\n }\n _addToHead(node) {\n const currentHead = this.dummyHead.next;\n\n node.next = currentHead;\n node.prev = this.dummyHead;\n currentHead.prev = node;\n this.dummyHead.next = node;\n\n return node;\n }\n _removeNode(node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n node.next = null\n node.prev = null\n return node\n }\n\n get(key) {\n if (this.hashmap[key] !== undefined) {\n const node = this.hashmap[key];\n this._addToHead(this._removeNode(node));\n return node.value\n } else {\n return -1\n }\n }\n put(key, value) {\n if (this.hashmap[key] !== undefined) {\n const node = this.hashmap[key];\n node.value = value;\n this._addToHead(this._removeNode(node))\n } else {\n if (this._isFull()) {\n const nodeNeedToEvict = this.dummyTail.prev;\n delete this.hashmap[nodeNeedToEvict.key];\n this._removeNode(nodeNeedToEvict);\n this.usedSpace --\n }\n const node = new DoubleLinkedListNode(key, value);\n this.hashmap[key] = node;\n this._addToHead(node);\n this.usedSpace ++\n }\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123671763","body":"Easy\n\n```js\nvar maxDepth = function(root) {\n if (!root) return 0\n return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3124879038","body":"DFS\n\n```js\nvar isSameTree = function(p, q) {\n if (!p && !q) return true\n if (!p || !q) return false\n return p.val === q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130312988","body":"DFS will be much simpler. BFS will need to pass a lot of context(params) into helper function which I don't like and not maintainable as well.\n\n\n```js\nvar sumNumbers = function(root) {\n const res = [];\n dfs(root, '')\n return res.reduce((prev, cur) => prev + cur, 0);\n\n\n function dfs(node, str) {\n if (!node.left && !node.right) {\n res.push(+`${str}${node.val}`);\n return;\n }\n if (node.left) dfs(node.left, `${str}${node.val}`);\n if (node.right) dfs(node.right, `${str}${node.val}`);\n } \n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135220392","body":"Using BFS when accessing the first in the queue, that's the leftest node. And because BFS is looping thru by level, so the last time going thru the queue is the most bottom level. \n\n```js\nvar findBottomLeftValue = function(root) {\n const queue = [root];\n let min = null;\n while(queue.length) {\n const size = queue.length;\n for(let i = 0; i < size; i++) {\n const node = queue.shift();\n if (i === 0) min = node.val\n \n\n if (node.left) queue.push(node.left);\n if (node.right) queue.push(node.right);\n }\n }\n return min;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138261960","body":"Can use either `DFS` or `BFS` to solve the problem. DFS is more simple to me: \n\n```js\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n let res = [];\n function dfs(node) {\n if (!node) {\n res.push('null');\n return;\n }\n res.push(String(node.val));\n dfs(node.left)\n dfs(node.right)\n }\n dfs(root);\n console.log(res.join(','))\n return res.join(',')\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n const datas = data.split(',');\n let i = 0;\n return dfs()\n\n function dfs() {\n const char = datas[i];\n if (char === 'null') {\n i ++\n return null\n }\n const node = new TreeNode(+char);\n i ++\n node.left = dfs()\n node.right = dfs()\n return node;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144933267","body":"Use BFS to save the row and column as index, and then sort these indexes. I think the complexity of this problem is how to mange those keys, 2 dimensions keys are quite intricate. \n\nRuntime complexity: O(nlogn), looping over the nodes is O(n), and using `sort` functions are O(nlogn), the bottle neck is sorting functions\nMemory complexity: O(n), use a hashmap to store all nodes\n\n```js\nvar verticalTraversal = function(root) {\n const map = {}\n const queue = [{\n node: root,\n col: 0,\n }];\n let row = 0;;\n while(queue.length) {\n const size = queue.length;\n for(let i = 0; i < size; i++) {\n const cur = queue.shift();\n const node = cur.node;\n if (map[cur.col]?.[row] === undefined) {\n map[cur.col] = {\n ...map[cur.col],\n [row]: [node.val]\n }\n } else {\n map[cur.col][row].push(node.val);\n }\n if (node.left) queue.push({\n node: node.left, \n col: cur.col - 1,\n })\n if (node.right) queue.push({\n node: node.right,\n col: cur.col + 1\n })\n }\n row ++\n }\n const orderByColumn = Object.entries(map).sort(([key1, _], [key2, __]) => Number(key1) - Number(key2));\n const flatternByColumn = orderByColumn.map(i => {\n const column = i[1];\n const arr = [];\n Object.entries(column).sort(([row1], [row2]) => row1 - row2).forEach(([_row, nodes]) => {\n const orderedNodes = nodes.sort((a, b) => a - b);\n arr.push(...orderedNodes)\n })\n return arr\n })\n return flatternByColumn\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146516199","body":"```js\nvar twoSum = function(nums, target) {\n const map = {}\n for(let i = 0; i < nums.length; i ++) {\n const num = nums[i];\n const diff = target - num\n if (map[diff] !== undefined) {\n return [map[diff], i];\n } else {\n map[num] = i;\n }\n }\n return [-1, -1]\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148419003","body":"```js\nvar topKFrequent = function(nums, k) {\n const map = {};\n for(let i = 0; i < nums.length; i++) {\n map[nums[i]] = map[nums[i]] ? map[nums[i]] + 1 : 1;\n }\n const maxCnt = Math.max(...Object.values(map));\n\n const buckets = Array.from({length: maxCnt + 1}, () => []);\n for(let [num, count] of Object.entries(map)) {\n buckets[count].push(num);\n }\n\n const res = [];\n for(let i = maxCnt; i >= 0 && res.length < k; i--) {\n res.push(...buckets[i])\n }\n \n return res.map(i => +i)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149124973","body":"Using brute force at the beginning, and didn't think of can use map to reduce runtime: \n\n```js\nvar numberOfBoomerangs = function(points) {\n let res = 0;\n let map = {}\n for(let [x1, y1] of points) {\n map = {}\n for(let [x2, y2] of points) {\n const distance = (x1 - x2) ** 2 + (y1 - y2) ** 2;\n const count = map[distance] ?? 0;\n res += count * 2;\n map[distance] = count + 1 \n }\n }\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3155367267","body":"Two pointers classic problem (sliding window): \n\n```js\nvar lengthOfLongestSubstring = function(s) {\n let left = 0, right = 0, res = 0\n const window = {};\n while(right < s.length) {\n const right_char = s[right ++];\n window[right_char] = window[right_char] ? window[right_char] + 1 : 1;\n while (window[right_char] > 1) {\n let remove_char = s[left ++];\n window[remove_char] --;\n }\n res = Math.max(right - left, res);\n }\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160227870","body":"so hard: \n\n\n```js\nvar findSubstring = function(s, words) {\n\n const wordLen = words[0].length;\n const numWords = words.length;\n const totalLen = wordLen * numWords;\n const n = s.length;\n const res = [];\n\n if (n < totalLen) return [];\n\n const wordCount = new Map();\n for (let word of words) {\n wordCount.set(word, (wordCount.get(word) || 0) + 1);\n }\n\n // we loop over wordLen offsets\n for (let offset = 0; offset < wordLen; offset++) {\n let left = offset, count = 0;\n const seen = new Map();\n\n for (let right = offset; right + wordLen <= n; right += wordLen) {\n const word = s.slice(right, right + wordLen);\n\n if (wordCount.has(word)) {\n seen.set(word, (seen.get(word) || 0) + 1);\n count++;\n\n // we shrink window if word is overused\n while (seen.get(word) > wordCount.get(word)) {\n const leftWord = s.slice(left, left + wordLen);\n seen.set(leftWord, seen.get(leftWord) - 1);\n left += wordLen;\n count--;\n }\n\n // Valid window\n if (count === numWords) {\n res.push(left);\n const firstWord = s.slice(left, left + wordLen);\n seen.set(firstWord, seen.get(firstWord) - 1);\n left += wordLen;\n count--;\n }\n } else {\n seen.clear();\n count = 0;\n left = right + wordLen;\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3164450266","body":"```js\nvar minSubarray = function(nums, p) {\n let totalSum = nums.reduce((a, b) => a + b, 0);\n\n // Find the remainder when total sum is divided by p\n let rem = totalSum % p;\n if (rem === 0) return 0; // If the remainder is 0, no subarray needs to be removed\n\n let prefixMod = new Map();\n prefixMod.set(0, -1); // Initialize to handle full prefix\n let prefixSum = 0;\n let minLength = nums.length;\n\n for (let i = 0; i < nums.length; i++) {\n prefixSum += nums[i];\n let currentMod = prefixSum % p;\n let targetMod = (currentMod - rem + p) % p;\n\n if (prefixMod.has(targetMod)) {\n minLength = Math.min(minLength, i - prefixMod.get(targetMod));\n }\n\n prefixMod.set(currentMod, i);\n }\n\n return minLength === nums.length ? -1 : minLength;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168150001","body":"```js\nvar middleNode = function(head) {\n if (!head || !head.next) return head;\n let fast = head, slow = head;\n while(fast && fast.next) {\n fast = fast.next.next;\n slow = slow.next\n } \n return slow;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170748221","body":"```js\nvar removeDuplicates = function(nums) {\n let fast = 0, slow = 0;\n while(fast < nums.length) {\n if (nums[slow] !== nums[fast]) {\n nums[++slow] = nums[fast];\n }\n fast ++\n }\n return slow + 1\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172646559","body":"Binary Search\n\n```js\nvar searchInsert = function(nums, target) {\n let left = 0, right = nums.length;\n while(left < right) {\n const mid = left + Math.floor((right - left) / 2);\n if (nums[mid] >= target) {\n right = mid\n } else {\n left = mid + 1\n }\n }\n return left;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173319860","body":" Too long to put down DeQueue implementation in JS. Don't think this will be asked in an interview: \n\n```js\nvar maxSlidingWindow = function (nums, k) {\n const res = [];\n const dequeue = new Dequeue([]);\n // 前 k - 1 个数入队\n for (let i = 0; i < k - 1; i++) {\n dequeue.push(nums[i]);\n }\n\n // 滑动窗口\n for (let i = k - 1; i < nums.length; i++) {\n dequeue.push(nums[i]);\n res.push(dequeue.max());\n dequeue.shift(nums[i - k + 1]);\n }\n return res;\n};\n\nclass Dequeue {\n constructor(nums) {\n this.list = nums;\n }\n\n push(val) {\n const nums = this.list;\n // 保证数据从队头到队尾递减\n while (nums[nums.length - 1] < val) {\n nums.pop();\n }\n nums.push(val);\n }\n\n // 队头出队\n shift(val) {\n let nums = this.list;\n if (nums[0] === val) {\n // 这里的js实现shift()理论上复杂度应该是O(k), 就不去真实实现一个O(1)出队的队列了,意思到位即可\n nums.shift();\n }\n }\n\n max() {\n return this.list[0];\n }\n}\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3179501468","body":"```js\nvar findJudge = function (n, trust) {\n const count = new Array(n + 1).fill(0);\n for (const edge of trust) {\n const x = edge[0];\n const y = edge[1];\n count[y]++;\n count[x]--;\n }\n for (let i = 1; i <= n; ++i) {\n if (count[i] === n - 1) {\n return i;\n }\n }\n return -1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3184086046","body":"```js\nvar possibleBipartition = function(N, dislikes) {\n const graph = [...Array(N+1)].map(() => []);\n const visited = Array(N+1).fill(false);\n const color = Array(N+1).fill(0);\n\n for(let [u, v] of dislikes) {\n graph[u].push(v);\n graph[v].push(u);\n }\n\n for(let i = 1; i <= N; i++) {\n if(!colorNodes(i)) return false;\n }\n return true;\n\n function colorNodes(node) {\n if(visited[node]) return true;\n const currColor = new Set([1, 2]);\n\n\t\t// remove colors used by neighbors\n for(let child of graph[node]) {\n if(color[child] === 1) currColor.delete(1);\n if(color[child] === 2) currColor.delete(2);\n }\n\n\t\t// no color is available return false\n if(currColor.size === 0) return false;\n\t\t\n\t\t// assign the smallest available color\n color[node] = Math.min(...currColor);\n visited[node] = true; \n\n for(let child of graph[node]) {\n if(!colorNodes(child)) return false; \n }\n return true;\n }\n};\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"stonehl":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073791924","body":"C++代码:\n`class Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n vector res;\n int n = num.size();\n for (int i=n-1; i>=0; --i) {\n int sum = num[i] + k % 10;\n k /= 10;\n if (sum >= 10) {\n k++;\n sum -= 10;\n }\n res.push_back(sum);\n }\n for (; k > 0; k /= 10) {\n res.push_back(k % 10);\n }\n reverse(res.begin(), res.end());\n return res;\n }\n};`","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097159903","body":"### 思路:\n1. 异常情况判断;\n2. 统计链表长度, 同时将链表的收尾相连;\n3. 将k对链表长度取余,余数为0表示刚好旋转了链表长度的整数倍,链表节点位置不变;\n4. 新的链表头节点是原链表中第 n - k 个节点。\n### C++代码\n```\nclass Solution {\npublic:\n ListNode* rotateRight(ListNode* head, int k) {\n if (head == nullptr || head->next == nullptr || k == 0)\n return head;\n int count = 1; // 用来统计链表长度\n ListNode* tmp = head;\n while (tmp->next != nullptr) {\n count++;\n tmp = tmp->next; // 滑动到链表尾部\n }\n k %= count;\n //如果刚好是链表长度的倍数,则不进行旋转\n if (k == 0)\n return head;\n tmp->next = head;\n // \n for (int i=0; i < count - k; i++) {\n tmp = tmp->next;\n }\n ListNode* newHead = tmp->next;\n tmp->next = nullptr;\n return newHead;\n }\n};\n```\n### 时间复杂度\nO(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103550594","body":"### 思路:\n使用递归的方法解题\n1. 找递归终止条件,当链表为空或链表只有一个元素时,没法交换,终止递归,返回当前节点;\n2. 每一次递归需要返回的值是交换后的子链表的头节点;\n\n### 代码:\n```\nclass Solution {\npublic:\n ListNode* swapPairs(ListNode* head) {\n if (head == nullptr || head->next == nullptr) {\n return head;\n }\n ListNode* next = head->next;\n head->next = swapPairs(next->next);\n next->next = head;\n return next;\n }\n};\n\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127754666","body":"### 思路:\n使用深度优先搜索的方法,\n1. 先找返回条件, 如果两个节点都为空,则返回true;\n2. 如果两个节点都不为空,并且这两个节点的值相等则分别递归判断这两个节点的左子树和右子树的值是否相等,如果相等,则返回true, 否则返回false。\n\n### 代码:\n```\nclass Solution {\npublic:\n bool isSameTree(TreeNode* p, TreeNode* q) {\n if(p==nullptr && q==nullptr) {\n return true;\n }\n if (p && q && (p->val == q->val)) {\n return isSameTree(p->right, q->right) && isSameTree(p->left, q->left);\n }\n return false;\n\n }\n};\n```\n### 复杂度分析:\n时间复杂度O(N),N为两棵树节点的最小值","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3151160755","body":"### 思路:\n将每个距离的出现次数记录在哈希表中,然后遍历哈希表,计算并累加回旋镖的个数。\n\n### 代码:\n```\nclass Solution {\npublic:\n int numberOfBoomerangs(vector>& points) {\n int n = points.size();\n int res = 0;\n if (n < 3)\n return res;\n\n int ans = 0;\n for (auto &p : points) {\n unordered_map cnt;\n for (auto &q : points) {\n int dis = (p[0] - q[0]) * (p[0] - q[0]) + (p[1] - q[1]) * (p[1] - q[1]);\n ++cnt[dis];\n }\n for (auto &[_, m] : cnt) {\n ans += m * (m - 1);\n }\n }\n return ans;\n\n }\n};\n```\n时间复杂度:O(n2)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3174960911","body":"### 思路:\n使用双端队列来维护滑动窗口内的最大值\n### 代码:\n```\nclass Solution {\npublic:\n vector maxSlidingWindow(vector& nums, int k) {\n deque q;\n int n = nums.size();\n vector res;\n for(int i = 0; i < n; i++) {\n if(q.size() && i - q.front() >= k)\n q.pop_front();\n while(q.size() && nums[q.back()] <= nums[i]) q.pop_back();\n q.push_back(i);\n if(i >= k - 1) {\n res.push_back(nums[q.front()]);\n }\n }\n return res;\n }\n};\n```\n### 复杂度:\n时间复杂度:O(n)","onTime":true},null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3201130868","body":"### 思路:\n基数排序\n### 代码:\n```\nclass Solution {\npublic:\n vector sortArray(vector& nums) {\n const int NUM = 50000;\n int arr[NUM*10+10];\n bzero(arr,sizeof(arr));\n for(int&num:nums){\n num+=NUM;\n arr[num]+=1;\n }\n int cur = 0;\n for(int i = 0;i<(NUM*10+10);++i){\n int tmp = arr[i];\n while(tmp--){\n nums[cur++] = i-NUM;\n }\n }\n return nums;\n }\n};\n```\n### 时间复杂度: O(N)","onTime":true},null,null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3234026083","body":"### 思路:\n1. 先统计t中每个字符出现的次数;\n2. 初始化左右指针,以及记录答案的变量;\n3. 右指针移动,更新计数。如果当前字符是t中的字符(即计数大于0),则减小cntT;\n4. 当cntT为0时,说明当前窗口包含了t的所有字符,然后尝试移动左指针缩小窗口;\n5. 在缩小窗口时,如果移除了t中的字符,则增加cntT,并更新答案;\n6. 最后根据是否找到答案返回相应的子串。\n### 代码:\n```\nclass Solution {\npublic:\n string minWindow(string s, string t) {\n vector cnt(128, 0);\n for (char c : t) {\n cnt[c]++;\n }\n \n int l = 0, r = 0, ansL = 0, ansR = 0, ans = INT_MAX, cntT = t.length();\n \n while (r < s.length()) {\n if (cnt[s[r]]-- > 0) {\n cntT--;\n }\n r++;\n \n while (cntT == 0) {\n if (r - l < ans) {\n ans = r - l;\n ansL = l;\n ansR = r;\n }\n if (cnt[s[l]]++ == 0) {\n cntT++;\n }\n l++;\n }\n }\n \n return ans == INT_MAX ? \"\" : s.substr(ansL, ansR - ansL);\n }\n};\n```\n### 时间复杂度:O(n)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245701951","body":"### 思路:\n1. 初始化标记数组 visited,避免重复访问;\n2. 遍历每个格子,使用DFS搜索整个岛屿。\n\n### 代码:\n```\nclass Solution {\nprivate:\n int count;\n int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向\n void dfs(vector>& grid, vector>& visited, int x, int y) {\n for (int i = 0; i < 4; i++) {\n int nextx = x + dir[i][0];\n int nexty = y + dir[i][1];\n if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过\n if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的\n\n visited[nextx][nexty] = true;\n count++;\n dfs(grid, visited, nextx, nexty);\n }\n }\n }\n\npublic:\n int maxAreaOfIsland(vector>& grid) {\n int n = grid.size(), m = grid[0].size();\n vector> visited = vector>(n, vector(m, false));\n\n int result = 0;\n for (int i = 0; i < n; i++) {\n for (int j = 0; j < m; j++) {\n if (!visited[i][j] && grid[i][j] == 1) {\n count = 1;\n visited[i][j] = true;\n dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true\n result = max(result, count);\n }\n }\n }\n return result;\n }\n};\n```\n### 时间复杂度: O(MN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249613575","body":"### 思路:\n使用多源广度优先搜索,先找到所有陆地放入队列,然后从陆地开始向外搜索,最后被触及的海洋就是离所有陆地最远的海洋。\n### 代码:\n```\nclass Solution {\npublic:\n int maxDistance(vector>& grid) {\n int n = grid.size();\n vector> directions = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};\n queue> q;\n \n for (int i = 0; i < n; i++) {\n for (int j = 0; j < n; j++) {\n if (grid[i][j] == 1) {\n q.push({i, j});\n }\n }\n }\n \n // 如果全是海洋或者全是陆地\n if (q.empty() || q.size() == n * n) return -1;\n \n int distance = -1;\n \n // 2. 多源 BFS\n while (!q.empty()) {\n int size = q.size();\n distance++;\n \n for (int s = 0; s < size; s++) {\n auto [x, y] = q.front();\n q.pop();\n \n for (auto [dx, dy] : directions) {\n int nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] == 0) {\n grid[nx][ny] = 1; // 标记为已访问(变为陆地)\n q.push({nx, ny});\n }\n }\n }\n }\n \n return distance;\n }\n};\n```\n### 时间复杂度: O(N²)","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3271218211","body":"### 代码:\n```\nclass Solution {\npublic:\n int longestCommonSubsequence(string text1, string text2) {\n int m = text2.length();\n vector f(m + 1);\n for (char x : text1) {\n for (int j = 0, pre = 0; j < m; j++) {\n int tmp = f[j + 1];\n f[j + 1] = x == text2[j] ? pre + 1 : max(f[j + 1], f[j]);\n pre = tmp;\n }\n }\n return f[m];\n }\n};\n```\n### 时间复杂度:O(nm)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289595360","body":"\n### 代码:\n```\nclass Solution {\npublic:\n int findTargetSumWays(vector& nums, int target) {\n int s = reduce(nums.begin(), nums.end()) - abs(target);\n if (s < 0 || s % 2) {\n return 0;\n }\n\n int m = s / 2; // 背包容量\n int n = nums.size();\n vector memo(n, vector(m + 1, -1)); // -1 表示没有计算过\n\n // lambda 递归函数\n auto dfs = [&](this auto&& dfs, int i, int c) -> int {\n if (i < 0) {\n return c == 0;\n }\n int& res = memo[i][c]; // 注意这里是引用\n if (res != -1) { // 之前计算过\n return res;\n }\n if (c < nums[i]) {\n return res = dfs(i - 1, c); // 只能不选\n }\n return res = dfs(i - 1, c) + dfs(i - 1, c - nums[i]); // 不选 + 选\n };\n\n return dfs(n - 1, m);\n }\n};\n```\n时间复杂度:O(nm)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316013499","body":"### 代码:\n```\nclass Solution {\npublic:\n ListNode* mergeKLists(vector& lists) {\n auto cmp = [](const ListNode* a, const ListNode* b) {\n return a->val > b->val; // 最小堆\n };\n priority_queue, decltype(cmp)> pq;\n for (auto head : lists) {\n if (head) {\n pq.push(head); // 把所有非空链表的头节点入堆\n }\n }\n\n ListNode dummy{}; // 哨兵节点,作为合并后链表头节点的前一个节点\n auto cur = &dummy;\n while (!pq.empty()) { // 循环直到堆为空\n auto node = pq.top(); // 剩余节点中的最小节点\n pq.pop();\n if (node->next) { // 下一个节点不为空\n pq.push(node->next); // 下一个节点有可能是最小节点,入堆\n }\n cur->next = node; // 把 node 添加到新链表的末尾\n cur = cur->next; // 准备合并下一个节点\n }\n return dummy.next; // 哨兵节点的下一个节点就是新链表的头节点\n }\n};\n```\n### 时间复杂度:\nO(Llogm),其中 m 为 lists 的长度,L 为所有链表的长度之和。","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuyuanzhang118":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074090351","body":"## 算法思路分析\n\n这是一个将数组形式的整数与普通整数相加的算法,采用了模拟手工加法的思路:\n\n### 核心思路\n1. **从右到左逐位相加**:模拟手工加法,从最低位开始处理\n2. **处理进位**:当两位数字相加结果 ≥ 10 时,产生进位\n3. **处理不同长度**:通过 `num[len-1] || 0` 处理数组已遍历完的情况\n4. **逆序构建结果**:由于是从低位到高位计算,最后需要反转数组\n\n```JavaScript\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(num, k) {\n let res = []\n let len = num.length\n let carry = 0\n while(len > 0 || k > 0) {\n let a = num[len - 1] || 0\n let b = k % 10\n let sum = a + b + carry\n res.push(sum % 10)\n carry = sum >= 10 ? 1 : 0\n len--\n k = Math.floor(k / 10)\n }\n if (carry) {\n res.push(1)\n }\n return res.reverse()\n};\n```\n\n### 时间复杂度\n**O(max(N, log K))**\n- N 是数组 `num` 的长度\n- log K 是整数 k 的位数\n- 循环次数取决于较长的那个数\n\n### 空间复杂度\n**O(max(N, log K))**\n- 结果数组 `res` 的长度最多为 max(N, log K) + 1\n- 其他变量占用常数空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3079209775","body":"## 算法思路分析\n核心思想:双向遍历\n\n这个算法使用了一种巧妙的双向遍历方法来解决问题:\n\n1. 第一次遍历(从左到右) :\n \n - 记录每个位置到其左边最近字符c的距离\n - 使用变量 prev 记录上一个字符c的位置\n - 对于每个位置i,距离为 i - prev\n2. 第二次遍历(从右到左) :\n \n - 计算每个位置到其右边最近字符c的距离\n - 与第一次遍历的结果取最小值,得到最终答案\n - 对于每个位置i,距离为 prev - i\n\n## 代码\n```Javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const n = s.length;\n const answer = new Array(n).fill(Infinity);\n \n // 第一次遍历:从左到右,记录每个位置到左边最近字符c的距离\n let prev = -Infinity;\n for (let i = 0; i < n; i++) {\n if (s[i] === c) {\n prev = i;\n }\n answer[i] = i - prev;\n }\n \n // 第二次遍历:从右到左,更新每个位置到右边最近字符c的距离\n prev = Infinity;\n for (let i = n - 1; i >= 0; i--) {\n if (s[i] === c) {\n prev = i;\n }\n answer[i] = Math.min(answer[i], prev - i);\n }\n \n return answer;\n};\n```\n\n## 复杂度分析\n\n时间复杂度:O(n)\n- 需要遍历字符串两次,每次遍历都是O(n)\n- 总时间复杂度为O(n) + O(n) = O(n)\n- 这是最优的时间复杂度,因为至少需要访问每个字符一次\n\n空间复杂度:O(n)\n- 需要创建一个长度为n的结果数组 answer\n- 除了结果数组外,只使用了常数个额外变量( prev , i , n )\n- 如果不计算返回值所需的空间,额外空间复杂度为O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084609047","body":"### 算法设计思路\n\n**核心数据结构:**\n- 使用数组 `stack` 作为底层存储结构\n- 使用 `maxSize` 记录栈的最大容量\n- 数组索引 0 为栈底,数组末尾为栈顶\n\n### 代码\n\n```JavaScript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.maxSize = maxSize;\n this.stack = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.stack.length < this.maxSize) {\n this.stack.push(x);\n }\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.stack.length === 0) {\n return -1;\n }\n return this.stack.pop();\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n // 对栈底的k个元素进行增量操作\n // 如果栈中元素总数小于k,则对所有元素进行增量操作\n const elementsToIncrement = Math.min(k, this.stack.length);\n for (let i = 0; i < elementsToIncrement; i++) {\n this.stack[i] += val;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n### 时间复杂度分析\n\n| 方法 | 时间复杂度 | 分析 |\n|------|------------|------|\n| **构造函数** | O(1) | 仅初始化两个变量 |\n| **push(x)** | O(1) | 数组末尾添加元素,均摊时间复杂度为 O(1) |\n| **pop()** | O(1) | 数组末尾删除元素 |\n| **increment(k, val)** | O(min(k, n)) | 需要遍历栈底的 k 个元素,n 为当前栈大小 |\n\n### 空间复杂度分析\n\n| 方面 | 空间复杂度 | 分析 |\n|------|------------|------|\n| **整体空间** | O(maxSize) | 最坏情况下数组存储 maxSize 个元素 |\n| **辅助空间** | O(1) | 除了存储栈元素外,只使用常数额外空间 |\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3092430277","body":"### 算法思路分析\n\n**核心思想:使用栈处理嵌套结构**\n\n这是一个典型的括号匹配问题,需要处理嵌套的编码结构。算法的关键在于:\n1. **识别模式** - `k[encoded_string]` 表示重复 k 次\n2. **处理嵌套** - 可能存在多层嵌套,如 `3[a2[c]]`\n3. **状态管理** - 需要记录当前的数字、字符串和历史状态\n\n**算法步骤:**\n1. 遍历字符串的每个字符\n2. 遇到数字:累积构建重复次数(支持多位数)\n3. 遇到 `[`:将当前状态(字符串和数字)压入栈,重置当前状态\n4. 遇到 `]`:从栈中弹出之前的状态,重复当前字符串并拼接\n5. 遇到字母:直接添加到当前字符串\n\n### 代码实现\n\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let currentNum = 0;\n let currentStr = '';\n \n for (let i = 0; i < s.length; i++) {\n const char = s[i];\n \n if (char >= '0' && char <= '9') {\n // 构建数字(可能是多位数)\n currentNum = currentNum * 10 + parseInt(char);\n } else if (char === '[') {\n // 遇到左括号,将当前状态入栈\n stack.push([currentStr, currentNum]);\n currentStr = '';\n currentNum = 0;\n } else if (char === ']') {\n // 遇到右括号,出栈并重复字符串\n const [prevStr, num] = stack.pop();\n currentStr = prevStr + currentStr.repeat(num);\n } else {\n // 普通字符,直接添加到当前字符串\n currentStr += char;\n }\n }\n \n return currentStr;\n};\n```\n\n### 复杂度分析\n\n**时间复杂度:O(n + m)**\n- n:输入字符串长度\n- m:输出字符串长度\n- 每个字符最多被处理一次\n- 字符串重复操作的总时间与最终输出长度成正比\n\n**空间复杂度:O(n + m)**\n- **栈空间**:O(d) - d 为最大嵌套深度,最坏情况 O(n)\n- **字符串存储**:O(m) - 存储中间结果和最终结果\n- **总空间**:O(n + m)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092434643","body":"## 核心算法思路\n\n使用两个栈实现队列:\n- `inStack`: 用于接收新元素的输入\n- `outStack`: 用于输出元素\n\n当需要 pop 或 peek 时,如果 outStack 为空,就将 inStack 中的所有元素转移到 outStack 中,这样就实现了先入先出的特性。\n\n## 代码实现\n\n```javascript\n\nvar MyQueue = function() {\n this.inStack = []; // 用于输入的栈\n this.outStack = []; // 用于输出的栈\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.inStack.push(x);\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n if (this.outStack.length === 0) {\n // 将inStack中的所有元素转移到outStack\n while (this.inStack.length > 0) {\n this.outStack.push(this.inStack.pop());\n }\n }\n return this.outStack.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if (this.outStack.length === 0) {\n // 将inStack中的所有元素转移到outStack\n while (this.inStack.length > 0) {\n this.outStack.push(this.inStack.pop());\n }\n }\n return this.outStack[this.outStack.length - 1];\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return this.inStack.length === 0 && this.outStack.length === 0;\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```\n\n## 复杂度分析\n\n**时间复杂度**:\n- push: O(1)\n- pop: 均摊 O(1)\n- peek: 均摊 O(1) \n- empty: O(1)\n\n**空间复杂度**: O(n)\n\n**均摊 O(1) 的原理**:虽然单次 pop 或 peek 操作在最坏情况下可能需要 O(n) 时间,但每个元素最多只会被转移一次,所以 n 个操作的总时间复杂度为 O(n),均摊下来每个操作为 O(1)。\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094581867","body":"## 算法思路\n- 关键观察:如果前缀[0...i]的最大值 ≤ 后缀[i+1...n-1]的最小值,则可以在位置i处分块\n- 这保证了前面块的所有元素都不大于后面块的任何元素,分别排序后连接仍然有序\n\n## 代码\n```javascript\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const n = arr.length;\n if (n <= 1) return n;\n \n // 计算前缀最大值数组\n const prefixMax = new Array(n);\n prefixMax[0] = arr[0];\n for (let i = 1; i < n; i++) {\n prefixMax[i] = Math.max(prefixMax[i-1], arr[i]);\n }\n \n // 计算后缀最小值数组\n const suffixMin = new Array(n);\n suffixMin[n-1] = arr[n-1];\n for (let i = n-2; i >= 0; i--) {\n suffixMin[i] = Math.min(suffixMin[i+1], arr[i]);\n }\n \n let chunks = 1; // 至少有一个分块\n \n // 检查每个可能的分块点\n for (let i = 0; i < n-1; i++) {\n // 如果前缀最大值 <= 后缀最小值,可以在i处分块\n if (prefixMax[i] <= suffixMin[i+1]) {\n chunks++;\n }\n }\n \n return chunks;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 需要三次遍历数组\n- 空间复杂度:O(n) - 需要两个额外数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097244383","body":"## 核心思路 :\n- 计算链表长度并找到尾节点\n- 优化k值避免重复旋转\n- 找到新的尾节点(第length-k个节点)\n- 重新连接:断开新尾节点与新头节点,原尾节点连接原头节点\n\n## 代码:\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n // 边界情况处理\n if (!head || !head.next || k === 0) {\n return head;\n }\n \n // 1. 计算链表长度并找到尾节点\n let length = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n length++;\n }\n \n // 2. 优化k值,避免不必要的旋转\n k = k % length;\n if (k === 0) {\n return head;\n }\n \n // 3. 找到新的尾节点(从头开始第length-k个节点)\n let newTail = head;\n for (let i = 0; i < length - k - 1; i++) {\n newTail = newTail.next;\n }\n \n // 4. 新的头节点是新尾节点的下一个节点\n let newHead = newTail.next;\n \n // 5. 断开连接并重新连接\n newTail.next = null; // 断开新尾节点与新头节点的连接\n tail.next = head; // 原尾节点连接到原头节点\n \n return newHead;\n};\n```\n\n## 复杂度分析 :\n- 时间复杂度 :O(n) - 需要遍历链表计算长度和找到切分点\n- 空间复杂度 :O(1) - 只使用常数个额外变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103625610","body":"## 算法思路\n- 虚拟头节点技巧: 简化边界条件处理\n- 三指针法: prev, first, second 精确控制交换过程\n- 原地交换: 只修改指针,不创建新节点\n- 边界处理: 空链表和单节点的特殊情况\n\n## 代码实现\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n // 边界情况:空链表或只有一个节点\n if (!head || !head.next) {\n return head;\n }\n \n // 创建虚拟头节点,简化操作\n let dummy = new ListNode(0);\n dummy.next = head;\n let prev = dummy;\n \n // 当存在至少两个节点时进行交换\n while (prev.next && prev.next.next) {\n // 定义要交换的两个节点\n let first = prev.next;\n let second = prev.next.next;\n \n // 执行交换操作\n // 步骤:prev -> first -> second -> ... \n // 变为:prev -> second -> first -> ...\n prev.next = second;\n first.next = second.next;\n second.next = first;\n \n // 移动prev指针到已交换的第二个节点(现在是first)\n prev = first;\n }\n \n return dummy.next;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) \n- 空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109219828","body":"## 算法思路\n- 算法的核心思想是利用有序链表的特性:\n- 选择中间节点作为根节点,保证树的平衡性\n- 递归地将左半部分构建为左子树,右半部分构建为右子树\n- 最优解使用中序遍历的特性,避免重复遍历链表\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n // 计算链表长度\n function getLength(head) {\n let length = 0;\n while (head) {\n length++;\n head = head.next;\n }\n return length;\n }\n \n const length = getLength(head);\n let current = head;\n \n // 中序遍历构建BST\n function buildBST(start, end) {\n if (start > end) return null;\n \n const mid = Math.floor((start + end) / 2);\n \n // 先构建左子树\n const left = buildBST(start, mid - 1);\n \n // 创建根节点(当前链表节点)\n const root = new TreeNode(current.val);\n current = current.next;\n \n // 再构建右子树\n const right = buildBST(mid + 1, end);\n \n root.left = left;\n root.right = right;\n \n return root;\n }\n \n return buildBST(0, length - 1);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 每个节点只访问一次\n- 空间复杂度:O(log n) - 仅递归栈深度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3117083288","body":"## 算法思路\n双指针法 :让两个指针分别从两个链表头部开始遍历,当指针到达链表末尾时跳转到另一个链表的头部。这样可以消除两个链表的长度差异,如果有交点,两个指针会在交点相遇;如果没有交点,两个指针最终都会变成 null。\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function(headA, headB) {\n // 如果任一链表为空,直接返回null\n if (!headA || !headB) {\n return null;\n }\n \n // 双指针法:让两个指针分别遍历两个链表\n // 当指针到达链表末尾时,跳转到另一个链表的头部\n // 这样可以消除长度差,如果有交点,两指针会在交点相遇\n let pA = headA;\n let pB = headB;\n \n // 当两个指针不相等时继续遍历\n while (pA !== pB) {\n // 如果pA到达末尾,跳转到headB;否则继续下一个节点\n pA = pA === null ? headB : pA.next;\n // 如果pB到达末尾,跳转到headA;否则继续下一个节点\n pB = pB === null ? headA : pB.next;\n }\n \n // 返回交点(如果没有交点,两指针都会变成null)\n return pA;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(m + n),其中 m 和 n 分别是两个链表的长度。每个指针最多遍历两个链表一次。\n- 空间复杂度 :O(1),只使用了两个指针变量,没有使用额外的数据结构。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3117100989","body":"## 算法思路\n- 第一阶段 :使用快慢指针检测是否有环\n- 慢指针每次移动1步,快指针每次移动2步\n- 如果有环,快慢指针必定会相遇\n- 第二阶段 :找到环的起始节点\n- 基于数学原理:从头节点到环入口的距离等于从相遇点到环入口的距离\n- 将一个指针重置到头节点,两指针同速移动直到相遇\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n // 边界情况:空链表或只有一个节点且无环\n if (!head || !head.next) {\n return null;\n }\n \n // 第一阶段:使用快慢指针检测是否有环\n let slow = head;\n let fast = head;\n \n // 快指针每次走两步,慢指针每次走一步\n while (fast && fast.next) {\n slow = slow.next;\n fast = fast.next.next;\n \n // 如果快慢指针相遇,说明存在环\n if (slow === fast) {\n break;\n }\n }\n \n // 如果没有环,返回null\n if (!fast || !fast.next) {\n return null;\n }\n \n // 第二阶段:找到环的起始节点\n // 将一个指针重置到头节点,两个指针同时以相同速度移动\n // 它们相遇的地方就是环的起始节点\n slow = head;\n while (slow !== fast) {\n slow = slow.next;\n fast = fast.next;\n }\n \n return slow; // 返回环的起始节点\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 最多遍历链表两次\n- 空间复杂度 :O(1) - 只使用常数个额外变量,满足进阶要求","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3124469572","body":"## 算法思路\n这个LRU(Least Recently Used)缓存实现采用了 哈希表 + 双向链表 的经典设计模式:\n数据结构组合 :\n - Map :用于O(1)时间复杂度的键值查找\n - 双向链表:用于维护访问顺序,支持O(1)的插入和删除操作\n - 虚拟头尾节点:简化边界条件处理\n\n## 代码\n```javascript\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.cache = new Map(); // 使用Map存储键值对\n this.head = {}; // 虚拟头节点\n this.tail = {}; // 虚拟尾节点\n this.head.next = this.tail;\n this.tail.prev = this.head;\n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n if (!this.cache.has(key)) {\n return -1;\n }\n \n // 存在则将节点移到链表头部(表示最近使用)\n const node = this.cache.get(key);\n this.removeFromList(node);\n this.addToHead(node);\n \n return node.value;\n};\n\n/** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\nLRUCache.prototype.put = function(key, value) {\n // 如果已存在,先删除旧节点\n if (this.cache.has(key)) {\n const oldNode = this.cache.get(key);\n this.removeFromList(oldNode);\n this.cache.delete(key);\n }\n \n // 创建新节点并添加到头部\n const newNode = { key, value, prev: null, next: null };\n this.cache.set(key, newNode);\n this.addToHead(newNode);\n \n // 如果超出容量,删除尾部节点(最久未使用)\n if (this.cache.size > this.capacity) {\n const tailNode = this.tail.prev;\n this.removeFromList(tailNode);\n this.cache.delete(tailNode.key);\n }\n};\n\n// 辅助方法:将节点添加到链表头部\nLRUCache.prototype.addToHead = function(node) {\n node.next = this.head.next;\n node.prev = this.head;\n this.head.next.prev = node;\n this.head.next = node;\n};\n\n// 辅助方法:从链表中删除节点\nLRUCache.prototype.removeFromList = function(node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n};\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```\n\n## 复杂度分析\n- 时间复杂度:O(1)\n- 空间复杂度:O(capacity)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124496973","body":"## 算法思路\n使用广度优先搜索(BFS)的方法来计算二叉树的最大深度:\n- 初始化 :如果根节点为空,直接返回0\n- 队列存储 :使用队列存储节点和对应的深度信息,初始将根节点和深度1入队\n- 层序遍历 :通过队列进行层序遍历,每次取出队首元素\n- 深度更新 :更新最大深度值,并将当前节点的左右子节点(如果存在)连同深度+1一起入队\n- 返回结果 :遍历完成后返回记录的最大深度\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if (!root) return 0;\n let queue = [[root, 1]];\n let maxDepth = 0;\n\n while (queue.length > 0) {\n let [node, depth] = queue.shift();\n if (node) {\n maxDepth = Math.max(maxDepth, depth);\n if (node.left) queue.push([node.left, depth + 1]);\n if (node.right) queue.push([node.right, depth + 1]);\n }\n }\n\n return maxDepth;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 O(n) ,其中n是二叉树中节点的总数\n- 空间复杂度 O(w) ,其中w是二叉树的最大宽度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3126191127","body":"## 算法思路\n使用递归的深度优先搜索(DFS)方法:\n- 基本情况 :如果两个节点都为空,返回 true\n- 边界情况 :如果只有一个节点为空,返回 false\n- 值比较 :如果两个节点的值不相等,返回 false\n- 递归检查 :同时检查左子树和右子树是否相同\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} p\n * @param {TreeNode} q\n * @return {boolean}\n */\nvar isSameTree = function(p, q) {\n if (p === null && q === null) {\n return true;\n }\n if (p === null || q === null || p.val !== q.val) {\n return false;\n }\n return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(min(m, n)),其中 m 和 n 分别是两棵树的节点数。在最坏情况下需要遍历较小树的所有节点。\n- 空间复杂度 :O(min(m, n)),递归调用栈的深度取决于树的高度。在完全平衡的树中为 O(log(min(m, n))),在完全不平衡的树中为 O(min(m, n))。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3133136375","body":"## 算法思路\n这是一个典型的二叉树深度优先搜索(DFS)问题。核心思想是:\n- 从根节点开始,沿着每条路径向下遍历\n- 在遍历过程中,将当前路径形成的数字逐步构建(当前数字 = 之前数字 × 10 + 当前节点值)\n- 当到达叶节点时,将该路径形成的完整数字加入总和\n- 递归处理左右子树,最终返回所有路径数字的总和\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root) {\n // 深度优先搜索函数\n function dfs(node, currentSum) {\n // 如果节点为空,返回0\n if (!node) {\n return 0;\n }\n \n // 计算当前路径的数字:之前的数字*10 + 当前节点值\n currentSum = currentSum * 10 + node.val;\n \n // 如果是叶节点(没有左右子树),返回当前路径形成的数字\n if (!node.left && !node.right) {\n return currentSum;\n }\n \n // 递归计算左右子树的路径数字之和\n return dfs(node.left, currentSum) + dfs(node.right, currentSum);\n }\n \n return dfs(root, 0);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) ,其中 n 是二叉树中节点的数量,需要访问每个节点一次\n- 空间复杂度:O(h) ,其中 h 是二叉树的高度,递归调用栈的深度等于树的高度\n - 最坏情况(完全不平衡的树):O(n)\n - 最好情况(完全平衡的树):O(log n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136794752","body":"## 算法思路\n广度优先搜索(BFS)\n- 使用层序遍历,从右到左遍历每一层\n- 通过队列实现,先添加右子节点再添加左子节点\n- 最后访问到的节点就是最底层最左边的节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n // 使用层序遍历(BFS)从右到左遍历每一层\n // 最后访问到的节点就是最底层最左边的节点\n let queue = [root];\n let result = root.val;\n \n while (queue.length > 0) {\n let levelSize = queue.length;\n \n // 遍历当前层的所有节点\n for (let i = 0; i < levelSize; i++) {\n let node = queue.shift();\n result = node.val; // 更新结果为当前节点值\n \n // 先添加右子节点,再添加左子节点\n // 这样在同一层中,左边的节点会后被访问到\n if (node.right) {\n queue.push(node.right);\n }\n if (node.left) {\n queue.push(node.left);\n }\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),需要遍历所有节点\n- 空间复杂度:O(w),w为树的最大宽度(队列空间)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3140223821","body":"## 算法思路\n序列化过程 :\n- 采用前序遍历(根-左-右)的方式遍历二叉树\n- 空节点用 'null' 字符串表示\n- 所有节点值用逗号连接成字符串\n- 前序遍历的优势是根节点总在最前面,便于重构\n\n反序列化过程 :\n- 将字符串按逗号分割成数组\n- 使用递归按前序遍历顺序重构二叉树\n- 维护索引指针依次处理数组元素\n- 遇到 'null' 返回空节点,否则创建新节点并递归构建左右子树\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n const result = [];\n \n function preorder(node) {\n if (node === null) {\n result.push('null');\n return;\n }\n \n result.push(node.val.toString());\n preorder(node.left);\n preorder(node.right);\n }\n \n preorder(root);\n return result.join(',');\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n if (!data || data === 'null') {\n return null;\n }\n \n const values = data.split(',');\n let index = 0;\n \n function buildTree() {\n if (index >= values.length || values[index] === 'null') {\n index++;\n return null;\n }\n \n const node = new TreeNode(parseInt(values[index]));\n index++;\n \n node.left = buildTree();\n node.right = buildTree();\n \n return node;\n }\n \n return buildTree();\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```\n\n## 复杂度分析\n时间复杂度 :\n- 序列化:O(n) - 需要访问每个节点一次\n- 反序列化:O(n) - 需要处理每个序列化值一次\n\n空间复杂度 :\n- 序列化:O(n) - 递归栈深度最坏情况为O(n),结果数组大小为O(n)\n- 反序列化:O(n) - 递归栈深度最坏情况为O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3148418818","body":"## 算法思路\n- DFS遍历 :使用深度优先搜索遍历二叉树,记录每个节点的坐标(row, col)和值\n- 坐标规则 :根据题目要求,左子节点坐标为(row+1, col-1),右子节点坐标为(row+1, col+1)\n- 分组排序 :将节点按列索引分组,对每列内的节点先按行排序,同行按值排序\n- 结果输出 :按列索引从小到大的顺序返回垂序遍历结果\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n if (!root) return [];\n \n // 存储节点信息:[row, col, val]\n const nodes = [];\n \n // DFS遍历,记录每个节点的坐标和值\n function dfs(node, row, col) {\n if (!node) return;\n \n nodes.push([row, col, node.val]);\n \n // 左子节点:row+1, col-1\n dfs(node.left, row + 1, col - 1);\n // 右子节点:row+1, col+1\n dfs(node.right, row + 1, col + 1);\n }\n \n // 从根节点开始遍历,根节点坐标为(0, 0)\n dfs(root, 0, 0);\n \n // 按列索引分组\n const columnMap = new Map();\n for (const [row, col, val] of nodes) {\n if (!columnMap.has(col)) {\n columnMap.set(col, []);\n }\n columnMap.get(col).push([row, val]);\n }\n \n // 获取所有列索引并排序\n const columns = Array.from(columnMap.keys()).sort((a, b) => a - b);\n \n const result = [];\n for (const col of columns) {\n const columnNodes = columnMap.get(col);\n // 对每列内的节点排序:先按行排序,同行按值排序\n columnNodes.sort((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按行排序\n }\n return a[1] - b[1]; // 同行按值排序\n });\n \n // 提取值\n result.push(columnNodes.map(node => node[1]));\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n log n),其中n是节点数,主要消耗在排序操作\n- 空间复杂度 :O(n),用于存储节点信息和分组数据","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3148426517","body":"## 算法思路\n- 使用哈希表存储已遍历的数值和索引\n- 对每个数值计算其配对数值,在哈希表中O(1)时间查找\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n // 创建哈希表,key为数值,value为索引\n const map = new Map();\n \n for (let i = 0; i < nums.length; i++) {\n // 计算当前数值需要配对的数值\n const complement = target - nums[i];\n \n // 在哈希表中查找配对数值\n if (map.has(complement)) {\n // 找到配对,返回两个索引\n return [map.get(complement), i];\n }\n \n // 将当前数值和索引存入哈希表\n map.set(nums[i], i);\n }\n \n return []; // 题目保证有解,这里不会执行到\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148432520","body":"## 算法思路\n采用桶排序的思想来实现:\n- 频率统计 :使用哈希表统计每个元素的出现频率\n- 桶排序 :创建频率桶,桶的索引表示频率,桶中存储具有该频率的元素\n- 结果收集 :从最高频率的桶开始遍历,收集前k个元素\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function(nums, k) {\n // 步骤1: 统计频率\n const freqMap = new Map();\n for (const num of nums) {\n freqMap.set(num, (freqMap.get(num) || 0) + 1);\n }\n \n // 步骤2: 创建频率桶\n // 桶的索引表示频率,桶中存储具有该频率的元素\n const buckets = new Array(nums.length + 1).fill(null).map(() => []);\n \n for (const [num, freq] of freqMap) {\n buckets[freq].push(num);\n }\n \n // 步骤3: 从高频率到低频率收集前k个元素\n const result = [];\n for (let i = buckets.length - 1; i >= 0 && result.length < k; i--) {\n if (buckets[i].length > 0) {\n result.push(...buckets[i]);\n }\n }\n \n // 返回前k个元素\n return result.slice(0, k);\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 满足题目要求的优于O(n log n)\n- 统计频率:O(n)\n- 创建桶并填充:O(n)\n- 收集结果:O(n)\n\n- 空间复杂度 :O(n)\n- 哈希表:O(n)\n- 桶数组:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3153115326","body":"## 算法思路\n- 核心思想 :枚举每个点作为回旋镖的中心点i\n- 距离计算 :计算中心点到所有其他点的欧式距离(使用距离平方避免开方运算)\n- 哈希统计 :使用Map统计相同距离的点的数量\n- 组合计算 :如果有n个点到中心点距离相同,可形成n×(n-1)个回旋镖\n- 顺序考虑 :回旋镖(i,j,k)和(i,k,j)是不同的,需要考虑j和k的顺序\n\n## 代码\n```javascript\n/**\n * @param {number[][]} points\n * @return {number}\n */\nvar numberOfBoomerangs = function(points) {\n let count = 0;\n \n // 遍历每个点作为回旋镖的中心点i\n for (let i = 0; i < points.length; i++) {\n // 使用Map记录从点i到其他点的距离及对应的点的数量\n const distanceMap = new Map();\n \n // 计算点i到其他所有点的距离\n for (let j = 0; j < points.length; j++) {\n if (i !== j) {\n // 计算欧式距离的平方(避免开方运算,提高效率)\n const distance = getDistanceSquared(points[i], points[j]);\n \n // 记录该距离对应的点的数量\n distanceMap.set(distance, (distanceMap.get(distance) || 0) + 1);\n }\n }\n \n // 对于每个距离,如果有n个点,则可以形成n*(n-1)个回旋镖\n // 因为回旋镖(i,j,k)中j和k的顺序是有意义的\n for (const [distance, pointCount] of distanceMap) {\n if (pointCount >= 2) {\n count += pointCount * (pointCount - 1);\n }\n }\n }\n \n return count;\n};\n\n/**\n * 计算两点间欧式距离的平方\n * @param {number[]} point1 \n * @param {number[]} point2 \n * @return {number}\n */\nfunction getDistanceSquared(point1, point2) {\n const dx = point1[0] - point2[0];\n const dy = point1[1] - point2[1];\n return dx * dx + dy * dy;\n}\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n²) - 外层循环n次,内层循环n-1次\n- 空间复杂度 :O(n) - 最坏情况下Map存储n-1个不同距离","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153126755","body":"## 算法思路\n- 滑动窗口技术 :使用双指针 left 和 right 构成滑动窗口\n- 哈希表优化 :记录每个字符最后出现的位置\n- 动态调整 :遇到重复字符时,将左指针移动到重复字符的下一个位置\n- 实时更新 :持续更新最大长度\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n if (s.length === 0) return 0;\n \n let left = 0; // 滑动窗口左指针\n let maxLength = 0; // 记录最大长度\n let charMap = new Map(); // 哈希表:字符 -> 最后出现的索引\n \n for (let right = 0; right < s.length; right++) {\n const char = s[right];\n \n // 如果字符已存在且在当前窗口内,移动左指针\n if (charMap.has(char) && charMap.get(char) >= left) {\n left = charMap.get(char) + 1;\n }\n \n // 更新字符的最新位置\n charMap.set(char, right);\n \n // 更新最大长度\n maxLength = Math.max(maxLength, right - left + 1);\n }\n \n return maxLength;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 每个字符最多被访问两次\n- 空间复杂度 :O(min(m,n)) - m是字符集大小,n是字符串长度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3158322222","body":"## 算法思路\n- 滑动窗口 + 哈希表 :避免生成所有排列组合,直接在原字符串上滑动匹配\n- 分层遍历 :由于words中所有单词长度相同,按单词长度为步长进行遍历\n- 频次匹配 :使用哈希表记录words中单词频次,滑动窗口中维护当前单词频次\n- 智能重置 :遇到不在words中的单词时,直接重置窗口位置\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n if (!s || !words || words.length === 0) return [];\n \n const wordLen = words[0].length;\n const totalLen = wordLen * words.length;\n const result = [];\n \n // 创建words的频次映射\n const wordCount = new Map();\n for (const word of words) {\n wordCount.set(word, (wordCount.get(word) || 0) + 1);\n }\n \n // 对于每个可能的起始位置(0到wordLen-1),使用滑动窗口\n for (let i = 0; i < wordLen; i++) {\n let left = i;\n let right = i;\n let validWords = 0;\n const windowCount = new Map();\n \n while (right + wordLen <= s.length) {\n // 扩展右边界,添加新单词\n const rightWord = s.substring(right, right + wordLen);\n right += wordLen;\n \n if (wordCount.has(rightWord)) {\n windowCount.set(rightWord, (windowCount.get(rightWord) || 0) + 1);\n if (windowCount.get(rightWord) <= wordCount.get(rightWord)) {\n validWords++;\n }\n \n // 如果窗口大小超过目标长度,收缩左边界\n while (right - left > totalLen) {\n const leftWord = s.substring(left, left + wordLen);\n left += wordLen;\n \n if (wordCount.has(leftWord)) {\n if (windowCount.get(leftWord) <= wordCount.get(leftWord)) {\n validWords--;\n }\n windowCount.set(leftWord, windowCount.get(leftWord) - 1);\n }\n }\n \n // 检查是否找到有效的串联子串\n if (validWords === words.length && right - left === totalLen) {\n result.push(left);\n }\n } else {\n // 遇到不在words中的单词,重置窗口\n windowCount.clear();\n validWords = 0;\n left = right;\n }\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n × m),其中n是字符串s的长度,m是单词长度\n- 外层循环m次(每个可能的起始偏移)\n- 内层每个字符最多被访问2次(加入和移出窗口)\n\n- 空间复杂度 :O(k),其中k是words数组的长度\n- 主要用于存储单词频次的哈希表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162949952","body":"## 算法思路\n- 数学原理 :如果数组总和 sum % p = remainder ,需要找到一个子数组,其和也等于 remainder ,移除后剩余部分就能被p整除\n- 技术方案 :使用前缀和 + 哈希表来高效查找目标子数组\n- 关键公式 : prefixSum[i] % p = (prefixSum[j] % p - remainder + p) % p\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar minSubarray = function(nums, p) {\n // 计算数组总和\n const totalSum = nums.reduce((sum, num) => sum + num, 0);\n \n // 如果总和已经能被p整除,不需要移除任何元素\n const remainder = totalSum % p;\n if (remainder === 0) {\n return 0;\n }\n \n // 使用哈希表记录前缀和的余数及其对应的索引\n const prefixMap = new Map();\n prefixMap.set(0, -1); // 初始化,前缀和为0时索引为-1\n \n let prefixSum = 0;\n let minLength = nums.length; // 初始化为数组长度(最坏情况)\n \n for (let i = 0; i < nums.length; i++) {\n prefixSum += nums[i];\n const currentRemainder = prefixSum % p;\n \n // 我们需要找到一个前缀和,使得当前前缀和减去它等于remainder\n // 即:currentRemainder - targetRemainder = remainder (mod p)\n // 所以:targetRemainder = (currentRemainder - remainder + p) % p\n const targetRemainder = (currentRemainder - remainder + p) % p;\n \n if (prefixMap.has(targetRemainder)) {\n const prevIndex = prefixMap.get(targetRemainder);\n const subarrayLength = i - prevIndex;\n minLength = Math.min(minLength, subarrayLength);\n }\n \n // 更新当前前缀和余数的索引\n prefixMap.set(currentRemainder, i);\n }\n \n // 如果最小长度等于数组长度,说明无法找到合适的子数组\n return minLength === nums.length ? -1 : minLength;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 只需要遍历数组一次,哈希表操作为O(1)\n- 空间复杂度 :O(min(n, p)) - 哈希表最多存储min(n, p)个不同的余数","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166733694","body":"## 算法思路\n使用 快慢指针 (Floyd's Tortoise and Hare Algorithm)技术:\n- 设置两个指针:慢指针每次移动一步,快指针每次移动两步\n- 当快指针到达链表末尾时,慢指针恰好位于链表的中间位置\n- 对于偶数长度的链表,返回第二个中间节点\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n // 使用快慢指针法(Floyd's Tortoise and Hare Algorithm)\n // 慢指针每次移动一步,快指针每次移动两步\n // 当快指针到达链表末尾时,慢指针正好在中间位置\n \n let slow = head; // 慢指针\n let fast = head; // 快指针\n \n // 当快指针和快指针的下一个节点都不为空时继续循环\n while (fast !== null && fast.next !== null) {\n slow = slow.next; // 慢指针移动一步\n fast = fast.next.next; // 快指针移动两步\n }\n \n // 当循环结束时,slow指针指向中间节点\n // 如果链表长度为奇数,slow指向唯一的中间节点\n // 如果链表长度为偶数,slow指向第二个中间节点\n return slow;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 需要遍历链表一次,其中n是链表的长度\n- 空间复杂度:O(1) - 只使用了两个额外的指针变量,不随输入规模增长","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3172634872","body":"## 算法思路\n- 双指针技术 :使用 slow 指针指向当前不重复元素的位置, fast 指针遍历数组\n- 原地修改 :当发现不重复元素时,将其复制到 slow+1 位置\n- 利用排序特性 :由于数组已排序,相同元素必然相邻,只需比较相邻元素\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n // 边界情况:空数组或只有一个元素\n if (nums.length <= 1) {\n return nums.length;\n }\n \n // slow指针指向当前不重复元素的位置\n let slow = 0;\n \n // fast指针遍历数组,从第二个元素开始\n for (let fast = 1; fast < nums.length; fast++) {\n // 如果当前元素与前一个不重复元素不同\n if (nums[fast] !== nums[slow]) {\n // 将slow指针向前移动一位\n slow++;\n // 将当前不重复元素复制到slow位置\n nums[slow] = nums[fast];\n }\n // 如果相同,fast继续向前,slow保持不变\n }\n \n // 返回不重复元素的个数(slow指向最后一个不重复元素的索引)\n return slow + 1;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 只需遍历数组一次\n- 空间复杂度 :O(1) - 只使用常数额外空间,符合原地修改要求","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172638327","body":"## 算法思路\n- 二分查找核心思想 :通过比较中间元素与目标值,每次排除一半搜索空间\n- 查找逻辑 :如果找到目标值返回索引,否则返回应插入的位置\n- 关键实现 :循环结束时left指针就是插入位置\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let left = 0;\n let right = nums.length - 1;\n \n // 二分查找\n while (left <= right) {\n // 计算中间位置,避免整数溢出\n let mid = Math.floor(left + (right - left) / 2);\n \n if (nums[mid] === target) {\n // 找到目标值,返回索引\n return mid;\n } else if (nums[mid] < target) {\n // 目标值在右半部分\n left = mid + 1;\n } else {\n // 目标值在左半部分\n right = mid - 1;\n }\n }\n \n // 没找到目标值,left就是应该插入的位置\n return left;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(log n) - 满足题目要求,每次迭代将搜索范围缩小一半\n- 空间复杂度 :O(1) - 只使用常数级别的额外变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3174034461","body":"## 算法思路\n使用双端队列维护一个单调递减的队列,队列中存储数组元素的索引:\n\n- 队首始终是当前窗口的最大值索引\n- 移除超出窗口范围的元素\n- 维护单调性:移除队尾所有小于等于当前元素的索引\n- 当窗口形成时,队首就是最大值\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar maxSlidingWindow = function(nums, k) {\n if (!nums || nums.length === 0 || k <= 0) {\n return [];\n }\n \n const result = [];\n const deque = []; // 存储数组索引的双端队列\n \n for (let i = 0; i < nums.length; i++) {\n // 移除队列中超出窗口范围的元素\n while (deque.length > 0 && deque[0] <= i - k) {\n deque.shift();\n }\n \n // 维护单调递减队列:移除队尾所有小于当前元素的索引\n while (deque.length > 0 && nums[deque[deque.length - 1]] <= nums[i]) {\n deque.pop();\n }\n \n // 将当前元素索引加入队尾\n deque.push(i);\n \n // 当窗口大小达到k时,开始记录结果\n if (i >= k - 1) {\n result.push(nums[deque[0]]); // 队首是当前窗口最大值\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 每个元素最多进队列和出队列各一次\n- 空间复杂度 :O(k) - 队列最多存储k个元素","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178188012","body":"## 算法思路:\n- 使用度数统计法,将问题转化为图论中的入度和出度计算\n- 法官的特征:不信任任何人(出度=0)+ 被所有其他人信任(入度=n-1)\n- 通过计算每个人的\"信任度\"(入度-出度)来找到法官\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n // 特殊情况:只有一个人且没有信任关系,那么这个人就是法官\n if (n === 1 && trust.length === 0) {\n return 1;\n }\n \n // 初始化信任度数组,trustScore[i] = 入度 - 出度\n const trustScore = new Array(n + 1).fill(0);\n \n // 遍历所有信任关系\n for (const [a, b] of trust) {\n trustScore[a]--; // a信任别人,出度+1,所以信任度-1\n trustScore[b]++; // b被信任,入度+1,所以信任度+1\n }\n \n // 查找信任度为n-1的人(法官候选人)\n for (let i = 1; i <= n; i++) {\n if (trustScore[i] === n - 1) {\n return i;\n }\n }\n \n // 没有找到法官\n return -1;\n};\n```\n\n## 算法复杂度分析\n- 时间复杂度: O(E + n)\n- 遍历trust数组:O(E),其中E是信任关系数量\n- 查找法官:O(n)\n\n- 空间复杂度: O(n)\n- 需要额外的信任度数组存储每个人的统计信息","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182100538","body":"## 算法思路\n这是一个经典的二分图判断问题。核心思想是:\n\n- 将问题转化为图着色问题\n- 构建无向图,其中dislikes数组中的每一对表示图中的一条边\n- 使用DFS图着色算法判断是否能用两种颜色给所有节点着色\n- 如果相邻节点都能着不同颜色,则可以分成两组\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nvar possibleBipartition = function(n, dislikes) {\n // 构建邻接表表示图\n const graph = new Array(n + 1).fill(null).map(() => []);\n for (const [a, b] of dislikes) {\n graph[a].push(b);\n graph[b].push(a);\n }\n \n // 用于记录每个节点的颜色,0表示未着色,1和-1表示两种不同的颜色\n const colors = new Array(n + 1).fill(0);\n \n // DFS着色函数\n const dfs = (node, color) => {\n colors[node] = color;\n \n // 遍历所有邻接节点\n for (const neighbor of graph[node]) {\n if (colors[neighbor] === 0) {\n // 如果邻接节点未着色,给它着相反的颜色\n if (!dfs(neighbor, -color)) {\n return false;\n }\n } else if (colors[neighbor] === color) {\n // 如果邻接节点已经着色且颜色相同,说明不能构成二分图\n return false;\n }\n }\n return true;\n };\n \n // 遍历所有节点,处理可能存在的多个连通分量\n for (let i = 1; i <= n; i++) {\n if (colors[i] === 0) {\n if (!dfs(i, 1)) {\n return false;\n }\n }\n }\n \n return true;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(V + E),其中V是节点数量(n个人),E是边的数量(dislikes数组长度)\n- 空间复杂度 :O(V + E),主要用于邻接表存储、颜色数组和DFS递归栈","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186630947","body":"## 算法思路分析:\n这是一个双层拓扑排序问题\n- 首先需要对小组进行拓扑排序,确保依赖的小组在前面\n- 然后对每个小组内的项目进行拓扑排序\n- 最后按小组顺序合并结果\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n // 为没有小组的项目分配虚拟小组ID\n let groupId = m;\n for (let i = 0; i < n; i++) {\n if (group[i] === -1) {\n group[i] = groupId++;\n }\n }\n \n // 构建小组图和项目图\n const groupGraph = new Array(groupId).fill(0).map(() => []);\n const groupIndegree = new Array(groupId).fill(0);\n const itemGraph = new Array(n).fill(0).map(() => []);\n const itemIndegree = new Array(n).fill(0);\n \n // 构建依赖关系图\n const groupEdges = new Set(); // 用于去重小组间的边\n \n for (let i = 0; i < n; i++) {\n for (const beforeItem of beforeItems[i]) {\n const beforeGroup = group[beforeItem];\n const currentGroup = group[i];\n \n // 项目依赖关系\n itemGraph[beforeItem].push(i);\n itemIndegree[i]++;\n \n // 小组依赖关系(只有当项目属于不同小组时)\n if (beforeGroup !== currentGroup) {\n const edgeKey = `${beforeGroup}->${currentGroup}`;\n if (!groupEdges.has(edgeKey)) {\n groupEdges.add(edgeKey);\n groupGraph[beforeGroup].push(currentGroup);\n groupIndegree[currentGroup]++;\n }\n }\n }\n }\n \n // 拓扑排序函数\n function topologicalSort(graph, indegree) {\n const queue = [];\n const result = [];\n \n // 找到所有入度为0的节点\n for (let i = 0; i < indegree.length; i++) {\n if (indegree[i] === 0) {\n queue.push(i);\n }\n }\n \n while (queue.length > 0) {\n const node = queue.shift();\n result.push(node);\n \n // 更新相邻节点的入度\n for (const neighbor of graph[node]) {\n indegree[neighbor]--;\n if (indegree[neighbor] === 0) {\n queue.push(neighbor);\n }\n }\n }\n \n return result.length === graph.length ? result : [];\n }\n \n // 对小组进行拓扑排序\n const sortedGroups = topologicalSort(groupGraph, [...groupIndegree]);\n if (sortedGroups.length === 0) {\n return []; // 小组间存在循环依赖\n }\n \n // 对项目进行拓扑排序\n const sortedItems = topologicalSort(itemGraph, [...itemIndegree]);\n if (sortedItems.length === 0) {\n return []; // 项目间存在循环依赖\n }\n \n // 按小组分类项目\n const groupToItems = new Map();\n for (const item of sortedItems) {\n const itemGroup = group[item];\n if (!groupToItems.has(itemGroup)) {\n groupToItems.set(itemGroup, []);\n }\n groupToItems.get(itemGroup).push(item);\n }\n \n // 按小组顺序合并结果\n const result = [];\n for (const groupId of sortedGroups) {\n if (groupToItems.has(groupId)) {\n result.push(...groupToItems.get(groupId));\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n时间复杂度:O(n + E)\n- 构建图:O(E),E为所有依赖关系总数\n- 小组拓扑排序:O(V_g + E_g)\n- 项目拓扑排序:O(V_i + E_i)\n- 结果合并:O(n)\n\n空间复杂度:O(n + E + m)\n- 图存储:O(n + E)\n- 入度数组:O(n + m)\n- 辅助数据结构:O(n + m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3191484423","body":"## 算法思路\n机器人要回到原点(0,0),必须满足两个条件:\n- 向左移动的次数 = 向右移动的次数\n- 向上移动的次数 = 向下移动的次数\n\n## 代码\n```javascript\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let x = 0, y = 0; // 当前坐标\n \n for (let move of moves) {\n switch (move) {\n case 'L':\n x--;\n break;\n case 'R':\n x++;\n break;\n case 'U':\n y++;\n break;\n case 'D':\n y--;\n break;\n }\n }\n \n return x === 0 && y === 0;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n),其中n是moves字符串的长度,需要遍历一次字符串\n- 空间复杂度 :O(1),只使用了常数个额外变量,不随输入规模变化","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3194108225","body":"## 算法思路\n- 预处理 :为每个任务添加原始索引,按进入时间排序\n- 模拟执行 :使用最小堆维护可执行任务队列,按执行时间最短优先、索引最小优先的规则选择任务\n- 时间管理 :CPU空闲时直接跳转到下一个任务的进入时间,避免无效等待\n\n## 代码\n```javascript\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n const n = tasks.length;\n \n // 为每个任务添加原始索引,然后按进入时间排序\n const taskWithIndex = tasks.map((task, index) => [task[0], task[1], index]);\n taskWithIndex.sort((a, b) => a[0] - b[0]); // 按enqueueTime排序\n \n const result = [];\n // 优先队列:按执行时间升序,相同时按索引升序\n const availableTasks = new MinHeap((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按processingTime升序\n }\n return a[1] - b[1]; // 按originalIndex升序\n });\n \n let currentTime = 0;\n let taskIndex = 0; // 指向下一个要加入队列的任务\n \n while (result.length < n) {\n // 将所有在当前时间或之前进入队列的任务加入可执行队列\n while (taskIndex < n && taskWithIndex[taskIndex][0] <= currentTime) {\n const [enqueueTime, processingTime, originalIndex] = taskWithIndex[taskIndex];\n availableTasks.push([processingTime, originalIndex]);\n taskIndex++;\n }\n \n if (availableTasks.size() === 0) {\n // CPU空闲,直接跳到下一个任务的进入时间\n if (taskIndex < n) {\n currentTime = taskWithIndex[taskIndex][0];\n }\n } else {\n // 从可执行任务中选择执行时间最短的(相同时选择索引最小的)\n const [processingTime, originalIndex] = availableTasks.pop();\n result.push(originalIndex);\n currentTime += processingTime;\n }\n }\n \n return result;\n};\n\n// 最小堆实现\nclass MinHeap {\n constructor(compareFn) {\n this.heap = [];\n this.compare = compareFn || ((a, b) => a - b);\n }\n \n push(val) {\n this.heap.push(val);\n this.bubbleUp(this.heap.length - 1);\n }\n \n pop() {\n if (this.heap.length === 0) return undefined;\n if (this.heap.length === 1) return this.heap.pop();\n \n const top = this.heap[0];\n this.heap[0] = this.heap.pop();\n this.bubbleDown(0);\n return top;\n }\n \n size() {\n return this.heap.length;\n }\n \n bubbleUp(index) {\n while (index > 0) {\n const parentIndex = Math.floor((index - 1) / 2);\n if (this.compare(this.heap[index], this.heap[parentIndex]) >= 0) break;\n \n [this.heap[index], this.heap[parentIndex]] = [this.heap[parentIndex], this.heap[index]];\n index = parentIndex;\n }\n }\n \n bubbleDown(index) {\n while (true) {\n let minIndex = index;\n const leftChild = 2 * index + 1;\n const rightChild = 2 * index + 2;\n \n if (leftChild < this.heap.length && \n this.compare(this.heap[leftChild], this.heap[minIndex]) < 0) {\n minIndex = leftChild;\n }\n \n if (rightChild < this.heap.length && \n this.compare(this.heap[rightChild], this.heap[minIndex]) < 0) {\n minIndex = rightChild;\n }\n \n if (minIndex === index) break;\n \n [this.heap[index], this.heap[minIndex]] = [this.heap[minIndex], this.heap[index]];\n index = minIndex;\n }\n }\n}\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n log n)\n - 排序:O(n log n)\n - 堆操作:每个任务最多进出堆一次,总计O(n log n)\n- 空间复杂度 :O(n)\n - 存储任务信息、最小堆和结果数组","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194111949","body":"## 算法核心思路\n- 1.时间转换 :将 \"HH:MM\" 格式转换为分钟数便于计算\n- 2.对局编号计算 :\n - 开始时间: Math.ceil(minutes / 15) 确保只计算完整参与的对局\n - 结束时间: Math.floor(minutes / 15) 确保只计算完整参与的对局\n- 3.分情况处理 :\n - 同一天:结束时间对局编号 - 开始时间对局编号\n - 跨夜:(96 - 开始时间对局编号) + 结束时间对局编号\n\n## 代码\n```javascript\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n // 将时间字符串转换为分钟数\n function timeToMinutes(time) {\n const [hours, minutes] = time.split(':').map(Number);\n return hours * 60 + minutes;\n }\n \n const startMinutes = timeToMinutes(loginTime);\n const endMinutes = timeToMinutes(logoutTime);\n \n // 如果结束时间早于开始时间,说明跨越了午夜\n if (endMinutes < startMinutes) {\n // 跨夜情况:从开始时间到午夜 + 从午夜到结束时间\n // 计算从开始时间到午夜能完成的对局数\n const roundsBeforeMidnight = 96 - Math.ceil(startMinutes / 15);\n // 计算从午夜到结束时间能完成的对局数\n const roundsAfterMidnight = Math.floor(endMinutes / 15);\n return roundsBeforeMidnight + roundsAfterMidnight;\n } else {\n // 同一天情况\n // 能完成的对局数 = 结束时间所在的对局编号 - 开始时间所在的对局编号\n const result = Math.floor(endMinutes / 15) - Math.ceil(startMinutes / 15);\n return Math.max(0, result); // 确保不返回负数\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(1) - 所有操作都是常数时间的数学计算\n- 空间复杂度 :O(1) - 只使用固定数量的变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3197064559","body":"## 算法思路\n- 1.统计字符频率\n- 2.条件三:变成同一个字母\n- 3.条件一 & 条件二:字母严格大小比较\n- 4.综合最优解\n\n## 代码\n```javascript\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n let n = a.length, m = b.length;\n\n let freqA = new Array(26).fill(0);\n let freqB = new Array(26).fill(0);\n\n for (let ch of a) freqA[ch.charCodeAt(0) - 97]++;\n for (let ch of b) freqB[ch.charCodeAt(0) - 97]++;\n\n // 前缀和\n let prefixA = new Array(27).fill(0);\n let prefixB = new Array(27).fill(0);\n for (let i = 0; i < 26; i++) {\n prefixA[i+1] = prefixA[i] + freqA[i];\n prefixB[i+1] = prefixB[i] + freqB[i];\n }\n\n // 条件三:相同字母\n let ops3 = Infinity;\n for (let i = 0; i < 26; i++) {\n ops3 = Math.min(ops3, n + m - (freqA[i] + freqB[i]));\n }\n\n // 条件一 & 二\n let ops1 = Infinity, ops2 = Infinity;\n for (let c = 0; c < 25; c++) { // 0~24,分割点\n // a < b\n ops1 = Math.min(ops1, (n - prefixA[c+1]) + prefixB[c+1]);\n // b < a\n ops2 = Math.min(ops2, (m - prefixB[c+1]) + prefixA[c+1]);\n }\n\n return Math.min(ops1, ops2, ops3);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n + m)\n- 空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199072283","body":"## 算法思路\n- 1.将数组构建为一个 最大堆(heapify)\n 最大堆性质:父节点值 ≥ 子节点值。\n- 2.交换堆顶(最大值)和堆尾元素,把最大值放到最终位置。\n- 3.缩小堆的范围(长度减 1),重新 heapify。\n- 4.重复步骤 2–3,直到整个数组有序。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function(nums) {\n let n = nums.length;\n\n // 建堆(从最后一个非叶子节点开始向下调整)\n for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {\n heapify(nums, n, i);\n }\n\n // 不断取出堆顶(最大值)放到数组末尾\n for (let i = n - 1; i > 0; i--) {\n // 交换堆顶和堆尾\n [nums[0], nums[i]] = [nums[i], nums[0]];\n // 调整剩余部分\n heapify(nums, i, 0);\n }\n\n return nums;\n};\n\n// 调整为最大堆\nfunction heapify(arr, heapSize, root) {\n let largest = root;\n let left = 2 * root + 1;\n let right = 2 * root + 2;\n\n if (left < heapSize && arr[left] > arr[largest]) {\n largest = left;\n }\n\n if (right < heapSize && arr[right] > arr[largest]) {\n largest = right;\n }\n\n if (largest !== root) {\n [arr[root], arr[largest]] = [arr[largest], arr[root]];\n heapify(arr, heapSize, largest);\n }\n}\n```\n\n## 复杂度分析\n- 时间复杂度\n建堆:O(n)\n每次取出最大值并 heapify:O(log n),共 n 次\n总计:O(n log n)\n- 空间复杂度\n堆排序在原数组上操作,只需要 O(1) 额外空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204787436","body":"## 算法思路:\n- 平方根一定在 1 ~ x/2 之间(除了 0 和 1 特殊处理)。\n- 用二分查找,比较 mid * mid 与 x。\n- 如果等于就直接返回。\n- 如果小于,就把 mid 作为候选答案,继续往右找。\n- 如果大于,就往左缩。\n\n## 代码\n```javascript\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n if (x < 2) return x; // 0 -> 0, 1 -> 1\n\n let left = 1, right = Math.floor(x / 2), ans = 0;\n while (left <= right) {\n let mid = Math.floor((left + right) / 2);\n let square = mid * mid;\n\n if (square === x) {\n return mid;\n } else if (square < x) {\n ans = mid; // mid 可能是答案\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 O(log n)\n- 空间复杂度 O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3209498631","body":"## 算法思路\n- 设定搜索区间 [1, n]。\n- 取中点 mid = Math.floor((left + right) / 2)。\n- 调用 isBadVersion(mid):\n- 如果是坏的(true),说明答案在 左边或就是 mid,更新 right = mid。\n- 如果不是坏的(false),说明答案在 右边,更新 left = mid + 1。\n- 循环直到 left == right,此时 left 就是第一个坏版本。\n\n## 代码\n```javascript\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let left = 1, right = n;\n while (left < right) {\n let mid = Math.floor((left + right) / 2);\n if (isBadVersion(mid)) {\n // mid 可能是第一个坏版本,所以不能跳过它\n right = mid;\n } else {\n // mid 不是坏的,第一个坏版本在右边\n left = mid + 1;\n }\n }\n return left; // 或者 right,二者相等\n };\n};\n```\n\n## 复杂度分析\n- 时间复杂度:每次二分区间缩小一半,最多调用 isBadVersion O(log n) 次。\n- 空间复杂度:我们只用到了几个变量,额外空间复杂度是 O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3214357168","body":"## 算法思路\n- 1.分治思想(归并排序)\n- 把数组分为两半,分别统计左半部分和右半部分的翻转对数量。\n- 在合并的时候,再统计「跨左右两部分」的翻转对数量。\n- 2.跨区间统计方法\n- 假设左半部分是 left[],右半部分是 right[],它们都是有序的。\n- 对于每个 left[i],我们需要统计右边有多少个 right[j] 满足left[i]>2×right[j]\n- 因为 right[] 已经排序,可以用一个指针 双指针扫描,避免嵌套循环。\n- 3.合并排序\n- 统计完跨区间的翻转对数量后,把两个有序数组合并,递归回溯。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n if (!nums || nums.length === 0) return 0;\n\n const mergeSort = (arr, left, right) => {\n if (left >= right) return 0;\n\n let mid = Math.floor((left + right) / 2);\n let count = mergeSort(arr, left, mid) + mergeSort(arr, mid + 1, right);\n\n // 统计跨区间翻转对\n let j = mid + 1;\n for (let i = left; i <= mid; i++) {\n while (j <= right && arr[i] > 2 * arr[j]) {\n j++;\n }\n count += (j - (mid + 1));\n }\n\n // 合并两个有序数组\n let temp = [];\n let p1 = left, p2 = mid + 1;\n while (p1 <= mid && p2 <= right) {\n if (arr[p1] <= arr[p2]) {\n temp.push(arr[p1++]);\n } else {\n temp.push(arr[p2++]);\n }\n }\n while (p1 <= mid) temp.push(arr[p1++]);\n while (p2 <= right) temp.push(arr[p2++]);\n\n for (let i = 0; i < temp.length; i++) {\n arr[left + i] = temp[i];\n }\n\n return count;\n };\n\n return mergeSort(nums, 0, nums.length - 1);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(nlogn)\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3218651000","body":"## 算法思路\n\n- 排序\n- 对 houses 和 heaters 进行排序,方便二分查找。\n- 二分查找\n- 对于每个房屋 h,在 heaters 中二分查找,找到最接近 h 的供暖器位置。\n- 计算 |h - heater_left| 和 |h - heater_right| 的最小值。\n- 得到该房屋的最小供暖距离。\n- 取最大值\n- 遍历所有房屋,取最小距离的最大值。\n\n## 代码\n```javascript\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n houses.sort((a, b) => a - b);\n heaters.sort((a, b) => a - b);\n\n let radius = 0;\n\n for (let house of houses) {\n // 二分查找\n let left = 0, right = heaters.length - 1;\n while (left <= right) {\n let mid = Math.floor((left + right) / 2);\n if (heaters[mid] < house) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n // left 是第一个 >= house 的位置\n let dist1 = (left < heaters.length) ? Math.abs(heaters[left] - house) : Infinity;\n let dist2 = (right >= 0) ? Math.abs(heaters[right] - house) : Infinity;\n\n let nearest = Math.min(dist1, dist2);\n radius = Math.max(radius, nearest);\n }\n\n return radius;\n};\n```\n\n## 复杂度分析\n- 排序\n- houses 排序:O(n log n)\n- heaters 排序:O(m log m)\n- 二分查找\n- 每个房屋做一次二分:O(log m)\n- 共 n 个房屋:O(n log m)\n- 总时间复杂度:O(nlogn+mlogm+nlogm)\n- 空间复杂度:O(1)(除了排序外,常数额外空间)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3218659174","body":"## 排序数组\n- 先对 nums 排序。这样数对距离 = 两个数的差,可以利用单调性。\n- 二分查找答案\n- 距离范围:最小值 0,最大值 max(nums) - min(nums)。\n- 设二分中间值为 mid,问题转化为:\n- 数组中有多少对数对距离 ≤ mid。\n- 双指针统计 ≤ mid 的数对数量\n- 排序后数组 nums 单调递增。\n- 用两个指针 i、j:\n- 固定右端点 j,向左找满足 nums[j] - nums[i] <= mid 的最小 i。\n- 那么从 i 到 j-1 的所有元素都和 j 构成合法数对,总数是 j - i。\n- 整个过程是 O(n)。\n- 二分逻辑\n- 如果 ≤ mid 的数对数目 ≥ k,说明答案可能更小,右边界收缩。\n- 否则说明距离太小,左边界右移。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a, b) => a - b);\n\n // 统计差值 <= mid 的数对个数\n function countPairs(mid) {\n let count = 0;\n let i = 0;\n for (let j = 0; j < nums.length; j++) {\n while (nums[j] - nums[i] > mid) {\n i++;\n }\n count += j - i;\n }\n return count;\n }\n\n let left = 0, right = nums[nums.length - 1] - nums[0];\n while (left < right) {\n let mid = Math.floor((left + right) / 2);\n if (countPairs(mid) >= k) {\n right = mid; // 答案可能是 mid 或更小\n } else {\n left = mid + 1;\n }\n }\n return left;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 排序:O(n log n)\n- 二分查找:查找范围是 max(nums) - min(nums),最大 1e6,二分次数约 log(1e6) ≈ 20。\n- 每次 countPairs:O(n)(双指针扫描一遍)。\n- 总复杂度:O(n log n + n log W),其中 W = max(nums) - min(nums)。对 n = 1e4,完全可行。\n- 空间复杂度\n- 只用了常数级变量,O(1)(不算排序)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218668542","body":"## 算法思路\n- 二分 + BFS/DFS\n- 时间范围是 [max(grid[0][0], grid[n-1][n-1]), n^2-1]。\n- 二分水位 mid,检查是否能在 mid 水位下从 (0,0) 到 (n-1,n-1)。\n- 如果可以,则收缩右边界,否则收缩左边界。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n const n = grid.length;\n const directions = [[1,0],[-1,0],[0,1],[0,-1]];\n \n // 检查是否能在水位 t 下到达终点\n function canReach(t) {\n if (grid[0][0] > t) return false;\n const visited = Array.from({length: n}, () => Array(n).fill(false));\n const queue = [[0,0]];\n visited[0][0] = true;\n\n while (queue.length > 0) {\n const [x, y] = queue.shift();\n if (x === n-1 && y === n-1) return true;\n for (const [dx, dy] of directions) {\n const nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n &&\n !visited[nx][ny] && grid[nx][ny] <= t) {\n visited[nx][ny] = true;\n queue.push([nx, ny]);\n }\n }\n }\n return false;\n }\n\n // 二分查找最小可行水位\n let low = Math.max(grid[0][0], grid[n-1][n-1]);\n let high = n * n - 1;\n let ans = high;\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (canReach(mid)) {\n ans = mid;\n high = mid - 1; // 尝试更小的水位\n } else {\n low = mid + 1;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- BFS 最多访问 n^2 个格子,复杂度 O(n^2)。\n- 二分查找 范围大小约为 n^2,二分次数 O(log(n^2)) = O(log n)。\n- 总时间复杂度:O(n^2 log n)。\n- 空间复杂度:需要 visited 数组 O(n^2)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3226685252","body":"## 核心思路\n- 滑动窗口(Sliding Window)\n- 定义元音集合\n- vowels = new Set(['a','e','i','o','u'])\n- 初始化窗口\n- 先统计前 k 个字符里元音的数量 count。\n- 这就是第一个窗口的元音数。\n- 滑动窗口\n- 从 i = k 开始,窗口向右滑动:\n- 移除窗口最左边的字符(如果它是元音则 count--)。\n- 加入窗口最右边的字符(如果它是元音则 count++)。\n- 每次更新最大值 maxCount = Math.max(maxCount, count)。\n- 提前终止\n- 如果 maxCount === k,说明某个窗口里全是元音,直接返回结果(不可能更大了)。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n const vowels = new Set(['a', 'e', 'i', 'o', 'u']);\n let count = 0, maxCount = 0;\n\n // 初始化前 k 个字符\n for (let i = 0; i < k; i++) {\n if (vowels.has(s[i])) count++;\n }\n maxCount = count;\n\n // 滑动窗口\n for (let i = k; i < s.length; i++) {\n if (vowels.has(s[i - k])) count--; // 移除最左边\n if (vowels.has(s[i])) count++; // 加入最右边\n maxCount = Math.max(maxCount, count);\n if (maxCount === k) return k; // 提前终止\n }\n\n return maxCount;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 初始化前 k 个字符统计需要 O(k)。\n- 然后遍历整个字符串一次 O(n)。\n- 总体复杂度:O(n)。\n- 空间复杂度:\n- 仅使用一个集合 Set 存元音,空间 O(1)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3226702074","body":"## 思路分析\n- 边界情况\n- 如果 k == 0:Alice 一开始就停,不抽牌,分数是 0。如果 0 <= n,返回 1;否则返回 0。\n- 如果 n >= k - 1 + maxPts:Alice 不可能超过 n,因为最大分数就是 k-1 + maxPts。此时概率是 1。\n- 动态规划建模\n- 定义 dp[i] = 从分数 i 出发,Alice 最终分数不超过 n 的概率。\n- 最终答案是 dp[0]。\n- 如果 i >= k:表示 Alice 已经停了。\n- 如果 i <= n:返回 1(安全)。\n- 否则返回 0(爆掉)。\n- 如果 i < k:Alice 会继续抽。\n- 优化:滑动窗口\n- 用一个变量 windowSum 维护滑动和,就能做到 O(n)。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n // 速返:一开始就停;或最高可能分也不超过 n\n if (k === 0 || n >= k - 1 + maxPts) return 1.0;\n\n const dp = new Array(n + 1).fill(0.0);\n // 终止区间:达到/超过 k 后立即停;在 [k, n] 内都是成功状态\n for (let i = k; i <= n; i++) dp[i] = 1.0;\n\n // 初始窗口和:dp[k]..dp[k+maxPts-1],这些里面只有 <= n 的是 1\n let windowSum = Math.min(n - k + 1, maxPts);\n\n // 从后往前做滑动平均\n for (let i = k - 1; i >= 0; i--) {\n dp[i] = windowSum / maxPts;\n // 更新窗口:加上新放入的 dp[i],减去滑出窗口的 dp[i + maxPts](越界视为 0)\n windowSum += dp[i] - (i + maxPts <= n ? dp[i + maxPts] : 0);\n // 也可写成:windowSum += dp[i] - (dp[i + maxPts] ?? 0);\n }\n return dp[0];\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 只遍历了一次数组,每个状态 O(1) 计算。\n- 时间复杂度:O(n)\n- 空间复杂度\n- 需要一个 dp 数组大小为 O(n)。\n- 也可以优化成 O(maxPts)(因为只依赖一个窗口)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3231363055","body":"## 算法思路\n- 核心观察\n- 一个字符串的异位词就是 字符相同但顺序不同 的字符串。\n- 如果子串和 p 的 字符频率统计完全相同,那么它就是一个异位词。\n- 滑动窗口\n- 用两个数组(或哈希表)存放字符频率:\n- pCount 记录 p 中各字符出现次数。\n- sCount 记录当前窗口(长度等于 p.length)的各字符出现次数。\n- 每次窗口滑动:\n- 移入一个字符,更新 sCount。\n- 移出一个字符,更新 sCount。\n- 如果 sCount 和 pCount 相等,则记录当前窗口起始位置。\n- 优化比较\n- 不需要每次都完整比较两个数组(O(26))。\n- 但因为字符集仅 26 个,比较成本很小,可以直接比较数组,整体复杂度依旧可接受。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nvar findAnagrams = function(s, p) {\n let res = [];\n let m = p.length, n = s.length;\n if (n < m) return res;\n\n // 频次数组,26个小写字母\n let pCount = new Array(26).fill(0);\n let sCount = new Array(26).fill(0);\n\n // 统计 p 的频率\n for (let ch of p) {\n pCount[ch.charCodeAt(0) - 97]++;\n }\n\n // 初始化第一个窗口\n for (let i = 0; i < m; i++) {\n sCount[s.charCodeAt(i) - 97]++;\n }\n\n // 比较初始窗口\n if (sCount.join() === pCount.join()) res.push(0);\n\n // 滑动窗口\n for (let i = m; i < n; i++) {\n sCount[s.charCodeAt(i) - 97]++; // 加入右边字符\n sCount[s.charCodeAt(i - m) - 97]--; // 移出左边字符\n\n if (sCount.join() === pCount.join()) {\n res.push(i - m + 1);\n }\n }\n\n return res;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 初始化统计频率:O(m)\n- 滑动窗口遍历 s:O(n)\n- 每次比较频率数组:O(26) = O(1)\n- 总复杂度:O(n + m)\n- 空间复杂度\n- 两个长度为 26 的数组:O(26) ≈ O(1)\n- 结果数组存储下标,最坏情况 O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3236034367","body":"## 算法思路\n- 核心思想:滑动窗口\n- 我们在字符串 s 上维护一个动态窗口 [left, right)。\n- 用 need 记录字符串 t 中每个字符需要的次数。\n- 用 window 记录当前窗口中每个字符出现的次数。\n- 不断扩展 right 指针,直到窗口内满足 t 的要求。\n- 然后收缩 left,尽量缩小窗口,直到不满足要求为止。\n- 在满足要求的情况下,更新最小子串。\n- 满足条件的判断\n- 我们可以维护一个 valid 变量,表示窗口中满足 need 的字符种类数。\n- 当 valid === need.size 时,说明窗口包含了所有需要的字符。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nvar minWindow = function(s, t) {\n let need = new Map();\n let window = new Map();\n\n for (let c of t) {\n need.set(c, (need.get(c) || 0) + 1);\n }\n\n let left = 0, right = 0;\n let valid = 0;\n let start = 0, len = Infinity;\n\n while (right < s.length) {\n let c = s[right];\n right++;\n if (need.has(c)) {\n window.set(c, (window.get(c) || 0) + 1);\n if (window.get(c) === need.get(c)) {\n valid++;\n }\n }\n\n // 收缩左边界\n while (valid === need.size) {\n if (right - left < len) {\n start = left;\n len = right - left;\n }\n let d = s[left];\n left++;\n if (need.has(d)) {\n if (window.get(d) === need.get(d)) {\n valid--;\n }\n window.set(d, window.get(d) - 1);\n }\n }\n }\n\n return len === Infinity ? \"\" : s.substr(start, len);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 每个字符最多被左右指针访问一次,所以是 O(m + n),其中 m = s.length, n = t.length。\n- 空间复杂度:\n- 哈希表 need 和 window 至多包含全部字符,大小为 O(Σ),Σ 是字符集大小(对英文就是 O(26) 或 O(52) 或 O(128))。\n- 所以空间复杂度 O(Σ)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/50#issuecomment-3247555036","body":"## 算法思路\n- 一共要拿 k 张牌,可以从数组两端取。\n- 等价于:我们留下 n - k 张牌(连续子数组),这些是不能拿的。\n- 因此,最大得分 = 总和 - 最小的长度为 (n - k) 的子数组的和。\n- 先计算数组总和 total。\n- 如果 k == n,那就直接返回 total。\n- 否则,使用滑动窗口大小为 (n - k),找到 最小窗口和。\n- 答案就是 total - min_window_sum。\n\n## 代码\n```javascript\n/**\n * @param {number[]} cardPoints\n * @param {number} k\n * @return {number}\n */\nvar maxScore = function(cardPoints, k) {\n const n = cardPoints.length;\n const total = cardPoints.reduce((a, b) => a + b, 0);\n \n // 特殊情况:拿所有卡牌\n if (k === n) return total;\n \n const windowSize = n - k;\n // 初始化窗口和\n let windowSum = 0;\n for (let i = 0; i < windowSize; i++) {\n windowSum += cardPoints[i];\n }\n let minWindowSum = windowSum;\n \n // 滑动窗口\n for (let i = windowSize; i < n; i++) {\n windowSum += cardPoints[i] - cardPoints[i - windowSize];\n minWindowSum = Math.min(minWindowSum, windowSum);\n }\n \n return total - minWindowSum;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 计算总和 O(n)\n- 滑动窗口遍历一次数组 O(n)\n- 总复杂度 O(n)\n- 空间复杂度:\n- 只用常数级变量存储 O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3247564267","body":"## 算法思路\n- 枚举所有可能的小时和分钟\n- 小时范围:0–11\n- 分钟范围:0–59\n- 总共 12 × 60 = 720 种组合。\n- 统计二进制表示中 1 的个数\n- bitCount(h) + bitCount(m) == turnedOn 才是合法解。\n- 其中 bitCount(x) 表示数字 x 的二进制中 1 的数量。\n- 格式化输出\n- 小时 h 直接转成字符串(不能有前导零)。\n- 分钟 m 必须是两位数,若小于 10 需在前面补 0。\n\n## 代码\n```javascript\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n const res = [];\n // 遍历所有可能的时间\n for (let h = 0; h < 12; h++) {\n for (let m = 0; m < 60; m++) {\n // 检查是否满足亮灯数量\n if (bitCount(h) + bitCount(m) === turnedOn) {\n // 格式化分钟(必须两位数)\n const time = `${h}:${m.toString().padStart(2, '0')}`;\n res.push(time);\n }\n }\n }\n return res;\n};\n\n// 计算二进制数中 1 的个数\nfunction bitCount(num) {\n let count = 0;\n while (num > 0) {\n count += num & 1;\n num >>= 1;\n }\n return count;\n}\n```\n\n## 复杂度分析\n- 外层遍历所有 12 × 60 = 720 种时间组合 → O(720) ≈ O(1) (常数级,最多 720 次)。\n- 每次计算 bitCount(h) 和 bitCount(m),\n- h < 12(最多 4 bit),m < 60(最多 6 bit),所以计算一次 bitCount 的复杂度 ≤ 10。\n- 总复杂度依然是常数级。\n- 时间复杂度:O(1) (严格来说是 O(720×10),但近似常数)\n- 空间复杂度:O(1) (除返回结果外仅使用常量存储)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3247575227","body":"## 算法思路(回溯法)\n- 逐行放置:从第 0 行开始,尝试在每一列放置皇后。\n- 约束检查:放置前,检查当前列和对角线是否已有皇后。\n- 列冲突:用一个集合 cols 记录已占用的列。\n- 主对角线冲突:行号 - 列号 相同的点在同一主对角线上,用 diag1 集合。\n- 副对角线冲突:行号 + 列号 相同的点在同一副对角线上,用 diag2 集合。\n- 递归搜索:如果当前行放置成功,递归尝试下一行。\n- 回溯:如果无法继续,撤销放置,尝试下一个位置。\n- 统计解法数:当所有行都成功放置皇后时,计数 +1。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n const cols = new Set(); // 记录已占用的列\n const diag1 = new Set(); // 记录主对角线 (row - col)\n const diag2 = new Set(); // 记录副对角线 (row + col)\n\n function backtrack(row) {\n if (row === n) { \n count++;\n return;\n }\n for (let col = 0; col < n; col++) {\n if (cols.has(col) || diag1.has(row - col) || diag2.has(row + col)) {\n continue; // 冲突,不能放\n }\n // 选择\n cols.add(col);\n diag1.add(row - col);\n diag2.add(row + col);\n\n backtrack(row + 1);\n\n // 回溯\n cols.delete(col);\n diag1.delete(row - col);\n diag2.delete(row + col);\n }\n }\n\n backtrack(0);\n return count;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 每行必须放置一个皇后,因此每一行尝试 n 种列的可能性。\n- 在冲突检测 O(1) 的情况下,最坏情况回溯树的大小接近 O(n!)。\n- 实际上,由于剪枝(冲突检测),复杂度会远小于 n!,但仍然是 指数级。\n- 时间复杂度:O(n!) (上界)。\n- 空间复杂度:\n- cols、diag1、diag2 最多各存储 n 个元素。\n- 递归栈深度最大为 n。\n- 空间复杂度:O(n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3247583590","body":"## 算法思路\n- 遍历整个网格,当遇到值为 1 的格子时,说明找到了新的岛屿。\n- 使用 DFS(深度优先搜索)或 BFS(广度优先搜索)来扩展整个岛屿,计算其面积,并更新最大值。\n- 为避免重复计算,我们要将访问过的格子标记为 0(淹没)或使用 visited 数组。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n let m = grid.length, n = grid[0].length;\n let maxArea = 0;\n\n function dfs(i, j) {\n // 边界条件\n if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] === 0) {\n return 0;\n }\n // 标记访问过\n grid[i][j] = 0;\n let area = 1;\n // 四个方向\n area += dfs(i + 1, j);\n area += dfs(i - 1, j);\n area += dfs(i, j + 1);\n area += dfs(i, j - 1);\n return area;\n }\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n maxArea = Math.max(maxArea, dfs(i, j));\n }\n }\n }\n\n return maxArea;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 遍历整个矩阵,每个元素最多被访问一次(因为访问后会被置为 0)。\n- 每个格子在 DFS 中的递归调用也是 O(1)(最多 4 次相邻扩展)。\n- 总时间复杂度: O(m * n)\n- 空间复杂度:\n- 递归栈的深度,最坏情况是整个矩阵都是 1,即 O(m * n)。\n- 如果用 BFS + 队列,也需要 O(m * n) 的空间。\n- 空间复杂度: O(m * n)(递归栈 / 队列空间)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247593268","body":"## 算法思路\n- 使用多源 BFS(广度优先搜索)来解决。\n- 找到所有陆地格子,放入队列(多源 BFS 起点)。\n- 从陆地开始向外扩展,遇到海洋格子时更新它的距离。\n- 记录 BFS 扩展到的最大层数,即最大距离。\n- 最后如果没有海洋或没有陆地,返回 -1。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxDistance = function(grid) {\n const n = grid.length;\n const directions = [[1,0],[-1,0],[0,1],[0,-1]];\n const queue = [];\n\n // 1. 把所有陆地加入队列\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n queue.push([i, j]);\n }\n }\n }\n\n // 如果全是海洋或者全是陆地\n if (queue.length === 0 || queue.length === n * n) return -1;\n\n let distance = -1;\n\n // 2. 多源 BFS\n while (queue.length > 0) {\n let size = queue.length;\n distance++; // 每一层扩展一次\n for (let s = 0; s < size; s++) {\n const [x, y] = queue.shift();\n for (let [dx, dy] of directions) {\n const nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] === 0) {\n grid[nx][ny] = 1; // 标记为已访问(变为陆地)\n queue.push([nx, ny]);\n }\n }\n }\n }\n\n return distance;\n};\n```\n\n## 复杂度分析\n- BFS 遍历整个网格,每个格子最多入队一次。\n- 时间复杂度:O(n^2)\n- 空间复杂度(队列 + 访问标记):O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3270177258","body":"## 思路\n- 一开始手上有一些 初始盒子,目标是最大化能获得的糖果数。关键点是:\n- 盒子可能是 开着的(status[i] = 1)或者 关着的(status[i] = 0)。\n- 你只有在盒子开着时,才能取走里面的糖果。\n- 打开盒子后,你可能获得 钥匙,可以解锁更多盒子。\n- 打开盒子后,你可能获得 更多盒子,这些盒子可能要等钥匙解锁才能用。\n- 所以整个过程就是一个 BFS / 队列模拟,类似 “不断解锁和探索”的过程。\n\n## 代码\n```javascript\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n let n = status.length;\n let res = 0;\n\n let haveKey = new Set();\n let haveBox = new Set(initialBoxes);\n let visited = new Array(n).fill(false);\n\n let queue = [...initialBoxes];\n\n while (queue.length > 0) {\n let box = queue.shift();\n if (visited[box]) continue;\n\n // 如果箱子是锁着的且没钥匙 -> 跳过\n if (status[box] === 0 && !haveKey.has(box)) continue;\n\n // 打开箱子\n visited[box] = true;\n res += candies[box];\n\n // 获得钥匙\n for (let k of keys[box]) {\n if (!haveKey.has(k)) {\n haveKey.add(k);\n // 如果之前已经有这个盒子但是打不开,现在可以打开了\n if (haveBox.has(k) && !visited[k]) {\n queue.push(k);\n }\n }\n }\n\n // 获得新的盒子\n for (let b of containedBoxes[box]) {\n if (!haveBox.has(b)) haveBox.add(b);\n if ((status[b] === 1 || haveKey.has(b)) && !visited[b]) {\n queue.push(b);\n }\n }\n }\n\n return res;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 每个盒子最多被处理一次,O(n)。\n- 钥匙和 containedBoxes 总长度之和最多 O(n)。\n- 所以总 时间复杂度 = O(n)。\n- 空间复杂度分析\n- visited / haveKey / haveBox 都是 O(n)。\n- 队列最多 O(n)。\n- 所以 空间复杂度 = O(n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3270189042","body":"/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n if (!root) return [];\n \n // 存储节点信息:[row, col, val]\n const nodes = [];\n \n // DFS遍历,记录每个节点的坐标和值\n function dfs(node, row, col) {\n if (!node) return;\n \n nodes.push([row, col, node.val]);\n \n // 左子节点:row+1, col-1\n dfs(node.left, row + 1, col - 1);\n // 右子节点:row+1, col+1\n dfs(node.right, row + 1, col + 1);\n }\n \n // 从根节点开始遍历,根节点坐标为(0, 0)\n dfs(root, 0, 0);\n \n // 按列索引分组\n const columnMap = new Map();\n for (const [row, col, val] of nodes) {\n if (!columnMap.has(col)) {\n columnMap.set(col, []);\n }\n columnMap.get(col).push([row, val]);\n }\n \n // 获取所有列索引并排序\n const columns = Array.from(columnMap.keys()).sort((a, b) => a - b);\n \n const result = [];\n for (const col of columns) {\n const columnNodes = columnMap.get(col);\n // 对每列内的节点排序:先按行排序,同行按值排序\n columnNodes.sort((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按行排序\n }\n return a[1] - b[1]; // 同行按值排序\n });\n \n // 提取值\n result.push(columnNodes.map(node => node[1]));\n }\n \n return result;\n};","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ariana850409":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074225557","body":"思維:\n以十進位的相加方式,將 k 拆解成字串,從個位數開始與 num 相加,最後再處理一次 num 的進位\n\n代碼:\n```\nclass Solution(object):\n def addToArrayForm(self, num, k):\n k = str(k)\n for i in range(-1, -(len(k)+1), -1):\n number = int(k[i])\n if abs(i) > len(num):\n num.insert(0, number)\n else:\n num[i] = num[i] + number\n\n for i in range(-1, -(len(num)+1), -1):\n temp = num[i]\n if temp >= 10:\n num[i] = temp - 10\n if abs(i-1) > len(num):\n num.insert(0, 1)\n else:\n num[i-1] += 1\n\n return num\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078087647","body":"思維:\n先找出所有符合字符 c 的 index,再判斷字符串 s 中每個字符跟要拿來比較的 index 的最短距離\n\n代碼:\n```\nclass Solution:\n def shortestToChar(self, s: str, c: str) -> List[int]:\n target = []\n for i, char in enumerate(s):\n if char == c:\n target.append(i)\n\n res = []\n t = 0\n for i in range(len(s)):\n tar = target[t]\n if i < tar:\n res.append(tar-i)\n elif i == tar:\n res.append(0)\n elif t+1 >= len(target):\n res.append(i-tar)\n else:\n next_tar = target[t+1]\n res.append(min(i-tar, next_tar-i))\n if i == next_tar:\n t += 1\n return res\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3083166293","body":"思維一:單純依照題義用最直接的想法來實作各函式,increment 用遍歷去直接改變列表中的值\n\n代碼:\n```python\nclass CustomStack:\n def __init__(self, maxSize: int):\n self.maxSize = maxSize\n self.stack = []\n \n def push(self, x: int) -> None:\n if if len(self.stack) < self.maxSize:\n self.stack.append(x)\n\n def pop(self) -> int:\n if not self.stack:\n return -1\n return self.stack.pop()\n \n def increment(self, k: int, val: int) -> None:\n k = min(k, len(self.stack))\n for i in range(k):\n self.stack[i] += val\n```\n時間複雜度:push, pop: O(1) / increment: O(N)\n\n空間複雜度:O(N)\n\n-----\n思維二:優化 increment 的時間複雜度,將 increment value 另存在一個列表,等 pop 時才判斷需加多少值\n\n代碼:\n```python\nclass CustomStack:\n def __init__(self, maxSize: int):\n self.maxSize = maxSize\n self.stack = []\n self.inc = [0] * maxSize\n \n def push(self, x: int) -> None:\n if not len(self.stack) >= self.maxSize:\n self.stack.append(x)\n\n def pop(self) -> int:\n if not self.stack:\n return -1\n inc_idx = len(self.stack)-1\n inc_val = self.inc[inc_idx]\n if inc_idx > 0:\n self.inc[inc_idx-1] += inc_val\n self.inc[inc_idx] = 0\n return self.stack.pop() + inc_val\n \n def increment(self, k: int, val: int) -> None:\n k = min(k, len(self.stack))\n if k > 0:\n self.inc[k-1] += val\n```\n時間複雜度:push, pop, increment: O(1)\n\n空間複雜度:O(N)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087613442","body":"思維:使用兩個 stack 模擬進入與退出重複區塊的過程,每遇到 [ 就壓入當下狀態,遇到 ] 就彈出並拼接,逐步建立出完整的解碼字串\n\n代碼:\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n cnt_stack = []\n str_stack = []\n cnt = ''\n temp = ''\n for c in s:\n if c.isdigit():\n cnt += c\n elif c == '[':\n cnt_stack.append(int(cnt))\n str_stack.append(temp)\n cnt = ''\n temp = ''\n elif c == ']':\n times = cnt_stack.pop()\n prev_str = str_stack.pop()\n temp = prev_str + temp * times\n else:\n temp += c\n\n return temp\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091473302","body":"思維一:以暴力解的方式在 peek 或 pop 的操作時,用另一個陣列依序存目前 stack pop 出來的所有元素,操作結果後再依序新增回去,時間及空間複雜度皆為 O(N)(無實作)
\n思維二:使用兩個 stack 來操作存取,當有 peek 或 pop 的操作時,從 out_stack 拿取,判斷 out_stack 為空時再一次性的把當前 in_stack 的所有元素倒進 out_stack\n\n代碼:\n```python\nclass MyQueue(object):\n\n def __init__(self):\n self.in_stack = []\n self.out_stack = []\n \n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n self.in_stack.append(x)\n \n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack.pop()\n \n def peek(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack[-1]\n \n def empty(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n return not (self.in_stack + self.out_stack)\n```\n時間複雜度:O(1) (Amortized)\n\n空間複雜度:O(N)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3096165781","body":"思維:\n1. 空串列直接回傳\n2. 先計算鏈結長度 length\n3. 把 k 對 length 取餘,因為旋轉 length 次等於沒動\n4. 用兩個指針 slow 和 fast 找到新的頭 new_head 的位置\n5. 將鏈結斷開重新連接,完成旋轉\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode(object):\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution(object):\n def rotateRight(self, head, k):\n \"\"\"\n :type head: Optional[ListNode]\n :type k: int\n :rtype: Optional[ListNode]\n \"\"\"\n if not head: \n return head\n\n length = 1\n temp = head\n while temp.next:\n length += 1\n temp = temp.next\n\n slow, fast = head, head\n for _ in range(k % length):\n if fast.next:\n fast = fast.next\n else:\n fast = head\n\n if slow == fast: \n return head\n\n while fast.next:\n slow = slow.next\n fast = fast.next\n\n new_head = slow.next\n slow.next = None\n fast.next = head\n return new_head\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100848058","body":"思維:先處理無需交換的情況,透過一個 dummy 節點統一處理頭節點與後續節點的交換邏輯,每次迴圈交換一對相鄰節點,並用 pre 將已處理區與未處理區銜接起來,最後回傳 dummy 的下一個節點作為新鏈表的頭\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if not head or not head.next:\n return head\n\n left = head\n right = head.next\n dummy = ListNode(None, head)\n pre = dummy\n while right:\n left.next = right.next\n right.next = left\n pre.next = right\n pre = left\n left = left.next\n right = left.next if left else None\n\n return dummy.next\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109165432","body":"思維:有想到要計算遞迴的中心點,但一開始解不出來,參考官方題解的思路加上畫圖後思路有比較清晰\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode(object):\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution(object):\n def sortedListToBST(self, head):\n \"\"\"\n :type head: Optional[ListNode]\n :rtype: Optional[TreeNode]\n \"\"\"\n if not head:\n return head\n\n pre, slow, fast = None, head, head\n while fast and fast.next:\n fast = fast.next.next\n pre = slow\n slow = slow.next\n if pre:\n pre.next = None\n\n node = TreeNode(slow.val)\n if slow == fast:\n return node\n \n node.left = self.sortedListToBST(head)\n node.right = self.sortedListToBST(slow.next)\n return node\n```\n時間複雜度:O(NlogN)\n\n空間複雜度:O(logN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112948103","body":"思維:\n1. 使用兩個指標 a 和 b,分別從 headA 和 headB 開始走。\n2. 每當指標走到自己 linked list 的結尾時,跳到另一條 linked list 的頭部繼續走。\n3. 最終:
\n a. 若兩條 list 有交點,a 和 b 會在同一個節點交會(因為走過的總長度相同)。
\n b. 若沒有交點,a 和 b 都會變成 None,同時結束迴圈。\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, x):\n# self.val = x\n# self.next = None\n\nclass Solution:\n def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:\n a, b = headA, headB\n a_switch, b_switch = False, False\n \n while a and b:\n if a == b:\n return a\n\n a = a.next if a.next else None\n if not a and not a_switch:\n a = headB\n a_switch = True\n \n b = b.next if b.next else None\n if not b and not b_switch:\n b = headA\n b_switch = True\n\n return None\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3114228960","body":"思維:使用快慢指針來偵測是否有環存在,若有找到相遇點的話,把 fast 指針重新指向 head 後找環的起點,兩個指針 slow 和 fast 都改成一次走一步,再次相遇時就是環的起始節點\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, x):\n# self.val = x\n# self.next = None\n\nclass Solution:\n def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if not head or not head.next:\n return None\n\n slow, fast = head, head\n while fast:\n slow = slow.next\n fast = fast.next.next if fast.next else None\n if slow and slow == fast:\n fast = head \n while fast != slow:\n fast = fast.next\n slow = slow.next\n return fast\n\n return None\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3122031171","body":"思維:使用雙向鏈表搭配 Hash Map 實作 LRU Cache,讓每次的 get 和 put 操作都能在 O(1) 時間內完成。最近使用的節點會被移到鏈表頭部,當容量超過時,就從尾部刪除最久未使用的節點。\n\n代碼:\n```python\nclass ListNode:\n def __init__(self, key, value):\n self.key = key\n self.val = value\n self.next = None\n self.pre = None\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.capacity = capacity\n self.length = 0\n self.head = ListNode(None, None)\n self.tail = ListNode(None, None)\n self.head.next = self.tail\n self.tail.pre = self.head\n self.map = {}\n\n def _add_to_head(self, key: int, value: int):\n node = ListNode(key, value)\n node.next = self.head.next\n self.head.next = node\n node.next.pre = node\n node.pre = self.head\n self.map[key] = node\n self.length += 1\n\n def _remove_from_tail(self, key: int):\n remove_key = self.tail.pre.key\n self.tail.pre = self.tail.pre.pre\n self.tail.pre.next = self.tail\n self.map.pop(remove_key)\n self.length -= 1\n\n def _move_node_to_head(self, node: ListNode):\n node.pre.next = node.next\n node.next.pre = node.pre\n self.head.next.pre = node\n node.pre = self.head\n node.next = self.head.next\n self.head.next = node\n \n def get(self, key: int) -> int:\n if key in self.map:\n node = self.map[key]\n self._move_node_to_head(node)\n return self.map[key].val\n return -1\n \n def put(self, key: int, value: int) -> None:\n node = self.map.get(key)\n if node:\n self._move_node_to_head(node)\n node.val = value\n else:\n if self.length >= self.capacity:\n self._remove_from_tail(key) \n self._add_to_head(key, value)\n```\n時間複雜度:O(1)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124493359","body":"思維:DFS,透過遞迴分別計算左右子樹的最大深度,然後回傳較大的一邊再加 1(代表當前節點這一層),最終得到整棵樹的最大深度。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def maxDepth(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n return max(self.maxDepth(root.left), self.maxDepth(root.right))+1\n```\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127762191","body":"思維:DFS,透過遞歸比對兩棵樹的每個對應節點是否完全一樣,一層層往下檢查,直到整棵樹都比對完或中途不符合就結束。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if not p and not q:\n return True\n \n if p and q and p.val == q.val:\n res_left = self.isSameTree(p.left, q.left)\n res_right = self.isSameTree(p.right, q.right)\n return res_left and res_right\n\n return False\n```\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3133090654","body":"思維:DFS,透過遞歸保存當前數字的狀態,每走到下一層就把目前的 current_num 乘上 10 再加上當前節點的值,當走到葉子節點時就可以回傳目前這條路徑的數字,最後把左右子樹的 dfs 結果加總起來。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n def dfs(node, current_num):\n if not node:\n return 0\n current_num = current_num * 10 + node.val\n if not node.left and not node.right:\n return current_num\n return dfs(node.left, current_num) + dfs(node.right, current_num)\n return dfs(root, 0)\n```\n時間複雜度:O(N)\n\n空間複雜度:O(d) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135855226","body":"思維一:BFS,使用廣度優先搜尋一層層遍歷二元樹節點,並記錄每一層最先遇到的節點。每當進入新的一層,就更新目前儲存的節點為該層最左側的節點。最終回傳的是最底層最左邊那個節點的值。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n q = deque()\n res = (root,0)\n q.append((root,0))\n while q:\n node, level = q.popleft()\n cur_level = res[1]\n if level > cur_level:\n res = (node, level)\n\n if node.left:\n q.append((node.left, level+1))\n if node.right:\n q.append((node.right, level+1))\n\n return res[0].val\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(w) (max width of tree)\n\n---------\n思維二:DFS,使用深度優先搜尋遍歷整顆樹,每當遇到更深層的節點,就更新目前記錄的最左邊節點值,最終返回的是整棵樹最深層最左邊的節點值。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n def dfs(node, cur_depth, leftmost, depthest):\n if cur_depth > depthest:\n leftmost = node.val\n depthest = cur_depth\n\n if node.left:\n leftmost, depthest = dfs(node.left, cur_depth+1, leftmost, depthest)\n if node.right:\n leftmost, depthest = dfs(node.right, cur_depth+1, leftmost, depthest)\n return leftmost, depthest\n\n leftmost, depthest = dfs(root, 1, root.val, 1)\n return leftmost\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max height of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3140470104","body":"思維一:DFS
\nserialize: 使用 前序遍歷(DFS) 將樹的結構與節點值轉成 list,再轉為 JSON 字串,None 用來記錄空節點保證可逆。
\ndeserialize: 根據前序順序,遇到 None 表示空節點,遞迴還原出整棵樹的結構。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n def dfs(node):\n if not node:\n res.append(None)\n return\n\n res.append(node.val)\n dfs(node.left)\n dfs(node.right)\n\n dfs(root)\n return json.dumps(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n data = deque(json.loads(data))\n def dfs(data):\n val = data.popleft()\n if val is None:\n return\n\n node = TreeNode(val)\n node.left = dfs(data)\n node.right = dfs(data)\n return node\n \n return dfs(data)\n\n# Your Codec object will be instantiated and called as such:\n# ser = Codec()\n# deser = Codec()\n# ans = deser.deserialize(ser.serialize(root))\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)\n\n-----------------\n\n思維二:BFS
\nserialize:利用 BFS(層序遍歷)將每層節點值與空位(None)一起寫入 list,最後轉成 JSON 字串。
\ndeserialize:讀回字串後同樣使用 BFS,按順序建立節點並接上左右子節點,重建出原始二叉樹。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n queue = deque([root])\n while queue:\n node = queue.popleft()\n if node:\n res.append(node.val)\n queue.append(node.left)\n queue.append(node.right)\n else:\n res.append(None)\n\n return json.dumps(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n data = deque(json.loads(data))\n root_val = data.popleft()\n if root_val is None:\n return None\n \n root = TreeNode(root_val)\n queue = deque([root])\n while queue:\n node = queue.popleft()\n if data:\n left_val = data.popleft()\n right_val = data.popleft()\n if left_val is not None:\n left_node = TreeNode(left_val)\n node.left = left_node\n queue.append(left_node)\n if right_val is not None:\n right_node = TreeNode(right_val)\n node.right = right_node\n queue.append(right_node)\n\n return root\n\n# Your Codec object will be instantiated and called as such:\n# ser = Codec()\n# deser = Codec()\n# ans = deser.deserialize(ser.serialize(root))\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148593193","body":"思維:\n1. 對每個點 i 當作中心,計算它與所有其他點的距離\n2. 用 distance_map 統計,有多少個點與 i 的距離相同(也就是距離為 d 的點出現了幾次)\n3. 如果某個距離出現了 count 次(基本上就是超過一次的次數才會被納入計算),就能組出 count * (count - 1) 種 (j, k) boomerang(因為 (j, k), (k, j) 視為兩種組合,(count - 1) 為要扣掉已經放在前一個位置的元素)\n4. 最後把所有距離的組合數加總起來即可\n\n代碼:\n```python\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n res = 0\n for i, x in enumerate(points):\n distance_map = defaultdict(int)\n for j, y in enumerate(points):\n if i != j:\n distance_map[(y[0] - x[0])**2 + (y[1] - x[1])**2] += 1\n\n for count in distance_map.values():\n res += count * (count-1)\n\n return res\n```\n時間複雜度:O(N^2)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153175756","body":"思維:\n1. 使用雙指針 left 和 right 維護一個「不含重複字元的滑動視窗」\n2. 不斷將 right 指向的字元加入 seen\n3. 一旦發現重複字元,就從 left 開始依序從 seen 移除字元,直到這個重複字元被清掉\n4. 每次 right 移動後,更新視窗大小 right - left,維護一個最大值 max_str\n\n代碼:\n```python\nclass Solution:\n def lengthOfLongestSubstring(self, s: str) -> int:\n max_str = 0\n left = 0\n right = 0\n seen = set()\n while right < len(s):\n while s[right] in seen:\n seen.remove(s[left])\n left += 1\n seen.add(s[right])\n right += 1\n max_str = max(max_str, right-left)\n return max_str\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k) (k for number of character types)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160705635","body":"思維:\n1. 多組偏移掃描:使用 i in range(word_len) 對字串做「分組」掃描,防止錯過合法起始點\n2. 滑動視窗掃描:每次從 j 開始擷取一個單字(長度 word_len),如果這個字在 words 裡,放進 window_counter,若某個單字超出次數,移動 left(左指針)來縮小視窗,如果視窗內剛好有 word_count 個單字,加入結果\n3. 如果不是合法單字,清空 window_counter,重設 count 和 left(下一次從這個位置繼續)\n\n代碼:\n```python\nclass Solution:\n def findSubstring(self, s: str, words: List[str]) -> List[int]:\n word_len = len(words[0])\n word_count = len(words)\n total_len = word_len * word_count\n target_counter = Counter(words)\n res = []\n\n for i in range(word_len):\n left = i\n window_counter = Counter()\n count = 0\n\n for j in range(i, len(s) - word_len + 1, word_len):\n word = s[j:j+word_len]\n if word in target_counter:\n window_counter[word] += 1\n count += 1\n\n while window_counter[word] > target_counter[word]:\n left_word = s[left:left+word_len]\n window_counter[left_word] -= 1\n count -= 1\n left += word_len\n\n if count == word_count:\n res.append(left)\n\n else:\n window_counter.clear()\n count = 0\n left = j + word_len\n\n return res\n```\n時間複雜度:O(N × W) (N is length of s, W is length of words)\n\n空間複雜度:O(W)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166506559","body":"思維:使用快慢指標 (two pointers) 技巧,設兩個指標 slow 和 fast 同時指向鏈表頭,每次 slow 走一步、fast 走兩步,當 fast 到達鏈表尾時,slow 正好在中間節點。\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n\n return slow \n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172494360","body":"思維:使用雙指針來實行二分搜尋法,設定左右邊界取中間位置\n1. 如果 nums[mid] == target,直接回傳 mid(找到目標)。\n2. 如果 nums[mid] > target,代表目標在左半邊,更新 right = mid - 1。\n3. 如果 nums[mid] < target,代表目標在右半邊,更新 left = mid + 1。\n4. 迴圈結束後(left > right),left 就是目標應插入的位置。\n\n代碼:\n```python\nclass Solution:\n def searchInsert(self, nums: List[int], target: int) -> int:\n left = 0\n right = len(nums)-1\n while left <= right:\n mid = (left+right)//2\n if nums[mid] == target:\n return mid\n elif nums[mid] > target:\n right = mid-1\n else:\n left = mid+1\n return left\n```\n時間複雜度:O(logN)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173687770","body":"思維:使用單調遞減隊列來維護視窗內最大值的 index\n1. 前 k 個元素先初始化隊列:維持隊列的遞減性,每次新來的元素會移除尾部比它小的元素,q[0] 永遠是最大值的 index\n2. 接下來從 k 到結尾,維持單調性並移除過期元素:新元素進來時維持單調隊列,移除滑出視窗的 index,每次把 nums[q[0]](視窗最大值)加入結果\n\n代碼:\n```python\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n res = []\n q = deque()\n for i in range(k):\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n res.append(nums[q[0]])\n\n for i in range(k, len(nums)):\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n while q[0] <= i-k:\n q.popleft()\n res.append(nums[q[0]])\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178842909","body":"思維:\n1. 使用兩個表分別紀錄信任他人及被信任的計數\n2. 之後尋找一個人 x,滿足:trusted_tables[x] == n - 1(被其他人信任)以及 trust_tables[x] == 0:(自己沒信任任何人)\n3. 若找到這樣的人,回傳他的編號;否則回傳 -1\n\n代碼:\n```python\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n if n == 1:\n return 1\n\n trust_tables = defaultdict(int)\n trusted_tables = defaultdict(int)\n for [trust_a, trust_b] in trust:\n trust_tables[trust_a] += 1\n trusted_tables[trust_b] += 1\n\n for trusted_person, trusted_ticket in trusted_tables.items():\n if trusted_ticket == n-1 and trust_tables[trusted_person] == 0:\n return trusted_person\n return -1\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3188960333","body":"思維:\n1. 把沒群組的 item 分配新的唯一群組:這樣後面只需處理群組 id,不用特別分支處理 -1。\n2. 建立 item graph:由 prev -> curr(prev 必須在 curr 前面)。\n3. 建立 group graph:當 prev 與 curr 屬不同群組時,建立 g_prev -> g_curr 的依賴邊;用 set 避免重複邊。\n4. 對 group graph 做拓撲排序:得出 group 的一個合法順序;若有 cycle,無解回 []。\n5. 對 item graph 做拓撲排序:得出 items 在全域上的合法相對順序(若有 cycle,無解回 [])。\n6. 把 items 按 item_order 分桶到對應 group,再按 group_order 串接:同 group items 會連在一起且保持 item 之間的依賴。\n\n代碼:\n```python\nclass Solution:\n def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:\n new_group_id = m\n for i in range(n):\n if group[i] == -1:\n group[i] = new_group_id\n new_group_id += 1\n total_groups = new_group_id\n\n item_adj = [[] for _ in range(n)]\n item_indeg = [0] * n\n\n group_adj = [[] for _ in range(total_groups)]\n group_indeg = [0] * total_groups\n\n added_group_edges = set()\n\n for curr in range(n):\n for prev in beforeItems[curr]:\n item_adj[prev].append(curr)\n item_indeg[curr] += 1\n\n g_prev = group[prev]\n g_curr = group[curr]\n if g_prev != g_curr:\n if (g_prev, g_curr) not in added_group_edges:\n added_group_edges.add((g_prev, g_curr))\n group_adj[g_prev].append(g_curr)\n group_indeg[g_curr] += 1\n\n def topo_sort(num_nodes, adj, indeg):\n q = deque([i for i in range(num_nodes) if indeg[i] == 0])\n order = []\n while q:\n u = q.popleft()\n order.append(u)\n for v in adj[u]:\n indeg[v] -= 1\n if indeg[v] == 0:\n q.append(v)\n if len(order) == num_nodes:\n return order\n else:\n return []\n\n group_order = topo_sort(total_groups, group_adj, group_indeg[:])\n if not group_order:\n return []\n\n item_order = topo_sort(n, item_adj, item_indeg[:])\n if not item_order:\n return []\n\n items_by_group = defaultdict(list)\n for item in item_order:\n items_by_group[group[item]].append(item)\n\n result = []\n for g in group_order:\n result.extend(items_by_group[g])\n\n return result\n```\n時間複雜度:O(n + E)\n\n空間複雜度:O(n + m + E)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3191064414","body":"思維:依照題意模擬路徑\n\n代碼:\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n spot = [0, 0]\n for move in moves:\n if move == 'R':\n spot[0] += 1\n elif move == 'L':\n spot[0] -= 1\n elif move == 'U':\n spot[1] += 1\n else:\n spot[1] -= 1\n \n return spot == [0, 0]\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194164140","body":"思維:\n1. 解析登入、登出時間(時、分),如果登出時間早於登入時間,代表跨過午夜就加 24 小時。\n2. 重新計算登入時間:向上取整到最近的 15 分鐘倍數(因為要等到下一個完整的 15 分鐘才算開始一局)。\n3. 重新計算登出時間:向下取整到最近的 15 分鐘倍數(因為超過的部分不算完整一局)。\n4. 計算完整局數,如果結果為負數則返回 0。\n\n這裡用 (logout_hour-login_hour)*4 - login_minute/15 + logout_minute/15 直接換算成以「15 分鐘為單位」的差距。\n\n代碼:\n```python\nclass Solution:\n def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:\n login_hour, login_minute = map(int, loginTime.split(':'))\n logout_hour, logout_minute = map(int, logoutTime.split(':'))\n if logout_hour < login_hour or logout_hour == login_hour and logout_minute < login_minute:\n logout_hour += 24\n\n login_hour, login_minute = self.narrow_down_time(login_hour, login_minute, True)\n logout_hour, logout_minute = self.narrow_down_time(logout_hour, logout_minute, False)\n\n return max(0, int((logout_hour-login_hour)*4 - login_minute/15 + logout_minute/15))\n\n def narrow_down_time(self, login_hour: int, login_minute: int, is_login: bool):\n if is_login:\n login_minute = ceil(login_minute/15) * 15\n if login_minute == 60:\n login_hour += 1\n login_minute = 0\n else:\n login_minute = floor(login_minute/15) * 15\n\n return login_hour, login_minute\n```\n時間複雜度:O(1)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3196258303","body":"思維:\n1. 函式 compare_less(a_counter, b_counter):模擬條件 1、2,對所有可能分界點 ch(從 'b' 到 'z')進行遍歷
\n讓 a 的所有字母 < ch,讓 b 的所有字母 ≥ ch,使用 prefix sum 避免重複運算,計算出最少需要修改的字元數\n2. 函式 compare_distinct(a_counter, b_counter):模擬條件 3,讓兩字串變成同一種字母
\n對所有字母出現次數總和 Counter 做合併,找出現次數最多的字母後,將其餘字母通通改成這個字母,修改次數 = 總數量 - 該字母出現次數\n3. 分別計算三個條件需要的修改次數,回傳三者中的最小值\n\n代碼:\n```python\nclass Solution:\n def minCharacters(self, a: str, b: str) -> int:\n a_counter = Counter(ord(ch) for ch in a)\n b_counter = Counter(ord(ch) for ch in b)\n\n goal_a = self.compare_less(a_counter, b_counter)\n goal_b = self.compare_less(b_counter, a_counter)\n goal_c = self.compare_distinct(a_counter, b_counter)\n return min(goal_a, goal_b, goal_c)\n\n def compare_less(self, a_counter, b_counter):\n a_freq = [0] * 26\n b_freq = [0] * 26\n for k, v in a_counter.items():\n a_freq[k - ord('a')] = v\n for k, v in b_counter.items():\n b_freq[k - ord('a')] = v\n\n a_prefix = list(itertools.accumulate(a_freq))\n b_prefix = list(itertools.accumulate(b_freq))\n move = float('inf')\n for ch in range(1, 26):\n move_a = a_prefix[25] - a_prefix[ch-1]\n move_b = b_prefix[ch-1]\n move = min(move, move_a + move_b)\n return move\n\n def compare_distinct(self, a_counter, b_counter):\n all_counter = a_counter + b_counter\n most_key = max(all_counter, key=all_counter.get)\n total = sum(all_counter.values())\n return total - all_counter[most_key]\n```\n時間複雜度:O(n+m)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3201266614","body":"思維:先把所有數字用 heappush 丟進最小堆,維護「父節點 ≤ 子節點」,接著每次 heappop 拿走堆頂(最小值),直到堆空,收集出來的數列 res 就是升序排序。\n\n代碼:\n```python\nclass Solution:\n def sortArray(self, nums: List[int]) -> List[int]:\n min_heap = []\n res = []\n for num in nums:\n self.heappush(min_heap, num)\n\n while min_heap:\n res.append(self.heappop(min_heap))\n\n return res\n \n def heappush(self, h, x):\n h.append(x)\n i = len(h)-1\n\n while i > 0:\n p = (i - 1) // 2\n if h[i] < h[p]:\n h[i], h[p] = h[p], h[i]\n i = p\n else:\n break\n\n def heappop(self, h):\n last = h.pop()\n if not h:\n return last\n root = h[0]\n h[0] = last\n i = 0\n n = len(h)\n while True:\n left = 2*i + 1\n right = 2*i + 2\n if left >= n:\n break\n\n child = left\n if right < n and h[right] < h[left]:\n child = right\n if h[child] < h[i]:\n h[i], h[child] = h[child], h[i]\n i = child\n else:\n break\n return root\n```\n時間複雜度:O(n log n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204542831","body":"思維:使用二分搜尋法,對於 x ≥ 2 的情況,設定搜尋範圍為 [1, x // 2],如果 mid^2 太大,就向左縮小範圍,如果太小,就向右移動範圍,當搜尋結束(left > right)時,right 就是最接近但不超過 √x 的整數\n\n代碼:\n```python\nclass Solution:\n def mySqrt(self, x: int) -> int:\n if x < 2:\n return x\n \n left, right = 1, x // 2\n while left <= right:\n mid = (left + right) // 2\n if mid * mid == x:\n return mid\n elif mid * mid > x:\n right = mid - 1\n else:\n left = mid + 1\n\n return right\n```\n時間複雜度:O(log x)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3211104911","body":"思維:使用二分搜尋法,如果 mid 是壞的:可能是答案,但還要往左找,right = mid - 1,如果 mid 是好的:答案一定在右邊,left = mid + 1,最後 left 會停在第一個壞版本的位置。\n\n代碼:\n```python\nclass Solution:\n def firstBadVersion(self, n: int) -> int:\n left, right = 1, n\n while left <= right:\n mid = (left + right) // 2\n if isBadVersion(mid):\n right = mid - 1\n else:\n left = mid + 1\n return left\n```\n時間複雜度:O(log n)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216087383","body":"思維:\n1. 先對加熱器位置排序,才能用二分搜尋快速找到每個房子最近的加熱器\n2. 遍歷每個房子,使用二分搜尋找到第一個 heaters[mid] 大於等於當前 house 的位置(也就是最接近右邊的加熱器)\n3. 再往回看一個位置 heaters[r],也就是最接近左邊的加熱器\n4. 比較左右加熱器距離,選擇較小者\n5. 更新最大加熱半徑(最小距離中的最大值)\n\n代碼:\n```python\nclass Solution:\n def findRadius(self, houses: List[int], heaters: List[int]) -> int:\n res = 0\n heaters.sort()\n \n for house in houses:\n l, r = 0, len(heaters) - 1\n while l <= r:\n mid = (l + r) // 2\n if house <= heaters[mid]:\n r = mid - 1\n else:\n l = mid + 1\n\n l_res, r_res = inf, inf\n if 0 <= l <= len(heaters)-1:\n l_res = abs(heaters[l] - house)\n if 0 <= r <= len(heaters)-1:\n r_res = abs(heaters[r] - house)\n\n res = max(res, min(l_res, r_res))\n\n return res\n```\n時間複雜度:O(M log M + N log M) (M for length of heaters, N for length of houses)\n\n空間複雜度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3223499698","body":"思維:先初始化前 k 個字元中有多少母音,用滑動視窗維持長度為 k 的區間往右滑動,每次移動一格,視窗左邊出去一個字元、右邊進來一個字元,如果左邊移出的是母音即減 1,如果右邊移入的是母音即加 1,並且更新最大值,直到滑到最後一格為止\n\n代碼:\n```python\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n vowels = set('aeiou')\n count = sum(1 for c in s[:k] if c in vowels)\n max_count = count\n\n for i in range(k, len(s)):\n if s[i-k] in vowels:\n count -= 1\n if s[i] in vowels:\n count += 1\n max_count = max(max_count, count)\n\n return max_count\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3227824002","body":"思維:\n1. 邊界判斷:若 k == 0,不會抽牌,分數永遠是 0,且一定 ≤ n,直接回傳 1.0。若 n ≥ k + maxPts - 1,最多只能拿到 k - 1 + maxPts 分,而這些都 ≤ n,直接回傳 1.0\n2. 初始化:建立一個長度 n + 1 的 dp 陣列,dp[i] 表示拿到 i 分的機率,設定 dp[0] = 1.0(初始在 0 分),window_sum = 1.0 表示 dp[0] 的值,res = 0.0,用來累加最終結果(分數 ≥ k 的機率)\n3. 進入迴圈,從 i = 1 到 n:使用滑動視窗平均法計算 dp[i] = window_sum / maxPts,如果 i < k 代表還會繼續抽牌 → 將 dp[i] 加入 window_sum,影響後續機率,如果 i ≥ k,代表不能再抽牌了 → 將 dp[i] 加入 res,因為這是可能的最終分數\n4. 維護滑動視窗:若 i - maxPts ≥ 0,將前方的 dp[i - maxPts] 從 window_sum 中扣除,保持視窗大小為 maxPts\n5. 迴圈結束後,回傳累積的結果:回傳 res,即所有停在 k 到 n 分的總機率\n\n代碼:\n```python\nclass Solution:\n def new21Game(self, n: int, k: int, maxPts: int) -> float:\n if k == 0 or n >= k + maxPts - 1:\n return 1\n \n dp = [0.0] * (n + 1)\n dp[0] = 1.0\n window_sum = 1.0\n res = 0.0\n\n for i in range(1, n + 1):\n dp[i] = window_sum / maxPts\n if i < k:\n window_sum += dp[i]\n else:\n res += dp[i]\n\n if i - maxPts >= 0:\n window_sum -= dp[i-maxPts]\n\n return res\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3232431244","body":"思維:透過固定長度為 len(p) 的滑動視窗掃過整個字串 s,用 Counter 統計當前視窗的字元分佈\n1. 初始化兩個 Counter:target 記錄 p 的字元分佈,cur 動態維護視窗內的字元分佈\n2. 向右移動右指標 r 更新 cur,每次移動後如果 cur == target,代表此視窗是一個 anagram,res 加入 l\n3. 視窗長度若達到 len(p),就縮左邊,如果左邊的字元也在 p 中,從 cur 中減一,移動左指標 l,確保視窗長度維持為 len(p)\n\n代碼:\n```python\nclass Solution:\n def findAnagrams(self, s: str, p: str) -> List[int]:\n res = []\n target = Counter(p)\n cur = Counter()\n l, r = 0, 0\n\n while r < len(s):\n if s[r] in p:\n cur[s[r]] += 1\n \n if cur == target:\n res.append(l)\n\n r += 1\n if r - l >= len(p):\n if s[l] in p:\n cur[s[l]] -= 1\n l += 1\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235535873","body":"思維:\n1. 使用 target 記錄 t 中每個字元需要出現幾次,required 為需要達成的字元種類數,formed 表示目前有多少種字元達到目標需求\n2. 用滑動視窗 [l, r] 掃過 s\n3. 視窗內使用 cur 統計目前出現的字元次數\n4. 每當 formed == required(即目前視窗內已滿足所有字元需求),就嘗試更新最短子字串\n5. 然後移動左指標 l,直到不再滿足條件,再往右擴張 r\n\n代碼:\n```python\nclass Solution:\n def minWindow(self, s: str, t: str) -> str:\n if not s or not t or len(t) > len(s):\n return ''\n\n res = ''\n target = Counter(t)\n cur = Counter()\n required = len(target)\n formed = 0\n l = 0\n\n for r in range(len(s)):\n char = s[r]\n if char in target:\n cur[char] += 1\n if cur[char] == target[char]:\n formed += 1\n\n while formed == required:\n window = s[l:r+1]\n if not res or len(window) < len(res):\n res = window\n\n if s[l] in target:\n cur[s[l]] -= 1\n if cur[s[l]] < target[s[l]]:\n formed -= 1\n l += 1\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3241211135","body":"思維:\n1. 每一層遞迴代表一個 row(橫列),每一層嘗試在該 row 的每一個 col(直行)上放一個 Q\n2. 使用三個集合記錄不能放的位置(剪枝):used_cols:欄位不能重複、used_diag1:↘ 對角線(row - col)不能重複、used_diag2:↙ 對角線(row + col)不能重複\n3. 如果當前格子合法:將當前 col 與對角線加入對應集合,進入下一 row 繼續放皇后\n4. 如果成功放到第 n 行,代表一種合法放法,count += 1\n5. 每個回合結束後回溯:移除當前狀態,嘗試下一個 col\n\n代碼:\n```python\nclass Solution:\n def totalNQueens(self, n: int) -> int:\n count = 0\n\n def backtracking(row, used_cols, used_diag1, used_diag2):\n if row == n:\n nonlocal count \n count += 1\n return\n\n for col in range(n):\n if col in used_cols or row - col in used_diag1 or row + col in used_diag2:\n continue\n \n used_cols.add(col)\n used_diag1.add(row - col)\n used_diag2.add(row + col)\n\n backtracking(row + 1, used_cols, used_diag1, used_diag2)\n\n used_cols.remove(col)\n used_diag1.remove(row - col)\n used_diag2.remove(row + col)\n\n backtracking(0, set(), set(), set())\n\n return count\n```\n時間複雜度:O(n!)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3244207256","body":"思維:深度優先搜尋(DFS)\n1. 初始化變數: seen 避免重複拜訪相同格子、max_area記錄最大島嶼面積\n2. 走過整張地圖: 雙層 for loop,遍歷每一格 (i, j)\n3. 找到新的島嶼起點就 DFS: 如果是還沒拜訪過的陸地,就從這裡開始 DFS,算面積,回傳面積後更新 max_area\n4. DFS 拜訪所有相連陸地: 每次進來的 (row, col) 都會標記為已拜訪,area = 1 表示這一格自己先算進面積\n5. 遞迴搜尋上下左右的相連格子: 檢查鄰近 4 格是否可以繼續走,遞迴地累加 area\n6. DFS 結束後回傳這座島的面積\n\n代碼:\n```python\nclass Solution:\n direction = [(1, 0), (-1, 0), (0, 1), (0, -1)]\n\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n seen = set()\n max_area = 0\n for i in range(len(grid)):\n for j in range(len(grid[0])):\n if grid[i][j] == 1 and (i, j) not in seen:\n area = self.dfs(i, j, seen, grid)\n max_area = max(max_area, area)\n \n return max_area\n\n def dfs(self, row, col, seen, grid):\n seen.add((row, col))\n area = 1\n for dx, dy in self.direction:\n x, y = row + dx, col + dy\n if 0 <= x < len(grid) and 0 <= y < len(grid[0]) and grid[x][y] == 1 and (x, y) not in seen:\n area += self.dfs(x, y, seen, grid)\n \n return area\n```\n時間複雜度:O(m × n)\n\n空間複雜度:O(m × n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249687017","body":"思維:多源 BFS\n1. 把所有的陸地格(值為 1)當作起點,加入 queue 中\n2. 先判斷若陸地為空(全是水)或全是陸地,回傳 -1\n3. BFS 擴展每一層水格:每次從 queue 拿一個格子出來,對四個方向進行探索,如果是水(值為 0),就更新它為「距離 = 前一格 + 1」,並將它加入 queue,等下繼續擴展\n4. 最後回傳最大距離 -1:因為初始的陸地值是 1,所以水格的距離是從 2 開始計算,因此真正的距離 = 格子值 - 1\n\n代碼:\n```python\nclass Solution:\n def maxDistance(self, grid: List[List[int]]) -> int:\n q = deque()\n for i in range(len(grid)):\n for j in range(len(grid[0])):\n if grid[i][j] == 1:\n q.append((i, j))\n \n if not q or len(q) == len(grid) * len(grid):\n return -1\n\n directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]\n max_dist = 0\n while q:\n x, y = q.popleft()\n for dx, dy in directions:\n nx = x + dx\n ny = y + dy\n if 0 <= nx < len(grid) and 0 <= ny < len(grid[0]) and grid[nx][ny] == 0:\n grid[nx][ny] = grid[x][y] + 1\n q.append((nx, ny))\n max_dist = max(max_dist, grid[nx][ny])\n\n return max_dist - 1\n```\n時間複雜度:O(n^2)\n\n空間複雜度:O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251575584","body":"思維:\n1. 把初始擁有箱子(initialBoxes)能打開的箱子(status = 1)加入 queue\n2. 使用 queue 處理可以打開的箱子,如果已經處理過的話則跳過\n3. 開箱拿糖果後,處理新拿到的箱子鑰匙,把鑰匙對應到已擁有且未開啟過的 box 加入 queue\n4. 處理新拿到的箱子,如果箱子可以直接打開或擁有鑰匙就加進 queue,否則放進 own_boxes 等待日後有拿到 key 再打開\n5. 整個流程直到 queue 為空,表示目前已經沒能力再開更多箱子了,回傳總糖果數量\n\n代碼:\n```python\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n own_boxes = set(initialBoxes)\n own_keys = set()\n visited = set()\n q = deque()\n total_candies = 0\n\n for box in initialBoxes:\n if status[box] == 1:\n q.append(box)\n \n while q:\n box = q.popleft()\n if box in visited:\n continue\n\n total_candies += candies[box]\n visited.add(box)\n \n for key in keys[box]:\n own_keys.add(key)\n if key in own_boxes and key not in visited:\n q.append(key)\n\n for new_box in containedBoxes[box]:\n own_boxes.add(new_box)\n if (status[new_box] == 1 or new_box in own_keys) and new_box not in visited:\n q.append(new_box) \n\n return total_candies\n```\n時間複雜度:O(n+k)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3256863525","body":"思維:\n1. 廣度優先搜尋 (BFS) 遍歷樹,使用 deque 從 root 開始,記錄每個節點的座標\n2. 收集節點資訊,每個節點存成 (x, y, val),加入 nodes 列表\n3. 排序節點,按照題目規則排序:y(由左到右),x(由上到下),val(同位置時數字小的先)\n4. 按列分組,掃描排序後的 nodes,根據 y 值變化劃分列表\n5. 回傳結果,res 即 vertical order traversal 的輸出。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:\n nodes = []\n q = deque([(root, 0, 0)])\n while q:\n node, x, y = q.popleft()\n nodes.append((x, y, node.val))\n if node.left:\n q.append((node.left, x+1, y-1))\n if node.right:\n q.append((node.right, x+1, y+1))\n\n nodes.sort(key=lambda x: (x[1], x[0], x[2]))\n res = []\n cur_y = None\n for _, y, val in nodes:\n if y != cur_y:\n res.append([val])\n cur_y = y\n else:\n res[-1].append(val)\n\n return res\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260998230","body":"思維:\n1. 定義狀態 dp[i] 表示「到達第 i 階的最小花費」\n2. 每次要到達第 i 階,有兩種方式:從第 i-1 階踩一階上來 → 花費 = dp[i-1] + cost[i-1] or 從第 i-2 階踩兩階上來 → 花費 = dp[i-2] + cost[i-2]\n3. 所以取較小值 dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n4. 我們要到達頂樓 = len(cost),因此答案是 dp[-1](即 dp[len(cost)])\n\n代碼:\n```python3\nclass Solution:\n def minCostClimbingStairs(self, cost: List[int]) -> int:\n dp = [0] * (len(cost) + 1)\n for i in range(2, len(cost) + 1):\n dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n\n return dp[-1]\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263817074","body":"思維:\n1. 如果只有一間房子,直接回傳 nums[0]\n2. 初始化 dp 陣列,建立一個長度與 nums 相同的陣列 dp,dp[i] 表示考慮到第 i 間房子時,選擇偷這間房子,能得到的最大金額\n3. 填入前兩個房子:如果 i < 2,直接偷這間房子\n4. 狀態轉移(從 i=2 開始),偷第 i 間房的前提是不能偷相鄰的,所以考慮搭配 i-2 或搭配 i-3 的最佳解\n5. 最後答案一定是偷到倒數第 1 間(dp[-1])或倒數第 2 間(dp[-2]),取最大值\n\n代碼:\n```python\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n if len(nums) == 1:\n return nums[0]\n\n dp = [0] * len(nums)\n for i, num in enumerate(nums):\n if i < 2:\n dp[i] = num\n else:\n dp[i] = max(dp[i-2] + num, dp[i-3] + num)\n\n return max(dp[-1], dp[-2])\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3264481892","body":"思維:\n1. dp[i]: 表示以 nums[i] 結尾的 LIS 最長長度、count[i]: 表示有多少組 LIS 長度等於 dp[i] 是以 nums[i] 結尾的\n2. 對每個 i,檢查它前面的每個 j,如果 nums[j] < nums[i],則可以將 nums[i] 接在 nums[j] 後面\n3. 如果接在 j 後面可以讓序列更長(dp[j] + 1 > dp[i]),則更新 dp[i] = dp[j] + 1,並且把組數設為 count[i] = count[j]\n4. 如果接在 j 後面剛好等長(dp[j] + 1 == dp[i]),則表示找到另一條一樣長的走法,所以把組數加進來 count[i] += count[j]\n5. 最後找出所有 dp[i] == max_len 的位置,把它們對應的 count[i] 加總起來\n\n代碼:\n```python\nclass Solution:\n def findNumberOfLIS(self, nums: List[int]) -> int:\n n = len(nums)\n dp = [1] * n\n count = [1] * n\n\n for i in range(n):\n for j in range(i):\n if nums[j] < nums[i]:\n if dp[j] + 1 > dp[i]:\n dp[i] = dp[j] + 1\n count[i] = count[j]\n elif dp[j] + 1 == dp[i]:\n count[i] += count[j]\n\n max_len = max(dp)\n return sum(c for i, c in enumerate(count) if dp[i] == max_len)\n```\n時間複雜度:O(n^2)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269134596","body":"思維:\n1. 設 dp[i][j] = text1[:i] 與 text2[:j] 的最長共同子序列長度\n2. 如果其中一個字串長度為 0 → LCS = 0,所以 dp[0][*] 和 dp[*][0] 全部設為 0\n3. 如果 text1[i-1] == text2[j-1],這個字元可以加入 LCS → dp[i][j] = dp[i-1][j-1] + 1\n4. 否則這個字元不能同時出現在 LCS,只能丟掉其中一個字元,取兩種情況最大值 → dp[i][j] = max(dp[i-1][j], dp[i][j-1])\n5. 回傳 dp[-1][-1](表格右下角)就是最終答案\n\n代碼:\n```python\nclass Solution:\n def longestCommonSubsequence(self, text1: str, text2: str) -> int:\n m = len(text1)\n n = len(text2)\n dp = [[0]*(n+1) for _ in range(m+1)]\n \n for i in range(1, m+1):\n for j in range(1, n+1):\n if text1[i-1] == text2[j-1]:\n dp[i][j] = dp[i-1][j-1] + 1\n else:\n dp[i][j] = max(dp[i-1][j], dp[i][j-1])\n\n return dp[-1][-1]\n```\n時間複雜度:O(m * n)\n\n空間複雜度:O(m * n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273520377","body":"思維:\n1. 機器人從左上角走到右下角,只能往下或往右,所以每個格子的路徑數 = 從上方來的路徑數 + 從左方來的路徑數\n2. 狀態定義:dp[i][j] = 從起點 (0,0) 到 (i,j) 的路徑數\n3. 初始化所有路徑都是 1,主要是第一行、第一列只能直走一條路徑因此都是 1\n4. dp[i][j] 的路徑數就等於 dp[i−1][j] (從上方來的路徑數) + dp[i][j−1] (從左方來的路徑數)\n5. 最後答案取右下角 dp[m-1][n-1]\n\n代碼:\n```python\nclass Solution:\n def uniquePaths(self, m: int, n: int) -> int:\n dp = [[1] * n for _ in range(m)]\n for i in range(1, m):\n for j in range(1, n):\n dp[i][j] = dp[i-1][j] + dp[i][j-1]\n \n return dp[m-1][n-1]\n```\n時間複雜度:O(m * n)\n\n空間複雜度:O(m * n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3278614246","body":"思維:\n1. 狀態定義:dp[r][c] = 騎士在走了 t 步之後,位於 (r,c) 的機率\n2. 初始化:t=0 時,起點 (row, column) 的機率 = 1.0,其他位置 = 0.0\n3. 狀態轉移:從 (r,c) 出發,分散到 8 個可能位置。每一個合法位置的機率 += dp[r][c] / 8\n4. 重複 k 次:每一步產生新的棋盤機率分佈,並用新的棋盤機率更新 dp 陣列\n5. 回傳答案:把整個棋盤上機率加總,就是騎士還在棋盤上的總機率\n\n代碼:\n```python\nclass Solution:\n def knightProbability(self, n: int, k: int, row: int, column: int) -> float:\n dp = [[0.0] * n for _ in range(n)]\n dp[row][column] = 1.0\n positions = [(-1, 2), (-1, -2), (-2, 1), (-2, -1), (1, 2), (1, -2), (2, 1), (2, -1)]\n\n for i in range(k):\n next_dp = [[0.0] * n for _ in range(n)]\n for r in range(n):\n for c in range(n):\n if dp[r][c] > 0:\n for dr, dc in positions:\n nr, nc = r + dr, c + dc\n if 0 <= nr < n and 0 <= nc < n:\n next_dp[nr][nc] += dp[r][c] / 8.0\n dp = next_dp \n\n return sum(sum(row) for row in dp)\n```\n時間複雜度:O(k * n^2)\n\n空間複雜度:O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3285759121","body":"思維:\n1. 如果 1+2+…+max < desiredTotal → 永遠湊不到目標 → return False\n2. 如果 desiredTotal ≤ maxChoosableInteger → 先手一次就贏 → return True\n3. 用 bitmask mask 記錄哪些數字已被選過,用 remain 記錄距離目標還差多少\n4. 遞迴判斷 (dfs) 嘗試每一個未被選過的數字 num\n5. 如果 num ≥ remain → 我馬上贏 → return True,否則進入新狀態 (new_mask, remain-num),讓對手繼續\n6. 如果對手在新狀態輸(dfs 回 False)→ 我必勝 → return True\n7. 如果沒有任何選擇能讓我贏 → return False\n\n代碼:\n```python\nclass Solution:\n def canIWin(self, maxChoosableInteger: int, desiredTotal: int) -> bool: \n total_sum = (1 + maxChoosableInteger) * maxChoosableInteger / 2\n if total_sum < desiredTotal:\n return False\n if desiredTotal <= maxChoosableInteger:\n return True\n \n @lru_cache(None)\n def dfs(mask, remain):\n for num in range(1, maxChoosableInteger + 1):\n if not mask & (1 << (num-1)):\n if num >= remain:\n return True\n new_mask = mask | (1 << (num-1))\n if not dfs(new_mask, remain - num):\n return True\n return False\n\n return dfs(0, desiredTotal)\n```\n時間複雜度:O(m * 2^m)\n\n空間複雜度:O(2^m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3287665138","body":"思維:\n1. 如果 nums 的總和是奇數,不可能分成兩組相等 → return False\n2. 否則,目標和 = 總和 / 2\n3. 狀態定義:dp[i][j] = 是否可以用前 i 個數字湊出和 j\n4. 初始化:dp[0][0] = True(不用任何數字就能湊出 0),dp[0][j>0] = False(不用數字不可能湊出正數)\n5. 若 j < nums[i-1] → 這個數太大,不能用因此只能 → dp[i][j] = dp[i-1][j]\n6. 若 j ≥ nums[i-1] → 可以選用或不用這個數 → dp[i][j] = dp[i-1][j] or dp[i-1][j - nums[i-1]]\n7. 最後看 dp[n][target],如果 True → 代表能找到一個子集和 = target → 表示 nums 可分成兩組\n\n代碼:\n```python\nclass Solution:\n def canPartition(self, : List[int]) -> bool:\n if sum(nums) % 2 > 0:\n return False\n target = sum(nums) // 2\n\n dp = [[False] * (target + 1) for _ in range(len(nums) + 1)]\n dp[0][0] = True\n for i in range(1, len(nums) + 1):\n for j in range(target + 1):\n if j < nums[i-1]:\n dp[i][j] = dp[i-1][j]\n else:\n dp[i][j] = dp[i-1][j] or dp[i-1][j-nums[i-1]]\n\n return dp[len(nums)][target]\n```\n時間複雜度:O(n * m) (n for length of nums, m for target)\n\n空間複雜度:O(n * m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289413390","body":"思維:\n1. 要找能不能在 nums 前加上 + 或 -,最後湊成 target,等價於找一個子集,使總和 = (sum(nums)+target)/2 = p\n2. 如果 abs(target) > sum → 超過總和,必然無解,如果 sum + target 是奇數 → p 不是整數,也必然無解\n3. 狀態定義:dp[j] = 方法數,表示能湊出和為 j 的子集數量\n4. 初始化:dp[0] = 1 → 空集合能湊出 0 的方法只有 1 種\n5. 狀態轉移:遍歷每個數字 num,倒序更新,如果能湊出 j-num,再加上 num 就能湊出 j\n6. 答案回傳 dp[p],也就是湊出和為 p 的方法數\n\n代碼:\n```python\nclass Solution:\n def findTargetSumWays(self, nums: List[int], target: int) -> int:\n if abs(target) > sum(nums) or (sum(nums) + target) % 2 > 0:\n return 0\n\n p = (sum(nums) + target) // 2\n dp = [0] * (p + 1)\n dp[0] = 1\n for i in range(len(nums)):\n for j in range(p, nums[i]-1, -1):\n dp[j] += dp[j-nums[i]]\n\n return dp[p]\n``` \n時間複雜度:O(n * p) \n\n空間複雜度:O(p)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290383887","body":"思維:\n1. 初始化建立 dp 陣列,長度為 amount+1,全部設成無窮大 inf,代表一開始不可達\n2. 設 dp[0] = 0,表示湊 0 元不需要硬幣\n3. 外層金額 i 從 1 跑到 amount,內層對每個硬幣 coin 嘗試\n4. 如果 i - coin >= 0,表示可用這枚硬幣,更新 dp[i] = min(dp[i], dp[i - coin] + 1) (選湊出 i 元的最少硬幣數,看最後一枚硬幣選哪個面額)\n5. 回傳答案如果 dp[amount] 還是 inf,代表不可達回傳 -1,否則回傳 dp[amount]\n\n代碼:\n```python\nclass Solution:\n def coinChange(self, coins: List[int], amount: int) -> int:\n dp = [inf] * (amount + 1)\n dp[0] = 0\n for i in range(1, amount+1):\n for coin in coins:\n if i - coin >= 0:\n dp[i] = min(dp[i], dp[i - coin]+1)\n \n return dp[amount] if dp[amount] != inf else -1\n```\n時間複雜度:O(m × n) (m for amount, n for length of coins)\n\n空間複雜度:O(m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3299125872","body":"思維:\n1. 昨天的題目需考慮排列數(考慮順序),今天的題目僅需考慮組合數(不考慮順序)\n2. 定義 dp[i] = 湊出金額 i 的 組合數\n3. dp[0] = 1:湊出 0 元只有一種方式,什麼都不拿,其餘 dp[i] = 0,表示一開始還沒有任何組合\n4. 外層迴圈:逐一考慮硬幣 coin,內層迴圈:從金額 coin 開始到 amount 逐步更新\n5. dp[i] += dp[i - coin]:若要湊出金額 i,可以先用一個 coin,剩下的 i - coin 由之前的組合補上\n6. 避免重複排列,因為外層是硬幣,每一種硬幣只能在自己之後加入,確保順序不會被重複計算\n7. 回傳答案 dp[amount] 即為湊出總金額的組合數\n\n代碼:\n```python\nclass Solution:\n def change(self, amount: int, coins: List[int]) -> int:\n dp = [0] * (amount + 1)\n dp[0] = 1\n for coin in coins:\n for i in range(coin, amount+1):\n dp[i] += dp[i - coin]\n\n return dp[amount]\n```\n時間複雜度:O(m × n) (m for amount, n for length of coins)\n\n空間複雜度:O(m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3301195823","body":"思維:\n1. 排序貪心:把 g(貪心值)與 s(餅乾大小)都排序\n2. 從大的開始配對:i 指向最大餅乾,j 指向最難滿足的小孩\n3. 若 s[i] >= g[j],就把這片大餅乾給這個小孩,否則,去嘗試滿足下一個(較不貪心)孩子\n5. 結束條件:任一方用完即停止,輸出成功配對數 res\n\n代碼:\n```python\nclass Solution:\n def findContentChildren(self, g: List[int], s: List[int]) -> int:\n g.sort()\n s.sort()\n i = len(s)-1\n j = len(g)-1\n res = 0\n \n while i >= 0 and j >= 0:\n if s[i] >= g[j]:\n res += 1\n i -= 1\n j -= 1\n\n return res\n```\n時間複雜度:O(nlogn+mlogm) (sorting)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3305048523","body":"思維:\n1. 先依 start 排序,若 start 相同則依 end 排序\n2. 用 prev_end 記錄上一次保留的區間結束\n3. 遍歷:如果當前區間 cur_start < prev_end → 代表重疊\n4. 若 cur_end < prev_end → 保留更早結束的區間(更新 prev_end)\n5. 不管怎樣,重疊就要刪掉一個,res += 1\n6. 否則(不重疊) → 更新 prev_end = cur_end\n7. 回傳刪除數量\n\n代碼:\n```python\nclass Solution:\n def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:\n intervals = sorted(intervals)\n prev_end = intervals[0][1]\n res = 0\n\n for i in range(1, len(intervals)):\n cur_start, cur_end = intervals[i]\n if cur_start < prev_end:\n if cur_end < prev_end:\n prev_end = cur_end\n res += 1\n else:\n prev_end = cur_end\n \n return res\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3310296356","body":"思維:\n1. 初始化設定 farthest = 0,代表目前能到達的最遠位置(初始只能到 index 0)\n2. 遍歷陣列依序檢查每個位置檢查是否可達:i = 當前所在索引,step = 在這個位置能往前跳的最大步數\n3. 如果 i > farthest,表示這個位置已經超過了之前能到的最遠範圍 → 代表根本走不到這裡 → 直接回傳 False\n4. 否則更新最遠範圍 farthest = max(farthest, i + step)\n5. 結束迴圈能完整跑完,代表沒有遇到無法到達的位置,直接回傳 True(一定能到達最後一格)\n\n代碼:\n```python\nclass Solution:\n def canJump(self, nums: List[int]) -> bool:\n farthest = 0\n for i, step in enumerate(nums):\n if i > farthest:\n return False\n farthest = max(farthest, i + step)\n return True\n```\n時間複雜度:O(n)\n\n空間複雜度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/73#issuecomment-3317351262","body":"思維:\n1. Base Case: n=1 → [1]、n=2 → [1,2]\n2. 把問題拆成奇數子問題 (長度 = (n+1)//2) 和偶數子問題 (長度 = n//2),避免等差數列的產生\n3. 奇數組跟偶數組內分別都是從一個更小的 beautiful array 轉換來的,本身不會產生違規的等差數列\n4. 如果一邊是奇數、一邊是偶數,它們的平均數會是小數(不是整數),但我們的陣列只包含整數,不可能命中,所以跨組之間絕對安全\n5. 奇數子問題的結果全部轉換成奇數(2*x-1)\n6. 偶數子問題的結果全部轉換成偶數(2*x)\n7. 把奇數陣列與偶數陣列串接在一起,得到長度 n 的 beautiful array\n\n代碼:\n```python\nclass Solution:\n def beautifulArray(self, n: int) -> List[int]:\n if n == 1:\n return [1]\n if n == 2:\n return [1, 2]\n\n odd_arr = [x*2 -1 for x in self.beautifulArray((n+1) // 2)]\n even_arr = [x*2 for x in self.beautifulArray(n // 2)]\n \n return odd_arr + even_arr\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322731377","body":"思維:\n1. 所有數字 XOR 一遍,因為成對的數字會抵消掉 (a ^ a = 0),最後剩下的是 xor_all = x ^ y\n2. 這裡的 x, y 就是我們要找的兩個只出現一次的數字\n3. 找到一個區分 x, y 的 bit,因為 x != y,xor_all 至少有一個 bit = 1,代表 x 和 y 在那一位不同\n4. 用 diff_bit = xor_all & (-xor_all) 取出最低 set bit (最右邊的 1)\n5. 根據這個 diff_bit 把數字分組,如果 (num & diff_bit) != 0 → 放在組 A,否則 → 放在組 B\n6. 各組再 XOR 一遍,成對數字會互相抵消,只剩下唯一的 x 或 y\n7. 最後兩組結果就是 [x, y]\n\n代碼:\n```python\nclass Solution:\n def singleNumber(self, nums: List[int]) -> List[int]:\n xor_all = 0\n for num in nums:\n xor_all ^= num\n\n diff_bit = xor_all & (-xor_all)\n\n x, y = 0, 0\n for num in nums:\n if num & diff_bit:\n x ^= num\n else:\n y ^= num\n\n return [x, y]\n```\n時間複雜度:O(n)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3326355904","body":"思維:\n1. 把長度為 n 的陣列 nums 想成有 n 個開關(bit),一個整數 mask 的二進位表示,就代表一個子集合,mask 從 0 走到 (1<> i) & 1 == 1,代表第 i 位被選中 → subset.append(nums[i]),最後把 subset 加進 res\n4. 回傳結果 res\n\n代碼:\n```python\nclass Solution:\n def subsets(self, nums: List[int]) -> List[List[int]]:\n n = len(nums)\n res = []\n for mask in range(1 << n):\n subset = []\n for i in range(n):\n if (mask >> i) & 1:\n subset.append(nums[i])\n res.append(subset)\n\n return res\n```\n時間複雜度:O(n · 2^n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3332654533","body":"思維:\n1. TrieNode 結構:children 字典,用來存放「下一個字元 → 子節點」,hasword 標記當前節點是否對應一個完整單詞\n2. Trie 主類別:insert(word) 從 root 出發逐字檢查,若不存在就新建節點,最後節點標記 hasword = True\n3. search(word) 從 root 出發逐字檢查,若遇到缺失字元,直接回傳 False,結束後檢查最後節點的 hasword,若 True 表示單詞存在\n4. startsWith(prefix) 與 search 類似,但不需檢查 hasword,只要能走到 prefix 的最後一個節點就回傳 True\n\n代碼:\n```python\nclass TrieNode:\n def __init__(self):\n self.children = {}\n self.hasword = False\n\n\nclass Trie:\n def __init__(self):\n self.head = TrieNode()\n \n def insert(self, word: str) -> None:\n cur = self.head\n for c in word:\n if c not in cur.children:\n cur.children[c] = TrieNode()\n cur = cur.children[c]\n cur.hasword = True\n\n def search(self, word: str) -> bool:\n cur = self.head\n for c in word:\n if c not in cur.children:\n return False\n cur = cur.children[c]\n\n return cur.hasword\n\n def startsWith(self, prefix: str) -> bool:\n cur = self.head\n for c in prefix:\n if c not in cur.children:\n return False\n cur = cur.children[c]\n return True\n \n\n# Your Trie object will be instantiated and called as such:\n# obj = Trie()\n# obj.insert(word)\n# param_2 = obj.search(word)\n# param_3 = obj.startsWith(prefix)\n```\n時間複雜度:O(n) (Insert, search, startsWith)\n\n空間複雜度:O(n) (Insert) / O(1) (search, startsWith)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3337545631","body":"思維:\n1. TrieNode 結構:children 存子節點,precount 紀錄該節點以下所有 key 對應值的總和(前綴總和),count 紀錄如果這裡是完整單字,記錄它的 value\n2. insert(key, val):逐字往下走,若不存在就新建節點,每走過一個節點 → precount += val(加上新值)\n3. 如果這個 key 之前沒出現過 → 直接存 count = val,如果 key 已經存在 → 先取出舊值 deduct = cur.count,再更新 count = val\n4. 最後重新走一遍 key,把前綴總和扣掉原本的舊值 precount -= deduct\n5. sum(prefix):從 root 開始逐字走 prefix,如果 prefix 路徑不存在 → 回傳 0,如果存在 → 回傳最後節點的 precount\n\n代碼:\n```python\nclass TrieNode:\n def __init__(self):\n self.children = {}\n self.precount = 0\n self.count = 0\n\nclass MapSum:\n\n def __init__(self):\n self.head = TrieNode()\n\n def insert(self, key: str, val: int) -> None:\n cur = self.head\n for c in key:\n if c not in cur.children:\n cur.children[c] = TrieNode()\n cur = cur.children[c]\n cur.precount += val\n\n if not cur.count:\n cur.count = val\n else:\n deduct = cur.count\n cur.count = val\n cur = self.head\n for c in key:\n cur = cur.children[c]\n cur.precount -= deduct\n \n\n def sum(self, prefix: str) -> int:\n cur = self.head\n for c in prefix:\n if c not in cur.children:\n return 0\n cur = cur.children[c]\n return cur.precount\n\n\n# Your MapSum object will be instantiated and called as such:\n# obj = MapSum()\n# obj.insert(key,val)\n# param_2 = obj.sum(prefix)\n```\n時間複雜度:O(n) (Insert, sum)\n\n空間複雜度:O(n) (Insert) / O(1) (sum)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3355772609","body":"思維:\n1. 任何不包含 1 的子樹應該被刪掉,若節點值是 0,且左右子樹都不存在或都被刪光,那這個節點也該刪\n2. 從下往上考慮 → 遞迴後序遍歷 (post-order),先處理左右子樹,回傳「修剪後的子樹」,再決定當前節點要不要刪除\n3. 若節點是 None,直接回傳 None\n4. 遞迴:修剪左子樹 root.left = pruneTree(root.left)、修剪右子樹 root.right = pruneTree(root.right)\n5. 判斷若 root.val == 0 且 root.left == None 且 root.right == None → 回傳 None,否則保留節點\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def pruneTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:\n if not root:\n return None\n\n root.left = self.pruneTree(root.left)\n root.right = self.pruneTree(root.right)\n\n if root.val == 0 and not root.left and not root.right:\n return None\n\n return root\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null],"zechengze":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074243047","body":"### Time complexity\nO(max(n, log₁₀(k)))\n\n### Space complexity\nO(max(n, log₁₀(k)))\n\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n ans = []\n n = len(num)\n carry = 0\n i = n - 1\n while k > 0 or i >= 0 or carry > 0:\n sum = carry\n if k > 0:\n rem = k % 10\n sum += rem\n k //= 10\n if i >= 0:\n sum += num[i]\n i -= 1\n carry = sum // 10\n ans.insert(0, sum % 10)\n return ans","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092419843","body":"使用兩個 stack:\n- in_stack: 用來接收 push\n- out_stack: 用來處理 pop 和 peek\n- 當 out_stack 為空時,將 in_stack 的所有元素彈出並倒序放入 out_stack,用來模擬 queue 的 FIFO\n\n - push:O(1)\n - pop:O(1)\n - peek:O(1)\n - empty :O(1)\n\n---\n\n### Python code\n\n```python\nclass MyQueue:\n\n def __init__(self):\n self.in_stack = []\n self.out_stack = []\n\n def push(self, x: int) -> None:\n self.in_stack.append(x)\n\n def pop(self) -> int:\n self.peek() # 確保 out_stack 有東西\n return self.out_stack.pop()\n\n def peek(self) -> int:\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack[-1]\n\n def empty(self) -> bool:\n return not self.in_stack and not self.out_stack","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109185662","body":"### 解題思路\n- 先統計整個 linked list 長度。\n- 使用遞迴,每次選擇區間的中間當作 root。\n- 左子樹遞迴後才處理當前節點。\n\n時間 O(n) 每個節點遍歷一次\n\n```python\nclass Solution:\n def sortedListToBST(self, head: ListNode) -> TreeNode:\n def getLength(node: ListNode) -> int:\n length = 0\n while node:\n length += 1\n node = node.next\n return length\n\n def buildBST(start: int, end: int) -> TreeNode:\n nonlocal head\n if start > end:\n return None\n\n mid = (start + end) // 2\n # 先建左子樹\n left = buildBST(start, mid - 1)\n\n # 再建 root(中序)\n root = TreeNode(head.val)\n head = head.next\n\n # 最後建右子樹\n root.left = left\n root.right = buildBST(mid + 1, end)\n return root\n\n length = getLength(head)\n return buildBST(0, length - 1)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124485354","body":"### 思路\n- 遞迴 DFS\n- 如果節點為空,深度為 0。\n- 遞迴左右子樹的最大深度,取最大值後 +1。\n\n---\n\n### 遞迴 DFS(Top-down)\n\n```python\nclass Solution:\n def maxDepth(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136873834","body":"### BFS(反向遍歷)\n\n- 一般 BFS 是左先入,改為右先入左後入\n- 最後訪問的節點就是最底層最左側的節點\n- 每次 `popleft()` 拿出的節點覆蓋 `leftmost`\n- 時間複雜度 : O(n)\n---\n\n```python\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n if not root:\n return None\n \n queue = deque([root])\n leftmost = None\n\n while queue:\n leftmost = queue.popleft()\n if leftmost.right:\n queue.append(leftmost.right)\n if leftmost.left:\n queue.append(leftmost.left)\n\n return leftmost.val\n","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146260024","body":"### 解題思路:哈希表(一次遍歷)\n\n1. 初始化一個空dict h\n2. 遍歷陣列 nums,對每個元素 nums[i]:\n - 計算 plus = target - nums[i]\n - 如果 plus 的值在字典中,回傳 [h[plus], i]\n - else 將 nums[i] 存入 dict 中\n\n- 時間、空間複雜度:O(n)\n\n---\n```python\nclass Solution:\n def twoSum(self, nums: List[int], target: int) -> List[int]:\n h = {}\n for i in range(len(nums)):\n plus = target - nums[i]\n if plus in h:\n return [h[plus], i]\n else:\n h[nums[i]] = i","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148509431","body":"### 解題思路:哈希表 + 排序\n\n1. 先用 dict 統計每個元素出現的次數\n2. 使用 sorted 對 dict 依據頻率降序排序\n3. 取出前 k 個 keys 回傳\n\n- 時間複雜度:O(n log n)\n\n---\n\n```python\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n h_map = {}\n for i in nums:\n if i in h_map:\n h_map[i] += 1\n else:\n h_map[i] = 1\n\n h_map = dict(sorted(h_map.items(), key=lambda x: x[1], reverse=True))\n ans = list(h_map.keys())[:k]\n return ans\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170662667","body":"## 解題思路\n陣列已排序,相同的元素一定會相鄰,因此可以使用雙指針: \n1. 設定指標 `init` 指向下個唯一值要放置的位置,初始為 1。 \n2. 從第二個元素開始遍歷,若與前一個元素不同,則將該元素放到 `init` 位置並將 `init` 加 1。 \n3. 最後 `init` 即為去重後的長度。\n\n---\n\n## 時間複雜度\n- **O(n)**:只需遍歷一次陣列。\n\n## 空間複雜度\n- **O(1)**:在原陣列上進行操作,未使用額外空間。\n\n---\n\n## 程式碼\n```python\nfrom typing import List\n\nclass Solution:\n def removeDuplicates(self, nums: List[int]) -> int:\n init = 1\n for i in range(1, len(nums)):\n if nums[i] != nums[i - 1]:\n nums[init] = nums[i]\n init += 1\n return init\n```\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182007045","body":"### 解題思路\n1. 將 `dislikes` 轉換為 **圖的鄰接表** `dislike_table`。\n2. 使用顏色標記(`BLUE = 1`, `GREEN = -1`)來表示兩組人。\n3. 對每個尚未染色的人進行 DFS:\n - 將當前人染色為某一顏色。\n - 對於他不喜歡的人,必須染成相反顏色。\n - 如果發現相鄰節點顏色與自己相同,則表示無法二分。\n4. 如果所有人都能正確染色,則回傳 `True`。\n\n---\n\n```python\nfrom collections import defaultdict\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, N: int, dislikes: List[List[int]]) -> bool:\n BLUE, GREEN = 1, -1\n \n def draw(person_id, color):\n color_of[person_id] = color\n for the_other in dislike_table[person_id]:\n if color_of[the_other] == color:\n return False\n if not color_of[the_other] and not draw(the_other, -color):\n return False\n return True\n \n if N == 1 or not dislikes:\n return True\n \n dislike_table = defaultdict(list)\n color_of = defaultdict(int)\n \n for p1, p2 in dislikes:\n dislike_table[p1].append(p2)\n dislike_table[p2].append(p1)\n \n for person_id in range(1, N + 1):\n if not color_of[person_id] and not draw(person_id, BLUE):\n return False\n \n return True","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mr-kient":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074503694","body":"### 【Day 1】989. 数组形式的整数加法\n\n#### Main Idea\n\n1. Since the length of `num` can reach 10000, a brute-force approach of adding each digit of `num` multiplied by 10^[n-i] to form a number and then adding it to K is not feasible, as it would cause an overflow.\n\n2. We can simulate manual vertical calculation by reversing the array and starting the addition from the last digit of both `num` and `k`.\n\n3. Set a global variable `ex` to determine if a carry is needed when adding each digit.\n\n > [!NOTE]\n > Remember to check if there is a carry after adding the first digit.\n\n4. If an array index exceeds the limit, treat it as 0; if `k` is shorter than `num`, treat the remaining digits of `k` as 0.\n\n\n#### Code\n\n```cpp\nclass Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n int n = num.size();\n vector res;\n int ex = 0;\n int i = n - 1;\n\n while (i >= 0 || k > 0) {\n int x = (i >= 0) ? num[i] : 0; //k可能比num长\n int y = k % 10;\n int sum = x + y + ex;\n res.push_back(sum % 10);\n ex = sum / 10;\n k /= 10;\n i--;\n }\n\n if (ex)\n res.push_back(ex);\n\n reverse(res.begin(), res.end());\n\n return res;\n }\n};\n```\n\n#### Complexity\n\n$O(Max(num.size(), log(k)))$","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3076134448","body":"### **【Day 2】821. 字符的最短距离**\n\n#### Main idea\n\n1. Two linear traversals: The first one records the distance from each `s[i]` to the previous `c` from left to right; The second time, from right to left, update the minimum distance compared to the previous distance\n2. ⚠️ Note: During the two initializations, the first initialization should be very small because there will be no appearance of `c` after traversing to the right for a long time. If the setting is not small enough, it will result in an insufficiently large distance value, which will affect the update of the correct value from right to left in the second traversal\n\n```cpp\nclass Solution {\npublic:\n vector shortestToChar(string s, char c) {\n int n = s.size();\n vector res(n, n);\n int c_id = -n;\n\n for (int i = 0; i < n; i++) {\n\n if (s[i] == c) {\n c_id = i;\n }\n res[i] = i - c_id;\n }\n\n c_id = 2 * n;\n\n for (int j = n - 1; j >= 0; j--) {\n if (s[j] == c) {\n c_id = j;\n }\n\n res[j] = min(res[j], c_id - j);\n }\n\n return res;\n }\n};\n```\n\n#### Complexity\n\nLoop twice: $O(2*s.szie())$","onTime":true},null,null,null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124415547","body":"### 【Day 13】[104. 二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/)\n\n#### Main Idea \n\n1. 首先考虑到递归即遍历二叉树的左右子树,计算每个节点的左右子树的最大深度\n\n - **递归终止条件**:如果当前节点为空,则返回0(表示当前路径长度为0)。\n - **递归逻辑**:对于当前节点,递归计算左子树的最大深度和右子树的最大深度,取较大值并加1(当前节点本身)\n - **时间复杂度**:O(n),其中n是二叉树的节点总数。每个节点被访问一次。\n\n2. DFS\n\n ```c++\n /**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\n \n class Solution {\n public:\n int maxDepth(TreeNode* root) {\n if (!root) return 0;\n \n std::stack> s;\n s.push({root, 1});\n int max_depth = 0;\n \n while (!s.empty()) {\n auto [node, depth] = s.top();\n s.pop();\n max_depth = std::max(max_depth, depth);\n \n if (node->left) {\n s.push({node->left, depth + 1});\n }\n if (node->right) {\n s.push({node->right, depth + 1});\n }\n }\n \n return max_depth;\n }\n };\n ```\n\n \n\n#### 时间复杂度\n\n要计算二叉树的最大深度,必须访问每一个节点一次,因为最长路径可能出现在任意位置。**没有比O(n)更优的时间复杂度**,因为无论如何都需要遍历所有节点以确认最长路径。","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146453148","body":"### 【Day 19】两数之和\n\n#### Main Idea\n\n1. **暴力枚举**\n - 遍历数组中的每一个元素 `nums[i]`,再对其后续所有元素 `nums[j]`(`j > i`)进行遍历,判断 `nums[i] + nums[j] == target` 时返回 `[i, j]`。\n - **时间复杂度**:O(n²),最坏情况下需要检查所有的元素对。\n2. **哈希表(一遍扫描)**\n - 利用一个哈希表 `mp` 存储 <数值 → 下标 >的映射。\n - 遍历数组,令 `complement = target - nums[i]`:\n - 如果哈希表中已存在 `complement`,说明之前遇到过这么一个数,二者之和等于 `target`,直接返回对应的下标。\n - 否则将当前元素 `nums[i]` 及其下标 `i` 存入哈希表,继续扫描。\n - **优点**:一次遍历搞定,时间和空间都最优。\n\n```c++\n#include \n#include \nusing namespace std;\n\nclass Solution {\npublic:\n vector twoSum(vector& nums, int target) {\n unordered_map mp; // 存储 已访问的数值 → 下标\n for (int i = 0; i < nums.size(); ++i) {\n int complement = target - nums[i];\n // 如果哈希表中已有 complement,则直接返回答案\n if (mp.find(complement) != mp.end()) {\n return { mp[complement], i };\n }\n // 否则将当前数及下标存入\n mp[nums[i]] = i;\n }\n return {}; // 根据题意不会走到这里\n }\n};\n```\n\n#### 时间复杂度\n\n- **哈希表解法**:O(n),只需一次遍历即可完成查找与存储操作。\n- **空间复杂度**:O(n),最坏情况下哈希表需存储 n 个元素。","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168242525","body":"Main Idea\n\n1. 快慢指针法\n\n设置两个指针 slow 和 fast,初始都指向链表头结点。\n\nfast 每次向前移动 两步,slow 每次向前移动 一步。\n\n当 fast 到达链表末尾时,slow 恰好位于链表的中间位置。\n\n由于题目要求 当有两个中间结点时返回第二个,快慢指针法天然满足这一条件:当链表长度为偶数时,fast 会先到 NULL,此时 slow 指向的就是第二个中间结点。\n\n\n\n2. 时间复杂度\n\nO(n):每个结点最多被访问一次(快指针访问 n/2 次,慢指针访问 n 次)。\n\n\n\n3. 空间复杂度\n\nO(1):只使用了两个额外指针,不需要额外的数据结构。\n\n\n\n\n\n---\n\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode() : val(0), next(nullptr) {}\n * ListNode(int x) : val(x), next(nullptr) {}\n * ListNode(int x, ListNode *next) : val(x), next(next) {}\n * };\n */\nclass Solution {\npublic:\n ListNode* middleNode(ListNode* head) {\n ListNode* slow = head;\n ListNode* fast = head;\n while (fast != nullptr && fast->next != nullptr) {\n slow = slow->next; // 慢指针走一步\n fast = fast->next->next; // 快指针走两步\n }\n return slow; // slow 即为中间结点\n }\n};\n\n\n---\n\n时间复杂度分析\n\n访问链表的所有节点至少需要一次遍历,因此 没有比 O(n) 更优的时间复杂度。\n\n快慢指针法通过一次遍历同时得到中间节点,避免了额外的存储或两次遍历,比先统计长度再走一半更高效。\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3188424726","body":"#### Main Idea\n\n1. **把未分组项目“补组”**:对 `group[i] == -1` 的项目,给它们分配新的组号(从 `m` 开始递增),这样每个项目都有归属组,最终组的总数记为 `G`。\n2. **两层拓扑排序(Group 拓扑 + Item 拓扑)**:\n\n * **项目层图**:对每条依赖 `u ∈ beforeItems[v]`,连边 `u → v`,统计项目入度。\n * **组层图**:若 `group[u] != group[v]`,再在组图里连边 `group[u] → group[v]`,统计组入度。\n * **先对项目图做一次拓扑排序(得到全局项目顺序)**,再对组图做一次拓扑排序(得到组顺序)。\n3. **按组拼接**:将“项目拓扑序”按照其组别分桶(保持项目拓扑中的相对顺序),再按“组拓扑序”依次把每个桶拼接起来即为答案。\n4. **不可行判定**:任一拓扑排序失败(存在环)则返回空数组。\n\n* **关键点**:跨组依赖只影响组与组的先后关系(由组图保证),组内项目的详细先后由项目图保证。用“两层图”可同时满足“组块相邻”和“依赖有序”。\n\n---\n\n2. **实现**\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n vector sortItems(int n, int m, vector& group, vector>& beforeItems) {\n // 1) 给未分组的项目分配新组号\n int gid = m;\n for (int i = 0; i < n; ++i) {\n if (group[i] == -1) group[i] = gid++;\n }\n int G = gid; // 组总数\n\n // 2) 建立项目图 & 组图\n vector> itemAdj(n), groupAdj(G);\n vector itemIn(n, 0), groupIn(G, 0);\n\n for (int v = 0; v < n; ++v) {\n for (int u : beforeItems[v]) {\n itemAdj[u].push_back(v);\n itemIn[v]++;\n if (group[u] != group[v]) {\n groupAdj[group[u]].push_back(group[v]);\n groupIn[group[v]]++;\n }\n }\n }\n\n // 通用 Kahn 拓扑\n auto topo = [](const vector>& adj, vector indeg) -> vector {\n int N = (int)adj.size();\n queue q;\n for (int i = 0; i < N; ++i) if (indeg[i] == 0) q.push(i);\n vector order;\n order.reserve(N);\n while (!q.empty()) {\n int x = q.front(); q.pop();\n order.push_back(x);\n for (int y : adj[x]) {\n if (--indeg[y] == 0) q.push(y);\n }\n }\n if ((int)order.size() != N) return {}; // 有环\n return order;\n };\n\n // 3) 分别对 项目图、组图 做拓扑排序\n vector itemOrder = topo(itemAdj, itemIn);\n if (itemOrder.empty()) return {};\n vector groupOrder = topo(groupAdj, groupIn);\n if (groupOrder.empty()) return {};\n\n // 4) 按项目拓扑序分桶到各组里,保持项目相对次序\n vector> bucket(G);\n for (int x : itemOrder) bucket[group[x]].push_back(x);\n\n // 5) 按组拓扑序拼接\n vector ans;\n ans.reserve(n);\n for (int g : groupOrder) {\n for (int x : bucket[g]) ans.push_back(x);\n }\n return ans;\n }\n};\n```\n\n#### 时间复杂度\n\n* 建图与两次拓扑排序总计 **O(n + E)**,其中 `E = Σ |beforeItems[i]|`。\n* 额外空间用于邻接表、入度数组与分桶,均为 **O(n + E + G)**。\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3205439203","body":"#### Main Idea\n\n1. **线性扫描 (超时)**\n - 从 0 开始向上遍历整数 `i`。\n - 检查 `i * i` 的值。当第一次出现 `i * i > x` 时,那么 `i-1` 就是我们要求的平方根的整数部分。\n - **注意**:`i * i` 的计算可能会导致整数溢出。为避免此问题,应将判断条件改为 `i > x / i`。\n - **缺点**:当 `x` 非常大时,循环次数过多,会导致执行超时,无法通过所有测试用例。\n\n2. **二分查找**\n - `x` 的平方根一定在 `[0, x]` 这个区间内。\n - 我们可以将问题转化为:**在一个有序的范围内(`0` 到 `x`),寻找最大的整数 `k`,使得 `k² <= x`**。\n - 这正是二分查找的经典应用场景。设置搜索区间的左右边界 `left` 和 `right`,计算中间值 `mid`:\n - 如果 `mid² <= x`,说明 `mid` 是一个可能的解,但我们还想尝试更大的值,因此记录当前解,并在右半部分继续搜索:`ans = mid`, `left = mid + 1`。\n - 如果 `mid² > x`,说明 `mid` 太大了,解一定在左半部分,因此缩小搜索范围:`right = mid - 1`。\n - **优点**:每次都将搜索范围减半,时间复杂度低,效率极高。\n\n```c++\nclass Solution {\npublic:\n int mySqrt(int x) {\n if (x == 0) {\n return 0;\n }\n\n int left = 1, right = x;\n int ans = 0;\n\n while (left <= right) {\n int mid = left + (right - left) / 2;\n\n // 为防止 mid * mid 溢出,使用除法来判断\n // mid <= x / mid 等价于 mid * mid <= x\n if (mid <= x / mid) {\n ans = mid; // mid 是一个可能的解\n left = mid + 1; // 尝试在右侧寻找更大的解\n } else {\n right = mid - 1; // mid 太大,到左侧去寻找\n }\n }\n return ans;\n }\n};\n```\n\n#### 时间复杂度\n\n- **二分查找解法**:O(log n),其中 n 为输入值 `x`。二分查找每次都将搜索空间减半,因此时间复杂度是对数级别的。\n- **空间复杂度**:O(1),解法只使用了常数个额外变量,与输入 `x` 的大小无关。","onTime":true},null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3237241808","body":"#### Main Idea\n\n1. 滑动窗口 + 计数\n\n - 用两个计数器统计字符需求:`need[c]` 表示目标串 `t` 中每个字符需要的数量,`have[c]` 表示当前窗口中已有的数量。\n - 扩张右端:右指针 `r` 逐步右移,把字符加入窗口,并在 `have[c]` 达到 `need[c]` 时,更新已满足的种类数 `formed`。\n - 收缩左端:当窗口已满足 `t` 的全部字符需求(`formed == required`,其中 `required` 为 `t` 中不同字符的个数)时,尽量左移 `l` 缩小窗口并更新最优答案。\n - 唯一性:题目保证若存在答案则唯一,我们只需在收缩时维护最短长度即可。\n\n ```cpp\n #include \n using namespace std;\n \n class Solution {\n public:\n string minWindow(string s, string t) {\n if (t.empty() || s.size() < t.size()) return \"\";\n \n // 统计目标需求\n vector need(128, 0), have(128, 0);\n int required = 0; // 需要满足的不同字符的种类数\n for (char c : t) {\n if (need[c] == 0) required++;\n need[c]++;\n }\n \n int formed = 0; // 当前窗口中已满足 need 的种类数\n int bestLen = INT_MAX, bestL = 0;\n int l = 0;\n \n for (int r = 0; r < (int)s.size(); ++r) {\n char cr = s[r];\n have[cr]++;\n \n // 当某字符数量刚好达到需求,更新 formed\n if (need[cr] > 0 && have[cr] == need[cr]) {\n formed++;\n }\n \n // 若已满足所有字符需求,尽量收缩左端\n while (formed == required) {\n if (r - l + 1 < bestLen) {\n bestLen = r - l + 1;\n bestL = l;\n }\n char cl = s[l];\n have[cl]--;\n // 收缩导致某字符不足,formed 减一\n if (need[cl] > 0 && have[cl] < need[cl]) {\n formed--;\n }\n l++;\n }\n }\n \n return bestLen == INT_MAX ? \"\" : s.substr(bestL, bestLen);\n }\n };\n ```\n\n#### 时间复杂度\n\n双指针各自只右移且不回退,整体 **O(m + n)**;计数数组为常数空间。","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240735616","body":"#### Main Idea\n\n1. **逐行放置**\n - 每一行选择一个不与已放皇后冲突的列。冲突规则:同列、主对角线(r−c)、次对角线(r+c)。\n - **递归终止**:当行号 `row == n`,说明已成功放置 n 个皇后,计数 +1。\n - **选择与撤销**:在当前行尝试所有合法列,递归下一行,回退继续尝试。\n2. **位运算优化**\n - 用 n 位二进制位掩码表示列与对角线占用:\n - `cols`:哪些列被占。\n - `diag1`:主对角线占用(相当于下一行左移一位)。\n - `diag2`:次对角线占用(相当于下一行右移一位)。\n - 可放置位置:`bits = ~(cols | diag1 | diag2) & mask`,其中 `mask = (1<> 1`。\n\n#### 回溯 + 位运算\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int totalNQueens(int n) {\n int mask = (1 << n) - 1;\n return dfs(0, 0, 0, 0, mask, n);\n }\n\nprivate:\n // row: 当前行号;cols/diag1/diag2:占用掩码;mask:仅保留 n 位\n int dfs(int row, int cols, int diag1, int diag2, int mask, int n) {\n if (row == n) return 1;\n\n int count = 0;\n int bits = (~(cols | diag1 | diag2)) & mask; // 当前行可放置的位置集合\n\n while (bits) {\n int p = bits & -bits; // 取最低位可行位置\n bits -= p; // 移除该位置\n\n count += dfs(row + 1,\n cols | p,\n ((diag1 | p) << 1) & mask, // 主对角线左移并截断\n (diag2 | p) >> 1, // 次对角线右移\n mask, n);\n }\n return count;\n }\n};\n```\n\n#### 时间复杂度\n\n- **时间**:回溯搜索的上界接近 **O(n!)**,但位运算将冲突判断降为 O(1) 常数,n ≤ 9 时非常快。\n- **空间**:**O(n)**(递归深度 n,掩码为常数额外空间)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247569627","body":"#### Main Idea\n\n1. BFS(从所有陆地同时出发)\n\n * 把所有值为 `1` 的格子(陆地)一起入队,距离视作 0;像海浪一样一圈圈向外扩散。\n * 第一次被扩散到的海洋格子的距离,就是它到最近陆地的最短曼哈顿距离。\n * 最后被访问到的海洋格子的距离即为答案。\n * **边界**:若全为陆地或全为海洋,返回 `-1`。\n\n2. 实现\n\n ```cpp\n #include \n using namespace std;\n\n class Solution {\n public:\n int maxDistance(vector>& grid) {\n int n = grid.size();\n queue> q;\n vector> dist(n, vector(n, -1));\n\n // 把所有陆地入队,距离置 0\n for (int i = 0; i < n; ++i) {\n for (int j = 0; j < n; ++j) {\n if (grid[i][j] == 1) {\n q.push({i, j});\n dist[i][j] = 0;\n }\n }\n }\n\n // 若全海或全陆,直接返回 -1\n if (q.empty() || (int)q.size() == n * n) return -1;\n\n int ans = -1;\n int dirs[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};\n\n // 多源 BFS\n while (!q.empty()) {\n auto [x, y] = q.front(); q.pop();\n for (auto& d : dirs) {\n int nx = x + d[0], ny = y + d[1];\n if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue;\n if (dist[nx][ny] != -1) continue; // 访问过\n dist[nx][ny] = dist[x][y] + 1; // 最近陆地距离\n ans = max(ans, dist[nx][ny]);\n q.push({nx, ny});\n }\n }\n return ans;\n }\n };\n ```\n\n#### 时间复杂度\n\n* 时间:每个格子最多入队一次,四邻检查常数次,整体 **O(N²)**。\n\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263627488","body":"#### Main Idea\n\n1. **线性决策(相邻不能同抢)**\n\n * 到第 `i` 间房时只有两种选择:\n\n * **不抢它**:收益等于前一间的最佳收益 `dp[i-1]`\n * **抢它**:收益等于“到 i-2 的最佳收益 + 本屋金额” → `dp[i-2] + nums[i]`\n * 所以转移式:`dp[i] = max(dp[i-1], dp[i-2] + nums[i])`\n2. **初值与边界**\n\n * 空数组 → 答案 `0`\n * `dp[0] = nums[0]`\n * `dp[1] = max(nums[0], nums[1])`(如果存在)\n3. **滚动变量优化空间**\n\n * 只依赖 `i-1` 和 `i-2`,用两个变量就够了:\n\n * `prev2` 表示 `dp[i-2]`,`prev1` 表示 `dp[i-1]`\n * 新值 `cur = max(prev1, prev2 + nums[i])`,随后前移指针\n\n#### 动态规划(滚动变量,O(1) 空间)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int rob(vector& nums) {\n if (nums.empty()) return 0;\n int n = nums.size();\n if (n == 1) return nums[0];\n\n int prev2 = 0; // dp[i-2]\n int prev1 = 0; // dp[i-1]\n for (int x : nums) {\n int cur = max(prev1, prev2 + x);\n prev2 = prev1;\n prev1 = cur;\n }\n return prev1;\n }\n};\n```\n\n#### 时间复杂度\n\n* **时间**:`O(n)`(单次线性扫描)\n* **空间**:`O(1)`(滚动变量),如需恢复路径则 `O(n)` 用于记录选择","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3284142988","body":"#### Main idea\n\n**把局面想成“还差多少 + 已用过哪些数”**\n\n- 每次你从公共池里挑一个数,目标值就相应减少;被挑过的数以后都不能再用。\n- 于是每一步其实就是在“还差的分数”和“哪些数已被拿走”的组合之间转换。\n\n**当前能赢的充要条件**\n\n- 如果你现在能直接拿到一个数,使得**累计和立刻达到/超过目标**,你马上赢。\n- 否则,你希望找到一个数字,让对手接下来面对的局面是**必输局**。\n 换句话说:**存在**一个选择能把对手“送进死局”,那你这一步就是必赢;\n 如果**所有**选择都会把对手“送进稳赢局”,那你这一步就是必输。\n\n**两条简单但很有用的剪枝**\n\n- **总和不够就别想了**:如果 1 到 `maxChoosableInteger` 的总和都达不到目标,先手必输。\n- **目标非正直接赢**:如果目标本来就 ≤ 0(或被前人操作减到 ≤ 0),先手已满足条件,直接判赢。\n\n**记住算过的局面,别重复思考(记忆化)**\n\n- 同一组“已用过的数字 + 还差多少”的局面,赢或输的结论是固定的。\n- 把每个局面的输赢结果记下来,后面再遇到就直接用,避免在相同分支上反复推演。\n\n**直觉理解(以示例 1 为例)**\n\n- `max=10, 目标=11`:无论先手先拿哪个数 `x`,后手都能立刻拿到 `11-x`(且该数仍在 1..10 且未被用),直接结束游戏。\n- 所以先手无解——这就是“把对手送进稳赢局”在反方向上的体现。\n\n#### Implementation(cpp)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n bool canIWin(int maxChoosableInteger, int desiredTotal) {\n if (desiredTotal <= 0) return true;\n\n int n = maxChoosableInteger;\n int sum = n * (n + 1) / 2;\n if (sum < desiredTotal) return false; // 全拿都不够,必输\n\n // 2^n 状态;-1=未知,0=必败,1=必胜\n vector memo(1 << n, -1);\n return dfs(0, desiredTotal, n, memo);\n }\n\nprivate:\n // mask: 已用集合(第 i 位表示数字 i+1 是否已用)\n // remain: 距离目标还差多少\n bool dfs(int mask, int remain, int n, vector& memo) {\n char &res = memo[mask];\n if (res != -1) return res;\n\n // 枚举当前可选的每个数 i\n for (int i = 1; i <= n; ++i) {\n int bit = 1 << (i - 1);\n if (mask & bit) continue; // 已用,跳过\n if (i >= remain) return res = 1; // 直接到达/超过目标,当前玩家赢\n // 若选 i 之后对手必败,则当前必胜\n if (!dfs(mask | bit, remain - i, n, memo)) return res = 1;\n }\n return res = 0; // 所有选择都会让对手必胜 => 当前必败\n }\n};\n\n```\n\n#### 复杂度\n\nO(n · 2^n)","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3306753472","body":"#### Main Idea\n\n1. **把“最少删除”转化为“最多保留”**\n\n * 经典区间调度:**按右端点升序**排序,**尽可能先选结束早的区间**,就能在不重叠前提下**保留最多**的区间。\n * 需要移除的最小数量 = `总数 n - 能保留的最大不重叠数量 keep`。\n\n2. **为什么按右端点排是最优的**\n\n * 选更早结束的区间,给后面的区间留下**更多起始空间**,不比选结束晚的更差。\n * 可用“**交换论证**”:若最优解里某一步没有选最早结束者,换成结束更早的,不减少可选余地,解仍最优。\n\n3. **边界与定义(开闭性)**\n\n * 本题规定:端点相同只**接触不重叠**(`[1,2]` 与 `[2,3]` 可共存),因此判断不重叠条件是 `start >= lastEnd`。\n * 允许负数坐标;`1 <= n <= 1e5`,需 `O(n log n)` 排序 + `O(n)` 一次扫描。\n\n---\n\n#### 贪心(按右端点排序)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int eraseOverlapIntervals(vector>& intervals) {\n if (intervals.empty()) return 0;\n\n // 1) 按 end 升序排\n sort(intervals.begin(), intervals.end(),\n [](const vector& a, const vector& b){\n if (a[1] != b[1]) return a[1] < b[1];\n return a[0] < b[0];\n });\n\n // 2) 贪心选择:尽量保留更多不重叠区间\n int keep = 0;\n int lastEnd = INT_MIN; // 当前已选集合的最后一个区间的 end\n for (auto &it : intervals) {\n int s = it[0], e = it[1];\n if (s >= lastEnd) { // 与上一个选择不重叠(端点相接也可)\n ++keep;\n lastEnd = e;\n }\n }\n return (int)intervals.size() - keep; // 最少删除 = 总数 - 最多保留\n }\n};\n```\n\n---\n\n#### 等价实现(按左端点排序的“原地计数删谁”)\n\n* 也可以**按起点升序**,一遍扫描:\n\n * 若当前 `s < prevEnd` 发生**重叠** ⇒ 必须删一个;\n * **删谁?** 删右端点更大的那个(保留 `end` 更小者),将 `prevEnd = min(prevEnd, e)`。\n * 计数 `remove++`。\n* 与前法等价,常用于不想单独计“keep”的写法。\n\n```cpp\nint eraseOverlapIntervals(vector>& intervals) {\n if (intervals.empty()) return 0;\n sort(intervals.begin(), intervals.end()); // 默认按 start,再按 end\n\n int remove = 0;\n int prevEnd = intervals[0][1];\n for (int i = 1; i < (int)intervals.size(); ++i) {\n int s = intervals[i][0], e = intervals[i][1];\n if (s < prevEnd) { // 重叠了,需要删一个\n ++remove;\n prevEnd = min(prevEnd, e); // 删 end 较大的那个,保留更早结束\n } else {\n prevEnd = e; // 不重叠,正常推进\n }\n }\n return remove;\n}\n```\n\n#### 复杂度\n\n* 排序 `O(n log n)`,单扫 `O(n)`;总 `O(n log n)`。\n* 额外空间 `O(1)`(除了排序)。\n\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3332731592","body":"#### Main Idea\n\n1. **字母映射到孩子指针(26 叉树)**\n\n * 每个结点保存 `children[26]` 与 `isEnd`。\n * `insert(word)`:从根逐字符走,若孩子不存在就新建;末结点标记 `isEnd = true`。\n * `search(word)`:逐字符走,若中途缺结点则 `false`;走完返回末结点 `isEnd`。\n * `startsWith(prefix)`:逐字符走,若中途缺结点则 `false`;都能走到则 `true`(无需 `isEnd`)。\n\n2. **正确性与边界**\n\n * 仅小写字母 → 直接用 `idx = c - 'a'`。\n * `search` 必须要求完整单词结束处 `isEnd == true`,否则只是前缀命中。\n * 空间按需分配:只有路径上用到的结点才创建。\n\n\n---\n\n#### 实现(C++,指针版)\n\n```cpp\n#include \nusing namespace std;\n\nstruct TrieNode {\n bool isEnd = false;\n TrieNode* ch[26];\n TrieNode() : isEnd(false) {\n memset(ch, 0, sizeof(ch));\n }\n};\n\nclass Trie {\npublic:\n Trie() { root = new TrieNode(); }\n\n // 插入单词\n void insert(const string& word) {\n TrieNode* p = root;\n for (char c : word) {\n int idx = c - 'a';\n if (!p->ch[idx]) p->ch[idx] = new TrieNode();\n p = p->ch[idx];\n }\n p->isEnd = true;\n }\n\n // 完整匹配\n bool search(const string& word) {\n TrieNode* p = walk(word);\n return p && p->isEnd;\n }\n\n // 前缀匹配\n bool startsWith(const string& prefix) {\n return walk(prefix) != nullptr;\n }\n\nprivate:\n TrieNode* root;\n\n // 沿字符串行走,走不到返回空\n TrieNode* walk(const string& s) {\n TrieNode* p = root;\n for (char c : s) {\n int idx = c - 'a';\n if (!p->ch[idx]) return nullptr;\n p = p->ch[idx];\n }\n return p;\n }\n};\n```\n#### 复杂度\n\n * 设字符串长度为 `L`:\n\n * `insert / search / startsWith` 都是 **O(L)**。\n * 空间:创建的结点数 ≤ 所有插入字符串长度之和。\n\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3357108848","body":"#### Main idea\n\n**后序递归 + 就地剪枝**\n\n* “要保留的节点”必须满足:自己是 1,或者**子树里至少有一个 1**。\n* 等价地说:当一个节点值为 0,且**左右子树都被剪成空**,这个节点也应被删除。\n* 因此用**后序遍历**:先递归处理左右子树,把不含 1 的子树返回成 `nullptr`;回来后再判断当前节点是否也应被删。\n\n**判定规则(在回溯处)**\n\n* `root->left = prune(left)`,`root->right = prune(right)`;\n* 若 `root->val==0 && root->left==nullptr && root->right==nullptr` → 返回 `nullptr`(整棵以 root 为根的子树都不含 1)。\n* 否则返回 `root`。\n\n这保证了每个节点只访问一次,且删除顺序从叶到根,不会误留“全 0 链”。\n\n#### Implementation(cpp)\n\n```cpp\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\n\nclass Solution {\npublic:\n TreeNode* pruneTree(TreeNode* root) {\n if (!root) return nullptr;\n\n root->left = pruneTree(root->left);\n root->right = pruneTree(root->right);\n\n // 若当前为0且左右都为空 => 该节点所在子树不含1,剪掉\n if (root->val == 0 && !root->left && !root->right) {\n return nullptr;\n }\n return root;\n }\n};\n```\n\n#### 复杂度\n\n* 时间:`O(n)`,每个节点访问一次。\n* 空间:`O(h)`,递归栈深度(`h` 为树高,最坏 `O(n)`,平均 `O(log n)`)。","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null],"leohongyi":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3076771871","body":"【Day 1】989. 数组形式的整数加法\nmain idea 从最低位开始加,如果还有进位,将其添加到结果前面 使用逆序遍历 range(len(num) - 1, -1, -1) 从数组的最后一个元素(最低位)开始\ndivmod(num[i] + k, 10) 计算当前位置的数字与 k 相加后的结果,返回商和余数 如果处理完数组中所有位后仍有进位(k > 0)\n从 k 中提取最低位数字,并插入到数组最前面\n继续处理 k 的下一位,直到 k 变为 0\n余数 num[i] 保存在当前位置\n商 k 作为进位传递给下一个更高位\n整体时间复杂度为 O(max(n, log k))。\ncode\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n for i in range(len(num) - 1, -1, -1):\n k, num[i] = divmod(num[i] + k, 10)\n \n while k > 0:\n k, digit = divmod(k, 10)\n num.insert(0, digit)\n return num\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077014132","body":"main idea:\n创建 ret 数组,长度为len(s)\n再次遍历s的过程中,我们需要判断当满足以下两点条件时,指针 p 右移一位\np小于arr最大下标\n前下标i 到 p + 1的绝对距离比到 p 的绝对距离小\n每次将 p - i 的绝对距离添加至 ret[i] 中\n\n def shortestToChar(self, s: str, c: str) -> List[int]:\n ret, p, arr = [], 0, [i for i in range(len(s)) if s[i] == c]\n for i, j in enumerate(s):\n if p < len(arr) - 1 and abs(arr[p] - i) > abs(arr[p + 1] - i):\n p += 1\n ret.append(abs(arr[p] - i))\n return ret\nTime Complexity: O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082831029","body":"使用数组的栈结构,self.top作为栈顶指针\n进出栈分别通过简单的数组赋值与读取进行操作\nincrement函数通过一个循环进行赋值操作\nclass CustomStack:\n\n def __init__(self, maxSize: int):\n self.stack = [0]*maxSize\n self.top = -1\n\n def push(self, x: int) -> None:\n if self.top < len(self.stack) - 1:\n self.top += 1\n self.stack[self.top] = x\n\n def pop(self) -> int:\n if self.top is -1:\n return self.top\n else:\n self.top -= 1\n return self.stack[self.top+1]\n \n\n def increment(self, k: int, val: int) -> None:\n for i in range(min(k, self.top + 1)):\n self.stack[i] += val\n\n\n\nTime complexity: O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3092615113","body":"算法步骤:\n利用current string, current number 记录所有不同的括号层级内的string和num;\n使用stk来记录之前的数字和前置str;推荐先push num, 后push str 至 stack;\nO(n)\n代码:\nclass Solution:\n def decodeString(self, s: str) -> str:\n cur_str, cur_num = \"\", \"\"\n stk = []\n for c in s:\n if c.isdigit():\n cur_num += c\n elif c == '[':\n stk.append(cur_str)\n stk.append(cur_num)\n cur_str, cur_num = \"\", \"\"\n elif c == ']':\n cur_str *= int(stk.pop())\n cur_str = stk.pop() + cur_str\n else:\n cur_str += c\n return cur_str\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092624509","body":"算法设计\n加入队尾 push() : 将数字 val 加入栈 A 即可。\n获取队首元素 peek() :\n当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。\n否则,当 A 为空: 即两个栈都为空,无元素,因此返回 -1 。\n否则: 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。\n弹出队首元素 pop() :\n执行 peek() ,获取队首元素。\n弹出 B 的栈顶元素。\n队列判空 empty() : 当栈 A 和 B 都为空时,队列为空。\n\nclass MyQueue:\n\n def __init__(self):\n self.A, self.B = [], []\n\n def push(self, x: int) -> None:\n self.A.append(x)\n\n def pop(self) -> int:\n peek = self.peek()\n self.B.pop()\n return peek\n\n def peek(self) -> int:\n if self.B: return self.B[-1]\n if not self.A: return -1\n # 将栈 A 的元素依次移动至栈 B\n while self.A:\n self.B.append(self.A.pop())\n return self.B[-1]\n def empty(self) -> bool:\n return not self.A and not self.B\n\n\n# Your MyQueue object will be instantiated and called as such:\n# obj = MyQueue()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.peek()\n# param_4 = obj.empty()\n时间复杂度: push(), empty() 函数的时间复杂度为 O(1) ;peek() , pop() 函数在 N 次队首元素删除操作中总共需完成 N 个元素的倒序,均摊时间复杂度为 O(1) 。\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3105379844","body":"main: 如果当前元素大于或者等于maxx,入栈, 更新最大值maxx\n如果当前元素小于栈顶元素,循环弹出栈顶元素,直到当前元素大于或等于栈顶元素,注意不用将当前元素入栈!!不过要再将maxx压入栈,因为刚刚pop时肯定把maxx弹出栈了\n\n。class Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n maxx, stk = arr[0], [arr[0]]\n for i in range(1, len(arr)):\n if arr[i] >= maxx:\n maxx = arr[i]\n stk.append(arr[i])\n else:\n while stk and stk[-1] > arr[i]:\n stk.pop()\n stk.append(maxx)\n return len(stk)\n 时间复杂度O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3111913253","body":"找到尾结点 形成环形链表\n尾结点移动length - k 步 有移动k步 == 左移length - k 步\n找到头结点 断开头尾链接\n\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:\n if not head or not head.next:\n return head\n tail = head\n length = 1\n while tail.next:\n length += 1\n tail = tail.next\n tail.next = head\n\n k = k % length\n for _ in range(length - k):\n tail = tail.next\n \n head = tail.next\n tail.next = None\n return head\n ","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3111983736","body":"先交换以node3为头结点的链表 \nnode1指向地柜返回的链表头\n把node2指向node1\n返回node2 作为交换完成的链表头结点\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if head is None or head.next is None:\n return head\n node1 = head\n node2 = head.next\n node3 = node2.next\n\n node1.next = self.swapPairs(node3)\n node2.next = node1\n\n return node2\n ","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dmax1314":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3082278662","body":"1. 第一个想法是数组转换数字然后相加再转换回去\n时间和空间复杂度都应该是O(n)\n```python\nfrom typing import List\n\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n # 1. 数组 -> 字符串 -> 数字\n # 首先将列表中的每个数字转换为字符串,然后拼接成一个完整的字符串\n # [1, 2, 0, 0] -> [\"1\", \"2\", \"0\", \"0\"] -> \"1200\"\n s = \"\".join(map(str, num))\n \n num_val = int(s)\n \n # 2. 数字相加\n result_val = num_val + k\n \n # 3. 数字 -> 字符串 -> 数组\n # 将结果数字转换回字符串\n # 1234 -> \"1234\"\n result_s = str(result_val)\n \n # 将结果字符串中的每个字符转换回整数,并放入列表中\n # \"1234\" -> [\"1\", \"2\", \"3\", \"4\"] -> [1, 2, 3, 4]\n result_array = [int(digit) for digit in result_s]\n \n return result_array\n```\n但是似乎换其他的语言会溢出\n2. 第二个想法就是模拟加法操作,从个位数加起,关键问题在于处理进位\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n result = []\n carry = 0\n i = len(num) - 1 # 指向 num 的最后一位\n \n while i >= 0 or k > 0 or carry > 0:\n digit = carry # 初始化为进位\n \n if i >= 0: # 如果 num 中还有数字\n digit += num[i]\n i -= 1\n \n if k > 0: # 如果 k 中还有数字\n digit += k % 10\n k //= 10 # 整个 k 除以 10\n \n # 处理进位\n result.append(digit % 10)\n carry = digit // 10\n \n result.reverse() # 因为是从个位到十位添加的,最后需要反转\n return result # 返回结果\n```\n这里是要反转的 我一开始忘了这个事情,因为数组把个位的和放在了第一位和实际数字反过来了\n时间复杂度: O(max(N, M)),其中 N 是 num 的长度,M 是 k 的数字长度。我们需要遍历这两个数的每一位。\n空间复杂度: O(max(N, M)),用于存储结果数组。\n\n---\n在看lc题解的时候发现一个很有趣的模板可能以后会用到\n ```\nwhile ( A 没完 || B 没完)\n A 的当前位\n B 的当前位\n\n 和 = A 的当前位 + B 的当前位 + 进位carry\n\n 当前位 = 和 % 10;\n 进位 = 和 / 10;\n\n判断还有进位吗\n```\n>作者:lilyunoke\n>链接:https://leetcode.cn/problems/add-to-array-form-of-integer/solutions/570659/989-ji-zhu-zhe-ge-jia-fa-mo-ban-miao-sha-8y9r/\n>来源:力扣(LeetCode)\n>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n\n稍微改了一下得到一个python加法模板,\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n n = len(num)\n res = []\n i = n - 1\n s = 0\n carry = 0\n while i >= 0 or k != 0:\n x = num[i] if i >= 0 else 0\n y = k % 10 if k != 0 else 0\n\n s = x + y + carry\n carry = s // 10\n k //= 10\n\n i -= 1\n res.insert(0, s % 10)\n\n if carry != 0:\n res.insert(0, carry)\n return res\n```\n据说这个模板还可以用到[2](https://leetcode.com/problems/add-two-numbers/description/),[165](https://leetcode.com/problems/compare-version-numbers/)和[809](https://leetcode.com/problems/expressive-words/)这周末抽空可以做一下","onTime":false},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3086540520","body":"# 第四天\n构造栈结构,利用先入后出的特性来实现括号匹配\n大概做法就是\n1. 使用栈来存放数字、字符以及中间结果。\n2. 遇到数字时,解析出完整的k值(可能是多位数)。\n3. 遇到开括号 `[` 时,将当前构建的字符串入栈,重置字符串。\n4. 遇到闭括号 `]` 时,出栈,形成一个新的字符串并重复生成。\n5. 最终合并所有字符串返回结果。\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n stack = [] # 初始化栈\n current_num = 0 # 当前数字\n current_str = '' # 当前构建的字符串\n\n for char in s:\n if char.isdigit(): # 如果是数字\n current_num = current_num * 10 + int(char) # 处理多位数\n elif char == '[': # 遇到左括号\n stack.append(current_str) # 存储当前字符串\n stack.append(current_num) # 存储当前数字\n current_str = '' # 重置字符串\n current_num = 0 # 重置数字\n elif char == ']': # 遇到右括号\n num = stack.pop() # 弹出数字\n prev_str = stack.pop() # 弹出前一个字符串\n current_str = prev_str + current_str * num # 生成新的字符串\n else:\n current_str += char # 累加字符\n\n return current_str # 返回解码后的字符串\n```\n时间复杂度是 O(n),其中 n 是字符串 s 的长度。每个字符都被处理一次。\n空间复杂度是 O(n),在最坏情况下,栈可能会存储所有字符和数字。\n\n---\n读了题解发现还存在递归法,也就是用[]来决定递归的开头和结束\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n def dfs(s,i):\n res,multi='',0\n while i str:\n def dfs(s, i):\n res, multi = \"\", 0\n while i < len(s):\n if '0' <= s[i] <= '9':\n multi = multi * 10 + int(s[i])\n elif s[i] == '[':\n i, tmp = dfs(s, i + 1)\n res += multi * tmp\n multi = 0\n elif s[i] == ']':\n return i, res\n else:\n res += s[i]\n i += 1\n return res\n return dfs(s,0)\n```\n时间复杂度是 O(n),其中 n 是字符串 s 的长度。每个字符都被处理一次。\n空间复杂度是 O(n),在最坏情况下,递归调用栈可能会存储所有字符和数字。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091499578","body":"用两个模拟栈的队列来实现栈的基本操作。一个用于添加尾部元素,另一个用于弹出头部元素。即一个近栈stack in和一个出栈stack out。\n```python\nclass MyQueue:\n\n def __init__(self):\n \"\"\"\n in主要负责push,out主要负责pop\n \"\"\"\n self.stack_in = []\n self.stack_out = []\n\n\n def push(self, x: int) -> None:\n \"\"\"\n 有新元素进来,就往in里面push\n \"\"\"\n self.stack_in.append(x)\n\n\n def pop(self) -> int:\n \"\"\"\n Removes the element from in front of queue and returns that element.\n \"\"\"\n if self.empty():\n return None\n \n if self.stack_out:\n return self.stack_out.pop()\n else:\n for i in range(len(self.stack_in)):\n self.stack_out.append(self.stack_in.pop())\n return self.stack_out.pop()\n\n\n def peek(self) -> int:\n \"\"\"\n Get the front element.\n \"\"\"\n ans = self.pop()\n self.stack_out.append(ans)\n return ans\n\n\n def empty(self) -> bool:\n \"\"\"\n 只要in或者out有元素,说明队列不为空\n \"\"\"\n return not (self.stack_in or self.stack_out)\n```\n时间复杂度:\n- `push` 操作的时间复杂度是 O(1),因为我们只是将元素添加到 `stack_in` 的末尾。\n- `pop` 和 `peek` 操作的平均时间复杂度是 O(1),但在最坏情况下(当 `stack_out` 为空时),需要将 `stack_in` 中的所有元素转移到 `stack_out`,这需要 O(n) 的时间,其中 n 是 `stack_in` 中的元素数量。然而,这种情况不会频繁发生,因此平均时间复杂度仍然是 O(1)。\n- `empty` 操作的时间复杂度是 O(1),因为我们只是检查两个栈是否为空。\n\n空间复杂度是 O(n),其中 n 是队列中的元素数量,因为我们需要存储所有元素在两个栈中。\n\n但是我有个问题,不知道为什么用lc自己的time complexity分析出来是O(n)的时间和空间复杂度,可能是因为lc的分析是基于最坏情况的分析?","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094285074","body":"题目的核心是找到最多的分块数量,使得将每个块独立排序后,拼接起来的结果与整个数组排序后的结果相同。\n\n第一个想法是利用排序后的性质。一个块可以被成功分割的条件是:块内所有元素的原数组最大值,小于等于它右边所有元素的最小值。如果满足这个条件,那么这个块排序后,所有元素就都会在它们最终应该在的位置的左边。\n\n为了实现这个想法,我们可以预处理两个数组:\n\n- max_of_left[i]:表示原数组 arr[0...i] 中的最大值。\n- min_of_right[i]:表示原数组 arr[i...n-1] 中的最小值。\n\n然后遍历数组,如果在 i 位置,满足 max_of_left[i] <= min_of_right[i+1],就说明我们可以在 i 和 i+1 之间切一刀。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n n = len(arr)\n if n <= 1:\n return 1\n\n # 1. 计算从左到右每个位置的最大值\n max_of_left = [0] * n\n max_of_left[0] = arr[0]\n for i in range(1, n):\n max_of_left[i] = max(max_of_left[i-1], arr[i])\n\n # 2. 计算从右到左每个位置的最小值\n min_of_right = [0] * n\n min_of_right[n-1] = arr[n-1]\n for i in range(n-2, -1, -1):\n min_of_right[i] = min(min_of_right[i+1], arr[i])\n\n # 3. 遍历查找可以分割的点\n # 如果 max_of_left[i] <= min_of_right[i+1],说明 arr[0...i] 的所有元素\n # 都小于等于 arr[i+1...n-1] 的所有元素,可以切分\n chunks = 0\n for i in range(n - 1):\n if max_of_left[i] <= min_of_right[i+1]:\n chunks += 1\n\n # 总块数 = 分割点数量 + 1\n return chunks + 1\n```\n时间复杂度:O(N),其中 N 是数组的长度。我们需要三次独立的 O(N) 遍历。\n空间复杂度:O(N),用于存储 max_of_left 和 min_of_right 两个辅助数组。\n\n---\n在看题解的时候,发现了一个更巧妙的解法,虽然时间复杂度稍高,但是代码非常简洁。它的思路是比较原数组和排序后数组的元素和。\n\n如果 arr[0...i] 的元素和等于 sorted_arr[0...i] 的元素和,这意味着 arr[0...i] 中的元素集合和 sorted_arr[0...i] 中的元素集合是完全相同的(只是顺序不同)。因为 sorted_arr[0...i] 包含了整个数组中最小的 i+1 个元素,所以 arr[0...i] 也必然包含了这 i+1 个最小元素。这就保证了 arr[0...i] 中的任意元素都小于等于 arr[i+1...n-1] 中的任意元素,因此可以在 i 处进行分割。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n sorted_arr = sorted(arr)\n \n sum_arr = 0\n sum_sorted = 0\n chunks = 0\n \n for i in range(len(arr)):\n sum_arr += arr[i]\n sum_sorted += sorted_arr[i]\n \n if sum_arr == sum_sorted:\n chunks += 1\n \n return chunks\n```\n时间复杂度:O(N log N),瓶颈在于对数组的排序。\n\n空间复杂度:O(N),用于存储排序后的数组副本。\n\n还有一个基于单调栈的解法,时间复杂度可以做到 O(N)。\n\n思路是遍历数组,用一个栈来维护每个块的最大值。\n\n1. 如果当前元素 num 大于或等于栈顶元素,说明 num 可以自己形成一个新的块(或者加入前一个块且不影响排序性),直接将 num 入栈。\n2. 如果当前元素 num 小于栈顶元素,说明 num 必须和前面的块合并,直到栈顶元素小于或等于 num。在合并过程中,需要记录被弹出的那些块中的最大值 head,因为这个 head 将成为合并后新块的最大值,然后将 head 入栈。\n\n最终栈的大小就是块的数量。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n stack = []\n for num in arr:\n if not stack or num >= stack[-1]:\n stack.append(num)\n else:\n # 当前元素num比栈顶小,需要合并\n head = stack.pop()\n # 持续弹出所有大于num的元素\n while stack and stack[-1] > num:\n stack.pop()\n # 将原先这些块的最大值head作为新块的代表入栈\n stack.append(head)\n return len(stack)\n```\n\n时间复杂度:O(N),因为每个元素最多入栈和出栈一次。\n\n空间复杂度:O(N),在最坏的情况下(例如数组本身有序),栈的大小会等于数组长度。\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112533354","body":"双指针\n1. 创建两个指针 pA 和 pB,分别指向两个链表的头节点 headA 和 headB。\n2. 同时向前移动这两个指针,pA 每次走一步,pB 每次也走一步。\n3. 核心操作:如果 pA 指针走到了链表 A 的末尾(即 pA 变为 None),则将它重定向到链表 B 的头节点 headB。同样,如果 pB 指针走到了链表 B 的末尾,则将它重定向到链表 A 的头节点 headA。\n4. 两个指针最终会在相交点相遇。如果两个链表不相交,它们会同时在路径的最后变为 None,此时循环结束。\n\n```python\nclass Solution:\n def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:\n if not headA or not headB:\n return None\n\n pA = headA\n pB = headB\n\n # 当 pA 和 pB 相等时循环终止(可能是在交点,也可能同为 None)\n while pA is not pB:\n # 如果pA走到头,就让他从headB开始走;否则,pA正常往下走\n pA = headB if pA is None else pA.next\n # 如果pB走到头,就让他从headA开始走;否则,pB正常往下走\n pB = headA if pB is None else pB.next\n \n # 返回相遇点\n return pA\n```\n时间复杂度:O(m+n)。在最坏的情况下(例如,两个链表不相交),每个指针都需要遍历两个链表的总长度。\n空间复杂度:O(1)。只使用了两个额外的指针,没有使用其他数据结构。","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121201700","body":"为了实现一个支持 O(1) 时间复杂度的查找插入和删除,可以用hash map去记录key和value之间的映射关系。但是hash map是无序的,没有办法记录各项的使用顺序,可以一个双向链表来记录使用顺序。这样就可以在插入和删除的时候,快速地调整链表的顺序。\n\n```python\nclass DLinkedNode:\n def __init__(self, key=0, value=0):\n self.key = key\n self.value = value\n self.prev = None\n self.next = None\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.cache = dict()\n self.capacity = capacity\n # 使用伪头部和伪尾部节点,简化边界条件处理\n self.head = DLinkedNode()\n self.tail = DLinkedNode()\n self.head.next = self.tail\n self.tail.prev = self.head\n\n def _add_to_head(self, node: DLinkedNode):\n # 将节点添加到头部\n node.prev = self.head\n node.next = self.head.next\n self.head.next.prev = node\n self.head.next = node\n\n def _remove_node(self, node: DLinkedNode):\n # 从链表中删除一个节点\n node.prev.next = node.next\n node.next.prev = node.prev\n\n def _move_to_head(self, node: DLinkedNode):\n # 将一个存在的节点移动到头部\n self._remove_node(node)\n self._add_to_head(node)\n\n def get(self, key: int) -> int:\n if key not in self.cache:\n return -1\n \n node = self.cache[key]\n # 访问过后,变为最近使用,移动到头部\n self._move_to_head(node)\n return node.value\n\n def put(self, key: int, value: int) -> None:\n if key in self.cache:\n # 如果 key 存在,更新值并移动到头部\n node = self.cache[key]\n node.value = value\n self._move_to_head(node)\n else:\n # 如果 key 不存在\n if len(self.cache) == self.capacity:\n # 缓存已满,淘汰最久未使用的节点(尾部节点)\n removed_node = self.tail.prev\n self._remove_node(removed_node)\n # 不要忘了从哈希表中也删除\n del self.cache[removed_node.key]\n\n # 创建新节点并添加到头部\n new_node = DLinkedNode(key, value)\n self._add_to_head(new_node)\n self.cache[key] = new_node\n```\n时间复杂度:get 和 put 操作都是 O(1)。所有操作都是哈希表查找和链表头尾操作的组合。\n空间复杂度:O(capacity),因为哈希表和双向链表最多存储 capacity 个元素。","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3132881592","body":"DFS - 递归\n这道题的结构天然适合使用递归来解决。我们可以定义一个函数,该函数接收一个节点和从根到该节点父节点所构成的数字。\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n \n def dfs(node: Optional[TreeNode], current_path_sum: int) -> int:\n if not node:\n return 0\n \n # 计算到达当前节点的路径代表的数字\n new_sum = current_path_sum * 10 + node.val\n \n # 如果是叶子节点,返回当前路径的数字\n if not node.left and not node.right:\n return new_sum\n \n # 如果不是叶子节点,返回左右子树的路径数字之和\n else:\n return dfs(node.left, new_sum) + dfs(node.right, new_sum)\n\n return dfs(root, 0)\n```\n时间复杂度:O(N),其中 N 是树中节点的数量。我们需要访问每个节点一次。\n空间复杂度:O(H),其中 H 是树的高度。这部分空间用于递归调用栈。在最坏的情况下(树退化成链表),空间复杂度为 O(N);在最好的情况下(完全二叉树),空间复杂度为 O(log N)。\n\n---\n\nDFS - 迭代\n> 递归可能导致的栈溢出问题(在树极深的情况下),我们可以将递归转换为迭代\n\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n \n total_sum = 0\n stack = [(root, root.val)] # 栈中存储 (节点, 到达该节点的路径数值)\n\n while stack:\n node, current_number = stack.pop()\n\n # 如果是叶子节点,将路径数值加入总和\n if not node.left and not node.right:\n total_sum += current_number\n\n # 将右子节点压栈\n if node.right:\n stack.append((node.right, current_number * 10 + node.right.val))\n \n # 将左子节点压栈\n if node.left:\n stack.append((node.left, current_number * 10 + node.left.val))\n \n return total_sum\n```\n时间复杂度:O(N),每个节点入栈和出栈一次。\n空间复杂度:O(H),栈在最坏情况下存储 H 个节点,H 是树的高度。与递归版本类似,最好情况 O(log N),最坏情况 O(N)。\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134942374","body":"因为题目中提到了**行**,我们可以用bfs一行一行地处理树的节点\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\nimport collections\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n \n queue = collections.deque([root])\n bottom_left_val = 0\n \n while queue:\n # 当前层的节点数量\n level_size = len(queue)\n \n # 每一层的第一个节点就是该层的最左侧节点\n # 我们只需要记录它,然后继续遍历\n bottom_left_val = queue[0].val\n \n # 遍历当前层的所有节点\n for _ in range(level_size):\n node = queue.popleft()\n \n # 将下一层的节点加入队列\n if node.left:\n queue.append(node.left)\n if node.right:\n queue.append(node.right)\n \n return bottom_left_val\n```\n时间复杂度:O(N),其中 N 是树中节点的总数。因为每个节点都会入队和出队一次。\n空间复杂度:O(W),其中 W 是树的最大宽度。在最坏的情况下(一个完整的二叉树),队列的大小可以达到 N/2。\n\n---\n当然dfs也是可以做的,要记录目前为止发现的最深层级max_depth和最深层级最左边节点的值result_val,先左后右地进行递归\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n self.max_depth = -1 # 记录最大深度,初始化为-1\n self.result_val = 0 # 记录结果值\n \n def dfs(node: Optional[TreeNode], current_depth: int):\n if not node:\n return\n \n # 如果当前深度大于已记录的最大深度\n # 说明我们第一次到达这个新深度,且由于先序遍历的顺序,这一定是该层最左的节点\n if current_depth > self.max_depth:\n self.max_depth = current_depth\n self.result_val = node.val\n \n # 必须先遍历左子树,再遍历右子树\n dfs(node.left, current_depth + 1)\n dfs(node.right, current_depth + 1)\n \n dfs(root, 0)\n return self.result_val\n```\n时间复杂度:O(N),因为我们仍然需要访问树中的每一个节点。\n空间复杂度:O(H),其中 H 是树的高度。这部分空间是递归调用栈所占用的。最坏情况下,树呈链状,空间复杂度为 O(N)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3146236433","body":"```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n def dfs(node):\n if not node:\n res.append(\"null\")\n return\n res.append(str(node.val))\n dfs(node.left)\n dfs(node.right)\n \n dfs(root)\n return \",\".join(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n if not data:\n return None\n \n # 使用列表模拟一个队列,方便 pop(0)\n node_list = data.split(',')\n \n def build_tree():\n val = node_list.pop(0)\n if val == \"null\":\n return None\n \n node = TreeNode(int(val))\n node.left = build_tree()\n node.right = build_tree()\n return node\n \n return build_tree()\n```\n复杂度 空间和时间都是 O(N)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3141867802","body":"坐标记录 + 排序\n为每一个节点确定其坐标 (row, col),并记录下 (row, col, val) 这个三元组。最后BFS即可(DFS应该也行)\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import List, Optional\nimport collections\n\nclass Solution:\n def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:\n if not root:\n return []\n \n # 1. 遍历与记录\n # 使用 BFS 遍历树,记录每个节点的 (col, row, val)\n nodes_info = []\n queue = collections.deque([(root, 0, 0)]) # (node, row, col)\n \n while queue:\n node, row, col = queue.popleft()\n nodes_info.append((col, row, node.val))\n \n if node.left:\n queue.append((node.left, row + 1, col - 1))\n if node.right:\n queue.append((node.right, row + 1, col + 1))\n \n # 2. 排序\n # 对记录下来的节点信息进行排序\n # Python 的元组排序默认按元素顺序比较,完美符合题目要求\n nodes_info.sort()\n \n # 3. 分组\n # 将排序后的结果按列分组\n result_map = collections.OrderedDict()\n for col, row, val in nodes_info:\n if col not in result_map:\n result_map[col] = []\n result_map[col].append(val)\n \n return list(result_map.values())\n```\n时间复杂度:O(N log N)。\nBFS 遍历需要 O(N) 的时间,其中 N 是节点数。nodes_info.sort() 是整个算法的瓶颈,对 N 个元素排序需要 O(N log N) 的时间。最后的分组步骤需要 O(N) 的时间。\n因此,总时间复杂度为 O(N log N)。\n\n空间复杂度:O(N)。\nBFS 的队列在最坏情况下需要存储 O(W) 个节点,W 是树的最大宽度。nodes_info 列表需要存储所有 N 个节点的信息,因此需要 O(N) 的空间。result_map 也需要 O(N) 的空间来存储所有节点的值。\n因此,总空间复杂度为 O(N)。\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146235205","body":"```python\nfrom typing import List, Set\n\nclass Solution:\n def generateParenthesis(self, n: int) -> List[str]:\n # 使用列表来模拟dp数组,每个元素是一个哈希集合\n dp: List[Set[str]] = [set() for _ in range(n + 1)]\n \n # 基础情况:0对括号只有一种组合,即空字符串\n dp[0].add(\"\")\n \n # 从1对括号开始,迭代到n对\n for i in range(1, n + 1):\n # 遍历所有可能的分割点 j\n for j in range(i):\n # A 部分有 j 对括号,B 部分有 i-1-j 对\n list_p = dp[j]\n list_q = dp[i - 1 - j]\n \n # 组合 p 和 q\n for p in list_p:\n for q in list_q:\n # 使用哈希集合 dp[i] 自动去重\n dp[i].add(f\"({p}){q}\")\n \n return list(dp[n])\n```\n复杂度好像有点难算 看看大家有没有什么想法 我再算一算","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3147359265","body":"首先想到的是26字母那道题一样开一个数组然后建一个数组索引转换hash map去做 但是我不清楚是不是升序 所以要用min和max 那这样的效果肯定很差 内存会超 结果没想到居然能过\n```python\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n if not nums:\n return []\n \n # -----------------------------------------------------------------\n # 步骤 1: 使用“数组哈希”(直接寻址法)统计频率\n # -----------------------------------------------------------------\n \n # a. 找到数值范围以确定数组大小\n min_val = min(nums)\n max_val = max(nums)\n \n # b. 定义偏移量,将所有数值映射到数组的非负索引\n offset = -min_val\n \n # c. 创建计数数组\n count_array_size = max_val - min_val + 1\n count_array = [0] * count_array_size\n \n # d. 遍历原数组,完成计数\n for num in nums:\n # 将 num 通过偏移量映射到数组索引\n index = num + offset\n count_array[index] += 1\n\n # -----------------------------------------------------------------\n # 步骤 2: 使用桶排序来找到前 K 个高频元素\n # -----------------------------------------------------------------\n\n # a. 创建桶,桶的索引代表频率\n # 桶的数量是 len(nums) + 1,因为一个元素的频率不可能超过总数\n buckets = [[] for _ in range(len(nums) + 1)]\n\n # b. 遍历计数数组,将元素放入对应频率的桶中\n for i in range(count_array_size):\n freq = count_array[i]\n if freq > 0:\n # 将索引 i 转换回原始数字\n num = i - offset\n buckets[freq].append(num)\n\n # -----------------------------------------------------------------\n # 步骤 3: 从后往前收集结果\n # -----------------------------------------------------------------\n \n result = []\n # 从最高频率的桶开始遍历\n for i in range(len(buckets) - 1, 0, -1):\n # 如果当前频率的桶中有元素\n if buckets[i]:\n # 将这个桶里的所有元素加入结果集\n result.extend(buckets[i])\n \n # 如果结果集大小已经足够,可以提前退出\n if len(result) >= k:\n break\n \n # 返回前 k 个元素,如果最后一个桶加入了多余元素,用切片保证只返回k个\n return result[:k]\n```\n---\n然后我想到遍历数组 建一个hash map(元素,频率) 然后按频率降序排序提出来前k个\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n # 1. 使用 collections.Counter 快速统计频率,O(N)\n freq_map = collections.Counter(nums)\n \n # 2. 对哈希表按值(频率)进行排序\n # sorted 函数的时间复杂度是 O(M log M),其中 M 是不同元素的数量\n # M <= N,所以最坏是 O(N log N)\n sorted_items = sorted(freq_map.items(), key=lambda item: item[1], reverse=True)\n \n # 3. 提取前 k 个元素\n result = [item[0] for item in sorted_items[:k]]\n \n return result\n```\n空间复杂度:O(N)\n时间复杂度:O(NlogN)。其中 N 是数组 nums 的长度。瓶颈在于排序那一步,即使只有 M 个独立元素,在最坏情况下 M 可能等于 N。这个复杂度不满足题目进阶要求。\n\n---\n可以看到关键问题在于排序,想办法避免排序 我就可以用最小堆来做\n维护一个最小的heapq 按频率存入 如果堆的大小超过k了就把频率最低的pop out就行\n```python\nimport collections\nimport heapq\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n # 1. 统计频率,O(N)\n freq_map = collections.Counter(nums)\n \n # 2. 维护一个大小为 k 的最小堆,O(M log k),M是不同元素的数量\n min_heap = []\n for num, freq in freq_map.items():\n # Python的heapq是最小堆,所以我们存入(频率, 数字)\n # 这样堆会根据频率排序\n heapq.heappush(min_heap, (freq, num))\n if len(min_heap) > k:\n heapq.heappop(min_heap) # pop out频率最小的元素\n \n # 3. 提取结果\n # 此时堆中的k个元素就是频率最高的k个\n result = [item[1] for item in min_heap]\n return result\n```\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3156822202","body":"双指针滑动窗口\n```python\nclass Solution:\n def lengthOfLongestSubstring(self, s: str) -> int:\n # 哈希表存储 {字符: 最后出现的位置索引}\n char_map = {}\n max_len = 0\n left = 0 # 窗口的左边界\n \n # right 是窗口的右边界,不断向右移动\n for right in range(len(s)):\n char = s[right]\n \n # 如果当前字符已经存在于哈希表中,并且其位置在当前窗口内\n if char in char_map and char_map[char] >= left:\n # 遇到重复字符,收缩窗口\n # 将左边界移动到重复字符上一次出现位置的下一个位置\n left = char_map[char] + 1\n \n # 更新字符的最新位置\n char_map[char] = right\n \n # 更新最大长度\n current_len = right - left + 1\n max_len = max(max_len, current_len)\n \n return max_len\n```\n时间复杂度:O(N)。left 和 right 两个指针都只会从头到尾遍历字符串一次,每个字符最多被访问两次。\n\n空间复杂度:O(k),其中 k 是字符串中不同字符的数量。在最坏的情况下(所有字符都不同),空间复杂度为 O(N)。如果字符集有限(例如 ASCII 码共 128 个),则空间复杂度为常数 O(128)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3156831483","body":"这道题和上一题的区别一个是子字符串(3)一个是子序列(30)\n解法还是双指针滑动窗口 只不过需要改造一下,现在要独立扫描word_len 次\n即\n>第一次扫描:从索引 0 开始,窗口每次移动 word_len,检查的子串是 s[0...], s[word_len...], s[2*word_len...] ...\n第二次扫描:从索引 1 开始,窗口每次移动 word_len,检查的子串是 s[1...], s[1+word_len...], s[1+2*word_len...] ...\n\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def findSubstring(self, s: str, words: List[str]) -> List[int]:\n if not s or not words:\n return []\n\n word_len = len(words[0])\n num_words = len(words)\n total_len = word_len * num_words\n words_freq = collections.Counter(words)\n result = []\n\n # 我们需要进行 word_len 次扫描\n for i in range(word_len):\n left = i # 当前扫描的窗口左边界\n seen = collections.Counter() # 当前窗口内单词的频率\n count = 0 # 当前窗口内有效单词的数量\n\n # 窗口右边界以 word_len 为步长滑动\n for j in range(i, len(s) - word_len + 1, word_len):\n word = s[j : j + word_len]\n \n if word in words_freq:\n seen[word] += 1\n count += 1\n \n # 如果一个单词的数量超了,就从左边收缩窗口\n while seen[word] > words_freq[word]:\n left_word = s[left : left + word_len]\n seen[left_word] -= 1\n count -= 1\n left += word_len\n \n # 如果窗口内单词数量正好,说明找到了一个解\n if count == num_words:\n result.append(left)\n # 为了继续搜索,将窗口最左边的单词移出\n left_word = s[left : left + word_len]\n seen[left_word] -= 1\n count -= 1\n left += word_len\n\n else:\n # 如果遇到的单词不在 words 列表中,则当前窗口作废\n # 直接将左边界移动到这个坏单词的后面\n seen.clear()\n count = 0\n left = j + word_len\n \n return result\n```\n时间复杂度O(N),N是字符串s的长度\n空间复杂度O(ML),M是words列表里的单词数量 L是每个单词长度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3161453831","body":"```python\nfrom typing import List\n\nclass Solution:\n def minSubarray(self, nums: List[int], p: int) -> int:\n n = len(nums)\n # 1. 同余定理:计算目标余数\n target_rem = sum(nums) % p\n \n # 如果总和已经能被 p 整除,无需移除\n if target_rem == 0:\n return 0\n \n # 2. 哈希表:存储 {余数: 最后一次出现的索引}\n # 初始化 {0: -1} 来处理从开头开始的子数组\n rem_map = {0: -1}\n min_len = n # 初始化为一个最大值\n \n # 3. 前缀和:用一个变量 current_sum 动态计算\n current_sum = 0\n \n for i, num in enumerate(nums):\n current_sum += num\n current_rem = current_sum % p\n \n # 计算需要寻找的配对余数\n needed_rem = (current_rem - target_rem + p) % p\n \n # 如果找到了配对\n if needed_rem in rem_map:\n prev_index = rem_map[needed_rem]\n # 更新最短长度\n min_len = min(min_len, i - prev_index)\n \n # 更新当前余数的最新索引\n rem_map[current_rem] = i\n \n # 如果 min_len 没有被更新过,或者更新后的值等于n(意味着要移除整个数组)\n # 则说明找不到合适的“真”子数组\n return min_len if min_len < n else -1\n```\n时间复杂度:O(N),因为我们只遍历了数组一次。\n空间复杂度:O(min(N,p)),因为哈希表中最多存储 p 个不同的余数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3169922808","body":"双指针\n```python\nfrom typing import Optional\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\n\nclass Solution:\n def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n # 初始化快慢指针\n slow = head\n fast = head\n \n # 当快指针没有走到链表末尾时\n while fast and fast.next:\n # 慢指针走一步\n slow = slow.next\n # 快指针走两步\n fast = fast.next.next\n \n # 当循环结束时,慢指针正好在中间位置\n return slow\n```\n时间复杂度:O(N)。虽然有两个指针,但我们只对链表进行了一次单向遍历。\n空间复杂度:O(1)。只使用了两个额外的指针变量,没有使用额外的存储空间。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169886502","body":"双指针/快慢指针\n快的去遍历 慢的维护只出现一次的元素\n```python\nfrom typing import List\n\nclass Solution:\n def removeDuplicates(self, nums: List[int]) -> int:\n # 如果数组为空,直接返回 0\n if not nums:\n return 0\n \n # slow 指针指向下一个将要被赋值的、新的不重复元素的位置。\n # nums[0] 默认是第一个不重复的元素,所以 slow 从 1 开始。\n slow = 1\n \n # fast 指针从第二个元素开始,遍历整个数组\n for fast in range(1, len(nums)):\n if nums[fast] != nums[fast - 1]:\n nums[slow] = nums[fast]\n slow += 1\n \n return slow","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173197055","body":"我们可以用单调队列(双端队列 (deque))来维护窗口内的“候选最大值”,使得获取当前最大值的操作是 O(1) 的\n>双端队列 (deque)\n队列中存储的是数组元素的索引,而不是元素本身。\n队列中的索引所对应的 nums 数组中的值,是从头到尾单调递减的。\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n n = len(nums)\n if n * k == 0:\n return []\n \n # 单调队列,存储的是元素的索引\n # 队列中的索引对应的 nums 值是单调递减的\n deque = collections.deque()\n result = []\n\n for i in range(n):\n # 1. 维护单调性:移除队尾所有小于当前值的元素\n while deque and nums[deque[-1]] <= nums[i]:\n deque.pop()\n \n # 2. 当前元素索引入队\n deque.append(i)\n \n # 3. 维护窗口大小:移除已经滑出窗口的队头元素\n if deque[0] <= i - k:\n deque.popleft()\n \n # 4. 记录结果:当窗口完全形成后开始记录\n if i >= k - 1:\n # 队头元素永远是当前窗口的最大值\n result.append(nums[deque[0]])\n \n return result\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3187054447","body":"```python\nfrom typing import List\n\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n # 使用一个数组记录每个人的信任差额\n trust_scores = [0] * (n + 1)\n \n for a, b in trust:\n trust_scores[a] -= 1 # 信任别人,分数-1\n trust_scores[b] += 1 # 被人信任,分数+1\n \n # 寻找分数为 n-1 的法官\n for i in range(1, n + 1):\n if trust_scores[i] == n - 1:\n return i\n \n return -1\n```\n时间复杂度: O(n + m), m为trust列表长度\n空间复杂度: O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3187045338","body":"这道题的本质是判断一个图是否为二分图 (Bipartite Graph)。\n n 个人看作是图的 n 个节点 (Vertex),每一对 dislike关系 [a, b] 看作是连接节点 a 和 b 的一条无向边 (Edge)。\n判断由人和他们之间的“不喜欢”关系构成的图,是否是一个二分图。\nDFS着色\n```python\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:\n # 1. 构建图的邻接表\n graph = [[] for _ in range(n + 1)]\n for u, v in dislikes:\n graph[u].append(v)\n graph[v].append(u)\n \n # 2. 创建 colors 数组,0:未着色, 1:颜色A, -1:颜色B\n colors = [0] * (n + 1)\n \n # 3. 遍历所有节点\n for i in range(1, n + 1):\n # 如果节点未被着色,从它开始进行DFS\n if colors[i] == 0:\n if not self.dfs(i, 1, colors, graph):\n return False\n \n return True\n\n def dfs(self, node: int, color: int, colors: List[int], graph: List[List[int]]) -> bool:\n # 给当前节点染色\n colors[node] = color\n \n # 遍历所有邻居\n for neighbor in graph[node]:\n # 如果邻居颜色与当前节点相同,产生冲突\n if colors[neighbor] == color:\n return False\n # 如果邻居未被染色,对其进行DFS\n if colors[neighbor] == 0:\n # 给邻居染上相反的颜色\n if not self.dfs(neighbor, -color, colors, graph):\n return False\n \n return True\n```\nBFS着色\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:\n # 1. 构建图的邻接表\n graph = [[] for _ in range(n + 1)]\n for u, v in dislikes:\n graph[u].append(v)\n graph[v].append(u)\n \n # 2. 创建 colors 数组\n colors = [0] * (n + 1)\n \n # 3. 遍历所有节点\n for i in range(1, n + 1):\n if colors[i] == 0: # 未被染色,开始BFS\n queue = collections.deque([i])\n colors[i] = 1 # 染上颜色A\n \n while queue:\n node = queue.popleft()\n # 遍历邻居\n for neighbor in graph[node]:\n # 如果邻居颜色与当前节点相同,冲突\n if colors[neighbor] == colors[node]:\n return False\n # 如果邻居未染色,染上相反颜色并入队\n if colors[neighbor] == 0:\n colors[neighbor] = -colors[node]\n queue.append(neighbor)\n \n return True\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3187051602","body":"双层拓扑排序 关键在于排序的规则\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:\n \n # 1. 数据预处理:为没有团队的项目分配新团队ID\n new_group_id = m\n for i in range(n):\n if group[i] == -1:\n group[i] = new_group_id\n new_group_id += 1\n \n num_groups = new_group_id\n\n # 2. 构建项目图和团队图及其入度数组\n item_graph = [[] for _ in range(n)]\n item_indegree = [0] * n\n group_graph = [[] for _ in range(num_groups)]\n group_indegree = [0] * num_groups\n\n for i in range(n):\n for prev_item in beforeItems[i]:\n # 项目图依赖\n item_graph[prev_item].append(i)\n item_indegree[i] += 1\n \n # 如果属于不同团队,则产生团队图依赖\n if group[prev_item] != group[i]:\n group_graph[group[prev_item]].append(group[i])\n group_indegree[group[i]] += 1\n\n # 3. 通用的拓扑排序函数\n def topological_sort(graph, indegree):\n num_nodes = len(graph)\n queue = collections.deque([i for i in range(num_nodes) if indegree[i] == 0])\n sorted_order = []\n while queue:\n u = queue.popleft()\n sorted_order.append(u)\n for v in graph[u]:\n indegree[v] -= 1\n if indegree[v] == 0:\n queue.append(v)\n \n return sorted_order if len(sorted_order) == num_nodes else []\n\n # 4. 执行两次拓扑排序\n item_order = topological_sort(item_graph, item_indegree)\n group_order = topological_sort(group_graph, group_indegree)\n\n if not item_order or not group_order:\n return []\n\n # 5. 合并结果\n # a. 将排好序的项目按团队分组\n items_by_group = collections.defaultdict(list)\n for item in item_order:\n items_by_group[group[item]].append(item)\n \n # b. 根据团队顺序,拼接项目\n final_result = []\n for group_id in group_order:\n final_result.extend(items_by_group[group_id])\n \n return final_result\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3193081347","body":"模拟\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n # 初始化坐标\n x, y = 0, 0\n \n # 遍历每一步\n for move in moves:\n if move == 'U':\n y += 1\n elif move == 'D':\n y -= 1\n elif move == 'L':\n x -= 1\n elif move == 'R':\n x += 1\n \n # 检查最终位置是否为原点\n return x == 0 and y == 0\n```\n或者直接看字符串里面是否满足U==D, L==R\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n # Python 的 count() 方法让这个思路的实现非常简洁\n # 检查向上和向下的步数是否相等\n vertical_balance = (moves.count('U') == moves.count('D'))\n \n # 检查向左和向右的步数是否相等\n horizontal_balance = (moves.count('L') == moves.count('R'))\n \n return vertical_balance and horizontal_balance\n```\n两个复杂度是一样的\n时间复杂度:O(N)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193084373","body":"排序 + 最小堆\nmin_heap存放已到达但未执行的任务(processingTime, original_index) 按照时间、索引排序\n```python\nimport heapq\nfrom typing import List\n\nclass Solution:\n def getOrder(self, tasks: List[List[int]]) -> List[int]:\n # 1. 数据预处理:附加原始索引并按入队时间排序\n # tasks_with_indices 的格式: [[enqueueTime, processingTime, original_index], ...]\n tasks_with_indices = sorted(\n [(tasks[i][0], tasks[i][1], i) for i in range(len(tasks))]\n )\n \n result_order = []\n min_heap = [] # 优先队列,存储 (processingTime, original_index)\n \n task_pointer = 0 # 指向下一个要检查的任务\n current_time = 0 # 当前时间\n \n # 当还有任务未处理或未入队时,循环继续\n while task_pointer < len(tasks) or min_heap:\n \n # 如果CPU空闲且没有任务在等待,快进到下一个任务的到达时间\n if not min_heap and current_time < tasks_with_indices[task_pointer][0]:\n current_time = tasks_with_indices[task_pointer][0]\n\n # 2. 将所有已到达的任务加入最小堆\n while task_pointer < len(tasks) and tasks_with_indices[task_pointer][0] <= current_time:\n enqueue_time, process_time, original_index = tasks_with_indices[task_pointer]\n heapq.heappush(min_heap, (process_time, original_index))\n task_pointer += 1\n \n # 3. 从堆中取出最优任务执行\n if min_heap:\n process_time, original_index = heapq.heappop(min_heap)\n current_time += process_time\n result_order.append(original_index)\n \n return result_order\n```\n复杂度:假设N个任务,那么时间复杂度是O(NlogN)有排序造成的,空间是O(N) tasks列表和min_heap都需要O(N)的空间","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3204406944","body":"a->c,需要len(a) - a中c的个数\nb->c需要len(b) - b中c的个数\n我们需要考虑len(a) + len(b) - (a中c的个数 + b中c的个数)\n此外还可以优化一下\n如果a= c 的字符。\nb 中需要改变的,是那些 < c 的字符。\na>=b同理\n```python\nimport collections\n\nclass Solution:\n def minCharacters(self, a: str, b: str) -> int:\n n, m = len(a), len(b)\n freq_a = collections.Counter(a)\n freq_b = collections.Counter(b)\n\n # --- 计算条件 3 的最小代价 ---\n # 代价 = 总长度 - 两个字符串中某个字符的最大总频次\n max_combined_freq = 0\n for i in range(26):\n char = chr(ord('a') + i)\n max_combined_freq = max(max_combined_freq, freq_a[char] + freq_b[char])\n \n cost3 = n + m - max_combined_freq\n\n # --- 计算条件 1 (a < b) 和 条件 2 (b < a) 的最小代价 ---\n cost1 = float('inf') # a < b\n cost2 = float('inf') # b < a\n \n # 使用前缀/后缀和的思想来优化计数\n a_lt_count = 0 # a 中 < 当前分界线的字符数\n b_lt_count = 0\n \n # 遍历所有 25 个可能的分界线 ('b' 到 'z')\n for i in range(25):\n char = chr(ord('a') + i)\n a_lt_count += freq_a[char]\n b_lt_count += freq_b[char]\n \n # 分界线是 char_next = chr(ord('a') + i + 1)\n # 条件 1 (a < char_next, b >= char_next):\n # - a 中要改的是 >= char_next 的, 即 (n - a_lt_count)\n # - b 中要改的是 < char_next 的, 即 b_lt_count\n current_cost1 = (n - a_lt_count) + b_lt_count\n cost1 = min(cost1, current_cost1)\n \n # 条件 2 (b < char_next, a >= char_next):\n # - b 中要改的是 >= char_next 的, 即 (m - b_lt_count)\n # - a 中要改的是 < char_next 的, 即 a_lt_count\n current_cost2 = (m - b_lt_count) + a_lt_count\n cost2 = min(cost2, current_cost2)\n\n return min(cost1, cost2, cost3)\n```\n时间复杂度:O(N+M),其中 N 和 M 分别是两个字符串的长度。\n空间复杂度:O(1),大小为 26 的频率表\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3208576782","body":"堆排序\n```python\nclass Solution:\n def sortArray(self, nums: List[int]) -> List[int]:\n def heapify(nums, n, i):\n largest = i\n left = 2 * i + 1\n right = 2 * i + 2\n\n if left < n and nums[left] > nums[largest]:\n largest = left\n if right < n and nums[right] > nums[largest]:\n largest = right\n if largest != i:\n nums[i], nums[largest] = nums[largest], nums[i]\n heapify(nums, n, largest)\n\n n = len(nums)\n for i in range(n // 2 - 1, -1, -1):\n heapify(nums, n, i)\n\n for i in range(n - 1, 0, -1):\n nums[i], nums[0] = nums[0], nums[i]\n heapify(nums, i, 0)\n```\n时间复杂度:O(NlogN)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3208555582","body":"二分\n```python\nclass Solution:\n def mySqrt(self, x: int) -> int:\n\n if x == 0:\n return 0\n \n # 定义二分查找的左右边界\n left, right = 0, x\n ans = 0\n \n while left <= right:\n # 计算中间值\n mid = left + (right - left) // 2\n \n # 避免 mid 为 0 的情况,或者直接判断 mid * mid\n if mid == 0:\n left = mid + 1\n continue\n \n # 比较 mid 的平方与 x\n # 为了防止 mid * mid 溢出(在某些语言中),可以写成 mid <= x / mid\n if mid * mid > x:\n # mid 太大,搜索左半部分\n right = mid - 1\n else:\n # mid 是一个可能的答案,尝试寻找更大的\n ans = mid\n left = mid + 1\n \n return ans\n```\n时间复杂度:O(logN)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208553626","body":"二分查找\n```python\nclass Solution:\n def firstBadVersion(self, n: int) -> int:\n left, right = 1, n\n \n while left < right:\n mid = left + (right - left) // 2\n \n if isBadVersion(mid):\n # 如果 mid 是坏的,那第一个坏版本在 [left, mid] 区间内\n # 我们不能排除 mid,所以 right = mid\n right = mid\n else:\n # 如果 mid 是好的,那第一个坏版本在 [mid + 1, right] 区间内\n left = mid + 1\n \n return left\n```\n时间复杂度:O(logN)\n空间复杂度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3222475353","body":"排除法\n排除掉卡片的正面和背面是同一个数字 X的卡片\n```python\nfrom typing import List\n\nclass Solution:\n def flipgame(self, fronts: List[int], backs: List[int]) -> int:\n # 1. 找出所有“不可能的”数字\n impossible_nums = set()\n for i in range(len(fronts)):\n if fronts[i] == backs[i]:\n impossible_nums.add(fronts[i])\n \n # 2. 寻找最小的“好”数字\n min_good_num = float('inf')\n found_good_num = False\n \n # 遍历所有出现过的数字\n all_nums = fronts + backs\n \n for num in all_nums:\n # 如果这个数字不是“不可能的”\n if num not in impossible_nums:\n found_good_num = True\n min_good_num = min(min_good_num, num)\n \n # 3. 返回结果\n return min_good_num if found_good_num else 0\n```\n时间复杂度:O(N),其中 N 是卡片的数量。\n空间复杂度:O(N)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3222461055","body":"二分 + DFS/BFS\n```python\nfrom typing import List\n\nclass Solution:\n def swimInWater(self, grid: List[List[int]]) -> int:\n n = len(grid)\n left, right = grid[0][0], n * n - 1\n ans = right\n\n def is_possible(t):\n # 检查在时间 t 是否能从 (0,0) 到达 (n-1, n-1)\n if grid[0][0] > t:\n return False\n \n stack = [(0, 0)]\n visited = {(0, 0)}\n \n while stack:\n r, c = stack.pop()\n if r == n - 1 and c == n - 1:\n return True\n \n for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:\n nr, nc = r + dr, c + dc\n if 0 <= nr < n and 0 <= nc < n and (nr, nc) not in visited and grid[nr][nc] <= t:\n visited.add((nr, nc))\n stack.append((nr, nc))\n return False\n\n while left <= right:\n mid = left + (right - left) // 2\n if is_possible(mid):\n ans = mid\n right = mid - 1\n else:\n left = mid + 1\n \n return ans\n```\n时间复杂度:O($n^2logn$)\n空间复杂度:O($n^2$)\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222456504","body":"Sliding Window\n维护一个固定大小为 k 的窗口,在字符串上滑动。当窗口向右移动一格时,只需要考虑移出窗口的字符和移入窗口的字符对元音数量的影响即可。\n```python\nfrom typing import List\n\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n vowels = {'a', 'e', 'i', 'o', 'u'}\n \n # 1. 初始化:计算第一个窗口的元音数\n current_vowels = 0\n for i in range(k):\n if s[i] in vowels:\n current_vowels += 1\n \n max_vowels = current_vowels\n \n # 2. 滑动窗口\n # 从第 k 个字符开始,模拟窗口向右滑动\n for i in range(k, len(s)):\n # a. 处理新移入的字符 s[i]\n if s[i] in vowels:\n current_vowels += 1\n \n # b. 处理被移出的字符 s[i-k]\n if s[i-k] in vowels:\n current_vowels -= 1\n \n # c. 更新最大值\n max_vowels = max(max_vowels, current_vowels)\n \n return max_vowels\n```\n时间复杂度:O(N)\n空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3232274052","body":"动态规划 + 滑动窗口\n定义 dp[i] 为:爱丽丝最终得分恰好为 i 的概率,最后要计算$\\sum_i=k^n dp[i]$,dp[0] = 1\n```python\nclass Solution:\n def new21Game(self, n: int, k: int, maxPts: int) -> float:\n # 如果 k=0,开始就是 >=k,游戏直接结束,得分为0,概率为1\n if k == 0:\n return 1.0\n \n # dp[i] 表示得到分数 i 的概率\n dp = [0.0] * (n + 1)\n dp[0] = 1.0\n \n # window_sum 维护一个大小为 maxPts 的滑动窗口内 dp 值的和\n window_sum = 1.0\n result = 0.0\n \n for i in range(1, n + 1):\n # 计算 dp[i]\n dp[i] = window_sum / maxPts\n \n # 如果 i < k,dp[i] 会对后续的 dp 值产生贡献,加入窗口\n if i < k:\n window_sum += dp[i]\n \n # 如果 i >= k,这是一个最终得分,累加到结果中\n # 注意:题目求的是 <= n 的概率,而 dp 数组只到 n,所以循环内累加即可\n if i >= k:\n result += dp[i]\n \n # 如果 i >= maxPts,需要将滑出窗口的 dp 值减去\n if i >= maxPts:\n window_sum -= dp[i - maxPts]\n \n return result\n```\n时间复杂度:O(n)。我们只对 dp 数组进行了一次遍历。\n空间复杂度:O(n)。用于存储 dp 数组。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3232278119","body":"滑动窗口 + 字符频率统计\n```python\nfrom typing import List\n\nclass Solution:\n def findAnagrams(self, s: str, p: str) -> List[int]:\n s_len, p_len = len(s), len(p)\n \n # 边缘情况:如果 s 比 p 短,不可能找到异位词\n if s_len < p_len:\n return []\n \n result = []\n # 使用大小为 26 的数组作为频率统计表\n p_counts = [0] * 26\n s_window_counts = [0] * 26\n \n # 1. & 2. 初始化 p 的频率表和 s 的第一个窗口的频率表\n for i in range(p_len):\n p_counts[ord(p[i]) - ord('a')] += 1\n s_window_counts[ord(s[i]) - ord('a')] += 1\n \n # 3. 第一次比较\n if p_counts == s_window_counts:\n result.append(0)\n \n # 4. 滑动窗口\n for i in range(p_len, s_len):\n # a. 移入新字符\n s_window_counts[ord(s[i]) - ord('a')] += 1\n # b. 移出旧字符\n s_window_counts[ord(s[i - p_len]) - ord('a')] -= 1\n \n # c. 再次比较\n if p_counts == s_window_counts:\n # 当前窗口的起始索引是 i - p_len + 1\n result.append(i - p_len + 1)\n \n return result\n```\n时间复杂度:O(textlen(s)+textlen(p))\n空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235951126","body":"用一个 right 指针不断地扩展窗口,直到窗口内的子串满足了“包含 t 中所有字符”的条件。一旦窗口满足条件,就记录下这个“可行解”,然后开始移动 left 指针,收缩窗口\n```python\nimport collections\n\nclass Solution:\n def minWindow(self, s: str, t: str) -> str:\n # need 存储 t 中字符的需求数量\n need = collections.Counter(t)\n # window 存储当前窗口中字符的数量\n window = collections.Counter()\n\n left, right = 0, 0\n valid = 0 # 记录 window 中有多少字符已经满足了 need 的要求\n \n # 记录最小覆盖子串的起始索引和长度\n start = 0\n min_len = float('inf')\n\n while right < len(s):\n # c 是将移入窗口的字符\n c = s[right]\n right += 1\n \n # 扩展窗口\n if c in need:\n window[c] += 1\n if window[c] == need[c]:\n valid += 1\n \n # 判断左侧窗口是否要收缩\n while valid == len(need):\n # 在这里更新最小覆盖子串\n if right - left < min_len:\n start = left\n min_len = right - left\n\n # d 是将移出窗口的字符\n d = s[left]\n left += 1\n \n # 收缩窗口\n if d in need:\n if window[d] == need[d]:\n valid -= 1\n window[d] -= 1\n\n # 返回最小覆盖子串,如果 min_len 还是初始值,说明没有找到\n return \"\" if min_len == float('inf') else s[start : start + min_len]\n```\n时间复杂度: O(len(s)+len(t))\n空间复杂度: O(N), N是字符集的大小","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3244023262","body":"dfs\n```python\nfrom typing import List\n\nclass Solution:\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n if not grid:\n return 0\n \n rows, cols = len(grid), len(grid[0])\n max_area = 0\n \n def dfs(r, c):\n # 边界条件检查 & 终止条件 (遇到水或已访问过的陆地)\n if not (0 <= r < rows and 0 <= c < cols and grid[r][c] == 1):\n return 0\n \n # 将当前单元格标记为已访问 (沉岛)\n grid[r][c] = 0\n \n # 当前单元格面积为 1,并递归探索四个方向\n return (1 + dfs(r + 1, c) +\n dfs(r - 1, c) +\n dfs(r, c + 1) +\n dfs(r, c - 1))\n\n # 遍历整个网格\n for r in range(rows):\n for c in range(cols):\n if grid[r][c] == 1:\n current_area = dfs(r, c)\n max_area = max(max_area, current_area)\n \n return max_area\n```\n时间复杂度O(MN)\n空间复杂度最坏O(MN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3251910064","body":"Multi-Source BFS\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxDistance(self, grid: List[List[int]]) -> int:\n n = len(grid)\n queue = collections.deque()\n \n # 1. 初始化:将所有陆地加入队列\n for r in range(n):\n for c in range(n):\n if grid[r][c] == 1:\n queue.append((r, c))\n \n # 边缘情况:如果全是陆地或全是海洋\n if len(queue) == 0 or len(queue) == n * n:\n return -1\n \n distance = -1\n # 2. 多源 BFS\n while queue:\n distance += 1\n # 遍历当前层的所有节点\n for _ in range(len(queue)):\n r, c = queue.popleft()\n \n # 探索四个方向的邻居\n for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:\n nr, nc = r + dr, c + dc\n \n if 0 <= nr < n and 0 <= nc < n and grid[nr][nc] == 0:\n grid[nr][nc] = 1 # 标记为已访问\n queue.append((nr, nc))\n \n return distance\n```\n时间复杂度:O(N^2)\n空间复杂度:O(N^2)\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251914219","body":"模拟+bfs\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n \n total_candies = 0\n \n # 我们拥有的、但未打开的盒子\n my_closed_boxes = set()\n # 可以打开并处理的盒子队列\n queue = collections.deque()\n\n # 初始化\n for box_idx in initialBoxes:\n if status[box_idx] == 1:\n queue.append(box_idx)\n else:\n my_closed_boxes.add(box_idx)\n\n while queue:\n box_idx = queue.popleft()\n \n # 1. 拿糖果\n total_candies += candies[box_idx]\n \n # 2. 拿钥匙,并用新钥匙尝试打开已有的盒子\n for key in keys[box_idx]:\n status[key] = 1 \n if key in my_closed_boxes:\n queue.append(key)\n my_closed_boxes.remove(key)\n \n # 3. 拿新盒子\n for contained_box in containedBoxes[box_idx]:\n if status[contained_box] == 1:\n queue.append(contained_box)\n else:\n my_closed_boxes.add(contained_box)\n \n return total_candies\n```\n时间复杂度: O(盒子数+钥匙数+内涵盒子数)\n\n空间复杂度: O(盒子数)。最坏情况下要存储所有盒子的信息。\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260205356","body":"dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n```python\nclass Solution:\n def minCostClimbingStairs(self, cost: List[int]) -> int:\n n = len(cost)\n dp = [0] * (n + 1)\n \n # dp[0] 和 dp[1] 默认为 0,因为可以从这两级开始\n \n # 从第 2 级台阶开始,应用转移方程\n for i in range(2, n + 1):\n dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n \n return dp[n]\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3276673110","body":"dp[i] = max(nums[i-1] + dp[i-2], dp[i-1])\n\n```python\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n n = len(nums)\n if n == 0: return 0\n if n == 1: return nums[0]\n \n dp = [0] * (n + 1)\n dp[0] = 0\n dp[1] = nums[0]\n \n for i in range(2, n + 1):\n dp[i] = max(nums[i-1] + dp[i-2], dp[i-1])\n \n return dp[n]\n```\n可以优化到只依赖前两个状态来节省内存空间\n```python\nfrom typing import List\n\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n # rob_prev 代表 dp[i-2],rob_curr 代表 dp[i-1]\n rob_prev, rob_curr = 0, 0\n \n for num in nums:\n # 计算 dp[i] = max(num + dp[i-2], dp[i-1])\n temp = max(num + rob_prev, rob_curr)\n # 更新状态,为下一次循环做准备\n rob_prev = rob_curr\n rob_curr = temp\n \n return rob_curr\n```\n时间复杂度: O(N)\n空间复杂度: O(1)\n\n\n\n\n\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3276687323","body":"dp[i] = 1 + max(dp[j]),其中 0 <= j < i 且 nums[j] < nums[i]。\n```python\nfrom typing import List\n\nclass Solution:\n def findNumberOfLIS(self, nums: List[int]) -> int:\n n = len(nums)\n if n <= 1:\n return n\n \n # lengths[i]: 以 nums[i] 结尾的 LIS 长度\n # counts[i]: 以 nums[i] 结尾的 LIS 个数\n lengths = [1] * n\n counts = [1] * n\n\n # 填充 DP 数组\n for i in range(n):\n for j in range(i):\n if nums[j] < nums[i]:\n # 情况一:发现更长的子序列\n if lengths[j] + 1 > lengths[i]:\n lengths[i] = lengths[j] + 1\n counts[i] = counts[j] # 路径数继承\n # 情况二:发现另一条同样长的子序列\n elif lengths[j] + 1 == lengths[i]:\n counts[i] += counts[j] # 路径数累加\n\n max_len = max(lengths)\n result = 0\n for i in range(n):\n if lengths[i] == max_len:\n result += counts[i]\n \n return result\n```\n时间复杂度: O(N^2)\n\n空间复杂度: O(N)\n\n","onTime":false},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3276694316","body":"dp[r][c] =骑士当前位于棋盘上 (r, c) 位置的概率\n从 (r, c) 出发,能为下一个状态 dp_curr 中的 (nr, nc) 贡献 dp_prev[r][c] / 8 的概率\ndp_curr[nr][nc]=\\sum dp(nr, nc)\n```python\nfrom typing import List\n\nclass Solution:\n def knightProbability(self, n: int, k: int, row: int, column: int) -> float:\n # dp[r][c] 表示骑士在 (r, c) 位置的概率\n dp = [[0.0] * n for _ in range(n)]\n dp[row][column] = 1.0\n \n # 骑士的8个移动方向\n moves = [(-2, -1), (-2, 1), (-1, -2), (-1, 2),\n (1, -2), (1, 2), (2, -1), (2, 1)]\n \n # 迭代 k 步\n for _ in range(k):\n # dp_next 用于存储下一步的概率分布\n dp_next = [[0.0] * n for _ in range(n)]\n \n # 遍历棋盘上所有位置\n for r in range(n):\n for c in range(n):\n # 如果当前位置有概率 > 0\n if dp[r][c] > 0:\n # 尝试8种移动\n for dr, dc in moves:\n nr, nc = r + dr, c + dc\n \n # 如果移动后的位置在棋盘内\n if 0 <= nr < n and 0 <= nc < n:\n # 将概率贡献给下一个状态\n dp_next[nr][nc] += dp[r][c] / 8.0\n \n # 用新状态覆盖旧状态\n dp = dp_next\n \n # 计算最终仍在棋盘上的总概率\n total_probability = sum(sum(row) for row in dp)\n return total_probability\n```\n时间复杂度 O(kn^2)\n空间复杂度: O(n^2)","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gjwang224":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3086564307","body":"## Code\n```cpp\nclass Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n int len = num.size()-1;\n vector returnNum;\n int tmp=0;\n \n while(k && len>=0){\n returnNum.push_back((num[len] + k%10 + tmp)%10);\n tmp = (num[len] + k%10 + tmp)/10;\n len--;\n k = k/10;\n }\n\n while(k){\n returnNum.push_back((k%10 + tmp)%10);\n tmp = (k%10 + tmp)/10;\n k = k/10;\n }\n \n while(len>=0){\n returnNum.push_back((num[len] + tmp)%10);\n tmp = (num[len] + tmp)/10;\n len--;\n }\n \n if(tmp) returnNum.push_back(tmp);\n reverse(returnNum.begin(), returnNum.end());\n return returnNum;\n }\n};","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3093190969","body":"#### C++\n``` C++\nclass Solution {\npublic:\n vector shortestToChar(string s, char c) {\n vector dis, rearr;\n for(int i = 0; i < s.size(); i++) if(s.at(i) == c) dis.push_back(i);\n for(int i = 0; i < s.size(); i++){\n int minn = 1e5+5;\n for(int j = 0; j < dis.size(); j++){\n minn = min(minn, abs(i-dis.at(j)));\n }\n rearr.push_back(minn);\n }\n return rearr;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3087031064","body":"### C++ 代码\n``` C++\nclass CustomStack {\npublic:\n int stack[1005];\n int size = -1, mS;\n CustomStack(int maxSize) {\n mS = maxSize;\n }\n \n void push(int x) {\n if(size < mS-1){\n stack[++size] = x;\n }\n }\n \n int pop() {\n if(size < 0) return -1;\n else return stack[size--];\n }\n \n void increment(int k, int val) {\n for(int i = 0; i < k; i++){\n stack[i] += val;\n }\n }\n};\n\n/**\n * Your CustomStack object will be instantiated and called as such:\n * CustomStack* obj = new CustomStack(maxSize);\n * obj->push(x);\n * int param_2 = obj->pop();\n * obj->increment(k,val);\n */\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3086899860","body":"### 思路 \n遍历整个字符串,总共有四种可能,分别是 数字 字母 左括号 右括号\n1. 数字:定义`digit`存储读取到的数字\n2. 字母:可以直接读取累加至`res`\n3. 左括号:需要将前面的`res`和`digit`分别入栈,并将其赋为0和”“\n4. 右括号:读取栈顶元素,循环拼接后,累加至`res`\n### C++ 代码\n``` C++\nclass Solution {\npublic:\n string decodeString(string s) {\n stack numStack;\n stack strStack;\n int digit=0;\n string res=\"\";\n\n for(int i = 0; i < s.size(); i++){\n if(s.at(i) >= '0' && s.at(i) <= '9'){// 数字\n digit = digit*10+s.at(i)-'0';\n } else if(s.at(i) >= 'a' && s.at(i) <= 'z'){// 字符\n res += s.at(i);\n } else if(s.at(i) == '['){// 左括号\n numStack.push(digit);\n strStack.push(res);\n res = \"\";\n digit=0;\n } else {// 右括号\n int count = numStack.top();\n numStack.pop();\n string outString = strStack.top();\n strStack.pop();\n for(int i = 0; i < count; i++) outString += res;\n res = outString;\n }\n }\n return res;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092046146","body":"#### 思路\n\n1. `push`和`empty`可以直接进行操作。\n2. `pop`和 `peek`需要得到入栈的第一个元素,可以使用一个辅助栈,对第一个栈进行出栈同时第二个栈进行入栈操作,这样第二个栈`top`得到的元素就是第一个栈入栈的第一个元素。\n\n``` C++\nclass MyQueue {\npublic:\n stack tmp;\n stack stack;\n MyQueue() {\n }\n \n void push(int x) {\n tmp.push(x);\n }\n \n int pop() {\n while(!tmp.empty()){\n stack.push(tmp.top());\n tmp.pop();\n }\n int a = stack.top();\n stack.pop();\n while(!stack.empty()){\n tmp.push(stack.top());\n stack.pop();\n }\n return a;\n }\n \n int peek() {\n while(!tmp.empty()){\n stack.push(tmp.top());\n tmp.pop();\n }\n int a = stack.top();\n while(!stack.empty()){\n tmp.push(stack.top());\n stack.pop();\n }\n return a;\n }\n \n bool empty() {\n return tmp.empty();\n }\n};\n\n/**\n * Your MyQueue object will be instantiated and called as such:\n * MyQueue* obj = new MyQueue();\n * obj->push(x);\n * int param_2 = obj->pop();\n * int param_3 = obj->peek();\n * bool param_4 = obj->empty();\n */\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094511890","body":"#### 哈希\n\n```c++\nclass Solution {\npublic:\n int maxChunksToSorted(vector& arr) {\n unordered_map ans;\n vector tmp = arr;\n sort(tmp.begin(), tmp.end());\n int cnt=0;\n for(int i = 0; i < arr.size(); i++){\n ans[arr[i]]++;\n ans[tmp[i]]--;\n if(ans[arr[i]]==0) ans.erase(arr[i]);\n if(ans[tmp[i]]==0) ans.erase(tmp[i]);\n if(ans.empty()) cnt++;\n }\n return cnt;\n }\n};\n```\n时间复杂度 nlog(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095832085","body":"#### 思路\n\n先将链表变为首尾相连循环链表,然后通过`k`找到断开位置的前一个元素,断开,返回头节点即可。\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * struct ListNode *next;\n * };\n */\nstruct ListNode* rotateRight(struct ListNode* head, int k) {\n if(head==NULL || k==0) return head;\n int len=1;\n struct ListNode * p=head;\n if(p) len=1;\n while(p->next){\n len++;\n p = p->next;\n }\n //printf(\"%d\\n\", len);\n p->next = head;\n k = k%len;\n for(int i = 0; i < len-k-1; i++){\n head = head->next;\n }\n p = head->next;\n head->next = NULL;\n return p;\n}\n```\n\n时间复杂度O(n)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3102195778","body":"#### C代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * struct ListNode *next;\n * };\n */\nstruct ListNode* swapPairs(struct ListNode* head) {\n //struct ListNode Node;\n //Node.next = head;\n //struct ListNode* tmp = &Node;\n struct ListNode* Node=(struct ListNode*)malloc(sizeof(struct ListNode));\n Node->next = head;\n struct ListNode* tmp = Node;\n while(tmp->next && tmp->next->next){\n struct ListNode* first = tmp->next;\n struct ListNode* second = tmp->next->next;\n tmp->next = second;\n first->next = second->next;\n second->next = first;\n tmp = first;\n }\n return Node->next;\n}\n```\n\n时间复杂度O(n)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3106692662","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode() : val(0), next(nullptr) {}\n * ListNode(int x) : val(x), next(nullptr) {}\n * ListNode(int x, ListNode *next) : val(x), next(next) {}\n * };\n */\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n TreeNode* sortedListToBST(ListNode* head) {\n if(head==NULL) return NULL;\n int n = 0;\n for(auto p=head; p; p=p->next){\n n++;\n }\n if(n==1) return new TreeNode(head->val);\n auto cur = head;\n for(int i = 0; i < n/2-1; i++) cur = cur->next;\n auto root = new TreeNode(cur->next->val);\n root->right = sortedListToBST(cur->next->next);\n cur->next = NULL;\n root->left = sortedListToBST(head);\n return root;\n }\n};\n```\n\n时间复杂度O(nlog(n))","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112024319","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode(int x) : val(x), next(NULL) {}\n * };\n */\nclass Solution {\npublic:\n ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {\n if(headA==NULL || headB==NULL) return NULL;\n ListNode *a = headA, *b = headB;\n while(a!=b){\n if(a == NULL) a = headB;\n a = a->next;\n if(b == NULL) b = headA;\n b = b->next;\n }\n return a;\n }\n};\n```\n\n时间复杂度O(n+m)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116982615","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode(int x) : val(x), next(NULL) {}\n * };\n */\nclass Solution {\npublic:\n ListNode *detectCycle(ListNode *head) {\n unordered_map visit;\n while(head){\n visit[head]++;\n if(visit[head]==2) return head;\n head=head->next;\n } \n return NULL;\n }\n};\n```\n\n时间复杂度O(n)\n\n空间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121297965","body":"#### C++代码\n\n- hash表: `unordered_map hash;`\n- 双向链表用来 将`Node` 根据 使用时间 进行排序。靠近左端表示最近使用,靠近右端表示较长时间没有使用。\n\n``` c\nclass LRUCache {\npublic:\n struct Node {\n int key, val;\n Node *prev, *next;\n Node(int _key, int _val): key(_key), val(_val), prev(NULL), next(NULL){}\n }*L, *R; //L头节点 R尾节点\n\n unordered_map hash;\n int n;\n\n void delete_node(Node *p){\n p->next->prev = p->prev;\n p->prev->next = p->next;\n }\n\n void insert_node(Node *p){ //链表头插入\n p->next = L->next;\n L->next->prev = p;\n p->prev = L;\n L->next = p;\n }\n\n LRUCache(int capacity) {\n n = capacity;\n L = new Node(-1, -1);\n R = new Node(-1, -1);\n L->next = R;\n R->prev = L;\n }\n \n int get(int key) {\n if(!hash.count(key)) return -1;\n else{\n auto p = hash[key];\n delete_node(p);\n insert_node(p);\n return p->val;\n }\n }\n \n void put(int key, int value) {\n if(!hash.count(key)){\n if(hash.size()==n){\n auto p = R->prev;\n delete_node(p);\n hash.erase(p->key);\n }\n auto p = new Node(key, value);\n hash[key] = p;\n insert_node(p);\n }else {\n auto p = hash[key];\n p->val = value;\n delete_node(p);\n insert_node(p);\n }\n }\n};\n\n/**\n * Your LRUCache object will be instantiated and called as such:\n * LRUCache* obj = new LRUCache(capacity);\n * int param_1 = obj->get(key);\n * obj->put(key,value);\n */\n```\n\n时间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124142122","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n int maxDepth(TreeNode* root) {\n if(root == NULL) return 0;\n return max(maxDepth(root->left), maxDepth(root->right)) + 1;\n }\n};\n```\n\n时间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125702334","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n bool isSameTree(TreeNode* p, TreeNode* q) {\n if(p==NULL && q==NULL) return true;\n else if(p==NULL && q!=NULL) return false;\n else if(p!=NULL && q==NULL) return false;\n else if(q->val != p->val) return false;\n else return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);\n }\n};\n```\n\n时间复杂度O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130752830","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n int dfs(TreeNode *root, int sum) {\n if(root == nullptr) return 0;\n int tmp = sum*10+root->val;\n if(root->left==nullptr && root->right==nullptr) return tmp;\n return dfs(root->left, tmp) + dfs(root->right, tmp);\n }\n int sumNumbers(TreeNode* root) {\n return dfs(root, 0);\n }\n};\n```\n\n时间复杂度O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135775890","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n void dfs(TreeNode* root, int height, int &curVal, int &curHeight){\n if(root==nullptr) return ;\n height++;\n dfs(root->left, height, curVal, curHeight);\n dfs(root->right, height, curVal, curHeight);\n if (height > curHeight) {\n curHeight = height;\n curVal = root->val;\n }\n }\n int findBottomLeftValue(TreeNode* root) {\n int curVal=0, curHeight=0;\n dfs(root, 0, curVal, curHeight);\n return curVal;\n }\n};\n```\n\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3139476046","body":"#### C++代码\n\n``` c\nclass Codec {\npublic:\n\n // Encodes a tree to a single string.\n void rserialize(TreeNode* root, string& str) {\n // 前序遍历(中左右,遇到空节点输入None),用逗号隔开\n if (root == NULL) str += \"None,\";\n else {\n str += to_string(root->val) + \",\";\n rserialize(root->left, str);\n rserialize(root->right, str);\n } \n }\n string serialize(TreeNode* root) {\n string ret;\n rserialize(root, ret);\n return ret;\n }\n\n // Decodes your encoded data to tree.\n\n TreeNode* rdeserialize(list& dataArray) {\n if(dataArray.front() == \"None\") {\n dataArray.erase(dataArray.begin());\n return NULL;\n }\n // 前序遍历(中左右)恢复树结构\n TreeNode* root = new TreeNode(stoi(dataArray.front()));\n dataArray.erase(dataArray.begin());\n root->left = rdeserialize(dataArray);\n root->right = rdeserialize(dataArray);\n return root;\n }\n\n TreeNode* deserialize(string data) {\n list dataArray;\n string str;\n // 添加各节点val\n // 按引用传递,按值传递会增加耗时\n for (auto& c : data) {\n if (c == ',') {\n // 以逗号作为节点分割\n dataArray.push_back(str);\n str.clear();\n } else {\n str.push_back(c);\n }\n }\n // 添加尾部节点val\n if (!str.empty()) {\n dataArray.push_back(str);\n str.clear();\n }\n return rdeserialize(dataArray);\n }\n};\n\n\n//参考链接:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/solutions/1536508/by-peaceful-thompsonfsu-8143/\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144061296","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n // 深度优先搜索函数 参数:当前节点、当前行号、当前列号、存储节点信息的map\n void dfs(TreeNode* node, int row, int col, map>>& colNodes) {\n // 若节点为空,直接返回\n if (node == nullptr) {\n return;\n }\n \n // 记录当前节点的信息:(行号, 值) 存入对应列的列表中\n colNodes[col].push_back({row, node->val});\n \n // 递归处理左子树:行号+1,列号-1\n dfs(node->left, row + 1, col - 1, colNodes);\n \n // 递归处理右子树:行号+1,列号+1\n dfs(node->right, row + 1, col + 1, colNodes);\n }\n\n // 自定义比较函数:用于对同一列的节点进行排序\n static bool compareNodes(const pair& a, const pair& b) {\n // 若行号相同,按节点值从小到大排序\n if (a.first == b.first) {\n return a.second < b.second;\n }\n // 否则按行号从小到大排序\n return a.first < b.first;\n }\n\n vector> verticalTraversal(TreeNode* root) {\n // 存储列号到节点信息的映射:key=列号,value=该列所有节点的(行号, 值)\n map>> colNodes;\n \n // 深度优先遍历树,记录每个节点的位置和值\n dfs(root, 0, 0, colNodes);\n \n // 最终结果容器\n vector> result;\n \n // 遍历每一列\n for (auto& entry : colNodes) {\n // 对当前列的节点按规则排序(使用自定义比较函数)\n sort(entry.second.begin(), entry.second.end(), compareNodes);\n \n // 提取排序后的节点值,组成当前列的结果\n vector colValues;\n for (auto& node : entry.second) {\n colValues.push_back(node.second); // node.second是节点值\n }\n result.push_back(colValues);\n }\n \n return result;\n }\n};\n\n//参考链接:https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/solutions/3739810/dui-wo-lai-shuo-huan-shi-fu-za-liao-xie-iar46/\n\n```\n\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146382948","body":"#### C++代码\n\n``` c\nclass Solution {\npublic:\n vector twoSum(vector& nums, int target) {\n unordered_map hash;\n for(int i = 0; i < nums.size(); i++){\n auto iter = hash.find(target-nums[i]);\n if(iter != hash.end()) return {iter->second, i};\n hash[nums[i]] = i;\n }\n return {};\n }\n};\n```\n\n时间复杂度:O(n)\n\n空间复杂度:O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148379333","body":"#### C++\n\n``` c\nclass Solution {\npublic:\n vector topKFrequent(vector& nums, int k) {\n vector ans;\n unordered_map f;\n for(int i = 0;i < nums.size();i++) {\n f[nums[i]]++;\n }\n priority_queue, vector >, greater > > q;\n for(auto& [num, count] : f) {\n if(q.size() < k)\n q.push({count, num});\n else {\n if(q.top().first < count) {\n q.pop();\n q.push({count, num});\n }\n }\n }\n while(!q.empty()) {\n //cout<>& points) {\n int result=0;\n for(vector P : points){\n unordered_map map;\n for(vector Q : points){\n int dis = (P[0]-Q[0])*(P[0]-Q[0])+(P[1]-Q[1])*(P[1]-Q[1]);\n map[dis]++;\n }\n for(auto [a,b] : map){\n result+=b*(b-1);\n }\n }\n return result;\n }\n};\n```\n\n时间复杂度:O(n2)\n空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3154861022","body":"``` c\nclass Solution {\npublic:\n int lengthOfLongestSubstring(string s) {\n unordered_map dic;\n int i = -1, res = 0, len = s.size();\n for(int j = 0; j < len; j++) {\n if (dic.find(s[j]) != dic.end())\n i = max(i, dic.find(s[j])->second);\n dic[s[j]] = j;\n res = max(res, j - i);\n }\n return res;\n }\n};\n```\n\n时间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3158408178","body":"\n\n``` c\nclass Solution {\npublic:\n vector findSubstring(string s, vector& words) {\n unordered_map hash;\n vector res;\n int n = s.length(), m = words.size();\n if (n == 0 || m == 0)\n return res;\n int len = words[0].length(), end = n - m * len;\n if (n < m * len)\n return res;\n for (auto word : words)\n hash[word]++;\n int size = hash.size();\n for (int k = 0; k < len; k++) {\n unordered_map cur_hash;\n int satisfy = 0;\n for (int i = k, j = k; j <= n - len;) {\n string cur = s.substr(j, len);\n if (hash.find(cur) == hash.end()) {\n j = j + len;\n i = j;\n cur_hash.clear();\n satisfy = 0;\n } else {\n cur_hash[cur]++;\n if (cur_hash[cur] == hash[cur])\n satisfy++;\n else if (cur_hash[cur] > hash[cur]) {\n while (i < j && cur_hash[cur] > hash[cur]) {\n string temp = s.substr(i, len);\n i += len;\n cur_hash[temp]--;\n if (cur_hash[temp] == hash[temp] - 1)\n satisfy--;\n }\n }\n if (satisfy == size) {\n string temp = s.substr(i, len);\n cur_hash[temp]--;\n satisfy--;\n res.push_back(i);\n i = i + len;\n }\n j = j + len;\n }\n }\n }\n return res;\n }\n};\n```\n\n时间复杂度O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3163210992","body":"\n\n``` c\nclass Solution {\npublic:\n int minSubarray(vector &nums, int p) {\n int n = nums.size(), s[n + 1];\n s[0] = 0;\n for (int i = 0; i < n; i++) s[i + 1] = (s[i] + nums[i]) % p;\n int x = s[n];\n\n int ans = n;\n unordered_map last;\n for (int i = 0; i <= n; ++i) {\n last[s[i]] = i;\n auto it = last.find((s[i] - x + p) % p);\n if (it != last.end()) {\n ans = min(ans, i - it->second);\n }\n }\n return ans < n ? ans : -1;\n }\n};\n```\n\n时间复杂度O(n)\n空间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3167368429","body":"\n\n``` c\nclass Solution {\npublic:\n ListNode* middleNode(ListNode* head) {\n int len = 0;\n ListNode* p = head;\n while (p != nullptr) {\n len++;\n p = p->next;\n }\n int k = 0;\n p = head;\n while (k < len / 2) {\n k++;\n p = p->next;\n }\n return p;\n }\n};\n```\n\n时间复杂度O(n)\n空间复杂度O(1)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169793378","body":"```c\nclass Solution {\npublic:\n int removeDuplicates(vector& nums) {\n if (nums.empty()) {\n return 0;\n }\n int slow = 0;\n for (int fast = 1; fast < nums.size(); fast++) {\n if (nums[fast] != nums[slow]) {\n slow++;\n nums[slow] = nums[fast];\n }\n }\n return slow + 1;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172513759","body":"```c\n\nclass Solution {\npublic:\n int searchInsert(vector& nums, int target) {\n int n = nums.size();\n int left = 0, right = n - 1, ans = n;\n while (left <= right) {\n int mid = ((right - left) / 2) + left;\n if (target <= nums[mid]) {\n ans = mid;\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n return ans;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173606055","body":"```c\nclass Solution {\npublic:\n vector maxSlidingWindow(vector& nums, int k) {\n if(nums.size() == 0 || k == 0) return {};\n deque deque;\n vector res(nums.size() - k + 1);\n for(int j = 0, i = 1 - k; j < nums.size(); i++, j++) {\n if(i > 0 && deque.front() == nums[i - 1])\n deque.pop_front();\n while(!deque.empty() && deque.back() < nums[j])\n deque.pop_back();\n deque.push_back(nums[j]);\n if(i >= 0)\n res[i] = deque.front();\n }\n return res;\n }\n }\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178242802","body":"```c\nclass Solution {\npublic:\n int findJudge(int n, vector>& trust) {\n vector inDegrees(n + 1);\n vector outDegrees(n + 1);\n for (auto& edge : trust) {\n int x = edge[0], y = edge[1];\n ++inDegrees[y];\n ++outDegrees[x];\n }\n for (int i = 1; i <= n; ++i) {\n if (inDegrees[i] == n - 1 && outDegrees[i] == 0) {\n return i;\n }\n }\n return -1;\n }\n};\n\n```","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3213208919","body":"```C++\nclass Solution {\npublic:\n bool judgeCircle(string moves) {\n int R=0,L=0,U=0,D=0;\n for(int i = 0; i < moves.size(); i++){\n if(moves[i]=='R') R++;\n if(moves[i]=='L') L++;\n if(moves[i]=='U') U++;\n if(moves[i]=='D') D++;\n }\n if(R==L&&U==D) return true;\n else return false;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193632408","body":"```c\n\nclass Solution {\npublic:\n vector getOrder(vector>& tasks) {\n long now = 0; \n priority_queue, vector>, greater> >entry, ready;\n int size = tasks.size();\n\n for (int i = 0; i < size; ++i){\n entry.push(make_pair(tasks[i][0], i));\n }\n\n vector res;\n while(!entry.empty() or !ready.empty()){\n if (ready.empty()){\n now = entry.top().first;\n while (!entry.empty() && now == entry.top().first){ \n ready.push(make_pair(tasks[entry.top().second][1], entry.top().second));\n entry.pop();\n }\n }\n res.emplace_back(ready.top().second);\n now += ready.top().first;\n ready.pop();\n\n while(!entry.empty() && entry.top().first <= now){ \n ready.push(make_pair(tasks[entry.top().second][1], entry.top().second));\n entry.pop();\n }\n }\n\n return res;\n }\n};\n\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3213243204","body":"```C++\nclass Solution {\npublic:\n int numberOfRounds(string startTime, string finishTime) {\n // 转化为分钟\n int t0 = 60 * stoi(startTime.substr(0, 2)) + stoi(startTime.substr(3, 2));\n int t1 = 60 * stoi(finishTime.substr(0, 2)) + stoi(finishTime.substr(3, 2));\n if (t1 < t0){\n t1 += 1440;\n }\n // 第一个小于等于 finishTime 的完整对局的结束时间\n t1 = t1 / 15 * 15;\n return max(0, (t1 - t0)) / 15;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3213232703","body":"```C++\nclass Solution {\npublic:\n int minCharacters(string a, string b) {\n int n = a.size(), m = b.size();\n vector cntA(26, 0), cntB(26, 0);\n for (char c : a)\n ++cntA[c - 'a'];\n for (char c : b)\n ++cntB[c - 'a'];\n\n // 计算前缀和\n vector preA(27, 0), preB(27, 0);\n for (int i = 0; i < 26; ++i) {\n preA[i + 1] = preA[i] + cntA[i];\n preB[i + 1] = preB[i] + cntB[i];\n }\n\n int ans = INT_MAX;\n\n // 条件 1\n for (int k = 1; k < 26; ++k) {\n int costA = n - preA[k];\n int costB = preB[k];\n ans = min(ans, costA + costB);\n }\n\n // 条件 2\n for (int k = 0; k < 25; ++k) {\n int costA = preA[k + 1];\n int costB = m - preB[k + 1];\n ans = min(ans, costA + costB);\n }\n\n // 条件 3\n for (int ch = 0; ch < 26; ++ch) {\n int costA = n - cntA[ch];\n int costB = m - cntB[ch];\n ans = min(ans, costA + costB);\n }\n\n return ans;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3213189716","body":"```c++\nclass Solution {\npublic:\n vector sortArray(vector& nums) {\n if (nums.empty()) return nums;\n quickSort(nums, 0, static_cast(nums.size()) - 1);\n return nums;\n }\n\nprivate:\n void quickSort(vector& nums, int l, int r) {\n if (l >= r) return;\n int p = partition(nums, l, r);\n quickSort(nums, l, p - 1);\n quickSort(nums, p + 1, r);\n }\n\n int partition(vector& nums, int l, int r) {\n int idx = l + rand() % (r - l + 1);\n swap(nums[idx], nums[r]);\n int pivot = nums[r];\n\n int i = l - 1;\n for (int j = l; j < r; ++j) {\n if (nums[j] < pivot) {\n ++i;\n swap(nums[i], nums[j]);\n }\n }\n swap(nums[i + 1], nums[r]);\n return i + 1;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3213176894","body":"```c++\nclass Solution {\npublic:\n int mySqrt(int x) {\n int l = 0, r = x, ans=0;\n while(l<=r){\n int mid = l + (r-l)/2;\n if((long long)mid*mid<=x){\n ans = mid;\n l = mid+1;\n } else{\n //ans = mid;\n r = mid-1;\n }\n \n }\n return ans;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3213126368","body":"```c++\nclass Solution {\npublic:\n int firstBadVersion(int n) {\n int l = 1, r = n;\n while(l w;\n\n int reversePairs(vector& nums) {\n return merge_sort(nums, 0, nums.size()-1);\n }\n\n int merge_sort(vector &nums, int l, int r) {\n if(l>=r) return 0;\n int mid = l+r>>1;\n int res = merge_sort(nums, l, mid) + merge_sort(nums, mid+1, r);\n for(int i = l, j = mid+1; i <= mid; i++){\n while(j<=r && nums[j]*2ll& houses, vector& heaters) {\n for (int i = 0, j = 0; i < houses.size(); i ++ ) {\n while (j < heaters.size() && abs(heaters[j] - houses[i]) > mid)\n j ++ ;\n if (j >= heaters.size()) return false;\n }\n return true;\n }\n\n int findRadius(vector& houses, vector& heaters) {\n sort(houses.begin(), houses.end());\n sort(heaters.begin(), heaters.end());\n int l = 0, r = INT_MAX;\n while (l < r) {\n int mid = (long long)l + r >> 1;\n if (check(mid, houses, heaters)) r = mid;\n else l = mid + 1;\n }\n return r;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217486441","body":"```C++\nclass Solution {\npublic:\n bool check(vector& nums,int n,int k,int mid)\n {\n int cnt = 0;\n for(int i = 0,j = 1; i < n - 1 ; i ++)\n {\n while(j < n && nums[j] - nums[i] <= mid)\n j ++;\n cnt += j - i - 1;\n j = max(j,i + 1);\n }\n return cnt >= k;\n }\n int smallestDistancePair(vector& nums, int k)\n {\n int n = nums.size();\n sort(nums.begin(),nums.end());\n int left = 0,right = nums[n - 1] - nums[0];\n while(left < right)\n {\n int mid = (left + right) >> 1;\n if(check(nums,n,k,mid)) right = mid;\n else left = mid + 1;\n }\n return left;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3219872784","body":"```C++\nclass Solution {\npublic:\n int swimInWater(vector>& grid) {\n int m = grid.size(), n = grid[0].size();\n vector> dis(m, vector(n, INT_MAX));\n dis[0][0] = grid[0][0];\n vector> dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};\n priority_queue, vector>, greater<>> pq;\n pq.emplace(grid[0][0], 0, 0);\n while (!pq.empty()) {\n auto [d, x, y] = pq.top();\n pq.pop();\n if (x == m - 1 && y == n - 1) {\n return d;\n }\n if (d > dis[x][y]) {\n continue;\n }\n for (auto& dir : dirs) {\n int nx = x + dir[0], ny = y + dir[1];\n if (nx >= 0 && nx < m && ny >= 0 && ny < n) {\n int nd = max(d, grid[nx][ny]);\n if (nd < dis[nx][ny] ) {\n dis[nx][ny] = nd;\n pq.emplace(nd, nx, ny);\n }\n }\n }\n }\n return -1;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3223228330","body":"```C++\nclass Solution {\npublic:\n bool pd(char a){\n if(a == 'a'||a == 'e'||a == 'i'||a == 'o'||a == 'u') return true;\n return false;\n }\n int maxVowels(string s, int k) {\n int count = 0, cnt=0;\n int l = 0, r = k-1;\n for(int i = 0; i <= r; i++) if(pd(s.at(i))) count++;\n cnt = count;\n if(s.size() == k) return count;\n while(++r != s.size()){\n if(pd(s.at(l))) count--;\n if(pd(s.at(r))) count++;\n l++;\n cnt = max(cnt, count);\n }\n return cnt;\n }\n};\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243929010","body":"```C++\nclass Solution {\npublic:\n int getArea(vector>& grid, int i, int j) {\n if (i == grid.size() || i < 0)\n return 0;\n else if (j == grid[0].size() || j < 0)\n return 0;\n if (grid[i][j] == 1) {\n grid[i][j] = 0;\n return 1 + getArea(grid, i + 1, j) + getArea(grid, i - 1, j) +\n getArea(grid, i, j + 1) + getArea(grid, i, j - 1);\n }\n return 0;\n }\n int maxAreaOfIsland(vector>& grid) {\n int maxArea = 0;\n int area = 0;\n for (int i = 0; i < grid.size(); i++) {\n for (int j = 0; j < grid[0].size(); j++) {\n if (grid[i][j] == 1) {\n area = getArea(grid, i, j);\n maxArea = maxArea > area ? maxArea : area;\n }\n }\n }\n return maxArea;\n }\n};\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3268602696","body":"```C++\nclass Solution {\npublic:\n int longestCommonSubsequence(string text1, string text2) {\n int n = (int)text1.size(), m = (int)text2.size();\n vector dp(m + 1, 0);\n for (int i = 1; i <= n; ++i) {\n int prev = 0; // 相当于 dp[i-1][j-1]\n for (int j = 1; j <= m; ++j) {\n int tmp = dp[j];\n if (text1[i - 1] == text2[j - 1]) dp[j] = prev + 1;\n else dp[j] = max(dp[j], dp[j - 1]);\n prev = tmp;\n }\n }\n return dp[m];\n }\n};\n\n```\n时间复杂度O(n*m)\n空间复杂度O(min(n,m))","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290572491","body":"```C++\nclass Solution {\npublic:\n int coinChange(vector& coins, int amount) {\n vector dp(amount+1,INT_MAX);\n dp[0]=0;\n for(int i=0;i Date: Wed, 1 Oct 2025 16:33:12 +0000 Subject: [PATCH 16/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From 76e4726b9ee96c7d10364f4533af4ae7814894f9 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 17:13:43 +0000 Subject: [PATCH 17/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index 0ed2b2a6f7..e7680d08fc 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759335546375,"lastFulllyUpdateTime":1759252393054},"checkIn":{"lastUpdateTime":1759335546463},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759338823597,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759338823687},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From 1b5f7f10a9444ae432f158c50f9508dbbc7395a1 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 17:24:04 +0000 Subject: [PATCH 18/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From 84de91799f5f372083828ba6884e32ff3b8fd29f Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 18:21:10 +0000 Subject: [PATCH 19/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index e7680d08fc..acb74c0c15 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759338823597,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759338823687},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759342870382,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759342870469},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From 64d98a8ad8d01d96c64bcdc7ab2c6452c9d1dad4 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 18:36:49 +0000 Subject: [PATCH 20/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From f1486357f654d7528d389c1b25e5d74d678d0750 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 19:11:57 +0000 Subject: [PATCH 21/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index acb74c0c15..d8f78b29cd 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759342870382,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759342870469},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759345917644,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759345917745},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From 4bf4a5c91687a22bd0ac8fb6f7b65392e4db2de5 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 19:20:19 +0000 Subject: [PATCH 22/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From a6e2f63834777be6f348b9e80518865a38fc6b64 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 20:16:33 +0000 Subject: [PATCH 23/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index d8f78b29cd..4fcd78c342 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759345917644,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759345917745},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759349793132,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759349793214},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From 9cf511ab87e37841cbb16a2962e9a32b19d758d4 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 20:28:20 +0000 Subject: [PATCH 24/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From c8c878a7cd1fdfef11de278f16c329c673c93704 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 21:13:14 +0000 Subject: [PATCH 25/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index 4fcd78c342..c194cfa080 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759349793132,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759349793214},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759353194659,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759353194744},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From 62a2d9dca099a8d0ea5e508c000ee273731a0fef Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 21:23:07 +0000 Subject: [PATCH 26/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From 87519118b904fbefcd0d1d9c5c5beac19e5b5c1d Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 22:13:19 +0000 Subject: [PATCH 27/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index c194cfa080..d0fa060d9b 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759353194659,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759353194744},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759356799311,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759356799395},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From c899164f01a2813eb4cf15898790f1950e4bbd6a Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 22:25:20 +0000 Subject: [PATCH 28/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From 70ce1d06428dc5b2ad423426f851b8e18e10e557 Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 23:12:52 +0000 Subject: [PATCH 29/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index d0fa060d9b..f5250b1cc7 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759356799311,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759356799395},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759360372404,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759360372486},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From f54b9f5d87e25853dae2ac55657bb08d1c6fd2fc Mon Sep 17 00:00:00 2001 From: robot Date: Wed, 1 Oct 2025 23:22:17 +0000 Subject: [PATCH 30/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From 0d438d7c2cdc07ffe7f972fecc473879f76a311e Mon Sep 17 00:00:00 2001 From: robot Date: Thu, 2 Oct 2025 01:08:25 +0000 Subject: [PATCH 31/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index f5250b1cc7..52b2c0285d 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759360372404,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759360372486},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759367305033,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759367305121},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From 6f9ba6ea9fadde2dbb30f31df269dd30929d801f Mon Sep 17 00:00:00 2001 From: robot Date: Thu, 2 Oct 2025 01:55:36 +0000 Subject: [PATCH 32/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From 56463ffa3d9640c9f82fe6d581ea03ba564e4541 Mon Sep 17 00:00:00 2001 From: robot Date: Thu, 2 Oct 2025 02:53:42 +0000 Subject: [PATCH 33/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------ static/meta.json | 2 +- static/my/solutions.json | 2 +- static/users/index.json | 2 +- 4 files changed, 109 insertions(+), 94 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index 52b2c0285d..8ad4b8d8bd 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759367305033,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759367305121},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759373622704,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759373622784},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file diff --git a/static/my/solutions.json b/static/my/solutions.json index 15ba8886c1..9a73f7e57d 100644 --- a/static/my/solutions.json +++ b/static/my/solutions.json @@ -1 +1 @@ -{"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[],"10":[],"11":[],"12":[],"13":[],"14":[],"15":[],"16":[],"17":[],"18":[],"19":[],"20":[],"21":[],"22":[],"23":[],"24":[],"25":[],"26":[],"27":[],"28":[],"29":[],"30":[],"31":[],"32":[],"33":[],"34":[],"35":[],"36":[],"37":[],"38":[],"39":[],"40":[],"41":[],"42":[],"43":[],"44":[],"45":[],"46":[],"47":[],"48":[],"49":[],"50":[],"51":[],"52":[],"53":[],"54":[],"55":[],"56":[],"57":[],"58":[],"59":[],"60":[],"61":[],"62":[],"63":[],"64":[],"65":[],"66":[],"67":[],"68":[],"69":[],"70":[],"71":[],"72":[],"73":[],"74":[],"75":[],"76":[],"77":[],"78":[],"79":[],"80":[],"81":[],"82":[],"83":[],"84":[],"85":[],"86":[],"87":[],"88":[],"89":[],"90":[],"91":[],"839781960":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"954545647":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"1541732340":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"michaelxi3":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"darknightwriter":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"findlayzhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"laofuwf":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lbc546":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zch-bit":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"frankelzeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xingzhaodev":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joeymoso":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hackbl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"q815101630":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shiyishuoshuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aouos":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"thinkfurther":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wengzhouyunfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whisht":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bzlff":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzzkains":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chenmengyu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uancen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nuomituxedo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhongranherz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gr52":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hydelovegood":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nikojxie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fangxianshen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jokertzw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cyang258":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kernelsue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erikahuang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kuang-mou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"iloveqier":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"duke-github":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"caterpillar-0":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ashleyyma6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuki-yzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zpc7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yujian920":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kiirii4":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ucashurui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xixiao51":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"feikerwu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"heng518":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yaya-bb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tlntin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richypang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fenchuiyun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jerry-lllman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nickyk319":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"herbertpan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wsmmxmm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fan-svg":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuzejia":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunnyyujf":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"phoenixflyingsky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nehchsuy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lzyxts":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elainekuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ll491119940":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"2learnsomething":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ataraxyadong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wzasd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miluowzt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maylinglin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weijie-he":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brodxie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"y525":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"leungogogo":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074242240","body":"## Main Idea\nFirst, it looks like we can convert the array `num` to integer and add it to `k`, but `num.length <= 1E+4` so this approach will cause integer overflow. So we will have to do the addition in array form.\n\nThen the idea is to simulate the entire process, add each digit of `num` and `k` with a `carry` bit. We will terminate the loop when we run out of digits for both `num` and `k` and `carry == 0`.\n\n## Code\n```java\nclass Solution {\n public List addToArrayForm(int[] num, int k) {\n int n = num.length, carry = 0, i = n - 1;\n List res = new ArrayList<>();\n \n while (i >= 0 || k > 0 || carry > 0) {\n int kDigit = k % 10;\n k /= 10;\n int sum = i >= 0 ? carry + kDigit + num[i] : carry + kDigit;\n res.add(sum % 10);\n carry = sum >= 10 ? 1 : 0;\n --i;\n }\n \n Collections.reverse(res);\n return res;\n }\n}\n```\n\n## Complexity Analysis\nTime: `O(2*max(N, log(K)))`\n* Given a number `K`, its length will be `O(log_{2}(K))`, the time complexity depends on the length of `N` and `K`, whichever is longer.\n* Notice we want to insert digits at the end of the array and then reverse it after we finish the addition (reverse takes `O(res.size())`). If we insert at the head of array, then it will take `O(n^2)` of time.\n\nSpace: `O(1)`, as we didn't use additional spaces except the return array.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077454608","body":"#### Main Idea\nThe problem asks for the shortest distance from each character in a string s to a given character c. Since c may appear multiple times, we must compute the shortest distance to any occurrence of c for each index.\n\nThe key idea is to perform two passes over the string:\n\nLeft-to-right pass: Calculate distance from the nearest c to the left.\n\nRight-to-left pass: Refine the distance by checking for any closer c on the right.\n\nBy using two passes, we can efficiently compute the minimal distance to the nearest c for each character.\n\n#### Code\n\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n int n = s.length();\n int[] dist = new int[n];\n Arrays.fill(dist, Integer.MAX_VALUE);\n for (int i = 0; i < n; ++i) {\n if (s.charAt(i) == c) {\n dist[i] = 0;\n } else if (i > 0 && dist[i - 1] < Integer.MAX_VALUE) {\n dist[i] = dist[i - 1] + 1;\n }\n }\n\n for (int i = n - 1; i >= 0; --i) {\n if (i < n - 1 && dist[i + 1] != Integer.MAX_VALUE) {\n dist[i] = Math.min(dist[i], dist[i + 1] + 1);\n }\n }\n\n return dist;\n }\n}\n```\n\n#### Complexity\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082949045","body":"## Main Idea\nA stack can be implemented with an array, but usually we only have access to stack top due to encapsulation, while we can actually access/modify any elements in the array internally.\n\nWe can implement the stack API with `array`:\n* `push()`: append at the end of array (`O(1)`)\n* `pop()`: remove the end of array (`O(1)`)\n* `increment()`: use a for loop to increment `array[0:k]` (`O(k)`).\n\n### Optimization. Range Update && Lazy Evaluation\nNotice the time complexity of `increment()` is too high due to range update, and we can use a difference array to optimize it.\n\nAlso we don't really care about the values of elements until we `pop` them, so we can evaluate them when we pop them out of the stack.\n\n## Code\n```java\nclass CustomStack {\n private Deque stack;\n private int[] arr;\n public CustomStack(int maxSize) {\n stack = new ArrayDeque<>();\n arr = new int[maxSize];\n }\n \n public void push(int x) {\n if (stack.size() < arr.length) {\n stack.push(x);\n } \n }\n \n public int pop() {\n if (stack.isEmpty()) {\n return -1;\n }\n int index = stack.size() - 1, ret = stack.pop() + arr[index];\n if (index > 0) {\n arr[index - 1] += arr[index];\n }\n arr[index] = 0;\n return ret;\n }\n \n public void increment(int k, int val) {\n k = Math.min(k - 1, stack.size() - 1);\n if (k >= 0) {\n arr[k] += val;\n }\n }\n}\n```\n## Complexity Analysis\nTime: `O(1)` for all operations\nSpace: `O(n)` as we used 2 arrays.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087312725","body":"### Main Idea\n\nStoring everything in one stack will lead to so many pushes/pops, so we can use two stacks, one stack for string, one stack for number.\n\nIterate the input string:\n\n* If `str[i]` is a number, parse the number, push that number to number stack, and push current string to string stack, then empty the string to start over.\n* If `str[i]` is a closed bracket, then we pop the number stack to get `count`, pop the string stack to get `str`, then append the current string with `count` times to the `str`.\n* Else, append the character to current string.\n\n### Code\n\n* Java\n\n```java\nclass Solution {\n public String decodeString(String s) {\n int n = s.length();\n Deque strStack = new ArrayDeque<>();\n Deque numStack = new ArrayDeque<>();\n StringBuilder sb = new StringBuilder();\n \n for (int i = 0; i < n; i++) {\n if (Character.isDigit(s.charAt(i))) {\n int j = i + 1;\n while (Character.isDigit(s.charAt(j))) {\n j++;\n }\n int count = Integer.parseInt(s.substring(i, j));\n numStack.push(count);\n strStack.push(sb);\n sb = new StringBuilder();\n i = j - 1;\n } else if (s.charAt(i) == ']') {\n int count = numStack.pop();\n StringBuilder top = strStack.isEmpty() ? new StringBuilder() : strStack.pop();\n while (count-- > 0) {\n top.append(sb);\n }\n sb = top;\n } else {\n if (s.charAt(i) != '[') {\n sb.append(s.charAt(i));\n }\n }\n }\n \n return sb.toString();\n }\n}\n```\n\n### Complexity Analysis\n\nTime: `O(max(k) * n)`, each digit will be pushed/popped at most `max(k)` times","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092141722","body":"## Main Idea\nWe can use `stack1` as the input stack, and `stack2` as the output stack. \n\n* `push()`: Push to `stack1`, so this new element will be on the stack top of `stack1` (which is the end of our queue).\n* `pop()` and `peek()`: Since we use `stack2` as our output stack, when we call `pop()` or `peek()`:\n* If `stack2` is empty, we want to move all elements from `stack1` to `stack2`, and their order will be reversed, so the bottom of `stack1` will be the top of `stack2`, which is the head of our queue.\n* If not, then we have access to the top of `stack2` already.\n\n## Code\n\n```java\nclass MyQueue {\n Deque stack1;\n Deque stack2;\n \n public MyQueue() {\n stack1 = new ArrayDeque<>();\n stack2 = new ArrayDeque<>();\n }\n \n public void push(int x) {\n stack1.push(x);\n }\n \n public int pop() {\n if (stack2.isEmpty()) {\n move();\n }\n return stack2.pop();\n }\n \n public int peek() {\n if (stack2.isEmpty()) {\n move();\n }\n \n return stack2.peek();\n }\n \n public boolean empty() {\n return stack1.isEmpty() && stack2.isEmpty();\n }\n \n private void move() {\n while (!stack1.isEmpty()) {\n stack2.push(stack1.pop());\n }\n }\n}\n```\n## Complexity Analysis\nTime:\n* `push()`: `O(1)`\n* `pop()` and `peek()`: \n\t* The **worst case** of `pop()` and `peek()` will be `O(n)`, where we have to move all elements from `stack1` to `stack2`.\n\t* **Amortized Analysis**: Say we have `n` elements in `stack1`, and `0` elements in `stack2`, and we want to call `pop()` or `peek()` `n` times. The first call will take `n` operations to move all elements from `stack2` to `stack1`. But after the first call we will have at least `n - 1` elemetns in `stack2`, which makes the next `n - 1` calls `O(1)`. So the amrotized time will be `O(n + 1 + 1 +...+1 / n) = O((2n-1)/n) = O(1)`.\n\nSpace: `O(1)`, the two stacks are given and we didn't use any extra spaces.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3093992695","body":"### Main Idea\nFor chunks `[c1, c2, c3, ..., cn]`, we have to maintain the property: `max(ci) <= min(cj)` if `i < j`. So we can create a monotonously increasing stack `stack` to **keep track of the max value for each previous chunk**. \n\nIf `arr[i] >= stack.peek()`, we can greedily create a new chunk and `stack.push(arr[i])`. Else, we need to find the previous chunk with max value smaller or equal to `arr[i]`, say `ck`, and we need to merge all the chunks `[c_k+1, ... c_cur]` with `arr[i]`.\n\nTo merge chunks, we can just pop all the max values representing those chunks off the stack, and push back the max among them (in our case, it will be stack top cuz this stack is increasing) as the max of the new chunk. \n\nFinally the size of the stack will be the number of chunks.\n### Code\n```java\nclass Solution {\n public int maxChunksToSorted(int[] arr) {\n int n = arr.length;\n Deque stack = new ArrayDeque<>();\n for (int num : arr) {\n int max = num;\n while (!stack.isEmpty() && stack.peek() > num) {\n max = Math.max(max, stack.pop());\n }\n stack.push(max);\n }\n return stack.size();\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095444824","body":"\n### Main Idea\n1. Find the length of the linked list. If `length == 0`, return `head`.\n2. If `k >= n`, then we can do `k = k % n` which doesn't affect the final result but reduce the number of rotations.\n3. Use two pointers to traverse the linked list to find the last kth element and its previous node.\n4. Modify the linked list.\n\n\n### Code\n```java\nclass Solution {\n public ListNode rotateRight(ListNode head, int k) {\n int n = getLength(head);\n if (n == 0) return head;\n k %= n;\n \n // Find the last kth element as new head\n ListNode fast = head, slow = head;\n for (int i = 0; i < k; ++i) {\n fast = fast.next;\n }\n \n while (fast.next != null) {\n fast = fast.next;\n slow = slow.next;\n }\n \n fast.next = head;\n ListNode newHead = slow.next;\n slow.next = null;\n return newHead;\n \n }\n \n private int getLength(ListNode head) {\n int len = 0;\n while (head != null) {\n ++len;\n head = head.next;\n }\n return len;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(1)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100701991","body":"### Main Idea\n1. If the current list has length smaller than 2, don't need to swap.\n2. Else, recursivly swap the list `head.next.next`, and the swap function should return the `next` node.\n3. Swap the current 2 nodes, `newHead = head.next`, `newHead.next = head` and `head.next = next`.\n\n### Code\n```java\nclass Solution {\n public ListNode swapPairs(ListNode head) {\n if (head == null || head.next == null) return head;\n ListNode next = swapPairs(head.next.next);\n ListNode newHead = head.next;\n newHead.next = head;\n head.next = next;\n return newHead;\n }\n}\n```\n\n### Complexity Analysis\n* Time: `O(n)`\n* Space: `O(n)` for the recursive call.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109183645","body":"### Main Idea\n1. Define `inOrder(int i, int j)` to be the problem of the converting `list[i:j]` to BST.\n2. Base case: if `i > j`, return `null`.\n3. Calculate `mid = i + (j - i) / 2`, left subtree will be `inOrder(i, mid - 1)`, and then we create our root with the current node `cur`, then the next node to create will be `cur.next`, and we build the right sutree with `inOrder(mid + 1, j)`.\n\n### Code\n```java\nclass Solution {\n private ListNode cur;\n public TreeNode sortedListToBST(ListNode head) {\n if (head == null) return null;\n cur = head;\n int n = getLength(head);\n return inOrder(0, n - 1);\n }\n\n private TreeNode inOrder(int l, int r) {\n if (l > r) return null;\n int m = l + (r - l) / 2;\n TreeNode left = inOrder(l, m - 1);\n TreeNode root = new TreeNode(cur.val);\n cur = cur.next;\n TreeNode right = inOrder(m + 1, r);\n root.left = left;\n root.right = right;\n return root;\n }\n\n private int getLength(ListNode head) {\n int cnt = 0;\n while (head != null) {\n head = head.next;\n ++cnt;\n }\n return cnt;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(logn)` for recursive calls.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112278406","body":"Say the length of `a_1` to `a_i` is `a`, `b_1` to `b_i` is `b`, and `c_1` to `c_n` is `c`. If there is no interseciton, then `c = 0`. And `a + b = b + a`. If there is an intersection, then `a + c + b = b + c + a`, and the two pointers will meet at the intersection point.\n```\npublic ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n ListNode h1 = headA, h2 = headB;\n while (h1 != h2) {\n\n h1 = h1 == null ? headB : h1.next;\n h2 = h2 == null ? headA : h2.next;\n }\n return h1; \n }\n```\n\nSo we can just go over both linked list once, and switch the pointers.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3118087746","body":"### Main Idea\nDefine two pointers `fast` and `slow`, each iteration, `fast` moves 2 steps forward while `slow` moves 1 step. If there is a cycle, then `fast` will equals `slow` eventually, and if not, we will exit the loop.\n\nIf a cycle is detected, we need to find the starting point. \n\n```\nfast = 2 * slow\n\nfast = l + n1 * c + t\nslow = l + n2 * c + t\n\n\nl + n1 * c + t = 2 * l + 2 * n2 * c + 2 * t\nl = n1 * c - 2 * n2 * c = c * (n1 - 2 * n2) = n' * c - t\n```\n\n```\n L\n-------- ----I-----\n | | D\n ----------\n```\n### Code\n```java\npublic class Solution {\n public ListNode detectCycle(ListNode head) {\n if (head == null) return null;\n ListNode fast = head, slow = head;\n while (fast != null && fast.next != null) {\n fast = fast.next.next;\n slow = slow.next;\n if (fast == slow) {\n while (slow != head) {\n slow = slow.next;\n head = head.next;\n }\n return head;\n }\n }\n return null;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(1)`","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3126063970","body":"### Main Idea\n* Base case 1, both `p` and `q` are `null`, return `true`.\n* Base case 2, else if either of them is `null` or their values are not equal, return `false`.\n* Recursive case: both left and right subtrees are equal.\n\n### Code\n```java\nclass Solution {\n public boolean isSameTree(TreeNode p, TreeNode q) {\n if (p == null && q == null) {\n return true;\n } else if (p == null || q == null || p.val != q.val) {\n return false;\n }\n return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n }\n}\n```\n\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(h) = O(n)`","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136827599","body":"### Main Idea\nThis problem is asking for the leftmost node of the last layer, and when it comes to traversal by layer, BFS comes in handy.\n\nIn a standard BFS algorithm, we use a queue to keep track of the nodes on each layer, we just need to modify the algorithm to record the first node of the current layer, and if we exit the loop from the current layer, that means this is the last layer, and the node we recorded will be the one we want to find.\n\n### Code\n```java\nclass Solution {\n public int findBottomLeftValue(TreeNode root) {\n Queue q = new ArrayDeque<>();\n q.offer(root);\n int res = 0;\n while (!q.isEmpty()) {\n res = q.peek().val;\n int size = q.size();\n for (int i = 0; i < size; ++i) {\n TreeNode n = q.poll();\n if (n.left != null) q.offer(n.left);\n if (n.right != null) q.offer(n.right);\n }\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144871038","body":"### main Idea\n1. We store `Pair` in our pq, where `TreeNode` is the node and `int[]` is its coordinate.\n2. Since we want to maintain the row order, we compare pairs by their row order, smaller row has higher priority.\n3. If row numbers are the same, we compare values, since we don't really care about the order we process columns each row.\n4. Use a map that maps `col` to `list` to store the node values.\n\n\n### Code\n* Java\n\n```java\nclass Solution {\n public List> verticalTraversal(TreeNode root) {\n // column -> list\n Map> map = new HashMap<>();\n PriorityQueue> queue = new PriorityQueue<>((p1, p2) -> {\n int loc1[] = p1.getValue();\n int loc2[] = p2.getValue();\n if (loc1[0] == loc2[0]) {\n return p1.getKey().val - p2.getKey().val;\n } else {\n return loc1[0] - loc2[0];\n }\n });\n queue.offer(new Pair(root, new int[] {0, 0}));\n while (!queue.isEmpty()) {\n int size = queue.size();\n for (int i = 0; i < size; ++i) {\n Pair p = queue.poll();\n TreeNode node = p.getKey();\n int loc[] = p.getValue();\n List list = map.getOrDefault(loc[1], new ArrayList<>());\n list.add(node.val);\n map.put(loc[1], list);\n if (node.left != null) {\n queue.offer(new Pair(node.left, new int[] {loc[0] + 1, loc[1] - 1}));\n }\n\n if (node.right != null) {\n queue.offer(new Pair(node.right, new int[] {loc[0] + 1, loc[1] + 1}));\n }\n }\n }\n\n List> res = new ArrayList<>();\n for (int i = -1000; i <= 1000; ++i) {\n if (map.containsKey(i)) {\n res.add(map.get(i));\n }\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(nlogn)`\nSpace: `O(n)`","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162435845","body":"```java\nclass Solution {\n public int minSubarray(int[] nums, int p) {\n int n = nums.length;\n long arraySum = Arrays.stream(nums).asLongStream().sum(); \n int targetRemainder = (int) (arraySum % p);\n if (targetRemainder == 0) {\n return 0;\n } else if (arraySum < p) {\n return -1;\n }\n \n Map remainderToIndex = new HashMap<>();\n remainderToIndex.put(0, -1);\n \n long preSum = 0;\n int minLen = Integer.MAX_VALUE;\n for (int i = 0; i < n; ++i) {\n preSum += nums[i];\n int remainder = (int) (preSum % p);\n int remainderToCheck = (int) (remainder - targetRemainder);\n if (remainderToCheck < 0) {\n remainderToCheck += p;\n }\n \n if (remainderToIndex.containsKey(remainderToCheck)) {\n int index = remainderToIndex.get(remainderToCheck);\n minLen = Math.min(minLen, i - index);\n }\n \n remainderToIndex.put(remainder, i);\n }\n \n return minLen >= n ? -1 : minLen;\n }\n}\n\n/*\n [3, 1, 4, 2], p = 6\n \n arraySum = 10, targetRemainder = 4\n \n preSum = 3,\n\n [3, 1, 4, 2] = 10\n \n [0, 3, 4, 8, 10]\n \n [7, ]\n \n Sum: 9 p=6\n \n a mod b = (a + b) mod b\n \n (S_j - S_i) mod p == sum mod p\n \n \n x mod p = a\n y mod p = b\n \n (x - y) mod p = a - b (if a >= b)\n a - b + p (if a < b)\n*/\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182362544","body":"## Method 1. BFS\n### Main Idea\nBasically, this problem is asking if we can mark the graph with 2 colors, where adjacent vertices can't have the same color.\n\nSo we can apply BFS to traverse the graph, say we mark a vertex `v` with color 1, then we have to mark all its neighbors with color 2. If any of them was marked color 1, then we know it's impossible to mark the graph with 2 colors, so we can return `false`.\n\nIf no such contradictions found, that means the graph can be 2-colored, so return `true`.\n### Code\n* Java\n\n```java\nclass Solution {\n public boolean possibleBipartition(int n, int[][] dislikes) {\n List[] graph = new ArrayList[n + 1];\n for (int i = 0; i <= n; ++i) graph[i] = new ArrayList<>();\n \n for (int[] edge : dislikes) {\n graph[edge[0]].add(edge[1]);\n graph[edge[1]].add(edge[0]);\n }\n \n int[] colors = new int[n + 1];\n for (int i = 1; i <= n; ++i) {\n if (colors[i] != 0) continue;\n Queue q = new ArrayDeque<>();\n q.offer(i);\n colors[i] = 1;\n while (!q.isEmpty()) {\n int size = q.size();\n while (size-- > 0) {\n int v = q.poll(), c = colors[v];\n for (int nei : graph[v]) {\n if (colors[nei] == c) return false;\n if (colors[nei] != 0) continue;\n colors[nei] = -1 * c;\n q.offer(nei);\n }\n }\n }\n }\n return true;\n }\n}\n```\n### Complexity Analysis\nTime: `O(E + V)`\n\nSpace: `O(E + V)`","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204204644","body":"```java\nclass Solution {\n public int mySqrt(int x) {\n int left = 0, right = x;\n\n while (left < right - 1) {\n int mid = left + (right - left) / 2;\n long midSquare = 1l * mid * mid;\n if (midSquare == x) {\n return mid;\n } else if (midSquare < x) {\n left = mid;\n } else {\n right = mid - 1;\n }\n }\n long rightSqaure = 1l * right * right;\n return rightSqaure > x ? left : right;\n }\n}\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222726555","body":"```java\nclass Solution {\n public int maxVowels(String s, int k) {\n String vowels = \"aeiou\";\n int n = s.length(), l = 0, r = 0, res = 0, cnt = 0;\n while (r < n) {\n while (r < n && r - l < k) {\n if (vowels.indexOf(s.charAt(r)) != -1) {\n ++cnt;\n }\n ++r;\n }\n\n res = Math.max(res, cnt);\n if (vowels.indexOf(s.charAt(l)) != -1) {\n --cnt;\n }\n ++l;\n }\n\n return res;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243695565","body":"```java\nclass Solution {\n public int maxAreaOfIsland(int[][] grid) {\n int m = grid.length, n = grid[0].length;\n int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};\n \n int ret = 0;\n for (int i = 0; i < m; i++) {\n for (int j = 0; j < n; j++) {\n if (grid[i][j] == 0) {\n continue;\n }\n \n Queue queue = new ArrayDeque<>();\n queue.offer(new int[] {i, j});\n grid[i][j] = 0;\n int area = 1;\n while (!queue.isEmpty()) {\n int[] loc = queue.poll();\n for (int[] dir : dirs) {\n int x = loc[0] + dir[0], y = loc[1] + dir[1];\n if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == 0) {\n continue;\n }\n queue.offer(new int[] {x, y});\n grid[x][y] = 0;\n area++;\n }\n }\n \n ret = Math.max(ret, area);\n }\n }\n \n return ret;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269054068","body":"## Method 1. DP + Count\n### Main Idea\nSimilar to the DP solution of the LIS problem, but we also need to count how many shorter subsequences contribute to each subsequence ending at index `i`.\n\nSo we define `dp[i][0]` to be the max len of subsequence ending at `i`, and `dp[i][1]` to be the number of shorter subsequences contributing to \n### Code\n* Java\n\n```java\nclass Solution {\n public int findNumberOfLIS(int[] nums) {\n int n = nums.length, res = 0, max = 0;\n // \n int[][] dp = new int[n][2];\n \n for (int i = 0; i < n; ++i) {\n dp[i][0] = 1;\n int cnt = 1;\n for (int j = 0; j < i; ++j) {\n if (nums[i] > nums[j]) {\n if (dp[j][0] + 1 > dp[i][0]) {\n dp[i][0] = dp[j][0] + 1;\n cnt = dp[j][1];\n } else if (dp[j][0] + 1 == dp[i][0]) {\n cnt += dp[j][1];\n }\n }\n }\n \n if (dp[i][0] > max) {\n max = dp[i][0];\n res = cnt;\n } else if (dp[i][0] == max) {\n res += cnt;\n }\n dp[i][1] = cnt;\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n^2)`\n\nSpace: `O(n)`","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3295757426","body":"```java\nclass Solution {\n public int change(int amount, int[] coins) {\n int n = coins.length;\n int[] dp1 = new int[amount + 1], dp2 = new int[amount +1];\n for (int i = 0; i < n; i++) {\n for (int j = 0; j <= amount; j++) {\n if (i == 0 || j == 0) {\n if (j % coins[i] == 0) {\n dp2[j] = 1;\n }\n continue;\n }\n \n if (j - coins[i] >= 0) {\n dp2[j] = dp1[j] + dp2[j - coins[i]];\n } else {\n dp2[j] = dp1[j];\n }\n }\n \n int[] tmp = dp1;\n dp1 = dp2;\n dp2 = tmp;\n }\n return dp1[amount];\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322650611","body":"```java\nclass Solution {\n public int[] singleNumber(int[] nums) {\n int xor = 0;\n for (int num : nums) {\n xor ^= num;\n }\n \n\n int rightmostBit = xor & (-xor);\n \n int num1 = 0, num2 = 0;\n for (int num : nums) {\n if ((num & rightmostBit) != 0) {\n num1 ^= num;\n } else {\n num2 ^= num;\n }\n }\n \n return new int[]{num1, num2};\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"suukii":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mirrors-cl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xqy97":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jakkiabc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyoneday":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chouqin99":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhaogeg111":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawnhu23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ye2222":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uyplayer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guixian001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"serena9":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"junzmer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hx-code":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"admu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xxiaomm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pgquestions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eldinzhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiangwenzhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawnwu6688":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tomtao626":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aiweng1981":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richard-lime":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"acoada":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"duanyaqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ccslience":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaiykk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cachezhou0617":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangtuo1999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cytrue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyryan-web":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"naomiwufzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuajingliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miss1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"johnxizhao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"incipe-win":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"revisegoal":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckysq999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dereklisdr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"perfqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mryao1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"likeyousmile":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhg1992":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liquanluo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aq666888":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"samlu-ecnu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhongxiangxiang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hatorimain":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"neado":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaojunjun1110":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wxleah":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunl1ght":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kerrhl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"orangejuz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flyzenr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"c1f2h3":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dlm001128":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuxy94":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aconcert":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"linjunhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hyqqq22":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yibenxiao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elon-lau":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nowkizzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gsgtgyb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"irenia111":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"suiyi8760":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"saltychess":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rabbit2010520":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ellie-wu05":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yopming":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckytwj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzz607":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zoulufeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xxoojs":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"okkband":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wyz999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hacker90":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ricjli":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luhaoling":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flaming-cl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gelxgx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gaominghao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jessie725":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lsunxh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lanceli424":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qycoder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qilin88":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hengheng-yun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"smz1995":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"size-of":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"moyuanhua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"9vivian88":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guxuehua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kirosola":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"biscuit279":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maoting":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"youzhaing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jawn-ha":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hanwangxxx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dujt-x":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"degndaixingqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gzgzgzgzgzgz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gentleman-goodman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xinyi-arch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zenwangzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"andyyxw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fourierhai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yangz001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mannnn6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"haoyangxie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chjillout":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wenjialu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mhcn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"coconutice":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jackgaoyuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xingzhan0312":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yufeng727":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fontendart":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yingchehu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cobayaz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tomato-tomato":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xfliudx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"djd28176":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xilutian":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xy147":[null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091443042","body":"### js代码\n```JavaScript\n\nvar MyQueue = function() {\n this.inStack = [];\n this.outStack = [];\n};\nMyQueue.prototype.push = function(x) {\n this.inStack.push(x);\n};\n\nMyQueue.prototype.pop = function() {\n if (!this.outStack.length) {\n this.in2out();\n }\n return this.outStack.pop();\n};\n\nMyQueue.prototype.peek = function() {\n if (!this.outStack.length) {\n this.in2out();\n }\n return this.outStack[this.outStack.length - 1];\n};\n\nMyQueue.prototype.empty = function() {\n return this.outStack.length === 0 && this.inStack.length === 0;\n};\n\nMyQueue.prototype.in2out = function() {\n while (this.inStack.length) {\n this.outStack.push(this.inStack.pop());\n }\n};\n\n```\n\n### 复杂度分析\n时间复杂度:O(1)\n空间复杂度:O(n)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3120847716","body":"```\nclass ListNode {\n constructor(key, value) {\n this.key = key\n this.value = value\n this.next = null\n this.prev = null\n }\n}\n\nclass LRUCache {\n constructor(capacity) {\n this.capacity = capacity\n this.hash = {}\n this.count = 0\n this.dummyHead = new ListNode()\n this.dummyTail = new ListNode()\n this.dummyHead.next = this.dummyTail\n this.dummyTail.prev = this.dummyHead\n }\n\n get(key) {\n let node = this.hash[key]\n if (node == null) return -1\n this.moveToHead(node)\n return node.value\n }\n\n put(key, value) {\n let node = this.hash[key]\n if (node == null) {\n if (this.count == this.capacity) {\n this.removeLRUItem()\n }\n let newNode = new ListNode(key, value)\n this.hash[key] = newNode\n this.addToHead(newNode)\n this.count++\n } else {\n node.value = value\n this.moveToHead(node)\n }\n }\n\n moveToHead(node) {\n this.removeFromList(node)\n this.addToHead(node)\n }\n \n removeFromList(node) {\n let temp1 = node.prev\n let temp2 = node.next\n temp1.next = temp2\n temp2.prev = temp1\n }\n\n addToHead(node) {\n node.prev = this.dummyHead\n node.next = this.dummyHead.next\n this.dummyHead.next.prev = node\n this.dummyHead.next = node\n }\n\n removeLRUItem() {\n let tail = this.popTail()\n delete this.hash[tail.key]\n this.count--\n }\n\n popTail() {\n let tail = this.dummyTail.prev\n this.removeFromList(tail)\n return tail\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146107002","body":"```const twoSum = (nums, target) => {\n const prevNums = {};\n\n for (let i = 0; i < nums.length; i++) {\n const curNum = nums[i];\n const targetNum = target - curNum;\n const targetNumIndex = prevNums[targetNum];\n if (targetNumIndex !== undefined) {\n return [targetNumIndex, i];\n } else {\n prevNums[curNum] = i;\n }\n }\n}```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3167532564","body":"### js代码\n```JavaScript\nvar middleNode = function(head) {\n let slow = fast = head\n while(fast && fast.next){\n slow = slow.next\n fast = fast.next.next\n }\n return slow\n};\n\n```\n\n### 复杂度分析\n时间复杂度:O(N)\n空间复杂度:O(1)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190926614","body":"### js代码\n```JavaScript\nvar judgeCircle = function(moves) {\n return moves.split('L').length === moves.split('R').length && moves.split('U').length === moves.split('D').length\n};\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"itsjacob":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shunanch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yppah-eb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"raychenlei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"woshichuanqilz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"willuuu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"christina-soda":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jia98shanliang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"user-vannnn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tobepellucid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"johnvsd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yueza":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawyuan97":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"victorhuang99":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cusanity":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jay-xzj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shiradaone":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xinyue-ma":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"taojin1992":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joyce94":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"steven72574":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tian-pengfei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"asuka1h":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaowangcoding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"james0608":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaneyang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"azl397985856":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whgsh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chengfengfengwang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bulingbulingbuling":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"c2tr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eden-ye":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"codingtrains":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"starorbiting":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mo-xiaoxiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"passengersa":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073445770","body":"思维:\n1、将数组num和k转换为字符,\n2、使用BigInt方法相加\n3、最后使用将相加得到转换为数字数组\n时间复杂度:O(n)\n代码:\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function (num, k) {\n let numStr = num.join('')\n let sum = BigInt(numStr) + BigInt(k)\n return sum.toString().split('').map(Number)\n};","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084084442","body":"时间复杂度:O(n)\n代码:\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.maxSize = maxSize;\n this.stack = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.stack.length < this.maxSize) {\n this.stack.push(x);\n }\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.stack.length === 0) {\n return -1;\n }\n return this.stack.pop();\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n const len = this.stack.length;\n const count = Math.min(k, len);\n for (let i = 0; i < count; i++) {\n this.stack[i] += val;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097108121","body":"思路:\n首先,计算链表的长度 n。\n接着,将 k 对 n 取模,因为旋转 n 次后链表会回到原来的状态,所以取模可以避免不必要的旋转操作。\n然后,找到新的链表头节点和尾节点。新的链表头节点是原链表中第 n - k 个节点,新的链表尾节点是原链表的最后一个节点。\n最后,将原链表的尾节点连接到原链表的头节点,形成一个环形链表,再从新的链表头节点处断开,得到旋转后的链表。\n时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表两次,第一次计算链表的长度,第二次找到新的链表头节点的前一个节点。\n代码:\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n // 定义链表节点类\nclass ListNode {\n constructor(val = 0, next = null) {\n this.val = val;\n this.next = next;\n }\n}\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n if (!head || !head.next) return head;\n\n // 计算链表的长度\n let n = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n n++;\n }\n\n // 对 k 取模\n k %= n;\n\n // 如果 k 为 0,说明不需要旋转,直接返回原链表\n if (k === 0) return head;\n\n // 找到新的链表头节点的前一个节点\n let newTail = head;\n for (let i = 0; i < n - k - 1; i++) {\n newTail = newTail.next;\n }\n\n // 新的链表头节点\n let newHead = newTail.next;\n\n // 断开原链表,形成新的链表\n newTail.next = null;\n tail.next = head;\n\n return newHead; \n};\n\n// 辅助函数:将数组转换为链表\nfunction arrayToList(arr) {\n if (arr.length === 0) return null;\n let head = new ListNode(arr[0]);\n let current = head;\n for (let i = 1; i < arr.length; i++) {\n current.next = new ListNode(arr[i]);\n current = current.next;\n }\n return head;\n}\n\n// 辅助函数:将链表转换为数组\nfunction listToArray(head) {\n let result = [];\n let current = head;\n while (current) {\n result.push(current.val);\n current = current.next;\n }\n return result;\n}","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shellylcooper":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"testplm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tom-zhouch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"skylarxu214":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"taihui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huaxueguakele":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yang-chenyu104":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mlking15":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"-3":[],"cyonline":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rzhao010":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zywang0":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jetery":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"klspta":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bookyue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jancerwu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"buer1121":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ceramickitten":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gg925407590":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alyenor":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chenming-cao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ggohem":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dark-volute":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ronething":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jmastella":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"paopaohua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dd2001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mayloveless":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuexi001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nineis7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"abby-xu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gsw9818":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaomingshixiaotang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"snmyj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flipn9":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wabw1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xqmmy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"a-pricity":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sclihuiming":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"amazeding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"astrking":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tzuikuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ringo1597":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brucezhang-utf-8":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luanxing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"moin-jer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lihua1997":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cuizezhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xuanaxuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tiandao043":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"restlessbreeze":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ruikiwi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huiminren":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"saitochen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wtdcai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"albert556":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wuxiaoshawn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zrtch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhuzhu096":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whoam-challenge":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weisday":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"syh-coder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaaller":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kyrie96521":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cavecrypto":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cxgbro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erjian96":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"a-polarbear":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alexno1no2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yetfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhiyuanpeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bwspsu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"arinzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mdge":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allenfeng666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yin02":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elsa-zhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"asur4s":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"littlesugarman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhihaowan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"apockira":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guowei0223":[null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077086971","body":"```\n首先需要找到所有c出现的index,存在c_index list里为后续的pointer搜索做好准备\npointer = 0 定义好pointer的起点\n遍历s,在c_index的范围内,对比pointer和pointer + 1 和s中各个位置的绝对距离,如果发现pointer和s的距离大于pointer +1,那么说明s的index已经走到了离pointer+1更近的距离,那么这时候我们更新pointer,+ 1, 指到下一个c_index中c的位置。\nres.append()c_index中pointer和s中index的距离\n\nclass Solution:\n def shortestToChar(self, s: str, c: str) -> List[int]:\n c_index = []\n for i in range(len(s)):\n if s[i] == c:\n c_index.append(i)\n pointer = 0\n res = []\n for i in range(len(s)):\n if pointer < len(c_index) -1:\n if abs(i-c_index[pointer])> abs(i-c_index[pointer+1]):\n pointer += 1\n res.append(abs(i-c_index[pointer]))\n return res\n\n因为用了指针,所以时间复杂度 O(n)。 空间复杂度 O(n)。 \n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087516204","body":"```\n使用栈的经典题型。遇见数字就num*10 + item处理。 遇见【 左括号说明要开始处理括号内部,用stack先存好之前已经处理的结果,遇见】后括号说明括号完成,则需要stack。pop()出保存的结果加上括号里的内容。是字母的话,则res+ item更新括号内信息。\n空间复杂度 O(n)\n时间复杂度 O(n)\n\nclass Solution:\n def decodeString(self, s: str) -> str:\n res = \"\"\n stack = []\n num = 0\n for item in s:\n if item.isdigit():\n num = num * 10 + int(item)\n elif item == \"[\":\n stack.append([num, res])\n num = 0\n res = \"\"\n elif item == \"]\":\n pre_num, pre_res = stack.pop()\n res = pre_res + pre_num * res\n else:\n res += item\n return res\n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3101341120","body":"还是链表的老套路,设置一个dummy head。 判断cur.next and cur.next.next: 是否存在,存在了再进行下一步。\n用tmp,tmp1 来保存cur。next和cur.next.next.next。 然后我们开始进行交换步骤。\n\n```\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n dummy_head = ListNode(next =head)\n cur = dummy_head\n while cur.next and cur.next.next:\n temp = cur.next\n temp1 = cur.next.next.next\n cur.next = cur.next.next\n cur.next.next = temp\n temp.next = temp1\n cur = cur.next.next\n return dummy_head.next\n\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125611734","body":"可以利用bfs的方法解决。 把每个点放入queue中,然后popleft()两个node进行比较。\n\n```\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if not p and not q:\n return True\n if not p or not q:\n return False\n \n que = deque([p,q])\n \n while que:\n cur1 = que.popleft()\n cur2 = que.popleft()\n if not cur1 and not cur2:\n continue\n\n if not cur1 or not cur2 or cur1.val != cur2.val:\n return False\n \n que.append(cur1.left)\n que.append(cur2.left)\n que.append(cur1.right)\n que.append(cur2.right)\n return True\n\n```\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148705374","body":"```\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n ans = 0\n for x1, y1 in points:\n cnt = defaultdict(int)\n for x2, y2 in points:\n d2 = (x1 - x2) ** 2 + (y1 - y2) ** 2\n ans += cnt[d2] * 2\n cnt[d2] += 1\n return ans\n\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuqianyang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sj941127":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zjsuper":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yongxi-zhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"darwintk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"h-steven":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mischaqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wurongronga":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miduoliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyshenzhengkang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"y4h2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yoco323":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"forschers":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shanshuiqiankun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"annabellhyx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hwfrankfung":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"frederickfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huibinny":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ggmybro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"myleetcodejourney":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"want2333":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"staringwhere":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allenfeng8":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ryanbaiyansong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dou-yu-xuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hyxupup":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cs12300":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chiehw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aesir-idun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaldsk12":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hxj2001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"for123s":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzhilin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yfu6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mengsixing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"import-ant":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joriscai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangqianqian202301":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"airwalkers":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhumengcheng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kofzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"leonalhq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hjy-u":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"csthaha":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zepherust":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"feefeefee":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hughlin07":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huizsh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chanceyliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hshen11":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"horace7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangzh0114":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dragonfcl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huifeng248":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sarah11qing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"el1as7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zcytm3000":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pangjiadai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xb798298436":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ywang525":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"limbo42":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dorapocket":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zoeyzyzyzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jasonqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lp1506947671":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"texamc2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joemonkeylee":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"northseacoder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dominique9898":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wl678":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"meisgithub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sye9286":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fuku-l":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kangliqi1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richardtaok":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chocolate-emperor":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lydia61":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangjiahuan17":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"seanutf":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangyong-hub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erquaner":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiujingxukong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"x1aox1a":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"drinkmorekaik":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dinjufen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuzmt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"munmust":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yan-jie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hktangshuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zpbc007":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"linlizzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"krabbejing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"firehaosky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chao-cc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jinjin680":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cruiseyugh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"quieter2018":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jadeliu13":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaoq777":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiangyanlineu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuxiner":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yufanzh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"franciszq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kangqinsen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"manwzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jerry9926":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"soso1105":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pkuphy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhenya-zhu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wty9sky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"skyoct":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bingzxy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaodingc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jyjsunny":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aoxiangw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"enrilwang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aswrise":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aneureka":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ljqchlsw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jingyuzhou123":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dianlandu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jameswangxin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhenxied":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nuozhouzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shin-guid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bochengwan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kyo-tom":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uratora":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guitarys":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sosdogecoin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zol013":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lrwhc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wwewwt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cyk1337":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangyu1131":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"diana21170648":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"61hhh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"quaaaaaack":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"acy925":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bi9potato":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guangsizhongbin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhaoygcq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"catkathy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yqycs":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhuxinyu-znb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"freesan44":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mo660":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sencc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"randong22":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"beginner-jamji":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yzhyzhyzh123":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunstrongchina":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dongzegithub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"metsystem":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miller-em":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dorian-byte":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yizhewill":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qiaojunch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhouliuhuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"beanza":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kingxiaozhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ygnauh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wzbwzt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"iambigchen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weiboshi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"master-guang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jennyjgao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangjay408":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chang-you":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rocjemaintiendrai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ainfinitedz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"christ36":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hengistchan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huiyingc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"andyli4":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"momogir":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jamjid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"freeroo2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ycan253":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"laurallalala":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"danielyan86":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rennzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"larscheng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qingkediguo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"adfvcdxv":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"javajianghu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chloe-c11":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"verkru":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eggeggliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dr-kkk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jinhma":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"emergence23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"0christ1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"junru281":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joe-the-plumber":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jsaki":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"witerth":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ludwig-ll":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luster-lyl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"smallppgirl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"realduxy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"awilekong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wwz223":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangjinzhepro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"atom-set":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"coderxiaowq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hillsonziqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alexzhang-mini":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xil324":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bordergong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hawkins-hjq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cathyshang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"greyqt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yanglimbo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rao-qianlin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dtjk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"martina001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lxy1108":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"franklinsworld666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brainlds":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huamulanyyds":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eclairs46":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maike-hps":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sanjiu81":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qinmengx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yashuning":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luzhaofeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lizhao-liu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yukibei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hermione666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yyyyytc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zin-next":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pandapls":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jackinai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"godkun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dadahui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"akxuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fightforcoding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jialigogogo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"celestexiong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zjy-debug":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"peggyhao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sleepydog25":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"edwineo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"panfx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liudi9047":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allanli-lhh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xchen172":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qiaoeve":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tangyi23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shangjiaw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tongxw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"haodongwang1995":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuichicx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qunshanhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hebingliang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"baiqz":[null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092397229","body":"\n### 思路:\n通过元素在栈之间的转移来模拟队列的先进先出。\n\n\n```python\nclass MyQueue:\n \"\"\"使用两个栈实现的队列类\"\"\"\n\n def __init__(self):\n # 初始化两个栈:stack_in 用于入队操作,stack_out 用于出队操作\n self.stack_in = []\n self.stack_out = []\n\n def push(self, x: int) -> None:\n \"\"\"将元素 x 添加到队列的尾部\n 直接将元素压入 stack_in\n \"\"\"\n self.stack_in.append(x)\n\n def pop(self) -> int:\n \"\"\"移除并返回队列头部的元素\n 1. 如果 stack_out 为空,将 stack_in 中的所有元素弹出并压入 stack_out\n 2. 这样能确保元素以先进先出的顺序出栈\n 3. 弹出 stack_out 的栈顶元素\n \"\"\"\n if not self.stack_out:\n while self.stack_in:\n self.stack_out.append(self.stack_in.pop())\n return self.stack_out.pop()\n\n def peek(self) -> int:\n \"\"\"返回队列头部的元素,但不删除它\n 复用 pop 方法获取队首元素,然后将其压回 stack_out 以保持队列状态不变\n \"\"\"\n res = self.pop()\n self.stack_out.append(res)\n return res\n\n def empty(self) -> bool:\n \"\"\"检查队列是否为空\n 当且仅当两个栈都为空时,队列为空\n \"\"\"\n return not (self.stack_in or self.stack_out)\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaogaoddd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tuuna":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lxy12l":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chxbilly":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sentiy-hub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fea1220":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wtbkevin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"awenbocc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hallcia":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huzhipeng-hu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tongtz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lindo146":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"heye0507":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lmw6412036":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/1#issuecomment-3072932165","body":"@azl397985856 需要建day1啦","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3076893308","body":"## 思路1\n\n枚举每个普通字符,分别找到其左侧,右侧**最近**特殊字符的位置,求出距离,并取最小值。\n\n1. 预处理每个特殊字符的位置,保存至数组data;\n2. 枚举每个普通字符,在data中查找其左侧,右侧**最近**特殊字符的位置,求出距离,并取最小值。查找过程用可以**二分**实现,也可以用\n **单个指针记录最后一次位置**实现;\n3. 返回结果。\n\n## 思路1代码\n\n```javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function (s, c) {\n let n = s.length, data = [];\n for (let i = 0; i < n; i++) {\n if (s[i] === c) data.push(i);\n }\n\n // 双指针\n // left 左侧最近的c索引\n // right 右侧最近的c索引 right = left + 1\n let left = -1, right = -1, m = data.length;\n let ans = new Array(n).fill(0);\n for (let i = 0; i < n; i++) {\n let char = s[i];\n if (char === c) continue;\n\n let ldis = Infinity, rdis = Infinity;\n // 在data中寻找左侧最近的c索引\n // left 指针移动的条件:data[left + 1] < i,确保data[left] 是在i的左侧,距离i更近\n while (left + 1 < m && data[left + 1] < i) left++;\n if (left >= 0) ldis = i - data[left];\n \n right = left + 1;\n if (right < m) rdis = data[right] - i;\n ans[i] = Math.min(ldis, rdis);\n }\n return ans;\n };\n```\n\n## 思路1复杂度分析\n\n- 时间复杂度:O(n + m),n为字符串s的长度,m为data的长度,遍历字符串s2次,left也只是从左往右移动一次,为O(m),所以总的时间复杂度为O(n + m)。\n- 空间复杂度:O(m),m为data的长度,不考虑返回值的话,需要一个额外的长度为m的数组来保存c的位置,所以空间复杂度为O(m);考虑返回值,需要一个额外的长度为n的数组来保存结果,间复杂度为O(n)。\n\n---\n\n## 思路2\n\n也可以枚举每个特殊字符c的位置,处理c往左、往右能覆盖的普通字符,记录每个普通字符的最小值即可。\n\n1. 预处理每个特殊字符的位置,保存至数组data;\n2. 从左往右遍历data,处理每个特殊字符c左侧的普通字符的距离,保存至数组答案ans;可以使用思路1单指针记录最后一个位置的方式,降低时间复杂度;具体可以看代码;\n3. 从右往左遍历data,处理每个特殊字符c右侧的普通字符的距离,与答案ans对应位置比较,取最小值;\n4. 返回答案ans。\n\n## 思路2代码\n```javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function (s, c) {\n let n = s.length, data = [], ans = new Array(n).fill(Infinity);\n for (let i = 0; i < n; i++) {\n if (s[i] === c) {\n ans[i] = 0;\n data.push(i);\n }\n }\n\n const m = data.length;\n\n // 从左往右遍历\n let left = 0;//从左往右开始,第一个普通字符的索引\n for (let j of data) {\n while (left < n && s[left] === c) left++;\n while (left < n && s[left] !== c && left < j) {\n // console.log('处理left',left,j);\n ans[left] = Math.min(ans[left], j - left);\n left++;\n }\n }\n\n // 从右往左遍历\n let right = n - 1;// 从右往左开始,第一个普通字符的索引\n for (let i = m - 1; i >= 0; i--) {\n let j = data[i];\n while (right >= 0 && s[right] === c) right--;\n while (right >= 0 && s[right] !== c && right > j) {\n ans[right] = Math.min(ans[right], right - j);\n right--;\n }\n }\n return ans;\n };\n```\n## 思路2复杂度分析\n\n- 时间复杂度:O(n + m),n为字符串s的长度,遍历字符串s1次,遍历data两次,left、right也只是各移动一次,所以总的时间复杂度为O(n + m)。\n- 空间复杂度:O(m),m为data的长度,不考虑返回值的话,需要一个额外的长度为m的数组来保存c的位置,所以空间复杂度为O(m);考虑返回值,需要一个额外的长度为n的数组来保存结果,间复杂度为O(n)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082655797","body":"## 思路1\n这是一个典型的栈设计题,数据规模不大的情况下,按照常规操作即可。可以使用数组或链表来存储。\n## 代码1\n```javascript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.data = []\n this.maxSize = maxSize;\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if(this.data.length < this.maxSize) this.data.push(x);\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if(this.data.length === 0) return -1;\n return this.data.pop(); \n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n let n = this.data.length;\n for(let i = 0;i < k;i++){\n if(i < n) this.data[i] += val;\n else break;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n## 复杂度分析1\n* 时间复杂度:O(n*k)。n表示操作次数。插入和删除的时间复杂度都是O(1),每次increment都要遍历数组,时间复杂度是O(k);所以总的复杂度为O(n*k)。\n* 空间复杂度:O(n)。n为maxSize。\n---\n## 思路2\n如果k较大,increment是个非常耗时的操作,所以我们需要优化increment的操作。\n优化思路:increment是批量更新的,可以用差分数组来实现。但是又要支持高效的查询与删除操作,所以可以用树状数组来维护这个差分数组。\n## 代码2\n```javascript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function (maxSize) {\n this.cnt = 0;\n this.data = new Array(maxSize + 1).fill(0);\n this.maxSize = maxSize;\n};\n\n/**\n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function (x) {\n if (this.cnt === this.maxSize) return;\n this.cnt++;\n this.update(this.cnt - 1, x);\n if(this.cnt <= this.maxSize - 1) this.update(this.cnt, -x);\n //console.log('push ',x,this.data);\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function () {\n if(this.cnt === 0) return -1;\n let ans = this.query(this.cnt - 1);\n this.update(this.cnt - 1, -ans);\n if(this.cnt <= this.maxSize - 1) this.update(this.cnt,ans);\n this.cnt--;\n //console.log('pop ',ans,this.data);\n return ans;\n};\n\n/**\n * @param {number} k\n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function (k, val) {\n if(this.cnt === 0) return;\n this.update(0, val);\n let r = Math.min(k,this.maxSize,this.cnt);\n if(r <= this.maxSize - 1) this.update(r,-val);\n};\n\n\nCustomStack.prototype.query = function (i) {\n i = i + 1;\n let ans = 0;\n while (i) {\n ans += this.data[i];\n i -= this.lowbit(i);\n }\n return ans;\n}\n\nCustomStack.prototype.update = function (i, val) {\n i = i + 1;\n while (i <= this.maxSize) {\n this.data[i] += val;\n i += this.lowbit(i);\n }\n}\n\n\nCustomStack.prototype.lowbit = function (i) {\n return i & (-i);\n}\n\n/**\n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n\n```\n\n## 复杂度分析2\n* 时间复杂度:O(n*log(maxSize))。n表示操作次数。插入、删除、批量更新的时间复杂度都是O(log(maxSize));所以总的复杂度为O(n*log(maxSize))。\n* 空间复杂度:O(n)。n为maxSize。\n---\n## 思路3\n有没有保持插入,删除O(1),批量更新O(1)的算法呢?官方题解给出了一个懒删除的技巧。小伙伴们可以尝试一下。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087040795","body":"## 思路一:栈\n这是一个典型的括号匹配问题,可以用栈来解决。 \n步骤:\n1. 创建一个栈sStack,栈顶元素标示当前答案,初始元素为空字符串;\n2. 创建一个栈nStack,存储需要重复的数字k;\n3. 声明一个全局变量num,用来记录数字。遍历字符串:\n 1. 如果当前字符为数字,追加到num中;\n 2. 如果当前字符为左括号,将num压入栈nStack,将一个新的空字符串压入栈sStack,并清空num。**遇到左括号表示要开启新一轮的字符串重复过程,因此数字栈压入需要重复的数字k,字符串栈压入一个空字符串来存储本轮重复过程产生的答案**;\n 3. 如果当前字符为字母,追加到栈sStack的栈顶元素中;\n 4. 如果当前字符为右括号,取出栈sStack的栈顶元素s,取出栈nStack的栈顶元素k,s重复k次;并追加到栈sStack的栈顶元素中。**遇到右括号表示本轮重复过程结束,因此将栈sStack的栈顶元素重复k次,并追加到栈sStack的栈顶元素中,继续前一轮的重复**。\n 5. 最后栈sStack的栈顶元素即为结果。\n## 代码一\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n let sStack = [''],nStack = [],n = s.length;\n let num = 0;\n for(let i = 0;i < n;i++){\n let c = s[i];\n if(/\\d/.test(c)) num = num * 10 + Number(c);\n else if(c === '[') {\n nStack.push(num);\n num = 0;\n sStack.push('');\n }else if(/[a-z]/.test(c)){\n // console.log(sStack)\n sStack[sStack.length - 1] += c;\n }else{\n let s = sStack.pop(),k = nStack.pop();\n // console.log(s,k);\n if(s) s = s.repeat(k);\n sStack[sStack.length - 1] += s;\n // console.log(sStack)\n }\n }\n return sStack[0];\n };\n```\n## 复杂度分析一\n* 时间复杂度:O(n),其中n为字符串s的长度。\n* 空间复杂度:O(n),需要两个最长长度为n的栈保存答案及数字,其中n为字符串s的长度。\n--- \n## 思路二:递归\n括号匹配问题,一般可以用递归来解决。 \n步骤:\n1. 预处理字符串s,记录与每个“\\[”匹配的“\\]”的位置,保存至数组left中。\n> 预处理匹配括号位置是这类递归问题常见的技巧。\n2. 从左往右遍历字符串s: \n 1. 如果当前字符为字母,则将当前字符添加到结果res中;\n 2. 如果当前字符为数字,则将数字保存在变量num中;\n 3. 如果当前字符为左括号,递归调用f,处理\\[i + 1, left\\[i] - 1]的子串,得到的结果重复num次,并追加到结果res中;num清空;\n4. 返回res。\n\n## 代码二\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n let stack = [],n = s.length,left = new Array(n).fill(-1);\n for(let i = 0;i < n;i++){\n let c = s[i];\n if(c === '[') stack.push(i);\n else if(c === ']') left[stack.pop()] = i;\n }\n return f(0,n - 1);\n // -----------------------------------\n function f(l,r){\n let ans = '',num = 0;\n for(let i = l;i <= r;i++){\n let c = s[i];\n if(/\\d/.test(c)) num = num * 10 + Number(c);\n else if(c === '['){\n ans += f(i + 1,left[i] - 1).repeat(num);\n num = 0;\n i = left[i];\n }else if(/[a-z]/.test(c)) ans += c;\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析二\n* 时间复杂度:O(n),其中n为字符串s的长度。\n* 空间复杂度:O(n),即递归栈深度,最大为n,其中n为字符串s的长度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091479392","body":"## 思路\n1. 设计双栈,一个用于存放入队数据,一个用于存放出队数据。\n2. 各个操作的实现思路:\n 1. push:将数据压入pushData栈中。\n 2. pop:如果popData栈为空,则将pushData栈中的数据全部弹出并压入popData栈中。然后弹出popData栈的栈顶元素。\n 3. peek:同pop操作,最后一步返回popData栈的栈顶元素。 \n 4. empty:判断两个栈是否为空。 \n\n> js中可以用数组模拟栈。\n## 代码\n```javascript\nvar MyQueue = function() {\n this.pushData = []\n this.popData = [] \n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.pushData.push(x) \n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n if(this.popData.length === 0 && this.pushData.length) while(this.pushData.length) this.popData.push(this.pushData.pop());\n return this.popData.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if(this.popData.length === 0 && this.pushData.length) while(this.pushData.length) this.popData.push(this.pushData.pop());\n return this.popData[this.popData.length - 1];\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return this.pushData.length === 0 && this.popData.length === 0\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```\n## 复杂度分析\n- 时间复杂度:O(1):插入、删除、查找操作的均摊时间复杂度都是O(1)\n- 空间复杂度:O(n):栈的存储空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094576990","body":"## 思路\n比较容易的思路是,排序后,每个块和排序前元素的种类和数量完全相同,可以用哈希表或前缀和来求解。此思路的时间复杂度是O(n),空间复杂度是O(nlog(n))。 \n后来看了看题解,发现可以用单调栈或维护前后缀的思路来求解。\n\n### 排序块性质\n**我们要想划分最多的块,并且保证排序后的结果和原数组的排序结果相同,则块中的元素必须保证,块中的最大值都比右边的元素小或者相同,块中的最小值都比左边的元素大或者相同。**\n则我们维护一个前缀最大值和后缀最小值两个数组,只要前缀的最大值,小于等于后缀的最小值,则可划分(相当于给数组划一条线)。\n## 代码\n```javascript\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n let n = arr.length, prefixMax = new Array(n).fill(-Infinity),suffixMin = new Array(n).fill(Infinity);\n for(let i = 0;i < n;i++){\n prefixMax[i] = Math.max(i ? prefixMax[i - 1] : -Infinity,arr[i]);\n let j = n - 1 - i;\n suffixMin[j] = Math.min(j + 1 < n ? suffixMin[j + 1] : Infinity,arr[j]);\n }\n\n let ans = 1;\n for(let i = 0;i < n - 1;i++){\n if(prefixMax[i] <= suffixMin[i + 1]) ans++;\n }\n return ans\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(n)\n\n## 参考题解\n[https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solutions/1/zui-duo-neng-wan-cheng-pai-xu-de-kuai-by-z0wz/](https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solutions/1/zui-duo-neng-wan-cheng-pai-xu-de-kuai-by-z0wz/)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095130877","body":"## 思路\n旋转链表的本质上是将链表尾部k个节点移动到链表头部。按照这个思路步骤如下:\n1. 计算链表长度l;\n2. 如果 k % l === 0 或者 l === 0,即k为l的整数倍,或者链表为空,则不需要旋转,直接返回head;否则 k = k % l;\n3. 声明两个指针fast、slow,fast先移动k步;\n4. fast、slow同时移动,直到fast到达链表末尾;\n5. 此时:\n 1. slow的下一个节点即为新的头结点\n 2. slow.next 指向 null\n 3. fast.next 指向 head\n 4. 返回新的头结点\n\n## JavaScript代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n if(!head || k === 0) return head;\n let l = 0,curr = head;\n while(curr){\n l++;\n curr = curr.next;\n }\n k = k % l;\n if(k === 0) return head;\n let fast = head,slow = head;\n while(k){\n fast = fast.next;\n k--;\n }\n\n while(fast.next){\n fast = fast.next;\n slow = slow.next;\n }\n\n let newHead = slow.next;\n slow.next = null;\n fast.next = head;\n return newHead;\n\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中n为链表的长度。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100439586","body":"## 思路\n因为是两两交换,所以可以声明四个指针记录涉及到交换的节点,修改相关指针的next指向即可。具体步骤如下:\n1. 特判:链表为空或链表只有一个节点,直接返回原链表。\n2. 为了简化代码,声明一个哨兵节点dummy,dummy.next = head,方便统一处理。\n3. 声明指针prev,指向前一次交换后的结束节点;声明指针curr,指向本次交换的开始节点。初始值prev = dummy,curr = head,开始循环:\n 1. 循环终止条件:curr为空或者curr的下一个节点为空(即curr没有可以交换的节点了)。\n 2. 声明next指针,next = curr.next;声明nextCurr指针,nextCurr = curr.next.next;\n 3. 两两交换:curr.next = nextCurr,next.next = curr;\n 4. 重新设置头尾指向,确保下一轮循环正确执行:prev.next = next;\n 5. 重新设置prev,curr:prev = curr; curr = nextCurr;继续循环,直到循环终止条件。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n if(!head || !head.next) return head;\n const dummy = new ListNode();\n dummy.next = head;\n \n let prev = dummy,curr = dummy.next;\n while(curr && curr.next){\n let next = curr.next,nextCurr = next.next;\n curr.next = nextCurr;\n next.next = curr;\n \n prev.next = next;\n\n prev = curr;\n curr = curr.next;\n }\n\n return dummy.next;\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是链表的长度。\n- 空间复杂度:O(1),仅使用有限个指针。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105520636","body":"## 思路\n* 本题目标是将一个有序单链表(升序排列)转换为一棵高度平衡的二叉搜索树(Height Balanced Binary Search Tree)。\n* 核心思想是使用递归方式构建树,每次选择链表的中间节点作为当前子树的根节点,以保证左右子树的高度差不超过 1。\n* 利用快慢指针(slow 和 fast)找到链表的中间节点,并将链表分割为左子链表和右子链表,分别递归构建左右子树。\n* 实现步骤如下:\n 1. 递归终止条件:\n * 如果链表为空(!head),返回 null。\n * 如果只有一个节点(!head.next),直接构建一个 TreeNode 返回。\n 2. 寻找中间节点:\n * 使用快慢指针法,fast 每次走两步,slow 每次走一步,当 fast 到达末尾时,slow 正好指向中间节点。使用一个临时变量 prev 记录 slow 的前一个节点,方便后续断开连接。\n 3. 分割链表:\n * 将 slow 前面的节点作为左子链表,断开连接。\n * slow.next 作为右子链表继续递归处理。\n 4. 构建树节点:\n * 当前 slow.val 作为根节点,递归构建左右子树。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if(!head) return head;\n // display(head)\n if(!head.next) return new TreeNode(head.val);\n\n // 寻找中间节点\n let slow = head,fast = head,prev = null;\n while(fast.next && fast.next.next){\n fast = fast.next.next;\n prev = slow;\n slow = slow.next;\n }\n // 此时,slow是中间节点,slow.next是右子树的根\n let next = slow.next;\n if(prev) prev.next = null;\n slow.next = null;\n\n const root = new TreeNode(slow.val);\n root.left = sortedListToBST(prev ? head : null);\n root.right = sortedListToBST(next);\n return root;\n};\n\nfunction display(head){\n let ans = [],p = head;\n while(p){\n ans.push(p.val);\n p = p.next;\n }\n console.log('处理的树:',ans)\n}\n```\n## 复杂度分析\n* 时间复杂度:O(n log n)\n * 每一层递归都需要遍历链表的一半来找中间节点(O(n)),递归深度为 log n,因此总时间复杂度为 O(n log n)。\n* 空间复杂度:O(log n)\n * 主要是递归调用栈的空间,取决于树的高度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111762311","body":"## 思路\n- 定义两个指针 `pA` 和 `pB`,分别从 `headA` 和 `headB` 开始遍历。\n- 当 `pA` 和 `pB` 不相遇时,它们会继续向前移动:\n - 如果 `pA` 到达末尾 (`null`),则跳转到 `headB`。\n - 如果 `pB` 到达末尾 (`null`),则跳转到 `headA`。\n- 这样,两个指针最终会在相交点相遇,或者同时到达末尾 (`null`),从而退出循环。\n- 返回 `pA`,即相交节点或 `null`。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function (headA, headB) {\n let pA = headA, pB = headB;\n while (pA !== pB) {\n pA = pA ? pA.next : headB;\n pB = pB ? pB.next : headA;\n }\n return pA;\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n + m),其中 n 和 m 分别为链表 headA 和 headB 的长度。\n- 空间复杂度:O(1),只使用了两个指针变量,没有额外的空间。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116200386","body":"## 思路\n- 首先处理边界情况:如果head为空,直接返回\n- 快慢指针同时遍历链表,快指针每次走两步,慢指针每次走一步\n- 当两指针相遇时停止第一阶段\n- 如果fast为null,说明无环,返回null\n- 将slow重置为head,两个指针以相同速度继续移动直到相遇\n- 相遇点即为环的起始节点\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n if(!head) return head;\n let slow = head,fast = head;\n while(fast){\n fast = fast.next;\n if(fast) fast = fast.next;\n\n slow = slow.next;\n\n if(slow === fast) break;\n }\n\n if(!fast) return fast;\n\n slow = head;\n\n while(slow !== fast){\n slow = slow.next;\n fast = fast.next;\n }\n\n return slow\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3125594702","body":"## LRU Cache 算法思路分析\n\nLRU (Least Recently Used) 缓存是一种常用的缓存淘汰策略,当缓存满时,会优先淘汰最近最少使用的元素。\n\n### 核心数据结构\n\n1. **双向链表**:维护元素的访问顺序,头部是最近最少使用的元素,尾部是最近使用的元素\n2. **哈希表(Map)**:提供O(1)时间复杂度的元素查找\n\n### 主要操作实现\n\n#### 1. 初始化\n- 设置缓存容量\n- 初始化当前元素计数器\n- 创建哈希表存储键值对\n- 创建虚拟头节点和尾节点,方便操作\n\n#### 2. 获取元素get\n- 如果元素不存在,返回-1\n- 如果元素存在:\n - 将该节点从当前位置删除\n - 将该节点插入到链表尾部(标记为最近使用)\n - 返回节点值\n\n#### 3. 插入/更新元素put\n- **新元素插入**:\n - 如果缓存已满,删除链表头部节点(最近最少使用的元素)\n - 创建新节点并添加到哈希表\n - 将新节点插入链表尾部\n- **更新元素**:\n - 更新节点值\n - 将节点从当前位置删除并移到链表尾部\n\n#### 4. 辅助方法\n- insertToTail:将节点插入链表尾部\n- deleteFromHead:删除链表头部节点\n- deleteNode:删除指定节点\n\n## 代码\n```javascript\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.cnt = 0;\n this.map = new Map();\n this.head = new DoubleNode();\n this.tail = new DoubleNode();\n this.head.next = this.tail;\n this.tail.prev = this.head; \n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n // console.log('get',key)\n \n if(this.map.has(key) === false) return -1;\n let node = this.map.get(key);\n\n this.deleteNode(node);\n \n this.insertToTail(node);\n // this.map.set(key,node);\n \n // this.display();\n\n return node.val;\n};\n\n/** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\nLRUCache.prototype.put = function(key, value) {\n if(this.map.has(key) === false){// 插入操作\n let node = new DoubleNode(key,value);\n if(this.cnt === this.capacity) this.deleteFromHead(); \n else this.cnt++\n this.map.set(key,node);\n this.insertToTail(node);\n }else{\n let node = this.map.get(key);\n node.val = value;\n\n this.deleteNode(node);\n\n this.insertToTail(node);\n // this.map.set(key,node);\n }\n\n // console.log('put',key,value);\n // this.display();\n};\n\nLRUCache.prototype.insertToTail = function(node){\n let prev = this.tail.prev;\n \n prev.next = node;\n node.next = this.tail;\n \n this.tail.prev = node;\n node.prev = prev;\n}\n\nLRUCache.prototype.deleteFromHead = function(){\n let node = this.head.next;\n let next = node.next;\n \n this.head.next = next;\n next.prev = this.head;\n\n this.map.delete(node.key);\n}\n\nLRUCache.prototype.deleteNode = function(node){\n let prev = node.prev,next = node.next;\n prev.next = next;\n next.prev = prev;\n\n node.prev = null;\n node.next = null;\n\n // this.map.delete(node.key);\n}\n\nLRUCache.prototype.display = function(){\n let k = this.cnt,p = this.head.next;\n let ans = []\n while(k){\n ans.push(p.key + '=>' + p.val);\n k--;\n p = p.next;\n }\n console.log(ans);\n}\n\nfunction DoubleNode(key,val){\n this.key = key;\n this.val = val;\n this.next = null;\n this.prev = null;\n}\n\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```\n## 复杂度分析\n### 时间复杂度\n- get操作:O(1)\n- put操作:O(1)\n\n### 空间复杂度\n- O(capacity),需要存储最多capacity个元素\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123739061","body":"## 思路\n\n使用了递归的思想来解决问题:\n\n1. **基础情况(Base Case)**:如果当前节点为空(`!root`),则返回深度0,因为空节点没有深度。\n\n2. **递归关系(Recursive Relation)**:\n - 分别计算左子树和右子树的最大深度:`maxDepth(root.left)` 和 `maxDepth(root.right)`\n - 取两者中的较大值:`Math.max(maxDepth(root.left), maxDepth(root.right))`\n - 加上当前节点的1层高度:`+1`\n\n### 算法执行过程\n\n1. 对于任意节点,先递归计算其左子树的最大深度\n2. 再递归计算其右子树的最大深度\n3. 比较左右子树的深度,取较大值\n4. 将较大值加1(代表当前节点所在的层),作为以当前节点为根的子树的最大深度\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if(!root) return 0;\n return Math.max(maxDepth(root.left),maxDepth(root.right))+1;\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n),其中n是二叉树的节点数。因为需要遍历每个节点一次。\n- **空间复杂度**:O(h),其中h是二叉树的高度。这是由于递归调用栈的深度,最坏情况下(完全不平衡的树)可能达到O(n),最好情况下(完全平衡的树)为O(log n)。\n\n这是一个典型的分治算法应用,将问题分解为更小的子问题(左右子树的深度),然后合并结果得到最终答案。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125568669","body":"## 代码思路分析\n\n这是一个经典的二叉树递归问题,采用深度优先搜索(DFS)的方式解决:\n\n1. **基本情况处理**:\n - 如果两个节点都为null,则认为相同,返回true\n - 如果其中一个节点为null,另一个不是,则不同,返回false\n\n2. **递归比较**:\n - 比较当前节点的值是否相等\n - 递归比较左子树是否相同\n - 递归比较右子树是否相同\n - 只有当值相等且左右子树都相同时,才返回true\n\n## 代码实现\n\n```javascript\nvar isSameTree = function(p, q) {\n // 如果两个节点都为空,则相同\n if(p===null && q===null) return true;\n // 如果只有一个节点为空,则不同\n if(p===null) return false;\n if(q===null) return false;\n // 比较当前节点值,并递归比较左右子树\n return p.val===q.val && isSameTree(p.left,q.left) && isSameTree(p.right,q.right);\n};\n```\n\n\n## 复杂度分析\n\n- **时间复杂度**:O(min(m,n)),其中m和n分别是两个二叉树的节点数。在最坏情况下,需要遍历两个树中所有节点。\n- **空间复杂度**:O(min(m,n)),递归调用的层数最多为较小树的高度,最坏情况下为O(min(m,n))。\n\n这个算法通过递归方式同时遍历两棵树的相同位置节点,并比较它们的值是否相等,从而判断两棵树是否完全相同。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130348089","body":"## 思路\n\n### 核心思路\n- 使用深度优先搜索(DFS)遍历二叉树\n- 在遍历过程中维护从根节点到当前节点形成的数字\n- 当到达叶节点时,将形成的数字加到结果中\n\n### 具体实现\n\n1. **函数定义与参数**:\n - `sumNumbers(root, prev = 0)` 接收当前节点 `root` 和之前形成的数字 `prev`\n - `prev` 参数有默认值 0,用于累积从根到当前节点的数字\n\n2. **边界条件处理**:\n ```javascript\n if(!root) return 0;\n ```\n\n - 如果当前节点为空,返回 0\n\n3. **数字累积**:\n ```javascript\n prev = prev * 10 + root.val;\n ```\n\n - 将当前节点值添加到路径数字中\n - 通过 `prev * 10 + root.val` 实现数字的逐位构建\n\n4. **叶节点判断**:\n ```javascript\n if(!root.left && !root.right) return prev;\n ```\n\n - 如果当前节点是叶节点(无左右子节点),返回累积的数字\n\n5. **递归处理**:\n ```javascript\n return sumNumbers(root.left,prev) + sumNumbers(root.right,prev);\n ```\n\n - 分别递归处理左右子树\n - 将左右子树的结果相加返回\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root,prev = 0) {\n if(!root) return 0;\n prev = prev * 10 + root.val;\n if(!root.left && !root.right) return prev;\n return sumNumbers(root.left,prev) + sumNumbers(root.right,prev);\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n),其中 n 是二叉树的节点数,需要遍历每个节点一次\n- **空间复杂度**:O(h),其中 h 是二叉树的高度,主要是递归调用栈的空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134622736","body":"## 思路\n\n### 1. 核心思想\n使用深度优先搜索(DFS)遍历二叉树,记录每一层最左边的节点值。\n\n### 2. 关键实现点\n\n- **层级记录**:通过 `level` 参数跟踪当前节点所在的层级\n- **每层只记录一次**:利用 `level === left.length` 条件确保每层只记录第一个访问的节点值\n- **先左后右遍历**:先遍历左子树再遍历右子树,保证每层第一个访问的是最左边的节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let left = [];\n dfs(root,0)\n return left[left.length - 1];\n // ----------------------\n function dfs(root,level){\n if(!root) return;\n if(level === left.length) left.push(root.val);\n dfs(root.left,level + 1);\n dfs(root.right,level + 1);\n }\n};\n```\n## 优化后的代码\n优化思路:没必要用数组保存整个左侧值,只需要记录左侧值第一次出现即可\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let left = 0,ans;\n dfs(root,0)\n return ans;\n // ----------------------\n function dfs(root,level){\n if(!root) return;\n if(level === left) {\n left++;\n ans = root.val;\n }\n dfs(root.left,level + 1);\n dfs(root.right,level + 1);\n }\n};\n```\n\n\n## 复杂度分析\n- **时间复杂度**:O(n),其中 n 是二叉树的节点数,需要遍历每个节点一次\n- **空间复杂度**:O(h),其中 h 是二叉树的高度,主要是递归调用栈的空间开销","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138308014","body":"## 思路\n\n### 1. 序列化 (`serialize`)\n- 使用前序遍历(根-左-右)遍历二叉树\n- 对于每个节点:\n - 如果节点为空,将 `null` 添加到结果数组\n - 如果节点不为空,将节点值添加到结果数组,然后递归处理左右子树\n- 最后将数组转换为 JSON 字符串返回\n\n### 2. 反序列化 (`deserialize`)\n- 将 JSON 字符串解析为数组\n- 使用递归方式重建二叉树:\n - 按顺序读取数组元素\n - 如果当前元素是 `null`,返回 `null`\n - 如果当前元素不是 `null`,创建新节点,并递归构建左右子树\n - 利用前序遍历的特点,按顺序处理就能重建原来的树结构\n\n## 关键特点\n\n1. **前序遍历**:保证了根节点在子节点之前被处理,便于重建时确定父子关系\n2. **空节点标记**:用 `null` 标记空节点,确保能完全还原树的结构\n3. **递归实现**:两个函数都使用递归方式实现,代码简洁清晰\n\n## 示例说明\n\n假设有一棵二叉树:\n```\n 1\n / \\\n 2 3\n / \\\n 4 5\n```\n\n\n- 序列化结果:`[1,2,null,null,3,4,null,null,5,null,null]`\n- 反序列化时按此顺序重建树结构\n\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n let ans = [];\n dfs(root);\n return JSON.stringify(ans);\n // -----------------\n function dfs(root){\n if(!root){\n ans.push(null);\n return;\n }\n ans.push(root.val);\n dfs(root.left);\n dfs(root.right);\n }\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n let arr = JSON.parse(data),i = 0;\n //console.log(arr);\n return dfs();\n // if(arr.length === 0) return null;\n // ---------------------\n function dfs(){\n let node;\n // console.log(i,arr[i]);\n if(arr[i] === null) node = null;\n else node = new TreeNode(arr[i]);\n i++;\n if(node) {\n node.left = dfs();\n node.right = dfs();\n }\n return node;\n }\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```\n\n## 复杂度分析\n- 时间复杂度:序列化和反序列化的时间复杂度都是 O(n),其中 n 是二叉树的节点数。\n- 空间复杂度:考虑到返回值的话,序列化和反序列化的空间复杂度都是 O(n),其中 n 是二叉树的节点数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3141895435","body":"## 思路\n\n### 具体实现步骤\n\n1. **数据结构选择**\n - 使用一个大小为2001的数组 cols 每个元素是一个优先队列 `PriorityQueue`\n - 优先队列用于处理同一列中节点的排序问题\n\n2. **排序规则**\n - 主要按行号 row 排序(上到下)\n - 行号相同时按节点值 `node.val` 排序\n\n3. **DFS遍历**\n - 通过 dfs 函数遍历整个二叉树\n - 将每个节点按其列号存入对应的优先队列中\n - 列号通过 `col + 1000` 映射到数组索引,处理负数列号\n\n4. **结果构建**\n - 遍历 cols 数组,跳过空队列\n - 从每个非空队列中依次取出元素,构建每列的结果\n - 按列顺序组合成最终结果\n\n## 关键点\n\n- **坐标系统**:以根节点为原点(0,0),向左列号减1,向右列号加1,向下行号加1\n- **偏移处理**:通过 `col + 1000` 将可能的负数列号映射到正数索引\n- **排序逻辑**:同一位置优先按行排序,其次按值排序\n\n这种方法确保了垂直遍历的正确顺序。\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n let cols = new Array(2000 + 1).fill(0).map(()=>new PriorityQueue((a,b)=>{\n if(a[0] !== b[0]) return a[0] - b[0];\n return a[2] - b[2];\n }));\n\n dfs(root,0,0);\n let ans = [];\n for(let i = 0;i <= 2000;i++){\n let data = cols[i];\n if(data.size() === 0) continue;\n let temp = []\n while(data.size()) temp.push(data.dequeue()[2]);\n ans.push(temp);\n }\n return ans;\n\n // --------------------------------\n function dfs(node,row,col){\n if(!node) return;\n cols[col + 1000].enqueue([row,col,node.val]);\n dfs(node.left,row + 1,col - 1);\n dfs(node.right,row + 1,col + 1);\n }\n \n};\n```\n\n## 复杂度分析\n\n### 时间复杂度\n\n1. **初始化阶段**\n - 创建大小为2001的数组并初始化优先队列:O(2001) = O(1)\n\n2. **DFS遍历阶段**\n - 对每个节点执行一次 dfs 调用\n - 假设树有 N 个节点,则 DFS 总共执行 N 次\n - 每次 enqueue 操作在优先队列中的时间复杂度为 O(log M),其中 M 是队列中元素个数\n - 最坏情况下,所有节点都在同一列,M 最大为 N\n - 因此 DFS 阶段时间复杂度为 O(N log N)\n\n3. **结果构建阶段**\n - 遍历2001个位置的数组:O(2001) = O(1)\n - 从优先队列中 dequeue 所有元素:每个元素 dequeue 一次,总共 N 个元素\n - 每次 dequeue 操作为 O(log M)\n - 总时间复杂度为 O(N log N)\n\n**总时间复杂度:O(N log N)**,其中 N 是二叉树中节点的数量\n\n### 空间复杂度\n\n1. **存储结构**\n - cols 数组:大小固定为 2001,每个元素是一个优先队列\n - 所有优先队列总共存储 N 个节点信息:O(N)\n - 每个节点信息是一个包含3个元素的数组:O(1) 每节点\n\n2. **递归调用栈**\n - dfs 函数的递归深度最多为树的高度 H\n - 在最坏情况下(树退化为链表),H = N\n - 平均情况下,对于平衡二叉树,H = log N\n\n3. **结果数组**\n - ans 数组存储最终结果:O(N)\n\n**总空间复杂度:O(N)**,其中 N 是二叉树中节点的数量\n\n### 总结\n\n- **时间复杂度:O(N log N)**\n- **空间复杂度:O(N)**\n\n其中 N 为二叉树的节点总数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146457266","body":"## 思路:\n\n1. **使用哈希表存储已遍历元素**:\n - 创建一个空对象 [map](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\454\\2.js#L5-L5) 作为哈希表\n - 用于存储已经遍历过的元素值和其对应的索引\n\n2. **一次遍历查找**:\n - 遍历数组中的每个元素 `nums[i]`,记为 [a](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\1.js#L14-L14)\n - 计算目标差值 `b = target - a`\n - 检查 `b` 是否已经在哈希表中存在\n - 如果存在,说明找到了两个数,它们的和等于目标值,直接返回这两个数的索引 `[map[b], i]`\n - 如果不存在,将当前元素 [a](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\1.js#L14-L14) 和它的索引 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 存入哈希表,继续遍历\n\n### 算法优势:\n1. **时间复杂度优化**:从暴力解法的 O(n²) 降低到 O(n)\n2. **空间换时间**:使用额外的哈希表存储,换取查找时间的优化\n3. **一次遍历**:只需要遍历一次数组就能得到结果\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n let map = {}\n for(let i = 0;i < nums.length;i++){\n let a = nums[i],b = target - a;\n if(map[b] !== undefined) return [map[b],i];\n map[a] = i;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是数组的长度。\n- 空间复杂度:O(n),哈希表 map 的大小为 n。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3146924002","body":"## 思路\n### 主要步骤:\n\n1. **统计频次**:使用 [map](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题04.01.节点间通路/main.js#L13-L13) 对象统计每个数字在数组中出现的频次\n ```javascript\n let map = {};\n for(let i of nums) map[i] = (map[i] || 0) + 1;\n ```\n\n\n2. **维护大小为 K 的最小堆**:使用最小堆来保存频率最高的 K 个元素\n ```javascript\n let q = new MinPriorityQueue(v=>v[1]); // 基于元素出现频次的优先队列\n ```\n\n\n遍历统计结果,将元素和其频次作为数组加入堆中,当堆的大小超过 K 时,移除堆顶(即当前堆中频次最低的元素):\n ```javascript\n for(let key in map){\n q.enqueue([+key,map[key]]);\n if(q.size() > k) q.dequeue();\n }\n ```\n\n\n3. **构建结果数组**:依次从堆中取出元素,因为是最小堆,所以频次低的先出堆,最终得到的就是频次最高的 K 个元素\n ```javascript\n let ans = [];\n while(q.size()){\n ans.push(q.dequeue()[0]);\n }\n ```\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function(nums, k) {\n let q = new MinPriorityQueue(v=>v[1]);\n let map = {};\n for(let i of nums) map[i] = (map[i] || 0) + 1;\n for(let key in map){\n q.enqueue([+key,map[key]]);\n if(q.size() > k) q.dequeue();\n } \n let ans = [];\n while(q.size()){\n ans.push(q.dequeue()[0]);\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(N log K),其中 N 是数组的长度\n- 空间复杂度:O(N),用于存储频次映射表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148902680","body":"## 思路\n\n### 1. 数据结构选择\n- 使用 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 数组存储每个点到其他点的距离统计\n- `map[i]` 是一个 Map,记录第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 个点到其他各点的距离及出现次数\n\n### 2. 核心逻辑\n- **距离计算**:遍历所有点对,计算两点间距离的平方(避免开根号运算)\n- **距离统计**:将每对点的距离信息分别记录到两个点的统计中\n- **结果计算**:对于每个点,如果到其他点有相同距离的点超过1个,则可以组成回旋镖\n\n### 3. 关键步骤详解\n\n```javascript\n// 计算两点间距离的平方\nfunction calc(i,j){\n let a = Math.abs(points[i][0] - points[j][0]),b = Math.abs(points[i][1] - points[j][1]);\n return a * a + b * b;\n}\n```\n这段代码计算两个点之间的欧几里得距离的平方,使用平方避免浮点运算。\n\n```javascript\n// 统计每个点到其他点的距离\nfunction addMap(i,dis){\n let m = map[i];\n m.set(dis,(m.get(dis) || 0) + 1);\n}\n```\n将距离信息记录到对应点的统计Map中。\n\n### 4. 结果计算原理\n\n对于每个点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6),如果存在 `v` 个点与它距离相同(`v>1`),则可以从这 `v` 个点中选择 2 个点与点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 组成回旋镖,选择方式有 `v*(v-1)` 种。\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} points\n * @return {number}\n */\nvar numberOfBoomerangs = function(points) {\n let n = points.length;\n if(n < 3) return 0;\n let map = new Array(n).fill(0).map(()=>new Map());\n for(let i = 0;i < n;i++){\n for(let j = i + 1;j < n;j++){\n let dis = calc(i,j);\n addMap(i,dis);\n addMap(j,dis);\n }\n }\n let ans = 0;\n for(let i = 0;i < n;i++){\n for(let [k,v] of map[i]){\n if(v <= 1) continue;\n ans += v * (v - 1);\n }\n }\n\n return ans;\n\n \n\n\n // ------------------------------\n function calc(i,j){\n let a = Math.abs(points[i][0] - points[j][0]),b = Math.abs(points[i][1] - points[j][1]);\n return a * a + b * b;\n }\n\n function addMap(i,dis){\n let m = map[i];\n m.set(dis,(m.get(dis) || 0) + 1);\n\n }\n};\n```\n\n## 算法复杂度\n- 时间复杂度:O(n²)\n- 空间复杂度:O(n²)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3152979976","body":"## 思路\n\n### 核心思想\n使用**滑动窗口**(Sliding Window)技术配合**哈希表**来解决这个问题。\n\n### 关键变量说明\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31): 滑动窗口的左边界\n- [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6): 滑动窗口的右边界(循环变量)\n- [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5): 用于记录窗口内每个字符出现的次数\n- `ans`: 记录最长无重复子串的长度\n\n### 算法步骤\n\n1. **初始化**:设置左边界 `l = 0`,创建字符计数的 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5),初始化结果 `ans = 0`\n\n2. **扩展窗口**:使用 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 从左到右遍历字符串,逐步扩展窗口右边界\n\n3. **处理重复字符**:\n - 当遇到重复字符时(`map.has(c)` 为 true),不断右移左边界 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31)\n - 移动过程中减少对应字符的计数,如果计数为0则从 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 中删除\n - 直到窗口中不再包含当前字符为止\n\n4. **更新结果**:\n - 计算当前窗口长度 `i - l + 1`\n - 与历史最大值比较,更新 `ans`\n\n5. **维护窗口状态**:将当前字符加入 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 并增加其计数\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n let l = 0, map = new Map(),n = s.length,ans = 0;\n for(let i = 0;i < n;i++){\n let c = s[i]\n while(map.has(c)){\n map.set(s[l],map.get(s[l]) - 1);\n if(map.get(s[l]) === 0) map.delete(s[l]);\n l++;\n }\n // console.log(l,i,s.slice(l,i + 1));\n ans = Math.max(i - l + 1,ans);\n map.set(c,(map.get(c) || 0 ) + 1)\n }\n return ans;\n};\n```\n\n\n## 复杂度分析\n- **时间复杂度**: O(n),其中 n 是字符串长度,每个字符最多被访问两次\n- **空间复杂度**: O(min(m,n)),其中 m 是字符集大小","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3157255368","body":"## 思路\n\n### 1. 建立单词频次映射\n```javascript\nlet map = new Map();\nwords.forEach((word,i)=>{\n map.set(word,(map.get(word) || 0) + 1);\n});\n```\n\n- 使用 `Map` 统计 `words` 数组中每个单词的出现次数\n- 处理 `words` 中可能存在重复单词的情况\n\n### 2. 初始化参数\n```javascript\nlet n = s.length,m = words.length,k = words[0].length,l = k * m;\n```\n\n- [n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6): 字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- `m`: 单词数组的长度\n- `k`: 每个单词的长度(题目保证所有单词等长)\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31): 所有单词连接后的总长度\n\n### 3. 遍历可能的起始位置\n```javascript\nfor(let i = 0;i <= n - l;i++){}\n```\n\n- 只需检查到 `n - l` 位置,因为更后面不可能容纳完整的连接串\n\n### 4. 检查每个窗口\n```javascript\nlet j = i,result = new Map(),total = 0;\nwhile(j < i + l){\n let c = s.slice(j,j + k);\n if(map.has(c) === false) break;\n let found = false;\n result.set(c,(result.get(c) || 0) + 1);\n if(result.get(c) <= map.get(c)) found = true;\n if(found === false) break;\n j += k;\n total++;\n}\n```\n\n- 从位置 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 开始,每次取长度为 `k` 的子串进行匹配\n- 使用 `result` 记录当前窗口中各单词的出现次数\n- 如果遇到不在 `words` 中的单词或某个单词出现次数超过要求,则提前终止\n- `total` 记录成功匹配的单词数\n\n### 5. 判断结果\n```javascript\nif(total === m) ans.push(i);\n```\n\n- 当成功匹配的单词数等于 `words` 长度时,说明找到了一个有效子串\n\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n let map = new Map();\n words.forEach((word,i)=>{\n map.set(word,(map.get(word) || 0) + 1);\n });\n let n = s.length,m = words.length,k = words[0].length,l = k * m;\n if(n < l) return [];\n let ans = [];\n for(let i = 0;i <= n - l;i++){\n let j = i,result = new Map(),total = 0;\n while(j < i + l){\n // console.log('check',s.slice(i,i + m * k));\n let c = s.slice(j,j + k);\n if(map.has(c) === false) break;\n let found = false;\n result.set(c,(result.get(c) || 0) + 1);\n if(result.get(c) <= map.get(c)) found = true;\n if(found === false) break;\n j += k;\n total++;\n }\n if(total === m) ans.push(i); \n }\n return ans;\n};\n```\n## 复杂度分析\n### 时间复杂度\n- 外层循环: O(n - l)\n- 内层循环: O(m)\n- 总体复杂度: O((n - l) × m)\n### 空间复杂度\nO(n):存储单词频次映射和结果数组\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162347437","body":"## 思路\n\n使用前缀和 + 哈希表的方法,基于以下数学原理:\n\n1. 如果总和 `totalSum % p = delta`,我们需要找到一个子数组,其和模 `p` 也等于 `delta`\n2. 这样删除该子数组后,剩余元素和就能被 `p` 整除\n\n## 代码步骤分析\n\n### 1. 前缀和计算\n```javascript\nlet n = nums.length, sum = new Array(n + 1).fill(0);\nfor(let i = 0; i < n; i++) sum[i + 1] = sum[i] + nums[i];\n```\n\n- 构建前缀和数组 `sum`,其中 `sum[i]` 表示前 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 个元素的和\n- `sum[0] = 0`,`sum[i] = nums[0] + nums[1] + ... + nums[i-1]`\n\n### 2. 计算目标余数\n```javascript\nlet delta = sum[n] % p;\nif(delta === 0) return 0;\n```\n\n- `sum[n]` 是所有元素的总和\n- `delta` 是总和对 `p` 的余数\n- 如果 `delta` 为 0,说明总和已能被 `p` 整除,返回 0\n\n### 3. 寻找最短子数组\n```javascript\nlet ans = Infinity;\nlet map = new Map();\nfor(let i = 0; i <= n; i++){\n let b = sum[i], a = (b % p - delta % p + p) % p;\n map.set(b % p, i);\n if(map.has(a)) ans = Math.min(ans, i - map.get(a));\n}\n```\n\n\n关键数学关系:\n- 对于子数组 `nums[j...i-1]`,其和为 `sum[i] - sum[j]`\n- 我们希望 `(sum[i] - sum[j]) % p = delta`\n- 即 `sum[i] % p = (sum[j] + delta) % p`\n- 变形得:`sum[j] % p = (sum[i] % p - delta) % p`\n\n具体实现:\n- `b = sum[i]`:当前前缀和\n- `a = (b % p - delta % p + p) % p`:需要找到的前缀和余数\n- 用 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 记录每个余数值最后一次出现的位置\n- 如果找到对应的余数 [a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27),则更新最短长度\n\n### 4. 返回结果\n```javascript\nreturn ans === n ? -1 : ans;\n```\n\n- 如果最短长度等于数组长度,说明需要删除整个数组,返回 -1\n- 否则返回找到的最短子数组长度\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar minSubarray = function(nums, p) {\n let n = nums.length,sum = new Array(n + 1).fill(0);\n for(let i = 0;i < n;i++) sum[i + 1] = sum[i] + (nums[i]);\n // p = BigInt(p);\n let delta = sum[n] % p;\n if(delta === 0) return 0;\n let ans = Infinity;\n let map = new Map();\n for(let i = 0;i <= n;i++){\n let b = sum[i],a = (b % p - delta % p + p) % p;\n map.set(b % p,i);\n if(map.has(a)) ans = Math.min(ans,i - map.get(a));\n }\n return ans === n ? -1 : ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),只需遍历一次数组\n- 空间复杂度:O(n),用于存储前缀和数组和哈希表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166424389","body":"\n## 思路\n使用了经典的**快慢指针**(龟兔赛跑)算法。\n\n1. **双指针技巧**:\n - `slow` 指针每次移动一步\n - `fast` 指针每次移动两步\n - 当 `fast` 到达链表末尾时,`slow` 正好在中间位置\n\n## 代码执行流程\n\n- **初始化**:两个指针 `slow` 和 `fast` 都指向链表头节点 [head](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题02.04.分割链表\\main.js#L50-L50)\n- **循环条件**:`while (fast && fast.next)` 确保 `fast` 可以安全地移动两步\n- **指针移动**:\n - `fast` 连续移动两步:`fast = fast.next; fast = fast.next;`\n - `slow` 移动一步:`slow = slow.next;`\n- **返回结果**:当循环结束时,`slow` 指向中间节点\n\n## 处理奇偶数节点的情况\n\n- **奇数个节点**:返回正中间的节点\n- **偶数个节点**:返回第二个中间节点(如链表有4个节点,则返回第3个节点)\n\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n let slow = head,fast = head;\n while(fast && fast.next){\n fast = fast.next;\n fast = fast.next;\n slow = slow.next;\n }\n return slow;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是链表的节点数。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169628215","body":"## 思路\n\n1. 使用双指针技术:\n - [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 指针(慢指针):指向不重复序列的最后一个元素位置\n - [i](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题08.07.无重复字符串的排列组合/main.js#L9-L22) 指针(快指针):用于遍历整个数组\n\n2. 初始化:\n - [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 从 0 开始,表示第一个元素肯定是要保留的\n - [i](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题08.07.无重复字符串的排列组合/main.js#L9-L22) 从 1 开始遍历\n\n3. 核心逻辑:\n - 当 `nums[i] > nums[r]` 时,说明找到了一个新的不重复元素\n - 此时将 [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 向前移动一位,并将 `nums[i]` 与 `nums[r]` 交换\n - 由于数组是排序的,所以只需要比较大小就能判断是否是新元素\n\n4. 返回值:\n - 返回 [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) + 1,即不重复元素的个数\n\n### 示例演示:\n\n假设数组为 [0, 0, 1, 1, 2, 2]:\n\n1. 初始:r = 0, i = 1,nums[1] = 0, nums[0] = 0,不满足 `nums[i] > nums[r]`\n2. i = 2,nums[2] = 1, nums[0] = 0,满足 `nums[2] > nums[0]`,r 变为 1,交换 nums[2] 和 nums[1]\n - 数组变为 [0, 1, 0, 1, 2, 2],r = 1\n3. i = 3,nums[3] = 1, nums[1] = 1,不满足 `nums[i] > nums[r]`\n4. i = 4,nums[4] = 2, nums[1] = 1,满足 `nums[4] > nums[1]`,r 变为 2,交换 nums[4] 和 nums[2]\n - 数组变为 [0, 1, 2, 1, 0, 2],r = 2\n5. i = 5,nums[5] = 2, nums[2] = 2,不满足 `nums[i] > nums[r]`\n6. 结束,返回 r + 1 = 3\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n let n = nums.length,r = 0;\n for(let i = 1;i < n;i++){\n if(nums[i] > nums[r]) {\n r++;\n swap(i,r);\n }\n //console.log(nums);\n }\n return r + 1;\n // ------------------------\n function swap(i,j){\n [nums[i],nums[j]] = [nums[j],nums[i]]\n }\n};\n```\n\n### 复杂度分析:\n\n- 时间复杂度:O(n),只需要遍历一次数组\n- 空间复杂度:O(1),只使用了常数级别的额外空间\n- 利用了数组已经排序的特性,通过比较大小判断是否重复\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172297646","body":"## 思路\n经典的二分查找算法,用于在有序数组中找到目标值的插入位置\n1. **初始化变量**:\n - `n`:数组长度\n - `l`:左边界,初始为0\n - `r`:右边界,初始为n-1\n - `ans`:结果位置,初始为n(表示插入到数组末尾)\n\n2. **二分查找逻辑**:\n - 使用标准二分查找模板,当`l <= r`时继续查找\n - `mid = (l + r) >> 1`:计算中间位置(相当于除以2取整)\n - 关键判断:`if(nums[mid] >= target)`\n - 如果中间元素大于等于目标值,说明目标值应该在左半部分(包括mid位置)\n - 更新`ans = mid`,并将右边界移动到`mid - 1`\n - 否则,目标值在右半部分,将左边界移动到`mid + 1`\n\n3. **返回结果**:\n - 返回找到的插入位置`ans`\n\n### 特殊情况处理\n\n- 如果target小于所有元素,ans保持为0(正确位置)\n- 如果target大于所有元素,ans保持为n(数组长度,正确位置)\n- 如果target等于某个元素,ans为该元素的索引\n- 如果target介于两个元素之间,ans为较大元素的位置\n\n这个实现非常优雅,通过一个变量ans记录可能的答案,避免了在循环外再进行额外判断,使得代码简洁且易于理解。\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let n = nums.length;\n let l = 0, r = n - 1,ans = n;\n while(l <= r){\n let mid = (l + r) >> 1;\n if(nums[mid] >= target){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n};\n```\n\n### 复杂度分析\n\n1. **时间复杂度**:O(log n),典型的二分查找时间复杂度\n2. **空间复杂度**:O(1),只使用了常数级别的额外空间\n3. **核心思想**:寻找第一个大于等于target的元素位置","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173065451","body":"## 思路\n\n这段代码使用**单调队列**(双端队列)来解决滑动窗口最大值问题,时间复杂度为 O(n)。\n\n### 实现步骤\n\n1. **数据结构选择**\n - 使用 `q` 数组作为双端队列,存储数组元素的**索引**\n - 队列中保持索引对应的值**单调递减**的特性\n\n2. **维护单调性**\n ```javascript\n while(q.length && back() < nums[i]) q.pop();\n q.push(i);\n ```\n\n - 在每次添加新元素前,移除队尾所有小于当前元素的索引\n - 这样保证队首始终是当前窗口的最大值索引\n\n3. **窗口处理**\n ```javascript\n if(i >= k - 1){\n ans.push(nums[q[0]]); // 队首即为窗口最大值\n if(i - q[0] + 1 === k) q.shift(); // 移除窗口外的元素\n }\n ```\n\n - 当达到窗口大小时开始记录结果\n - 及时移除超出窗口范围的索引\n\n### 关键技巧\n\n- 存储索引而非值,便于判断元素是否在窗口范围内\n- 利用单调性快速获取窗口最大值(队首元素)\n- 通过索引差值判断元素是否需要移出窗口\n\n### 缺陷\n在javascript中,使用数组模拟双端队列,队首出队、入队的时间复杂度均为O(n),性能较差,可以考虑手动实现一个双端队列,例如使用双向链表,优化性能。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar maxSlidingWindow = function(nums, k) {\n let q = [],n = nums.length;\n let ans = [];\n for(let i = 0;i < n;i++){\n while(q.length && back() < nums[i]) q.pop();\n q.push(i);\n if(i >= k - 1){\n ans.push(nums[q[0]]);\n if(i - q[0] + 1 === k) q.shift();\n }\n }\n return ans;\n // ------------------------\n function back(){\n return nums[q[q.length - 1]];\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是数组的长度。单调队列的维护时间复杂度为 O(n),窗口处理时间复杂度为 O(n),因此总时间复杂度为 O(n)。\n- 空间复杂度:O(n),单调队列最多存储 n 个元素,因此空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3177500710","body":"## 思路\n\n### 1. 数据结构设计\n- 使用两个数组 `ind` 和 `outd` 分别记录每个人的入度和出度\n- 数组长度为 `n+1` 是为了方便使用1到n的索引对应人编号\n\n### 2. 统计过程\n```javascript\nfor(let [a,b] of trust){\n outd[a]++; // a相信别人,出度+1\n ind[b]++; // b被别人相信,入度+1\n}\n```\n\n- 遍历信任关系数组,统计每个人的入度和出度\n\n### 3. 法官判断\n```javascript\nfor(let i = 1;i <= n;i++){\n if(outd[i] === 0 && ind[i] === n - 1) return i;\n}\n```\n\n- 遍历所有人,寻找满足条件的人:\n - `outd[i] === 0`:不相信任何人\n - `ind[i] === n - 1`:被其他所有人相信\n\n这是典型的图论中利用入度出度解决问题的方法。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n let ind = new Array(n + 1).fill(0),// 入度\n outd = new Array(n + 1).fill(0);// 出度\n for(let [a,b] of trust){\n outd[a]++;\n ind[b]++;\n }\n for(let i = 1;i <= n;i++){\n if(outd[i] === 0 && ind[i] === n - 1) return i;\n }\n return -1;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(T + N),其中T是信任关系数,N是人数\n- 空间复杂度:O(N),用于存储入度和出度数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182022991","body":"## 思路\n\n### 1. 图的构建\n- 使用邻接表`g`存储不喜欢关系\n- 对于每一对`[a,b]`,在[a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27)的邻接表中添加`b`,在`b`的邻接表中添加[a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27)\n- 这样构建出一个无向图,表示不喜欢关系\n\n### 2. 二分图判断\n- 使用染色法判断是否为二分图\n- `color`数组记录每个节点的颜色状态:\n - `0`表示未染色\n - `1`表示第一组\n - `2`表示第二组\n\n### 3. DFS遍历\n- 遍历所有节点,对未染色节点开始DFS\n- [f(i, val)](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)函数:\n - 将节点[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)染成颜色[val](file://E:\\其他项目\\algorithm_exercises\\libs\\LinkedList.js#L34-L34)\n - 遍历[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)的所有邻居节点`j`\n - 如果邻居`j`已有颜色且与[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)相同,返回`false`\n - 如果邻居`j`未染色,递归将其染成相反颜色\n - 所有情况满足则返回`true`\n\n### 4. 核心逻辑\n- 主函数中遍历所有节点,对未染色节点调用[f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)函数\n- 如果任何一次调用返回`false`,说明无法二分,返回`false`\n- 全部成功则返回`true`\n\n这是典型的二分图判定问题,通过图的遍历和染色来解决。\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nvar possibleBipartition = function(n, dislikes) {\n let g = new Array(n + 1).fill(0).map(()=>[]);\n for(let [a,b] of dislikes){\n g[a].push(b);\n g[b].push(a);\n }\n let color = new Array(n + 1).fill(0);\n for(let i = 1;i <= n;i++){\n if(color[i] === 0 && !f(i,1)) return false;\n }\n return true;\n\n // ------------------------\n function f(i,val){\n color[i] = val;\n for(let j of g[i]){\n if(color[j] && color[j] === val) return false;\n if(!color[j] && !f(j,val === 1 ? 2 : 1)) return false; \n }\n return true;\n }\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n + dislikes.length) - 线性时间复杂度\n- 空间复杂度:O(n + dislikes.length) - 主要用于存储图结构和递归栈","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186678361","body":"## 主要思路\n\n### 1. 预处理阶段\n- **处理未分配项目**:将 `group[i] === -1` 的项目分配给新的虚拟组\n- **构建组内项目映射**:建立 `groupItems` 数组,记录每个组包含的项目\n\n### 2. 构建依赖图\n- **项目依赖图** (`itemG`):记录项目间的依赖关系\n- **小组依赖图** (`groupG`):记录小组间的依赖关系\n- **计算入度**:\n - `inID`:每个项目的入度\n - `inGD`:每个小组的入度\n\n### 3. 双层拓扑排序\n- **组间拓扑排序**:先对小组进行拓扑排序\n- **组内拓扑排序**:对每个小组内的项目进行拓扑排序\n\n## 关键函数分析\n\n### 主函数流程\n```javascript\n// 初始化和构建图结构\n// ...\n\n// 组间拓扑排序\nfor(let i = 0;i <= m;i++){\n if(inGD[i] === 0) qG.enqueue(i);\n}\nwhile(qG.size()){\n let i = qG.dequeue();\n getItemsFromGroup(i); // 处理组内项目\n // 更新小组依赖\n}\n```\n\n\n### 组内拓扑排序函数 `getItemsFromGroup`\n```javascript\nfunction getItemsFromGroup(g){\n // 对特定组内的项目进行拓扑排序\n // 只处理组内依赖关系\n}\n```\n\n## 核心思想\n采用**分层拓扑排序**策略:\n1. 先确保小组间的依赖关系满足\n2. 再确保每个小组内部的项目依赖关系满足\n3. 通过双层 BFS 实现完整的排序逻辑\n\n这种解法有效地将复杂的依赖关系分解为两个相对简单的拓扑排序问题。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n for(let i = 0;i < n;i++){\n if(group[i] === -1) group[i] = m++;\n }\n\n let groupItems = new Array(m).fill(0).map(()=>[]);\n for(let i = 0;i < n;i++){\n groupItems[group[i]].push(i);\n }\n\n\n\n let itemG = new Array(n).fill(0).map(()=>[]);// 项目依赖关系建图\n let groupG = new Array(m).fill(0).map(()=>new Set());// 小组依赖关系建图\n let inID = new Array(n).fill(0);//每个项目的入度\n let inGD = new Array(m).fill(0);//每个小组的入度\n beforeItems.forEach((prevs,curr)=>{\n inID[curr] += prevs.length;\n for(let prev of prevs) {\n itemG[prev].push(curr);\n let u = group[prev],v = group[curr];\n if(u === v) continue;\n if(groupG[u].has(v)) continue;\n groupG[u].add(v);\n inGD[v]++;\n }\n });\n\n //console.log('小组依赖',groupG,groupItems);\n\n let ans = [],qG = new Queue();\n\n\n for(let i = 0;i <= m;i++){\n if(inGD[i] === 0) qG.enqueue(i);\n }\n while(qG.size()){\n let i = qG.dequeue();\n getItemsFromGroup(i);\n for(let j of groupG[i]){\n inGD[j]--;\n if(inGD[j] === 0) qG.enqueue(j);\n }\n }\n return ans.length === n ? ans : [];\n\n // ---------------------------------\n function getItemsFromGroup(g){\n let items = groupItems[g];\n let qI = new Queue();\n for(let i of items){\n if(inID[i] === 0) qI.enqueue(i);\n }\n while(qI.size()){\n let i = qI.dequeue();\n ans.push(i);\n for(let j of itemG[i]){\n inID[j]--;\n if(inID[j] === 0 && group[j] === g) qI.enqueue(j);\n }\n }\n }\n\n };\n```\n## 复杂度分析\n- **时间复杂度**:O(n + m + |beforeItems|) - 每个项目和依赖关系只被处理一次\n- **空间复杂度**:O(n + m) - 存储图结构和队列","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190382685","body":"## 思路\n没啥好说的,模拟就完了\n## 代码\n```javascript\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let x = 0,y = 0;\n for(let move of moves){\n if(move === 'U') x--;\n else if(move === 'D') x++;\n else if(move === 'L') y--;\n else y++;\n } \n return x === 0 && y === 0\n};\n```\n## 复杂度分析\n- 时间复杂度O(n)\n- 空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193453621","body":"## 思路\n\n### 主要步骤:\n\n1. **数据预处理**:\n - 将原始任务数组 [enqueueTime, processingTime] 扩展为 [enqueueTime, processingTime, index],保留原始索引信息\n - 按照入队时间(enqueueTime)对任务进行排序\n\n2. **使用优先队列**:\n - 创建一个优先队列,排序规则是:\n - 首先按处理时间(processingTime)升序排列\n - 如果处理时间相同,则按下标(index)升序排列\n\n3. **任务处理逻辑**:\n - 初始化结果数组和当前时间点(end)\n - 当还有未处理任务或优先队列不为空时:\n - 如果优先队列为空,将当前时间点更新为下一个任务的入队时间\n - 将所有在当前时间点之前或刚好到达的未处理任务加入优先队列\n - 从优先队列中取出优先级最高的任务执行\n - 更新当前时间点(加上该任务的处理时间)\n - 将该任务的原始索引加入结果数组\n\n### 关键点解释:\n\n- **优先队列的作用**:确保在可执行的任务中,总是选择处理时间最短的任务执行(最短作业优先调度算法)\n- **时间管理**:通过 [end] 变量追踪当前时间点,确保任务按时间顺序被考虑\n- **边界处理**:当优先队列为空时,直接跳转到下一个任务的入队时间,避免不必要的循环\n\n## 代码\n```javascript\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n let data = [],n = tasks.length;\n // 按任务入队时间排序,同时不丢失下标信息。\n tasks.forEach((v,i)=>data.push([...v,i])); \n data.sort((a,b)=>a[0] - b[0]);\n // 优先队列,优先级为:先按任务时长,再按下标\n let i = 0,q = new PriorityQueue((a,b)=>{\n if(a[1] !== b[1]) return a[1] - b[1];\n return a[2] - b[2];\n });\n\n let ans = [],end = 0;\n while(i < n || q.size()){\n if(q.size() === 0) end = Math.max(end,data[i][0]);\n while(i < n && data[i][0] <= end) q.enqueue(data[i++]);\n let [_,p,index] = q.dequeue();\n ans.push(index);\n end += p;\n }\n return ans;\n};\n```\n\n## 复杂度分析\n### 时间复杂度:\n- 排序:O(n log n)\n- 优先队列操作:每个任务最多入队和出队一次,每次操作 O(log n)\n- 总体复杂度:O(n log n)\n### 空间复杂度:\n- 需要一个优先队列及一个数组保存数据,空间复杂度为 O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194152066","body":"## 思路\n\n### 主要函数功能\n\n1. [numberOfRounds](file:///E:/力扣刷题/algorithm_exercises/.md#L4-L13) - 主函数,计算从登录到登出之间的完整游戏回合数\n2. [parseTime](file:///E:/力扣刷题/algorithm_exercises/.md#L16-L18) - 辅助函数,将时间字符串解析为小时和分钟\n3. [calc](file:///E:/力扣刷题/algorithm_exercises/.md#L20-L37) - 核心计算函数,计算两个时间之间的回合数\n\n### 解题思路\n\n1. **时间解析**:首先将登录时间和登出时间解析为小时和分钟的数组\n2. **跨天处理**:如果登出时间早于登录时间,说明跨越了午夜,需要在登出时间上加24小时\n3. **回合计算**:\n - 将登录时间向上取整到最近的15分钟倍数(下一回合开始时间)\n - 计算登出时间和登录时间之间的15分钟间隔数\n - 如果结果为负数,则返回0\n\n### 代码细节\n\n```javascript\n// 时间取整逻辑\nif(m1 <= 0) m1 = 0;\nelse if(m1 <= 15) m1 = 15;\nelse if(m1 <= 30) m1 = 30;\nelse if(m1 <= 45) m1 = 45;\nelse {\n m1 = 0;\n h1++;\n}\n```\n\n这个逻辑将登录时间向上取整到下一个回合开始时间(每15分钟为一个回合)。\n\n```javascript\nlet ans = Math.floor((h2 * 60 + m2 - (h1 * 60 + m1)) / 15);\n```\n这行代码计算两个时间点之间有多少个完整的15分钟时间段。\n\n## 代码\n```javascript\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n let [h1,m1] = parseTime(loginTime),[h2,m2] = parseTime(logoutTime);\n if(h1 < h2 || h1 === h2 && m1 < m2) return calc(h1,m1,h2,m2);\n return calc(h1,m1,h2 + 24,m2);\n // -------------------------\n function parseTime(time){\n return time.split(':').map(v=>Number(v));\n }\n\n function calc(h1,m1,h2,m2){\n if(m1 <= 0) m1 = 0;\n else if(m1 <= 15) m1 = 15;\n else if(m1 <= 30) m1 = 30;\n else if(m1 <= 45) m1 = 45;\n else {\n m1 = 0;\n h1++;\n }\n // console.log(h1,m1,h2,m2)\n let ans = Math.floor((h2 * 60 + m2 - (h1 * 60 + m1)) / 15);\n if(ans < 0) return 0;\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(1),因为解析时间和计算都是常数时间操作。\n- 空间复杂度:O(1),因为只使用了常数个变量。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3195140726","body":"## 思路\n\n### 主函数 `minCharacters`\n- 通过比较三种情况的最小值来得到最终答案:\n - `altb(a,b)`: 使 a 中所有字符 < b 中所有字符需要的操作数\n - `altb(b,a)`: 使 b 中所有字符 < a 中所有字符需要的操作数\n - `aeqb(a,b)`: 使两个字符串都由同一字符组成需要的操作数\n\n### 辅助函数分析\n\n1. **`altb(a,b)` 函数**\n - 遍历分割点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) (1-25,对应字符 'b'-'z')\n - 计算需要修改的字符数:\n - [a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27) 中所有 ≥ i 的字符都需要修改\n - `b` 中所有 < i 的字符都需要修改\n - 返回最小操作数\n\n2. **`aeqb(a,b)` 函数**\n - 统计两个字符串中各字符出现次数\n - 找到出现频率最高的字符\n - 将其他所有字符都修改为该字符即为最少操作数\n\n3. **`getCharValue` 函数**\n - 将字符转换为对应的数值 (a=0, b=1, ..., z=25)\n\n## 代码\n```javascript\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n return Math.min(altb(a,b),altb(b,a),aeqb(a,b));\n // --------------------------------------\n function altb(a,b){\n let ans = Infinity;\n for(let i = 1;i < 26;i++){\n let temp = 0;\n for(let c of a) if(getCharValue(c) >= i) temp++;\n for(let c of b) if(getCharValue(c) < i) temp++;\n ans = Math.min(ans,temp);\n }\n return ans;\n }\n\n function aeqb(a,b){\n let data = new Array(26).fill(0);\n for(let c of a) data[getCharValue(c)]++;\n for(let c of b) data[getCharValue(c)]++;\n let max = data.reduce((a,b)=>Math.max(a,b),0);\n return a.length + b.length - max;\n }\n\nfunction getCharValue(char){\n return char.charCodeAt(0) - 'a'.charCodeAt(0);\n }\n};\n```\n\n\n## 复杂度分析\n- 时间复杂度:O((m+n)×26) = O(m+n),其中 m 和 n 分别是字符串 a 和 b 的长度\n- 空间复杂度:O(1),只使用了固定大小的额外空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199063845","body":"## 思路\n使用**三路快排(Three-way QuickSort)**的实现,主要通过以下步骤完成排序:\n1. **选择基准值(pivot)**:使用 `viot` 函数选择一个合适的基准值\n2. **分区操作(partition)**:将数组分为三部分:小于基准值、等于基准值、大于基准值\n3. **递归排序**:对小于和大于基准值的两个子数组递归进行快排\n\n## 关键函数分析\n\n### 1. 主排序函数 `quickSort`\n```javascript\nfunction quickSort(l,r){\n if(l >= r) return;\n let i = viot(l,r); // 选择基准值位置\n if(r - l === 1) return;\n if(i !== l) swap(i,l); // 将基准值移到最左边\n let [low,up] = partition(l,r); // 三路分区\n quickSort(l,low - 1); // 递归排序小于基准值的部分\n quickSort(up + 1,r); // 递归排序大于基准值的部分\n}\n```\n\n\n### 2. 基准值选择 `viot`\n```javascript\nfunction viot(l,r){\n // 选择左、中、右三个元素作为候选\n let a = nums[l], c = nums[r];\n let mid = (l + r) >> 1, b = nums[mid];\n \n // 通过比较这三个值选择一个较优的基准值位置\n // 实现了三数取中法的思想\n}\n```\n\n\n### 3. 三路分区 [partition](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题02.04.分割链表\\main.js#L15-L48)\n```javascript\nfunction partition(i,j){\n let viot = nums[i], l = i - 1, r = j + 1;\n for(let k = i; k < r; k++){\n let c = nums[k];\n if(c > viot){\n r--;\n swap(k,r);\n k--; // 交换后需要重新检查当前位置\n }else if(c < viot){\n l++;\n swap(k,l);\n }\n // c === viot 时,元素保持在中间区域\n }\n return [l + 1, r - 1]; // 返回等于基准值的区间边界\n}\n```\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function(nums) {\n quickSort(0,nums.length - 1);\n return nums;\n // -------------------------\n function quickSort(l,r){\n if(l >= r) return;\n // console.log(l,r,nums);\n // 找基准值位置\n let i = viot(l,r);\n if(r - l === 1) return;\n if(i !== l) swap(i,l);\n // console.log('viot',nums[l]);\n let [low,up] = partition(l,r);\n // console.log(mid,nums);\n quickSort(l,low - 1);\n quickSort(up + 1,r);\n }\n\n function partition(i,j){\n let viot = nums[i],l = i - 1,r = j + 1;\n for(let k = i;k < r;k++){\n let c = nums[k];\n if(c > viot){\n r--;\n swap(k,r);\n k--;\n }else if(c < viot){\n l++;\n swap(k,l);\n }\n }\n return [l + 1,r - 1];\n }\n\n function viot(l,r){\n let a = nums[l],c = nums[r];\n if(a > c){\n swap(l,r);\n a = nums[l];\n c = nums[r];\n }\n if(r - l === 1) return;\n let mid = (l + r) >> 1,b = nums[mid];\n // if(a === c && a === b) return l;\n if(a === c) return a < b ? l : mid;\n if(b === a || b === c) return l;\n else if(b < a) return l;\n else if(b > a && b < c) return mid;\n return r;\n }\n\n function swap(l,r){\n [nums[l],nums[r]] = [nums[r],nums[l]];\n }\n };\n```\n\n## 复杂度分析\n- **三路快排**:能够很好地处理有重复元素的数组,将相等元素聚集在一起\n- **优化的基准值选择**:使用三数取中法减少最坏情况的发生\n- **原地排序**:不需要额外的存储空间\n- **时间复杂度**:平均 O(n log n),最坏 O(n²)\n- **空间复杂度**:O(log n)(递归调用栈)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204104013","body":"## 思路\n\n### 2. 初始化变量\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31):二分查找的左边界,初始值为 `0`。\n- `r`:二分查找的右边界,初始值为 `x`。\n- `ans`:用于记录当前找到的满足条件的最大整数平方根,初始值为 `0`。\n\n### 3. 二分查找过程\n- 循环条件为 `l <= r`,表示在左边界小于等于右边界时继续查找。\n- 计算中间值 `mid`:\n ```javascript\n let mid = l + ((r - l) >> 1);\n ```\n\n 这里使用了位运算 `>> 1` 来代替除以 `2` 的操作,目的是提高计算效率。\n- 判断逻辑:\n - 如果 `mid * mid <= x`,说明 `mid` 可能是答案,但还可能有更大的值满足条件,因此更新 `ans = mid` 并将左边界右移:`l = mid + 1`。\n - 否则,说明 `mid` 太大,需要将右边界左移:`r = mid - 1`。\n\n### 4. 返回结果\n- 最终返回 `ans`,即找到的满足条件的最大整数平方根。\n\n\n## 代码\n```javascript\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n let l = 0,r = x,ans = 0;\n while(l <= r){\n let mid = l + ((r - l) >> 1);\n if(mid * mid <= x){\n ans = mid\n l = mid + 1;\n }else{\n r = mid - 1;\n }\n }\n return ans;\n};\n```\n### 复杂度分析\n- 时间复杂度为 `O(log x)`,因为采用了二分查找策略。\n- 空间复杂度为 `O(1)`,只使用了常数级别的额外空间。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208885502","body":"## 思路\n\n### 1. 二分查找策略\n- 使用 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31) 和 `r` 维护搜索区间 `[1, n]`\n- 通过 `mid = l + ((r - l) >> 1)` 计算中点,避免整数溢出\n- 根据 `isBadVersion(mid)` 的结果调整搜索区间\n\n### 2. 搜索逻辑\n- 如果 `isBadVersion(mid)` 返回 `true`(当前版本是错误的):\n - 记录当前版本为候选答案 `ans = mid`\n - 在左半区间继续搜索 `r = mid - 1`\n- 如果返回 `false`(当前版本是正确的):\n - 在右半区间继续搜索 `l = mid + 1`\n\n\n\n## 代码\n```javascript\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let l = 1,r = n,ans = 1;\n while(l <= r){\n let mid = l + ((r - l) >> 1);\n if(isBadVersion(mid)){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n };\n};\n```\n## 复杂度分析\n- 时间复杂度:O(log n)\n- 空间复杂度:O(1)\n- 通过不断缩小区间范围,最终找到第一个错误版本","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3213065724","body":"## 思路\n\n1. **归并排序框架**:使用分治思想,将数组不断二分,递归处理左右两部分\n2. **关键逻辑**:在合并两个有序数组时,统计满足 `nums[i] > 2 * nums[j]` 条件的翻转对数量\n\n## 代码结构分析\n\n### 主函数 `reversePairs`\n- 初始化变量和临时数组\n- 调用 `sort` 函数进行归并排序\n- 返回统计结果 `ans`\n\n### 排序函数 `sort`\n- 标准的归并排序递归结构\n- 将数组 `[l, r]` 分为 `[l, mid]` 和 `[mid+1, r]` 两部分\n- 递归排序后调用 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 合并\n\n### 合并函数 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37)\n包含两个主要步骤:\n\n1. **统计翻转对**:\n ```javascript\n if(nums[i] / 2 > nums[j]){\n ans += mid - i + 1;\n j++;\n }else i++;\n ```\n\n - 利用左右两部分已排序的特性\n - 当 `nums[i] > 2 * nums[j]` 时,说明从 `i` 到 `mid` 的所有元素都与 `nums[j]` 构成翻转对\n\n2. **标准归并**:\n - 将两个有序数组合并为一个有序数组\n - 使用 `temp` 数组作为临时存储\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n let n = nums.length,ans = 0;\n let temp = new Array(n);\n sort(0,n - 1);\n return ans;\n // -----------------------\n function sort(l,r){\n if(l >= r) return;\n let mid = (l + r) >> 1;\n sort(l,mid);\n sort(mid + 1,r);\n merge(l,r,mid);\n }\n\n function merge(left,right,mid){\n let i = left,j = mid + 1,p = left;\n while(i <= mid && j <= right){\n if(nums[i] / 2 > nums[j]){\n ans += mid - i + 1;\n j++;\n }else i++;\n }\n\n i = left;\n j = mid + 1;\n while(i <= mid || j <= right){\n if(j > right || i <= mid && nums[i] < nums[j]) temp[p++] = nums[i++];\n else temp[p++] = nums[j++];\n }\n\n for(let i = left;i <= right;i++) nums[i] = temp[i];\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n)\n- 空间复杂度:O(n)\n- 利用归并排序过程中数组局部有序的特性,高效统计翻转对\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216251902","body":"\n## 思路\n\n1. **排序处理**:\n - 首先对供暖器数组进行排序,这样便于后续的二分查找操作。\n\n2. **边界处理**:\n - 在供暖器数组的两端分别添加`-Infinity`和`Infinity`,这样可以简化边界条件的处理,避免在查找过程中需要特殊判断边界情况。\n\n3. **核心算法**:\n - 对每个房屋,通过[egt](file:///E:/力扣刷题/algorithm_exercises/91天学算法/day40/.md#L22-L33)函数找到第一个大于等于该房屋位置的供暖器位置\n - 然后比较该房屋与前一个供暖器和后一个供暖器的距离,取较小值作为该房屋所需的最小加热半径\n - 在所有房屋所需的最小加热半径中取最大值,就是能覆盖所有房屋的最小加热半径\n\n4. **二分查找优化**:\n - [egt](file:///E:/力扣刷题/algorithm_exercises/91天学算法/day40/.md#L22-L33)函数使用二分查找来快速定位第一个大于等于目标值的供暖器位置,时间复杂度从O(n)降低到O(log n)\n\n## 具体实现细节\n\n- `heaters[j] - house`表示房屋到右边最近供暖器的距离\n- `house - heaters[i]`表示房屋到左边最近供暖器的距离\n- `Math.min(heaters[j] - house, house - heaters[i])`得到该房屋需要的最小加热半径\n- `Math.max(ans, r)`维护所有房屋中需要的最大加热半径\n\n## 代码\n```javascript\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n const compare = (a,b) => a - b;\n heaters.sort(compare);\n heaters.push(Infinity);\n heaters.unshift(-Infinity);\n let ans = -Infinity;\n for(let house of houses){\n let j = egt(house),i = j - 1;\n r = Math.min(heaters[j] - house,house - heaters[i]);\n ans = Math.max(ans,r);\n }\n return ans;\n // -------------------------\n function egt(target){\n let l = 0,r = heaters.length - 1,ans = r + 1;\n while(l <= r){\n let mid = (l + r) >> 1\n if(heaters[mid] >= target){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(mlogn + nlogn),其中m是房屋数量。排序的时间复杂度为O(nlogn),二分查找的时间复杂度为O(logn),因此总时间复杂度为O(nlogn + mlogn)。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217776735","body":"## 思路\n\n使用了**二分搜索 + 双指针**的方法来解决问题:\n\n### 1. 排序\n```javascript\nnums.sort((a,b) => a - b);\n```\n\n首先对数组进行排序,这样可以方便后续计算距离和使用双指针技巧。\n\n### 2. 二分搜索框架\n```javascript\nlet n = nums.length;\nlet r = nums[n - 1] - nums[0], l = 0, ans = 0;\nwhile(l <= r){\n let mid = (l + r) >> 1;\n let cnt = calc(mid);\n if(cnt >= k){\n ans = mid;\n r = mid - 1;\n } else {\n l = mid + 1;\n }\n}\n```\n\n这里使用二分搜索来查找第k小的距离:\n- 搜索范围是 `[0, max_distance]`,其中 `max_distance = nums[n-1] - nums[0]`\n- 对于每个中间值 `mid`,计算有多少个数对的距离小于等于 `mid`\n- 如果数量大于等于 `k`,说明第k小的距离可能就是 `mid` 或者比 `mid` 更小\n- 如果数量小于 `k`,说明第k小的距离一定比 `mid` 更大\n\n### 3. 计算函数 calc\n```javascript\nfunction calc(mid){\n let l = 0, r = -1, ans = 0;\n while(l < n){\n while(r + 1 < n && nums[r + 1] - nums[l] <= mid) r++;\n if(r >= l) ans += r - l;\n l++;\n }\n return ans\n}\n```\n\n这个函数使用双指针技巧计算有多少个数对的距离小于等于给定值 [mid](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\462\\2.js#L20-L20):\n- 外层循环固定左指针 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\461\\3.js#L34-L34)\n- 内层循环移动右指针 `r`,直到 `nums[r] - nums[l] > mid`\n- 此时对于固定的 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\461\\3.js#L34-L34),有 `r - l` 个数对的距离小于等于 [mid](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\462\\2.js#L20-L20)\n- 累加所有可能的数对数量\n\n\n\n## 举例说明\n\n以 `nums = [1,3,1]`, `k = 1` 为例:\n1. 排序后:`[1,1,3]`\n2. 距离范围:`[0, 2]`\n3. 二分搜索过程:\n - `mid = 1`,计算距离 <= 1 的数对有 1 个(`(1,1)`)\n - 因为 1 >= k(1),所以 `ans = 1`,继续搜索左半部分\n - `mid = 0`,计算距离 <= 0 的数对有 1 个(`(1,1)`)\n - 因为 1 >= k(1),所以 `ans = 0`\n4. 返回结果 0\n\n这个解法非常巧妙地结合了二分搜索和双指针技巧,避免了直接计算所有数对距离的 O(n²) 复杂度。\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a,b) => a - b);\n let n = nums.length;\n let r = nums[n - 1] - nums[0],l = 0,ans = 0;\n while(l <= r){\n let mid = (l + r) >> 1;\n let cnt = calc(mid);\n if(cnt >= k){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n // ----------------------\n function calc(mid){\n let l = 0,r = -1,ans = 0;\n while(l < n){\n while(r + 1 < n && nums[r + 1] - nums[l] <= mid) r++;\n if(r >= l) ans += r - l;\n l++;\n }\n return ans\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n + n log D),其中 n 是数组长度,D 是最大距离\n - 排序需要 O(n log n)\n - 二分搜索需要 log D 次,每次调用 calc 函数需要 O(n)\n- 空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218701829","body":"## 思路\n\n1. **使用优先队列的BFS**:\n - 采用 `MinPriorityQueue` 实现 Dijkstra 算法变体\n - 每个元素存储 `[行, 列, 高度]`,按高度排序\n\n2. **状态表示**:\n - `vis` 数组标记已访问的格子,防止重复访问\n - `ans` 记录到达当前位置所需的最大高度(即所需最低水位)\n\n3. **搜索过程**:\n - 从起点 `(0,0)` 开始,每次选择高度最低的相邻格子\n - 更新所需最低水位为路径上遇到的最大高度\n - 直到到达终点 `(n-1,n-1)`\n\n## 关键步骤\n\n- **初始化**:标记起点已访问,将起点加入优先队列\n- **主循环**:不断取出队列中高度最低的位置\n- **更新答案**:记录路径上的最大高度值\n- **探索邻居**:向四个方向扩展未访问的邻居节点\n- **终止条件**:到达右下角时结束搜索\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n let n = grid.length,vis = new Array(n).fill(0).map(()=>new Array(n).fill(0));\n vis[0][0] = 1;\n const q = new MinPriorityQueue(v=>v[2]);\n q.enqueue([0,0,grid[0][0]]);\n let ans = 0;\n const direction = [[0,1],[1,0],[0,-1],[-1,0]];\n while(q.size()){\n let [i,j,t] = q.dequeue();\n ans = Math.max(ans,t);\n if(i === n - 1 && j === n - 1) break;\n for(let d of direction){\n let x = d[0] + i,y = d[1] + j;\n if(x >= 0 && x < n && y >= 0 && y < n){\n if(vis[x][y]) continue;\n vis[x][y] = 1;\n q.enqueue([x,y,grid[x][y]]);\n }\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n²logn),其中 n 是矩阵的边长。\n- 空间复杂度:O(n²),用于存储 vis 数组和优先队列。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222257413","body":"## 思路\n\n使用**滑动窗口**(Sliding Window)技术来解决这个问题,通过维护一个固定大小为 `k` 的窗口来遍历整个字符串。\n\n## 关键变量说明\n\n- `r`: 右指针,初始化为 -1\n- [n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6): 字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- `ans`: 记录找到的最大元音字母数\n- `total`: 当前窗口内元音字母的总数\n- [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6): 左指针,表示窗口的起始位置\n\n## 算法流程\n\n1. **外层循环**:[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 从 0 到 `n-k`,表示窗口的左边界\n ```javascript\n for(let i = 0; i <= n - k; i++)\n ```\n\n\n2. **扩展窗口**:使用 `while` 循环将右指针 `r` 向右扩展,直到窗口大小达到 `k`\n ```javascript\n while(r + 1 < n && r - i + 1 < k){\n r++;\n if(isYuanYin(s[r])) total++;\n }\n ```\n\n - 条件 `r + 1 < n` 确保不越界\n - 条件 `r - i + 1 < k` 确保窗口大小不超过 `k`\n - 每次扩展时检查新加入的字符是否为元音,并更新 `total`\n\n3. **更新最大值**:比较当前窗口的元音数量与历史最大值\n ```javascript\n ans = Math.max(ans, total);\n ```\n\n\n4. **收缩窗口**:移动左指针前,如果当前左边界字符是元音,则从总数中减去\n ```javascript\n if(isYuanYin(s[i])) total--;\n ```\n\n\n## 辅助函数\n\n```javascript\nfunction isYuanYin(c){\n return ['a','e','i','o','u'].includes(c);\n}\n```\n\n用于判断字符是否为元音字母。\n\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n let r = -1, n = s.length,ans = 0,total = 0;\n for(let i = 0;i <= n - k;i++){\n while(r + 1 < n && r - i + 1 < k){\n r++;\n if(isYuanYin(s[r])) total++;\n }\n ans = Math.max(ans,total);\n if(isYuanYin(s[i])) total--;\n }\n return ans;\n // -------------------------\n function isYuanYin(c){\n return ['a','e','i','o','u'].includes(c);\n }\n };\n```\n## 复杂度分析\n\n- 时间复杂度:O(n),其中 n 是字符串长度,每个字符最多被访问两次\n- 空间复杂度:O(1),只使用了常数额外空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3227100052","body":"## 思路\n\n### 核心技巧\n- 维护一个大小为maxPts的滑动窗口\n- 使用`sum`变量维护当前窗口内所有可能结果的概率和\n- 通过`sum -= r`和`sum += dp[i]`维护窗口滑动\n\n### 1. 边界条件处理\n```javascript\nif(0 >= k) return 0 <= n ? 1 : 0;\n```\n\n- 当目标分数`k`为0或负数时,游戏一开始就结束\n- 如果[n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6)非负,则概率为1,否则为0\n\n### 2. 初始化阶段\n```javascript\nlet sum = 0;\nfor(let i = k;i < k + maxPts;i++){\n if(i <= n) sum += 1;\n}\n```\n\n- 计算从刚好达到`k`分开始,可能到达的最高分数范围`[k, k+maxPts-1]`中满足≤n的数目\n- 这些状态的概率都是1(因为游戏结束)\n\n### 3. 动态规划倒推\n```javascript\nlet j = k + maxPts - 1, r = j <= n ? 1 : 0;\nlet dp = new Array(k).fill(0);\nfor(let i = k - 1;i >= 0;i--){\n dp[i] = sum / maxPts;\n sum -= r;\n sum += dp[i];\n j--;\n if(j >= k) r = j <= n ? 1 : 0;\n else r = dp[j];\n}\n```\n\n\n- 从`k-1`分开始倒推到0分\n- `dp[i]`表示从[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)分开始游戏获胜的概率\n- 状态转移方程:`dp[i] = (dp[i+1] + dp[i+2] + ... + dp[i+maxPts]) / maxPts`\n- 使用滑动窗口优化:维护`sum`为窗口内所有概率之和\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n if(0 >= k) return 0 <= n ? 1 : 0;\n \n let sum = 0;\n for(let i = k;i < k + maxPts;i++){\n if(i <= n) sum += 1;\n }\n let j = k + maxPts - 1, r = j <= n ? 1 : 0;\n let dp = new Array(k).fill(0);\n for(let i = k - 1;i >= 0;i--){\n dp[i] = sum / maxPts;\n sum -= r;\n sum += dp[i];\n j--;\n if(j >= k) r = j <= n ? 1 : 0;\n else r = dp[j];\n }\n return dp[0];\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(k + maxPts),其中k为`k`的取值范围\n- 空间复杂度:O(k)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3231026577","body":"## 思路\n\n1. **滑动窗口 + 字符频次统计**\n - 使用两个长度为26的数组(`pMap` 和 `sMap`)分别统计模式串 `p` 和当前窗口内子串的字符频次\n - 通过滑动窗口在 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 中寻找与 `p` 字符频次完全相同的子串\n\n2. **算法流程**\n - 首先调用 `getPmap()` 统计 `p` 中各字符出现次数\n - 初始化滑动窗口左右边界 `l=0, r=-1`\n - 在每次循环中:\n - 扩展右边界直到窗口大小等于 `p` 的长度\n - 比较当前窗口字符频次与 `p` 的字符频次是否相同\n - 如果相同,则将左边界位置加入结果数组\n - 移动左边界,更新窗口字符频次\n\n## 关键函数说明\n\n- `getPmap()`: 统计模式串 `p` 中每个字符的出现次数\n- `equal(arr1, arr2)`: 比较两个字符频次数组是否完全相同\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nvar findAnagrams = function(s, p) {\n const pMap = new Array(26).fill(0),k = p.length;\n getPmap();\n let ans = []\n let n = s.length,l = 0,r = -1,sMap = new Array(26).fill(0);\n while(l <= n - k){\n while(r + 1 < n && r - l + 1 < k){\n r++;\n let c = s[r]\n sMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;\n }\n if(equal(pMap,sMap)) ans.push(l);\n let c = s[l++];\n sMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]--;\n }\n return ans;\n // --------------------------------------------------------\n function getPmap(){\n for(let c of p){\n pMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;\n }\n }\n function equal(arr1,arr2){\n for(let i = 0;i < 26;i++){\n if(arr1[i] !== arr2[i]) return false;\n }\n return true;\n }\n };\n```\n## 复杂度分析\n\n- 时间复杂度:O(n),其中 n 是字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- 空间复杂度:O(1),只使用了固定大小的数组存储字符频次","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235816649","body":"## 思路\n\n### 核心思想\n- 使用**滑动窗口**技术\n- 维护一个动态窗口 `[l, r]`,通过双指针扩展和收缩窗口\n- 统计窗口内字符频次,确保包含 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中所有字符及其所需数量\n\n### 主要步骤\n\n1. **初始化阶段**\n - `tMap`:统计字符串 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中各字符出现次数\n - `LIMIT`:记录 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中不同字符的数量\n - `sMap`:统计当前窗口中各字符出现次数\n - `total`:记录窗口中已满足数量要求的字符种类数\n\n2. **滑动窗口主循环**\n - 外层循环移动左指针 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31)\n - 内层循环扩展右指针 `r`,直到窗口包含 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的所有字符\n - 当窗口满足条件时,尝试更新最优解\n\n3. **结果更新**\n - 使用 `check` 函数比较当前窗口与历史最优解\n - 选择更短的子串,长度相同时选择字典序更小的\n\n### check函数作用\n用于比较两个子串,选择更优的结果:\n- 优先选择长度更短的子串\n- 长度相同时选择字典序更小的\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nvar minWindow = function(s, t) {\n let tMap = {},ans = '';\n for(let c of t) tMap[c] = (tMap[c] || 0) + 1;\n const LIMIT = Object.keys(tMap).length;\n let n = s.length,l = 0,r = -1,total = 0,sMap = {};\n while(l < n){\n while(r + 1 < n && total < LIMIT){\n r++;\n let c = s[r];\n sMap[c] = (sMap[c] || 0) + 1;\n if(sMap[c] === tMap[c]) total++;\n }\n if(total === LIMIT){\n let tmp = s.slice(l,r + 1);\n if(check(tmp)) ans = tmp;\n }\n let c = s[l];\n if(sMap[c] === tMap[c]) total--;\n sMap[c]--;\n l++;\n }\n return ans;\n // ------------------------\n function check(tmp){\n if(ans === '') return true;\n if(tmp.length < ans.length) return true;\n if(tmp.length > ans.length) return false;\n for(let i = 0;i < tmp.length;i++){\n let a = tmp.charCodeAt(i),b = ans.charCodeAt(i);\n if(a < b) return true;\n if(a === b) continue;\n if(a > b) return false;\n }\n return false;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是字符串 [s](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的长度。\n- 空间复杂度:O(t),其中 t 是字符串 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的字符串种类。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/50#issuecomment-3238889944","body":"## 思路\n\n1. **前缀和与后缀和预处理**:\n - [preSum](file:///E:/力扣刷题/algorithm_exercises/周赛/458/2.js#L10-L10)数组存储从左端开始的前缀和\n - [sufSum](file:///E:/力扣刷题/algorithm_exercises/周赛/458/2.js#L15-L15)数组存储从右端开始的后缀和\n\n2. **核心思想**:\n - 我们需要从两端取k张卡牌,可以是左边取i张,右边取k-i张(i从0到k)\n - 通过预处理的前缀和与后缀和数组,可以快速计算任意数量卡牌的点数和\n\n3. **遍历所有可能的组合**:\n - 遍历i从0到k,表示从左边取i张卡牌\n - 对应从右边取k-i张卡牌\n - 计算总和并更新最大值\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} cardPoints\n * @param {number} k\n * @return {number}\n */\nvar maxScore = function(cardPoints, k) {\n let n = cardPoints.length;\n const preSum = new Array(n + 1).fill(0),sufSum = new Array(n + 1).fill(0);\n for(let i = 0;i < n;i++){\n preSum[i + 1] = preSum[i] + cardPoints[i];\n sufSum[i + 1] = sufSum[i] + cardPoints[n - i - 1];\n }\n let ans = -Infinity;\n for(let i = 0;i <= k;i++){\n ans = Math.max(ans,preSum[i] + sufSum[k - i]);\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(n+k),\n- 空间复杂度是O(n),其中n是数组长度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3239927488","body":"## 代路\n\n采用预计算和枚举的方法来解决问题:\n\n1. **预计算 *<60* 以内每个数字的二进制1的个数**:\n ```javascript\n const CNT = new Array(60).fill(0);\n for(let i = 0;i <= 59;i++){\n let n = i,t = 0;\n while(n){\n if(n & 1) t++;\n n >>= 1;\n }\n CNT[i] = t;\n }\n ```\n\n\n2. **枚举小时和分钟的分配**:\n ```javascript\n for(let i = 0;i <= 4;i++){\n let j = turnedOn - i;\n if(j > 6) continue;\n // ...\n }\n ```\n\n 这里将turnedOn个LED灯分为两部分:i个给小时部分,j个给分钟部分。由于小时最多由4个LED表示,分钟最多由6个LED表示,所以i最多为4,j最多为6。\n\n3. **获取符合条件的小时和分钟**:\n 通过`getHour(cnt)`和`getM(cnt)`函数获取二进制中恰好有cnt个1的小时数和分钟数。\n\n4. **组合时间**:\n 将符合条件的小时和分钟组合成时间字符串,格式为`H:MM`。\n\n## 代码优点\n\n1. **预计算优化**:提前计算所有0-59数字的二进制1的个数,避免重复计算\n2. **分离关注点**:将获取小时和分钟的逻辑分别封装在独立函数中\n3. **合理的边界处理**:考虑到小时(0-11)和分钟(0-59)的范围限制\n4. **正确的格式化**:分钟数始终显示为两位数\n\n\n## 代码\n```javascript\nconst CNT = new Array(60).fill(0);\nfor(let i = 0;i <= 59;i++){\n let n = i,t = 0;\n while(n){\n if(n & 1) t++;\n n >>= 1;\n }\n CNT[i] = t;\n}\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n let ans = []\n for(let i = 0;i <= 4;i++){\n let j = turnedOn - i;\n if(j > 6) continue;\n for(let h of getHour(i)){\n for(let m of getM(j)){\n ans.push(`${h}:${m}`)\n }\n }\n }\n return ans;\n\n // ------------------------------\n function getHour(cnt){\n let ans = [];\n for(let i = 0;i <= 11;i++){\n if(CNT[i] === cnt) ans.push(i);\n }\n return ans\n }\n\n function getM(cnt){\n let ans = [];\n for(let i = 0;i <= 59;i++){\n if(CNT[i] === cnt) ans.push(i < 10 ? '0' + i : i);\n }\n return ans\n }\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(1),因为小时和分钟的范围是固定的(12*60种组合)\n- **空间复杂度**:O(1),只使用了固定大小的额外空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240725656","body":"\n## 思路\n\n### 1. 位运算优化\n- 使用位运算来表示和检查约束条件:\n - `colSet`:记录已被占用的列\n - `pieSet`:记录已被占用的主对角线(撇)\n - `naSet`:记录已被占用的副对角线(捺)\n\n### 2. 对角线编号\n- 主对角线(撇):用 `i + j` 编号\n- 副对角线(捺):用 `i - j + N` 编号(确保非负)\n\n### 3. DFS 回溯过程\n- 逐行放置皇后(第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 行)\n- 对每行的每一列 `j` 检查是否可放置:\n - 通过位运算检查列、主对角线、副对角线是否冲突\n- 若无冲突则放置皇后并更新状态,递归处理下一行\n- 回溯时撤销状态更改\n\n### 4. 位操作技巧\n- `(x >> k) & 1`:检查第 k 位是否为 1\n- `x ^= (1 << k)`:翻转第 k 位(设置或取消占用)\n\n当成功放置完所有 n 行皇后时,返回 1(找到一种方案),最终统计所有可行方案数。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let colSet = 0,N = 2 * n - 1,pieSet = 0,naSet = 0;\n return dfs(0);\n // -------------------\n function dfs(i){\n if(i === n) return 1;\n let ans = 0;\n for(let j = 0;j < n;j++){\n let col = j,pie = i + j,na = (i - j + N) % N;\n if(((colSet >> col) & 1) || ((pieSet >> pie) & 1) ||((naSet >> na) & 1)) continue;\n colSet ^= (1 << col);\n pieSet ^= (1 << pie);\n naSet ^= (1 << na);\n ans += dfs(i + 1);\n colSet ^= (1 << col);\n pieSet ^= (1 << pie);\n naSet ^= (1 << na);\n }\n return ans;\n }\n};\n```\n## 复杂度分析\n- 时间复杂度:O(N!),其中 N 为输入的行数。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243912780","body":"## 思路\n\n1. **初始化**:\n - 获取网格的行数(m)和列数(n)\n - 创建访问标记数组vis,避免重复访问\n - 初始化最大面积ans为0\n\n2. **遍历网格**:\n - 遍历每个格子,如果当前格子是0(海洋)或已被访问,则跳过\n - 否则,从当前位置开始进行BFS搜索整个岛屿\n\n3. **BFS搜索**:\n - 使用队列实现广度优先搜索\n - 从起始点开始,向四个方向扩展\n - 对于每个有效的相邻陆地格子(值为1且未访问),标记为已访问并加入队列\n - 统计当前岛屿的面积\n\n4. **更新结果**:\n - 每次BFS完成后,比较当前岛屿面积和已知最大面积,保留较大值\n\n## 具体实现细节\n\n- 使用Queue数据结构实现BFS\n- 四个方向数组dirs用于简化方向处理\n- vis数组防止重复访问同一格子\n- 边界检查确保不越界\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n let m = grid.length,n = grid[0].length;\n let ans = 0;\n let vis = new Array(m).fill(0).map(()=>new Array(n).fill(0));\n for(let i = 0;i < m;i++){\n for(let j = 0;j = 0 && r < m && c >= 0 && c < n){\n if(grid[r][c] === 0) continue;\n if(vis[r][c]) continue;\n vis[r][c] = 1;\n q.enqueue([r,c]);\n }\n }\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(m×n)\n- 空间复杂度是O(m×n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247579876","body":"## 思路\n\n这是一个典型的多源BFS(广度优先搜索)问题。代码采用逆向思维,不是从海洋格子找最近的陆地,而是从所有陆地格子出发,向外扩展到海洋格子,计算每个海洋格子到最近陆地的距离。\n\n## 算法步骤\n\n1. 初始化一个与原网格同样大小的距离矩阵`dis`,所有值初始化为无穷大\n2. 遍历原网格,将所有陆地格子(值为1)的坐标和距离0加入队列,作为BFS的起点\n3. 使用BFS遍历:\n - 从队列中取出一个位置\n - 如果当前位置的距离小于记录的距离,则更新距离\n - 如果当前位置是海洋,则更新最大距离\n - 向四个方向扩展,将合法的海洋格子加入队列\n4. 返回找到的最大距离,如果不存在海洋或陆地则返回-1\n\n## 代码\n\n```javascript\nvar maxDistance = function(grid) {\n let n = grid.length;\n // 创建一个距离矩阵,初始化为无穷大\n let dis = new Array(n).fill(0).map(()=>new Array(n).fill(Infinity));\n let q = new Queue();\n \n // 将所有陆地格子(值为1)作为BFS的起始点\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(grid[i][j] === 0) continue;\n q.enqueue([i,j,0]); // [行, 列, 距离]\n }\n }\n\n // 四个方向的移动:右、下、左、上\n const dirs = [[0,1],[1,0],[0,-1],[-1,0]];\n let ans = -Infinity;\n \n // BFS遍历\n while(q.size()){\n let [i,j,d] = q.dequeue();\n \n // 如果当前距离大于等于已记录的距离,则跳过\n if(d >= dis[i][j]) continue;\n \n // 更新当前位置的距离\n dis[i][j] = d;\n \n // 如果当前位置是海洋(值为0),更新最大距离\n if(grid[i][j] === 0) ans = Math.max(ans,dis[i][j]);\n \n // 向四个方向扩展\n for(let [x,y] of dirs.map(v=>[v[0] + i,v[1] + j])){\n // 检查边界\n if(x < 0 || x >= n || y < 0 || y >= n) continue;\n // 如果是陆地则跳过\n if(grid[x][y] === 1) continue;\n // 如果新距离大于等于已记录距离则跳过\n if(d + 1 >= dis[x][y]) continue;\n // 将新位置加入队列\n q.enqueue([x,y,d + 1]);\n }\n }\n \n // 返回结果,如果没找到海洋格子则返回-1\n return ans === -Infinity ? -1 : ans === Infinity ? -1 : ans; \n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n²),每个格子最多被访问一次\n- 空间复杂度:O(n²),需要存储距离矩阵和队列\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251721463","body":"## 问题理解\n\n这个问题是一个图遍历问题,涉及以下概念:\n- 有n个盒子,每个盒子可能包含糖果、钥匙和内部盒子\n- 某些盒子是打开的(status[i] = 1),某些是关闭的(status[i] = 0)\n- 只有拿到钥匙才能打开关闭的盒子\n- 初始时有一些盒子(initialBoxes)\n- 目标是获得尽可能多的糖果\n\n## 思路\n\n### 1. 初始化阶段\n```javascript\nlet n = status.length, ans = 0,\nhas_key = new Array(n).fill(0),\nhas_box = new Array(n).fill(0);\n```\n\n- `n`: 盒子总数\n- `ans`: 最终获得的糖果总数\n- `has_key`: 标记是否拥有某个盒子的钥匙\n- `has_box`: 标记是否拥有某个盒子\n\n### 2. 设置初始状态\n```javascript\nfor(let i = 0; i < n; i++) if(status[i]) has_key[i] = 1;\nfor(let i of initialBoxes) has_box[i] = 1;\n```\n\n- 将所有本来就是打开状态的盒子(status[i] = 1)标记为拥有钥匙\n- 将初始拥有的盒子标记为已拥有\n\n### 3. DFS遍历获取糖果\n```javascript\nlet vis = new Array(n).fill(0);\nfor(let i of initialBoxes){\n if(has_box[i] && has_key[i] && !vis[i]) dfs(i);\n}\n```\n\n- `vis`: 标记盒子是否已经访问过\n- 对于每个初始盒子,如果既拥有盒子又有钥匙且未访问过,则进行DFS\n\n### 4. DFS函数实现\n```javascript\nfunction dfs(i){\n ans += candies[i]; // 收集当前盒子的糖果\n vis[i] = 1; // 标记为已访问\n for(let j of keys[i]){ // 遍历当前盒子中的钥匙\n has_key[j] = 1; // 获得钥匙\n if(has_box[j] && !vis[j]) dfs(j); // 如果拥有对应盒子且未访问,则继续DFS\n }\n for(let j of containedBoxes[i]){ // 遍历当前盒子中的内部盒子\n has_box[j] = 1; // 获得盒子\n if(has_key[j]&& !vis[j]) dfs(j); // 如果拥有对应钥匙且未访问,则继续DFS\n }\n}\n```\n\n\n## 算法流程总结\n\n1. **初始化状态**:记录每个盒子的初始状态(是否打开)和初始拥有的盒子\n2. **深度优先搜索**:从初始盒子开始,只有当同时拥有盒子和钥匙时才能打开盒子\n3. **收集资源**:打开盒子后获得糖果、钥匙和内部盒子\n4. **继续探索**:利用新获得的钥匙或盒子继续打开新的盒子\n5. **避免重复**:使用vis数组确保每个盒子只被访问一次\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n let n = status.length,ans = 0,\n has_key = new Array(n).fill(0),\n has_box = new Array(n).fill(0);\n for(let i = 0;i < n;i++) if(status[i]) has_key[i] = 1;\n for(let i of initialBoxes) has_box[i] = 1;\n let vis = new Array(n).fill(0);\n for(let i of initialBoxes){\n if(has_box[i] && has_key[i] && !vis[i]) dfs(i);\n }\n return ans;\n // ----------------------------------------\n function dfs(i){\n ans += candies[i];\n vis[i] = 1;\n for(let j of keys[i]){\n has_key[j] = 1;\n if(has_box[j] && !vis[j]) dfs(j);\n }\n for(let j of containedBoxes[i]){\n has_box[j] = 1;\n if(has_key[j]&& !vis[j]) dfs(j);\n }\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度为O(N + E),其中N是盒子数量,E是钥匙和内部盒子的总数。\n- 空间复杂度为O(N)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3257477257","body":"\n## 思路\n\n1. **坐标系统设定**:\n - 为每个节点分配坐标,根节点为原点(0, 0)\n - 向左子树移动时,列坐标减1;向右子树移动时,列坐标加1\n - 行坐标随着深度增加而增加(向下为正方向)\n\n2. **DFS遍历收集信息**:\n - 使用深度优先搜索遍历所有节点\n - 记录每个节点的值、行坐标、列坐标\n\n3. **自定义排序**:\n - 按列坐标升序排列(从左到右)\n - 列相同时按行坐标升序(从上到下)\n - 行列都相同时按节点值升序\n\n4. **分组输出**:\n - 将相同列坐标的节点值归为一组\n - 每组构成结果数组中的一个子数组\n\n## 代码:\n\n```javascript\nvar verticalTraversal = function(root) {\n let ans = [] // 存储[节点值, 行, 列]信息\n \n // DFS遍历,收集每个节点的值和坐标\n dfs(root,0,0);\n \n // 自定义排序:先按列,再按行,最后按值\n ans.sort((a,b)=>a[2] - b[2] || a[1] - b[1] || a[0] - b[0]);\n \n let col = Infinity, res = [];\n // 按列分组,将相同列的节点值组成子数组\n for(let [v,r,c] of ans){\n if(col === c) res[res.length - 1].push(v);\n else{\n res.push([v]);\n col = c;\n }\n }\n return res;\n \n // 辅助函数:深度优先遍历并记录坐标\n function dfs(root,row,col){\n if(!root) return;\n ans.push([root.val,row,col]);\n dfs(root.left,row + 1,col - 1) // 左子树:行+1,列-1\n dfs(root.right,row + 1,col + 1) // 右子树:行+1,列+1\n }\n};\n```\n## 复杂度分析\n### 时间复杂度:\n- DFS遍历:O(N),N为节点数\n- 排序:O(N log N)\n- 分组:O(N)\n- 总体:O(N log N)\n\n### 空间复杂度:\n- 存储信息:O(N)\n- 递归栈:O(H),H为树高度\n- 总体:O(N)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260240769","body":"\n\n## 思路\n\n使用了动态规划的思想,并进行了空间优化:\n\n## 具体分析\n\n1. **状态定义**:\n - `prevprev` 表示到达第 i-2 个位置的最小花费\n - `prev` 表示到达第 i-1 个位置的最小花费\n - `curr` 表示到达当前位置的最小花费\n\n2. **状态转移方程**:\n - `curr = v + Math.min(prevprev, prev)`\n - 其中 v 是当前位置的花费(顶部为0)\n\n3. **优化点**:\n - 使用滚动数组优化空间复杂度,从O(n)降到O(1)\n - 只保存前两个状态值,而不是整个dp数组\n\n4. **边界处理**:\n - 当 i < n 时,v = cost[i](正常台阶费用)\n - 当 i = n 时,v = 0(到达楼顶,没有费用)\n - 最后的返回值根据数组长度做了特殊处理\n\n\n这是一个经典的空间优化动态规划解法,通过只保留必要的状态值来减少空间使用。\n## 代码\n```javascript\nvar minCostClimbingStairs = function(cost) {\n let n = cost.length,\n prevprev = cost[0], // 表示到达第0个台阶的最小花费\n prev = cost[1], // 表示到达第1个台阶的最小花费\n curr;\n \n // 从第2个台阶开始遍历到楼梯顶部\n for(let i = 2;i <= n;i++){\n let v = 0;\n // 当i[1,1]);\n```\n\n\n1. 创建一个二维DP数组`dp`,其中`dp[i][0]`表示以`nums[i]`结尾的最长递增子序列的长度,`dp[i][1]`表示以`nums[i]`结尾的最长递增子序列的个数。\n2. 初始时,每个元素自身构成一个长度为1的递增子序列,所以都初始化为`[1,1]`。\n\n```javascript\n for(let i = 1; i < n; i++){\n for(j = i - 1; j >= 0; j--){\n if(nums[i] > nums[j]){\n if(dp[j][0] + 1 > dp[i][0]){\n dp[i][0] = dp[j][0] + 1;\n dp[i][1] = dp[j][1];\n }else if(dp[j][0] + 1 === dp[i][0]){\n dp[i][1] += dp[j][1];\n }\n }\n }\n }\n```\n\n\n3. 对于每个位置[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6),遍历它之前的所有位置`j`:\n - 如果`nums[i] > nums[j]`,说明可以将`nums[i]`接在以`nums[j]`结尾的递增子序列后面\n - 如果通过`j`得到的子序列长度(`dp[j][0] + 1`)比当前记录的长度(`dp[i][0]`)更长,则更新长度和数量\n - 如果长度相等,则将通过`j`得到的子序列数量加到当前的数量上\n\n```javascript\n let ans = 0, max = -Infinity;\n for(let [len,cnt] of dp){\n if(len > max){\n max = len;\n ans = cnt;\n }else if(max === len){\n ans += cnt;\n }\n }\n return ans;\n```\n\n\n4. 最后遍历整个DP数组,找出最长的递增子序列长度,并累加所有具有该长度的子序列的数量。\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findNumberOfLIS = function(nums) {\n let n = nums.length,dp = new Array(n).fill(0).map(()=>[1,1]);\n for(let i = 1;i < n;i++){\n for(j = i - 1;j >= 0;j--){\n if(nums[i] > nums[j]){\n if(dp[j][0] + 1 > dp[i][0]){\n dp[i][0] = dp[j][0] + 1;\n dp[i][1] = dp[j][1];\n }else if(dp[j][0] + 1 === dp[i][0]){\n dp[i][1] += dp[j][1];\n }\n }\n }\n }\n let ans = 0,max = -Infinity;\n for(let [len,cnt] of dp){\n if(len > max){\n max = len;\n ans = cnt;\n }else if(max === len){\n ans += cnt;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(n²),\n- 空间复杂度是O(n)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269148142","body":"\n## 思路\n\n### 1. 问题定义\n最长公共子序列是找出两个字符串中最长的共同子序列(不要求连续,但要保持相对顺序)。\n\n### 2. 动态规划状态定义\n```javascript\nlet m = text1.length, n = text2.length, dp = new Array(m).fill(0).map(() => new Array(n).fill(0));\n```\n\n创建一个二维数组 `dp[i][j]`,表示 `text1[0...i]` 和 `text2[0...j]` 的最长公共子序列长度。\n\n### 3. 初始化边界条件\n```javascript\nif(text1[0] === text2[0]) dp[0][0] = 1;\n\nfor(let i = 1;i < m;i++) {\n dp[i][0] = text1[i] === text2[0] ? 1 : dp[i - 1][0];\n}\nfor(let i = 1;i < n;i++) {\n dp[0][i] = text1[0] === text2[i] ? 1 : dp[0][i - 1];\n}\n```\n\n- 首先处理两个字符串的第一个字符,如果相同则 `dp[0][0] = 1`\n- 分别初始化第一列和第一行:\n - 如果当前字符匹配,则值为1\n - 否则继承前一个位置的值\n\n### 4. 状态转移方程\n```javascript\nfor(let i = 1;i < m;i++){\n for(let j = 1;j < n;j++){\n if(text1[i] === text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;\n else dp[i][j] = Math.max(\n dp[i - 1][j],\n dp[i][j - 1],\n dp[i - 1][j - 1]\n );\n }\n}\n```\n\n对于每个位置 `(i,j)`:\n- 如果 `text1[i] === text2[j]`,说明当前字符匹配,则 `dp[i][j] = dp[i-1][j-1] + 1`\n- 否则取三种情况的最大值:\n - `dp[i-1][j]`:text1[0...i-1] 与 text2[0...j] 的LCS长度\n - `dp[i][j-1]`:text1[0...i] 与 text2[0...j-1] 的LCS长度\n - `dp[i-1][j-1]`:text1[0...i-1] 与 text2[0...j-1] 的LCS长度\n\n### 5. 返回结果\n```javascript\nreturn dp[m - 1][n - 1];\n```\n\n返回 `dp[m-1][n-1]` 即为两个完整字符串的最长公共子序列长度。\n\n\n## 代码\n```javascript\n/**\n * @param {string} text1\n * @param {string} text2\n * @return {number}\n */\nvar longestCommonSubsequence = function(text1, text2) {\n let m = text1.length,n = text2.length,dp = new Array(m).fill(0).map(() => new Array(n).fill(0));\n if(text1[0] === text2[0]) dp[0][0] = 1;\n\n for(let i = 1;i < m;i++) {\n dp[i][0] = text1[i] === text2[0] ? 1 : dp[i - 1][0];\n }\n for(let i = 1;i < n;i++) {\n dp[0][i] = text1[0] === text2[i] ? 1 : dp[0][i - 1];\n }\n for(let i = 1;i < m;i++){\n for(let j = 1;j < n;j++){\n if(text1[i] === text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;\n else dp[i][j] = Math.max(\n dp[i - 1][j],\n dp[i][j - 1],\n dp[i - 1][j - 1]\n );\n }\n }\n return dp[m - 1][n - 1];\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(m×n),其中 m 和 n 分别是两个字符串的长度\n- 空间复杂度:O(m×n),用于存储 dp 数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273217746","body":"## 思路\n使用了组合数学的方法来解决不同路径问题:\n\n1. **问题转换**:\n - 机器人需要从左上角走到右下角,总共需要向右走 (n-1) 步,向下走 (m-1) 步\n - 总共需要走 (m-1)+(n-1) = m+n-2 步\n - 问题转化为:在这 m+n-2 步中,如何选择 m-1 步向下走(或 n-1 步向右走)\n\n2. **数学公式**:\n - 这是一个组合问题,答案是 C(m+n-2, m-1) 或 C(m+n-2, n-1)\n - 组合数公式:C(n,k) = n! / (k! * (n-k)!)\n - 为了避免计算阶乘导致的溢出,代码采用了逐步相乘的方式\n\n3. **实现细节**:\n - `k = m + n - 2` 表示总步数\n - `t = m - 1` 表示需要选择的步数(向下走的步数)\n - 通过循环计算组合数,每次将 `k/t` 的值乘到结果中,并递减 k 和 t\n - 最后使用 `Math.round()` 是为了处理浮点数计算可能产生的精度误差\n\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} m\n * @param {number} n\n * @return {number}\n */\nvar uniquePaths = function(m, n) {\n let k = m + n - 2;\n if(k === 0) return 1;\n let t = Math.min(m - 1,n - 1), ans = 1;\n while (t){\n ans *= k / t;\n k--;\n t--;\n }\n return Math.round(ans);\n};\n```\n\n## 复杂度分析\n- 时间复杂度为 O(min(m,n)),\n- 空间复杂度为 O(1)。\n相比动态规划方法,这种方法更加高效。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3277237117","body":"## 思路\n\n### 问题理解\n1. 骑士按照象棋规则移动(日字形,8个方向)\n2. 骑士从 (row, column) 位置开始\n3. 骑士进行 K 次随机移动\n4. 求骑士最终仍在棋盘上的概率\n\n### 解决方案\n使用记忆化递归(动态规划):\n\n1. **状态定义**:f(i, j, k) 表示骑士在位置 (i, j) 并且还能移动 k 步时,在棋盘上的概率\n\n2. **边界条件**:\n - 当 k = 0 时,如果位置在棋盘内则返回 1,否则返回 0\n - 当位置超出棋盘边界时,返回 0\n\n3. **状态转移**:\n - 对于骑士的 8 个可能移动方向,递归计算每个方向移动后的情况\n - 结果为所有可能移动结果的平均值(除以 8)\n\n4. **记忆化优化**:\n - 使用 memo 三维数组存储已经计算过的结果,避免重复计算\n\n## 代码\n\n```javascript\nvar knightProbability = function(n, k, row, column) {\n // 骑士的8个移动方向\n const dirs = [[1,2],[2,1],[1,-2],[2,-1],[-1,2],[-2,1],[-1,-2],[-2,-1]];\n \n // 记忆化数组,存储 (i,j,k) 状态下的结果\n const memo = new Array(n + 1).fill(0).map(()=>{\n return new Array(n + 1).fill(0).map(()=>{\n return new Array(k + 1).fill(-1);\n })\n })\n \n // 调用递归函数\n return f(row, column, k);\n \n function f(i, j, k) {\n // 基础情况:没有移动次数了\n if (k === 0) return i >= 0 && i < n && j >= 0 && j < n ? 1 : 0;\n \n // 超出边界\n if (i < 0 || i >= n || j < 0 || j >= n) return 0;\n \n // 已经计算过该状态\n if (memo[i][j][k] !== -1) return memo[i][j][k];\n \n let ans = 0;\n // 遍历8个方向\n for (let d of dirs) {\n let x = d[0] + i, y = d[1] + j;\n ans += f(x, y, k - 1);\n }\n \n // 每个方向的概率是 1/8,所以取平均值\n memo[i][j][k] = ans / 8;\n return ans / 8;\n } \n};\n```\n\n\n### 复杂度分析\n- 时间复杂度:O(N²×K),因为有 N×N 个位置和 K 步\n- 空间复杂度:O(N²×K),用于存储记忆化数组\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3283550644","body":"## 思路\n\n### 1. 初始判断\n```javascript\nif((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;\n```\n\n首先计算所有可选数字的总和,如果总和小于目标值,则无论如何都无法达到目标,返回false。\n\n### 2. 核心递归函数f\n```javascript\nfunction f(type,total,state){}\n```\n\n- `type`: 当前玩家类型(0表示我方,1表示对方)\n- `total`: 剩余需要达到的目标值\n- `state`: 用位掩码表示的已选择数字状态\n\n### 3. 记忆化搜索\n使用`memo`来存储已经计算过的状态结果,避免重复计算。通过`query`和[add](file://E:\\其他项目\\algorithm_exercises\\9.js#L13-L21)函数来操作这个多层Map结构。\n\n### 4. 状态转移\n对于每个未选择的数字:\n- 如果选择该数字可以直接获胜(`i + 1 >= total`),则当前玩家获胜\n- 否则,递归调用[f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)计算对手在新状态下的结果\n- 如果存在一种选择使得对手必败,则当前玩家必胜\n\n### 5. 博弈论思想\n这是一个典型的极小化极大算法应用:\n- 当前玩家希望找到至少一种选择使得对手必败(返回false)\n- 如果所有选择都导致对手必胜(都返回false),则当前玩家必败\n\n## 代码\n```javascript\n/**\n * @param {number} maxChoosableInteger\n * @param {number} desiredTotal\n * @return {boolean}\n */\nvar canIWin = function(maxChoosableInteger, desiredTotal) {\n let memo = new Map();\n if((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;\n return f(0,desiredTotal,0);\n // -------------------------------\n function f(type,total,state){\n let params = [state];\n if(query(params) !== -1) return query(params);\n let ans = false;\n for(let i = 0;i < maxChoosableInteger;i++){\n if(state & (1 << i)) continue;\n if(i + 1 >= total) {\n ans = true;\n break;\n }\n let a = f(type === 0 ? 1 : 0,total - i - 1, state | (1 << i));\n if(a === false) {\n ans = true;\n break;\n }\n }\n add(params,ans)\n return ans;\n }\n\n function query(params){\n let ans = memo;\n for(let param of params){\n if(ans.has(param) === false) return -1;\n ans = ans.get(param);\n }\n return ans;\n }\n\n function add(params,val){\n let m = memo,n = params.length, rest = params.slice(0,n - 1),last = params[n - 1];\n for(let param of rest){\n if(m.has(param) === false) m.set(param,new Map());\n m = m.get(param);\n }\n m.set(last,val);\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:$O(n*2^{n})$\n- 空间复杂度:$O(n)$","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3287375518","body":"## 思路\n\n\n1. **预处理**:\n - 计算数组总和,如果为奇数则直接返回false\n - 确定目标值target为总和的一半\n\n2. **初始化DP数组**:\n - dp[j]表示是否可以用数组中的元素组成和为j的子集\n - 初始时只考虑第一个元素nums[0],只有当j等于nums[0]时才为true\n\n3. **状态转移**:\n - 对于每个元素nums[i],更新dp数组\n - 从target到0逆序遍历,避免重复使用同一元素\n - 状态转移方程:`dp[j] = dp[j] || dp[j - nums[i]]`\n - 要么不使用当前元素,保持原来的状态dp[j]\n - 要么使用当前元素,前提是dp[j - nums[i]]为true\n\n4. **返回结果**:\n - 如果dp[target]为true,表示可以组成和为target的子集,返回true\n - 否则返回false\n\n\n## 代码\n```javascript\nvar canPartition = function(nums) {\n // 获取数组长度和总和\n let n = nums.length,sum = nums.reduce((a,b)=>a + b,0);\n \n // 如果总和是奇数,则无法分成两个相等的子集\n if(sum & 1) return false;\n \n // 目标是找到和为总和一半的子集\n const target = sum / 2;\n \n // 创建dp数组,dp[j]表示是否可以用前面的数字组成和为j的子集\n const dp = new Array(target + 1).fill(false);\n \n // 初始化:第一个数字能否组成和为j的子集\n for(let j = 0;j <= target;j++) dp[j] = nums[0] === j;\n \n // 从第二个数字开始遍历\n for(let i = 1;i < n;i++){\n // 从target到0逆序遍历(避免重复使用同一元素)\n for(let j = target;j >= 0;j--){\n // 状态转移方程:\n // dp[j] = dp[j] || dp[j - nums[i]]\n // 要么之前就能组成j,要么使用当前数字nums[i]组成j\n dp[j] = dp[j] || (j - nums[i] >= 0 ? dp[j - nums[i]] : false);\n }\n }\n \n // 返回是否能组成和为target的子集\n return dp[target];\n};\n```\n\n## 时间和空间复杂度\n\n- 时间复杂度:O(n × target),其中n是数组长度,target是数组元素和的一半\n- 空间复杂度:O(target),只使用了一维dp数组\n\n这是一个经典的0-1背包问题的应用,通过动态规划解决了分割等和子集问题。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289197873","body":"\n## 思路\n\n\n1. **递归函数 [f(i, total)](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\2.js#L16-L29)**:\n - [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 表示当前处理到数组中的第 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素\n - [total](file://E:\\力扣刷题\\algorithm_exercises\\双周赛\\165\\3.js#L5-L5) 表示前 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素通过添加 '+' 或 '-' 符号后得到的总和\n - 函数返回从第 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素开始到最后一个元素,能够得到目标值的方案数\n\n2. **边界条件**:\n - 当 `i === n` 时,表示已经处理完所有元素,如果 `total === target` 则找到一种有效方案,返回 1,否则返回 0\n\n3. **状态转移**:\n - 对于当前元素 `nums[i]`,可以选择加上它或减去它\n - 所以递归调用 `f(i+1, total-nums[i]) + f(i+1, total+nums[i])`\n\n4. **记忆化优化**:\n - 使用 [memo](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\430\\2.js#L7-L7) 数组存储已经计算过的状态,避免重复计算\n - `memo[i][total + abs_sum]` 中使用 `total + abs_sum` 是为了避免负数索引\n\n## 代码亮点\n\n1. 计算 `abs_sum` 来确定可能的和的范围,这样可以正确地映射负数到数组索引\n2. 使用记忆化递归避免重复计算,提高效率\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar findTargetSumWays = function(nums, target) {\n let n = nums.length;\n let abs_sum = nums.reduce((prev,curr)=>{\n if(curr >= 0) return curr + prev;\n return prev - curr;\n },0)\n // console.log(abs_sum);\n let memo = new Array(n + 1).fill(0).map(()=>new Array(2 * abs_sum + 1).fill(-1));\n return f(0,0);\n // ---------------------------\n function f(i,total){\n if(i === n) return target === total ? 1 : 0;\n let t = memo[i][total + abs_sum];\n // console.log(i,target,target + abs_sum,t);\n if(t !== -1) return t;\n let ans = f(i + 1,total - nums[i]) + f(i + 1,total + nums[i]);\n memo[i][total + abs_sum] = ans; \n return ans;\n }\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n × S),其中 n 是数组长度,S 是数组元素绝对值之和\n- **空间复杂度**:O(n × S),主要由 memo 数组占用","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290259438","body":"## 思路\n\n这是一个典型的完全背包问题:\n1. **状态定义**:`dp[i][j]` 表示使用前 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 种硬币凑成金额 `j` 所需的最少硬币数\n2. **状态转移**:对于第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 种硬币,我们有两种选择:\n - 不使用该硬币:`dp[i-1][j]`\n - 使用该硬币:`1 + dp[i][j-coins[i-1]]`(因为硬币可以重复使用,所以是`dp[i]`而不是`dp[i-1]`)\n3. **边界条件**:`dp[0][0] = 0`,表示不使用任何硬币凑成金额0需要0个硬币\n## 代码\n\n```javascript\nvar coinChange = function(coins, amount) {\n let n = coins.length;\n // 创建二维DP数组,dp[i][j]表示使用前i种硬币凑成金额j的最少硬币数\n let dp = new Array(n + 1).fill(0).map(()=>new Array(amount + 1).fill(Infinity));\n // 初始状态:使用0种硬币凑成金额0需要0个硬币\n dp[0][0] = 0;\n \n // 遍历每种硬币\n for(let i = 1; i <= n; i++){\n // 遍历所有可能的金额\n for(let j = 0; j <= amount; j++){\n // 状态转移方程:\n // 1. 不使用第i种硬币:dp[i - 1][j]\n // 2. 使用第i种硬币:1 + dp[i][j - coins[i - 1]] (前提是j - coins[i - 1] >= 0)\n dp[i][j] = Math.min(\n dp[i - 1][j],\n j - coins[i - 1] >= 0 ? 1 + dp[i][j - coins[i - 1]] : Infinity\n );\n }\n }\n \n // 返回结果,如果为无穷大说明无法凑成,返回-1\n return dp[n][amount] === Infinity ? -1 : dp[n][amount]\n};\n```\n\n## 时间和空间复杂度\n- 时间复杂度:O(n × amount),其中 n 是硬币种类数\n- 空间复杂度:O(n × amount)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3295404263","body":"## 思路\n\n### 状态定义\n\n- `dp[i][j]` 表示使用前 i 种硬币凑成金额 j 的组合数\n\n### 初始化\n\n- `dp[0][0] = 1`:使用 0 种硬币凑成金额 0 的方法数为 1(即什么都不选)\n\n### 状态转移方程\n\n对于第 i 种硬币(面值为 c):\n\n- `dp[i][j] = dp[i-1][j] + (j-c >= 0 ? dp[i][j-c] : 0)`\n- 其中:\n - `dp[i-1][j]`:不使用第 i 种硬币,仅使用前 i-1 种硬币凑成金额 j 的组合数\n - `dp[i][j-c]`:使用第 i 种硬币,即在凑成金额 j-c 的基础上再加一个第 i 种硬币\n\n### 关键点\n\n1. 这是一个\"完全背包\"问题:每种硬币可以使用无限次\n2. 使用的是二维DP,其中行代表硬币种类,列代表金额\n3. 转移方程中 `dp[i][j-c]`(而非 `dp[i-1][j-c]`)体现了每种硬币可重复使用的特性\n\n## 代码\n\n```javascript\n/**\n * @param {number} amount\n * @param {number[]} coins\n * @return {number}\n */\nvar change = function (amount, coins) {\n let n = coins.length, dp = new Array(n + 1).fill(0).map(() => new Array(amount + 1).fill(0));\n dp[0][0] = 1;\n for (let i = 1; i <= n; i++) {\n let c = coins[i - 1]\n for (let j = 0; j <= amount; j++) dp[i][j] = dp[i - 1][j] + (j - c >= 0 ? dp[i][j - c] : 0);\n }\n return dp[n][amount];\n };\n```\n### 时间和空间复杂度\n\n- 时间复杂度:O(n × amount),其中 n 是硬币种类数\n- 空间复杂度:O(n × amount)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3300884457","body":"## 思路\n\n1. **排序策略**:将孩子贪心值数组`g`和饼干尺寸数组[s](file://E:\\其他项目\\algorithm_exercises\\1.js)都按降序排列\n2. **贪心策略**:用最大的饼干去满足贪心值最大的孩子(即最难以满足的孩子)\n3. **双指针遍历**:使用两个指针分别遍历孩子和饼干数组\n4. **匹配逻辑**:如果当前饼干能满足当前孩子,则两个指针都前进;否则只移动孩子指针(尝试用同一块饼干满足贪心值更低的孩子)\n\n这种从最大到最小的分配方式体现了贪心思想:优先满足需求大的孩子,这样能保证整体效果最优。\n\n## 代码\n```javascript\n/**\n * @param {number[]} g\n * @param {number[]} s\n * @return {number}\n */\nvar findContentChildren = function(g, s) {\n const compare = (a,b)=>b - a;\n g.sort(compare);\n s.sort(compare);\n let i = 0,j = 0,m = g.length,n = s.length;\n let ans = 0;\n while(i < m && j < n){\n if(s[j] >= g[i]){\n ans++;\n j++;\n i++;\n }else i++;\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度为O(m log m + n log n),主要消耗在排序上,\n- 空间复杂度为O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3305173933","body":"\n## 思路\n\n贪心策略是:**尽可能选择结束时间早的区间,这样能为后续区间留出更多空间**。\n\n\n1. **按结束时间排序**:\n ```javascript\n intervals.sort((a,b)=>a[1] - b[1]);\n ```\n\n 将所有区间按照结束时间升序排列,优先考虑结束早的区间。\n\n2. **贪心选择**:\n ```javascript\n let lastEnd = -Infinity;\n for(let [s,e] of intervals){\n if(s >= lastEnd) {\n ans++;\n lastEnd = e;\n }\n }\n ```\n\n 遍历排序后的区间,如果当前区间的开始时间不早于上一个选中区间的结束时间,就选择这个区间。这确保了选中的区间互不重叠。\n\n3. **计算结果**:\n ```javascript\n return n - ans;\n ```\n\n 返回总区间数减去可以保留的区间数,即需要移除的区间数。\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} intervals\n * @return {number}\n */\nvar eraseOverlapIntervals = function(intervals) {\n intervals.sort((a,b)=>a[1] - b[1]);\n let ans = 0,n = intervals.length;\n let lastEnd = -Infinity;\n for(let [s,e] of intervals){\n if(s >= lastEnd) {\n ans++;\n lastEnd = e;\n }\n }\n return n - ans;\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n),主要消耗在排序上\n- 空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3312499521","body":"## 思路-:动态规划\n\n1. **问题目标**:判断是否能从数组的第一个位置跳到最后一个位置\n2. **解法**:使用动态规划从后往前推导\n3. **状态定义**:`dp[i]` 表示从位置 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 是否能到达最后一个位置\n4. **状态转移**:\n - 从倒数第二个位置开始往前推导\n - 对于每个位置 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22),检查能否通过跳跃到达后续的某个可达位置\n - 如果能跳到某个 `dp[j]` 为 `true` 的位置,则 `dp[i]` 也为 `true`\n\n```javascript\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canJump = function(nums) {\n let n = nums.length, dp = new Array(n).fill(false);\n dp[n - 1] = true;\n \n // 从倒数第二个位置开始向前遍历\n for(let i = n - 2; i >= 0; i--){\n let steps = nums[i];\n \n // 检查从当前位置 i 能否跳到某个可达的位置\n for(let delta = 1; delta <= steps && i + delta < n; delta++){\n let j = i + delta;\n if(dp[j]) {\n dp[i] = true;\n break;\n }\n }\n }\n \n return dp[0];\n};\n```\n\n\n## 思路总结\n\n1. **初始化**:创建一个布尔数组 [dp](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\467\\3.js#L22-L22),长度与输入数组相同,所有元素初始化为 `false`\n2. **边界条件**:最后一个位置默认为 `true`(已经在最后一个位置了)\n3. **状态转移**:从倒数第二个位置开始,对每个位置检查:\n - 根据当前位置的值,确定可以跳跃的步数范围\n - 在这个范围内,检查是否存在某个可达的位置(`dp[j]` 为 `true`)\n - 如果存在,则当前位置也是可达的\n4. **结果**:返回 `dp[0]`,即从起始位置是否可达\n\n## 复杂度分析\n这是一种典型的动态规划解法,\n- 时间复杂度为 O(n²),\n- 空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/71#issuecomment-3314420253","body":"## 思路:\n\n1. **状态定义**:`dp[i]` 表示由 i 个不同节点能构成的不同二叉搜索树的数量\n\n2. **状态转移方程**:\n - 对于 i 个节点,我们可以让其中任意一个节点 j (1 ≤ j ≤ i) 作为根节点\n - 当节点 j 作为根时:\n - 左子树包含比 j 小的 j-1 个节点,能构成 `dp[j-1]` 种不同的二叉搜索树\n - 右子树包含比 j 大的 i-j 个节点,能构成 `dp[i-j]` 种不同的二叉搜索树\n - 根据乘法原理,以 j 为根的二叉搜索树总数为 `dp[j-1] * dp[i-j]`\n - 遍历所有可能的根节点,将结果累加得到 `dp[i]`\n\n3. **边界条件**:\n - `dp[0] = 1`:空树也算一种情况\n - `dp[1] = 1`:只有一个节点时,只能构成一种二叉搜索树\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar numTrees = function(n) {\n // 创建dp数组,dp[i]表示由i个不同节点能构成的不同二叉搜索树的数量\n let dp = new Array(n + 1).fill(0);\n \n // 边界条件:0个节点可以构成1棵空树,1个节点只能构成1种二叉搜索树\n dp[0] = 1;\n dp[1] = 1;\n \n // 计算2到n个节点能构成的不同二叉搜索树数量\n for(let i = 2; i <= n; i++){\n // 对于i个节点,尝试让每个节点作为根节点\n for(let j = 1; j <= i; j++){\n // 当第j个节点作为根时:\n // 左子树有j-1个节点,可以构成dp[j-1]种不同的二叉搜索树\n // 右子树有i-j个节点,可以构成dp[i-j]种不同的二叉搜索树\n // 根据乘法原理,以j为根的二叉搜索树数量为dp[j-1] * dp[i-j]\n dp[i] += dp[j - 1] * dp[i - j]\n }\n }\n \n // 返回n个节点能构成的不同二叉搜索树数量\n return dp[n]\n};\n```\n\n\n\n\n\n## 复杂度分析\n- 时间复杂度为 O(n²),\n- 空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3315877464","body":"\n## 思路\n\n使用了**最小优先队列**来解决合并K个有序链表的问题,这是一种非常高效的解决方案。\n\n### 核心思想\n\n1. **使用最小优先队列维护所有链表的头部节点**:\n - 将K个链表的头节点都放入最小优先队列中\n - 优先队列会根据节点值进行排序,确保队首始终是最小值节点\n\n2. **逐步构建结果链表**:\n - 每次从优先队列中取出值最小的节点\n - 将该节点连接到结果链表末尾\n - 如果该节点还有后续节点,则将后续节点加入优先队列\n\n3. **重复过程直到优先队列为空**:\n - 当优先队列为空时,说明所有节点都已处理完毕\n\n### 代码详解\n\n```javascript\nvar mergeKLists = function(lists) {\n // 创建虚拟头节点,便于操作\n let dummy = new ListNode(), dh = dummy;\n \n // 创建最小优先队列,比较函数是基于节点值\n let q = new MinPriorityQueue(v => v.val);\n \n // 将所有非空链表的头节点加入优先队列\n for(let i = 0; i < lists.length; i++) \n if(lists[i]) q.enqueue(lists[i]);\n \n // 当优先队列不为空时继续处理\n while(q.size()){\n // 取出值最小的节点\n let n = q.dequeue();\n \n // 将该节点连接到结果链表\n dh.next = n;\n dh = dh.next;\n \n // 如果该节点有后续节点,将其加入优先队列\n if(n.next) q.enqueue(n.next);\n }\n \n // 返回合并后的链表\n return dummy.next;\n};\n```\n\n\n## 复杂度分析\n\n1. **时间复杂度优化**:\n - 时间复杂度为 O(N log K),其中 N 是所有节点总数,K 是链表数量\n\n2. **空间复杂度**:\n - 空间复杂度为 O(K),只需要存储K个链表的头部节点\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/73#issuecomment-3322038797","body":"## 思路:\n\n1. **分治思想**:\n - 将问题分解为两个子问题:分别处理奇数和偶数\n - `oushu = n >> 1` 计算偶数的个数(相当于 n/2 的整数部分)\n - `jishu = n - oushu` 计算奇数的个数\n\n2. **递归处理**:\n - `l1 = beautifulArray(jishu)` 递归生成奇数个数对应的漂亮数组\n - `l2 = beautifulArray(oushu)` 递归生成偶数个数对应的漂亮数组\n\n3. **映射构造**:\n - 对于奇数部分:`for(let i of l1) ans.push(2 * i - 1)` 将每个元素映射为奇数\n - 对于偶数部分:`for(let i of l2) ans.push(2 * i)` 将每个元素映射为偶数\n\n4. **核心思想**:\n - 通过将数组分为奇数和偶数两部分,确保不会在奇数和偶数之间形成等差数列\n - 因为如果一个数是奇数,另一个是偶数,那么它们的平均数不可能是整数,也就不可能在数组中找到第三个数构成等差数列\n\n## 关键点:\n\n- 基础情况:当 n=1 时,直接返回 [1]\n- 使用位运算 `>>` 实现整数除法,提高效率\n- 通过分别处理奇数和偶数部分,巧妙地避免了等差数列的形成\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number[]}\n */\nvar beautifulArray = function(n) {\n if(n === 1) return [1];\n let oushu = n >> 1,jishu = n - oushu;\n let l1 = beautifulArray(jishu),l2 = beautifulArray(oushu);\n let ans = [];\n for(let i of l1) ans.push(2 * i - 1);\n for(let i of l2) ans.push(2 * i);\n return ans\n};\n```\n\n## 复杂度分析\n- 时间复杂度为 O(n log n)。\n- 空间复杂度为 O(n log n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322078023","body":"## 思路:\n\n1. **异或运算的性质**:\n - 相同数字异或结果为0:`a ^ a = 0`\n - 任何数字与0异或等于自身:`a ^ 0 = a`\n - 异或运算满足交换律和结合律\n\n2. **第一步:计算所有数字的异或结果**:\n ```javascript\n let xor = 0;\n nums.forEach(n=>xor = xor ^ n);\n ```\n\n 这一步得到的是两个只出现一次的数字的异或结果,因为出现两次的数字都会相互抵消。\n\n3. **第二步:找到区分两个目标数字的位**:\n ```javascript\n let type = xor & (-xor);\n ```\n\n 这一步很关键,通过 `xor & (-xor)` 找到 `xor` 中最右边的1位。这个位必定在两个目标数字中一个为1,一个为0,因为只有这样它们的异或结果才会是1。\n\n4. **第三步:根据该位将数组分为两组**:\n ```javascript\n let a = 0, b = 0;\n for(let num of nums){\n if(type & num) a = a ^ num; // 该位为1的数字分为一组\n else b ^= num; // 该位为0的数字分为一组\n }\n ```\n\n 通过这种方式,将两个目标数字分到不同的组中,而相同的数字由于该位相同会被分到同一组,在组内异或后会被抵消,最终每组只剩下各自的目标数字。\n\n## 复杂度分析\n\n- 时间复杂度是 O(n),\n- 空间复杂度是 O(1),非常高效。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar singleNumber = function(nums) {\n let xor = 0;\n nums.forEach(n=>xor = xor ^ n);\n let type = xor & (-xor);\n let a = 0,b = 0;\n for(let num of nums){\n if(type & num) a = a ^ num;\n else b ^= num;\n }\n return [a,b];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3326222352","body":"## 思路\n\n1. `let n = 1 << (nums.length)`:通过左移运算计算出子集的总数。对于长度为n的数组,其子集总数为2^n。这里使用位运算`1 << nums.length`等价于2的nums.length次方。\n\n2. 外层循环`for(let i = 0;i < n;i++)`:遍历从0到2^n-1的每个数字,每个数字代表一个子集。\n\n3. 对于每个数字i(用变量j来操作):\n - 使用`j & 1`检查j的最低位是否为1\n - 如果是1,则将nums[k]加入当前子集temp中\n - 然后将j右移一位(`j >>= 1`),检查下一位\n - 同时k递增,指向nums中的下一个元素\n\n4. 内层while循环结束后,将生成的子集temp添加到结果数组ans中。\n\n## 复杂度分析\n使用位运算生成所有子集的方法,\n- 时间复杂度为O(n*2^n),\n- 空间复杂度为O(n*2^n)。\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[][]}\n */\nvar subsets = function(nums) {\n let n = 1 << (nums.length),ans = [];\n for(let i = 0;i < n;i++){\n let temp = [],j = i,k = 0;\n while(j){\n if(j & 1) temp.push(nums[k]);\n j >>= 1;\n k++;\n }\n ans.push(temp);\n }\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3331626491","body":"## 思路\n\n1. **TrieNode(Trie节点)**\n - `isEnd`:标记该节点是否为某个单词的结尾\n - `children`:大小为26的数组,存储指向子节点的指针(对应26个小写字母)\n\n2. **辅助函数**\n - `getCharIndex(c)`:将字符转换为其在字母表中的索引(0-25)\n\n### 1. 初始化(`Trie`构造函数)\n- 创建一个根节点 `root`,作为整个Trie树的起点\n\n### 2. 插入单词(`insert`方法)\n- 从根节点开始,逐字符遍历要插入的单词\n- 对于每个字符:\n - 计算其在字母表中的索引\n - 如果对应子节点不存在,则创建新节点\n - 移动到该子节点\n- 遍历完所有字符后,将最后一个节点标记为单词结尾(`isEnd = true`)\n\n### 3. 搜索单词(`search`方法)\n- 从根节点开始,逐字符遍历要搜索的单词\n- 对于每个字符:\n - 计算索引并检查对应子节点是否存在\n - 如果不存在,返回 `false`\n - 如果存在,移动到该子节点\n- 遍历完所有字符后,检查最后一个节点是否为单词结尾(`isEnd`为`true`)\n\n### 4. 前缀匹配(`startsWith`方法)\n- 与`search`类似,但不检查最后一个节点是否为单词结尾\n- 只要能完整遍历前缀中的所有字符,就返回`true`\n\n## 时间复杂度\n- 插入和搜索操作的时间复杂度均为O(m),其中m为单词或前缀的长度\n\n## 空间复杂度\n- O(ALPHABET_SIZE × N × M),其中N为插入的单词数,M为平均单词长度\n\n## 代码\n```javascript\nfunction TrieNode(){\n this.isEnd = false;\n this.children = new Array(26);\n}\n\nfunction getCharIndex(c){\n return c.charCodeAt(0) - 'a'.charCodeAt(0);\n}\n\nvar Trie = function() {\n this.root = new TrieNode();\n};\n\n/** \n * @param {string} word\n * @return {void}\n */\nTrie.prototype.insert = function(word) {\n let root = this.root;\n for(let c of word){\n let i = getCharIndex(c);\n if(!root.children[i]) root.children[i] = new TrieNode();\n root = root.children[i];\n }\n root.isEnd = true;\n};\n\n/** \n * @param {string} word\n * @return {boolean}\n */\nTrie.prototype.search = function(word) {\n let root = this.root;\n for(let c of word){\n let i = getCharIndex(c);\n if(!root.children[i]) return false;\n root = root.children[i];\n }\n return root.isEnd;\n};\n\n/** \n * @param {string} prefix\n * @return {boolean}\n */\nTrie.prototype.startsWith = function(prefix) {\n let root = this.root;\n for(let c of prefix){\n let i = getCharIndex(c);\n if(!root.children[i]) return false;\n root = root.children[i];\n }\n return !!root\n};\n\n/** \n * Your Trie object will be instantiated and called as such:\n * var obj = new Trie()\n * obj.insert(word)\n * var param_2 = obj.search(word)\n * var param_3 = obj.startsWith(prefix)\n */\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3336492052","body":"## 思路\n\n### 1. TrieNode 结构\n- `TrieNode` 是一个前缀树节点结构。\n- 每个节点包含:\n - `value`: 当前节点对应的值总和。\n - [end](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14): 标记该节点是否为某个单词的结尾。\n - `children`: 长度为26的数组,存储子节点(对应字母a-z)。\n\n### 2. MapSum 类\n- 使用前缀树(Trie)和哈希表(Map)实现键值映射与前缀求和功能。\n- `root`: Trie树的根节点。\n- [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5): 存储已插入的键值对。\n\n## 核心方法\n\n### insert(key, val)\n- 插入或更新键值对:\n - 如果键已存在,更新所有相关节点的值(先减去旧值,再加上新值)。\n - 如果是新键,则在Trie中创建路径,并在路径上的每个节点累加值。\n - 最后更新哈希表中的键值对。\n\n### sum(prefix)\n- 查询指定前缀的所有键值总和:\n - 遍历前缀,在Trie中查找对应的节点。\n - 若找不到完整前缀则返回0。\n - 返回前缀末尾节点的 `value` 值(即以该前缀开头的所有键的值总和)。\n\n## 工具函数\n\n### getCharIndex(char)\n- 将字符转换为其在字母表中的索引(0-25)。\n\n\n\n\n## 代码\n```javascript\nfunction TrieNode(){\n this.value = 0;\n this.end = false;\n this.children = new Array(26);\n}\n\nfunction getCharIndex(a){return a.charCodeAt(0) - 'a'.charCodeAt(0)}\nvar MapSum = function() {\n this.root = new TrieNode();\n this.map = new Map();\n};\n\n/** \n * @param {string} key \n * @param {number} val\n * @return {void}\n */\nMapSum.prototype.insert = function(key, val) {\n if(this.map.has(key)){\n let root = this.root;\n for(let c of key){\n let i = getCharIndex(c);\n root.children[i].value -= this.map.get(key);\n root.children[i].value += val;\n root = root.children[i];\n }\n }else{\n let root = this.root;\n for(let c of key){\n let i = getCharIndex(c);\n if(!root.children[i]) root.children[i] = new TrieNode();\n root = root.children[i];\n root.value += val;\n }\n root.end = true;\n }\n this.map.set(key,val);\n};\n\n/** \n * @param {string} prefix\n * @return {number}\n */\nMapSum.prototype.sum = function(prefix) {\n let root = this.root;\n let ans = 0\n for(let c of prefix){\n let i = getCharIndex(c);\n if(!root.children[i]) return 0;\n root = root.children[i];\n }\n return root.value;\n};\n\n/** \n * Your MapSum object will be instantiated and called as such:\n * var obj = new MapSum()\n * obj.insert(key,val)\n * var param_2 = obj.sum(prefix)\n */\n```\n\n\n## 复杂度分析\n- 时间复杂度:O(n),n位单词的长度。\n- 空间复杂度:O(m * n),m为单词个数,n为单词长度。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/78#issuecomment-3340984021","body":"## 算法思路\n\n1. **构建 Trie 树**:\n - 将 `smalls` 数组中的所有字符串插入到 Trie 树中\n - 每个节点记录是否为单词结尾([end](file://E:\\力扣刷题\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14) 标志)以及对应的索引位置([i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22))\n\n2. **搜索过程**:\n - 遍历 `big` 字符串的每个位置作为起始点\n - 对每个起始点,使用 [dfs](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\465\\2.js#L9-L25) 函数在 Trie 树中进行匹配\n - 当匹配到完整单词时,将起始位置记录到对应的结果数组中\n\n3. **Trie 树结构**:\n - `TrieNode`:包含 [end](file://E:\\力扣刷题\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14) 标志、子节点数组和索引 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22)\n - `Trie`:提供插入方法,将单词和其索引存储到树中\n\n## 关键函数分析\n\n- **`multiSearch` 主函数**:\n - 初始化 Trie 树并插入所有 smalls 单词\n - 遍历 big 字符串每个位置进行搜索\n\n- **[dfs](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\465\\2.js#L9-L25) 辅助函数**:\n - 从当前 Trie 节点继续匹配字符\n - 找到匹配单词时记录位置信息\n\n## 时间复杂度\n\n- **构建 Trie**:O(∑|smalls[i]|),即所有 smalls 字符串长度之和\n- **搜索过程**:O(|big| × max_match_length)\n - 外层循环遍历 `big` 字符串:O(|big|)\n - 每次 dfs 最坏情况遍历到最长匹配:O(max_match_length)\n- **总体复杂度**:O(∑|smalls[i]| + |big| × max_match_length)\n\n## 空间复杂度\n\n- **Trie 树存储**:O(∑|smalls[i]| × 26) = O(∑|smalls[i]|)\n- **结果数组**:O(∑结果数量)\n- **总体空间复杂度**:O(∑|smalls[i]| + 结果数量)\n\n## 代码\n```javascript\n/**\n * @param {string} big\n * @param {string[]} smalls\n * @return {number[][]}\n */\nvar multiSearch = function(big, smalls) {\n let trie = new Trie(),n = smalls.length;\n for(let i = 0;i < n;i++) trie.insert(smalls[i],i);\n let ans = new Array(n).fill(0).map(()=>[]);\n for(let i = 0;i < big.length;i++){\n let root = trie.root;\n let c = big[i],j = getCharIndex(c);\n if(!root.children[j]) continue;\n dfs(root,i,i);\n }\n\n return ans;\n\n // --------------------------\n function dfs(root,index,j){\n if(index === big.length) return;\n let c = big[index],i = getCharIndex(c);\n if(!root.children[i]) return;\n root = root.children[i];\n if(root.end) ans[root.i].push(j);\n dfs(root,index + 1,j);\n }\n};\n\n\n\n\nfunction Trie(){\n this.root = new TrieNode();\n}\n\nTrie.prototype.insert = function(word,i){\n let root = this.root;\n for(let c of word){\n let j = getCharIndex(c);\n if(!root.children[j]) root.children[j] = new TrieNode();\n root = root.children[j]\n }\n root.i = i;\n root.end = true;\n}\n\n\nfunction TrieNode(){\n this.end = false;\n this.children = new Array(26);\n this.i = -1;\n}\n\nfunction getCharIndex(c){\n return c.charCodeAt(0) - 'a'.charCodeAt(0);\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/79#issuecomment-3342189359","body":"## 思路\n\n1. **并查集初始化**:\n - 创建一个长度为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6) 的数组 [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17),其中 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6) 是城市数量\n - 初始化时,每个城市都指向自己,即 `f[i] = i`,表示每个城市初始时都是独立的集合\n\n2. **连接城市**:\n - 遍历 `isConnected` 矩阵,对于每一对相连的城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 和 `j`\n - 调用 [merge(i, j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28) 函数将它们合并到同一个集合中\n\n3. **并查集操作**:\n - [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24) 函数:查找城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 所属集合的根节点,并进行路径压缩优化\n - [merge(i, j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28) 函数:将城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 和 `j` 所在的集合合并\n\n## 关键点分析\n\n- **路径压缩**:在 [find](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\2.js#L26-L29) 函数中使用了 `f[i] = find(f[i])` 来压缩路径,提高查找效率\n- **集合合并**:每次成功合并两个不同的集合时,省份数量 [ans](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6) 减一\n- **初始值**:[ans](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6) 初始化为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6),表示最坏情况下每个城市都是一个独立省份\n\n## 代码\n```javascript\n/**\n * @param {number[][]} isConnected\n * @return {number}\n */\nvar findCircleNum = function(isConnected) {\n let n = isConnected.length,f = new Array(n).fill(0).map((_,i)=>i);\n let ans = n;\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(isConnected[i][j]) merge(i,j);\n }\n }\n return ans;\n // ------------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n let fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n ans--;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n^2),其中 n 是城市数量\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/80#issuecomment-3344661787","body":"## 思路\n\n1. **并查集初始化**\n - 使用并查集(Union-Find)数据结构来管理节点连接关系\n - [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17) 数组存储每个节点的父节点,初始时每个节点的父节点是自身\n - [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 数组存储每个连通分量的大小,初始时每个分量大小为1\n\n2. **构建连通分量**\n - 遍历 `graph` 矩阵,对于每条边 `graph[i][j]`,将节点 i 和 j 合并到同一连通分量中\n - 通过 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 函数实现节点合并,并更新连通分量大小\n\n3. **统计初始感染节点**\n - 使用 `initialMap` 统计每个连通分量中有多少个初始感染节点\n - 通过 [find](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\2.js#L26-L29) 函数找到每个初始感染节点所属的连通分量\n\n4. **选择最优移除节点**\n - 遍历所有初始感染节点,寻找满足以下条件的节点:\n - 所在连通分量只有1个初始感染节点(否则移除该节点无法减少传播)\n - 能够拯救最多节点的连通分量\n - 如果拯救数量相同,选择索引最小的节点\n\n5. **边界情况处理**\n - 如果所有初始感染节点所在的连通分量都包含多个感染节点,则返回 `initial` 中的最小索引\n\n## 关键函数\n\n- [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24): 查找节点 i 的根节点(带路径压缩优化)\n- [merge(i,j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28): 合并节点 i 和 j 所在的连通分量\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} graph\n * @param {number[]} initial\n * @return {number}\n */\nvar minMalwareSpread = function(graph, initial) {\n let n = graph.length;\n let f = new Array(n).fill(0).map((_,i)=>i);\n let s = new Array(n).fill(1);\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(graph[i][j]) merge(i,j);\n }\n }\n\n\n let initialMap = new Map();\n for(let i of initial){\n let fi = find(i);\n initialMap.set(fi,initialMap.has(fi) ? initialMap.get(fi) + 1 : 1);\n }\n let ans = n,max = 0;\n for(let i of initial){\n let fi = find(i);\n if(initialMap.get(fi) > 1) continue;\n if(s[fi] > max || s[fi] === max && i < ans) {\n max = s[fi];\n ans = i\n }\n }\n\n return ans === n ? initial.reduce((prev,curr)=>Math.min(prev,curr),n) : ans;\n\n\n\n // -----------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n let fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n s[fj] += s[fi];\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n^2),\n- 空间复杂度:O(n),其中 n 是节点数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/81#issuecomment-3349592362","body":"\n\n## 思路\n\n1. **并查集数据结构**:\n - 使用数组 [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17) 实现并查集,初始化时每台计算机的父节点是自身\n - [size](file://E:\\其他项目\\algorithm_exercises\\libs\\Stack.js#L19-L21) 记录当前连通分量的数量,初始为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6)\n\n2. **可行性判断**:\n - 如果连接数 `cnt` 小于 `n-1`,则无法连接所有计算机,返回 `-1`\n\n3. **连通分量合并**:\n - 遍历所有连接关系,通过 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 函数合并对应的计算机\n - 每次成功合并都会减少连通分量数量\n\n4. **结果计算**:\n - 最终需要的操作次数等于连通分量数减一(`size - 1`)\n\n## 关键函数\n\n- [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24):查找计算机 [i](file://E:\\其他项目\\algorithm_exercises\\周赛\\469\\2.js#L23-L23) 所在集合的根节点(带路径压缩优化)\n- [merge(i,j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28):合并计算机 [i](file://E:\\其他项目\\algorithm_exercises\\周赛\\469\\2.js#L23-L23) 和 `j` 所在的集合\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} connections\n * @return {number}\n */\nvar makeConnected = function(n, connections) {\n const cnt = connections.length;\n if(cnt < n - 1) return -1;\n const f = new Array(n).fill(0).map((_,i)=>i);\n let size = n;\n for(let [i,j] of connections) merge(i,j);\n return size - 1;\n\n // ----------------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n const fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n size--;\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(m×α(n)),其中 m 是连接数,α 是阿克曼函数的反函数\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3354314699","body":"## 思路\n\n使用**后序遍历**的方式递归处理二叉树,删除所有值为0的叶子节点及其所属的全0子树。\n\n## 具体实现分析\n\n1. **基础情况处理**\n - `if(!root) return root;` - 空节点直接返回\n - `if(root && !root.left && !root.right) return root.val === 0 ? null : root;` - 叶子节点判断:如果是值为0的叶子节点则删除\n\n2. **递归处理**\n - `let l = pruneTree(root.left), r = pruneTree(root.right);` - 递归处理左右子树\n - 处理后的左右子树结果保存在 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\468\\2.js#L7-L7) 和 [r](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\447\\1.js#L31-L31) 中\n\n3. **当前节点判断**\n - `if(!l && !r && root.val === 0) return null;` - 如果左右子树都被删除且当前节点值为0,则删除当前节点\n - 否则更新当前节点的左右子树引用并返回当前节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {TreeNode}\n */\nvar pruneTree = function(root) {\n if(!root) return root;\n if(root && !root.left && !root.right) return root.val === 0 ? null : root;\n\n let l = pruneTree(root.left),r = pruneTree(root.right);\n if(!l && !r && root.val === 0) return null;\n root.left = l;\n root.right = r;\n return root;\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**: O(n),需要访问每个节点一次\n- **空间复杂度**: O(h),h为树的高度,递归调用栈的深度\n- **关键点**: 后序遍历确保了从叶子节点开始处理,逐步向上删除符合条件的节点","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null],"haoyuliaocurb":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073435345","body":"```\n// Time Complexity: O(max(num.length, k))\n// Space Complexity: O(max(num.length, k))\n\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(num, k) {\n const num1 = num;\n const num2 = String(k).split('').map(v => Number(v));\n const sum = [];\n\n for (let i = 0; i < Math.max(num1.length, num2.length); i += 1) {\n const s = (num1[num1.length - 1 - i] ?? 0) + (num2[num2.length - 1 - i] ?? 0) + (sum[i] ?? 0);\n\n sum[i] = s % 10;\n sum[i + 1] = (s - (s % 10)) / 10;\n }\n\n if (sum[sum.length - 1] === 0) sum.pop();\n sum.reverse();\n\n return sum;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078842293","body":"【解題方向】\n\n第一想法:對於每一個 s[i] 都遍歷一次找最近的 c,Time Complexity 為 O(n^2) \n\n第二想法:先遍歷一遍 s 找到所有的 c,然後從所有的 c 開始向兩邊走\n\t=> 不過想到如何記錄狀態就覺得太複雜,而且可能最糟情況還是 Time Complexity 為 O(n^2) \n\n第三想法:看了提示,想到正向遍歷、反向遍歷一次,記錄 s[i] 與左右兩邊的 c 的最小距離\n\t=> 由於題目保證至少有一個 s 中至少有一個 c,對於每個 s[i],其左或右必然會有一個 c\n\n【程式碼】\n```\n// Time Complexity: O(n), n = s.length;\n// Space Complexity: O(n), n = s.length;\n\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const chars = s.split('');\n const res = new Array(chars.length).fill(Infinity);\n\n let leftTargetCharIndex = -1;\n for (let i = 0; i < chars.length; i += 1) {\n if (chars[i] === c) leftTargetCharIndex = i;\n if (leftTargetCharIndex > -1) {\n res[i] = Math.min(res[i], Math.abs(leftTargetCharIndex - i));\n }\n }\n\n let rightTargetCharIndex = -1;\n for (let i = chars.length - 1; i > -1; i -= 1) {\n if (chars[i] === c) rightTargetCharIndex = i;\n if (rightTargetCharIndex > -1) {\n res[i] = Math.min(res[i], Math.abs(rightTargetCharIndex - i));\n }\n }\n\n return res;\n};\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089452516","body":"1. 第一個直覺是用 recursion 來解題,不過過程中會遇到很多 edge case 沒有考慮到而 error thrown\n2. 後來改用 stack 來實踐,也很清楚,不過需要搞懂什麼應該被放進 stack,以及 pop and push 的時機\n\n```\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * Recursive version of decodeString\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const helper = (str, index) => {\n let result = '';\n let num = 0;\n \n while (index < str.length) {\n const char = str[index];\n \n if (char >= '0' && char <= '9') {\n num = num * 10 + parseInt(char);\n index++;\n } else if (char === '[') {\n // Recursively decode the content inside brackets\n const [decodedStr, newIndex] = helper(str, index + 1);\n result += decodedStr.repeat(num);\n num = 0; // Reset number after using it\n index = newIndex;\n } else if (char === ']') {\n // End of current bracket section - return result and current index\n return [result, index + 1];\n } else {\n // Regular character\n result += char;\n index++;\n }\n }\n \n return [result, index];\n };\n \n return helper(s, 0)[0];\n};\n\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let currentStr = '';\n let currentNum = 0;\n \n for (let i = 0; i < s.length; i++) {\n const char = s[i];\n \n if (char >= '0' && char <= '9') {\n currentNum = currentNum * 10 + parseInt(char);\n } else if (char === '[') {\n // Push current state to stack\n stack.push([currentStr, currentNum]);\n currentStr = '';\n currentNum = 0;\n } else if (char === ']') {\n // Pop from stack and decode\n const [prevStr, num] = stack.pop();\n currentStr = prevStr + currentStr.repeat(num);\n } else {\n // Regular character\n currentStr += char;\n }\n }\n \n return currentStr;\n};\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091467280","body":"透過第二個 stack 倒轉第一個 in-stack 的順序,以達到 FIFO 的效果\n```\n// Time Complexity: O(1) for push, pop, peek, empty;\n// Space Complexity: O(n)\n\nclass MyQueue {\n constructor() {\n this.inStack = [];\n this.outStack = [];\n }\n\n /** \n * @param {number} x\n * @return {void}\n */\n push(x) {\n this.inStack.push(x);\n }\n\n /**\n * @return {number}\n */\n pop() {\n if (!this.outStack.length) {\n this.pushToOutStack();\n }\n\n return this.outStack.pop();\n }\n\n /**\n * @return {number}\n */\n peek() {\n if (!this.outStack.length) {\n this.pushToOutStack();\n }\n\n return this.outStack[this.outStack.length - 1];\n }\n\n /**\n * @return {boolean}\n */\n empty() {\n return this.peek() === undefined;\n }\n\n pushToOutStack() {\n while (this.inStack.length) {\n this.outStack.push(this.inStack.pop());\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094426027","body":"// Time Complexity: O(n);\n// Space Complexity: O(n);\n\n```\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const sortedArr = [...arr].sort((a, b) => a - b);\n let counts = {};\n let chunkAmount = 0;\n\n for (let i = 0; i < arr.length; i += 1) {\n counts[arr[i]] = (counts[arr[i]] ?? 0) + 1;\n counts[sortedArr[i]] = (counts[sortedArr[i]] ?? 0) - 1;\n\n if (Object.values(counts).every((value) => value === 0)) {\n chunkAmount += 1;\n }\n }\n\n return chunkAmount;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095908728","body":"```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\nvar rotateRight = function (head, k) {\n if (!head || !head.next) return head;\n\n let length = 0;\n let cur = head;\n\n while (cur) {\n cur = cur.next;\n length += 1;\n }\n\n k = k % length;\n let left = head;\n let right = head;\n\n while (right.next) {\n if (k <= 0) left = left.next;\n right = right.next;\n k -= 1;\n }\n\n right.next = head; // Handle the case when left and right point to the same node.\n let res = left.next;\n left.next = null;\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3102283858","body":"建立一個 dummy 連結在 head 之前,便可以將 head 當作中間節點處理。每次互換節點會牽涉四個節點,pre, cur, next, next.next,其中 pre 的初始值為 dummy,因此在每個迴圈保證有值,而真正要互換的 cur, next,其兩有值為 while 迴圈繼續的必要條件,next.next 為 null 則沒關係。\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n const dummy = { val: 0, next: head };\n\n let pre = dummy;\n let cur = pre.next;\n let next = cur?.next;\n\n while (cur && next) {\n pre.next = next;\n cur.next = next.next;\n next.next = cur;\n\n [pre, cur, next] = [cur, cur.next, cur.next?.next];\n }\n\n return dummy.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105649705","body":"# 想法\n轉換成 Height Balanced Binary Search Tree 會需要進行 Binary Search,考慮到單向鏈錶不方便直接存取 node,因此直接將鏈錶轉成數組,並直接以數組配合 Binary Search 遞迴建立樹。\n\n```\n\n// Time Complexity: O(n);\n// Space Complexity: O(n);\n\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if (head === null) return null;\n\n const dummy = new ListNode(0, head);\n const arr = [];\n\n let tail = dummy;\n\n while (tail) {\n const next = tail.next;\n next && arr.push(next.val);\n tail = next;\n }\n\n const inner = (l, r) => {\n if (l > r) return null;\n if (l === r) return new TreeNode(arr[r]);\n\n const m = Math.ceil((l + r) / 2);\n\n return new TreeNode(arr[m], inner(l, m - 1), inner(m + 1, r));\n };\n\n return inner(0, arr.length - 1);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112936097","body":"## 思考方向\n### 雙指針\n用兩個指針分別從 headA, headB 開始走,走到盡頭換到另一個 head。過程中若指向同一個點則為兩鏈錶的交點,若皆遍歷一遍後無交點,則兩鏈錶無相交。\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function(headA, headB) {\n let pointerA = headA;\n let pointerB = headB;\n let switchCounts = 0;\n\n while (switchCounts < 3) {\n if (pointerA === pointerB) return pointerA;\n\n if (pointerA?.next) {\n pointerA = pointerA.next;\n } else {\n switchCounts += 1;\n pointerA = headB;\n }\n\n if (pointerB?.next) {\n pointerB = pointerB.next;\n } else {\n switchCounts += 1;\n pointerB = headA;\n }\n }\n\n return null;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116343077","body":"## 解題方向\n- 快慢指針法\n\n## Edge Cases\n- 當快指針走到 null 代表沒有環\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n let fast = head;\n let slow = head;\n\n do {\n if (fast === null) return null;\n\n fast = fast?.next?.next ?? null;\n slow = slow?.next ?? null;\n } while (fast !== slow);\n\n fast = head;\n\n while (fast !== slow) {\n fast = fast?.next ?? null;\n slow = slow?.next ?? null;\n }\n\n return fast;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121584769","body":"## 解題方向\n- 看到 FISO 的第一個想法是用 Queue,搭配 hash 也可以達到 get O(1) 的要求,不過 put 更新既有的值,就沒辦法 O(1)。\n若是 put 更新既有的值要 O(1),還是需要使用鏈表。\n- 中間有一度 debug 卡關,主要是原本在 put 時無論如何都先把既有的 node 刪掉再新增,但這可能造成一些 state 更新上的錯誤,後來簡化為直接移動 node 才 AC。\n\n```\n// Time Complexity: O(1) for LRUCache.prototype.get, put\n// Space Complexity: O(n)\n\nfunction ListNode(key, val) {\n this.key = key;\n this.val = val;\n this.next = null;\n this.pre = null;\n }\n\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.length = 0;\n this.head = new ListNode();\n this.tail = new ListNode();\n this.head.next = this.tail;\n this.tail.pre = this.head;\n this.map = {};\n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n const node = this.map[key];\n\n if (node !== undefined) {\n this.appendToTail(this.remove(node));\n return node.val\n };\n\n return -1;\n};\n\n/** \n * @param {number} key \n * @param {number} val\n * @return {void}\n */\nLRUCache.prototype.put = function(key, val) {\n const node = this.map[key];\n\n if (node !== undefined) {\n node.val = val;\n this.appendToTail(this.remove(node));\n } else {\n if (this.length === this.capacity) {\n const old = this.head.next;\n delete this.map[old.key];\n this.length -= 1;\n this.remove(old);\n }\n\n const node = new ListNode(key, val);\n this.map[key] = node;\n this.length += 1;\n this.appendToTail(node);\n }\n};\n\nLRUCache.prototype.appendToTail = function(node) {\n if (node.pre) node.pre.next = node.next;\n if (node.next) node.next.pre = node.pre;\n this.tail.pre.next = node;\n node.pre = this.tail.pre;\n node.next = this.tail;\n this.tail.pre = node;\n}\n\nLRUCache.prototype.remove = function(node) {\n node.pre.next = node.next;\n node.next.pre = node.pre;\n node.pre = null;\n node.next = null;\n\n return node;\n}\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123752698","body":"## 解題方向\n### DFS\n- 需注意當 helper 的 params root 為 null 時,應回傳 0\n\n```\n// Time Complexity: O(n), n for numbers of nodes.\n// Space Complexity: O(h), h for the max depth of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n const helper = (root) => {\n if (!root) return 0;\n if (!root.left && !root.right) return 1;\n return Math.max(helper(root.left), helper(root.right)) + 1;\n };\n\n return helper(root);\n};\n```\n\n### Layer Iteration\n- 由於 stack 的起始值就有一個 root node,因此要先處理 root 為 null 的狀況\n\n```\n// Time Complexity: O(n), n for numbers of nodes.\n// Space Complexity: O(w), w for the max numbers of nodes in the same layer of tree.\n\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if (!root) return 0;\n\n const stack = [{ node: root, depth: 1 }];\n let maxDepth = 0;\n\n while (stack.length) {\n const { node, depth } = stack.shift();\n if (node.left) stack.push({ node: node.left, depth: depth + 1 });\n if (node.right) stack.push({ node: node.right, depth: depth + 1 });\n maxDepth = Math.max(maxDepth, depth);\n }\n\n return maxDepth;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125050709","body":"## 解題方向\n- 須理解兩棵樹一樣的意思是,其遍歷的結果會一樣,又題目有提到左右節點位置不同也不行,因此可以用多個遍歷結果來確認,或者可以將中間的空節點印出。可優化空間是不需要若於遍歷過程比較兩棵樹的節點,就不需要儲存遍歷結果。\n\n```javascript\n// Time Complexity: O(m + n), m, n are numbers of two tree nodes respectively.\n// Space Complexity: O(m + n)\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} p\n * @param {TreeNode} q\n * @return {boolean}\n */\nvar isSameTree = function(p, q) {\n const iterate = (root) => {\n const arr = [];\n const stack = [root];\n\n while (stack.length) {\n const node = stack.shift();\n\n arr.push(node?.val);\n\n if (node?.left || node?.right) {\n stack.push(node?.left);\n stack.push(node?.right);\n }\n }\n\n return arr;\n };\n\n return JSON.stringify(iterate(p)) === JSON.stringify(iterate(q));\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3131156971","body":"## 解題方向\n- 需要計算所有從 root 走到 leaf 的路線,這可以用 Recursion 來完成(回溯)\n- 用一個數字來紀錄 state:增加位數為「runningNumber * 10 + node.val」,減去位數為「Math.floor(runningNumber / 10)」\n\n```javascript\n// Time Complexity: O(n), n is the number of the tree nodes\n// Space Complexity: O(d), d is the depth of the tree\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root) {\n let sum = 0;\n let runningNumber = 0;\n\n const inner = (root) => {\n if (root) {\n runningNumber = runningNumber * 10 + root.val;\n\n if (!root.left && !root.right) {\n sum += runningNumber;\n } else {\n inner(root.left);\n inner(root.right);\n }\n\n runningNumber = Math.floor(runningNumber / 10);\n }\n };\n\n inner(root);\n\n return sum;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134845036","body":"## 解題方向\n- 可以使用 DFS 或 BFS 來解題\n- DFS 記錄最深深度的第一個節點數值,深度可作為參數於每次遞迴時傳遞\n- BFS 紀錄每層第一個節點數值\n- 題目保證 root 一定不為 null\n\n### DFS\n```javascript\n// Time Complexity: O(n), n is the number of tree nodes.\n// Space Complexity: O(d), d is the max depth of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let maxDepth = 0;\n let res = null;\n\n const dfs = (root, depth) => {\n if (depth > maxDepth) {\n maxDepth = depth;\n res = root.val;\n }\n\n root.left && dfs(root.left, depth + 1);\n root.right && dfs(root.right, depth + 1);\n };\n\n dfs(root, 1);\n\n return res;\n};\n```\n\n### BFS\n```javascript\n// Time Complexity: O(n), n is the number of tree nodes.\n// Space Complexity: O(w), w is the max width of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n const stack = [[root]];\n let res = null;\n\n while (stack.length) {\n const nodes = stack.pop();\n\n res = nodes[0].val;\n\n const nextNodes = [];\n\n for (const node of nodes) {\n node.left && nextNodes.push(node.left);\n node.right && nextNodes.push(node.right);\n }\n\n nextNodes.length && stack.push(nextNodes);\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138426787","body":"## 解題方向\n* 使用 DNS 前序遍歷,在 deserialize 時透過遞迴建立樹會較 BFS 容易。\n* 使用原生的 JSON.stringify and JSON.parse 來轉換 array 及 string\n* 優化方向:優化 Space Complexity 至 O(h),h 為樹的高度\n * 能直接產生 serialized string 而非在最後轉化\n * 一邊 deserialize 需要的 string 部分,而不需要在一開始開一個 array 儲存\n\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n// Time Complexity: O(n), n is number of tree nodes.\n// Space Complexity: O(n), n is number of tree nodes.\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n const preOrder = [];\n const dns = (root) => {\n preOrder.push(root?.val);\n if (root) {\n dns(root.left);\n dns(root.right);\n }\n };\n dns(root);\n\n return JSON.stringify(preOrder);\n};\n\n// Time Complexity: O(n), n is number of tree nodes.\n// Space Complexity: O(n), n is number of tree nodes.\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n const preOrder = JSON.parse(data);\n\n if (preOrder[0] === null || preOrder[0] === undefined) return preOrder[0];\n\n const createNode = () => {\n const val = preOrder.shift();\n\n if (val === null) return null;\n\n const node = new TreeNode(val);\n node.left = createNode();\n node.right = createNode();\n return node;\n };\n\n return createNode();\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144639245","body":"## 解題方向\n- 不一樣的遍歷方式會有差嗎? => 由於打算取值後再排序,因此沒差\n- 如何儲存最後的輸出最省力 => 用 hashmap\n\n```javascript\n// Time Complexity: O(nlogn), n is the number of tree.\n// Space Complexity: O(n), n is the number of tree.\n\n// /**\n// * Definition for a binary tree node.\n// * function TreeNode(val, left, right) {\n// * this.val = (val===undefined ? 0 : val)\n// * this.left = (left===undefined ? null : left)\n// * this.right = (right===undefined ? null : right)\n// * }\n// */\n// /**\n// * @param {TreeNode} root\n// * @return {number[][]}\n// */\nvar verticalTraversal = function(root) {\n const map = {};\n\n const traverse = (root, row, col) => {\n if (!root) return;\n\n if (!map[col]) {\n map[col] = [];\n }\n\n map[col].push([row, root.val]);\n traverse(root.left, row + 1, col - 1);\n traverse(root.right, row + 1, col + 1);\n };\n\n traverse(root, 0, 0);\n\n const keys = Object.keys(map).sort((a, b) => a - b);\n\n const res = keys.map((k) => {\n const arr = map[k];\n\n return arr.sort(([rowA, valA], [rowB, valB]) => {\n if (rowA === rowB) return valA - valB;\n return rowA - rowB;\n }).map(([,val]) => val);\n });\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146092009","body":"## 解題方向\n- 遍歷 nums 時使用 hashmap 來記錄曾出現過的數字及其 index,並看 hashmap 是否記錄 target - nums[i] 是否曾出現過\n- 可以特別注意題目要求同個元素不能被使用兩次,所以應將配對到的元素移出 hashmap(不過因為題目也說只有一組數字為答案,所以不做也沒關係)\n\n```javascript\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(1) \n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n const map = {};\n const res = [];\n\n for (let i = 0; i < nums.length; i += 1) {\n const num = nums[i];\n\n if (map[target - num] !== undefined) {\n res.push(i, map[target - num]);\n delete map[target - num];\n } else {\n map[num] = i;\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3146907342","body":"## 解法\n- 第一個想法是遍歷後得到 num 與其 frequency 的 hashmap,將其轉成 array 後排序並取前 k 者\n- 看了題解後可優化部分是,由於題目允許回傳值不需要依據 frequency 排序,因此可將原解法 sort 的部分改成 quick selection,將平均時間複查度從 O(nlogn) 將至 O(n)\n```javascript\n// Time Complexity: O(nlogn), n is nums.length.\n// Space Complexity: O(n), n is nums.length.\n\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function (nums, k) {\n const map = {};\n\n for (const num of nums) {\n map[num] = (map[num] ?? 0) + 1;\n }\n\n return Object.entries(map)\n .sort(([numA, freqA], [numB, freqB]) => {\n return freqB - freqA;\n })\n .filter((_, i) => i < k)\n .map(([num]) => Number(num));\n};\n```\n\n## 解法\n- 找 max frequent num\n- 回傳 left, right index range\n- 需要考慮當兩個 num frequency 相等時,應保留 range 較小者!\n```javascript\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(n), n is nums.length.\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findShortestSubArray = function (nums) {\n let maxFreqNum = nums[0];\n const map = {};\n\n for (let i = 0; i < nums.length; i += 1) {\n const num = nums[i];\n const { freq, left, right } = map[num] ?? { freq: 0, left: i, right: i };\n map[num] = {\n freq: freq + 1,\n left: i < left ? i : left,\n right: i > right ? i : right,\n };\n\n if (map[num].freq > map[maxFreqNum].freq) {\n maxFreqNum = num;\n } else if (map[num].freq === map[maxFreqNum].freq) {\n if (\n map[num].right - map[num].left <\n map[maxFreqNum].right - map[maxFreqNum].left\n ) {\n maxFreqNum = num;\n }\n }\n }\n\n const { left, right } = map[maxFreqNum];\n\n return right - left + 1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149617346","body":"```javascript\n// Time Complexity: O(n^2), n is points.length.\n// Space Complexity: O(n), n is points.length.\n\n/**\n * @param {number[][]} points\n * @return {number}\n */\nfunction numberOfBoomerangs(points) {\n const n = points.length;\n let ans = 0;\n \n for (let i = 0; i < n; i++) {\n const distanceMap = {};\n \n for (let j = 0; j < n; j++) {\n const dist = Math.pow(points[i][0] - points[j][0], 2) + Math.pow(points[i][1] - points[j][1], 2);\n distanceMap[dist] = (distanceMap[dist] ?? 0) + 1;\n }\n \n for (const count of Object.values(distanceMap)) {\n ans += count * (count - 1);\n }\n }\n \n return ans;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153048738","body":"## 解法\n- 經典的滑動視窗題目,與用 hashmap 紀錄字元的出現次數,並於迴圈中判斷下個字元是否已出現過,無則加入,有則刪除。\n- 需要特別注意\n- (1) 迴圈的邊界條件應為 right < s.length - 1,不然會讓 right 跑到 s.length\n- (2) 應先刪掉 map[s[left]] 再 left++\n\n```javascript\n// Time Complexity: O(n), n is s.length.\n// Space Complexity: O(m), m is types of characters in s.\n\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n if (!s.length) return 0;\n \n const chars = new Map();\n chars.set(s[0], 1);\n\n let max = 1;\n let left = 0;\n let right = 0;\n\n while (right < s.length - 1) {\n const cond = !chars.has(s[right + 1]);\n if (!chars.has(s[right + 1])) {\n right++;\n chars.set(s[right], 1);\n } else {\n chars.delete(s[left]);\n left++;\n }\n\n const number = right - left + 1;\n if (number > max) max = number;\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160434225","body":"## 解法\n- 一開始分析方向錯了,以為每個 substring 間不可重疊\n- 之後想到的是用 hashmap 存可能 substring 的結果,再遍歷一次,但是時間複雜度為階乘\n- 最後則是直接遍歷,再驗證 substring 是否正確,然而需考慮 words 的 element 是否會重複\n\n```javascript\n// Time Complexity: O(n * m * k), n is s.length, m is words[0].length, k is words.lenght.\n// Space Complexity: O(m).\n\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n const defaultMap = (() => {\n const m = {};\n for (const word of words) {\n m[word] = (m[word] ?? 0) + 1;\n }\n return m;\n })();\n let map = JSON.parse(JSON.stringify(defaultMap));\n const wordLength = words[0].length;\n const substringLength = wordLength * words.length;\n\n const validate = (substring) => {\n let cur = 0;\n map = JSON.parse(JSON.stringify(defaultMap));\n\n while (cur < substring.length) {\n const target = substring.substring(cur, cur + wordLength);\n if (map[target]) {\n map[target] -= 1;\n cur += wordLength;\n } else return false;\n }\n\n return true;\n };\n\n const res = []\n\n for (let i = 0; i < s.length - substringLength + 1; i++) {\n const substring = s.substring(i, i + substringLength);\n if (validate(substring)) res.push(i);\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3164019442","body":"## 解法\n- 一開始漏看了連續短數組的條件,之後想到暴力法,也有個感覺優化必定涉及數學技巧,因此直接看題解\n- 需要理解兩個技巧:負數取模 floorMod 和 map.set(0, -1) 以處理欲從 sum[i] - sum[j] 計算 i 至 j 範圍時,當 j 為 0 遇到的計算問題\n\n```javasciprt\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(min(n, k))\n\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar floorMod = function (a, b) {\n return ((a % b) + b) % b;\n};\n\nfunction minSubarray(nums, k) {\n var map = new Map();\n map.set(0, -1);\n var res = nums.length;\n var target = 0;\n var currSum = 0;\n for (let i = 0; i < nums.length; i++) {\n target += nums[i];\n }\n target = target % k;\n if (target === 0) return 0;\n for (let i = 0; i < nums.length; i++) {\n currSum = (nums[i] + currSum) % k;\n\n var prevSum = floorMod(currSum - target, k);\n if (map.has(prevSum)) {\n res = Math.min(res, i - map.get(prevSum));\n }\n map.set(currSum, i);\n }\n return res === nums.length ? -1 : res;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168248088","body":"## 解法\n- 窮舉前面的例子就可以得到規律:先處理只有一個 node 的 edge case,當 fast.next?.next 不為 null,即存在下下個 node 的情況下移動快慢指針,不然慢指針的下個 node 即是中間節點。\n```javascript\n// 1 => 1\n\n// 1, 2 => 2 => slow 1, fast 2\n// 1, 2, 3 => 2 => slow 1, fast 2\n\n// 1, 2, 3, 4 => 3 => slow 2, fast 4\n// 1, 2, 3, 4, 5 => 3 => slow 2, fast 4\n\n// 1, 2, 3, 4, 5, 6 => 4\n// 1, 2, 3, 4, 5, 6, 7 => 4\n\n// 1, 2, 3, 4, 5, 6, 7, 8 => 5\n// 1, 2, 3, 4, 5, 6, 7, 8, 9 => 5\n```\n\n```javascript\n// Time Complexity: O(n), n is linked list length,\n// Space Complexity: O(1)\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n if (!head.next) return head;\n\n let slow = head;\n let fast = head.next;\n\n while (fast.next?.next) {\n slow = slow.next;\n fast = fast.next.next;\n };\n\n return slow.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170547569","body":"## 解法\n- 一開始沒注意到 Space Complexity O(1) 的要求,因此用 map 來記錄曾遍歷過的數字,並使用 nums.splice 來原地刪除重複元素\n- 若限制 Space Complexity 為 O(1),則需要如題解用快慢指針來做\n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n let slow = 0;\n let fast = 0;\n\n while (fast < nums.length) {\n if (nums[fast] !== nums[slow]) {\n slow++;\n nums[slow] = nums[fast];\n }\n \n fast++;\n }\n\n return slow + 1;\n};\n\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n const map = {};\n let res = 0;\n let i = nums.length - 1;\n\n while (i >= 0) {\n const num = nums[i];\n\n if (map[num]) {\n nums.splice(i, 1);\n } else {\n map[num] = 1;\n res += 1;\n };\n\n i--;\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172259657","body":"## 解法\n- 經典的二分查找,需注意沒有找到 target 的 edge case\n\n```javascript\n// Time Complexity: O(logn), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let l = 0;\n let r = nums.length - 1;\n let m = -1;\n\n while (l <= r) {\n m = l + Math.floor((r - l) / 2);\n\n if (nums[m] === target) return m;\n else if (nums[m] > target) r = m - 1;\n else l = m + 1;\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173778506","body":"## 解法\n- 第一泡茶的確是暴力解,之後會想到 max heap,但每次 push 仍需要耗費 O(logn)\n- 有想過使用 monotonic stack 來做,但卡沒仔細想就覺得可能無法正確排除 sliding window 外的元素而作罷,而這其實可以靠題解中的 shift 來完成,又因為不是嚴格遞增棧,所以遇到相等數值時,前者仍會被保留,而確保 shift 的操作都是正確的\n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(k)\n\nvar maxSlidingWindow = function (nums, k) {\n const res = [];\n const dequeue = new Dequeue([]);\n\n for (let i = 0; i < k - 1; i++) {\n dequeue.push(nums[i]);\n }\n\n for (let i = k - 1; i < nums.length; i++) {\n dequeue.push(nums[i]);\n res.push(dequeue.max());\n dequeue.shift(nums[i - k + 1]);\n }\n\n return res;\n};\n\nclass Dequeue {\n constructor(nums) {\n this.list = nums; // Should be implemented as a linked list to make time complexity of dequeue.shift() as O(1).\n }\n\n push(val) {\n const nums = this.list;\n\n while (nums[nums.length - 1] < val) {\n nums.pop();\n }\n\n nums.push(val);\n }\n\n shift(val) {\n let nums = this.list;\n\n if (nums[0] === val) {\n nums.shift();\n }\n }\n\n max() {\n return this.list[0];\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178234382","body":"## 解法\n- 第一泡茶,可以透過紀錄一個人信任及被信任的人數來解題。其中可以不斷紀錄目前被信任人數最高者方便最後判斷是否為法官\n- 看了題解後發現可以用圖來解,之後補上\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n const trustFroms = new Array(n).fill(0);\n const trustTos = new Array(n).fill(0);\n let maybeJudge = { index: 0, trustTo: 0 };\n\n for (const t of trust) {\n const [from, to] = [t[0] - 1, t[1] - 1];\n trustFroms[from]++;\n trustTos[to]++;\n if (trustTos[to] > maybeJudge.trustTo) maybeJudge = { index: to, trustTo: trustTos[to] };\n }\n\n if (maybeJudge.trustTo === n - 1) {\n if (trustFroms[maybeJudge.index] === 0) return maybeJudge.index + 1;\n }\n\n return -1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3184149014","body":"```javascript\n// Time Complexity: O(v + e)\n// Space Complexity: O(v + e)\n\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nconst possibleBipartition = (n, dislikes) => {\n const graph = new Array(n + 1).fill().map(() => new Array())\n const colors = new Array(n + 1).fill(-1);\n\n for (const [a, b] of dislikes) {\n graph[a].push(b);\n graph[b].push(a);\n }\n\n const dfs = (cur, color = 0) => {\n colors[cur] = color;\n\n for (const nxt of graph[cur]) {\n if (colors[nxt] !== -1 && colors[nxt] === color) return false;\n if (colors[nxt] === -1 && !dfs(nxt, color ^ 1)) return false;\n }\n\n return true;\n };\n\n for (let i = 0; i < n + 1; i++) {\n if (colors[i] === -1 && !dfs(i, 0)) return false;\n }\n\n return true;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186799518","body":"```javascript\n// Time Complexity: O(n + e), e is sum of beforeItems.flat().length\n// Space Complexity: O(n + e)\n\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n const topologicalSort = (items, indegree, neighbors) => {\n const queue = [];\n const result = [];\n \n for (const item of items) {\n if (indegree[item] === 0) {\n queue.push(item);\n }\n }\n \n while (queue.length > 0) {\n const current = queue.shift();\n result.push(current);\n \n const currentNeighbors = neighbors[current] || [];\n for (const neighbor of currentNeighbors) {\n indegree[neighbor]--;\n if (indegree[neighbor] === 0) {\n queue.push(neighbor);\n }\n }\n }\n \n return result;\n };\n \n let maxGroupId = m;\n for (let item = 0; item < n; item++) {\n if (group[item] === -1) {\n group[item] = maxGroupId;\n maxGroupId++;\n }\n }\n \n const itemIndegree = Array.from({length: n}, () => 0);\n const groupIndegree = Array.from({length: maxGroupId}, () => 0);\n const itemNeighbors = Array.from({length: n}, () => []);\n const groupNeighbors = Array.from({length: maxGroupId}, () => []);\n const groupItems = Array.from({length: maxGroupId}, () => []);\n \n for (let item = 0; item < n; item++) {\n groupItems[group[item]].push(item);\n }\n \n for (let item = 0; item < n; item++) {\n const dependencies = beforeItems[item] || [];\n \n for (const dependency of dependencies) {\n if (group[dependency] !== group[item]) {\n groupIndegree[group[item]]++;\n groupNeighbors[group[dependency]].push(group[item]);\n } else {\n itemIndegree[item]++;\n itemNeighbors[dependency].push(item);\n }\n }\n }\n \n const groups = Array.from({length: maxGroupId}, (_, i) => i);\n const sortedGroups = topologicalSort(groups, groupIndegree, groupNeighbors);\n \n if (sortedGroups.length !== maxGroupId) {\n return [];\n }\n \n const result = [];\n \n for (const groupId of sortedGroups) {\n const items = groupItems[groupId];\n const sorteditems = topologicalSort(items, itemIndegree, itemNeighbors);\n \n if (sorteditems.length !== items.length) {\n return [];\n }\n \n result.push(...sorteditems);\n }\n \n return result;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190479297","body":"```javascript\n// Time Complexity: O(n), n is moves.length\n// Space Complexity: O(1)\n\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let [x, y] = [0, 0];\n\n for (let i = 0; i < moves.length; i++) {\n const action = moves.substring(i, i + 1);\n if (action === 'R') x++;\n if (action === 'L') x--;\n if (action === 'U') y++;\n if (action === 'D') y--;\n }\n\n return x === 0 && y === 0;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193447956","body":"## 題解\n- 一開始使用 Array + Sort 的方法實作,不過由於 Time Complexity 為 O(n^2logn),在資料量 1 <= n <= 10^5 的條件下,會沒辦法 AC\n- 需要將資料結構改成 Min Heap 來降低時間複雜度\n\n```javascript\n// Min Heap\n// Time Complexity: O(nlogn)\n// Space Complexity: O(logn)\n\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function (tasks) {\n const indices = Array.from({ length: tasks.length }, (_, i) => i);\n\n indices.sort((a, b) => { return tasks[a][0] - tasks[b][0] });\n\n const minHeap = new PriorityQueue((a, b) => {\n if (tasks[a][1] !== tasks[b][1]) {\n return tasks[a][1] - tasks[b][1];\n }\n return a - b;\n });\n\n const res = [];\n let time = 0;\n let i = 0;\n\n while (!minHeap.isEmpty() || i < tasks.length) {\n while (i < tasks.length && tasks[indices[i]][0] <= time) {\n minHeap.enqueue(indices[i]);\n i++;\n }\n\n if (minHeap.size() === 0) {\n time = tasks[indices[i]][0];\n } else {\n const nextIndex = minHeap.dequeue();\n time += tasks[nextIndex][1];\n res.push(nextIndex);\n }\n }\n\n return res;\n};\n\n// Array + Sort\n// Time Complexity: O(n^2logn)\n// Space Complexity: O(n)\n\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n tasks = tasks.map((t, i) => [...t, i]);\n tasks.sort((a, b) => a[0] === b[0] ? a[2] - b[2] : a[0] - b[0]);\n\n let i = 0;\n let curTime = 0;\n const queue = [];\n const res = [];\n\n while (i < tasks.length || queue.length) {\n while (i < tasks.length && tasks[i][0] <= curTime) {\n queue.push(tasks[i]);\n queue.sort((a, b) => a[1] === b[1] ? a[2] - b[2] : a[1] - b [1]);\n i++;\n }\n\n if (!queue.length) {\n curTime = tasks[i][0];\n } else {\n const curTask = queue.shift();\n res.push(curTask[2]);\n curTime += curTask[1];\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194091917","body":"```javascript\n// Time Complexity: O(1)\n// Space Complexity: O(1)\n\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n const getMinSum = (time, carry) => {\n let [hour, min] = time.split(':').map(s => Number(s));\n const remainer = min % 15;\n const q = (min - remainer) / 15;\n\n if (!carry) {\n return (hour * 60) + min;\n } else if (remainer && carry === 'ceil') {\n return (hour * 4 + q + 1) * 15;\n } else {\n return (hour * 4 + q) * 15;\n }\n };\n\n let [loginMinSum, logoutMinSum] = [getMinSum(loginTime, 'ceil'), getMinSum(logoutTime, 'floor')];\n\n if (getMinSum(loginTime) > getMinSum(logoutTime)) {\n logoutMinSum += 24 * 60;\n }\n\n return Math.max((logoutMinSum - loginMinSum) / 15, 0)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3196057927","body":"## 題解\n- 原本想針對三種狀況,直接找 a 和 b 中最符合的 char 來做計算,但會發現很多 edge case 要考量,要一直修正\n- 看題解之後,在有限的解空間中(頂多常數 26),枚舉的確是一個簡單、可讀性更好的做法\n\n```javascript\n// Time Complexity: O(n + m), n is a.length, m is b.length\n// Space Complexity: O(26)\n\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n const createCounter = (str) => {\n const counter = {};\n\n for (let i = 0; i < 26; i++) {\n counter[String.fromCharCode(97 + i)] = 0;\n }\n\n for (const char of str) {\n counter[char]++;\n }\n return counter;\n };\n \n const ca = createCounter(a);\n const cb = createCounter(b);\n\n const greaterCost = (ca, cb) => {\n let ans = Infinity;\n\n for (let i = 1; i < 26; i++) {\n let count = 0;\n \n for (let j = 0; j < i; j++) {\n count += ca[String.fromCharCode(97 + j)];\n }\n \n for (let j = i; j < 26; j++) {\n count += cb[String.fromCharCode(97 + j)];\n }\n ans = Math.min(ans, count);\n }\n return ans;\n };\n \n const equalCost = (ca, cb) => {\n let ans = Infinity;\n for (let i = 0; i < 26; i++) {\n const char = String.fromCharCode(97 + i);\n ans = Math.min(ans, a.length + b.length - ca[char] - cb[char]);\n }\n return ans;\n };\n \n return Math.min(\n greaterCost(ca, cb),\n greaterCost(cb, ca),\n equalCost(ca, cb)\n );\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199125049","body":"## 題解\n- 直覺就是用快速排序來做,不過實踐上,這次發現 partition 有兩種方法可以做:hoarePartition、lomutoPartition。其中 lomutoPartition 普遍認為較簡單,但因為交換數值的次數較多,會遇到 TLE,因此此題需用 hoarePartition 來做。\n\n```javascript\nconst lomutoPartition = (nums, left, right) => {\n const pivot = nums[right];\n let i = left - 1;\n\n for (let j = left; j < right; j++) {\n if (nums[j] <= pivot) {\n i++;\n [nums[i], nums[j]] = [nums[j], nums[i]];\n }\n }\n\n i++;\n [nums[i], nums[right]] = [nums[right], nums[i]];\n\n return i;\n};\n\nconst hoarePartition = (nums, left, right) => {\n const p = left + ((right - left) >>> 1);\n const pivot = nums[p];\n let [i, j] = [left, right];\n\n while (i <= j) {\n while (nums[i] < pivot) i++;\n while (nums[j] > pivot) j--;\n if (i <= j) {\n [nums[i], nums[j]] = [nums[j], nums[i]];\n i++;\n j--;\n }\n }\n\n return [i, j];\n};\n\nconst quickSort = (nums, left, right) => {\n // if (left < right) {\n // const p = lomutoPartition(nums, left, right);\n // quickSort(nums, left, p - 1);\n // quickSort(nums, p + 1, right);\n // }\n\n if (left < right) {\n const [i, j] = hoarePartition(nums, left, right);\n quickSort(nums, left, j);\n quickSort(nums, i, right);\n }\n};\n\n// Time Complexity: O(nlogn), n is nums.length\n// Space Complexity: O(logn)\n\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function (nums) {\n quickSort(nums, 0, nums.length - 1);\n return nums;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204182883","body":"```javascript\n// Time Complexity: O(logn)\n// Space Complexity: O(1)\n\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n let res = 0;\n let l = 0;\n let r = x;\n\n while (l <= r) {\n const m = l + ((r - l) >>> 2);\n\n if (m * m > x) {\n r = m - 1;\n } else {\n res = m;\n l = m + 1;\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3209343494","body":"## 題解\n- 可以將這題轉化成「尋找最左邊符合條件者」,即可套入模板\n\n```javascript\n// Time Complexity: O(logn)\n// Space Complexity: O(1)\n\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let [l, r] = [1, n];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 2);\n\n if (isBadVersion(m)) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n };\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3212999531","body":"## 題解\n- 二分:對於每一個元素前者排序,並找到大於 a * 2 者(重複 a * 2 的右界)。需注意是,應在每次加入新元素時,直接尋找其應該插入的位置,而非將整個陣列排序,不然會 TLE。\n\n```javascript\nclass SortedList {\n constructor() {\n this.arr = [];\n }\n\n bisectRight(target) {\n let [l, r] = [0, this.arr.length - 1];\n\n while (l <= r) {\n const mid = l + ((r - l) >>> 1);\n\n if (this.arr[mid] <= target) {\n l = mid + 1;\n } else {\n r = mid - 1;\n }\n }\n\n return l;\n }\n \n push(value) {\n const pos = this.bisectRight(value);\n this.arr.splice(pos, 0, value);\n }\n \n get length() {\n return this.arr.length;\n }\n}\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n const sortedRunningNums = new SortedList();\n sortedRunningNums.push(nums[0]);\n let ans = 0;\n\n for (let i = 1; i < nums.length; i++) {\n ans += (i - sortedRunningNums.bisectRight(nums[i] * 2));\n sortedRunningNums.push(nums[i]);\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216534944","body":"## 題解\n- 依序遍歷 houses,尋找每個 house 與 heater 最近距離,最大者為答案。其中尋找最近距離的實踐,可以使用 bisectRight 來做\n\n```javascript\n// Time Complexity: O(nlog m + mlog m), n is houses.length, m is heaters.length\n// Space Complexity: O(1)\n\nconst getHouseHeaterMinDistance = (house, heaters) => {\n if (heaters.length === 0) return Infinity;\n if (heaters.length === 1) return Math.abs(house - heaters[0]);\n\n let [l, r] = [0, heaters.length - 1];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (house === heaters[m]) {\n return 0;\n } else if (house > heaters[m]) {\n l = m + 1;\n } else {\n r = m - 1;\n };\n }\n\n const leftDistance = l === 0 ? Infinity : house - heaters[l - 1];\n const rightDistance = r === heaters.length - 1 ? Infinity : heaters[l] - house;\n\n return Math.min(leftDistance, rightDistance);\n};\n\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n heaters.sort((a, b) => a - b);\n\n let maxRadius = 0;\n\n for (const house of houses) {\n const minDistance = getHouseHeaterMinDistance(house, heaters);\n maxRadius = Math.max(maxRadius, minDistance);\n }\n\n return maxRadius;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217908480","body":"## 題解\n- 計數二分經典的題目,排序後解空間為 0 至 nums[lnums.ength - 1] - nums[0]\n\n```javascript\n// Time Complexity: O(nlogn)\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a, b) => a - b);\n\n const countDistanceNotGreaterThan = (maxDistance) => {\n let count = 0;\n let l = 0;\n\n for (let r = 1; r < nums.length; r++) {\n while (nums[r] - nums[l] > maxDistance) {\n l++;\n }\n\n count += r - l;\n }\n\n return count;\n };\n\n let [l, r] = [0, nums[nums.length - 1] - nums[0]];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (countDistanceNotGreaterThan(m) >= k) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218836123","body":"## 題解\n- 用二分在解空間 [0, maxElevation] 中尋找答案,對於每個可能的 m,再 dns 尋找可能路徑\n- 需注意因為 dns 時多了 grid[ni][nj] <= elevation 的條件,不需重置 visited[i][j],因為就算從其他點進來該點,依舊會沒辦法繼續走下去,與尋找所有路徑的 dns 略有不同\n\n```javascript\n// Time Complexity: O(n^2logn)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n const n = grid.length;\n\n const maxElevation = (() => {\n let e = 0;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n e = Math.max(e, grid[i][j]);\n }\n }\n return e;\n })();\n\n const canReachBottomRight = (elevation) => {\n const visited = Array.from({ length: n}).map(() => Array.from({ length: n }).map(() => false));\n\n const dns = (i, j) => {\n if (i === n - 1 && j === n - 1) return true;\n\n visited[i][j] = true;\n\n const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];\n\n for (const [di, dj] of directions) {\n const ni = i + di;\n const nj = j + dj;\n\n if (ni >= 0 && ni < n && nj >= 0 && nj < n) {\n if (!visited[ni][nj] && grid[ni][nj] <= elevation) {\n if (dns(ni, nj)) return true;\n }\n }\n }\n\n // visited[i][j] = false;\n\n return false;\n };\n\n if (grid[0][0] <= elevation) return dns(0, 0);\n else return false;\n };\n\n let l = 0;\n let r = maxElevation;\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (canReachBottomRight(m)) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222489820","body":"## 題解\n- 典型的 sliding window 題型\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(1)\n\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n const vowel = 'aeiou';\n let l = 0;\n let r = 0;\n let cur = 0;\n let max = cur;\n\n while (r < s.length) {\n if (vowel.includes(s.charAt(r))) cur++;\n r++;\n\n if (r - l > k) {\n if (vowel.includes(s.charAt(l))) cur--;\n l++;\n }\n\n max = Math.max(max, cur);\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3226683449","body":"```javascript\n// Time Complexity: O(k + maxPts)\n// Space Complexity: O(k + maxPts)\n\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n const dp = Array.from({ length: k + maxPts }).map(() => 0);\n let sum = 0;\n\n for (let i = k; i < k + maxPts; i++) {\n if (i <= n) dp[i] = 1;\n sum += dp[i];\n }\n\n for (let j = k - 1; j >= 0; j--) {\n dp[j] = sum / maxPts;\n sum -= dp[j + maxPts];\n sum += dp[j];\n }\n\n return dp[0];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3234016259","body":"```javascript\n// Time Complexity: O(n), n is s.length\n// Space COmplexity: O(1)\n\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nfunction findAnagrams(s, p) {\n function arraysEqual(arr1, arr2) {\n for (let i = 0; i < 26; i++) {\n if (arr1[i] !== arr2[i]) return false;\n }\n return true;\n }\n\n const result = [];\n const sLen = s.length;\n const pLen = p.length;\n \n if (sLen < pLen) return result;\n \n const pCount = new Array(26).fill(0);\n const windowCount = new Array(26).fill(0);\n \n for (let i = 0; i < pLen; i++) {\n pCount[p.charCodeAt(i) - 97]++;\n }\n \n let left = 0;\n \n for (let right = 0; right < sLen; right++) {\n const rightIndex = s.charCodeAt(right) - 97;\n windowCount[rightIndex]++;\n \n if (right - left + 1 > pLen) {\n const leftIndex = s.charCodeAt(left) - 97;\n windowCount[leftIndex]--;\n left++;\n }\n \n if (right - left + 1 === pLen) {\n if (arraysEqual(windowCount, pCount)) {\n result.push(left);\n }\n }\n }\n \n return result;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3237104151","body":"```javascript\n// Time Complexity: O(n + m), n is s.length, m is t.length\n// Space Complexity: O(k), k is different char count in t\n\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nfunction minWindow(s, t) {\n let l = 0;\n const counter = {};\n const N = s.length;\n const ct = {};\n \n for (let char of t) {\n ct[char] = (ct[char] || 0) + 1;\n }\n \n let k = 0;\n let ret = Infinity;\n let ans = \"\";\n \n for (let r = 0; r < N; r++) {\n counter[s[r]] = (counter[s[r]] || 0) + 1;\n \n if (s[r] in ct && counter[s[r]] === ct[s[r]]) {\n k++;\n }\n \n while (k === Object.keys(ct).length) {\n if (r - l + 1 < ret) {\n ans = s.substring(l, r + 1);\n ret = r - l + 1;\n }\n \n counter[s[l]]--;\n if (s[l] in ct && counter[s[l]] === ct[s[l]] - 1) {\n k--;\n }\n l++;\n }\n }\n \n return ans;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3239924106","body":"```javascript\n// Time Complexity: O(1)\n// Space Complexity: O(1)\n\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n const countBits = (num) => {\n let count = 0;\n while (num) {\n count += num & 1;\n num >>= 1;\n }\n return count;\n };\n\n const res = [];\n\n for (let hour = 0; hour < 12; hour++) {\n for (let minute = 0; minute < 60; minute++) {\n if ((countBits(hour) + countBits(minute)) === turnedOn) {\n const formattedMinute = minute < 10 ? `0${minute}` : `${minute}`\n res.push(`${hour}:${formattedMinute}`);\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240825737","body":"```javascript\n// Time Complexity: O(n!)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n\n const backtrack = (row, cols, dias1, dias2) => {\n if (row === n) {\n count++;\n return;\n }\n\n let availablePostions = ((1 << n) - 1) & (~(cols | dias1 | dias2));\n\n while (availablePostions) {\n const position = availablePostions & (-availablePostions);\n availablePostions &= availablePostions - 1;\n\n backtrack(\n row + 1,\n cols | position,\n (dias1 | position) << 1,\n (dias2 | position) >> 1,\n );\n }\n };\n\n backtrack(0, 0, 0, 0);\n\n return count;\n};\n\n// Time Complexity: O(n!)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n const cols = new Array(n).fill(false);\n const dias1 = new Array(2 * n - 1).fill(false); // row - col\n const dias2 = new Array(2 * n - 1).fill(false); // row + col\n\n const backtrack = (row) => {\n if (row === n) {\n count++;\n return;\n }\n\n for (let col = 0; col < n; col++) {\n const d1 = row - col + n - 1;\n const d2 = row + col;\n\n if (cols[col] || dias1[d1] || dias2[d2]) continue;\n\n cols[col] = dias1[d1] = dias2[d2] = true;\n backtrack(row + 1);\n cols[col] = dias1[d1] = dias2[d2] = false;\n }\n };\n\n backtrack(0);\n\n return count;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245083899","body":"## 題解\n- 遍歷每個 (i, j) 進行 dfs,遇到邊界或 grid[i][j] === 0 者即返回 0,反之則返回 1 加四個方向 dns 的結果\n- 優化:訪問過者可將原 grid[i][j] 改成 0,如此便不需要重新宣告一個空間來存取\n\n```javascript\n// Time Complexity: O(m * n)\n// Space Complexity: O(m * n)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n const [m, n] = [grid.length, grid[0].length];\n const direction = [[1, 0], [-1, 0], [0, 1], [0, -1]];\n let max = 0;\n\n const dfs = (x, y) => {\n if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y]) {\n grid[x][y] = 0;\n\n let area = 1;\n\n for (const [dx, dy] of direction) {\n area += dfs(x + dx, y + dy);\n }\n\n return area;\n }\n\n return 0;\n };\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n max = Math.max(max, dfs(i, j));\n }\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249843138","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nfunction maxDistance(grid) {\n const n = grid.length;\n const queue = [];\n \n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n queue.push([i, j, 0]);\n }\n }\n }\n \n if (queue.length === 0 || queue.length === n * n) {\n return -1;\n }\n \n const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];\n let maxDist = 0;\n \n while (queue.length > 0) {\n const [x, y, dist] = queue.shift();\n maxDist = Math.max(maxDist, dist);\n \n for (const [dx, dy] of directions) {\n const nx = x + dx;\n const ny = y + dy;\n \n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] === 0) {\n grid[nx][ny] = 1;\n queue.push([nx, ny, dist + 1]);\n }\n }\n }\n \n return maxDist;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251291240","body":"```javascript\n// Time Complexity: O(n + k), n is candies.length, k is number of keys\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n const boxes = new Set(initialBoxes);\n const q = [];\n \n for (const i of boxes) {\n if (status[i]) {\n q.push(i);\n }\n }\n \n for (let idx = 0; idx < q.length; idx++) {\n const i = q[idx];\n \n for (const j of containedBoxes[i]) {\n boxes.add(j);\n if (status[j]) {\n q.push(j);\n }\n }\n \n for (const j of keys[i]) {\n if (status[j] === 0 && boxes.has(j)) {\n q.push(j);\n }\n status[j] = 1;\n }\n }\n \n return q.reduce((sum, i) => sum + candies[i], 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3258808498","body":"```javascript\n// Time Complexity: O(nlogn), n is the number of tree.\n// Space Complexity: O(n), n is the number of tree.\n\n// /**\n// * Definition for a binary tree node.\n// * function TreeNode(val, left, right) {\n// * this.val = (val===undefined ? 0 : val)\n// * this.left = (left===undefined ? null : left)\n// * this.right = (right===undefined ? null : right)\n// * }\n// */\n// /**\n// * @param {TreeNode} root\n// * @return {number[][]}\n// */\nvar verticalTraversal = function(root) {\n const map = {};\n\n const traverse = (root, row, col) => {\n if (!root) return;\n\n if (!map[col]) {\n map[col] = [];\n }\n\n map[col].push([row, root.val]);\n traverse(root.left, row + 1, col - 1);\n traverse(root.right, row + 1, col + 1);\n };\n\n traverse(root, 0, 0);\n\n const keys = Object.keys(map).sort((a, b) => a - b);\n\n const res = keys.map((k) => {\n const arr = map[k];\n\n return arr.sort(([rowA, valA], [rowB, valB]) => {\n if (rowA === rowB) return valA - valB;\n return rowA - rowB;\n }).map(([,val]) => val);\n });\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3262161616","body":"## 題解\n- 重點是找到 dp 的關鍵核心 d[i] = Math.min(d[i - 1] + cost[i], d[i - 2] + cost[i]);\n- 需注意 cost[i] 為空值的情況\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} cost\n * @return {number}\n */\nvar minCostClimbingStairs = function(cost) {\n const n = cost.length;\n const d = [];\n\n d[0] = cost[0];\n d[1] = Math.min(d[0] + cost[1], cost[1]);\n\n for (let i = 2; i <= n; i++) {\n const c = cost[i] ?? 0;\n d[i] = Math.min(d[i - 1] + c, d[i - 2] + c);\n }\n\n return d[n];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263843103","body":"## 解題\n- 一樣需要去辨認 dp 的關係式,d[i] = Math.max(d[i - 1], d[i - 2] + nums[i])\n- 需要特別注意 n 為 1, 2 的 edge case \n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar rob = function(nums) {\n const n = nums.length;\n\n if (n === 1) return nums[0];\n if (n === 2) return Math.max(nums[0], nums[1]);\n\n const d = [];\n\n d[0] = nums[0];\n d[1] = Math.max(nums[0], nums[1]);\n\n for (i = 2; i < n; i++) {\n d[i] = Math.max(d[i - 1], d[i - 2] + nums[i])\n }\n\n return d[n - 1];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3266927805","body":"```javascript\n// Time Complexity: O(n^2), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findNumberOfLIS = function(nums) {\n const n = nums.length;\n const dp = Array(n).fill(null).map(() => [1, 1]);\n let longest = 1;\n \n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n if (nums[j] > nums[i]) {\n if (dp[i][0] + 1 > dp[j][0]) {\n dp[j][0] = dp[i][0] + 1;\n dp[j][1] = dp[i][1];\n longest = Math.max(longest, dp[j][0]);\n } else if (dp[i][0] + 1 === dp[j][0]) {\n dp[j][1] += dp[i][1];\n }\n }\n }\n }\n \n return dp.reduce((sum, [length, count]) => {\n return length === longest ? sum + count : sum;\n }, 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3270111521","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n)\n\n/**\n * @param {string} text1\n * @param {string} text2\n * @return {number}\n */\nvar longestCommonSubsequence = function(text1, text2) {\n const [n, m] = [text1.length, text2.length];\n const dp = Array.from({ length: n + 1 }).map(() => new Array(m + 1).fill(0));\n let res = 0;\n\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n if (text1.charAt(i - 1) === text2.charAt(j - 1)) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n res = Math.max(res, dp[i][j]);\n } else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273250794","body":"## 題解\n- dp 的遞增式為 `d[i][j] = d[i - 1][j] + d[i][j - 1];`,意思是,dp[i][j] 表示能到達該格子的路線數量,其為 d[i - 1][j] 和 d[i][j - 1] 的總和(從其左或其上格子來)\n- 其中需注意當 i 或 j 為 0,即最上或最左列的格子,其 d[i][j] 值為 1,因為只可能從其上或其左格子而來\n\n```javascript\n// Time Complexity: O(m * n)\n// Space Complexity: O(m * n)\n\n/**\n * @param {number} m\n * @param {number} n\n * @return {number}\n */\nvar uniquePaths = function(m, n) {\n const d = Array.from({ length: m }).map(() => new Array(n).fill(1));\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (i !== 0 && j !== 0) {\n d[i][j] = d[i - 1][j] + d[i][j - 1];\n }\n }\n }\n\n return d[m - 1][n - 1];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3279921315","body":"```javascript\n// Time Complexity: O(n^2 * k)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} row\n * @param {number} column\n * @return {number}\n */\nvar knightProbability = function(n, k, row, column) {\n let dp = Array.from({ length: n }, () => new Array(n).fill(0));\n const directions = [[2, 1], [1, 2], [-1, 2], [-2, 1], [-2, -1], [-1, -2], [1, -2], [2, -1]];\n\n dp[row][column] = 1;\n\n for (let step = 0; step < k; step++) {\n let dpTemp = Array.from({ length: n }, () => new Array(n).fill(0));\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n for (const [dx, dy] of directions) {\n const [px, py] = [i - dx, j - dy];\n\n if (px >= 0 && px < n && py >= 0 && py < n) {\n dpTemp[i][j] += dp[px][py] * 0.125;\n }\n }\n }\n }\n\n dp = dpTemp;\n }\n\n let sumProp = 0;\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n sumProp += dp[i][j];\n }\n }\n\n return sumProp;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3285364984","body":"```javascript\n/**\n * @param {number} maxChoosableInteger\n * @param {number} desiredTotal\n * @return {boolean}\n */\nvar canIWin = function(maxChoosableInteger, desiredTotal) {\n if (maxChoosableInteger >= desiredTotal) {\n return true;\n }\n \n const totalSum = (maxChoosableInteger * (maxChoosableInteger + 1)) / 2;\n if (totalSum < desiredTotal) {\n return false;\n }\n \n const memo = new Map();\n \n const dfs = (used, currentSum) => {\n if (memo.has(used)) {\n return memo.get(used);\n }\n \n for (let i = 1; i <= maxChoosableInteger; i++) {\n const bit = 1 << (i - 1);\n \n if ((used & bit) === 0) {\n if (currentSum + i >= desiredTotal) {\n memo.set(used, true);\n return true;\n }\n \n if (!dfs(used | bit, currentSum + i)) {\n memo.set(used, true);\n return true;\n }\n }\n }\n \n memo.set(used, false);\n return false;\n };\n \n return dfs(0, 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3288487076","body":"```javascript\n// Time Complexity: O(n * k), n is nums.length, k is sum of nums / 2\n// Space Complexity: O(n * k)\n\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canPartition = function (nums) {\n let sum = nums.reduce((acc, num) => acc + num, 0);\n\n if (sum % 2) return false;\n else sum = sum / 2;\n\n const dp = Array.from(nums).map(() => Array.from({ length: sum + 1 }).fill(false));\n\n for (let i = 0; i < nums.length; i++) {\n dp[i][0] = true;\n }\n\n for (let i = 0; i < dp.length - 1; i++) {\n for (let j = 0; j < dp[0].length; j++) {\n dp[i + 1][j] = j - nums[i] >= 0 ? dp[i][j] || dp[i][j - nums[i]] : dp[i][j];\n }\n }\n\n return dp[nums.length - 1][sum];\n};\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289632643","body":"```javascript\n// Time Complexity: O(n * k), n is nums.length, k is sum of nums\n// Space Complexity: O(k)\n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar findTargetSumWays = function(nums, target) {\n const total = nums.reduce((sum, num) => sum + num, 0);\n \n if (Math.abs(target) > total || (total + target) % 2 !== 0) {\n return 0;\n }\n \n const sum = (total + target) / 2;\n const dp = new Array(sum + 1).fill(0);\n dp[0] = 1;\n \n for (const num of nums) {\n for (let j = sum; j >= num; j--) {\n dp[j] += dp[j - num];\n }\n }\n \n return dp[sum];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3292845699","body":"```javascript\n/**\n * @param {number[]} coins\n * @param {number} amount\n * @return {number}\n */\nvar coinChange = function(coins, amount) {\n const dp = new Array(amount + 1).fill(Infinity);\n\n dp[0] = 0;\n\n for (i = 1; i <= amount; i += 1) {\n for (const coin of coins) {\n if (i - coin >= 0 && dp[i - coin] !== Infinity) {\n dp[i] = Math.min(dp[i - coin] + 1, dp[i]);\n }\n }\n }\n\n return dp[amount] === Infinity ? -1 : dp[amount];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3297467048","body":"```javascript\n// Time Complexity: O(n * m), n is amount, m is coins.length\n// Space Complexity: O(n)\n\n/**\n * @param {number} amount\n * @param {number[]} coins\n * @return {number}\n */\nvar change = function(amount, coins) {\n const dp = new Array(amount + 1).fill(0);\n dp[0] = 1;\n\n for (const coin of coins) {\n for (let i = coin; i <= amount; i++) {\n dp[i] += dp[i - coin];\n }\n }\n \n return dp[amount];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3303059077","body":"## 題解\n- 先排序,以 g[j] 為主,遍歷符合的 s[i]\n```javascript\n// Time Complexity: O(nlogn + mlogm), n is g.length, m is s.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} g\n * @param {number[]} s\n * @return {number}\n */\nvar findContentChildren = function(g, s) {\n g.sort((a, b) => a - b);\n s.sort((a, b) => a - b);\n\n let [i, j] = [0, 0];\n let ans = 0;\n\n while (i < s.length && j < g.length) {\n if (s[i] >= g[j]) {\n ans++;\n j++;\n }\n\n i++;\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3307711246","body":"```javascript\n// Time Complexity: O(nlogn)\n// Space Complexity: O(1)\n\n/**\n * @param {number[][]} intervals\n * @return {number}\n */\nfunction eraseOverlapIntervals(intervals) {\n if (intervals.length <= 1) return 0;\n \n intervals.sort((a, b) => a[1] - b[1]);\n \n let count = 0;\n let end = intervals[0][1];\n \n for (let i = 1; i < intervals.length; i++) {\n if (intervals[i][0] < end) {\n count++;\n } else {\n end = intervals[i][1];\n }\n }\n \n return count;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3311687568","body":"```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canJump = function (nums) {\n let max = 0;\n\n for (let i = 0; i < nums.length; i++) {\n if (max < i) return false;\n\n max = Math.max(nums[i] + i, max);\n }\n\n return max >= nums.length - 1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/71#issuecomment-3314986282","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nconst memories = {};\nvar numTrees = function(n) {\n if (memories[n] !== undefined) return memories[n];\n if (n <= 1) return 1;\n\n let ans = 0;\n\n for (let i = 1; i <= n; i++) {\n ans += numTrees(i - 1) * numTrees(n - i);\n }\n\n memories[n] = ans;\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316043984","body":"```javascript\n// Time Complexity: O(nlogk), n is total number of nodes across all lists, k is number of lists\n// Space Complexity: O(1)\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode[]} lists\n * @return {ListNode}\n */\nvar mergeKLists = function(lists) {\n if (!lists || lists.length === 0) return null;\n \n while (lists.length > 1) {\n let mergedLists = [];\n \n for (let i = 0; i < lists.length; i += 2) {\n let l1 = lists[i];\n let l2 = i + 1 < lists.length ? lists[i + 1] : null;\n mergedLists.push(mergeTwoLists(l1, l2));\n }\n \n lists = mergedLists;\n }\n \n return lists[0];\n};\n\nfunction mergeTwoLists(l1, l2) {\n let dummy = new ListNode(0);\n let current = dummy;\n \n while (l1 && l2) {\n if (l1.val <= l2.val) {\n current.next = l1;\n l1 = l1.next;\n } else {\n current.next = l2;\n l2 = l2.next;\n }\n current = current.next;\n }\n \n current.next = l1 || l2;\n return dummy.next;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3324003764","body":"```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar singleNumber = function(nums) {\n let bitmask = 0;\n\n for (let n of nums) {\n bitmask ^= n;\n }\n\n bitmask &= -bitmask;\n\n const ans = [0, 0];\n\n for (let n of nums) {\n if ((n & bitmask) === 0) ans[0] ^= n;\n else ans[1] ^= n;\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3327535650","body":"```javascript\n// Time Complexity: O(n * 2^n)\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number[][]}\n */\nfunction subsets(nums) {\n const result = [];\n \n function backtrack(start, current) {\n result.push([...current]);\n \n for (let i = start; i < nums.length; i++) {\n current.push(nums[i]);\n backtrack(i + 1, current);\n current.pop();\n }\n }\n \n backtrack(0, []);\n return result;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3338173897","body":"```javascript\n// Time Complexity\n// - insert: O(k), k is key.length\n// - searchValue: O(k), k is key.length\n// - sum: O(p), p is prefix.length\n\n// Space Complexity: O(n * m), n is the number of unique keys inserted, m is the average length of the keys\n\nclass MapSum {\n constructor() {\n this.root = new TrieNode();\n }\n \n insert(key, val) {\n let temp = this.root;\n \n let oldVal = this.searchValue(key);\n \n for (let i = 0; i < key.length; i++) {\n if (temp.children[key.charCodeAt(i) - 97] == null)\n temp.children[key.charCodeAt(i) - 97] = new TrieNode();\n \n temp = temp.children[key.charCodeAt(i) - 97];\n \n temp.count = temp.count - oldVal + val;\n }\n \n temp.val = val;\n temp.isWord = true;\n }\n\n searchValue(key) {\n let temp = this.root;\n for (let i = 0; i < key.length; i++) {\n if (temp.children[key.charCodeAt(i) - 97] == null)\n return 0;\n \n temp = temp.children[key.charCodeAt(i) - 97];\n }\n \n return temp.isWord ? temp.val : 0;\n }\n\n sum(prefix) {\n let temp = this.root;\n \n for (let i = 0; i < prefix.length; i++) {\n if (temp.children[prefix.charCodeAt(i) - 97] == null)\n return 0;\n \n temp = temp.children[prefix.charCodeAt(i) - 97];\n }\n \n return temp.count;\n }\n}\n\nclass TrieNode {\n constructor() {\n this.count = 0;\n this.children = new Array(26);\n this.isWord = false;\n this.val = 0;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/78#issuecomment-3341802963","body":"```javascript\n// Time Complexity: O(n*m + b*b + n)\n// - Building Trie: O(n*m) where n = number of smalls, m = average length of smalls\n// - Searching: O(b*b) where b = length of big string (worst case: check every position against every possible substring)\n// - Converting result: O(n)\n\n// Space Complexity: O(n*m + n*k)\n// - Trie storage: O(n*m) for storing all small strings\n// - Result storage: O(n*k) where k = average number of matches per small string\n\n\nclass Node {\n constructor() {\n this.children = new Array(26).fill(null);\n this.isWord = false;\n this.id = 0;\n }\n}\n\nclass Solution {\n constructor() {\n this.root = new Node();\n }\n\n multiSearch(big, smalls) {\n const n = smalls.length;\n const res = Array(n).fill().map(() => []);\n \n for (let i = 0; i < smalls.length; i++) {\n this.insert(smalls[i], i);\n }\n\n for (let i = 0; i < big.length; i++) {\n let tmp = this.root;\n\n for (let j = i; j < big.length; j++) {\n if (tmp.children[big.charCodeAt(j) - 97] === null) {\n break;\n }\n\n tmp = tmp.children[big.charCodeAt(j) - 97];\n\n if (tmp.isWord) {\n res[tmp.id].push(i);\n }\n }\n }\n\n const ret = new Array(n);\n\n for (let i = 0; i < n; i++) {\n ret[i] = new Array(res[i].length);\n for (let j = 0; j < ret[i].length; j++) {\n ret[i][j] = res[i][j];\n }\n }\n\n return ret;\n }\n\n insert(word, id) {\n let tmp = this.root;\n\n for (let i = 0; i < word.length; i++) {\n if (tmp.children[word.charCodeAt(i) - 97] === null) {\n tmp.children[word.charCodeAt(i) - 97] = new Node();\n }\n\n tmp = tmp.children[word.charCodeAt(i) - 97];\n }\n\n tmp.isWord = true;\n tmp.id = id;\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wutxuan":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073568207","body":"第一次思路:将num数组转换为int数字A,计算A+K,将A+K结果转换为List类型,但没有观察数据范围,导致int类型溢出,没有通过全部样例\n第二次思路:从后往前,逐位相加K%10,直到遍历完全部数组,再判断K是否还有,通过全部样例\n第三次思路:看完题解后,学习到了可以将k和某一位看作一个整体,不用每次计算k%10,而是k+num[i]","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078154786","body":"第一次思路:遍历每个字符,在每个字符上向左向右移动,直到找到字符c,继续遍历下一个字符,但想到时间复杂度一定很高,因此继续想其他方法\n\n第二次思路:先遍历字符串,用List先记录每个字符c的索引。然后遍历字符串每个字符,计算这个字符的位置距离List中位置的最小距离,通过全部用例,时间复杂度O(N*K) N为字符串长度,K为c在字符串中出现的次数\n\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n List indexList = new ArrayList<>();\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == c){\n indexList.add(i);\n }\n }\n\n int[] res = new int[s.length()];\n Arrays.fill(res,10001);\n for(int i = 0;i < res.length;i++){\n for(int index : indexList){\n res[i] = Math.min(res[i],Math.abs(i - index));\n }\n \n }\n return res;\n }\n}\n\n```\n第三次思路:看完题解后,学习到了两次遍历求解,从左到右记录每个字符左侧最近的字符c的距离,记为left数组,从右到左记录每个字符右侧最近的字符c的距离,记为right数组。再遍历一遍整个字符串,在left数组和right数组中取最小值为最终结果。在代码实现时,省去了记录right数组再比较,而是直接比较。时间复杂度O(N)\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n int index = -s.length();\n int[] left = new int[s.length()];\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == c){\n index = i;\n }\n left[i] = i - index;\n }\n\n index = 2 * s.length();\n for(int i = s.length() - 1;i >= 0;i--){\n if(s.charAt(i) == c){\n index = i;\n }\n left[i] = Math.min(left[i],index - i);\n }\n return left;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3083567541","body":"因为要设计的栈有最大长度,因此使用数组来模拟栈。否则使用栈或List来模拟。\n使用数组模拟:使用一个指针变量,指向当前栈顶。入栈时,val存入栈顶处,指针++,出栈时,指针- -,返回栈顶元素。实现inc函数时,只需要对数组中0-k位置的数每个+val即可。通过全部样例\n```java\nclass CustomStack {\n int size = 0; // 指向第一个空位置\n int[] arr;\n\n public CustomStack(int maxSize) {\n arr = new int[maxSize];\n }\n \n public void push(int x) {\n if(size < arr.length){\n arr[size] = x;\n size++;\n }\n }\n \n public int pop() {\n if(size > 0){\n size--;\n return arr[size];\n }else{\n return -1;\n }\n }\n \n public void increment(int k, int val) {\n int cut = Math.min(k,size);\n\n for(int i = 0;i < cut;i++){\n arr[i] += val;\n }\n }\n}\n```\n\n看完题解后学会了前缀和方法:- 因为每次的increment函数都会对栈底[0,k]的数据val操作,而是否val操作了只有在pop时才会体现。所以我们可以通过一个数组incremental记录每个val,即第i位置下面的元素都要加incremental[i]。在pop第i个数的时候加上它需要加的所有val,即incremental[i]。 所以increment函数只需要维护incremental数组。但要记得记得pop后,incremental函数用过的地方要清零,并且得累加到前面一位\n\n```java\nclass CustomStack {\n\n Stack stack;\n int[] incremental;\n\n public CustomStack(int maxSize) {\n stack = new Stack();\n incremental = new int[maxSize];\n }\n \n public void push(int x) {\n if(stack.size() < incremental.length){\n stack.push(x);\n }\n }\n \n public int pop() {\n int cut = stack.size() - 1;\n if(cut < 0) return -1;\n\n int res = stack.pop() + incremental[cut];\n\n if(cut > 0){\n incremental[cut-1] += incremental[cut]; \n }\n incremental[cut] = 0;\n return res;\n\n }\n \n public void increment(int k, int val) {\n int cut = Math.min(k,stack.size())-1;\n if(cut >= 0){\n incremental[cut] += val;\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089071815","body":"看到有括号,需要对括号匹配,则优先想到栈。遍历字符串,当遇到非】字符时,全部入栈。当遇到】字符时,开始向回看,取出字符c,构成字符串s。再向回看,取出数字x,重复x次字符串s得到字符串ss,再将ss入栈,继续遍历,直到遍历结束。\n \n最后得到的栈,就是存储了最终解码后的字符串。取出栈后记得反转字符串\n```java\nclass Solution {\n public String decodeString(String s) {\n Stack stack = new Stack<>();\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == ']'){\n StringBuilder sb = new StringBuilder();\n StringBuilder count = new StringBuilder();\n\n while(!stack.isEmpty() && stack.peek() != '['){\n sb.append(stack.pop());\n } \n sb.reverse();\n stack.pop();\n while(!stack.isEmpty() && stack.peek() >= '0' && stack.peek() <= '9'){\n count.append(stack.pop());\n }\n count.reverse();\n int t = Integer.valueOf(count.toString());\n StringBuilder res = new StringBuilder();\n res.repeat(sb,t);\n\n for(char c : res.toString().toCharArray()){\n stack.push(c);\n }\n \n }else{\n stack.push(s.charAt(i));\n }\n }\n StringBuilder re = new StringBuilder();\n while(!stack.isEmpty()){\n re.append(stack.pop());\n }\n re.reverse();\n return re.toString();\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3095194789","body":"- push操作:输入栈入栈\n- pop操作:如果输出栈不为空,则直接输出输出栈的元素。如果输出栈为空,则把输入栈的数据全部导入到输出栈中\n- peek操作:如果输出栈不为空,则直接peek输出栈的元素。如果输出栈为空,则把输入栈的数据全部导出到输入栈中\n```java\nclass MyQueue {\n Stack stackIn;\n Stack stackOut;\n\n public MyQueue() {\n stackIn = new Stack<>();\n stackOut = new Stack<>();\n }\n \n public void push(int x) {\n stackIn.push(x);\n }\n \n public int pop() {\n refresh();\n return stackOut.pop();\n }\n \n public int peek() {\n refresh();\n return stackOut.peek();\n }\n \n public boolean empty() {\n return stackIn.isEmpty() && stackOut.isEmpty();\n }\n\n public void refresh(){\n if(!stackOut.isEmpty()){\n return;\n }\n while(!stackIn.isEmpty()){\n stackOut.push(stackIn.pop());\n }\n }\n}\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094513644","body":"想象成将原始数组和排序后的数组并列排在一起,切一刀。如果这刀的左侧两个数组的数字出现的频次相同,那么右侧的频次也一定相同。这里就是一个分割点。\n继续向右,有同样情况就切一刀。直到走到最后,一定会切最后一刀。记录的每一个分割点,就是分的组数。\n```java\nclass Solution {\n public int maxChunksToSorted(int[] arr) {\n Map map = new HashMap<>();\n int[] sortedArr = new int[arr.length];\n for(int i = 0;i < arr.length;i++){\n sortedArr[i] = arr[i];\n }\n Arrays.sort(sortedArr);\n\n int res = 0;\n for(int i = 0;i < arr.length;i++){\n map.put(arr[i],map.getOrDefault(arr[i],0) + 1);\n if(map.get(arr[i]) == 0){\n map.remove(arr[i]);\n }\n map.put(sortedArr[i],map.getOrDefault(sortedArr[i],0) - 1);\n if(map.get(sortedArr[i]) == 0){\n map.remove(sortedArr[i]);\n }\n if(map.isEmpty()){\n res++;\n }\n }\n return res;\n }\n}\n```\n因为存在sort排序,时间复杂度O(NlogN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095217604","body":"先将链表连成一个环,再找到需要断开的位置断开即可\n```java\nclass Solution {\n public ListNode rotateRight(ListNode head, int k) {\n if(head == null) return null;\n ListNode dummy = head;\n int count = 1;\n while(dummy.next != null){\n count++;\n dummy = dummy.next;\n }\n dummy.next = head;\n\n k = k % count;\n dummy = head;\n count = count - k;\n for(int i = 1;i < count;i++){\n dummy = dummy.next;\n }\n ListNode res = dummy.next;\n dummy.next = null;\n return res;\n }\n}\n```\n\n因为遍历了链表,时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100949135","body":"因为要交换两个节点,所以需要记录两个节点+两个节点前的节点+两个节点后的节点,一共四个节点。分别用cur,one,two,three记录\n交换完后,cur指向下一组需要交换节点的前一个节点\n```java\nclass Solution {\n public ListNode swapPairs(ListNode head) {\n ListNode dummy = new ListNode(0);\n dummy.next = head;\n ListNode cur = dummy;\n ListNode one = null;\n ListNode two = null;\n ListNode three = null;\n while(cur.next != null && cur.next.next != null)\n {\n one = cur.next;\n two = cur.next.next;\n three = cur.next.next.next;\n cur.next = two;\n cur.next.next = one;\n cur.next.next.next = three;\n cur = cur.next.next;\n }\n return dummy.next;\n }\n}\n```\n遍历了链表,时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105789931","body":"考验的是二分查找和分治构建二叉树,中间大小的数构成root根节点,左侧的数组部分分治构成左节点,右侧的数组部分分治构成右节点。这里用的是链表,只需要额外增加一些链表的操作(getMid函数)。也可以将链表转化为数组,再构造,查找起来就很快。以空间换时间\n```java\nclass Solution {\n public TreeNode sortedListToBST(ListNode head) {\n ListNode dummy = head;\n int end = 0;\n while(head != null){\n end++;\n head = head.next;\n }\n\n return dfs(dummy,0,end);\n }\n\n public TreeNode dfs(ListNode head,int start,int end){\n if(start >= end) return null;\n int mid = start + (end - start) / 2;\n ListNode midNode = getMid(head,mid);\n TreeNode node = new TreeNode(midNode.val);\n node.left = dfs(head,start,mid);\n node.right = dfs(head,mid+1,end);\n\n return node;\n }\n \n public ListNode getMid(ListNode head,int mid){\n while(mid > 0){\n mid--;\n head = head.next;\n }\n return head;\n }\n}\n```\n时间复杂度O(NlogN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111943009","body":"两个指针从head出发同时往前移动,当某一个指针指向null的时候,使其指向另一个head。直至两个指针相遇,该节点为相遇节点。直到相遇,第一个指针走了A+C+B的路程,另一个指针走了B+C+A的路程\n```java\npublic class Solution {\n public ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n ListNode A = headA;\n ListNode B = headB;\n while(A != B)\n {\n if(A == null) A = headB;\n else A = A.next;\n if(B == null) B = headA;\n else B = B.next;\n }\n return A;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116973002","body":"- 判断是否有环:两个快慢指针分别从头节点出发,慢指针一次走一格,快指针一次走两个,如果有环,则二者一定会在环内相遇,如果没环,则快指针会先到达null处。可以类比于跑步,跑得快的会套跑的慢的一圈\n- 判断环入口:快指针和慢指针相遇的时候,慢指针走了x+y步,快指针走了x+y+n*(y+z)步骤,n为圈数,大于等于1,如图所示,图片节选自代码随想录。因为快指针是慢指针的两倍速,所以2x+2y=x+y+n*(y+z)。化简后发现当n=1时,x=z,当n大于1时,x=z+(n-1)(y+z)。也就是说,头节点到环入口的距离等于z或z+多圈。因此,用两个指针,一个从头节点出发,一个从相遇节点出发,最终一定会相遇在环入口,无论第二个指针在环里绕了多少圈\n```java\npublic class Solution {\n public ListNode detectCycle(ListNode head) {\n ListNode fast = head;\n ListNode slow = head;\n while(fast != null && fast.next != null)\n {\n slow = slow.next;\n fast = fast.next.next;\n if(slow == fast){\n ListNode index1 = head;\n ListNode index2 = slow;\n while(index1 != index2)\n {\n index1 = index1.next;\n index2 = index2.next;\n }\n return index1;\n }\n }\n return null;\n }\n}\n```\n时间复杂度O(N) 空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121046113","body":"Java可以使用LinkedHashMap实现LRU,内置的函数就可以实现按插入顺序排列的hashmap,手动实现LinkedHashMap代码如下:\n```java\npublic class LRUCache {\n class DLinkedNode {\n int key;\n int value;\n DLinkedNode prev;\n DLinkedNode next;\n public DLinkedNode() {}\n public DLinkedNode(int _key, int _value) {key = _key; value = _value;}\n }\n\n private Map cache = new HashMap();\n private int size;\n private int capacity;\n private DLinkedNode head, tail;\n\n public LRUCache(int capacity) {\n this.size = 0;\n this.capacity = capacity;\n head = new DLinkedNode();\n tail = new DLinkedNode();\n head.next = tail;\n tail.prev = head;\n }\n\n public int get(int key) {\n DLinkedNode node = cache.get(key);\n if (node == null) {\n return -1;\n }\n moveToHead(node);\n return node.value;\n }\n\n public void put(int key, int value) {\n DLinkedNode node = cache.get(key);\n if (node == null) {\n DLinkedNode newNode = new DLinkedNode(key, value);\n cache.put(key, newNode);\n addToHead(newNode);\n ++size;\n if (size > capacity) {\n DLinkedNode tail = removeTail();\n cache.remove(tail.key);\n --size;\n }\n }\n else {\n node.value = value;\n moveToHead(node);\n }\n }\n\n private void addToHead(DLinkedNode node) {\n node.prev = head;\n node.next = head.next;\n head.next.prev = node;\n head.next = node;\n }\n\n private void removeNode(DLinkedNode node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n }\n\n private void moveToHead(DLinkedNode node) {\n removeNode(node);\n addToHead(node);\n }\n\n private DLinkedNode removeTail() {\n DLinkedNode res = tail.prev;\n removeNode(res);\n return res;\n }\n}\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123845190","body":"递归,每一层返回max(左子树深度,右子树深度)+1\n```java\nclass Solution {\n public int maxDepth(TreeNode root) {\n if (root == null) {\n return 0;\n }\n int leftDepth = maxDepth(root.left);\n int rightDepth = maxDepth(root.right);\n return Math.max(leftDepth, rightDepth) + 1;\n }\n}\n```\n层序遍历,使用队列。每遍历一层,深度+1,直到遍历到最下面一层\n\n```java\nclass Solution {\n public int maxDepth(TreeNode root) {\n if(root == null) return 0;\n Queue queue = new LinkedList<>();\n queue.add(root);\n int depth = 0;\n while(!queue.isEmpty())\n {\n int size = queue.size();\n for(int i = 0;i < size;i++){\n TreeNode node = queue.poll();\n if(node.left != null) queue.add(node.left);\n if(node.right != null) queue.add(node.right);\n }\n depth++;\n }\n\n return depth;\n }\n}\n```\n时间复杂度O(N) N为二叉树节点个数","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125223416","body":"先判断当前两个节点是否相同,如果不同,直接返回false。如果相同无法得出最终结论,需要递归进入下一层继续判断子树\n```java\nclass Solution {\n public boolean isSameTree(TreeNode p, TreeNode q) {\n if(p == null && q != null) return false;\n if(p != null && q == null) return false;\n if(p == null && q == null) return true;\n if(p.val != q.val) return false;\n\n boolean l = isSameTree(p.left,q.left);\n boolean r = isSameTree(p.right,q.right);\n\n return l && r;\n }\n}\n```\n时间复杂度O(N) N为树的节点数量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130457949","body":"回溯维护一个List,当递归到叶子节点时,List中保存的数字就是一路从root到当前根节点的所有数字。使用StringBbuilder拼接所有数字,即是当前路径表示的数字\n\n```java\nclass Solution {\n List path = new ArrayList<>();\n int res = 0;\n public int sumNumbers(TreeNode root) {\n path.add(root.val);\n recursion(root);\n return res;\n }\n\n public void recursion(TreeNode root){\n if(root.left == null && root.right == null){\n StringBuilder sb = new StringBuilder();\n for(int num : path){\n sb.append(num);\n }\n res += Integer.parseInt(sb.toString());\n return;\n }\n\n if(root.left != null){\n path.add(root.left.val);\n recursion(root.left);\n path.remove(path.size() - 1);\n }\n\n if(root.right != null){\n path.add(root.right.val);\n recursion(root.right);\n path.remove(path.size() - 1);\n }\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134853681","body":"层序遍历,记录每一层的最左侧的值,不断覆盖变量,最终记录的是最深一层的最左侧的值\n```java\nclass Solution {\n public int findBottomLeftValue(TreeNode root) {\n Queue queue = new LinkedList<>();\n queue.add(root);\n int res = 0;\n while(!queue.isEmpty())\n {\n int size = queue.size();\n for(int i = 0;i < size;i++){\n TreeNode node = queue.poll();\n if(i == 0){\n res = node.val;\n }\n if(node.left != null) queue.add(node.left);\n if(node.right != null) queue.add(node.right);\n }\n }\n\n return res;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138992061","body":"序列化时:前序遍历记录每个节点用逗号分开,空节点记为#\n反序列化:将序列化结果以逗号分开,存储进队列,用队列递归构造树\n```java\npublic class Codec {\n StringBuilder sb = new StringBuilder();\n int count = 1;\n\n public String serialize(TreeNode root) {\n if(root == null){\n sb.append(\"#\").append(\",\");\n return sb.toString();\n }\n\n sb.append(root.val).append(\",\");\n serialize(root.left);\n serialize(root.right);\n return sb.toString();\n }\n\n public TreeNode deserialize(String data) {\n Queue queue = new LinkedList<>();\n String[] pre = data.split(\",\");\n for(String s : pre){\n queue.offer(s);\n }\n return build(queue);\n }\n\n public TreeNode build(Queue queue){\n if(queue.isEmpty()) return null;\n String rootStringVal = queue.poll();\n if(rootStringVal.equals(\"#\")) return null;\n int rootVal = Integer.parseInt(rootStringVal);\n \n TreeNode root = new TreeNode(rootVal);\n root.left = build(queue);\n root.right = build(queue);\n\n return root;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3142198278","body":"遍历二叉树,记录一个三元组,分别表示列、行和节点的值。再按照要求进行排序,列升序,行升序,值升序。最后按规则放入List\n```java\nclass Solution {\n public List> verticalTraversal(TreeNode root) {\n List nodes = new ArrayList();\n dfs(root, 0, 0, nodes);\n Collections.sort(nodes, new Comparator() {\n public int compare(int[] tuple1, int[] tuple2) {\n if (tuple1[0] != tuple2[0]) {\n return tuple1[0] - tuple2[0];\n } else if (tuple1[1] != tuple2[1]) {\n return tuple1[1] - tuple2[1];\n } else {\n return tuple1[2] - tuple2[2];\n }\n }\n });\n List> ans = new ArrayList>();\n int size = 0;\n int lastcol = Integer.MIN_VALUE;\n for (int[] tuple : nodes) {\n int col = tuple[0], row = tuple[1], value = tuple[2];\n if (col != lastcol) {\n lastcol = col;\n ans.add(new ArrayList());\n size++;\n }\n ans.get(size - 1).add(value);\n }\n return ans;\n }\n\n public void dfs(TreeNode node, int row, int col, List nodes) {\n if (node == null) {\n return;\n }\n nodes.add(new int[]{col, row, node.val});\n dfs(node.left, row + 1, col - 1, nodes);\n dfs(node.right, row + 1, col + 1, nodes);\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146508830","body":"先将数组中所有值和其对应索引存入hashmap,再遍历一遍数组,如果遍历到的num对应的target-num在map中,即是找到的两个索引。注意要避免一个数算两次\n```java\nclass Solution {\n public int[] twoSum(int[] nums, int target) {\n Map map = new HashMap<>();\n for(int i = 0;i < nums.length;i++){\n map.put(nums[i],i);\n }\n\n for(int i = 0;i < nums.length;i++){\n if(map.containsKey(target - nums[i]) && map.get(target - nums[i]) != i){\n int[] res = new int[2];\n res[0] = i;\n res[1] = map.get(target - nums[i]);\n return res;\n }\n }\n return null;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148286271","body":"遍历数组,先用hashmap记录每个数字出现的次数。用优先队列定义好排序规则,将map中的内容放入优先队列中,再按照要求从队列中取\n```java\nclass Solution {\n public int[] topKFrequent(int[] nums, int k) {\n Map map = new HashMap<>();\n for(int num : nums){\n map.put(num,map.getOrDefault(num,0)+1);\n }\n PriorityQueue p = new PriorityQueue<>((a,b) -> (b[1]-a[1]));\n for(Map.Entry m : map.entrySet()){\n p.add(new int[]{m.getKey(),m.getValue()});\n }\n int[] result = new int[k];\n for(int i = 0;i < k;i++){\n result[i] = p.poll()[0];\n }\n return result;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149131512","body":"二层遍历,第一层遍历i,第二层遍历,使用map记录每个元组与第一层的i的距离dis出现的次数time。最终由i组成的回旋镖数量为time*(time-1)\n```java\nclass Solution {\n public int numberOfBoomerangs(int[][] points) {\n int res = 0;\n for(int[] a : points){\n Map map = new HashMap<>();\n for(int[] b : points){\n int dis = (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]);\n map.put(dis,map.getOrDefault(dis,0) + 1);\n }\n for(int key : map.keySet()){\n int val = map.get(key);\n res += val * (val - 1);\n }\n }\n return res;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153104469","body":"滑动窗口,定义left指针和right指针,两个指针窗口内即是符合题目要求的子串。不断向右移right指针,如果窗口内的子串不符合题目要求了,就右移left指针缩小窗口直到符合题目要求。\n在遍历过程中,记录窗口长度最大值\n使用hashSet判断窗口内是否符合题目要求\n```java\nclass Solution {\n public int lengthOfLongestSubstring(String s) {\n Set set = new HashSet<>();\n int left = 0;\n int res = 0;\n for(int right = 0;right < s.length();right++){\n char c = s.charAt(right);\n while(set.contains(c)){\n set.remove(s.charAt(left));\n left++;\n }\n\n set.add(c);\n res = Math.max(res,right - left + 1); \n }\n return res;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3157250607","body":"滑动窗口\n```java\nclass Solution {\n public List findSubstring(String s, String[] words) {\n int wordLen = words[0].length(); \n int windowLen = wordLen * words.length; \n\n Map targetCnt = new HashMap<>();\n for (String w : words) {\n targetCnt.put(w,targetCnt.getOrDefault(w,0) + 1);\n }\n\n List ans = new ArrayList<>();\n for (int start = 0; start < wordLen; start++) {\n Map cnt = new HashMap<>();\n int overload = 0;\n for (int right = start + wordLen; right <= s.length(); right += wordLen) {\n String inWord = s.substring(right - wordLen, right);\n if (cnt.getOrDefault(inWord, 0).equals(targetCnt.getOrDefault(inWord, 0))) {\n overload++;\n }\n cnt.merge(inWord, 1, Integer::sum); \n\n int left = right - windowLen;\n if (left < 0) { \n continue;\n }\n if (overload == 0) {\n ans.add(left);\n }\n\n String outWord = s.substring(left, left + wordLen);\n cnt.merge(outWord, -1, Integer::sum); \n if (cnt.get(outWord).equals(targetCnt.getOrDefault(outWord, 0))) {\n overload--;\n }\n }\n }\n\n return ans;\n }\n}\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162563860","body":"前缀和\n```java\nclass Solution {\n public int minSubarray(int[] nums, int p) {\n int n = nums.length;\n int[] s = new int[n + 1];\n for (int i = 0; i < n; i++) {\n s[i + 1] = (s[i] + nums[i]) % p;\n }\n int x = s[n];\n if (x == 0) {\n return 0; \n }\n\n int ans = n;\n Map last = new HashMap<>();\n for (int i = 0; i <= n; i++) {\n last.put(s[i], i);\n int j = last.getOrDefault((s[i] - x + p) % p, -n);\n ans = Math.min(ans, i - j);\n }\n return ans < n ? ans : -1;\n }\n}\n\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170443755","body":"双指针,慢指针用于存数字,快指针用于检验数字是否重复\n```java\nclass Solution {\n public int removeDuplicates(int[] nums) {\n if(nums.length == 1) return 1;\n int slow = 0;\n for(int fast = 1;fasttarget){\n right = middle;\n }else if(nums[middle] queue;\n public MyQueue(){\n queue = new LinkedList<>();\n } \n\n public void add(int val){\n while(!queue.isEmpty() && val > queue.getLast()){\n queue.removeLast();\n }\n queue.add(val);\n }\n\n public void poll(int val){\n if(queue.peek() == val){\n queue.poll();\n }\n }\n\n public int max(){\n return queue.peek();\n }\n}\n```\n时间复杂度O(nlogn)\n优先队列插入的复杂度是logn","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3177951924","body":"两个数组计算每个人的入度和出度\n```java\nclass Solution {\n public int findJudge(int n, int[][] trust) {\n int[] inDegrees = new int[n + 1];\n int[] outDegrees = new int[n + 1];\n for (int[] edge : trust) {\n int x = edge[0], y = edge[1];\n ++inDegrees[y];\n ++outDegrees[x];\n }\n for (int i = 1; i <= n; ++i) {\n if (inDegrees[i] == n - 1 && outDegrees[i] == 0) {\n return i;\n }\n }\n return -1;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182597716","body":"染色法,如果染色过程冲突,则无法实现、返回false\n```java\nclass Solution {\n boolean[] visited;\n boolean[] color;\n boolean flag = false;\n public boolean possibleBipartition(int n, int[][] dislikes) {\n List[] graph = build(dislikes,n);\n visited = new boolean[graph.length];\n color = new boolean[graph.length];\n for(int i = 1;i < graph.length;i++){\n if(visited[i] == false){\n traverse(graph,i);\n }\n }\n return !flag;\n }\n\n public List[] build(int[][] dislikes,int n){\n List[] graph = new List[n + 1];\n for(int i = 0;i < n + 1;i++){\n graph[i] = new LinkedList<>();\n }\n\n for(int[] edge : dislikes){\n int x = edge[0];\n int y = edge[1];\n graph[x].add(y);\n graph[y].add(x);\n }\n return graph;\n }\n\n public void traverse(List[] graph,int s){\n if(flag) return;\n visited[s] = true;\n for(int x : graph[s]){\n if(visited[x] == false){\n color[x] = !color[s];\n traverse(graph,x);\n }else{\n if(color[x] == color[s]) flag = true;\n }\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186848399","body":"拓扑排序\n```java\nclass Solution {\n public int[] sortItems(int n, int m, int[] group, List> beforeItems) {\n List> groupItem = new ArrayList>();\n for (int i = 0; i < n + m; ++i) {\n groupItem.add(new ArrayList());\n }\n\n // 组间和组内依赖图\n List> groupGraph = new ArrayList>();\n for (int i = 0; i < n + m; ++i) {\n groupGraph.add(new ArrayList());\n }\n List> itemGraph = new ArrayList>();\n for (int i = 0; i < n; ++i) {\n itemGraph.add(new ArrayList());\n }\n\n // 组间和组内入度数组\n int[] groupDegree = new int[n + m];\n int[] itemDegree = new int[n];\n \n List id = new ArrayList();\n for (int i = 0; i < n + m; ++i) {\n id.add(i);\n }\n\n int leftId = m;\n // 给未分配的 item 分配一个 groupId\n for (int i = 0; i < n; ++i) {\n if (group[i] == -1) {\n group[i] = leftId;\n leftId += 1;\n }\n groupItem.get(group[i]).add(i);\n }\n // 依赖关系建图\n for (int i = 0; i < n; ++i) {\n int curGroupId = group[i];\n for (int item : beforeItems.get(i)) {\n int beforeGroupId = group[item];\n if (beforeGroupId == curGroupId) {\n itemDegree[i] += 1;\n itemGraph.get(item).add(i); \n } else {\n groupDegree[curGroupId] += 1;\n groupGraph.get(beforeGroupId).add(curGroupId);\n }\n }\n }\n\n // 组间拓扑关系排序\n List groupTopSort = topSort(groupDegree, groupGraph, id); \n if (groupTopSort.size() == 0) {\n return new int[0];\n }\n int[] ans = new int[n];\n int index = 0;\n // 组内拓扑关系排序\n for (int curGroupId : groupTopSort) {\n int size = groupItem.get(curGroupId).size();\n if (size == 0) {\n continue;\n }\n List res = topSort(itemDegree, itemGraph, groupItem.get(curGroupId));\n if (res.size() == 0) {\n return new int[0];\n }\n for (int item : res) {\n ans[index++] = item;\n }\n }\n return ans;\n }\n\n public List topSort(int[] deg, List> graph, List items) {\n Queue queue = new LinkedList();\n for (int item : items) {\n if (deg[item] == 0) {\n queue.offer(item);\n }\n }\n List res = new ArrayList();\n while (!queue.isEmpty()) {\n int u = queue.poll(); \n res.add(u);\n for (int v : graph.get(u)) {\n if (--deg[v] == 0) {\n queue.offer(v);\n }\n }\n }\n return res.size() == items.size() ? res : new ArrayList();\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190861492","body":"模拟机器人移动\n```java\nclass Solution {\n public boolean judgeCircle(String moves) {\n int x = 0, y = 0;\n int length = moves.length();\n for (int i = 0; i < length; i++) {\n char move = moves.charAt(i);\n if (move == 'U') {\n y--;\n } else if (move == 'D') {\n y++;\n } else if (move == 'L') {\n x--;\n } else if (move == 'R') {\n x++;\n }\n }\n return x == 0 && y == 0;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193745750","body":"模拟\n```java\nclass Solution {\n public int[] getOrder(int[][] ts) {\n int n = ts.length;\n // 将 ts 转存成 nts,保留任务编号\n int[][] nts = new int[n][3];\n for (int i = 0; i < n; i++) nts[i] = new int[]{ts[i][0], ts[i][1], i};\n // 根据任务入队时间进行排序\n Arrays.sort(nts, (a,b)->a[0]-b[0]);\n // 根据题意,先按照「持续时间」排序,再根据「任务编号」排序\n PriorityQueue q = new PriorityQueue<>((a,b)->{\n if (a[1] != b[1]) return a[1] - b[1];\n return a[2] - b[2];\n });\n int[] ans = new int[n];\n for (int time = 1, j = 0, idx = 0; idx < n; ) {\n \t// 如果当前任务可以添加到「队列」中(满足入队时间)则进行入队\n while (j < n && nts[j][0] <= time) q.add(nts[j++]);\n if (q.isEmpty()) {\n\t // 如果当前「队列」没有任务,直接跳到下个任务的入队时间\n time = nts[j][0];\n } else {\n \t// 如果有可执行任务的话,根据优先级将任务出队(记录下标),并跳到该任务完成时间点\n int[] cur = q.poll();\n ans[idx++] = cur[2];\n time += cur[1];\n }\n }\n return ans;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194379645","body":"转化为分钟\n```java\nclass Solution {\n public int numberOfRounds(String loginTime, String logoutTime) {\n int loginHour = Integer.parseInt(loginTime.substring(0, 2));\n int loginMinute = Integer.parseInt(loginTime.substring(3));\n int logoutHour = Integer.parseInt(logoutTime.substring(0, 2));\n int logoutMinute = Integer.parseInt(logoutTime.substring(3));\n int loginTotalMinute = loginHour * 60 + loginMinute;\n int logoutTotalMinute = logoutHour * 60 + logoutMinute;\n if (loginTotalMinute > logoutTotalMinute) {\n logoutTotalMinute += 1440;\n }\n if (loginTotalMinute % 15 != 0) {\n loginTotalMinute += 15 - loginTotalMinute % 15;\n }\n logoutTotalMinute -= logoutTotalMinute % 15;\n return Math.max((logoutTotalMinute - loginTotalMinute) / 15, 0);\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3195332635","body":"分别模拟三个情况\n```java\nclass Solution {\n public int minCharacters(String a, String b) {\n int n = a.length(), m = b.length(), ans = 0x3f3f3f3f;\n int[] c1 = new int[26], c2 = new int[26];\n for (char c : a.toCharArray()) c1[c - 'a']++;\n for (char c : b.toCharArray()) c2[c - 'a']++;\n for (int i = 0; i < 26 && ans != 0; i++) {\n // 3\n int ca = n - c1[i], cb = m - c2[i];\n ans = Math.min(ans, ca + cb);\n if (i == 0) continue;\n int r1 = 0, r2 = 0;\n // 1\n for (int j = i; j < 26; j++) r1 += c1[j];\n for (int j = 0; j < i; j++) r1 += c2[j];\n // 2\n for (int j = i; j < 26; j++) r2 += c2[j];\n for (int j = 0; j < i; j++) r2 += c1[j];\n ans = Math.min(ans, Math.min(r1, r2));\n }\n return ans;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199298563","body":"归并排序\n\n```java\nclass Solution {\n public int[] sortArray(int[] nums) {\n sort(nums,0,nums.length - 1);\n return nums;\n }\n\n public void sort(int[] nums,int start,int end){\n if(start >= end) return;\n int p = para(nums,start,end);\n\n sort(nums,start,p - 1);\n sort(nums,p + 1,end);\n }\n\n public int para(int[] nums,int l,int h){\n\n int x = nums[l];\n int i = l,j = h;\n while(i < j)\n {\n while(i < j && nums[j] >= x) j--;\n if(i < j) nums[i++] = nums[j];\n\n while(i < j && nums[i] < x) i++;\n if(i < j) nums[j--] = nums[i];\n }\n\n nums[i] = x;\n return i;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204106258","body":"二分查找\n```java\nclass Solution {\n public int mySqrt(int x) {\n if(x == 0) return 0;\n if(x == 1) return 1;\n int left = 0;\n int right = x;\n while(left < right)\n {\n int middle = left + (right - left) / 2;\n if(middle > x / middle){\n right = middle;\n }else if(middle < x / middle){\n left = middle + 1;\n }else{\n return middle;\n }\n }\n if(right == x / right){\n return right;\n }else{\n return right - 1;\n }\n\n \n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208985528","body":"二分查找\n```java\npublic class Solution extends VersionControl {\n public int firstBadVersion(int n) {\n int left = 1, right = n;\n while (left < right) { \n int mid = left + (right - left) / 2; \n if (isBadVersion(mid)) {\n right = mid; \n } else {\n left = mid + 1; \n }\n }\n return left;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3213255556","body":"```java\nclass Solution {\n public int reversePairs(int[] nums) {\n if (nums.length == 0) {\n return 0;\n }\n return reversePairsRecursive(nums, 0, nums.length - 1);\n }\n\n public int reversePairsRecursive(int[] nums, int left, int right) {\n if (left == right) {\n return 0;\n } else {\n int mid = (left + right) / 2;\n int n1 = reversePairsRecursive(nums, left, mid);\n int n2 = reversePairsRecursive(nums, mid + 1, right);\n int ret = n1 + n2;\n\n // 首先统计下标对的数量\n int i = left;\n int j = mid + 1;\n while (i <= mid) {\n while (j <= right && (long) nums[i] > 2 * (long) nums[j]) {\n j++;\n }\n ret += j - mid - 1;\n i++;\n }\n\n // 随后合并两个排序数组\n int[] sorted = new int[right - left + 1];\n int p1 = left, p2 = mid + 1;\n int p = 0;\n while (p1 <= mid || p2 <= right) {\n if (p1 > mid) {\n sorted[p++] = nums[p2++];\n } else if (p2 > right) {\n sorted[p++] = nums[p1++];\n } else {\n if (nums[p1] < nums[p2]) {\n sorted[p++] = nums[p1++];\n } else {\n sorted[p++] = nums[p2++];\n }\n }\n }\n for (int k = 0; k < sorted.length; k++) {\n nums[left + k] = sorted[k];\n }\n return ret;\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216192351","body":"```java\nclass Solution {\n public int findRadius(int[] houses, int[] heaters) {\n int ans = 0;\n Arrays.sort(heaters);\n for (int house : houses) {\n int i = binarySearch(heaters, house);\n int j = i + 1;\n int leftDistance = i < 0 ? Integer.MAX_VALUE : house - heaters[i];\n int rightDistance = j >= heaters.length ? Integer.MAX_VALUE : heaters[j] - house;\n int curDistance = Math.min(leftDistance, rightDistance);\n ans = Math.max(ans, curDistance);\n }\n return ans;\n }\n\n public int binarySearch(int[] nums, int target) {\n int left = 0, right = nums.length - 1;\n if (nums[left] > target) {\n return -1;\n }\n while (left < right) {\n int mid = (right - left + 1) / 2 + left;\n if (nums[mid] > target) {\n right = mid - 1;\n } else {\n left = mid;\n }\n }\n return left;\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"falsity":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073705405","body":"# 思路\n\n从低位往高位计算, 每次计算保留进位数据,本位留下余数\n\n```python\nclass Solution(object):\n def addToArrayForm(self, num, k):\n \"\"\"\n :type num: List[int]\n :type k: int\n :rtype: List[int]\n \"\"\"\n result = []\n i = len(num) - 1\n while i >=0 or k > 0:\n if i >= 0:\n k += num[i]\n i -= 1\n result.append(k % 10)\n k = k // 10\n return result[::-1]\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3079013152","body":"# 【Day 2】821. 字符的最短距离\n\n## 思路\n\n先遍历一遍获取c的位置列表, 再遍历每个位置计算最近的距离\n\n```python\nclass Solution(object):\n def shortestToChar(self, s, c):\n \"\"\"\n :type s: str\n :type c: str\n :rtype: List[int]\n \"\"\"\n locations = []\n result = []\n for i, char in enumerate(s):\n if char == c:\n locations.append(i)\n \n for i in range(len(s)):\n shortest = min(abs(i - location) for location in locations)\n result.append(shortest)\n return result\n```\n\n时间复杂度: O(n*m), m为字符c出现次数,最差为O(n^2)\n\n空间复杂度: O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084580543","body":"**【Day 3】1381. 设计一个支持增量操作的栈**\n\n*** 思路***\n\n用数组模拟栈\n\n```python\nclass CustomStack(object):\n\n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def __init__(self, maxSize):\n \"\"\"\n :type maxSize: int\n \"\"\"\n self.stack = [0] * maxSize\n self.top = -1\n \n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n if self.top < len(self.stack) - 1:\n self.top += 1\n self.stack[self.top] = x\n \n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if self.top == -1:\n return -1\n value = self.stack[self.top]\n self.top -= 1\n return value\n \n # 时间复杂度: O(k)\n # 空间复杂度: O(n)\n def increment(self, k, val):\n \"\"\"\n :type k: int\n :type val: int\n :rtype: None\n \"\"\"\n lim = min(k, self.top + 1)\n for i in range(lim):\n self.stack[i] += val\n \n\n\n# Your CustomStack object will be instantiated and called as such:\n# obj = CustomStack(maxSize)\n# obj.push(x)\n# param_2 = obj.pop()\n# obj.increment(k,val)\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089882117","body":"**【Day 4】394. 字符串解码**\n\n**思路**\n\n参照[Krahets的字符串解码题解](https://leetcode.cn/problems/decode-string/solutions/19447/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd/)中的辅助栈解法,利用栈来存储每一层[]中的字符串和需要重复的次数逐层拼接字符串,最后得到结果.\n\n**代码**\n\n```python\nclass Solution(object):\n def decodeString(self, s):\n \"\"\"\n :type s: str\n :rtype: str\n \"\"\"\n stack, res, multi = [], \"\", 0\n for c in s:\n if c == '[':\n stack.append([multi, res])\n res, multi = \"\", 0\n elif c == ']':\n cur_multi, last_res = stack.pop()\n res = last_res + cur_multi * res\n elif '0' <= c <= '9':\n multi = multi * 10 + int(c)\n else:\n res += c\n return res \n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(N)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092420487","body":"**【Day 5】232. 用栈实现队列**\n\n**思路**\n\n利用栈先进后出的性质,通过stack1完成元素的倒序放置,再将stack1的元素放入stack2中,前面的元素就放在了栈顶. 此时经过两次入栈出栈的操作stack2中的元素就满足了先进先出的要求.\n\n但是要注意以下问题:\n\n1. 只有在stack2中元素为空时才能将stack1中的元素放入stack2中,这样才能保证有序性\n2. 遍历list元素要使用while, 不能用for,否则会有元素被跳过\n\n**代码**\n\n```python\nclass MyQueue(object):\n\n def __init__(self):\n self.stack1, self.stack2 = [], []\n \n\n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n self.stack1.append(x)\n \n\n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n res = self.peek()\n return self.stack2.pop()\n \n\n def peek(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if self.stack2:\n return self.stack2[-1]\n elif self.stack1:\n while self.stack1:\n self.stack2.append(self.stack1.pop())\n return self.stack2[-1]\n else:\n return -1\n \n\n def empty(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n return not self.stack1 and not self.stack2\n \n\n\n# Your MyQueue object will be instantiated and called as such:\n# obj = MyQueue()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.peek()\n# param_4 = obj.empty()\n```\n\n**复杂度分析**\n\n时间复杂度: push, empty 是O(1), pop, peek是O(N)\n空间复杂度: O(N)\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097331008","body":"**【Day 7】61. 旋转链表**\n\n**思路**\n\nk可能会大于链表长度导致循环遍历链表. 所以真实的旋转偏移是k%n,n为链表长度. 使用双指针找到需要断开的节点位置,将链表进行断开和重新拼接即可得到结果\n\n```pyth\nclass Solution(object):\n def rotateRight(self, head, k):\n \"\"\"\n :type head: Optional[ListNode]\n :type k: int\n :rtype: Optional[ListNode]\n \"\"\"\n if k == 0 or not head or not head.next:\n return head\n\n node = head\n l = 0\n while node:\n l += 1\n node = node.next\n \n if k % l == 0:\n return head\n k = k % l\n slow = fast = head\n for i in range(k):\n fast = fast.next\n \n while fast.next:\n slow = slow.next\n fast = fast.next\n\n new_head = slow.next\n slow.next = None\n fast.next = head\n return new_head\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103411213","body":"**【Day 8】24. 两两交换链表中的节点**\n\n**思路**\n\n类似于反转链表, 用两个指针来对链表指向进行修改,唯一的区别是cur需要间隔一个进行遍历,而不是逐个遍历\n\n```python\nclass Solution(object):\n def swapPairs(self, head):\n \"\"\"\n :type head: Optional[ListNode]\n :rtype: Optional[ListNode]\n \"\"\"\n dummy = ListNode()\n dummy.next = head\n pre = dummy\n cur = head\n while cur and cur.next:\n nxt = cur.next\n cur.next = nxt.next\n nxt.next = cur\n pre.next = nxt\n pre = cur\n cur = cur.next\n \n return dummy.next\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109176294","body":"**【Day 9】109. 有序链表转换二叉搜索树**\n\n**思路**\n\n首先获取链表的长度,再根据二叉树的中序遍历方式递归构建BST, 根节点的值在遍历完左子树后刚好移动了m次到达中间节点,即根节点位置\n\n\n\n```python\nclass Solution:\n def sortedListToBST(self, head: Optional[ListNode]) -> Optional[TreeNode]:\n def getLength(head: ListNode) -> int:\n count = 0\n while head:\n count += 1\n head = head.next\n return count\n\n def buildBST(left: int, right: int) -> TreeNode:\n if left > right:\n return None\n m = (left + right) // 2\n root = TreeNode()\n left_node = buildBST(left, m - 1)\n nonlocal head\n root.val = head.val\n head = head.next\n \n right_node = buildBST(m+1, right)\n root.left = left_node\n root.right = right_node\n return root\n\n l = getLength(head)\n return buildBST(0, l - 1)\n```\n\n**复杂度分析**\n\n时间复杂度: O(n)\n空间复杂度: O(log n)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3122088595","body":"**【Day 12】146. LRU 缓存机制**\n\n**思路**\n\n`get` 和 `put` 必须以 `O(1)` 的平均时间复杂度运行, 说明需要使用到map. 需要记录关键字使用过的顺序需要使用到链表\n\nget方法需要查询map, 如果key存在则返回值,如果不存在则返回-1. 查询完成后,需要把该节点移动到队首(删除后再插入队首)\n\nput方法需要先查询map容量,如果容量已满,需要通过list找到队尾元素删除, 并将新元素插入队首\n\nnode需要知道前后节点,所以使用双向链表,map和node之间建立映射方便查询数据\n\n\n\n需要的内部函数: 删除元素, 将元素插入队首\n\n```python\nclass LRUCache:\n class Node:\n def __init__(self, key: int, val: int):\n self.key = key\n self.val = val\n self.pre = pre\n self.next = next\n\n def __init__(self, capacity: int):\n self.capacity = capacity\n self.dummy = self.Node(-1, -1)\n self.dummy.pre = self.dummy\n self.dummy.next = self.dummy\n self.map = {}\n\n def add_node_to_head(self, node: Node):\n node.pre = self.dummy\n node.next = self.dummy.next\n self.dummy.next.pre = node\n self.dummy.next = node\n\n def remove_node(self, node: Node):\n node.pre.next = node.next\n node.next.pre = node.pre\n\n def get(self, key: int) -> int:\n if key not in self.map:\n return -1\n\n node = self.map[key]\n self.remove_node(node)\n self.add_node_to_head(node)\n return node.val\n\n def put(self, key: int, value: int) -> None:\n if key in self.map:\n node = self.map[key]\n node.val = value\n self.remove_node(node)\n self.add_node_to_head(node)\n return\n\n new_node = self.Node(key, value)\n self.map[key] = new_node\n self.add_node_to_head(new_node)\n\n if len(self.map) > self.capacity:\n tail = self.dummy.pre\n del self.map[tail.key]\n self.remove_node(tail)\n\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124440801","body":"**【Day 13】104. 二叉树的最大深度**\n\n**思路**\n\n二叉树的最大深度为max(左子树深度, 右子树深度) + 1, 这就变成了一个递归问题\n\n```python\nclass Solution(object):\n def maxDepth(self, root):\n \"\"\"\n :type root: Optional[TreeNode]\n :rtype: int\n \"\"\"\n if root is None:\n return 0\n if root is not None and root.left is None and root.right is None:\n return 1\n return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1\n\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127200969","body":"**【Day 14】100. 相同的树**\n\n**思路**\n\n相同的树一定根节点相同,并且左子树和右子树都相同, 可以进行递归判断所有子树是否相同\n\n```python\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if p is None or q is None:\n return p is q\n \n if p.val == q.val:\n return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)\n else:\n return False\n```\n\n**复杂度分析**\n\n时间复杂度: O(min(m,n)) m为p节点个数,n为q节点个数\n空间复杂度: O(min(m,n)) m为p节点个数,n为q节点个数","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136787502","body":"**【Day 16】513. 找树左下角的值**\n\n**思路**\n\n从右往左层序遍历,最后一个节点就是左下角的点\n\n```python\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n q = deque([root])\n while q:\n node = q.popleft()\n if node.right: q.append(node.right)\n if node.left: q.append(node.left)\n return node.val\n```\n\n**复杂度分析**\n\n时间复杂度: O(n) \n空间复杂度: O(n)\n\n","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3151014729","body":"**【Day 21】447. 回旋镖的数量**\n\n**思路**\n\n首先计算距离相等的点的数量,在计算相同距离点之间的排列组合数量\n\n```python\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n res = 0\n n = len(points)\n if n < 3:\n return 0\n \n for i in range(n):\n x0, y0 = points[i]\n dist_count = {}\n \n for j in range(n):\n if i == j:\n continue\n \n x1, y1 = points[j]\n dx = x1 - x0\n dy = y1 - y0\n dist_sq = dx * dx + dy * dy\n \n dist_count[dist_sq] = dist_count.get(dist_sq, 0) + 1\n \n for cnt in dist_count.values():\n res += cnt * (cnt - 1)\n \n return res\n```\n\n时间复杂度: O(n ^ 2)\n\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3175046868","body":"**【Day 28】239. 滑动窗口最大值**\n\n```python\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n n = len(nums)\n if n == 0 or k == 0:\n return []\n \n res = []\n q = deque() \n for i in range(n):\n while q and q[0] < i - k + 1:\n q.popleft()\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n if i >= k - 1:\n res.append(nums[q[0]])\n return res\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3179722453","body":"\n\n```python\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n in_list = [0] * (n + 1)\n out_list = [0] * (n + 1)\n for i in trust:\n in_list[i[1]] += 1\n out_list[i[0]] += 1\n\n for i in range(1, n+1):\n if in_list[i] == n - 1 and out_list[i] == 0:\n return i\n\n return -1\n```\n\n时间复杂度: O(n + m), m为trust列表长度\n\n空间复杂度: O(n)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194443006","body":"```python\nclass Solution:\n def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:\n start = 60 * int(loginTime[:2]) + int(loginTime[3:])\n end = 60 * int(logoutTime[:2]) + int(logoutTime[3:])\n if start > end:\n end += 24 * 60\n start = math.ceil(start / 15) * 15\n end = end // 15 * 15\n return max(0, (end - start) // 15)\n```\n\n时间复杂度: O(1)\n\n空间复杂度: O(1)\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3200900420","body":"快排\n```java\n class Solution {\n public int[] sortArray(int[] nums) {\n quickSort(nums, 0, nums.length - 1);\n return nums;\n }\n\n private void quickSort(int[] nums, int low, int high){\n if(low < high){\n int mid = partition(nums, low, high);\n quickSort(nums, low, mid - 1);\n quickSort(nums, mid + 1, high);\n }\n }\n\n private int partition(int[] nums, int low, int high){\n int pivot = low + (int) (Math.random() * (high - low + 1));\n swap(nums, pivot, low);\n int i = low, j = low + 1;\n while (j <= high){\n if(nums[j] < nums[low]){\n swap(nums, j, ++i);\n }\n j++;\n }\n swap(nums, low, i);\n return i;\n }\n\n private void swap(int[] nums, int i, int j){\n int tmp = nums[i];\n nums[i] = nums[j];\n nums[j] = tmp;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3224529913","body":"思路: 采用定长滑动窗口的做法, 先初始化定长窗口,再移动更新结果\n\n```python\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n ans = count = 0\n vowels = set(['a', 'e', 'i', 'o', 'u'])\n chars = list(s)\n n = len(chars)\n left = right = 0\n while right < k:\n if chars[right] in vowels:\n count += 1\n right += 1\n ans = count\n while right < n:\n if chars[right] in vowels:\n count += 1\n if chars[left] in vowels:\n count -= 1\n ans = max(count, ans)\n left += 1\n right += 1\n return ans\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3228513919","body":"\n\n```java\nclass Solution {\n public double new21Game(int n, int k, int maxPts) {\n if( k > n){\n return 0;\n }\n if((k == 0 && n >= 0) && n > k + maxPts){\n return 1;\n }\n\n int len = k + maxPts;\n double[] dp = new double[len];\n double sum = 0;\n\n for(int i = k; i < len && i <= n; i++){\n dp[i] = 1;\n sum++;\n }\n\n for(int i = k - 1; i >= 0; i--){\n dp[i] = sum / maxPts;\n sum = sum - dp[i + maxPts] + dp[i];\n }\n return dp[0];\n }\n}\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(n)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3240213950","body":"**\n\n```python\nclass Solution:\n def readBinaryWatch(self, turnedOn: int) -> List[str]:\n ans = []\n for h in range(12):\n for m in range(60):\n if bin(h).count('1') + bin(m).count('1') == turnedOn:\n ans.append(f\"{h}:{m:02d}\")\n \n return ans\n```\n\n时间复杂度: O(1)\n\n空间复杂度: O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245665636","body":"\n\n```python\nclass Solution:\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n # 时间复杂度: O(mn)\n # 空间复杂度: O(mn)\n ans = 0\n m, n = len(grid), len(grid[0])\n\n def dfs(i: int, j: int) -> int:\n count = 1\n grid[i][j] = 0\n for x, y in (i-1, j), (i+1, j), (i, j-1), (i, j+1):\n if 0<= x < m and 0 <= y < n and grid[x][y]:\n count += dfs(x, y)\n return count\n\n for i, row in enumerate(grid):\n for j, x in enumerate(row):\n if x:\n ans = max(ans, dfs(i, j))\n\n return ans\n \n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3253854706","body":"\n```python\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n # 时间复杂度: O(n)\n # 空间复杂度: O(n)\n ans = 0\n q = initialBoxes\n while q:\n p = []\n for i in q:\n if status[i] == 0:\n p.append(i)\n continue\n ans += candies[i]\n for key in keys[i]:\n status[key] = 1\n for c in containedBoxes[i]:\n p.append(c)\n if p == q or not p:\n break\n q = p\n return ans\n```","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3271174778","body":"\n\n```java\nclass Solution {\n public int longestCommonSubsequence(String text1, String text2) {\n # 时间复杂度: O(mn)\n # 空间复杂度: O(mn)\n int m = text1.length(), n = text2.length();\n int[][] dp = new int[m+1][n+1];\n for (int i = 1; i <= m; i++) {\n char c1 = text1.charAt(i - 1);\n for (int j = 1; j <= n; j++) {\n char c2 = text2.charAt(j - 1);\n if (c1 == c2){\n dp[i][j] = dp[i - 1][j-1] + 1;\n }else{\n dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);\n }\n\n }\n }\n return dp[m][n];\n }\n}\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3275118967","body":"时间复杂度: O(m * n)\n\n空间复杂度: ~~O(n)~~ 题解指正行列可以交换, 所以为O(min(m, n))\n\n```python\nclass Solution:\n def uniquePaths(self, m: int, n: int) -> int:\n f = [1] * n\n\n for i in range(1, m):\n for j in range(1, n):\n f[j] += f[j - 1]\n return f[n - 1]\n \n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289638493","body":"```python\nclass Solution:\n def findTargetSumWays(self, nums: List[int], target: int) -> int:\n # 时间复杂度: O(n * target)\n # 空间复杂度: O(n * target)\n @cache\n def dfs(i: int, c: int) -> int:\n if i < 0:\n return 1 if c == 0 else 0\n \n return dfs(i - 1, c - nums[i]) + dfs(i - 1, c + nums[i])\n \n return dfs(len(nums) - 1, target)\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3298968000","body":"```python\nclass Solution:\n def change(self, amount: int, coins: List[int]) -> int:\n \t# 时间复杂度(n * amount)\n # 空间复杂度(amount)\n f = [1] + [0] * amount\n for x in coins:\n for c in range(x, amount + 1):\n f[c] += f[c - x]\n return f[-1]\n```","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316065059","body":"```python\nclass Solution:\n def mergeTwoLists(self, list1:Optional[ListNode], list2:Optional[ListNode]) -> Optional[ListNode]:\n cur = dummy = ListNode()\n while list1 and list2:\n if list1.val < list2.val:\n cur.next = list1\n list1 = list1.next\n else:\n cur.next = list2\n list2 = list2.next\n cur = cur.next\n cur.next = list1 if list1 else list2\n return dummy.next\n\n def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:\n # 时间复杂度: O(L * logm) m 为 lists 的长度,L 为所有链表的长度之和\n # 空间复杂度: O(1)\n m = len(lists)\n if m == 0:\n return None\n step = 1\n while step < m:\n for i in range(0, m - step, step * 2):\n lists[i] = self.mergeTwoLists(lists[i], lists[i + step])\n step *= 2\n return lists[0]\n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3334653673","body":"思路: 用Node来创建一个树, 每个node下面可以存下一个字母的node, 并且每个node有个end标志位,用来表示单词结尾\n\n```python\nclass Node:\n __slots__ = \"son\", \"end\"\n\n def __init__(self):\n self.son = {}\n self.end = False\n\n\nclass Trie:\n def __init__(self):\n self.root = Node()\n\n # 时间复杂度: O(n)\n def insert(self, word: str) -> None:\n cur = self.root\n for c in word:\n if c not in cur.son:\n cur.son[c] = Node()\n cur = cur.son[c]\n cur.end = True\n\n # 时间复杂度: O(n)\n def find(self, word: str) -> int:\n cur = self.root\n for c in word:\n if c not in cur.son:\n return 0\n cur = cur.son[c]\n return 2 if cur.end else 1\n \n # 时间复杂度: O(n)\n def search(self, word: str) -> bool:\n return self.find(word) == 2\n\n # 时间复杂度: O(n)\n def startsWith(self, prefix: str) -> bool:\n return self.find(prefix) != 0\n```\n\n空间复杂度: O(m * n) m为insert次数, n为单词长度","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuetong3yu":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073754281","body":"```js\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(nums, k) {\n let str1 = '', str2 = String(k)\n for(let i = 0; i < nums.length; i++) {\n str1 += nums[i];\n }\n // swap to make sure str1 is longer than str2\n if (str1.length < str2.length) {\n const t = str1;\n str1 = str2;\n str2 = t;\n }\n const res = new Array(str1.length).fill(0);\n let p1 = str1.length - 1, p2 = str2.length - 1;\n while(p1 >= 0) {\n res[p1] = Number(str1[p1]) + Number(str2[p2] ?? 0);\n p1 --, p2 --;\n }\n const len = res.length\n let need_shift = false\n for (let i = len - 1; i >= 0; i--) {\n if (res[i] >= 10) {\n if (i === 0) {\n need_shift = true\n } else {\n res[i - 1] = res[i - 1] + 1;\n }\n res[i] = res[i] % 10\n }\n }\n if (need_shift) res.unshift(1)\n return res;\n};\n```\n\n尝试了几个不同的方法。。。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078802551","body":"模拟题意AC,但感觉第二遍 for 循环没必要循环整个 indexes 数组,indexes 数组是天然有序的,应该可以用双指针优化\n\n```js\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const indexes = []\n for(let i = 0; i < s.length; i++) {\n if (s[i] === c) indexes.push(i);\n }\n const res = [];\n for(let i = 0; i < s.length; i++) {\n let min = Infinity\n for(let j = 0; j < indexes.length; j++) {\n min = Math.min(min, Math.abs(i - indexes[j]));\n }\n res.push(min)\n }\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082104676","body":"思路一直接模拟题意,increment 操作循环遍历一遍让元素自增:\n\n```js\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.stack = []\n this.size = 0\n this.maxSize = maxSize\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.size === this.maxSize) return;\n this.stack.push(x);\n this.size ++\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.size === 0) return -1\n const res = this.stack.pop();\n this.size --\n return res;\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n for(let i = 0; i < this.size;i ++) {\n if (i < k) {\n this.stack[i] += val;\n }\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n---\n\n\n思路二使用一个 hashmap 维护自增量,只有在 pop 操作的时候才去运算:\n\n```js\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.stack = []\n this.size = 0\n this.maxSize = maxSize\n this.map = {}\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.size === this.maxSize) return;\n this.stack.push(x);\n this.size ++\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.size === 0) return -1\n const inc = this.map[this.size - 1] || 0;\n const res = this.stack.pop();\n // update inc\n if (inc) {\n this.map[this.size - 1] = 0;\n this.map[this.size - 2] = this.map[this.size - 2] ? this.map[this.size - 2] + inc : inc;\n }\n this.size --\n\n return res + inc;\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n const key = Math.min(k - 1, this.size - 1);\n this.map[key] = this.map[key] ? this.map[key] + val : val;\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n🥲 结果跑出来只打败了 18% 的人,应该是题目给的数据量量太小了 <= 1000,操作 hashmap 的 cost 超过了循环 stack 的时间,不如方法一暴力循环。。。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089570929","body":"用栈秒了\n\n```js\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let i = 0;\n while(i < s.length) {\n const char = s[i];\n if (char !== ']') {\n stack.push(char)\n i ++\n } else {\n let repeatStr = ''\n while(stack[stack.length - 1] !== '[') {\n const new_char = stack.pop();\n repeatStr = new_char + repeatStr;\n }\n // pop '['\n stack.pop()\n // get number \n let repeat_times = ''\n while(/[0-9]/.test(stack[stack.length - 1])) {\n repeat_times = stack.pop() + repeat_times\n }\n repeat_times = Number(repeat_times)\n stack.push(repeatStr.repeat(repeat_times));\n i ++\n }\n }\n let res = ''\n while(stack.length) {\n res = stack.pop() + res;\n }\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091373955","body":"思路:用两个栈模拟操作,在 peek 的时候出第二个栈的顶部即可\n\n\n```js\nvar MyQueue = function() {\n this.a = [];\n this.b = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.a.push(x);\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n this.peek();\n return this.b.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if (this.b.length) {\n return this.b[this.b.length - 1]\n } else {\n while(this.a.length) {\n this.b.push(this.a.pop())\n }\n return this.peek()\n }\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return !this.a.length && !this.b.length\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094511265","body":"用了一个简单的前缀和 AC 了,时间复杂度也是 NlogN\n\n```js\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const sorted_arr = [...arr].sort((a, b) => a - b);\n let count_a = count_b = res = 0;\n\n for(let i = 0; i < arr.length;i ++) {\n count_a += sorted_arr[i];\n count_b += arr[i];\n\n if (count_a === count_b) res ++ \n }\n\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3096927980","body":"```js\nvar rotateRight = function(head, k) {\n if (!head || !head.next || k === 0) return head;\n\n // Count the length of the list\n let length = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n length++;\n }\n\n // Normalize k\n k %= length;\n if (k === 0) return head;\n\n // Find the new tail: (length - k - 1)th node\n let newTail = head;\n for (let i = 0; i < length - k - 1; i++) {\n newTail = newTail.next;\n }\n\n // Rotate\n let newHead = newTail.next;\n newTail.next = null;\n tail.next = head;\n\n return newHead;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100186608","body":"考察交换链表节点的基本操作,需要注意的是“什么时候使用 dummy 节点”的技巧。我的理解是在需要涉及到头节点操作的时候,就创建 dummy 节点。比如这一题 - 交换头两个节点的时候就会涉及到头节点的变更。\n\n\n```js\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n const dummy = new ListNode(null, head);\n let p = dummy;\n while(p.next && p.next.next) {\n const p1 = p.next, p2 = p.next.next;\n p.next = p2;\n p1.next = p2.next;\n p2.next = p1;\n p = p1\n }\n return dummy.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3108866758","body":"Same solution with Problem108. But this problem is giving List instead plain array. So will need to use the trick of two pointers to get the mid node of a Single List.\n\n```js\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if (!head) return null\n return helper(head, null)\n\n function helper(head, tail) {\n if (head === tail) return null;\n let fast = head;\n let slow = head;\n while(fast !== tail && fast.next !== tail) {\n fast = fast.next.next;\n slow = slow.next;\n }\n const root = new TreeNode(slow.val);\n root.left = helper(head, slow);\n root.right = helper(slow.next, tail);\n return root\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111667789","body":"A small trick here is `pa !== pb` and `return pa`. For negative scenarios, if given Lists were not intersected, then one of the Lists must be pointing to `null`, and then returning `null` is expected answer. \n\n```js\nvar getIntersectionNode = function(headA, headB) {\n let pa = headA, pb = headB;\n while(pa !== pb) {\n pa = pa ? pa.next : headB;\n pb = pb ? pb.next : headA;\n }\n return pa\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3115364562","body":"Find the intersection node first, and move the slow pointer to the head, and slowly move both of the pointers till they meet each other(can be proved)\n\n```js\nvar detectCycle = function(head) {\n if (!head) return head;\n let fast = head, slow = head;\n // step1: find the intersection node\n while(fast && fast.next) {\n fast = fast.next.next;\n slow = slow.next;\n // step2: find the entry of the cycle\n if (fast === slow) {\n slow = head;\n while(fast !== slow) {\n fast = fast.next\n slow = slow.next\n }\n return slow;\n }\n }\n return null;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3120830111","body":"In JS, we need to build a double linked list data structure by our own. The rest of the logic is quite straight forward - which use hashmap to save key-node, and use linked list to store access frequency. \n\n```js\nclass DoubleLinkedListNode {\n constructor(key, value) {\n this.key = key;\n this.value = value;\n this.prev = null;\n this.next = null;\n }\n}\n\nclass LRUCache {\n constructor(capacity) {\n this.capacity = capacity;\n this.usedSpace = 0;\n\n this.hashmap = {};\n this.dummyHead = new DoubleLinkedListNode(null, null);\n this.dummyTail = new DoubleLinkedListNode(null, null);\n this.dummyHead.next = this.dummyTail;\n this.dummyTail.prev = this.dummyHead;\n }\n\n _isFull() {\n return this.usedSpace === this.capacity;\n }\n _addToHead(node) {\n const currentHead = this.dummyHead.next;\n\n node.next = currentHead;\n node.prev = this.dummyHead;\n currentHead.prev = node;\n this.dummyHead.next = node;\n\n return node;\n }\n _removeNode(node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n node.next = null\n node.prev = null\n return node\n }\n\n get(key) {\n if (this.hashmap[key] !== undefined) {\n const node = this.hashmap[key];\n this._addToHead(this._removeNode(node));\n return node.value\n } else {\n return -1\n }\n }\n put(key, value) {\n if (this.hashmap[key] !== undefined) {\n const node = this.hashmap[key];\n node.value = value;\n this._addToHead(this._removeNode(node))\n } else {\n if (this._isFull()) {\n const nodeNeedToEvict = this.dummyTail.prev;\n delete this.hashmap[nodeNeedToEvict.key];\n this._removeNode(nodeNeedToEvict);\n this.usedSpace --\n }\n const node = new DoubleLinkedListNode(key, value);\n this.hashmap[key] = node;\n this._addToHead(node);\n this.usedSpace ++\n }\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123671763","body":"Easy\n\n```js\nvar maxDepth = function(root) {\n if (!root) return 0\n return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3124879038","body":"DFS\n\n```js\nvar isSameTree = function(p, q) {\n if (!p && !q) return true\n if (!p || !q) return false\n return p.val === q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130312988","body":"DFS will be much simpler. BFS will need to pass a lot of context(params) into helper function which I don't like and not maintainable as well.\n\n\n```js\nvar sumNumbers = function(root) {\n const res = [];\n dfs(root, '')\n return res.reduce((prev, cur) => prev + cur, 0);\n\n\n function dfs(node, str) {\n if (!node.left && !node.right) {\n res.push(+`${str}${node.val}`);\n return;\n }\n if (node.left) dfs(node.left, `${str}${node.val}`);\n if (node.right) dfs(node.right, `${str}${node.val}`);\n } \n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135220392","body":"Using BFS when accessing the first in the queue, that's the leftest node. And because BFS is looping thru by level, so the last time going thru the queue is the most bottom level. \n\n```js\nvar findBottomLeftValue = function(root) {\n const queue = [root];\n let min = null;\n while(queue.length) {\n const size = queue.length;\n for(let i = 0; i < size; i++) {\n const node = queue.shift();\n if (i === 0) min = node.val\n \n\n if (node.left) queue.push(node.left);\n if (node.right) queue.push(node.right);\n }\n }\n return min;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138261960","body":"Can use either `DFS` or `BFS` to solve the problem. DFS is more simple to me: \n\n```js\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n let res = [];\n function dfs(node) {\n if (!node) {\n res.push('null');\n return;\n }\n res.push(String(node.val));\n dfs(node.left)\n dfs(node.right)\n }\n dfs(root);\n console.log(res.join(','))\n return res.join(',')\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n const datas = data.split(',');\n let i = 0;\n return dfs()\n\n function dfs() {\n const char = datas[i];\n if (char === 'null') {\n i ++\n return null\n }\n const node = new TreeNode(+char);\n i ++\n node.left = dfs()\n node.right = dfs()\n return node;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144933267","body":"Use BFS to save the row and column as index, and then sort these indexes. I think the complexity of this problem is how to mange those keys, 2 dimensions keys are quite intricate. \n\nRuntime complexity: O(nlogn), looping over the nodes is O(n), and using `sort` functions are O(nlogn), the bottle neck is sorting functions\nMemory complexity: O(n), use a hashmap to store all nodes\n\n```js\nvar verticalTraversal = function(root) {\n const map = {}\n const queue = [{\n node: root,\n col: 0,\n }];\n let row = 0;;\n while(queue.length) {\n const size = queue.length;\n for(let i = 0; i < size; i++) {\n const cur = queue.shift();\n const node = cur.node;\n if (map[cur.col]?.[row] === undefined) {\n map[cur.col] = {\n ...map[cur.col],\n [row]: [node.val]\n }\n } else {\n map[cur.col][row].push(node.val);\n }\n if (node.left) queue.push({\n node: node.left, \n col: cur.col - 1,\n })\n if (node.right) queue.push({\n node: node.right,\n col: cur.col + 1\n })\n }\n row ++\n }\n const orderByColumn = Object.entries(map).sort(([key1, _], [key2, __]) => Number(key1) - Number(key2));\n const flatternByColumn = orderByColumn.map(i => {\n const column = i[1];\n const arr = [];\n Object.entries(column).sort(([row1], [row2]) => row1 - row2).forEach(([_row, nodes]) => {\n const orderedNodes = nodes.sort((a, b) => a - b);\n arr.push(...orderedNodes)\n })\n return arr\n })\n return flatternByColumn\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146516199","body":"```js\nvar twoSum = function(nums, target) {\n const map = {}\n for(let i = 0; i < nums.length; i ++) {\n const num = nums[i];\n const diff = target - num\n if (map[diff] !== undefined) {\n return [map[diff], i];\n } else {\n map[num] = i;\n }\n }\n return [-1, -1]\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148419003","body":"```js\nvar topKFrequent = function(nums, k) {\n const map = {};\n for(let i = 0; i < nums.length; i++) {\n map[nums[i]] = map[nums[i]] ? map[nums[i]] + 1 : 1;\n }\n const maxCnt = Math.max(...Object.values(map));\n\n const buckets = Array.from({length: maxCnt + 1}, () => []);\n for(let [num, count] of Object.entries(map)) {\n buckets[count].push(num);\n }\n\n const res = [];\n for(let i = maxCnt; i >= 0 && res.length < k; i--) {\n res.push(...buckets[i])\n }\n \n return res.map(i => +i)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149124973","body":"Using brute force at the beginning, and didn't think of can use map to reduce runtime: \n\n```js\nvar numberOfBoomerangs = function(points) {\n let res = 0;\n let map = {}\n for(let [x1, y1] of points) {\n map = {}\n for(let [x2, y2] of points) {\n const distance = (x1 - x2) ** 2 + (y1 - y2) ** 2;\n const count = map[distance] ?? 0;\n res += count * 2;\n map[distance] = count + 1 \n }\n }\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3155367267","body":"Two pointers classic problem (sliding window): \n\n```js\nvar lengthOfLongestSubstring = function(s) {\n let left = 0, right = 0, res = 0\n const window = {};\n while(right < s.length) {\n const right_char = s[right ++];\n window[right_char] = window[right_char] ? window[right_char] + 1 : 1;\n while (window[right_char] > 1) {\n let remove_char = s[left ++];\n window[remove_char] --;\n }\n res = Math.max(right - left, res);\n }\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160227870","body":"so hard: \n\n\n```js\nvar findSubstring = function(s, words) {\n\n const wordLen = words[0].length;\n const numWords = words.length;\n const totalLen = wordLen * numWords;\n const n = s.length;\n const res = [];\n\n if (n < totalLen) return [];\n\n const wordCount = new Map();\n for (let word of words) {\n wordCount.set(word, (wordCount.get(word) || 0) + 1);\n }\n\n // we loop over wordLen offsets\n for (let offset = 0; offset < wordLen; offset++) {\n let left = offset, count = 0;\n const seen = new Map();\n\n for (let right = offset; right + wordLen <= n; right += wordLen) {\n const word = s.slice(right, right + wordLen);\n\n if (wordCount.has(word)) {\n seen.set(word, (seen.get(word) || 0) + 1);\n count++;\n\n // we shrink window if word is overused\n while (seen.get(word) > wordCount.get(word)) {\n const leftWord = s.slice(left, left + wordLen);\n seen.set(leftWord, seen.get(leftWord) - 1);\n left += wordLen;\n count--;\n }\n\n // Valid window\n if (count === numWords) {\n res.push(left);\n const firstWord = s.slice(left, left + wordLen);\n seen.set(firstWord, seen.get(firstWord) - 1);\n left += wordLen;\n count--;\n }\n } else {\n seen.clear();\n count = 0;\n left = right + wordLen;\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3164450266","body":"```js\nvar minSubarray = function(nums, p) {\n let totalSum = nums.reduce((a, b) => a + b, 0);\n\n // Find the remainder when total sum is divided by p\n let rem = totalSum % p;\n if (rem === 0) return 0; // If the remainder is 0, no subarray needs to be removed\n\n let prefixMod = new Map();\n prefixMod.set(0, -1); // Initialize to handle full prefix\n let prefixSum = 0;\n let minLength = nums.length;\n\n for (let i = 0; i < nums.length; i++) {\n prefixSum += nums[i];\n let currentMod = prefixSum % p;\n let targetMod = (currentMod - rem + p) % p;\n\n if (prefixMod.has(targetMod)) {\n minLength = Math.min(minLength, i - prefixMod.get(targetMod));\n }\n\n prefixMod.set(currentMod, i);\n }\n\n return minLength === nums.length ? -1 : minLength;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168150001","body":"```js\nvar middleNode = function(head) {\n if (!head || !head.next) return head;\n let fast = head, slow = head;\n while(fast && fast.next) {\n fast = fast.next.next;\n slow = slow.next\n } \n return slow;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170748221","body":"```js\nvar removeDuplicates = function(nums) {\n let fast = 0, slow = 0;\n while(fast < nums.length) {\n if (nums[slow] !== nums[fast]) {\n nums[++slow] = nums[fast];\n }\n fast ++\n }\n return slow + 1\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172646559","body":"Binary Search\n\n```js\nvar searchInsert = function(nums, target) {\n let left = 0, right = nums.length;\n while(left < right) {\n const mid = left + Math.floor((right - left) / 2);\n if (nums[mid] >= target) {\n right = mid\n } else {\n left = mid + 1\n }\n }\n return left;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173319860","body":" Too long to put down DeQueue implementation in JS. Don't think this will be asked in an interview: \n\n```js\nvar maxSlidingWindow = function (nums, k) {\n const res = [];\n const dequeue = new Dequeue([]);\n // 前 k - 1 个数入队\n for (let i = 0; i < k - 1; i++) {\n dequeue.push(nums[i]);\n }\n\n // 滑动窗口\n for (let i = k - 1; i < nums.length; i++) {\n dequeue.push(nums[i]);\n res.push(dequeue.max());\n dequeue.shift(nums[i - k + 1]);\n }\n return res;\n};\n\nclass Dequeue {\n constructor(nums) {\n this.list = nums;\n }\n\n push(val) {\n const nums = this.list;\n // 保证数据从队头到队尾递减\n while (nums[nums.length - 1] < val) {\n nums.pop();\n }\n nums.push(val);\n }\n\n // 队头出队\n shift(val) {\n let nums = this.list;\n if (nums[0] === val) {\n // 这里的js实现shift()理论上复杂度应该是O(k), 就不去真实实现一个O(1)出队的队列了,意思到位即可\n nums.shift();\n }\n }\n\n max() {\n return this.list[0];\n }\n}\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3179501468","body":"```js\nvar findJudge = function (n, trust) {\n const count = new Array(n + 1).fill(0);\n for (const edge of trust) {\n const x = edge[0];\n const y = edge[1];\n count[y]++;\n count[x]--;\n }\n for (let i = 1; i <= n; ++i) {\n if (count[i] === n - 1) {\n return i;\n }\n }\n return -1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3184086046","body":"```js\nvar possibleBipartition = function(N, dislikes) {\n const graph = [...Array(N+1)].map(() => []);\n const visited = Array(N+1).fill(false);\n const color = Array(N+1).fill(0);\n\n for(let [u, v] of dislikes) {\n graph[u].push(v);\n graph[v].push(u);\n }\n\n for(let i = 1; i <= N; i++) {\n if(!colorNodes(i)) return false;\n }\n return true;\n\n function colorNodes(node) {\n if(visited[node]) return true;\n const currColor = new Set([1, 2]);\n\n\t\t// remove colors used by neighbors\n for(let child of graph[node]) {\n if(color[child] === 1) currColor.delete(1);\n if(color[child] === 2) currColor.delete(2);\n }\n\n\t\t// no color is available return false\n if(currColor.size === 0) return false;\n\t\t\n\t\t// assign the smallest available color\n color[node] = Math.min(...currColor);\n visited[node] = true; \n\n for(let child of graph[node]) {\n if(!colorNodes(child)) return false; \n }\n return true;\n }\n};\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"stonehl":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073791924","body":"C++代码:\n`class Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n vector res;\n int n = num.size();\n for (int i=n-1; i>=0; --i) {\n int sum = num[i] + k % 10;\n k /= 10;\n if (sum >= 10) {\n k++;\n sum -= 10;\n }\n res.push_back(sum);\n }\n for (; k > 0; k /= 10) {\n res.push_back(k % 10);\n }\n reverse(res.begin(), res.end());\n return res;\n }\n};`","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097159903","body":"### 思路:\n1. 异常情况判断;\n2. 统计链表长度, 同时将链表的收尾相连;\n3. 将k对链表长度取余,余数为0表示刚好旋转了链表长度的整数倍,链表节点位置不变;\n4. 新的链表头节点是原链表中第 n - k 个节点。\n### C++代码\n```\nclass Solution {\npublic:\n ListNode* rotateRight(ListNode* head, int k) {\n if (head == nullptr || head->next == nullptr || k == 0)\n return head;\n int count = 1; // 用来统计链表长度\n ListNode* tmp = head;\n while (tmp->next != nullptr) {\n count++;\n tmp = tmp->next; // 滑动到链表尾部\n }\n k %= count;\n //如果刚好是链表长度的倍数,则不进行旋转\n if (k == 0)\n return head;\n tmp->next = head;\n // \n for (int i=0; i < count - k; i++) {\n tmp = tmp->next;\n }\n ListNode* newHead = tmp->next;\n tmp->next = nullptr;\n return newHead;\n }\n};\n```\n### 时间复杂度\nO(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103550594","body":"### 思路:\n使用递归的方法解题\n1. 找递归终止条件,当链表为空或链表只有一个元素时,没法交换,终止递归,返回当前节点;\n2. 每一次递归需要返回的值是交换后的子链表的头节点;\n\n### 代码:\n```\nclass Solution {\npublic:\n ListNode* swapPairs(ListNode* head) {\n if (head == nullptr || head->next == nullptr) {\n return head;\n }\n ListNode* next = head->next;\n head->next = swapPairs(next->next);\n next->next = head;\n return next;\n }\n};\n\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127754666","body":"### 思路:\n使用深度优先搜索的方法,\n1. 先找返回条件, 如果两个节点都为空,则返回true;\n2. 如果两个节点都不为空,并且这两个节点的值相等则分别递归判断这两个节点的左子树和右子树的值是否相等,如果相等,则返回true, 否则返回false。\n\n### 代码:\n```\nclass Solution {\npublic:\n bool isSameTree(TreeNode* p, TreeNode* q) {\n if(p==nullptr && q==nullptr) {\n return true;\n }\n if (p && q && (p->val == q->val)) {\n return isSameTree(p->right, q->right) && isSameTree(p->left, q->left);\n }\n return false;\n\n }\n};\n```\n### 复杂度分析:\n时间复杂度O(N),N为两棵树节点的最小值","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3151160755","body":"### 思路:\n将每个距离的出现次数记录在哈希表中,然后遍历哈希表,计算并累加回旋镖的个数。\n\n### 代码:\n```\nclass Solution {\npublic:\n int numberOfBoomerangs(vector>& points) {\n int n = points.size();\n int res = 0;\n if (n < 3)\n return res;\n\n int ans = 0;\n for (auto &p : points) {\n unordered_map cnt;\n for (auto &q : points) {\n int dis = (p[0] - q[0]) * (p[0] - q[0]) + (p[1] - q[1]) * (p[1] - q[1]);\n ++cnt[dis];\n }\n for (auto &[_, m] : cnt) {\n ans += m * (m - 1);\n }\n }\n return ans;\n\n }\n};\n```\n时间复杂度:O(n2)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3174960911","body":"### 思路:\n使用双端队列来维护滑动窗口内的最大值\n### 代码:\n```\nclass Solution {\npublic:\n vector maxSlidingWindow(vector& nums, int k) {\n deque q;\n int n = nums.size();\n vector res;\n for(int i = 0; i < n; i++) {\n if(q.size() && i - q.front() >= k)\n q.pop_front();\n while(q.size() && nums[q.back()] <= nums[i]) q.pop_back();\n q.push_back(i);\n if(i >= k - 1) {\n res.push_back(nums[q.front()]);\n }\n }\n return res;\n }\n};\n```\n### 复杂度:\n时间复杂度:O(n)","onTime":true},null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3201130868","body":"### 思路:\n基数排序\n### 代码:\n```\nclass Solution {\npublic:\n vector sortArray(vector& nums) {\n const int NUM = 50000;\n int arr[NUM*10+10];\n bzero(arr,sizeof(arr));\n for(int&num:nums){\n num+=NUM;\n arr[num]+=1;\n }\n int cur = 0;\n for(int i = 0;i<(NUM*10+10);++i){\n int tmp = arr[i];\n while(tmp--){\n nums[cur++] = i-NUM;\n }\n }\n return nums;\n }\n};\n```\n### 时间复杂度: O(N)","onTime":true},null,null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3234026083","body":"### 思路:\n1. 先统计t中每个字符出现的次数;\n2. 初始化左右指针,以及记录答案的变量;\n3. 右指针移动,更新计数。如果当前字符是t中的字符(即计数大于0),则减小cntT;\n4. 当cntT为0时,说明当前窗口包含了t的所有字符,然后尝试移动左指针缩小窗口;\n5. 在缩小窗口时,如果移除了t中的字符,则增加cntT,并更新答案;\n6. 最后根据是否找到答案返回相应的子串。\n### 代码:\n```\nclass Solution {\npublic:\n string minWindow(string s, string t) {\n vector cnt(128, 0);\n for (char c : t) {\n cnt[c]++;\n }\n \n int l = 0, r = 0, ansL = 0, ansR = 0, ans = INT_MAX, cntT = t.length();\n \n while (r < s.length()) {\n if (cnt[s[r]]-- > 0) {\n cntT--;\n }\n r++;\n \n while (cntT == 0) {\n if (r - l < ans) {\n ans = r - l;\n ansL = l;\n ansR = r;\n }\n if (cnt[s[l]]++ == 0) {\n cntT++;\n }\n l++;\n }\n }\n \n return ans == INT_MAX ? \"\" : s.substr(ansL, ansR - ansL);\n }\n};\n```\n### 时间复杂度:O(n)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245701951","body":"### 思路:\n1. 初始化标记数组 visited,避免重复访问;\n2. 遍历每个格子,使用DFS搜索整个岛屿。\n\n### 代码:\n```\nclass Solution {\nprivate:\n int count;\n int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向\n void dfs(vector>& grid, vector>& visited, int x, int y) {\n for (int i = 0; i < 4; i++) {\n int nextx = x + dir[i][0];\n int nexty = y + dir[i][1];\n if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过\n if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的\n\n visited[nextx][nexty] = true;\n count++;\n dfs(grid, visited, nextx, nexty);\n }\n }\n }\n\npublic:\n int maxAreaOfIsland(vector>& grid) {\n int n = grid.size(), m = grid[0].size();\n vector> visited = vector>(n, vector(m, false));\n\n int result = 0;\n for (int i = 0; i < n; i++) {\n for (int j = 0; j < m; j++) {\n if (!visited[i][j] && grid[i][j] == 1) {\n count = 1;\n visited[i][j] = true;\n dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true\n result = max(result, count);\n }\n }\n }\n return result;\n }\n};\n```\n### 时间复杂度: O(MN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249613575","body":"### 思路:\n使用多源广度优先搜索,先找到所有陆地放入队列,然后从陆地开始向外搜索,最后被触及的海洋就是离所有陆地最远的海洋。\n### 代码:\n```\nclass Solution {\npublic:\n int maxDistance(vector>& grid) {\n int n = grid.size();\n vector> directions = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};\n queue> q;\n \n for (int i = 0; i < n; i++) {\n for (int j = 0; j < n; j++) {\n if (grid[i][j] == 1) {\n q.push({i, j});\n }\n }\n }\n \n // 如果全是海洋或者全是陆地\n if (q.empty() || q.size() == n * n) return -1;\n \n int distance = -1;\n \n // 2. 多源 BFS\n while (!q.empty()) {\n int size = q.size();\n distance++;\n \n for (int s = 0; s < size; s++) {\n auto [x, y] = q.front();\n q.pop();\n \n for (auto [dx, dy] : directions) {\n int nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] == 0) {\n grid[nx][ny] = 1; // 标记为已访问(变为陆地)\n q.push({nx, ny});\n }\n }\n }\n }\n \n return distance;\n }\n};\n```\n### 时间复杂度: O(N²)","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3271218211","body":"### 代码:\n```\nclass Solution {\npublic:\n int longestCommonSubsequence(string text1, string text2) {\n int m = text2.length();\n vector f(m + 1);\n for (char x : text1) {\n for (int j = 0, pre = 0; j < m; j++) {\n int tmp = f[j + 1];\n f[j + 1] = x == text2[j] ? pre + 1 : max(f[j + 1], f[j]);\n pre = tmp;\n }\n }\n return f[m];\n }\n};\n```\n### 时间复杂度:O(nm)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289595360","body":"\n### 代码:\n```\nclass Solution {\npublic:\n int findTargetSumWays(vector& nums, int target) {\n int s = reduce(nums.begin(), nums.end()) - abs(target);\n if (s < 0 || s % 2) {\n return 0;\n }\n\n int m = s / 2; // 背包容量\n int n = nums.size();\n vector memo(n, vector(m + 1, -1)); // -1 表示没有计算过\n\n // lambda 递归函数\n auto dfs = [&](this auto&& dfs, int i, int c) -> int {\n if (i < 0) {\n return c == 0;\n }\n int& res = memo[i][c]; // 注意这里是引用\n if (res != -1) { // 之前计算过\n return res;\n }\n if (c < nums[i]) {\n return res = dfs(i - 1, c); // 只能不选\n }\n return res = dfs(i - 1, c) + dfs(i - 1, c - nums[i]); // 不选 + 选\n };\n\n return dfs(n - 1, m);\n }\n};\n```\n时间复杂度:O(nm)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316013499","body":"### 代码:\n```\nclass Solution {\npublic:\n ListNode* mergeKLists(vector& lists) {\n auto cmp = [](const ListNode* a, const ListNode* b) {\n return a->val > b->val; // 最小堆\n };\n priority_queue, decltype(cmp)> pq;\n for (auto head : lists) {\n if (head) {\n pq.push(head); // 把所有非空链表的头节点入堆\n }\n }\n\n ListNode dummy{}; // 哨兵节点,作为合并后链表头节点的前一个节点\n auto cur = &dummy;\n while (!pq.empty()) { // 循环直到堆为空\n auto node = pq.top(); // 剩余节点中的最小节点\n pq.pop();\n if (node->next) { // 下一个节点不为空\n pq.push(node->next); // 下一个节点有可能是最小节点,入堆\n }\n cur->next = node; // 把 node 添加到新链表的末尾\n cur = cur->next; // 准备合并下一个节点\n }\n return dummy.next; // 哨兵节点的下一个节点就是新链表的头节点\n }\n};\n```\n### 时间复杂度:\nO(Llogm),其中 m 为 lists 的长度,L 为所有链表的长度之和。","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuyuanzhang118":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074090351","body":"## 算法思路分析\n\n这是一个将数组形式的整数与普通整数相加的算法,采用了模拟手工加法的思路:\n\n### 核心思路\n1. **从右到左逐位相加**:模拟手工加法,从最低位开始处理\n2. **处理进位**:当两位数字相加结果 ≥ 10 时,产生进位\n3. **处理不同长度**:通过 `num[len-1] || 0` 处理数组已遍历完的情况\n4. **逆序构建结果**:由于是从低位到高位计算,最后需要反转数组\n\n```JavaScript\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(num, k) {\n let res = []\n let len = num.length\n let carry = 0\n while(len > 0 || k > 0) {\n let a = num[len - 1] || 0\n let b = k % 10\n let sum = a + b + carry\n res.push(sum % 10)\n carry = sum >= 10 ? 1 : 0\n len--\n k = Math.floor(k / 10)\n }\n if (carry) {\n res.push(1)\n }\n return res.reverse()\n};\n```\n\n### 时间复杂度\n**O(max(N, log K))**\n- N 是数组 `num` 的长度\n- log K 是整数 k 的位数\n- 循环次数取决于较长的那个数\n\n### 空间复杂度\n**O(max(N, log K))**\n- 结果数组 `res` 的长度最多为 max(N, log K) + 1\n- 其他变量占用常数空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3079209775","body":"## 算法思路分析\n核心思想:双向遍历\n\n这个算法使用了一种巧妙的双向遍历方法来解决问题:\n\n1. 第一次遍历(从左到右) :\n \n - 记录每个位置到其左边最近字符c的距离\n - 使用变量 prev 记录上一个字符c的位置\n - 对于每个位置i,距离为 i - prev\n2. 第二次遍历(从右到左) :\n \n - 计算每个位置到其右边最近字符c的距离\n - 与第一次遍历的结果取最小值,得到最终答案\n - 对于每个位置i,距离为 prev - i\n\n## 代码\n```Javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const n = s.length;\n const answer = new Array(n).fill(Infinity);\n \n // 第一次遍历:从左到右,记录每个位置到左边最近字符c的距离\n let prev = -Infinity;\n for (let i = 0; i < n; i++) {\n if (s[i] === c) {\n prev = i;\n }\n answer[i] = i - prev;\n }\n \n // 第二次遍历:从右到左,更新每个位置到右边最近字符c的距离\n prev = Infinity;\n for (let i = n - 1; i >= 0; i--) {\n if (s[i] === c) {\n prev = i;\n }\n answer[i] = Math.min(answer[i], prev - i);\n }\n \n return answer;\n};\n```\n\n## 复杂度分析\n\n时间复杂度:O(n)\n- 需要遍历字符串两次,每次遍历都是O(n)\n- 总时间复杂度为O(n) + O(n) = O(n)\n- 这是最优的时间复杂度,因为至少需要访问每个字符一次\n\n空间复杂度:O(n)\n- 需要创建一个长度为n的结果数组 answer\n- 除了结果数组外,只使用了常数个额外变量( prev , i , n )\n- 如果不计算返回值所需的空间,额外空间复杂度为O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084609047","body":"### 算法设计思路\n\n**核心数据结构:**\n- 使用数组 `stack` 作为底层存储结构\n- 使用 `maxSize` 记录栈的最大容量\n- 数组索引 0 为栈底,数组末尾为栈顶\n\n### 代码\n\n```JavaScript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.maxSize = maxSize;\n this.stack = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.stack.length < this.maxSize) {\n this.stack.push(x);\n }\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.stack.length === 0) {\n return -1;\n }\n return this.stack.pop();\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n // 对栈底的k个元素进行增量操作\n // 如果栈中元素总数小于k,则对所有元素进行增量操作\n const elementsToIncrement = Math.min(k, this.stack.length);\n for (let i = 0; i < elementsToIncrement; i++) {\n this.stack[i] += val;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n### 时间复杂度分析\n\n| 方法 | 时间复杂度 | 分析 |\n|------|------------|------|\n| **构造函数** | O(1) | 仅初始化两个变量 |\n| **push(x)** | O(1) | 数组末尾添加元素,均摊时间复杂度为 O(1) |\n| **pop()** | O(1) | 数组末尾删除元素 |\n| **increment(k, val)** | O(min(k, n)) | 需要遍历栈底的 k 个元素,n 为当前栈大小 |\n\n### 空间复杂度分析\n\n| 方面 | 空间复杂度 | 分析 |\n|------|------------|------|\n| **整体空间** | O(maxSize) | 最坏情况下数组存储 maxSize 个元素 |\n| **辅助空间** | O(1) | 除了存储栈元素外,只使用常数额外空间 |\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3092430277","body":"### 算法思路分析\n\n**核心思想:使用栈处理嵌套结构**\n\n这是一个典型的括号匹配问题,需要处理嵌套的编码结构。算法的关键在于:\n1. **识别模式** - `k[encoded_string]` 表示重复 k 次\n2. **处理嵌套** - 可能存在多层嵌套,如 `3[a2[c]]`\n3. **状态管理** - 需要记录当前的数字、字符串和历史状态\n\n**算法步骤:**\n1. 遍历字符串的每个字符\n2. 遇到数字:累积构建重复次数(支持多位数)\n3. 遇到 `[`:将当前状态(字符串和数字)压入栈,重置当前状态\n4. 遇到 `]`:从栈中弹出之前的状态,重复当前字符串并拼接\n5. 遇到字母:直接添加到当前字符串\n\n### 代码实现\n\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let currentNum = 0;\n let currentStr = '';\n \n for (let i = 0; i < s.length; i++) {\n const char = s[i];\n \n if (char >= '0' && char <= '9') {\n // 构建数字(可能是多位数)\n currentNum = currentNum * 10 + parseInt(char);\n } else if (char === '[') {\n // 遇到左括号,将当前状态入栈\n stack.push([currentStr, currentNum]);\n currentStr = '';\n currentNum = 0;\n } else if (char === ']') {\n // 遇到右括号,出栈并重复字符串\n const [prevStr, num] = stack.pop();\n currentStr = prevStr + currentStr.repeat(num);\n } else {\n // 普通字符,直接添加到当前字符串\n currentStr += char;\n }\n }\n \n return currentStr;\n};\n```\n\n### 复杂度分析\n\n**时间复杂度:O(n + m)**\n- n:输入字符串长度\n- m:输出字符串长度\n- 每个字符最多被处理一次\n- 字符串重复操作的总时间与最终输出长度成正比\n\n**空间复杂度:O(n + m)**\n- **栈空间**:O(d) - d 为最大嵌套深度,最坏情况 O(n)\n- **字符串存储**:O(m) - 存储中间结果和最终结果\n- **总空间**:O(n + m)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092434643","body":"## 核心算法思路\n\n使用两个栈实现队列:\n- `inStack`: 用于接收新元素的输入\n- `outStack`: 用于输出元素\n\n当需要 pop 或 peek 时,如果 outStack 为空,就将 inStack 中的所有元素转移到 outStack 中,这样就实现了先入先出的特性。\n\n## 代码实现\n\n```javascript\n\nvar MyQueue = function() {\n this.inStack = []; // 用于输入的栈\n this.outStack = []; // 用于输出的栈\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.inStack.push(x);\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n if (this.outStack.length === 0) {\n // 将inStack中的所有元素转移到outStack\n while (this.inStack.length > 0) {\n this.outStack.push(this.inStack.pop());\n }\n }\n return this.outStack.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if (this.outStack.length === 0) {\n // 将inStack中的所有元素转移到outStack\n while (this.inStack.length > 0) {\n this.outStack.push(this.inStack.pop());\n }\n }\n return this.outStack[this.outStack.length - 1];\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return this.inStack.length === 0 && this.outStack.length === 0;\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```\n\n## 复杂度分析\n\n**时间复杂度**:\n- push: O(1)\n- pop: 均摊 O(1)\n- peek: 均摊 O(1) \n- empty: O(1)\n\n**空间复杂度**: O(n)\n\n**均摊 O(1) 的原理**:虽然单次 pop 或 peek 操作在最坏情况下可能需要 O(n) 时间,但每个元素最多只会被转移一次,所以 n 个操作的总时间复杂度为 O(n),均摊下来每个操作为 O(1)。\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094581867","body":"## 算法思路\n- 关键观察:如果前缀[0...i]的最大值 ≤ 后缀[i+1...n-1]的最小值,则可以在位置i处分块\n- 这保证了前面块的所有元素都不大于后面块的任何元素,分别排序后连接仍然有序\n\n## 代码\n```javascript\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const n = arr.length;\n if (n <= 1) return n;\n \n // 计算前缀最大值数组\n const prefixMax = new Array(n);\n prefixMax[0] = arr[0];\n for (let i = 1; i < n; i++) {\n prefixMax[i] = Math.max(prefixMax[i-1], arr[i]);\n }\n \n // 计算后缀最小值数组\n const suffixMin = new Array(n);\n suffixMin[n-1] = arr[n-1];\n for (let i = n-2; i >= 0; i--) {\n suffixMin[i] = Math.min(suffixMin[i+1], arr[i]);\n }\n \n let chunks = 1; // 至少有一个分块\n \n // 检查每个可能的分块点\n for (let i = 0; i < n-1; i++) {\n // 如果前缀最大值 <= 后缀最小值,可以在i处分块\n if (prefixMax[i] <= suffixMin[i+1]) {\n chunks++;\n }\n }\n \n return chunks;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 需要三次遍历数组\n- 空间复杂度:O(n) - 需要两个额外数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097244383","body":"## 核心思路 :\n- 计算链表长度并找到尾节点\n- 优化k值避免重复旋转\n- 找到新的尾节点(第length-k个节点)\n- 重新连接:断开新尾节点与新头节点,原尾节点连接原头节点\n\n## 代码:\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n // 边界情况处理\n if (!head || !head.next || k === 0) {\n return head;\n }\n \n // 1. 计算链表长度并找到尾节点\n let length = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n length++;\n }\n \n // 2. 优化k值,避免不必要的旋转\n k = k % length;\n if (k === 0) {\n return head;\n }\n \n // 3. 找到新的尾节点(从头开始第length-k个节点)\n let newTail = head;\n for (let i = 0; i < length - k - 1; i++) {\n newTail = newTail.next;\n }\n \n // 4. 新的头节点是新尾节点的下一个节点\n let newHead = newTail.next;\n \n // 5. 断开连接并重新连接\n newTail.next = null; // 断开新尾节点与新头节点的连接\n tail.next = head; // 原尾节点连接到原头节点\n \n return newHead;\n};\n```\n\n## 复杂度分析 :\n- 时间复杂度 :O(n) - 需要遍历链表计算长度和找到切分点\n- 空间复杂度 :O(1) - 只使用常数个额外变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103625610","body":"## 算法思路\n- 虚拟头节点技巧: 简化边界条件处理\n- 三指针法: prev, first, second 精确控制交换过程\n- 原地交换: 只修改指针,不创建新节点\n- 边界处理: 空链表和单节点的特殊情况\n\n## 代码实现\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n // 边界情况:空链表或只有一个节点\n if (!head || !head.next) {\n return head;\n }\n \n // 创建虚拟头节点,简化操作\n let dummy = new ListNode(0);\n dummy.next = head;\n let prev = dummy;\n \n // 当存在至少两个节点时进行交换\n while (prev.next && prev.next.next) {\n // 定义要交换的两个节点\n let first = prev.next;\n let second = prev.next.next;\n \n // 执行交换操作\n // 步骤:prev -> first -> second -> ... \n // 变为:prev -> second -> first -> ...\n prev.next = second;\n first.next = second.next;\n second.next = first;\n \n // 移动prev指针到已交换的第二个节点(现在是first)\n prev = first;\n }\n \n return dummy.next;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) \n- 空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109219828","body":"## 算法思路\n- 算法的核心思想是利用有序链表的特性:\n- 选择中间节点作为根节点,保证树的平衡性\n- 递归地将左半部分构建为左子树,右半部分构建为右子树\n- 最优解使用中序遍历的特性,避免重复遍历链表\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n // 计算链表长度\n function getLength(head) {\n let length = 0;\n while (head) {\n length++;\n head = head.next;\n }\n return length;\n }\n \n const length = getLength(head);\n let current = head;\n \n // 中序遍历构建BST\n function buildBST(start, end) {\n if (start > end) return null;\n \n const mid = Math.floor((start + end) / 2);\n \n // 先构建左子树\n const left = buildBST(start, mid - 1);\n \n // 创建根节点(当前链表节点)\n const root = new TreeNode(current.val);\n current = current.next;\n \n // 再构建右子树\n const right = buildBST(mid + 1, end);\n \n root.left = left;\n root.right = right;\n \n return root;\n }\n \n return buildBST(0, length - 1);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 每个节点只访问一次\n- 空间复杂度:O(log n) - 仅递归栈深度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3117083288","body":"## 算法思路\n双指针法 :让两个指针分别从两个链表头部开始遍历,当指针到达链表末尾时跳转到另一个链表的头部。这样可以消除两个链表的长度差异,如果有交点,两个指针会在交点相遇;如果没有交点,两个指针最终都会变成 null。\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function(headA, headB) {\n // 如果任一链表为空,直接返回null\n if (!headA || !headB) {\n return null;\n }\n \n // 双指针法:让两个指针分别遍历两个链表\n // 当指针到达链表末尾时,跳转到另一个链表的头部\n // 这样可以消除长度差,如果有交点,两指针会在交点相遇\n let pA = headA;\n let pB = headB;\n \n // 当两个指针不相等时继续遍历\n while (pA !== pB) {\n // 如果pA到达末尾,跳转到headB;否则继续下一个节点\n pA = pA === null ? headB : pA.next;\n // 如果pB到达末尾,跳转到headA;否则继续下一个节点\n pB = pB === null ? headA : pB.next;\n }\n \n // 返回交点(如果没有交点,两指针都会变成null)\n return pA;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(m + n),其中 m 和 n 分别是两个链表的长度。每个指针最多遍历两个链表一次。\n- 空间复杂度 :O(1),只使用了两个指针变量,没有使用额外的数据结构。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3117100989","body":"## 算法思路\n- 第一阶段 :使用快慢指针检测是否有环\n- 慢指针每次移动1步,快指针每次移动2步\n- 如果有环,快慢指针必定会相遇\n- 第二阶段 :找到环的起始节点\n- 基于数学原理:从头节点到环入口的距离等于从相遇点到环入口的距离\n- 将一个指针重置到头节点,两指针同速移动直到相遇\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n // 边界情况:空链表或只有一个节点且无环\n if (!head || !head.next) {\n return null;\n }\n \n // 第一阶段:使用快慢指针检测是否有环\n let slow = head;\n let fast = head;\n \n // 快指针每次走两步,慢指针每次走一步\n while (fast && fast.next) {\n slow = slow.next;\n fast = fast.next.next;\n \n // 如果快慢指针相遇,说明存在环\n if (slow === fast) {\n break;\n }\n }\n \n // 如果没有环,返回null\n if (!fast || !fast.next) {\n return null;\n }\n \n // 第二阶段:找到环的起始节点\n // 将一个指针重置到头节点,两个指针同时以相同速度移动\n // 它们相遇的地方就是环的起始节点\n slow = head;\n while (slow !== fast) {\n slow = slow.next;\n fast = fast.next;\n }\n \n return slow; // 返回环的起始节点\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 最多遍历链表两次\n- 空间复杂度 :O(1) - 只使用常数个额外变量,满足进阶要求","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3124469572","body":"## 算法思路\n这个LRU(Least Recently Used)缓存实现采用了 哈希表 + 双向链表 的经典设计模式:\n数据结构组合 :\n - Map :用于O(1)时间复杂度的键值查找\n - 双向链表:用于维护访问顺序,支持O(1)的插入和删除操作\n - 虚拟头尾节点:简化边界条件处理\n\n## 代码\n```javascript\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.cache = new Map(); // 使用Map存储键值对\n this.head = {}; // 虚拟头节点\n this.tail = {}; // 虚拟尾节点\n this.head.next = this.tail;\n this.tail.prev = this.head;\n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n if (!this.cache.has(key)) {\n return -1;\n }\n \n // 存在则将节点移到链表头部(表示最近使用)\n const node = this.cache.get(key);\n this.removeFromList(node);\n this.addToHead(node);\n \n return node.value;\n};\n\n/** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\nLRUCache.prototype.put = function(key, value) {\n // 如果已存在,先删除旧节点\n if (this.cache.has(key)) {\n const oldNode = this.cache.get(key);\n this.removeFromList(oldNode);\n this.cache.delete(key);\n }\n \n // 创建新节点并添加到头部\n const newNode = { key, value, prev: null, next: null };\n this.cache.set(key, newNode);\n this.addToHead(newNode);\n \n // 如果超出容量,删除尾部节点(最久未使用)\n if (this.cache.size > this.capacity) {\n const tailNode = this.tail.prev;\n this.removeFromList(tailNode);\n this.cache.delete(tailNode.key);\n }\n};\n\n// 辅助方法:将节点添加到链表头部\nLRUCache.prototype.addToHead = function(node) {\n node.next = this.head.next;\n node.prev = this.head;\n this.head.next.prev = node;\n this.head.next = node;\n};\n\n// 辅助方法:从链表中删除节点\nLRUCache.prototype.removeFromList = function(node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n};\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```\n\n## 复杂度分析\n- 时间复杂度:O(1)\n- 空间复杂度:O(capacity)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124496973","body":"## 算法思路\n使用广度优先搜索(BFS)的方法来计算二叉树的最大深度:\n- 初始化 :如果根节点为空,直接返回0\n- 队列存储 :使用队列存储节点和对应的深度信息,初始将根节点和深度1入队\n- 层序遍历 :通过队列进行层序遍历,每次取出队首元素\n- 深度更新 :更新最大深度值,并将当前节点的左右子节点(如果存在)连同深度+1一起入队\n- 返回结果 :遍历完成后返回记录的最大深度\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if (!root) return 0;\n let queue = [[root, 1]];\n let maxDepth = 0;\n\n while (queue.length > 0) {\n let [node, depth] = queue.shift();\n if (node) {\n maxDepth = Math.max(maxDepth, depth);\n if (node.left) queue.push([node.left, depth + 1]);\n if (node.right) queue.push([node.right, depth + 1]);\n }\n }\n\n return maxDepth;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 O(n) ,其中n是二叉树中节点的总数\n- 空间复杂度 O(w) ,其中w是二叉树的最大宽度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3126191127","body":"## 算法思路\n使用递归的深度优先搜索(DFS)方法:\n- 基本情况 :如果两个节点都为空,返回 true\n- 边界情况 :如果只有一个节点为空,返回 false\n- 值比较 :如果两个节点的值不相等,返回 false\n- 递归检查 :同时检查左子树和右子树是否相同\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} p\n * @param {TreeNode} q\n * @return {boolean}\n */\nvar isSameTree = function(p, q) {\n if (p === null && q === null) {\n return true;\n }\n if (p === null || q === null || p.val !== q.val) {\n return false;\n }\n return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(min(m, n)),其中 m 和 n 分别是两棵树的节点数。在最坏情况下需要遍历较小树的所有节点。\n- 空间复杂度 :O(min(m, n)),递归调用栈的深度取决于树的高度。在完全平衡的树中为 O(log(min(m, n))),在完全不平衡的树中为 O(min(m, n))。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3133136375","body":"## 算法思路\n这是一个典型的二叉树深度优先搜索(DFS)问题。核心思想是:\n- 从根节点开始,沿着每条路径向下遍历\n- 在遍历过程中,将当前路径形成的数字逐步构建(当前数字 = 之前数字 × 10 + 当前节点值)\n- 当到达叶节点时,将该路径形成的完整数字加入总和\n- 递归处理左右子树,最终返回所有路径数字的总和\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root) {\n // 深度优先搜索函数\n function dfs(node, currentSum) {\n // 如果节点为空,返回0\n if (!node) {\n return 0;\n }\n \n // 计算当前路径的数字:之前的数字*10 + 当前节点值\n currentSum = currentSum * 10 + node.val;\n \n // 如果是叶节点(没有左右子树),返回当前路径形成的数字\n if (!node.left && !node.right) {\n return currentSum;\n }\n \n // 递归计算左右子树的路径数字之和\n return dfs(node.left, currentSum) + dfs(node.right, currentSum);\n }\n \n return dfs(root, 0);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) ,其中 n 是二叉树中节点的数量,需要访问每个节点一次\n- 空间复杂度:O(h) ,其中 h 是二叉树的高度,递归调用栈的深度等于树的高度\n - 最坏情况(完全不平衡的树):O(n)\n - 最好情况(完全平衡的树):O(log n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136794752","body":"## 算法思路\n广度优先搜索(BFS)\n- 使用层序遍历,从右到左遍历每一层\n- 通过队列实现,先添加右子节点再添加左子节点\n- 最后访问到的节点就是最底层最左边的节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n // 使用层序遍历(BFS)从右到左遍历每一层\n // 最后访问到的节点就是最底层最左边的节点\n let queue = [root];\n let result = root.val;\n \n while (queue.length > 0) {\n let levelSize = queue.length;\n \n // 遍历当前层的所有节点\n for (let i = 0; i < levelSize; i++) {\n let node = queue.shift();\n result = node.val; // 更新结果为当前节点值\n \n // 先添加右子节点,再添加左子节点\n // 这样在同一层中,左边的节点会后被访问到\n if (node.right) {\n queue.push(node.right);\n }\n if (node.left) {\n queue.push(node.left);\n }\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),需要遍历所有节点\n- 空间复杂度:O(w),w为树的最大宽度(队列空间)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3140223821","body":"## 算法思路\n序列化过程 :\n- 采用前序遍历(根-左-右)的方式遍历二叉树\n- 空节点用 'null' 字符串表示\n- 所有节点值用逗号连接成字符串\n- 前序遍历的优势是根节点总在最前面,便于重构\n\n反序列化过程 :\n- 将字符串按逗号分割成数组\n- 使用递归按前序遍历顺序重构二叉树\n- 维护索引指针依次处理数组元素\n- 遇到 'null' 返回空节点,否则创建新节点并递归构建左右子树\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n const result = [];\n \n function preorder(node) {\n if (node === null) {\n result.push('null');\n return;\n }\n \n result.push(node.val.toString());\n preorder(node.left);\n preorder(node.right);\n }\n \n preorder(root);\n return result.join(',');\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n if (!data || data === 'null') {\n return null;\n }\n \n const values = data.split(',');\n let index = 0;\n \n function buildTree() {\n if (index >= values.length || values[index] === 'null') {\n index++;\n return null;\n }\n \n const node = new TreeNode(parseInt(values[index]));\n index++;\n \n node.left = buildTree();\n node.right = buildTree();\n \n return node;\n }\n \n return buildTree();\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```\n\n## 复杂度分析\n时间复杂度 :\n- 序列化:O(n) - 需要访问每个节点一次\n- 反序列化:O(n) - 需要处理每个序列化值一次\n\n空间复杂度 :\n- 序列化:O(n) - 递归栈深度最坏情况为O(n),结果数组大小为O(n)\n- 反序列化:O(n) - 递归栈深度最坏情况为O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3148418818","body":"## 算法思路\n- DFS遍历 :使用深度优先搜索遍历二叉树,记录每个节点的坐标(row, col)和值\n- 坐标规则 :根据题目要求,左子节点坐标为(row+1, col-1),右子节点坐标为(row+1, col+1)\n- 分组排序 :将节点按列索引分组,对每列内的节点先按行排序,同行按值排序\n- 结果输出 :按列索引从小到大的顺序返回垂序遍历结果\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n if (!root) return [];\n \n // 存储节点信息:[row, col, val]\n const nodes = [];\n \n // DFS遍历,记录每个节点的坐标和值\n function dfs(node, row, col) {\n if (!node) return;\n \n nodes.push([row, col, node.val]);\n \n // 左子节点:row+1, col-1\n dfs(node.left, row + 1, col - 1);\n // 右子节点:row+1, col+1\n dfs(node.right, row + 1, col + 1);\n }\n \n // 从根节点开始遍历,根节点坐标为(0, 0)\n dfs(root, 0, 0);\n \n // 按列索引分组\n const columnMap = new Map();\n for (const [row, col, val] of nodes) {\n if (!columnMap.has(col)) {\n columnMap.set(col, []);\n }\n columnMap.get(col).push([row, val]);\n }\n \n // 获取所有列索引并排序\n const columns = Array.from(columnMap.keys()).sort((a, b) => a - b);\n \n const result = [];\n for (const col of columns) {\n const columnNodes = columnMap.get(col);\n // 对每列内的节点排序:先按行排序,同行按值排序\n columnNodes.sort((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按行排序\n }\n return a[1] - b[1]; // 同行按值排序\n });\n \n // 提取值\n result.push(columnNodes.map(node => node[1]));\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n log n),其中n是节点数,主要消耗在排序操作\n- 空间复杂度 :O(n),用于存储节点信息和分组数据","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3148426517","body":"## 算法思路\n- 使用哈希表存储已遍历的数值和索引\n- 对每个数值计算其配对数值,在哈希表中O(1)时间查找\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n // 创建哈希表,key为数值,value为索引\n const map = new Map();\n \n for (let i = 0; i < nums.length; i++) {\n // 计算当前数值需要配对的数值\n const complement = target - nums[i];\n \n // 在哈希表中查找配对数值\n if (map.has(complement)) {\n // 找到配对,返回两个索引\n return [map.get(complement), i];\n }\n \n // 将当前数值和索引存入哈希表\n map.set(nums[i], i);\n }\n \n return []; // 题目保证有解,这里不会执行到\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148432520","body":"## 算法思路\n采用桶排序的思想来实现:\n- 频率统计 :使用哈希表统计每个元素的出现频率\n- 桶排序 :创建频率桶,桶的索引表示频率,桶中存储具有该频率的元素\n- 结果收集 :从最高频率的桶开始遍历,收集前k个元素\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function(nums, k) {\n // 步骤1: 统计频率\n const freqMap = new Map();\n for (const num of nums) {\n freqMap.set(num, (freqMap.get(num) || 0) + 1);\n }\n \n // 步骤2: 创建频率桶\n // 桶的索引表示频率,桶中存储具有该频率的元素\n const buckets = new Array(nums.length + 1).fill(null).map(() => []);\n \n for (const [num, freq] of freqMap) {\n buckets[freq].push(num);\n }\n \n // 步骤3: 从高频率到低频率收集前k个元素\n const result = [];\n for (let i = buckets.length - 1; i >= 0 && result.length < k; i--) {\n if (buckets[i].length > 0) {\n result.push(...buckets[i]);\n }\n }\n \n // 返回前k个元素\n return result.slice(0, k);\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 满足题目要求的优于O(n log n)\n- 统计频率:O(n)\n- 创建桶并填充:O(n)\n- 收集结果:O(n)\n\n- 空间复杂度 :O(n)\n- 哈希表:O(n)\n- 桶数组:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3153115326","body":"## 算法思路\n- 核心思想 :枚举每个点作为回旋镖的中心点i\n- 距离计算 :计算中心点到所有其他点的欧式距离(使用距离平方避免开方运算)\n- 哈希统计 :使用Map统计相同距离的点的数量\n- 组合计算 :如果有n个点到中心点距离相同,可形成n×(n-1)个回旋镖\n- 顺序考虑 :回旋镖(i,j,k)和(i,k,j)是不同的,需要考虑j和k的顺序\n\n## 代码\n```javascript\n/**\n * @param {number[][]} points\n * @return {number}\n */\nvar numberOfBoomerangs = function(points) {\n let count = 0;\n \n // 遍历每个点作为回旋镖的中心点i\n for (let i = 0; i < points.length; i++) {\n // 使用Map记录从点i到其他点的距离及对应的点的数量\n const distanceMap = new Map();\n \n // 计算点i到其他所有点的距离\n for (let j = 0; j < points.length; j++) {\n if (i !== j) {\n // 计算欧式距离的平方(避免开方运算,提高效率)\n const distance = getDistanceSquared(points[i], points[j]);\n \n // 记录该距离对应的点的数量\n distanceMap.set(distance, (distanceMap.get(distance) || 0) + 1);\n }\n }\n \n // 对于每个距离,如果有n个点,则可以形成n*(n-1)个回旋镖\n // 因为回旋镖(i,j,k)中j和k的顺序是有意义的\n for (const [distance, pointCount] of distanceMap) {\n if (pointCount >= 2) {\n count += pointCount * (pointCount - 1);\n }\n }\n }\n \n return count;\n};\n\n/**\n * 计算两点间欧式距离的平方\n * @param {number[]} point1 \n * @param {number[]} point2 \n * @return {number}\n */\nfunction getDistanceSquared(point1, point2) {\n const dx = point1[0] - point2[0];\n const dy = point1[1] - point2[1];\n return dx * dx + dy * dy;\n}\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n²) - 外层循环n次,内层循环n-1次\n- 空间复杂度 :O(n) - 最坏情况下Map存储n-1个不同距离","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153126755","body":"## 算法思路\n- 滑动窗口技术 :使用双指针 left 和 right 构成滑动窗口\n- 哈希表优化 :记录每个字符最后出现的位置\n- 动态调整 :遇到重复字符时,将左指针移动到重复字符的下一个位置\n- 实时更新 :持续更新最大长度\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n if (s.length === 0) return 0;\n \n let left = 0; // 滑动窗口左指针\n let maxLength = 0; // 记录最大长度\n let charMap = new Map(); // 哈希表:字符 -> 最后出现的索引\n \n for (let right = 0; right < s.length; right++) {\n const char = s[right];\n \n // 如果字符已存在且在当前窗口内,移动左指针\n if (charMap.has(char) && charMap.get(char) >= left) {\n left = charMap.get(char) + 1;\n }\n \n // 更新字符的最新位置\n charMap.set(char, right);\n \n // 更新最大长度\n maxLength = Math.max(maxLength, right - left + 1);\n }\n \n return maxLength;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 每个字符最多被访问两次\n- 空间复杂度 :O(min(m,n)) - m是字符集大小,n是字符串长度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3158322222","body":"## 算法思路\n- 滑动窗口 + 哈希表 :避免生成所有排列组合,直接在原字符串上滑动匹配\n- 分层遍历 :由于words中所有单词长度相同,按单词长度为步长进行遍历\n- 频次匹配 :使用哈希表记录words中单词频次,滑动窗口中维护当前单词频次\n- 智能重置 :遇到不在words中的单词时,直接重置窗口位置\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n if (!s || !words || words.length === 0) return [];\n \n const wordLen = words[0].length;\n const totalLen = wordLen * words.length;\n const result = [];\n \n // 创建words的频次映射\n const wordCount = new Map();\n for (const word of words) {\n wordCount.set(word, (wordCount.get(word) || 0) + 1);\n }\n \n // 对于每个可能的起始位置(0到wordLen-1),使用滑动窗口\n for (let i = 0; i < wordLen; i++) {\n let left = i;\n let right = i;\n let validWords = 0;\n const windowCount = new Map();\n \n while (right + wordLen <= s.length) {\n // 扩展右边界,添加新单词\n const rightWord = s.substring(right, right + wordLen);\n right += wordLen;\n \n if (wordCount.has(rightWord)) {\n windowCount.set(rightWord, (windowCount.get(rightWord) || 0) + 1);\n if (windowCount.get(rightWord) <= wordCount.get(rightWord)) {\n validWords++;\n }\n \n // 如果窗口大小超过目标长度,收缩左边界\n while (right - left > totalLen) {\n const leftWord = s.substring(left, left + wordLen);\n left += wordLen;\n \n if (wordCount.has(leftWord)) {\n if (windowCount.get(leftWord) <= wordCount.get(leftWord)) {\n validWords--;\n }\n windowCount.set(leftWord, windowCount.get(leftWord) - 1);\n }\n }\n \n // 检查是否找到有效的串联子串\n if (validWords === words.length && right - left === totalLen) {\n result.push(left);\n }\n } else {\n // 遇到不在words中的单词,重置窗口\n windowCount.clear();\n validWords = 0;\n left = right;\n }\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n × m),其中n是字符串s的长度,m是单词长度\n- 外层循环m次(每个可能的起始偏移)\n- 内层每个字符最多被访问2次(加入和移出窗口)\n\n- 空间复杂度 :O(k),其中k是words数组的长度\n- 主要用于存储单词频次的哈希表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162949952","body":"## 算法思路\n- 数学原理 :如果数组总和 sum % p = remainder ,需要找到一个子数组,其和也等于 remainder ,移除后剩余部分就能被p整除\n- 技术方案 :使用前缀和 + 哈希表来高效查找目标子数组\n- 关键公式 : prefixSum[i] % p = (prefixSum[j] % p - remainder + p) % p\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar minSubarray = function(nums, p) {\n // 计算数组总和\n const totalSum = nums.reduce((sum, num) => sum + num, 0);\n \n // 如果总和已经能被p整除,不需要移除任何元素\n const remainder = totalSum % p;\n if (remainder === 0) {\n return 0;\n }\n \n // 使用哈希表记录前缀和的余数及其对应的索引\n const prefixMap = new Map();\n prefixMap.set(0, -1); // 初始化,前缀和为0时索引为-1\n \n let prefixSum = 0;\n let minLength = nums.length; // 初始化为数组长度(最坏情况)\n \n for (let i = 0; i < nums.length; i++) {\n prefixSum += nums[i];\n const currentRemainder = prefixSum % p;\n \n // 我们需要找到一个前缀和,使得当前前缀和减去它等于remainder\n // 即:currentRemainder - targetRemainder = remainder (mod p)\n // 所以:targetRemainder = (currentRemainder - remainder + p) % p\n const targetRemainder = (currentRemainder - remainder + p) % p;\n \n if (prefixMap.has(targetRemainder)) {\n const prevIndex = prefixMap.get(targetRemainder);\n const subarrayLength = i - prevIndex;\n minLength = Math.min(minLength, subarrayLength);\n }\n \n // 更新当前前缀和余数的索引\n prefixMap.set(currentRemainder, i);\n }\n \n // 如果最小长度等于数组长度,说明无法找到合适的子数组\n return minLength === nums.length ? -1 : minLength;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 只需要遍历数组一次,哈希表操作为O(1)\n- 空间复杂度 :O(min(n, p)) - 哈希表最多存储min(n, p)个不同的余数","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166733694","body":"## 算法思路\n使用 快慢指针 (Floyd's Tortoise and Hare Algorithm)技术:\n- 设置两个指针:慢指针每次移动一步,快指针每次移动两步\n- 当快指针到达链表末尾时,慢指针恰好位于链表的中间位置\n- 对于偶数长度的链表,返回第二个中间节点\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n // 使用快慢指针法(Floyd's Tortoise and Hare Algorithm)\n // 慢指针每次移动一步,快指针每次移动两步\n // 当快指针到达链表末尾时,慢指针正好在中间位置\n \n let slow = head; // 慢指针\n let fast = head; // 快指针\n \n // 当快指针和快指针的下一个节点都不为空时继续循环\n while (fast !== null && fast.next !== null) {\n slow = slow.next; // 慢指针移动一步\n fast = fast.next.next; // 快指针移动两步\n }\n \n // 当循环结束时,slow指针指向中间节点\n // 如果链表长度为奇数,slow指向唯一的中间节点\n // 如果链表长度为偶数,slow指向第二个中间节点\n return slow;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 需要遍历链表一次,其中n是链表的长度\n- 空间复杂度:O(1) - 只使用了两个额外的指针变量,不随输入规模增长","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3172634872","body":"## 算法思路\n- 双指针技术 :使用 slow 指针指向当前不重复元素的位置, fast 指针遍历数组\n- 原地修改 :当发现不重复元素时,将其复制到 slow+1 位置\n- 利用排序特性 :由于数组已排序,相同元素必然相邻,只需比较相邻元素\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n // 边界情况:空数组或只有一个元素\n if (nums.length <= 1) {\n return nums.length;\n }\n \n // slow指针指向当前不重复元素的位置\n let slow = 0;\n \n // fast指针遍历数组,从第二个元素开始\n for (let fast = 1; fast < nums.length; fast++) {\n // 如果当前元素与前一个不重复元素不同\n if (nums[fast] !== nums[slow]) {\n // 将slow指针向前移动一位\n slow++;\n // 将当前不重复元素复制到slow位置\n nums[slow] = nums[fast];\n }\n // 如果相同,fast继续向前,slow保持不变\n }\n \n // 返回不重复元素的个数(slow指向最后一个不重复元素的索引)\n return slow + 1;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 只需遍历数组一次\n- 空间复杂度 :O(1) - 只使用常数额外空间,符合原地修改要求","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172638327","body":"## 算法思路\n- 二分查找核心思想 :通过比较中间元素与目标值,每次排除一半搜索空间\n- 查找逻辑 :如果找到目标值返回索引,否则返回应插入的位置\n- 关键实现 :循环结束时left指针就是插入位置\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let left = 0;\n let right = nums.length - 1;\n \n // 二分查找\n while (left <= right) {\n // 计算中间位置,避免整数溢出\n let mid = Math.floor(left + (right - left) / 2);\n \n if (nums[mid] === target) {\n // 找到目标值,返回索引\n return mid;\n } else if (nums[mid] < target) {\n // 目标值在右半部分\n left = mid + 1;\n } else {\n // 目标值在左半部分\n right = mid - 1;\n }\n }\n \n // 没找到目标值,left就是应该插入的位置\n return left;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(log n) - 满足题目要求,每次迭代将搜索范围缩小一半\n- 空间复杂度 :O(1) - 只使用常数级别的额外变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3174034461","body":"## 算法思路\n使用双端队列维护一个单调递减的队列,队列中存储数组元素的索引:\n\n- 队首始终是当前窗口的最大值索引\n- 移除超出窗口范围的元素\n- 维护单调性:移除队尾所有小于等于当前元素的索引\n- 当窗口形成时,队首就是最大值\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar maxSlidingWindow = function(nums, k) {\n if (!nums || nums.length === 0 || k <= 0) {\n return [];\n }\n \n const result = [];\n const deque = []; // 存储数组索引的双端队列\n \n for (let i = 0; i < nums.length; i++) {\n // 移除队列中超出窗口范围的元素\n while (deque.length > 0 && deque[0] <= i - k) {\n deque.shift();\n }\n \n // 维护单调递减队列:移除队尾所有小于当前元素的索引\n while (deque.length > 0 && nums[deque[deque.length - 1]] <= nums[i]) {\n deque.pop();\n }\n \n // 将当前元素索引加入队尾\n deque.push(i);\n \n // 当窗口大小达到k时,开始记录结果\n if (i >= k - 1) {\n result.push(nums[deque[0]]); // 队首是当前窗口最大值\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 每个元素最多进队列和出队列各一次\n- 空间复杂度 :O(k) - 队列最多存储k个元素","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178188012","body":"## 算法思路:\n- 使用度数统计法,将问题转化为图论中的入度和出度计算\n- 法官的特征:不信任任何人(出度=0)+ 被所有其他人信任(入度=n-1)\n- 通过计算每个人的\"信任度\"(入度-出度)来找到法官\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n // 特殊情况:只有一个人且没有信任关系,那么这个人就是法官\n if (n === 1 && trust.length === 0) {\n return 1;\n }\n \n // 初始化信任度数组,trustScore[i] = 入度 - 出度\n const trustScore = new Array(n + 1).fill(0);\n \n // 遍历所有信任关系\n for (const [a, b] of trust) {\n trustScore[a]--; // a信任别人,出度+1,所以信任度-1\n trustScore[b]++; // b被信任,入度+1,所以信任度+1\n }\n \n // 查找信任度为n-1的人(法官候选人)\n for (let i = 1; i <= n; i++) {\n if (trustScore[i] === n - 1) {\n return i;\n }\n }\n \n // 没有找到法官\n return -1;\n};\n```\n\n## 算法复杂度分析\n- 时间复杂度: O(E + n)\n- 遍历trust数组:O(E),其中E是信任关系数量\n- 查找法官:O(n)\n\n- 空间复杂度: O(n)\n- 需要额外的信任度数组存储每个人的统计信息","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182100538","body":"## 算法思路\n这是一个经典的二分图判断问题。核心思想是:\n\n- 将问题转化为图着色问题\n- 构建无向图,其中dislikes数组中的每一对表示图中的一条边\n- 使用DFS图着色算法判断是否能用两种颜色给所有节点着色\n- 如果相邻节点都能着不同颜色,则可以分成两组\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nvar possibleBipartition = function(n, dislikes) {\n // 构建邻接表表示图\n const graph = new Array(n + 1).fill(null).map(() => []);\n for (const [a, b] of dislikes) {\n graph[a].push(b);\n graph[b].push(a);\n }\n \n // 用于记录每个节点的颜色,0表示未着色,1和-1表示两种不同的颜色\n const colors = new Array(n + 1).fill(0);\n \n // DFS着色函数\n const dfs = (node, color) => {\n colors[node] = color;\n \n // 遍历所有邻接节点\n for (const neighbor of graph[node]) {\n if (colors[neighbor] === 0) {\n // 如果邻接节点未着色,给它着相反的颜色\n if (!dfs(neighbor, -color)) {\n return false;\n }\n } else if (colors[neighbor] === color) {\n // 如果邻接节点已经着色且颜色相同,说明不能构成二分图\n return false;\n }\n }\n return true;\n };\n \n // 遍历所有节点,处理可能存在的多个连通分量\n for (let i = 1; i <= n; i++) {\n if (colors[i] === 0) {\n if (!dfs(i, 1)) {\n return false;\n }\n }\n }\n \n return true;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(V + E),其中V是节点数量(n个人),E是边的数量(dislikes数组长度)\n- 空间复杂度 :O(V + E),主要用于邻接表存储、颜色数组和DFS递归栈","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186630947","body":"## 算法思路分析:\n这是一个双层拓扑排序问题\n- 首先需要对小组进行拓扑排序,确保依赖的小组在前面\n- 然后对每个小组内的项目进行拓扑排序\n- 最后按小组顺序合并结果\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n // 为没有小组的项目分配虚拟小组ID\n let groupId = m;\n for (let i = 0; i < n; i++) {\n if (group[i] === -1) {\n group[i] = groupId++;\n }\n }\n \n // 构建小组图和项目图\n const groupGraph = new Array(groupId).fill(0).map(() => []);\n const groupIndegree = new Array(groupId).fill(0);\n const itemGraph = new Array(n).fill(0).map(() => []);\n const itemIndegree = new Array(n).fill(0);\n \n // 构建依赖关系图\n const groupEdges = new Set(); // 用于去重小组间的边\n \n for (let i = 0; i < n; i++) {\n for (const beforeItem of beforeItems[i]) {\n const beforeGroup = group[beforeItem];\n const currentGroup = group[i];\n \n // 项目依赖关系\n itemGraph[beforeItem].push(i);\n itemIndegree[i]++;\n \n // 小组依赖关系(只有当项目属于不同小组时)\n if (beforeGroup !== currentGroup) {\n const edgeKey = `${beforeGroup}->${currentGroup}`;\n if (!groupEdges.has(edgeKey)) {\n groupEdges.add(edgeKey);\n groupGraph[beforeGroup].push(currentGroup);\n groupIndegree[currentGroup]++;\n }\n }\n }\n }\n \n // 拓扑排序函数\n function topologicalSort(graph, indegree) {\n const queue = [];\n const result = [];\n \n // 找到所有入度为0的节点\n for (let i = 0; i < indegree.length; i++) {\n if (indegree[i] === 0) {\n queue.push(i);\n }\n }\n \n while (queue.length > 0) {\n const node = queue.shift();\n result.push(node);\n \n // 更新相邻节点的入度\n for (const neighbor of graph[node]) {\n indegree[neighbor]--;\n if (indegree[neighbor] === 0) {\n queue.push(neighbor);\n }\n }\n }\n \n return result.length === graph.length ? result : [];\n }\n \n // 对小组进行拓扑排序\n const sortedGroups = topologicalSort(groupGraph, [...groupIndegree]);\n if (sortedGroups.length === 0) {\n return []; // 小组间存在循环依赖\n }\n \n // 对项目进行拓扑排序\n const sortedItems = topologicalSort(itemGraph, [...itemIndegree]);\n if (sortedItems.length === 0) {\n return []; // 项目间存在循环依赖\n }\n \n // 按小组分类项目\n const groupToItems = new Map();\n for (const item of sortedItems) {\n const itemGroup = group[item];\n if (!groupToItems.has(itemGroup)) {\n groupToItems.set(itemGroup, []);\n }\n groupToItems.get(itemGroup).push(item);\n }\n \n // 按小组顺序合并结果\n const result = [];\n for (const groupId of sortedGroups) {\n if (groupToItems.has(groupId)) {\n result.push(...groupToItems.get(groupId));\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n时间复杂度:O(n + E)\n- 构建图:O(E),E为所有依赖关系总数\n- 小组拓扑排序:O(V_g + E_g)\n- 项目拓扑排序:O(V_i + E_i)\n- 结果合并:O(n)\n\n空间复杂度:O(n + E + m)\n- 图存储:O(n + E)\n- 入度数组:O(n + m)\n- 辅助数据结构:O(n + m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3191484423","body":"## 算法思路\n机器人要回到原点(0,0),必须满足两个条件:\n- 向左移动的次数 = 向右移动的次数\n- 向上移动的次数 = 向下移动的次数\n\n## 代码\n```javascript\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let x = 0, y = 0; // 当前坐标\n \n for (let move of moves) {\n switch (move) {\n case 'L':\n x--;\n break;\n case 'R':\n x++;\n break;\n case 'U':\n y++;\n break;\n case 'D':\n y--;\n break;\n }\n }\n \n return x === 0 && y === 0;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n),其中n是moves字符串的长度,需要遍历一次字符串\n- 空间复杂度 :O(1),只使用了常数个额外变量,不随输入规模变化","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3194108225","body":"## 算法思路\n- 预处理 :为每个任务添加原始索引,按进入时间排序\n- 模拟执行 :使用最小堆维护可执行任务队列,按执行时间最短优先、索引最小优先的规则选择任务\n- 时间管理 :CPU空闲时直接跳转到下一个任务的进入时间,避免无效等待\n\n## 代码\n```javascript\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n const n = tasks.length;\n \n // 为每个任务添加原始索引,然后按进入时间排序\n const taskWithIndex = tasks.map((task, index) => [task[0], task[1], index]);\n taskWithIndex.sort((a, b) => a[0] - b[0]); // 按enqueueTime排序\n \n const result = [];\n // 优先队列:按执行时间升序,相同时按索引升序\n const availableTasks = new MinHeap((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按processingTime升序\n }\n return a[1] - b[1]; // 按originalIndex升序\n });\n \n let currentTime = 0;\n let taskIndex = 0; // 指向下一个要加入队列的任务\n \n while (result.length < n) {\n // 将所有在当前时间或之前进入队列的任务加入可执行队列\n while (taskIndex < n && taskWithIndex[taskIndex][0] <= currentTime) {\n const [enqueueTime, processingTime, originalIndex] = taskWithIndex[taskIndex];\n availableTasks.push([processingTime, originalIndex]);\n taskIndex++;\n }\n \n if (availableTasks.size() === 0) {\n // CPU空闲,直接跳到下一个任务的进入时间\n if (taskIndex < n) {\n currentTime = taskWithIndex[taskIndex][0];\n }\n } else {\n // 从可执行任务中选择执行时间最短的(相同时选择索引最小的)\n const [processingTime, originalIndex] = availableTasks.pop();\n result.push(originalIndex);\n currentTime += processingTime;\n }\n }\n \n return result;\n};\n\n// 最小堆实现\nclass MinHeap {\n constructor(compareFn) {\n this.heap = [];\n this.compare = compareFn || ((a, b) => a - b);\n }\n \n push(val) {\n this.heap.push(val);\n this.bubbleUp(this.heap.length - 1);\n }\n \n pop() {\n if (this.heap.length === 0) return undefined;\n if (this.heap.length === 1) return this.heap.pop();\n \n const top = this.heap[0];\n this.heap[0] = this.heap.pop();\n this.bubbleDown(0);\n return top;\n }\n \n size() {\n return this.heap.length;\n }\n \n bubbleUp(index) {\n while (index > 0) {\n const parentIndex = Math.floor((index - 1) / 2);\n if (this.compare(this.heap[index], this.heap[parentIndex]) >= 0) break;\n \n [this.heap[index], this.heap[parentIndex]] = [this.heap[parentIndex], this.heap[index]];\n index = parentIndex;\n }\n }\n \n bubbleDown(index) {\n while (true) {\n let minIndex = index;\n const leftChild = 2 * index + 1;\n const rightChild = 2 * index + 2;\n \n if (leftChild < this.heap.length && \n this.compare(this.heap[leftChild], this.heap[minIndex]) < 0) {\n minIndex = leftChild;\n }\n \n if (rightChild < this.heap.length && \n this.compare(this.heap[rightChild], this.heap[minIndex]) < 0) {\n minIndex = rightChild;\n }\n \n if (minIndex === index) break;\n \n [this.heap[index], this.heap[minIndex]] = [this.heap[minIndex], this.heap[index]];\n index = minIndex;\n }\n }\n}\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n log n)\n - 排序:O(n log n)\n - 堆操作:每个任务最多进出堆一次,总计O(n log n)\n- 空间复杂度 :O(n)\n - 存储任务信息、最小堆和结果数组","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194111949","body":"## 算法核心思路\n- 1.时间转换 :将 \"HH:MM\" 格式转换为分钟数便于计算\n- 2.对局编号计算 :\n - 开始时间: Math.ceil(minutes / 15) 确保只计算完整参与的对局\n - 结束时间: Math.floor(minutes / 15) 确保只计算完整参与的对局\n- 3.分情况处理 :\n - 同一天:结束时间对局编号 - 开始时间对局编号\n - 跨夜:(96 - 开始时间对局编号) + 结束时间对局编号\n\n## 代码\n```javascript\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n // 将时间字符串转换为分钟数\n function timeToMinutes(time) {\n const [hours, minutes] = time.split(':').map(Number);\n return hours * 60 + minutes;\n }\n \n const startMinutes = timeToMinutes(loginTime);\n const endMinutes = timeToMinutes(logoutTime);\n \n // 如果结束时间早于开始时间,说明跨越了午夜\n if (endMinutes < startMinutes) {\n // 跨夜情况:从开始时间到午夜 + 从午夜到结束时间\n // 计算从开始时间到午夜能完成的对局数\n const roundsBeforeMidnight = 96 - Math.ceil(startMinutes / 15);\n // 计算从午夜到结束时间能完成的对局数\n const roundsAfterMidnight = Math.floor(endMinutes / 15);\n return roundsBeforeMidnight + roundsAfterMidnight;\n } else {\n // 同一天情况\n // 能完成的对局数 = 结束时间所在的对局编号 - 开始时间所在的对局编号\n const result = Math.floor(endMinutes / 15) - Math.ceil(startMinutes / 15);\n return Math.max(0, result); // 确保不返回负数\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(1) - 所有操作都是常数时间的数学计算\n- 空间复杂度 :O(1) - 只使用固定数量的变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3197064559","body":"## 算法思路\n- 1.统计字符频率\n- 2.条件三:变成同一个字母\n- 3.条件一 & 条件二:字母严格大小比较\n- 4.综合最优解\n\n## 代码\n```javascript\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n let n = a.length, m = b.length;\n\n let freqA = new Array(26).fill(0);\n let freqB = new Array(26).fill(0);\n\n for (let ch of a) freqA[ch.charCodeAt(0) - 97]++;\n for (let ch of b) freqB[ch.charCodeAt(0) - 97]++;\n\n // 前缀和\n let prefixA = new Array(27).fill(0);\n let prefixB = new Array(27).fill(0);\n for (let i = 0; i < 26; i++) {\n prefixA[i+1] = prefixA[i] + freqA[i];\n prefixB[i+1] = prefixB[i] + freqB[i];\n }\n\n // 条件三:相同字母\n let ops3 = Infinity;\n for (let i = 0; i < 26; i++) {\n ops3 = Math.min(ops3, n + m - (freqA[i] + freqB[i]));\n }\n\n // 条件一 & 二\n let ops1 = Infinity, ops2 = Infinity;\n for (let c = 0; c < 25; c++) { // 0~24,分割点\n // a < b\n ops1 = Math.min(ops1, (n - prefixA[c+1]) + prefixB[c+1]);\n // b < a\n ops2 = Math.min(ops2, (m - prefixB[c+1]) + prefixA[c+1]);\n }\n\n return Math.min(ops1, ops2, ops3);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n + m)\n- 空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199072283","body":"## 算法思路\n- 1.将数组构建为一个 最大堆(heapify)\n 最大堆性质:父节点值 ≥ 子节点值。\n- 2.交换堆顶(最大值)和堆尾元素,把最大值放到最终位置。\n- 3.缩小堆的范围(长度减 1),重新 heapify。\n- 4.重复步骤 2–3,直到整个数组有序。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function(nums) {\n let n = nums.length;\n\n // 建堆(从最后一个非叶子节点开始向下调整)\n for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {\n heapify(nums, n, i);\n }\n\n // 不断取出堆顶(最大值)放到数组末尾\n for (let i = n - 1; i > 0; i--) {\n // 交换堆顶和堆尾\n [nums[0], nums[i]] = [nums[i], nums[0]];\n // 调整剩余部分\n heapify(nums, i, 0);\n }\n\n return nums;\n};\n\n// 调整为最大堆\nfunction heapify(arr, heapSize, root) {\n let largest = root;\n let left = 2 * root + 1;\n let right = 2 * root + 2;\n\n if (left < heapSize && arr[left] > arr[largest]) {\n largest = left;\n }\n\n if (right < heapSize && arr[right] > arr[largest]) {\n largest = right;\n }\n\n if (largest !== root) {\n [arr[root], arr[largest]] = [arr[largest], arr[root]];\n heapify(arr, heapSize, largest);\n }\n}\n```\n\n## 复杂度分析\n- 时间复杂度\n建堆:O(n)\n每次取出最大值并 heapify:O(log n),共 n 次\n总计:O(n log n)\n- 空间复杂度\n堆排序在原数组上操作,只需要 O(1) 额外空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204787436","body":"## 算法思路:\n- 平方根一定在 1 ~ x/2 之间(除了 0 和 1 特殊处理)。\n- 用二分查找,比较 mid * mid 与 x。\n- 如果等于就直接返回。\n- 如果小于,就把 mid 作为候选答案,继续往右找。\n- 如果大于,就往左缩。\n\n## 代码\n```javascript\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n if (x < 2) return x; // 0 -> 0, 1 -> 1\n\n let left = 1, right = Math.floor(x / 2), ans = 0;\n while (left <= right) {\n let mid = Math.floor((left + right) / 2);\n let square = mid * mid;\n\n if (square === x) {\n return mid;\n } else if (square < x) {\n ans = mid; // mid 可能是答案\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 O(log n)\n- 空间复杂度 O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3209498631","body":"## 算法思路\n- 设定搜索区间 [1, n]。\n- 取中点 mid = Math.floor((left + right) / 2)。\n- 调用 isBadVersion(mid):\n- 如果是坏的(true),说明答案在 左边或就是 mid,更新 right = mid。\n- 如果不是坏的(false),说明答案在 右边,更新 left = mid + 1。\n- 循环直到 left == right,此时 left 就是第一个坏版本。\n\n## 代码\n```javascript\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let left = 1, right = n;\n while (left < right) {\n let mid = Math.floor((left + right) / 2);\n if (isBadVersion(mid)) {\n // mid 可能是第一个坏版本,所以不能跳过它\n right = mid;\n } else {\n // mid 不是坏的,第一个坏版本在右边\n left = mid + 1;\n }\n }\n return left; // 或者 right,二者相等\n };\n};\n```\n\n## 复杂度分析\n- 时间复杂度:每次二分区间缩小一半,最多调用 isBadVersion O(log n) 次。\n- 空间复杂度:我们只用到了几个变量,额外空间复杂度是 O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3214357168","body":"## 算法思路\n- 1.分治思想(归并排序)\n- 把数组分为两半,分别统计左半部分和右半部分的翻转对数量。\n- 在合并的时候,再统计「跨左右两部分」的翻转对数量。\n- 2.跨区间统计方法\n- 假设左半部分是 left[],右半部分是 right[],它们都是有序的。\n- 对于每个 left[i],我们需要统计右边有多少个 right[j] 满足left[i]>2×right[j]\n- 因为 right[] 已经排序,可以用一个指针 双指针扫描,避免嵌套循环。\n- 3.合并排序\n- 统计完跨区间的翻转对数量后,把两个有序数组合并,递归回溯。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n if (!nums || nums.length === 0) return 0;\n\n const mergeSort = (arr, left, right) => {\n if (left >= right) return 0;\n\n let mid = Math.floor((left + right) / 2);\n let count = mergeSort(arr, left, mid) + mergeSort(arr, mid + 1, right);\n\n // 统计跨区间翻转对\n let j = mid + 1;\n for (let i = left; i <= mid; i++) {\n while (j <= right && arr[i] > 2 * arr[j]) {\n j++;\n }\n count += (j - (mid + 1));\n }\n\n // 合并两个有序数组\n let temp = [];\n let p1 = left, p2 = mid + 1;\n while (p1 <= mid && p2 <= right) {\n if (arr[p1] <= arr[p2]) {\n temp.push(arr[p1++]);\n } else {\n temp.push(arr[p2++]);\n }\n }\n while (p1 <= mid) temp.push(arr[p1++]);\n while (p2 <= right) temp.push(arr[p2++]);\n\n for (let i = 0; i < temp.length; i++) {\n arr[left + i] = temp[i];\n }\n\n return count;\n };\n\n return mergeSort(nums, 0, nums.length - 1);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(nlogn)\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3218651000","body":"## 算法思路\n\n- 排序\n- 对 houses 和 heaters 进行排序,方便二分查找。\n- 二分查找\n- 对于每个房屋 h,在 heaters 中二分查找,找到最接近 h 的供暖器位置。\n- 计算 |h - heater_left| 和 |h - heater_right| 的最小值。\n- 得到该房屋的最小供暖距离。\n- 取最大值\n- 遍历所有房屋,取最小距离的最大值。\n\n## 代码\n```javascript\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n houses.sort((a, b) => a - b);\n heaters.sort((a, b) => a - b);\n\n let radius = 0;\n\n for (let house of houses) {\n // 二分查找\n let left = 0, right = heaters.length - 1;\n while (left <= right) {\n let mid = Math.floor((left + right) / 2);\n if (heaters[mid] < house) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n // left 是第一个 >= house 的位置\n let dist1 = (left < heaters.length) ? Math.abs(heaters[left] - house) : Infinity;\n let dist2 = (right >= 0) ? Math.abs(heaters[right] - house) : Infinity;\n\n let nearest = Math.min(dist1, dist2);\n radius = Math.max(radius, nearest);\n }\n\n return radius;\n};\n```\n\n## 复杂度分析\n- 排序\n- houses 排序:O(n log n)\n- heaters 排序:O(m log m)\n- 二分查找\n- 每个房屋做一次二分:O(log m)\n- 共 n 个房屋:O(n log m)\n- 总时间复杂度:O(nlogn+mlogm+nlogm)\n- 空间复杂度:O(1)(除了排序外,常数额外空间)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3218659174","body":"## 排序数组\n- 先对 nums 排序。这样数对距离 = 两个数的差,可以利用单调性。\n- 二分查找答案\n- 距离范围:最小值 0,最大值 max(nums) - min(nums)。\n- 设二分中间值为 mid,问题转化为:\n- 数组中有多少对数对距离 ≤ mid。\n- 双指针统计 ≤ mid 的数对数量\n- 排序后数组 nums 单调递增。\n- 用两个指针 i、j:\n- 固定右端点 j,向左找满足 nums[j] - nums[i] <= mid 的最小 i。\n- 那么从 i 到 j-1 的所有元素都和 j 构成合法数对,总数是 j - i。\n- 整个过程是 O(n)。\n- 二分逻辑\n- 如果 ≤ mid 的数对数目 ≥ k,说明答案可能更小,右边界收缩。\n- 否则说明距离太小,左边界右移。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a, b) => a - b);\n\n // 统计差值 <= mid 的数对个数\n function countPairs(mid) {\n let count = 0;\n let i = 0;\n for (let j = 0; j < nums.length; j++) {\n while (nums[j] - nums[i] > mid) {\n i++;\n }\n count += j - i;\n }\n return count;\n }\n\n let left = 0, right = nums[nums.length - 1] - nums[0];\n while (left < right) {\n let mid = Math.floor((left + right) / 2);\n if (countPairs(mid) >= k) {\n right = mid; // 答案可能是 mid 或更小\n } else {\n left = mid + 1;\n }\n }\n return left;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 排序:O(n log n)\n- 二分查找:查找范围是 max(nums) - min(nums),最大 1e6,二分次数约 log(1e6) ≈ 20。\n- 每次 countPairs:O(n)(双指针扫描一遍)。\n- 总复杂度:O(n log n + n log W),其中 W = max(nums) - min(nums)。对 n = 1e4,完全可行。\n- 空间复杂度\n- 只用了常数级变量,O(1)(不算排序)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218668542","body":"## 算法思路\n- 二分 + BFS/DFS\n- 时间范围是 [max(grid[0][0], grid[n-1][n-1]), n^2-1]。\n- 二分水位 mid,检查是否能在 mid 水位下从 (0,0) 到 (n-1,n-1)。\n- 如果可以,则收缩右边界,否则收缩左边界。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n const n = grid.length;\n const directions = [[1,0],[-1,0],[0,1],[0,-1]];\n \n // 检查是否能在水位 t 下到达终点\n function canReach(t) {\n if (grid[0][0] > t) return false;\n const visited = Array.from({length: n}, () => Array(n).fill(false));\n const queue = [[0,0]];\n visited[0][0] = true;\n\n while (queue.length > 0) {\n const [x, y] = queue.shift();\n if (x === n-1 && y === n-1) return true;\n for (const [dx, dy] of directions) {\n const nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n &&\n !visited[nx][ny] && grid[nx][ny] <= t) {\n visited[nx][ny] = true;\n queue.push([nx, ny]);\n }\n }\n }\n return false;\n }\n\n // 二分查找最小可行水位\n let low = Math.max(grid[0][0], grid[n-1][n-1]);\n let high = n * n - 1;\n let ans = high;\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (canReach(mid)) {\n ans = mid;\n high = mid - 1; // 尝试更小的水位\n } else {\n low = mid + 1;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- BFS 最多访问 n^2 个格子,复杂度 O(n^2)。\n- 二分查找 范围大小约为 n^2,二分次数 O(log(n^2)) = O(log n)。\n- 总时间复杂度:O(n^2 log n)。\n- 空间复杂度:需要 visited 数组 O(n^2)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3226685252","body":"## 核心思路\n- 滑动窗口(Sliding Window)\n- 定义元音集合\n- vowels = new Set(['a','e','i','o','u'])\n- 初始化窗口\n- 先统计前 k 个字符里元音的数量 count。\n- 这就是第一个窗口的元音数。\n- 滑动窗口\n- 从 i = k 开始,窗口向右滑动:\n- 移除窗口最左边的字符(如果它是元音则 count--)。\n- 加入窗口最右边的字符(如果它是元音则 count++)。\n- 每次更新最大值 maxCount = Math.max(maxCount, count)。\n- 提前终止\n- 如果 maxCount === k,说明某个窗口里全是元音,直接返回结果(不可能更大了)。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n const vowels = new Set(['a', 'e', 'i', 'o', 'u']);\n let count = 0, maxCount = 0;\n\n // 初始化前 k 个字符\n for (let i = 0; i < k; i++) {\n if (vowels.has(s[i])) count++;\n }\n maxCount = count;\n\n // 滑动窗口\n for (let i = k; i < s.length; i++) {\n if (vowels.has(s[i - k])) count--; // 移除最左边\n if (vowels.has(s[i])) count++; // 加入最右边\n maxCount = Math.max(maxCount, count);\n if (maxCount === k) return k; // 提前终止\n }\n\n return maxCount;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 初始化前 k 个字符统计需要 O(k)。\n- 然后遍历整个字符串一次 O(n)。\n- 总体复杂度:O(n)。\n- 空间复杂度:\n- 仅使用一个集合 Set 存元音,空间 O(1)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3226702074","body":"## 思路分析\n- 边界情况\n- 如果 k == 0:Alice 一开始就停,不抽牌,分数是 0。如果 0 <= n,返回 1;否则返回 0。\n- 如果 n >= k - 1 + maxPts:Alice 不可能超过 n,因为最大分数就是 k-1 + maxPts。此时概率是 1。\n- 动态规划建模\n- 定义 dp[i] = 从分数 i 出发,Alice 最终分数不超过 n 的概率。\n- 最终答案是 dp[0]。\n- 如果 i >= k:表示 Alice 已经停了。\n- 如果 i <= n:返回 1(安全)。\n- 否则返回 0(爆掉)。\n- 如果 i < k:Alice 会继续抽。\n- 优化:滑动窗口\n- 用一个变量 windowSum 维护滑动和,就能做到 O(n)。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n // 速返:一开始就停;或最高可能分也不超过 n\n if (k === 0 || n >= k - 1 + maxPts) return 1.0;\n\n const dp = new Array(n + 1).fill(0.0);\n // 终止区间:达到/超过 k 后立即停;在 [k, n] 内都是成功状态\n for (let i = k; i <= n; i++) dp[i] = 1.0;\n\n // 初始窗口和:dp[k]..dp[k+maxPts-1],这些里面只有 <= n 的是 1\n let windowSum = Math.min(n - k + 1, maxPts);\n\n // 从后往前做滑动平均\n for (let i = k - 1; i >= 0; i--) {\n dp[i] = windowSum / maxPts;\n // 更新窗口:加上新放入的 dp[i],减去滑出窗口的 dp[i + maxPts](越界视为 0)\n windowSum += dp[i] - (i + maxPts <= n ? dp[i + maxPts] : 0);\n // 也可写成:windowSum += dp[i] - (dp[i + maxPts] ?? 0);\n }\n return dp[0];\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 只遍历了一次数组,每个状态 O(1) 计算。\n- 时间复杂度:O(n)\n- 空间复杂度\n- 需要一个 dp 数组大小为 O(n)。\n- 也可以优化成 O(maxPts)(因为只依赖一个窗口)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3231363055","body":"## 算法思路\n- 核心观察\n- 一个字符串的异位词就是 字符相同但顺序不同 的字符串。\n- 如果子串和 p 的 字符频率统计完全相同,那么它就是一个异位词。\n- 滑动窗口\n- 用两个数组(或哈希表)存放字符频率:\n- pCount 记录 p 中各字符出现次数。\n- sCount 记录当前窗口(长度等于 p.length)的各字符出现次数。\n- 每次窗口滑动:\n- 移入一个字符,更新 sCount。\n- 移出一个字符,更新 sCount。\n- 如果 sCount 和 pCount 相等,则记录当前窗口起始位置。\n- 优化比较\n- 不需要每次都完整比较两个数组(O(26))。\n- 但因为字符集仅 26 个,比较成本很小,可以直接比较数组,整体复杂度依旧可接受。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nvar findAnagrams = function(s, p) {\n let res = [];\n let m = p.length, n = s.length;\n if (n < m) return res;\n\n // 频次数组,26个小写字母\n let pCount = new Array(26).fill(0);\n let sCount = new Array(26).fill(0);\n\n // 统计 p 的频率\n for (let ch of p) {\n pCount[ch.charCodeAt(0) - 97]++;\n }\n\n // 初始化第一个窗口\n for (let i = 0; i < m; i++) {\n sCount[s.charCodeAt(i) - 97]++;\n }\n\n // 比较初始窗口\n if (sCount.join() === pCount.join()) res.push(0);\n\n // 滑动窗口\n for (let i = m; i < n; i++) {\n sCount[s.charCodeAt(i) - 97]++; // 加入右边字符\n sCount[s.charCodeAt(i - m) - 97]--; // 移出左边字符\n\n if (sCount.join() === pCount.join()) {\n res.push(i - m + 1);\n }\n }\n\n return res;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 初始化统计频率:O(m)\n- 滑动窗口遍历 s:O(n)\n- 每次比较频率数组:O(26) = O(1)\n- 总复杂度:O(n + m)\n- 空间复杂度\n- 两个长度为 26 的数组:O(26) ≈ O(1)\n- 结果数组存储下标,最坏情况 O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3236034367","body":"## 算法思路\n- 核心思想:滑动窗口\n- 我们在字符串 s 上维护一个动态窗口 [left, right)。\n- 用 need 记录字符串 t 中每个字符需要的次数。\n- 用 window 记录当前窗口中每个字符出现的次数。\n- 不断扩展 right 指针,直到窗口内满足 t 的要求。\n- 然后收缩 left,尽量缩小窗口,直到不满足要求为止。\n- 在满足要求的情况下,更新最小子串。\n- 满足条件的判断\n- 我们可以维护一个 valid 变量,表示窗口中满足 need 的字符种类数。\n- 当 valid === need.size 时,说明窗口包含了所有需要的字符。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nvar minWindow = function(s, t) {\n let need = new Map();\n let window = new Map();\n\n for (let c of t) {\n need.set(c, (need.get(c) || 0) + 1);\n }\n\n let left = 0, right = 0;\n let valid = 0;\n let start = 0, len = Infinity;\n\n while (right < s.length) {\n let c = s[right];\n right++;\n if (need.has(c)) {\n window.set(c, (window.get(c) || 0) + 1);\n if (window.get(c) === need.get(c)) {\n valid++;\n }\n }\n\n // 收缩左边界\n while (valid === need.size) {\n if (right - left < len) {\n start = left;\n len = right - left;\n }\n let d = s[left];\n left++;\n if (need.has(d)) {\n if (window.get(d) === need.get(d)) {\n valid--;\n }\n window.set(d, window.get(d) - 1);\n }\n }\n }\n\n return len === Infinity ? \"\" : s.substr(start, len);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 每个字符最多被左右指针访问一次,所以是 O(m + n),其中 m = s.length, n = t.length。\n- 空间复杂度:\n- 哈希表 need 和 window 至多包含全部字符,大小为 O(Σ),Σ 是字符集大小(对英文就是 O(26) 或 O(52) 或 O(128))。\n- 所以空间复杂度 O(Σ)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/50#issuecomment-3247555036","body":"## 算法思路\n- 一共要拿 k 张牌,可以从数组两端取。\n- 等价于:我们留下 n - k 张牌(连续子数组),这些是不能拿的。\n- 因此,最大得分 = 总和 - 最小的长度为 (n - k) 的子数组的和。\n- 先计算数组总和 total。\n- 如果 k == n,那就直接返回 total。\n- 否则,使用滑动窗口大小为 (n - k),找到 最小窗口和。\n- 答案就是 total - min_window_sum。\n\n## 代码\n```javascript\n/**\n * @param {number[]} cardPoints\n * @param {number} k\n * @return {number}\n */\nvar maxScore = function(cardPoints, k) {\n const n = cardPoints.length;\n const total = cardPoints.reduce((a, b) => a + b, 0);\n \n // 特殊情况:拿所有卡牌\n if (k === n) return total;\n \n const windowSize = n - k;\n // 初始化窗口和\n let windowSum = 0;\n for (let i = 0; i < windowSize; i++) {\n windowSum += cardPoints[i];\n }\n let minWindowSum = windowSum;\n \n // 滑动窗口\n for (let i = windowSize; i < n; i++) {\n windowSum += cardPoints[i] - cardPoints[i - windowSize];\n minWindowSum = Math.min(minWindowSum, windowSum);\n }\n \n return total - minWindowSum;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 计算总和 O(n)\n- 滑动窗口遍历一次数组 O(n)\n- 总复杂度 O(n)\n- 空间复杂度:\n- 只用常数级变量存储 O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3247564267","body":"## 算法思路\n- 枚举所有可能的小时和分钟\n- 小时范围:0–11\n- 分钟范围:0–59\n- 总共 12 × 60 = 720 种组合。\n- 统计二进制表示中 1 的个数\n- bitCount(h) + bitCount(m) == turnedOn 才是合法解。\n- 其中 bitCount(x) 表示数字 x 的二进制中 1 的数量。\n- 格式化输出\n- 小时 h 直接转成字符串(不能有前导零)。\n- 分钟 m 必须是两位数,若小于 10 需在前面补 0。\n\n## 代码\n```javascript\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n const res = [];\n // 遍历所有可能的时间\n for (let h = 0; h < 12; h++) {\n for (let m = 0; m < 60; m++) {\n // 检查是否满足亮灯数量\n if (bitCount(h) + bitCount(m) === turnedOn) {\n // 格式化分钟(必须两位数)\n const time = `${h}:${m.toString().padStart(2, '0')}`;\n res.push(time);\n }\n }\n }\n return res;\n};\n\n// 计算二进制数中 1 的个数\nfunction bitCount(num) {\n let count = 0;\n while (num > 0) {\n count += num & 1;\n num >>= 1;\n }\n return count;\n}\n```\n\n## 复杂度分析\n- 外层遍历所有 12 × 60 = 720 种时间组合 → O(720) ≈ O(1) (常数级,最多 720 次)。\n- 每次计算 bitCount(h) 和 bitCount(m),\n- h < 12(最多 4 bit),m < 60(最多 6 bit),所以计算一次 bitCount 的复杂度 ≤ 10。\n- 总复杂度依然是常数级。\n- 时间复杂度:O(1) (严格来说是 O(720×10),但近似常数)\n- 空间复杂度:O(1) (除返回结果外仅使用常量存储)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3247575227","body":"## 算法思路(回溯法)\n- 逐行放置:从第 0 行开始,尝试在每一列放置皇后。\n- 约束检查:放置前,检查当前列和对角线是否已有皇后。\n- 列冲突:用一个集合 cols 记录已占用的列。\n- 主对角线冲突:行号 - 列号 相同的点在同一主对角线上,用 diag1 集合。\n- 副对角线冲突:行号 + 列号 相同的点在同一副对角线上,用 diag2 集合。\n- 递归搜索:如果当前行放置成功,递归尝试下一行。\n- 回溯:如果无法继续,撤销放置,尝试下一个位置。\n- 统计解法数:当所有行都成功放置皇后时,计数 +1。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n const cols = new Set(); // 记录已占用的列\n const diag1 = new Set(); // 记录主对角线 (row - col)\n const diag2 = new Set(); // 记录副对角线 (row + col)\n\n function backtrack(row) {\n if (row === n) { \n count++;\n return;\n }\n for (let col = 0; col < n; col++) {\n if (cols.has(col) || diag1.has(row - col) || diag2.has(row + col)) {\n continue; // 冲突,不能放\n }\n // 选择\n cols.add(col);\n diag1.add(row - col);\n diag2.add(row + col);\n\n backtrack(row + 1);\n\n // 回溯\n cols.delete(col);\n diag1.delete(row - col);\n diag2.delete(row + col);\n }\n }\n\n backtrack(0);\n return count;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 每行必须放置一个皇后,因此每一行尝试 n 种列的可能性。\n- 在冲突检测 O(1) 的情况下,最坏情况回溯树的大小接近 O(n!)。\n- 实际上,由于剪枝(冲突检测),复杂度会远小于 n!,但仍然是 指数级。\n- 时间复杂度:O(n!) (上界)。\n- 空间复杂度:\n- cols、diag1、diag2 最多各存储 n 个元素。\n- 递归栈深度最大为 n。\n- 空间复杂度:O(n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3247583590","body":"## 算法思路\n- 遍历整个网格,当遇到值为 1 的格子时,说明找到了新的岛屿。\n- 使用 DFS(深度优先搜索)或 BFS(广度优先搜索)来扩展整个岛屿,计算其面积,并更新最大值。\n- 为避免重复计算,我们要将访问过的格子标记为 0(淹没)或使用 visited 数组。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n let m = grid.length, n = grid[0].length;\n let maxArea = 0;\n\n function dfs(i, j) {\n // 边界条件\n if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] === 0) {\n return 0;\n }\n // 标记访问过\n grid[i][j] = 0;\n let area = 1;\n // 四个方向\n area += dfs(i + 1, j);\n area += dfs(i - 1, j);\n area += dfs(i, j + 1);\n area += dfs(i, j - 1);\n return area;\n }\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n maxArea = Math.max(maxArea, dfs(i, j));\n }\n }\n }\n\n return maxArea;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 遍历整个矩阵,每个元素最多被访问一次(因为访问后会被置为 0)。\n- 每个格子在 DFS 中的递归调用也是 O(1)(最多 4 次相邻扩展)。\n- 总时间复杂度: O(m * n)\n- 空间复杂度:\n- 递归栈的深度,最坏情况是整个矩阵都是 1,即 O(m * n)。\n- 如果用 BFS + 队列,也需要 O(m * n) 的空间。\n- 空间复杂度: O(m * n)(递归栈 / 队列空间)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247593268","body":"## 算法思路\n- 使用多源 BFS(广度优先搜索)来解决。\n- 找到所有陆地格子,放入队列(多源 BFS 起点)。\n- 从陆地开始向外扩展,遇到海洋格子时更新它的距离。\n- 记录 BFS 扩展到的最大层数,即最大距离。\n- 最后如果没有海洋或没有陆地,返回 -1。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxDistance = function(grid) {\n const n = grid.length;\n const directions = [[1,0],[-1,0],[0,1],[0,-1]];\n const queue = [];\n\n // 1. 把所有陆地加入队列\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n queue.push([i, j]);\n }\n }\n }\n\n // 如果全是海洋或者全是陆地\n if (queue.length === 0 || queue.length === n * n) return -1;\n\n let distance = -1;\n\n // 2. 多源 BFS\n while (queue.length > 0) {\n let size = queue.length;\n distance++; // 每一层扩展一次\n for (let s = 0; s < size; s++) {\n const [x, y] = queue.shift();\n for (let [dx, dy] of directions) {\n const nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] === 0) {\n grid[nx][ny] = 1; // 标记为已访问(变为陆地)\n queue.push([nx, ny]);\n }\n }\n }\n }\n\n return distance;\n};\n```\n\n## 复杂度分析\n- BFS 遍历整个网格,每个格子最多入队一次。\n- 时间复杂度:O(n^2)\n- 空间复杂度(队列 + 访问标记):O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3270177258","body":"## 思路\n- 一开始手上有一些 初始盒子,目标是最大化能获得的糖果数。关键点是:\n- 盒子可能是 开着的(status[i] = 1)或者 关着的(status[i] = 0)。\n- 你只有在盒子开着时,才能取走里面的糖果。\n- 打开盒子后,你可能获得 钥匙,可以解锁更多盒子。\n- 打开盒子后,你可能获得 更多盒子,这些盒子可能要等钥匙解锁才能用。\n- 所以整个过程就是一个 BFS / 队列模拟,类似 “不断解锁和探索”的过程。\n\n## 代码\n```javascript\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n let n = status.length;\n let res = 0;\n\n let haveKey = new Set();\n let haveBox = new Set(initialBoxes);\n let visited = new Array(n).fill(false);\n\n let queue = [...initialBoxes];\n\n while (queue.length > 0) {\n let box = queue.shift();\n if (visited[box]) continue;\n\n // 如果箱子是锁着的且没钥匙 -> 跳过\n if (status[box] === 0 && !haveKey.has(box)) continue;\n\n // 打开箱子\n visited[box] = true;\n res += candies[box];\n\n // 获得钥匙\n for (let k of keys[box]) {\n if (!haveKey.has(k)) {\n haveKey.add(k);\n // 如果之前已经有这个盒子但是打不开,现在可以打开了\n if (haveBox.has(k) && !visited[k]) {\n queue.push(k);\n }\n }\n }\n\n // 获得新的盒子\n for (let b of containedBoxes[box]) {\n if (!haveBox.has(b)) haveBox.add(b);\n if ((status[b] === 1 || haveKey.has(b)) && !visited[b]) {\n queue.push(b);\n }\n }\n }\n\n return res;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 每个盒子最多被处理一次,O(n)。\n- 钥匙和 containedBoxes 总长度之和最多 O(n)。\n- 所以总 时间复杂度 = O(n)。\n- 空间复杂度分析\n- visited / haveKey / haveBox 都是 O(n)。\n- 队列最多 O(n)。\n- 所以 空间复杂度 = O(n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3270189042","body":"/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n if (!root) return [];\n \n // 存储节点信息:[row, col, val]\n const nodes = [];\n \n // DFS遍历,记录每个节点的坐标和值\n function dfs(node, row, col) {\n if (!node) return;\n \n nodes.push([row, col, node.val]);\n \n // 左子节点:row+1, col-1\n dfs(node.left, row + 1, col - 1);\n // 右子节点:row+1, col+1\n dfs(node.right, row + 1, col + 1);\n }\n \n // 从根节点开始遍历,根节点坐标为(0, 0)\n dfs(root, 0, 0);\n \n // 按列索引分组\n const columnMap = new Map();\n for (const [row, col, val] of nodes) {\n if (!columnMap.has(col)) {\n columnMap.set(col, []);\n }\n columnMap.get(col).push([row, val]);\n }\n \n // 获取所有列索引并排序\n const columns = Array.from(columnMap.keys()).sort((a, b) => a - b);\n \n const result = [];\n for (const col of columns) {\n const columnNodes = columnMap.get(col);\n // 对每列内的节点排序:先按行排序,同行按值排序\n columnNodes.sort((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按行排序\n }\n return a[1] - b[1]; // 同行按值排序\n });\n \n // 提取值\n result.push(columnNodes.map(node => node[1]));\n }\n \n return result;\n};","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ariana850409":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074225557","body":"思維:\n以十進位的相加方式,將 k 拆解成字串,從個位數開始與 num 相加,最後再處理一次 num 的進位\n\n代碼:\n```\nclass Solution(object):\n def addToArrayForm(self, num, k):\n k = str(k)\n for i in range(-1, -(len(k)+1), -1):\n number = int(k[i])\n if abs(i) > len(num):\n num.insert(0, number)\n else:\n num[i] = num[i] + number\n\n for i in range(-1, -(len(num)+1), -1):\n temp = num[i]\n if temp >= 10:\n num[i] = temp - 10\n if abs(i-1) > len(num):\n num.insert(0, 1)\n else:\n num[i-1] += 1\n\n return num\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078087647","body":"思維:\n先找出所有符合字符 c 的 index,再判斷字符串 s 中每個字符跟要拿來比較的 index 的最短距離\n\n代碼:\n```\nclass Solution:\n def shortestToChar(self, s: str, c: str) -> List[int]:\n target = []\n for i, char in enumerate(s):\n if char == c:\n target.append(i)\n\n res = []\n t = 0\n for i in range(len(s)):\n tar = target[t]\n if i < tar:\n res.append(tar-i)\n elif i == tar:\n res.append(0)\n elif t+1 >= len(target):\n res.append(i-tar)\n else:\n next_tar = target[t+1]\n res.append(min(i-tar, next_tar-i))\n if i == next_tar:\n t += 1\n return res\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3083166293","body":"思維一:單純依照題義用最直接的想法來實作各函式,increment 用遍歷去直接改變列表中的值\n\n代碼:\n```python\nclass CustomStack:\n def __init__(self, maxSize: int):\n self.maxSize = maxSize\n self.stack = []\n \n def push(self, x: int) -> None:\n if if len(self.stack) < self.maxSize:\n self.stack.append(x)\n\n def pop(self) -> int:\n if not self.stack:\n return -1\n return self.stack.pop()\n \n def increment(self, k: int, val: int) -> None:\n k = min(k, len(self.stack))\n for i in range(k):\n self.stack[i] += val\n```\n時間複雜度:push, pop: O(1) / increment: O(N)\n\n空間複雜度:O(N)\n\n-----\n思維二:優化 increment 的時間複雜度,將 increment value 另存在一個列表,等 pop 時才判斷需加多少值\n\n代碼:\n```python\nclass CustomStack:\n def __init__(self, maxSize: int):\n self.maxSize = maxSize\n self.stack = []\n self.inc = [0] * maxSize\n \n def push(self, x: int) -> None:\n if not len(self.stack) >= self.maxSize:\n self.stack.append(x)\n\n def pop(self) -> int:\n if not self.stack:\n return -1\n inc_idx = len(self.stack)-1\n inc_val = self.inc[inc_idx]\n if inc_idx > 0:\n self.inc[inc_idx-1] += inc_val\n self.inc[inc_idx] = 0\n return self.stack.pop() + inc_val\n \n def increment(self, k: int, val: int) -> None:\n k = min(k, len(self.stack))\n if k > 0:\n self.inc[k-1] += val\n```\n時間複雜度:push, pop, increment: O(1)\n\n空間複雜度:O(N)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087613442","body":"思維:使用兩個 stack 模擬進入與退出重複區塊的過程,每遇到 [ 就壓入當下狀態,遇到 ] 就彈出並拼接,逐步建立出完整的解碼字串\n\n代碼:\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n cnt_stack = []\n str_stack = []\n cnt = ''\n temp = ''\n for c in s:\n if c.isdigit():\n cnt += c\n elif c == '[':\n cnt_stack.append(int(cnt))\n str_stack.append(temp)\n cnt = ''\n temp = ''\n elif c == ']':\n times = cnt_stack.pop()\n prev_str = str_stack.pop()\n temp = prev_str + temp * times\n else:\n temp += c\n\n return temp\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091473302","body":"思維一:以暴力解的方式在 peek 或 pop 的操作時,用另一個陣列依序存目前 stack pop 出來的所有元素,操作結果後再依序新增回去,時間及空間複雜度皆為 O(N)(無實作)
\n思維二:使用兩個 stack 來操作存取,當有 peek 或 pop 的操作時,從 out_stack 拿取,判斷 out_stack 為空時再一次性的把當前 in_stack 的所有元素倒進 out_stack\n\n代碼:\n```python\nclass MyQueue(object):\n\n def __init__(self):\n self.in_stack = []\n self.out_stack = []\n \n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n self.in_stack.append(x)\n \n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack.pop()\n \n def peek(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack[-1]\n \n def empty(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n return not (self.in_stack + self.out_stack)\n```\n時間複雜度:O(1) (Amortized)\n\n空間複雜度:O(N)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3096165781","body":"思維:\n1. 空串列直接回傳\n2. 先計算鏈結長度 length\n3. 把 k 對 length 取餘,因為旋轉 length 次等於沒動\n4. 用兩個指針 slow 和 fast 找到新的頭 new_head 的位置\n5. 將鏈結斷開重新連接,完成旋轉\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode(object):\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution(object):\n def rotateRight(self, head, k):\n \"\"\"\n :type head: Optional[ListNode]\n :type k: int\n :rtype: Optional[ListNode]\n \"\"\"\n if not head: \n return head\n\n length = 1\n temp = head\n while temp.next:\n length += 1\n temp = temp.next\n\n slow, fast = head, head\n for _ in range(k % length):\n if fast.next:\n fast = fast.next\n else:\n fast = head\n\n if slow == fast: \n return head\n\n while fast.next:\n slow = slow.next\n fast = fast.next\n\n new_head = slow.next\n slow.next = None\n fast.next = head\n return new_head\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100848058","body":"思維:先處理無需交換的情況,透過一個 dummy 節點統一處理頭節點與後續節點的交換邏輯,每次迴圈交換一對相鄰節點,並用 pre 將已處理區與未處理區銜接起來,最後回傳 dummy 的下一個節點作為新鏈表的頭\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if not head or not head.next:\n return head\n\n left = head\n right = head.next\n dummy = ListNode(None, head)\n pre = dummy\n while right:\n left.next = right.next\n right.next = left\n pre.next = right\n pre = left\n left = left.next\n right = left.next if left else None\n\n return dummy.next\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109165432","body":"思維:有想到要計算遞迴的中心點,但一開始解不出來,參考官方題解的思路加上畫圖後思路有比較清晰\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode(object):\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution(object):\n def sortedListToBST(self, head):\n \"\"\"\n :type head: Optional[ListNode]\n :rtype: Optional[TreeNode]\n \"\"\"\n if not head:\n return head\n\n pre, slow, fast = None, head, head\n while fast and fast.next:\n fast = fast.next.next\n pre = slow\n slow = slow.next\n if pre:\n pre.next = None\n\n node = TreeNode(slow.val)\n if slow == fast:\n return node\n \n node.left = self.sortedListToBST(head)\n node.right = self.sortedListToBST(slow.next)\n return node\n```\n時間複雜度:O(NlogN)\n\n空間複雜度:O(logN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112948103","body":"思維:\n1. 使用兩個指標 a 和 b,分別從 headA 和 headB 開始走。\n2. 每當指標走到自己 linked list 的結尾時,跳到另一條 linked list 的頭部繼續走。\n3. 最終:
\n a. 若兩條 list 有交點,a 和 b 會在同一個節點交會(因為走過的總長度相同)。
\n b. 若沒有交點,a 和 b 都會變成 None,同時結束迴圈。\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, x):\n# self.val = x\n# self.next = None\n\nclass Solution:\n def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:\n a, b = headA, headB\n a_switch, b_switch = False, False\n \n while a and b:\n if a == b:\n return a\n\n a = a.next if a.next else None\n if not a and not a_switch:\n a = headB\n a_switch = True\n \n b = b.next if b.next else None\n if not b and not b_switch:\n b = headA\n b_switch = True\n\n return None\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3114228960","body":"思維:使用快慢指針來偵測是否有環存在,若有找到相遇點的話,把 fast 指針重新指向 head 後找環的起點,兩個指針 slow 和 fast 都改成一次走一步,再次相遇時就是環的起始節點\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, x):\n# self.val = x\n# self.next = None\n\nclass Solution:\n def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if not head or not head.next:\n return None\n\n slow, fast = head, head\n while fast:\n slow = slow.next\n fast = fast.next.next if fast.next else None\n if slow and slow == fast:\n fast = head \n while fast != slow:\n fast = fast.next\n slow = slow.next\n return fast\n\n return None\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3122031171","body":"思維:使用雙向鏈表搭配 Hash Map 實作 LRU Cache,讓每次的 get 和 put 操作都能在 O(1) 時間內完成。最近使用的節點會被移到鏈表頭部,當容量超過時,就從尾部刪除最久未使用的節點。\n\n代碼:\n```python\nclass ListNode:\n def __init__(self, key, value):\n self.key = key\n self.val = value\n self.next = None\n self.pre = None\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.capacity = capacity\n self.length = 0\n self.head = ListNode(None, None)\n self.tail = ListNode(None, None)\n self.head.next = self.tail\n self.tail.pre = self.head\n self.map = {}\n\n def _add_to_head(self, key: int, value: int):\n node = ListNode(key, value)\n node.next = self.head.next\n self.head.next = node\n node.next.pre = node\n node.pre = self.head\n self.map[key] = node\n self.length += 1\n\n def _remove_from_tail(self, key: int):\n remove_key = self.tail.pre.key\n self.tail.pre = self.tail.pre.pre\n self.tail.pre.next = self.tail\n self.map.pop(remove_key)\n self.length -= 1\n\n def _move_node_to_head(self, node: ListNode):\n node.pre.next = node.next\n node.next.pre = node.pre\n self.head.next.pre = node\n node.pre = self.head\n node.next = self.head.next\n self.head.next = node\n \n def get(self, key: int) -> int:\n if key in self.map:\n node = self.map[key]\n self._move_node_to_head(node)\n return self.map[key].val\n return -1\n \n def put(self, key: int, value: int) -> None:\n node = self.map.get(key)\n if node:\n self._move_node_to_head(node)\n node.val = value\n else:\n if self.length >= self.capacity:\n self._remove_from_tail(key) \n self._add_to_head(key, value)\n```\n時間複雜度:O(1)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124493359","body":"思維:DFS,透過遞迴分別計算左右子樹的最大深度,然後回傳較大的一邊再加 1(代表當前節點這一層),最終得到整棵樹的最大深度。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def maxDepth(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n return max(self.maxDepth(root.left), self.maxDepth(root.right))+1\n```\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127762191","body":"思維:DFS,透過遞歸比對兩棵樹的每個對應節點是否完全一樣,一層層往下檢查,直到整棵樹都比對完或中途不符合就結束。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if not p and not q:\n return True\n \n if p and q and p.val == q.val:\n res_left = self.isSameTree(p.left, q.left)\n res_right = self.isSameTree(p.right, q.right)\n return res_left and res_right\n\n return False\n```\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3133090654","body":"思維:DFS,透過遞歸保存當前數字的狀態,每走到下一層就把目前的 current_num 乘上 10 再加上當前節點的值,當走到葉子節點時就可以回傳目前這條路徑的數字,最後把左右子樹的 dfs 結果加總起來。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n def dfs(node, current_num):\n if not node:\n return 0\n current_num = current_num * 10 + node.val\n if not node.left and not node.right:\n return current_num\n return dfs(node.left, current_num) + dfs(node.right, current_num)\n return dfs(root, 0)\n```\n時間複雜度:O(N)\n\n空間複雜度:O(d) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135855226","body":"思維一:BFS,使用廣度優先搜尋一層層遍歷二元樹節點,並記錄每一層最先遇到的節點。每當進入新的一層,就更新目前儲存的節點為該層最左側的節點。最終回傳的是最底層最左邊那個節點的值。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n q = deque()\n res = (root,0)\n q.append((root,0))\n while q:\n node, level = q.popleft()\n cur_level = res[1]\n if level > cur_level:\n res = (node, level)\n\n if node.left:\n q.append((node.left, level+1))\n if node.right:\n q.append((node.right, level+1))\n\n return res[0].val\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(w) (max width of tree)\n\n---------\n思維二:DFS,使用深度優先搜尋遍歷整顆樹,每當遇到更深層的節點,就更新目前記錄的最左邊節點值,最終返回的是整棵樹最深層最左邊的節點值。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n def dfs(node, cur_depth, leftmost, depthest):\n if cur_depth > depthest:\n leftmost = node.val\n depthest = cur_depth\n\n if node.left:\n leftmost, depthest = dfs(node.left, cur_depth+1, leftmost, depthest)\n if node.right:\n leftmost, depthest = dfs(node.right, cur_depth+1, leftmost, depthest)\n return leftmost, depthest\n\n leftmost, depthest = dfs(root, 1, root.val, 1)\n return leftmost\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max height of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3140470104","body":"思維一:DFS
\nserialize: 使用 前序遍歷(DFS) 將樹的結構與節點值轉成 list,再轉為 JSON 字串,None 用來記錄空節點保證可逆。
\ndeserialize: 根據前序順序,遇到 None 表示空節點,遞迴還原出整棵樹的結構。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n def dfs(node):\n if not node:\n res.append(None)\n return\n\n res.append(node.val)\n dfs(node.left)\n dfs(node.right)\n\n dfs(root)\n return json.dumps(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n data = deque(json.loads(data))\n def dfs(data):\n val = data.popleft()\n if val is None:\n return\n\n node = TreeNode(val)\n node.left = dfs(data)\n node.right = dfs(data)\n return node\n \n return dfs(data)\n\n# Your Codec object will be instantiated and called as such:\n# ser = Codec()\n# deser = Codec()\n# ans = deser.deserialize(ser.serialize(root))\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)\n\n-----------------\n\n思維二:BFS
\nserialize:利用 BFS(層序遍歷)將每層節點值與空位(None)一起寫入 list,最後轉成 JSON 字串。
\ndeserialize:讀回字串後同樣使用 BFS,按順序建立節點並接上左右子節點,重建出原始二叉樹。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n queue = deque([root])\n while queue:\n node = queue.popleft()\n if node:\n res.append(node.val)\n queue.append(node.left)\n queue.append(node.right)\n else:\n res.append(None)\n\n return json.dumps(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n data = deque(json.loads(data))\n root_val = data.popleft()\n if root_val is None:\n return None\n \n root = TreeNode(root_val)\n queue = deque([root])\n while queue:\n node = queue.popleft()\n if data:\n left_val = data.popleft()\n right_val = data.popleft()\n if left_val is not None:\n left_node = TreeNode(left_val)\n node.left = left_node\n queue.append(left_node)\n if right_val is not None:\n right_node = TreeNode(right_val)\n node.right = right_node\n queue.append(right_node)\n\n return root\n\n# Your Codec object will be instantiated and called as such:\n# ser = Codec()\n# deser = Codec()\n# ans = deser.deserialize(ser.serialize(root))\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148593193","body":"思維:\n1. 對每個點 i 當作中心,計算它與所有其他點的距離\n2. 用 distance_map 統計,有多少個點與 i 的距離相同(也就是距離為 d 的點出現了幾次)\n3. 如果某個距離出現了 count 次(基本上就是超過一次的次數才會被納入計算),就能組出 count * (count - 1) 種 (j, k) boomerang(因為 (j, k), (k, j) 視為兩種組合,(count - 1) 為要扣掉已經放在前一個位置的元素)\n4. 最後把所有距離的組合數加總起來即可\n\n代碼:\n```python\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n res = 0\n for i, x in enumerate(points):\n distance_map = defaultdict(int)\n for j, y in enumerate(points):\n if i != j:\n distance_map[(y[0] - x[0])**2 + (y[1] - x[1])**2] += 1\n\n for count in distance_map.values():\n res += count * (count-1)\n\n return res\n```\n時間複雜度:O(N^2)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153175756","body":"思維:\n1. 使用雙指針 left 和 right 維護一個「不含重複字元的滑動視窗」\n2. 不斷將 right 指向的字元加入 seen\n3. 一旦發現重複字元,就從 left 開始依序從 seen 移除字元,直到這個重複字元被清掉\n4. 每次 right 移動後,更新視窗大小 right - left,維護一個最大值 max_str\n\n代碼:\n```python\nclass Solution:\n def lengthOfLongestSubstring(self, s: str) -> int:\n max_str = 0\n left = 0\n right = 0\n seen = set()\n while right < len(s):\n while s[right] in seen:\n seen.remove(s[left])\n left += 1\n seen.add(s[right])\n right += 1\n max_str = max(max_str, right-left)\n return max_str\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k) (k for number of character types)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160705635","body":"思維:\n1. 多組偏移掃描:使用 i in range(word_len) 對字串做「分組」掃描,防止錯過合法起始點\n2. 滑動視窗掃描:每次從 j 開始擷取一個單字(長度 word_len),如果這個字在 words 裡,放進 window_counter,若某個單字超出次數,移動 left(左指針)來縮小視窗,如果視窗內剛好有 word_count 個單字,加入結果\n3. 如果不是合法單字,清空 window_counter,重設 count 和 left(下一次從這個位置繼續)\n\n代碼:\n```python\nclass Solution:\n def findSubstring(self, s: str, words: List[str]) -> List[int]:\n word_len = len(words[0])\n word_count = len(words)\n total_len = word_len * word_count\n target_counter = Counter(words)\n res = []\n\n for i in range(word_len):\n left = i\n window_counter = Counter()\n count = 0\n\n for j in range(i, len(s) - word_len + 1, word_len):\n word = s[j:j+word_len]\n if word in target_counter:\n window_counter[word] += 1\n count += 1\n\n while window_counter[word] > target_counter[word]:\n left_word = s[left:left+word_len]\n window_counter[left_word] -= 1\n count -= 1\n left += word_len\n\n if count == word_count:\n res.append(left)\n\n else:\n window_counter.clear()\n count = 0\n left = j + word_len\n\n return res\n```\n時間複雜度:O(N × W) (N is length of s, W is length of words)\n\n空間複雜度:O(W)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166506559","body":"思維:使用快慢指標 (two pointers) 技巧,設兩個指標 slow 和 fast 同時指向鏈表頭,每次 slow 走一步、fast 走兩步,當 fast 到達鏈表尾時,slow 正好在中間節點。\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n\n return slow \n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172494360","body":"思維:使用雙指針來實行二分搜尋法,設定左右邊界取中間位置\n1. 如果 nums[mid] == target,直接回傳 mid(找到目標)。\n2. 如果 nums[mid] > target,代表目標在左半邊,更新 right = mid - 1。\n3. 如果 nums[mid] < target,代表目標在右半邊,更新 left = mid + 1。\n4. 迴圈結束後(left > right),left 就是目標應插入的位置。\n\n代碼:\n```python\nclass Solution:\n def searchInsert(self, nums: List[int], target: int) -> int:\n left = 0\n right = len(nums)-1\n while left <= right:\n mid = (left+right)//2\n if nums[mid] == target:\n return mid\n elif nums[mid] > target:\n right = mid-1\n else:\n left = mid+1\n return left\n```\n時間複雜度:O(logN)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173687770","body":"思維:使用單調遞減隊列來維護視窗內最大值的 index\n1. 前 k 個元素先初始化隊列:維持隊列的遞減性,每次新來的元素會移除尾部比它小的元素,q[0] 永遠是最大值的 index\n2. 接下來從 k 到結尾,維持單調性並移除過期元素:新元素進來時維持單調隊列,移除滑出視窗的 index,每次把 nums[q[0]](視窗最大值)加入結果\n\n代碼:\n```python\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n res = []\n q = deque()\n for i in range(k):\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n res.append(nums[q[0]])\n\n for i in range(k, len(nums)):\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n while q[0] <= i-k:\n q.popleft()\n res.append(nums[q[0]])\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178842909","body":"思維:\n1. 使用兩個表分別紀錄信任他人及被信任的計數\n2. 之後尋找一個人 x,滿足:trusted_tables[x] == n - 1(被其他人信任)以及 trust_tables[x] == 0:(自己沒信任任何人)\n3. 若找到這樣的人,回傳他的編號;否則回傳 -1\n\n代碼:\n```python\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n if n == 1:\n return 1\n\n trust_tables = defaultdict(int)\n trusted_tables = defaultdict(int)\n for [trust_a, trust_b] in trust:\n trust_tables[trust_a] += 1\n trusted_tables[trust_b] += 1\n\n for trusted_person, trusted_ticket in trusted_tables.items():\n if trusted_ticket == n-1 and trust_tables[trusted_person] == 0:\n return trusted_person\n return -1\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3188960333","body":"思維:\n1. 把沒群組的 item 分配新的唯一群組:這樣後面只需處理群組 id,不用特別分支處理 -1。\n2. 建立 item graph:由 prev -> curr(prev 必須在 curr 前面)。\n3. 建立 group graph:當 prev 與 curr 屬不同群組時,建立 g_prev -> g_curr 的依賴邊;用 set 避免重複邊。\n4. 對 group graph 做拓撲排序:得出 group 的一個合法順序;若有 cycle,無解回 []。\n5. 對 item graph 做拓撲排序:得出 items 在全域上的合法相對順序(若有 cycle,無解回 [])。\n6. 把 items 按 item_order 分桶到對應 group,再按 group_order 串接:同 group items 會連在一起且保持 item 之間的依賴。\n\n代碼:\n```python\nclass Solution:\n def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:\n new_group_id = m\n for i in range(n):\n if group[i] == -1:\n group[i] = new_group_id\n new_group_id += 1\n total_groups = new_group_id\n\n item_adj = [[] for _ in range(n)]\n item_indeg = [0] * n\n\n group_adj = [[] for _ in range(total_groups)]\n group_indeg = [0] * total_groups\n\n added_group_edges = set()\n\n for curr in range(n):\n for prev in beforeItems[curr]:\n item_adj[prev].append(curr)\n item_indeg[curr] += 1\n\n g_prev = group[prev]\n g_curr = group[curr]\n if g_prev != g_curr:\n if (g_prev, g_curr) not in added_group_edges:\n added_group_edges.add((g_prev, g_curr))\n group_adj[g_prev].append(g_curr)\n group_indeg[g_curr] += 1\n\n def topo_sort(num_nodes, adj, indeg):\n q = deque([i for i in range(num_nodes) if indeg[i] == 0])\n order = []\n while q:\n u = q.popleft()\n order.append(u)\n for v in adj[u]:\n indeg[v] -= 1\n if indeg[v] == 0:\n q.append(v)\n if len(order) == num_nodes:\n return order\n else:\n return []\n\n group_order = topo_sort(total_groups, group_adj, group_indeg[:])\n if not group_order:\n return []\n\n item_order = topo_sort(n, item_adj, item_indeg[:])\n if not item_order:\n return []\n\n items_by_group = defaultdict(list)\n for item in item_order:\n items_by_group[group[item]].append(item)\n\n result = []\n for g in group_order:\n result.extend(items_by_group[g])\n\n return result\n```\n時間複雜度:O(n + E)\n\n空間複雜度:O(n + m + E)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3191064414","body":"思維:依照題意模擬路徑\n\n代碼:\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n spot = [0, 0]\n for move in moves:\n if move == 'R':\n spot[0] += 1\n elif move == 'L':\n spot[0] -= 1\n elif move == 'U':\n spot[1] += 1\n else:\n spot[1] -= 1\n \n return spot == [0, 0]\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194164140","body":"思維:\n1. 解析登入、登出時間(時、分),如果登出時間早於登入時間,代表跨過午夜就加 24 小時。\n2. 重新計算登入時間:向上取整到最近的 15 分鐘倍數(因為要等到下一個完整的 15 分鐘才算開始一局)。\n3. 重新計算登出時間:向下取整到最近的 15 分鐘倍數(因為超過的部分不算完整一局)。\n4. 計算完整局數,如果結果為負數則返回 0。\n\n這裡用 (logout_hour-login_hour)*4 - login_minute/15 + logout_minute/15 直接換算成以「15 分鐘為單位」的差距。\n\n代碼:\n```python\nclass Solution:\n def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:\n login_hour, login_minute = map(int, loginTime.split(':'))\n logout_hour, logout_minute = map(int, logoutTime.split(':'))\n if logout_hour < login_hour or logout_hour == login_hour and logout_minute < login_minute:\n logout_hour += 24\n\n login_hour, login_minute = self.narrow_down_time(login_hour, login_minute, True)\n logout_hour, logout_minute = self.narrow_down_time(logout_hour, logout_minute, False)\n\n return max(0, int((logout_hour-login_hour)*4 - login_minute/15 + logout_minute/15))\n\n def narrow_down_time(self, login_hour: int, login_minute: int, is_login: bool):\n if is_login:\n login_minute = ceil(login_minute/15) * 15\n if login_minute == 60:\n login_hour += 1\n login_minute = 0\n else:\n login_minute = floor(login_minute/15) * 15\n\n return login_hour, login_minute\n```\n時間複雜度:O(1)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3196258303","body":"思維:\n1. 函式 compare_less(a_counter, b_counter):模擬條件 1、2,對所有可能分界點 ch(從 'b' 到 'z')進行遍歷
\n讓 a 的所有字母 < ch,讓 b 的所有字母 ≥ ch,使用 prefix sum 避免重複運算,計算出最少需要修改的字元數\n2. 函式 compare_distinct(a_counter, b_counter):模擬條件 3,讓兩字串變成同一種字母
\n對所有字母出現次數總和 Counter 做合併,找出現次數最多的字母後,將其餘字母通通改成這個字母,修改次數 = 總數量 - 該字母出現次數\n3. 分別計算三個條件需要的修改次數,回傳三者中的最小值\n\n代碼:\n```python\nclass Solution:\n def minCharacters(self, a: str, b: str) -> int:\n a_counter = Counter(ord(ch) for ch in a)\n b_counter = Counter(ord(ch) for ch in b)\n\n goal_a = self.compare_less(a_counter, b_counter)\n goal_b = self.compare_less(b_counter, a_counter)\n goal_c = self.compare_distinct(a_counter, b_counter)\n return min(goal_a, goal_b, goal_c)\n\n def compare_less(self, a_counter, b_counter):\n a_freq = [0] * 26\n b_freq = [0] * 26\n for k, v in a_counter.items():\n a_freq[k - ord('a')] = v\n for k, v in b_counter.items():\n b_freq[k - ord('a')] = v\n\n a_prefix = list(itertools.accumulate(a_freq))\n b_prefix = list(itertools.accumulate(b_freq))\n move = float('inf')\n for ch in range(1, 26):\n move_a = a_prefix[25] - a_prefix[ch-1]\n move_b = b_prefix[ch-1]\n move = min(move, move_a + move_b)\n return move\n\n def compare_distinct(self, a_counter, b_counter):\n all_counter = a_counter + b_counter\n most_key = max(all_counter, key=all_counter.get)\n total = sum(all_counter.values())\n return total - all_counter[most_key]\n```\n時間複雜度:O(n+m)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3201266614","body":"思維:先把所有數字用 heappush 丟進最小堆,維護「父節點 ≤ 子節點」,接著每次 heappop 拿走堆頂(最小值),直到堆空,收集出來的數列 res 就是升序排序。\n\n代碼:\n```python\nclass Solution:\n def sortArray(self, nums: List[int]) -> List[int]:\n min_heap = []\n res = []\n for num in nums:\n self.heappush(min_heap, num)\n\n while min_heap:\n res.append(self.heappop(min_heap))\n\n return res\n \n def heappush(self, h, x):\n h.append(x)\n i = len(h)-1\n\n while i > 0:\n p = (i - 1) // 2\n if h[i] < h[p]:\n h[i], h[p] = h[p], h[i]\n i = p\n else:\n break\n\n def heappop(self, h):\n last = h.pop()\n if not h:\n return last\n root = h[0]\n h[0] = last\n i = 0\n n = len(h)\n while True:\n left = 2*i + 1\n right = 2*i + 2\n if left >= n:\n break\n\n child = left\n if right < n and h[right] < h[left]:\n child = right\n if h[child] < h[i]:\n h[i], h[child] = h[child], h[i]\n i = child\n else:\n break\n return root\n```\n時間複雜度:O(n log n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204542831","body":"思維:使用二分搜尋法,對於 x ≥ 2 的情況,設定搜尋範圍為 [1, x // 2],如果 mid^2 太大,就向左縮小範圍,如果太小,就向右移動範圍,當搜尋結束(left > right)時,right 就是最接近但不超過 √x 的整數\n\n代碼:\n```python\nclass Solution:\n def mySqrt(self, x: int) -> int:\n if x < 2:\n return x\n \n left, right = 1, x // 2\n while left <= right:\n mid = (left + right) // 2\n if mid * mid == x:\n return mid\n elif mid * mid > x:\n right = mid - 1\n else:\n left = mid + 1\n\n return right\n```\n時間複雜度:O(log x)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3211104911","body":"思維:使用二分搜尋法,如果 mid 是壞的:可能是答案,但還要往左找,right = mid - 1,如果 mid 是好的:答案一定在右邊,left = mid + 1,最後 left 會停在第一個壞版本的位置。\n\n代碼:\n```python\nclass Solution:\n def firstBadVersion(self, n: int) -> int:\n left, right = 1, n\n while left <= right:\n mid = (left + right) // 2\n if isBadVersion(mid):\n right = mid - 1\n else:\n left = mid + 1\n return left\n```\n時間複雜度:O(log n)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216087383","body":"思維:\n1. 先對加熱器位置排序,才能用二分搜尋快速找到每個房子最近的加熱器\n2. 遍歷每個房子,使用二分搜尋找到第一個 heaters[mid] 大於等於當前 house 的位置(也就是最接近右邊的加熱器)\n3. 再往回看一個位置 heaters[r],也就是最接近左邊的加熱器\n4. 比較左右加熱器距離,選擇較小者\n5. 更新最大加熱半徑(最小距離中的最大值)\n\n代碼:\n```python\nclass Solution:\n def findRadius(self, houses: List[int], heaters: List[int]) -> int:\n res = 0\n heaters.sort()\n \n for house in houses:\n l, r = 0, len(heaters) - 1\n while l <= r:\n mid = (l + r) // 2\n if house <= heaters[mid]:\n r = mid - 1\n else:\n l = mid + 1\n\n l_res, r_res = inf, inf\n if 0 <= l <= len(heaters)-1:\n l_res = abs(heaters[l] - house)\n if 0 <= r <= len(heaters)-1:\n r_res = abs(heaters[r] - house)\n\n res = max(res, min(l_res, r_res))\n\n return res\n```\n時間複雜度:O(M log M + N log M) (M for length of heaters, N for length of houses)\n\n空間複雜度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3223499698","body":"思維:先初始化前 k 個字元中有多少母音,用滑動視窗維持長度為 k 的區間往右滑動,每次移動一格,視窗左邊出去一個字元、右邊進來一個字元,如果左邊移出的是母音即減 1,如果右邊移入的是母音即加 1,並且更新最大值,直到滑到最後一格為止\n\n代碼:\n```python\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n vowels = set('aeiou')\n count = sum(1 for c in s[:k] if c in vowels)\n max_count = count\n\n for i in range(k, len(s)):\n if s[i-k] in vowels:\n count -= 1\n if s[i] in vowels:\n count += 1\n max_count = max(max_count, count)\n\n return max_count\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3227824002","body":"思維:\n1. 邊界判斷:若 k == 0,不會抽牌,分數永遠是 0,且一定 ≤ n,直接回傳 1.0。若 n ≥ k + maxPts - 1,最多只能拿到 k - 1 + maxPts 分,而這些都 ≤ n,直接回傳 1.0\n2. 初始化:建立一個長度 n + 1 的 dp 陣列,dp[i] 表示拿到 i 分的機率,設定 dp[0] = 1.0(初始在 0 分),window_sum = 1.0 表示 dp[0] 的值,res = 0.0,用來累加最終結果(分數 ≥ k 的機率)\n3. 進入迴圈,從 i = 1 到 n:使用滑動視窗平均法計算 dp[i] = window_sum / maxPts,如果 i < k 代表還會繼續抽牌 → 將 dp[i] 加入 window_sum,影響後續機率,如果 i ≥ k,代表不能再抽牌了 → 將 dp[i] 加入 res,因為這是可能的最終分數\n4. 維護滑動視窗:若 i - maxPts ≥ 0,將前方的 dp[i - maxPts] 從 window_sum 中扣除,保持視窗大小為 maxPts\n5. 迴圈結束後,回傳累積的結果:回傳 res,即所有停在 k 到 n 分的總機率\n\n代碼:\n```python\nclass Solution:\n def new21Game(self, n: int, k: int, maxPts: int) -> float:\n if k == 0 or n >= k + maxPts - 1:\n return 1\n \n dp = [0.0] * (n + 1)\n dp[0] = 1.0\n window_sum = 1.0\n res = 0.0\n\n for i in range(1, n + 1):\n dp[i] = window_sum / maxPts\n if i < k:\n window_sum += dp[i]\n else:\n res += dp[i]\n\n if i - maxPts >= 0:\n window_sum -= dp[i-maxPts]\n\n return res\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3232431244","body":"思維:透過固定長度為 len(p) 的滑動視窗掃過整個字串 s,用 Counter 統計當前視窗的字元分佈\n1. 初始化兩個 Counter:target 記錄 p 的字元分佈,cur 動態維護視窗內的字元分佈\n2. 向右移動右指標 r 更新 cur,每次移動後如果 cur == target,代表此視窗是一個 anagram,res 加入 l\n3. 視窗長度若達到 len(p),就縮左邊,如果左邊的字元也在 p 中,從 cur 中減一,移動左指標 l,確保視窗長度維持為 len(p)\n\n代碼:\n```python\nclass Solution:\n def findAnagrams(self, s: str, p: str) -> List[int]:\n res = []\n target = Counter(p)\n cur = Counter()\n l, r = 0, 0\n\n while r < len(s):\n if s[r] in p:\n cur[s[r]] += 1\n \n if cur == target:\n res.append(l)\n\n r += 1\n if r - l >= len(p):\n if s[l] in p:\n cur[s[l]] -= 1\n l += 1\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235535873","body":"思維:\n1. 使用 target 記錄 t 中每個字元需要出現幾次,required 為需要達成的字元種類數,formed 表示目前有多少種字元達到目標需求\n2. 用滑動視窗 [l, r] 掃過 s\n3. 視窗內使用 cur 統計目前出現的字元次數\n4. 每當 formed == required(即目前視窗內已滿足所有字元需求),就嘗試更新最短子字串\n5. 然後移動左指標 l,直到不再滿足條件,再往右擴張 r\n\n代碼:\n```python\nclass Solution:\n def minWindow(self, s: str, t: str) -> str:\n if not s or not t or len(t) > len(s):\n return ''\n\n res = ''\n target = Counter(t)\n cur = Counter()\n required = len(target)\n formed = 0\n l = 0\n\n for r in range(len(s)):\n char = s[r]\n if char in target:\n cur[char] += 1\n if cur[char] == target[char]:\n formed += 1\n\n while formed == required:\n window = s[l:r+1]\n if not res or len(window) < len(res):\n res = window\n\n if s[l] in target:\n cur[s[l]] -= 1\n if cur[s[l]] < target[s[l]]:\n formed -= 1\n l += 1\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3241211135","body":"思維:\n1. 每一層遞迴代表一個 row(橫列),每一層嘗試在該 row 的每一個 col(直行)上放一個 Q\n2. 使用三個集合記錄不能放的位置(剪枝):used_cols:欄位不能重複、used_diag1:↘ 對角線(row - col)不能重複、used_diag2:↙ 對角線(row + col)不能重複\n3. 如果當前格子合法:將當前 col 與對角線加入對應集合,進入下一 row 繼續放皇后\n4. 如果成功放到第 n 行,代表一種合法放法,count += 1\n5. 每個回合結束後回溯:移除當前狀態,嘗試下一個 col\n\n代碼:\n```python\nclass Solution:\n def totalNQueens(self, n: int) -> int:\n count = 0\n\n def backtracking(row, used_cols, used_diag1, used_diag2):\n if row == n:\n nonlocal count \n count += 1\n return\n\n for col in range(n):\n if col in used_cols or row - col in used_diag1 or row + col in used_diag2:\n continue\n \n used_cols.add(col)\n used_diag1.add(row - col)\n used_diag2.add(row + col)\n\n backtracking(row + 1, used_cols, used_diag1, used_diag2)\n\n used_cols.remove(col)\n used_diag1.remove(row - col)\n used_diag2.remove(row + col)\n\n backtracking(0, set(), set(), set())\n\n return count\n```\n時間複雜度:O(n!)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3244207256","body":"思維:深度優先搜尋(DFS)\n1. 初始化變數: seen 避免重複拜訪相同格子、max_area記錄最大島嶼面積\n2. 走過整張地圖: 雙層 for loop,遍歷每一格 (i, j)\n3. 找到新的島嶼起點就 DFS: 如果是還沒拜訪過的陸地,就從這裡開始 DFS,算面積,回傳面積後更新 max_area\n4. DFS 拜訪所有相連陸地: 每次進來的 (row, col) 都會標記為已拜訪,area = 1 表示這一格自己先算進面積\n5. 遞迴搜尋上下左右的相連格子: 檢查鄰近 4 格是否可以繼續走,遞迴地累加 area\n6. DFS 結束後回傳這座島的面積\n\n代碼:\n```python\nclass Solution:\n direction = [(1, 0), (-1, 0), (0, 1), (0, -1)]\n\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n seen = set()\n max_area = 0\n for i in range(len(grid)):\n for j in range(len(grid[0])):\n if grid[i][j] == 1 and (i, j) not in seen:\n area = self.dfs(i, j, seen, grid)\n max_area = max(max_area, area)\n \n return max_area\n\n def dfs(self, row, col, seen, grid):\n seen.add((row, col))\n area = 1\n for dx, dy in self.direction:\n x, y = row + dx, col + dy\n if 0 <= x < len(grid) and 0 <= y < len(grid[0]) and grid[x][y] == 1 and (x, y) not in seen:\n area += self.dfs(x, y, seen, grid)\n \n return area\n```\n時間複雜度:O(m × n)\n\n空間複雜度:O(m × n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249687017","body":"思維:多源 BFS\n1. 把所有的陸地格(值為 1)當作起點,加入 queue 中\n2. 先判斷若陸地為空(全是水)或全是陸地,回傳 -1\n3. BFS 擴展每一層水格:每次從 queue 拿一個格子出來,對四個方向進行探索,如果是水(值為 0),就更新它為「距離 = 前一格 + 1」,並將它加入 queue,等下繼續擴展\n4. 最後回傳最大距離 -1:因為初始的陸地值是 1,所以水格的距離是從 2 開始計算,因此真正的距離 = 格子值 - 1\n\n代碼:\n```python\nclass Solution:\n def maxDistance(self, grid: List[List[int]]) -> int:\n q = deque()\n for i in range(len(grid)):\n for j in range(len(grid[0])):\n if grid[i][j] == 1:\n q.append((i, j))\n \n if not q or len(q) == len(grid) * len(grid):\n return -1\n\n directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]\n max_dist = 0\n while q:\n x, y = q.popleft()\n for dx, dy in directions:\n nx = x + dx\n ny = y + dy\n if 0 <= nx < len(grid) and 0 <= ny < len(grid[0]) and grid[nx][ny] == 0:\n grid[nx][ny] = grid[x][y] + 1\n q.append((nx, ny))\n max_dist = max(max_dist, grid[nx][ny])\n\n return max_dist - 1\n```\n時間複雜度:O(n^2)\n\n空間複雜度:O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251575584","body":"思維:\n1. 把初始擁有箱子(initialBoxes)能打開的箱子(status = 1)加入 queue\n2. 使用 queue 處理可以打開的箱子,如果已經處理過的話則跳過\n3. 開箱拿糖果後,處理新拿到的箱子鑰匙,把鑰匙對應到已擁有且未開啟過的 box 加入 queue\n4. 處理新拿到的箱子,如果箱子可以直接打開或擁有鑰匙就加進 queue,否則放進 own_boxes 等待日後有拿到 key 再打開\n5. 整個流程直到 queue 為空,表示目前已經沒能力再開更多箱子了,回傳總糖果數量\n\n代碼:\n```python\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n own_boxes = set(initialBoxes)\n own_keys = set()\n visited = set()\n q = deque()\n total_candies = 0\n\n for box in initialBoxes:\n if status[box] == 1:\n q.append(box)\n \n while q:\n box = q.popleft()\n if box in visited:\n continue\n\n total_candies += candies[box]\n visited.add(box)\n \n for key in keys[box]:\n own_keys.add(key)\n if key in own_boxes and key not in visited:\n q.append(key)\n\n for new_box in containedBoxes[box]:\n own_boxes.add(new_box)\n if (status[new_box] == 1 or new_box in own_keys) and new_box not in visited:\n q.append(new_box) \n\n return total_candies\n```\n時間複雜度:O(n+k)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3256863525","body":"思維:\n1. 廣度優先搜尋 (BFS) 遍歷樹,使用 deque 從 root 開始,記錄每個節點的座標\n2. 收集節點資訊,每個節點存成 (x, y, val),加入 nodes 列表\n3. 排序節點,按照題目規則排序:y(由左到右),x(由上到下),val(同位置時數字小的先)\n4. 按列分組,掃描排序後的 nodes,根據 y 值變化劃分列表\n5. 回傳結果,res 即 vertical order traversal 的輸出。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:\n nodes = []\n q = deque([(root, 0, 0)])\n while q:\n node, x, y = q.popleft()\n nodes.append((x, y, node.val))\n if node.left:\n q.append((node.left, x+1, y-1))\n if node.right:\n q.append((node.right, x+1, y+1))\n\n nodes.sort(key=lambda x: (x[1], x[0], x[2]))\n res = []\n cur_y = None\n for _, y, val in nodes:\n if y != cur_y:\n res.append([val])\n cur_y = y\n else:\n res[-1].append(val)\n\n return res\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260998230","body":"思維:\n1. 定義狀態 dp[i] 表示「到達第 i 階的最小花費」\n2. 每次要到達第 i 階,有兩種方式:從第 i-1 階踩一階上來 → 花費 = dp[i-1] + cost[i-1] or 從第 i-2 階踩兩階上來 → 花費 = dp[i-2] + cost[i-2]\n3. 所以取較小值 dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n4. 我們要到達頂樓 = len(cost),因此答案是 dp[-1](即 dp[len(cost)])\n\n代碼:\n```python3\nclass Solution:\n def minCostClimbingStairs(self, cost: List[int]) -> int:\n dp = [0] * (len(cost) + 1)\n for i in range(2, len(cost) + 1):\n dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n\n return dp[-1]\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263817074","body":"思維:\n1. 如果只有一間房子,直接回傳 nums[0]\n2. 初始化 dp 陣列,建立一個長度與 nums 相同的陣列 dp,dp[i] 表示考慮到第 i 間房子時,選擇偷這間房子,能得到的最大金額\n3. 填入前兩個房子:如果 i < 2,直接偷這間房子\n4. 狀態轉移(從 i=2 開始),偷第 i 間房的前提是不能偷相鄰的,所以考慮搭配 i-2 或搭配 i-3 的最佳解\n5. 最後答案一定是偷到倒數第 1 間(dp[-1])或倒數第 2 間(dp[-2]),取最大值\n\n代碼:\n```python\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n if len(nums) == 1:\n return nums[0]\n\n dp = [0] * len(nums)\n for i, num in enumerate(nums):\n if i < 2:\n dp[i] = num\n else:\n dp[i] = max(dp[i-2] + num, dp[i-3] + num)\n\n return max(dp[-1], dp[-2])\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3264481892","body":"思維:\n1. dp[i]: 表示以 nums[i] 結尾的 LIS 最長長度、count[i]: 表示有多少組 LIS 長度等於 dp[i] 是以 nums[i] 結尾的\n2. 對每個 i,檢查它前面的每個 j,如果 nums[j] < nums[i],則可以將 nums[i] 接在 nums[j] 後面\n3. 如果接在 j 後面可以讓序列更長(dp[j] + 1 > dp[i]),則更新 dp[i] = dp[j] + 1,並且把組數設為 count[i] = count[j]\n4. 如果接在 j 後面剛好等長(dp[j] + 1 == dp[i]),則表示找到另一條一樣長的走法,所以把組數加進來 count[i] += count[j]\n5. 最後找出所有 dp[i] == max_len 的位置,把它們對應的 count[i] 加總起來\n\n代碼:\n```python\nclass Solution:\n def findNumberOfLIS(self, nums: List[int]) -> int:\n n = len(nums)\n dp = [1] * n\n count = [1] * n\n\n for i in range(n):\n for j in range(i):\n if nums[j] < nums[i]:\n if dp[j] + 1 > dp[i]:\n dp[i] = dp[j] + 1\n count[i] = count[j]\n elif dp[j] + 1 == dp[i]:\n count[i] += count[j]\n\n max_len = max(dp)\n return sum(c for i, c in enumerate(count) if dp[i] == max_len)\n```\n時間複雜度:O(n^2)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269134596","body":"思維:\n1. 設 dp[i][j] = text1[:i] 與 text2[:j] 的最長共同子序列長度\n2. 如果其中一個字串長度為 0 → LCS = 0,所以 dp[0][*] 和 dp[*][0] 全部設為 0\n3. 如果 text1[i-1] == text2[j-1],這個字元可以加入 LCS → dp[i][j] = dp[i-1][j-1] + 1\n4. 否則這個字元不能同時出現在 LCS,只能丟掉其中一個字元,取兩種情況最大值 → dp[i][j] = max(dp[i-1][j], dp[i][j-1])\n5. 回傳 dp[-1][-1](表格右下角)就是最終答案\n\n代碼:\n```python\nclass Solution:\n def longestCommonSubsequence(self, text1: str, text2: str) -> int:\n m = len(text1)\n n = len(text2)\n dp = [[0]*(n+1) for _ in range(m+1)]\n \n for i in range(1, m+1):\n for j in range(1, n+1):\n if text1[i-1] == text2[j-1]:\n dp[i][j] = dp[i-1][j-1] + 1\n else:\n dp[i][j] = max(dp[i-1][j], dp[i][j-1])\n\n return dp[-1][-1]\n```\n時間複雜度:O(m * n)\n\n空間複雜度:O(m * n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273520377","body":"思維:\n1. 機器人從左上角走到右下角,只能往下或往右,所以每個格子的路徑數 = 從上方來的路徑數 + 從左方來的路徑數\n2. 狀態定義:dp[i][j] = 從起點 (0,0) 到 (i,j) 的路徑數\n3. 初始化所有路徑都是 1,主要是第一行、第一列只能直走一條路徑因此都是 1\n4. dp[i][j] 的路徑數就等於 dp[i−1][j] (從上方來的路徑數) + dp[i][j−1] (從左方來的路徑數)\n5. 最後答案取右下角 dp[m-1][n-1]\n\n代碼:\n```python\nclass Solution:\n def uniquePaths(self, m: int, n: int) -> int:\n dp = [[1] * n for _ in range(m)]\n for i in range(1, m):\n for j in range(1, n):\n dp[i][j] = dp[i-1][j] + dp[i][j-1]\n \n return dp[m-1][n-1]\n```\n時間複雜度:O(m * n)\n\n空間複雜度:O(m * n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3278614246","body":"思維:\n1. 狀態定義:dp[r][c] = 騎士在走了 t 步之後,位於 (r,c) 的機率\n2. 初始化:t=0 時,起點 (row, column) 的機率 = 1.0,其他位置 = 0.0\n3. 狀態轉移:從 (r,c) 出發,分散到 8 個可能位置。每一個合法位置的機率 += dp[r][c] / 8\n4. 重複 k 次:每一步產生新的棋盤機率分佈,並用新的棋盤機率更新 dp 陣列\n5. 回傳答案:把整個棋盤上機率加總,就是騎士還在棋盤上的總機率\n\n代碼:\n```python\nclass Solution:\n def knightProbability(self, n: int, k: int, row: int, column: int) -> float:\n dp = [[0.0] * n for _ in range(n)]\n dp[row][column] = 1.0\n positions = [(-1, 2), (-1, -2), (-2, 1), (-2, -1), (1, 2), (1, -2), (2, 1), (2, -1)]\n\n for i in range(k):\n next_dp = [[0.0] * n for _ in range(n)]\n for r in range(n):\n for c in range(n):\n if dp[r][c] > 0:\n for dr, dc in positions:\n nr, nc = r + dr, c + dc\n if 0 <= nr < n and 0 <= nc < n:\n next_dp[nr][nc] += dp[r][c] / 8.0\n dp = next_dp \n\n return sum(sum(row) for row in dp)\n```\n時間複雜度:O(k * n^2)\n\n空間複雜度:O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3285759121","body":"思維:\n1. 如果 1+2+…+max < desiredTotal → 永遠湊不到目標 → return False\n2. 如果 desiredTotal ≤ maxChoosableInteger → 先手一次就贏 → return True\n3. 用 bitmask mask 記錄哪些數字已被選過,用 remain 記錄距離目標還差多少\n4. 遞迴判斷 (dfs) 嘗試每一個未被選過的數字 num\n5. 如果 num ≥ remain → 我馬上贏 → return True,否則進入新狀態 (new_mask, remain-num),讓對手繼續\n6. 如果對手在新狀態輸(dfs 回 False)→ 我必勝 → return True\n7. 如果沒有任何選擇能讓我贏 → return False\n\n代碼:\n```python\nclass Solution:\n def canIWin(self, maxChoosableInteger: int, desiredTotal: int) -> bool: \n total_sum = (1 + maxChoosableInteger) * maxChoosableInteger / 2\n if total_sum < desiredTotal:\n return False\n if desiredTotal <= maxChoosableInteger:\n return True\n \n @lru_cache(None)\n def dfs(mask, remain):\n for num in range(1, maxChoosableInteger + 1):\n if not mask & (1 << (num-1)):\n if num >= remain:\n return True\n new_mask = mask | (1 << (num-1))\n if not dfs(new_mask, remain - num):\n return True\n return False\n\n return dfs(0, desiredTotal)\n```\n時間複雜度:O(m * 2^m)\n\n空間複雜度:O(2^m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3287665138","body":"思維:\n1. 如果 nums 的總和是奇數,不可能分成兩組相等 → return False\n2. 否則,目標和 = 總和 / 2\n3. 狀態定義:dp[i][j] = 是否可以用前 i 個數字湊出和 j\n4. 初始化:dp[0][0] = True(不用任何數字就能湊出 0),dp[0][j>0] = False(不用數字不可能湊出正數)\n5. 若 j < nums[i-1] → 這個數太大,不能用因此只能 → dp[i][j] = dp[i-1][j]\n6. 若 j ≥ nums[i-1] → 可以選用或不用這個數 → dp[i][j] = dp[i-1][j] or dp[i-1][j - nums[i-1]]\n7. 最後看 dp[n][target],如果 True → 代表能找到一個子集和 = target → 表示 nums 可分成兩組\n\n代碼:\n```python\nclass Solution:\n def canPartition(self, : List[int]) -> bool:\n if sum(nums) % 2 > 0:\n return False\n target = sum(nums) // 2\n\n dp = [[False] * (target + 1) for _ in range(len(nums) + 1)]\n dp[0][0] = True\n for i in range(1, len(nums) + 1):\n for j in range(target + 1):\n if j < nums[i-1]:\n dp[i][j] = dp[i-1][j]\n else:\n dp[i][j] = dp[i-1][j] or dp[i-1][j-nums[i-1]]\n\n return dp[len(nums)][target]\n```\n時間複雜度:O(n * m) (n for length of nums, m for target)\n\n空間複雜度:O(n * m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289413390","body":"思維:\n1. 要找能不能在 nums 前加上 + 或 -,最後湊成 target,等價於找一個子集,使總和 = (sum(nums)+target)/2 = p\n2. 如果 abs(target) > sum → 超過總和,必然無解,如果 sum + target 是奇數 → p 不是整數,也必然無解\n3. 狀態定義:dp[j] = 方法數,表示能湊出和為 j 的子集數量\n4. 初始化:dp[0] = 1 → 空集合能湊出 0 的方法只有 1 種\n5. 狀態轉移:遍歷每個數字 num,倒序更新,如果能湊出 j-num,再加上 num 就能湊出 j\n6. 答案回傳 dp[p],也就是湊出和為 p 的方法數\n\n代碼:\n```python\nclass Solution:\n def findTargetSumWays(self, nums: List[int], target: int) -> int:\n if abs(target) > sum(nums) or (sum(nums) + target) % 2 > 0:\n return 0\n\n p = (sum(nums) + target) // 2\n dp = [0] * (p + 1)\n dp[0] = 1\n for i in range(len(nums)):\n for j in range(p, nums[i]-1, -1):\n dp[j] += dp[j-nums[i]]\n\n return dp[p]\n``` \n時間複雜度:O(n * p) \n\n空間複雜度:O(p)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290383887","body":"思維:\n1. 初始化建立 dp 陣列,長度為 amount+1,全部設成無窮大 inf,代表一開始不可達\n2. 設 dp[0] = 0,表示湊 0 元不需要硬幣\n3. 外層金額 i 從 1 跑到 amount,內層對每個硬幣 coin 嘗試\n4. 如果 i - coin >= 0,表示可用這枚硬幣,更新 dp[i] = min(dp[i], dp[i - coin] + 1) (選湊出 i 元的最少硬幣數,看最後一枚硬幣選哪個面額)\n5. 回傳答案如果 dp[amount] 還是 inf,代表不可達回傳 -1,否則回傳 dp[amount]\n\n代碼:\n```python\nclass Solution:\n def coinChange(self, coins: List[int], amount: int) -> int:\n dp = [inf] * (amount + 1)\n dp[0] = 0\n for i in range(1, amount+1):\n for coin in coins:\n if i - coin >= 0:\n dp[i] = min(dp[i], dp[i - coin]+1)\n \n return dp[amount] if dp[amount] != inf else -1\n```\n時間複雜度:O(m × n) (m for amount, n for length of coins)\n\n空間複雜度:O(m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3299125872","body":"思維:\n1. 昨天的題目需考慮排列數(考慮順序),今天的題目僅需考慮組合數(不考慮順序)\n2. 定義 dp[i] = 湊出金額 i 的 組合數\n3. dp[0] = 1:湊出 0 元只有一種方式,什麼都不拿,其餘 dp[i] = 0,表示一開始還沒有任何組合\n4. 外層迴圈:逐一考慮硬幣 coin,內層迴圈:從金額 coin 開始到 amount 逐步更新\n5. dp[i] += dp[i - coin]:若要湊出金額 i,可以先用一個 coin,剩下的 i - coin 由之前的組合補上\n6. 避免重複排列,因為外層是硬幣,每一種硬幣只能在自己之後加入,確保順序不會被重複計算\n7. 回傳答案 dp[amount] 即為湊出總金額的組合數\n\n代碼:\n```python\nclass Solution:\n def change(self, amount: int, coins: List[int]) -> int:\n dp = [0] * (amount + 1)\n dp[0] = 1\n for coin in coins:\n for i in range(coin, amount+1):\n dp[i] += dp[i - coin]\n\n return dp[amount]\n```\n時間複雜度:O(m × n) (m for amount, n for length of coins)\n\n空間複雜度:O(m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3301195823","body":"思維:\n1. 排序貪心:把 g(貪心值)與 s(餅乾大小)都排序\n2. 從大的開始配對:i 指向最大餅乾,j 指向最難滿足的小孩\n3. 若 s[i] >= g[j],就把這片大餅乾給這個小孩,否則,去嘗試滿足下一個(較不貪心)孩子\n5. 結束條件:任一方用完即停止,輸出成功配對數 res\n\n代碼:\n```python\nclass Solution:\n def findContentChildren(self, g: List[int], s: List[int]) -> int:\n g.sort()\n s.sort()\n i = len(s)-1\n j = len(g)-1\n res = 0\n \n while i >= 0 and j >= 0:\n if s[i] >= g[j]:\n res += 1\n i -= 1\n j -= 1\n\n return res\n```\n時間複雜度:O(nlogn+mlogm) (sorting)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3305048523","body":"思維:\n1. 先依 start 排序,若 start 相同則依 end 排序\n2. 用 prev_end 記錄上一次保留的區間結束\n3. 遍歷:如果當前區間 cur_start < prev_end → 代表重疊\n4. 若 cur_end < prev_end → 保留更早結束的區間(更新 prev_end)\n5. 不管怎樣,重疊就要刪掉一個,res += 1\n6. 否則(不重疊) → 更新 prev_end = cur_end\n7. 回傳刪除數量\n\n代碼:\n```python\nclass Solution:\n def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:\n intervals = sorted(intervals)\n prev_end = intervals[0][1]\n res = 0\n\n for i in range(1, len(intervals)):\n cur_start, cur_end = intervals[i]\n if cur_start < prev_end:\n if cur_end < prev_end:\n prev_end = cur_end\n res += 1\n else:\n prev_end = cur_end\n \n return res\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3310296356","body":"思維:\n1. 初始化設定 farthest = 0,代表目前能到達的最遠位置(初始只能到 index 0)\n2. 遍歷陣列依序檢查每個位置檢查是否可達:i = 當前所在索引,step = 在這個位置能往前跳的最大步數\n3. 如果 i > farthest,表示這個位置已經超過了之前能到的最遠範圍 → 代表根本走不到這裡 → 直接回傳 False\n4. 否則更新最遠範圍 farthest = max(farthest, i + step)\n5. 結束迴圈能完整跑完,代表沒有遇到無法到達的位置,直接回傳 True(一定能到達最後一格)\n\n代碼:\n```python\nclass Solution:\n def canJump(self, nums: List[int]) -> bool:\n farthest = 0\n for i, step in enumerate(nums):\n if i > farthest:\n return False\n farthest = max(farthest, i + step)\n return True\n```\n時間複雜度:O(n)\n\n空間複雜度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/73#issuecomment-3317351262","body":"思維:\n1. Base Case: n=1 → [1]、n=2 → [1,2]\n2. 把問題拆成奇數子問題 (長度 = (n+1)//2) 和偶數子問題 (長度 = n//2),避免等差數列的產生\n3. 奇數組跟偶數組內分別都是從一個更小的 beautiful array 轉換來的,本身不會產生違規的等差數列\n4. 如果一邊是奇數、一邊是偶數,它們的平均數會是小數(不是整數),但我們的陣列只包含整數,不可能命中,所以跨組之間絕對安全\n5. 奇數子問題的結果全部轉換成奇數(2*x-1)\n6. 偶數子問題的結果全部轉換成偶數(2*x)\n7. 把奇數陣列與偶數陣列串接在一起,得到長度 n 的 beautiful array\n\n代碼:\n```python\nclass Solution:\n def beautifulArray(self, n: int) -> List[int]:\n if n == 1:\n return [1]\n if n == 2:\n return [1, 2]\n\n odd_arr = [x*2 -1 for x in self.beautifulArray((n+1) // 2)]\n even_arr = [x*2 for x in self.beautifulArray(n // 2)]\n \n return odd_arr + even_arr\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322731377","body":"思維:\n1. 所有數字 XOR 一遍,因為成對的數字會抵消掉 (a ^ a = 0),最後剩下的是 xor_all = x ^ y\n2. 這裡的 x, y 就是我們要找的兩個只出現一次的數字\n3. 找到一個區分 x, y 的 bit,因為 x != y,xor_all 至少有一個 bit = 1,代表 x 和 y 在那一位不同\n4. 用 diff_bit = xor_all & (-xor_all) 取出最低 set bit (最右邊的 1)\n5. 根據這個 diff_bit 把數字分組,如果 (num & diff_bit) != 0 → 放在組 A,否則 → 放在組 B\n6. 各組再 XOR 一遍,成對數字會互相抵消,只剩下唯一的 x 或 y\n7. 最後兩組結果就是 [x, y]\n\n代碼:\n```python\nclass Solution:\n def singleNumber(self, nums: List[int]) -> List[int]:\n xor_all = 0\n for num in nums:\n xor_all ^= num\n\n diff_bit = xor_all & (-xor_all)\n\n x, y = 0, 0\n for num in nums:\n if num & diff_bit:\n x ^= num\n else:\n y ^= num\n\n return [x, y]\n```\n時間複雜度:O(n)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3326355904","body":"思維:\n1. 把長度為 n 的陣列 nums 想成有 n 個開關(bit),一個整數 mask 的二進位表示,就代表一個子集合,mask 從 0 走到 (1<> i) & 1 == 1,代表第 i 位被選中 → subset.append(nums[i]),最後把 subset 加進 res\n4. 回傳結果 res\n\n代碼:\n```python\nclass Solution:\n def subsets(self, nums: List[int]) -> List[List[int]]:\n n = len(nums)\n res = []\n for mask in range(1 << n):\n subset = []\n for i in range(n):\n if (mask >> i) & 1:\n subset.append(nums[i])\n res.append(subset)\n\n return res\n```\n時間複雜度:O(n · 2^n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3332654533","body":"思維:\n1. TrieNode 結構:children 字典,用來存放「下一個字元 → 子節點」,hasword 標記當前節點是否對應一個完整單詞\n2. Trie 主類別:insert(word) 從 root 出發逐字檢查,若不存在就新建節點,最後節點標記 hasword = True\n3. search(word) 從 root 出發逐字檢查,若遇到缺失字元,直接回傳 False,結束後檢查最後節點的 hasword,若 True 表示單詞存在\n4. startsWith(prefix) 與 search 類似,但不需檢查 hasword,只要能走到 prefix 的最後一個節點就回傳 True\n\n代碼:\n```python\nclass TrieNode:\n def __init__(self):\n self.children = {}\n self.hasword = False\n\n\nclass Trie:\n def __init__(self):\n self.head = TrieNode()\n \n def insert(self, word: str) -> None:\n cur = self.head\n for c in word:\n if c not in cur.children:\n cur.children[c] = TrieNode()\n cur = cur.children[c]\n cur.hasword = True\n\n def search(self, word: str) -> bool:\n cur = self.head\n for c in word:\n if c not in cur.children:\n return False\n cur = cur.children[c]\n\n return cur.hasword\n\n def startsWith(self, prefix: str) -> bool:\n cur = self.head\n for c in prefix:\n if c not in cur.children:\n return False\n cur = cur.children[c]\n return True\n \n\n# Your Trie object will be instantiated and called as such:\n# obj = Trie()\n# obj.insert(word)\n# param_2 = obj.search(word)\n# param_3 = obj.startsWith(prefix)\n```\n時間複雜度:O(n) (Insert, search, startsWith)\n\n空間複雜度:O(n) (Insert) / O(1) (search, startsWith)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3337545631","body":"思維:\n1. TrieNode 結構:children 存子節點,precount 紀錄該節點以下所有 key 對應值的總和(前綴總和),count 紀錄如果這裡是完整單字,記錄它的 value\n2. insert(key, val):逐字往下走,若不存在就新建節點,每走過一個節點 → precount += val(加上新值)\n3. 如果這個 key 之前沒出現過 → 直接存 count = val,如果 key 已經存在 → 先取出舊值 deduct = cur.count,再更新 count = val\n4. 最後重新走一遍 key,把前綴總和扣掉原本的舊值 precount -= deduct\n5. sum(prefix):從 root 開始逐字走 prefix,如果 prefix 路徑不存在 → 回傳 0,如果存在 → 回傳最後節點的 precount\n\n代碼:\n```python\nclass TrieNode:\n def __init__(self):\n self.children = {}\n self.precount = 0\n self.count = 0\n\nclass MapSum:\n\n def __init__(self):\n self.head = TrieNode()\n\n def insert(self, key: str, val: int) -> None:\n cur = self.head\n for c in key:\n if c not in cur.children:\n cur.children[c] = TrieNode()\n cur = cur.children[c]\n cur.precount += val\n\n if not cur.count:\n cur.count = val\n else:\n deduct = cur.count\n cur.count = val\n cur = self.head\n for c in key:\n cur = cur.children[c]\n cur.precount -= deduct\n \n\n def sum(self, prefix: str) -> int:\n cur = self.head\n for c in prefix:\n if c not in cur.children:\n return 0\n cur = cur.children[c]\n return cur.precount\n\n\n# Your MapSum object will be instantiated and called as such:\n# obj = MapSum()\n# obj.insert(key,val)\n# param_2 = obj.sum(prefix)\n```\n時間複雜度:O(n) (Insert, sum)\n\n空間複雜度:O(n) (Insert) / O(1) (sum)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3355772609","body":"思維:\n1. 任何不包含 1 的子樹應該被刪掉,若節點值是 0,且左右子樹都不存在或都被刪光,那這個節點也該刪\n2. 從下往上考慮 → 遞迴後序遍歷 (post-order),先處理左右子樹,回傳「修剪後的子樹」,再決定當前節點要不要刪除\n3. 若節點是 None,直接回傳 None\n4. 遞迴:修剪左子樹 root.left = pruneTree(root.left)、修剪右子樹 root.right = pruneTree(root.right)\n5. 判斷若 root.val == 0 且 root.left == None 且 root.right == None → 回傳 None,否則保留節點\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def pruneTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:\n if not root:\n return None\n\n root.left = self.pruneTree(root.left)\n root.right = self.pruneTree(root.right)\n\n if root.val == 0 and not root.left and not root.right:\n return None\n\n return root\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null],"zechengze":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074243047","body":"### Time complexity\nO(max(n, log₁₀(k)))\n\n### Space complexity\nO(max(n, log₁₀(k)))\n\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n ans = []\n n = len(num)\n carry = 0\n i = n - 1\n while k > 0 or i >= 0 or carry > 0:\n sum = carry\n if k > 0:\n rem = k % 10\n sum += rem\n k //= 10\n if i >= 0:\n sum += num[i]\n i -= 1\n carry = sum // 10\n ans.insert(0, sum % 10)\n return ans","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092419843","body":"使用兩個 stack:\n- in_stack: 用來接收 push\n- out_stack: 用來處理 pop 和 peek\n- 當 out_stack 為空時,將 in_stack 的所有元素彈出並倒序放入 out_stack,用來模擬 queue 的 FIFO\n\n - push:O(1)\n - pop:O(1)\n - peek:O(1)\n - empty :O(1)\n\n---\n\n### Python code\n\n```python\nclass MyQueue:\n\n def __init__(self):\n self.in_stack = []\n self.out_stack = []\n\n def push(self, x: int) -> None:\n self.in_stack.append(x)\n\n def pop(self) -> int:\n self.peek() # 確保 out_stack 有東西\n return self.out_stack.pop()\n\n def peek(self) -> int:\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack[-1]\n\n def empty(self) -> bool:\n return not self.in_stack and not self.out_stack","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109185662","body":"### 解題思路\n- 先統計整個 linked list 長度。\n- 使用遞迴,每次選擇區間的中間當作 root。\n- 左子樹遞迴後才處理當前節點。\n\n時間 O(n) 每個節點遍歷一次\n\n```python\nclass Solution:\n def sortedListToBST(self, head: ListNode) -> TreeNode:\n def getLength(node: ListNode) -> int:\n length = 0\n while node:\n length += 1\n node = node.next\n return length\n\n def buildBST(start: int, end: int) -> TreeNode:\n nonlocal head\n if start > end:\n return None\n\n mid = (start + end) // 2\n # 先建左子樹\n left = buildBST(start, mid - 1)\n\n # 再建 root(中序)\n root = TreeNode(head.val)\n head = head.next\n\n # 最後建右子樹\n root.left = left\n root.right = buildBST(mid + 1, end)\n return root\n\n length = getLength(head)\n return buildBST(0, length - 1)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124485354","body":"### 思路\n- 遞迴 DFS\n- 如果節點為空,深度為 0。\n- 遞迴左右子樹的最大深度,取最大值後 +1。\n\n---\n\n### 遞迴 DFS(Top-down)\n\n```python\nclass Solution:\n def maxDepth(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136873834","body":"### BFS(反向遍歷)\n\n- 一般 BFS 是左先入,改為右先入左後入\n- 最後訪問的節點就是最底層最左側的節點\n- 每次 `popleft()` 拿出的節點覆蓋 `leftmost`\n- 時間複雜度 : O(n)\n---\n\n```python\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n if not root:\n return None\n \n queue = deque([root])\n leftmost = None\n\n while queue:\n leftmost = queue.popleft()\n if leftmost.right:\n queue.append(leftmost.right)\n if leftmost.left:\n queue.append(leftmost.left)\n\n return leftmost.val\n","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146260024","body":"### 解題思路:哈希表(一次遍歷)\n\n1. 初始化一個空dict h\n2. 遍歷陣列 nums,對每個元素 nums[i]:\n - 計算 plus = target - nums[i]\n - 如果 plus 的值在字典中,回傳 [h[plus], i]\n - else 將 nums[i] 存入 dict 中\n\n- 時間、空間複雜度:O(n)\n\n---\n```python\nclass Solution:\n def twoSum(self, nums: List[int], target: int) -> List[int]:\n h = {}\n for i in range(len(nums)):\n plus = target - nums[i]\n if plus in h:\n return [h[plus], i]\n else:\n h[nums[i]] = i","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148509431","body":"### 解題思路:哈希表 + 排序\n\n1. 先用 dict 統計每個元素出現的次數\n2. 使用 sorted 對 dict 依據頻率降序排序\n3. 取出前 k 個 keys 回傳\n\n- 時間複雜度:O(n log n)\n\n---\n\n```python\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n h_map = {}\n for i in nums:\n if i in h_map:\n h_map[i] += 1\n else:\n h_map[i] = 1\n\n h_map = dict(sorted(h_map.items(), key=lambda x: x[1], reverse=True))\n ans = list(h_map.keys())[:k]\n return ans\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170662667","body":"## 解題思路\n陣列已排序,相同的元素一定會相鄰,因此可以使用雙指針: \n1. 設定指標 `init` 指向下個唯一值要放置的位置,初始為 1。 \n2. 從第二個元素開始遍歷,若與前一個元素不同,則將該元素放到 `init` 位置並將 `init` 加 1。 \n3. 最後 `init` 即為去重後的長度。\n\n---\n\n## 時間複雜度\n- **O(n)**:只需遍歷一次陣列。\n\n## 空間複雜度\n- **O(1)**:在原陣列上進行操作,未使用額外空間。\n\n---\n\n## 程式碼\n```python\nfrom typing import List\n\nclass Solution:\n def removeDuplicates(self, nums: List[int]) -> int:\n init = 1\n for i in range(1, len(nums)):\n if nums[i] != nums[i - 1]:\n nums[init] = nums[i]\n init += 1\n return init\n```\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182007045","body":"### 解題思路\n1. 將 `dislikes` 轉換為 **圖的鄰接表** `dislike_table`。\n2. 使用顏色標記(`BLUE = 1`, `GREEN = -1`)來表示兩組人。\n3. 對每個尚未染色的人進行 DFS:\n - 將當前人染色為某一顏色。\n - 對於他不喜歡的人,必須染成相反顏色。\n - 如果發現相鄰節點顏色與自己相同,則表示無法二分。\n4. 如果所有人都能正確染色,則回傳 `True`。\n\n---\n\n```python\nfrom collections import defaultdict\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, N: int, dislikes: List[List[int]]) -> bool:\n BLUE, GREEN = 1, -1\n \n def draw(person_id, color):\n color_of[person_id] = color\n for the_other in dislike_table[person_id]:\n if color_of[the_other] == color:\n return False\n if not color_of[the_other] and not draw(the_other, -color):\n return False\n return True\n \n if N == 1 or not dislikes:\n return True\n \n dislike_table = defaultdict(list)\n color_of = defaultdict(int)\n \n for p1, p2 in dislikes:\n dislike_table[p1].append(p2)\n dislike_table[p2].append(p1)\n \n for person_id in range(1, N + 1):\n if not color_of[person_id] and not draw(person_id, BLUE):\n return False\n \n return True","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mr-kient":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074503694","body":"### 【Day 1】989. 数组形式的整数加法\n\n#### Main Idea\n\n1. Since the length of `num` can reach 10000, a brute-force approach of adding each digit of `num` multiplied by 10^[n-i] to form a number and then adding it to K is not feasible, as it would cause an overflow.\n\n2. We can simulate manual vertical calculation by reversing the array and starting the addition from the last digit of both `num` and `k`.\n\n3. Set a global variable `ex` to determine if a carry is needed when adding each digit.\n\n > [!NOTE]\n > Remember to check if there is a carry after adding the first digit.\n\n4. If an array index exceeds the limit, treat it as 0; if `k` is shorter than `num`, treat the remaining digits of `k` as 0.\n\n\n#### Code\n\n```cpp\nclass Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n int n = num.size();\n vector res;\n int ex = 0;\n int i = n - 1;\n\n while (i >= 0 || k > 0) {\n int x = (i >= 0) ? num[i] : 0; //k可能比num长\n int y = k % 10;\n int sum = x + y + ex;\n res.push_back(sum % 10);\n ex = sum / 10;\n k /= 10;\n i--;\n }\n\n if (ex)\n res.push_back(ex);\n\n reverse(res.begin(), res.end());\n\n return res;\n }\n};\n```\n\n#### Complexity\n\n$O(Max(num.size(), log(k)))$","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3076134448","body":"### **【Day 2】821. 字符的最短距离**\n\n#### Main idea\n\n1. Two linear traversals: The first one records the distance from each `s[i]` to the previous `c` from left to right; The second time, from right to left, update the minimum distance compared to the previous distance\n2. ⚠️ Note: During the two initializations, the first initialization should be very small because there will be no appearance of `c` after traversing to the right for a long time. If the setting is not small enough, it will result in an insufficiently large distance value, which will affect the update of the correct value from right to left in the second traversal\n\n```cpp\nclass Solution {\npublic:\n vector shortestToChar(string s, char c) {\n int n = s.size();\n vector res(n, n);\n int c_id = -n;\n\n for (int i = 0; i < n; i++) {\n\n if (s[i] == c) {\n c_id = i;\n }\n res[i] = i - c_id;\n }\n\n c_id = 2 * n;\n\n for (int j = n - 1; j >= 0; j--) {\n if (s[j] == c) {\n c_id = j;\n }\n\n res[j] = min(res[j], c_id - j);\n }\n\n return res;\n }\n};\n```\n\n#### Complexity\n\nLoop twice: $O(2*s.szie())$","onTime":true},null,null,null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124415547","body":"### 【Day 13】[104. 二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/)\n\n#### Main Idea \n\n1. 首先考虑到递归即遍历二叉树的左右子树,计算每个节点的左右子树的最大深度\n\n - **递归终止条件**:如果当前节点为空,则返回0(表示当前路径长度为0)。\n - **递归逻辑**:对于当前节点,递归计算左子树的最大深度和右子树的最大深度,取较大值并加1(当前节点本身)\n - **时间复杂度**:O(n),其中n是二叉树的节点总数。每个节点被访问一次。\n\n2. DFS\n\n ```c++\n /**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\n \n class Solution {\n public:\n int maxDepth(TreeNode* root) {\n if (!root) return 0;\n \n std::stack> s;\n s.push({root, 1});\n int max_depth = 0;\n \n while (!s.empty()) {\n auto [node, depth] = s.top();\n s.pop();\n max_depth = std::max(max_depth, depth);\n \n if (node->left) {\n s.push({node->left, depth + 1});\n }\n if (node->right) {\n s.push({node->right, depth + 1});\n }\n }\n \n return max_depth;\n }\n };\n ```\n\n \n\n#### 时间复杂度\n\n要计算二叉树的最大深度,必须访问每一个节点一次,因为最长路径可能出现在任意位置。**没有比O(n)更优的时间复杂度**,因为无论如何都需要遍历所有节点以确认最长路径。","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146453148","body":"### 【Day 19】两数之和\n\n#### Main Idea\n\n1. **暴力枚举**\n - 遍历数组中的每一个元素 `nums[i]`,再对其后续所有元素 `nums[j]`(`j > i`)进行遍历,判断 `nums[i] + nums[j] == target` 时返回 `[i, j]`。\n - **时间复杂度**:O(n²),最坏情况下需要检查所有的元素对。\n2. **哈希表(一遍扫描)**\n - 利用一个哈希表 `mp` 存储 <数值 → 下标 >的映射。\n - 遍历数组,令 `complement = target - nums[i]`:\n - 如果哈希表中已存在 `complement`,说明之前遇到过这么一个数,二者之和等于 `target`,直接返回对应的下标。\n - 否则将当前元素 `nums[i]` 及其下标 `i` 存入哈希表,继续扫描。\n - **优点**:一次遍历搞定,时间和空间都最优。\n\n```c++\n#include \n#include \nusing namespace std;\n\nclass Solution {\npublic:\n vector twoSum(vector& nums, int target) {\n unordered_map mp; // 存储 已访问的数值 → 下标\n for (int i = 0; i < nums.size(); ++i) {\n int complement = target - nums[i];\n // 如果哈希表中已有 complement,则直接返回答案\n if (mp.find(complement) != mp.end()) {\n return { mp[complement], i };\n }\n // 否则将当前数及下标存入\n mp[nums[i]] = i;\n }\n return {}; // 根据题意不会走到这里\n }\n};\n```\n\n#### 时间复杂度\n\n- **哈希表解法**:O(n),只需一次遍历即可完成查找与存储操作。\n- **空间复杂度**:O(n),最坏情况下哈希表需存储 n 个元素。","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168242525","body":"Main Idea\n\n1. 快慢指针法\n\n设置两个指针 slow 和 fast,初始都指向链表头结点。\n\nfast 每次向前移动 两步,slow 每次向前移动 一步。\n\n当 fast 到达链表末尾时,slow 恰好位于链表的中间位置。\n\n由于题目要求 当有两个中间结点时返回第二个,快慢指针法天然满足这一条件:当链表长度为偶数时,fast 会先到 NULL,此时 slow 指向的就是第二个中间结点。\n\n\n\n2. 时间复杂度\n\nO(n):每个结点最多被访问一次(快指针访问 n/2 次,慢指针访问 n 次)。\n\n\n\n3. 空间复杂度\n\nO(1):只使用了两个额外指针,不需要额外的数据结构。\n\n\n\n\n\n---\n\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode() : val(0), next(nullptr) {}\n * ListNode(int x) : val(x), next(nullptr) {}\n * ListNode(int x, ListNode *next) : val(x), next(next) {}\n * };\n */\nclass Solution {\npublic:\n ListNode* middleNode(ListNode* head) {\n ListNode* slow = head;\n ListNode* fast = head;\n while (fast != nullptr && fast->next != nullptr) {\n slow = slow->next; // 慢指针走一步\n fast = fast->next->next; // 快指针走两步\n }\n return slow; // slow 即为中间结点\n }\n};\n\n\n---\n\n时间复杂度分析\n\n访问链表的所有节点至少需要一次遍历,因此 没有比 O(n) 更优的时间复杂度。\n\n快慢指针法通过一次遍历同时得到中间节点,避免了额外的存储或两次遍历,比先统计长度再走一半更高效。\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3188424726","body":"#### Main Idea\n\n1. **把未分组项目“补组”**:对 `group[i] == -1` 的项目,给它们分配新的组号(从 `m` 开始递增),这样每个项目都有归属组,最终组的总数记为 `G`。\n2. **两层拓扑排序(Group 拓扑 + Item 拓扑)**:\n\n * **项目层图**:对每条依赖 `u ∈ beforeItems[v]`,连边 `u → v`,统计项目入度。\n * **组层图**:若 `group[u] != group[v]`,再在组图里连边 `group[u] → group[v]`,统计组入度。\n * **先对项目图做一次拓扑排序(得到全局项目顺序)**,再对组图做一次拓扑排序(得到组顺序)。\n3. **按组拼接**:将“项目拓扑序”按照其组别分桶(保持项目拓扑中的相对顺序),再按“组拓扑序”依次把每个桶拼接起来即为答案。\n4. **不可行判定**:任一拓扑排序失败(存在环)则返回空数组。\n\n* **关键点**:跨组依赖只影响组与组的先后关系(由组图保证),组内项目的详细先后由项目图保证。用“两层图”可同时满足“组块相邻”和“依赖有序”。\n\n---\n\n2. **实现**\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n vector sortItems(int n, int m, vector& group, vector>& beforeItems) {\n // 1) 给未分组的项目分配新组号\n int gid = m;\n for (int i = 0; i < n; ++i) {\n if (group[i] == -1) group[i] = gid++;\n }\n int G = gid; // 组总数\n\n // 2) 建立项目图 & 组图\n vector> itemAdj(n), groupAdj(G);\n vector itemIn(n, 0), groupIn(G, 0);\n\n for (int v = 0; v < n; ++v) {\n for (int u : beforeItems[v]) {\n itemAdj[u].push_back(v);\n itemIn[v]++;\n if (group[u] != group[v]) {\n groupAdj[group[u]].push_back(group[v]);\n groupIn[group[v]]++;\n }\n }\n }\n\n // 通用 Kahn 拓扑\n auto topo = [](const vector>& adj, vector indeg) -> vector {\n int N = (int)adj.size();\n queue q;\n for (int i = 0; i < N; ++i) if (indeg[i] == 0) q.push(i);\n vector order;\n order.reserve(N);\n while (!q.empty()) {\n int x = q.front(); q.pop();\n order.push_back(x);\n for (int y : adj[x]) {\n if (--indeg[y] == 0) q.push(y);\n }\n }\n if ((int)order.size() != N) return {}; // 有环\n return order;\n };\n\n // 3) 分别对 项目图、组图 做拓扑排序\n vector itemOrder = topo(itemAdj, itemIn);\n if (itemOrder.empty()) return {};\n vector groupOrder = topo(groupAdj, groupIn);\n if (groupOrder.empty()) return {};\n\n // 4) 按项目拓扑序分桶到各组里,保持项目相对次序\n vector> bucket(G);\n for (int x : itemOrder) bucket[group[x]].push_back(x);\n\n // 5) 按组拓扑序拼接\n vector ans;\n ans.reserve(n);\n for (int g : groupOrder) {\n for (int x : bucket[g]) ans.push_back(x);\n }\n return ans;\n }\n};\n```\n\n#### 时间复杂度\n\n* 建图与两次拓扑排序总计 **O(n + E)**,其中 `E = Σ |beforeItems[i]|`。\n* 额外空间用于邻接表、入度数组与分桶,均为 **O(n + E + G)**。\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3205439203","body":"#### Main Idea\n\n1. **线性扫描 (超时)**\n - 从 0 开始向上遍历整数 `i`。\n - 检查 `i * i` 的值。当第一次出现 `i * i > x` 时,那么 `i-1` 就是我们要求的平方根的整数部分。\n - **注意**:`i * i` 的计算可能会导致整数溢出。为避免此问题,应将判断条件改为 `i > x / i`。\n - **缺点**:当 `x` 非常大时,循环次数过多,会导致执行超时,无法通过所有测试用例。\n\n2. **二分查找**\n - `x` 的平方根一定在 `[0, x]` 这个区间内。\n - 我们可以将问题转化为:**在一个有序的范围内(`0` 到 `x`),寻找最大的整数 `k`,使得 `k² <= x`**。\n - 这正是二分查找的经典应用场景。设置搜索区间的左右边界 `left` 和 `right`,计算中间值 `mid`:\n - 如果 `mid² <= x`,说明 `mid` 是一个可能的解,但我们还想尝试更大的值,因此记录当前解,并在右半部分继续搜索:`ans = mid`, `left = mid + 1`。\n - 如果 `mid² > x`,说明 `mid` 太大了,解一定在左半部分,因此缩小搜索范围:`right = mid - 1`。\n - **优点**:每次都将搜索范围减半,时间复杂度低,效率极高。\n\n```c++\nclass Solution {\npublic:\n int mySqrt(int x) {\n if (x == 0) {\n return 0;\n }\n\n int left = 1, right = x;\n int ans = 0;\n\n while (left <= right) {\n int mid = left + (right - left) / 2;\n\n // 为防止 mid * mid 溢出,使用除法来判断\n // mid <= x / mid 等价于 mid * mid <= x\n if (mid <= x / mid) {\n ans = mid; // mid 是一个可能的解\n left = mid + 1; // 尝试在右侧寻找更大的解\n } else {\n right = mid - 1; // mid 太大,到左侧去寻找\n }\n }\n return ans;\n }\n};\n```\n\n#### 时间复杂度\n\n- **二分查找解法**:O(log n),其中 n 为输入值 `x`。二分查找每次都将搜索空间减半,因此时间复杂度是对数级别的。\n- **空间复杂度**:O(1),解法只使用了常数个额外变量,与输入 `x` 的大小无关。","onTime":true},null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3237241808","body":"#### Main Idea\n\n1. 滑动窗口 + 计数\n\n - 用两个计数器统计字符需求:`need[c]` 表示目标串 `t` 中每个字符需要的数量,`have[c]` 表示当前窗口中已有的数量。\n - 扩张右端:右指针 `r` 逐步右移,把字符加入窗口,并在 `have[c]` 达到 `need[c]` 时,更新已满足的种类数 `formed`。\n - 收缩左端:当窗口已满足 `t` 的全部字符需求(`formed == required`,其中 `required` 为 `t` 中不同字符的个数)时,尽量左移 `l` 缩小窗口并更新最优答案。\n - 唯一性:题目保证若存在答案则唯一,我们只需在收缩时维护最短长度即可。\n\n ```cpp\n #include \n using namespace std;\n \n class Solution {\n public:\n string minWindow(string s, string t) {\n if (t.empty() || s.size() < t.size()) return \"\";\n \n // 统计目标需求\n vector need(128, 0), have(128, 0);\n int required = 0; // 需要满足的不同字符的种类数\n for (char c : t) {\n if (need[c] == 0) required++;\n need[c]++;\n }\n \n int formed = 0; // 当前窗口中已满足 need 的种类数\n int bestLen = INT_MAX, bestL = 0;\n int l = 0;\n \n for (int r = 0; r < (int)s.size(); ++r) {\n char cr = s[r];\n have[cr]++;\n \n // 当某字符数量刚好达到需求,更新 formed\n if (need[cr] > 0 && have[cr] == need[cr]) {\n formed++;\n }\n \n // 若已满足所有字符需求,尽量收缩左端\n while (formed == required) {\n if (r - l + 1 < bestLen) {\n bestLen = r - l + 1;\n bestL = l;\n }\n char cl = s[l];\n have[cl]--;\n // 收缩导致某字符不足,formed 减一\n if (need[cl] > 0 && have[cl] < need[cl]) {\n formed--;\n }\n l++;\n }\n }\n \n return bestLen == INT_MAX ? \"\" : s.substr(bestL, bestLen);\n }\n };\n ```\n\n#### 时间复杂度\n\n双指针各自只右移且不回退,整体 **O(m + n)**;计数数组为常数空间。","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240735616","body":"#### Main Idea\n\n1. **逐行放置**\n - 每一行选择一个不与已放皇后冲突的列。冲突规则:同列、主对角线(r−c)、次对角线(r+c)。\n - **递归终止**:当行号 `row == n`,说明已成功放置 n 个皇后,计数 +1。\n - **选择与撤销**:在当前行尝试所有合法列,递归下一行,回退继续尝试。\n2. **位运算优化**\n - 用 n 位二进制位掩码表示列与对角线占用:\n - `cols`:哪些列被占。\n - `diag1`:主对角线占用(相当于下一行左移一位)。\n - `diag2`:次对角线占用(相当于下一行右移一位)。\n - 可放置位置:`bits = ~(cols | diag1 | diag2) & mask`,其中 `mask = (1<> 1`。\n\n#### 回溯 + 位运算\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int totalNQueens(int n) {\n int mask = (1 << n) - 1;\n return dfs(0, 0, 0, 0, mask, n);\n }\n\nprivate:\n // row: 当前行号;cols/diag1/diag2:占用掩码;mask:仅保留 n 位\n int dfs(int row, int cols, int diag1, int diag2, int mask, int n) {\n if (row == n) return 1;\n\n int count = 0;\n int bits = (~(cols | diag1 | diag2)) & mask; // 当前行可放置的位置集合\n\n while (bits) {\n int p = bits & -bits; // 取最低位可行位置\n bits -= p; // 移除该位置\n\n count += dfs(row + 1,\n cols | p,\n ((diag1 | p) << 1) & mask, // 主对角线左移并截断\n (diag2 | p) >> 1, // 次对角线右移\n mask, n);\n }\n return count;\n }\n};\n```\n\n#### 时间复杂度\n\n- **时间**:回溯搜索的上界接近 **O(n!)**,但位运算将冲突判断降为 O(1) 常数,n ≤ 9 时非常快。\n- **空间**:**O(n)**(递归深度 n,掩码为常数额外空间)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247569627","body":"#### Main Idea\n\n1. BFS(从所有陆地同时出发)\n\n * 把所有值为 `1` 的格子(陆地)一起入队,距离视作 0;像海浪一样一圈圈向外扩散。\n * 第一次被扩散到的海洋格子的距离,就是它到最近陆地的最短曼哈顿距离。\n * 最后被访问到的海洋格子的距离即为答案。\n * **边界**:若全为陆地或全为海洋,返回 `-1`。\n\n2. 实现\n\n ```cpp\n #include \n using namespace std;\n\n class Solution {\n public:\n int maxDistance(vector>& grid) {\n int n = grid.size();\n queue> q;\n vector> dist(n, vector(n, -1));\n\n // 把所有陆地入队,距离置 0\n for (int i = 0; i < n; ++i) {\n for (int j = 0; j < n; ++j) {\n if (grid[i][j] == 1) {\n q.push({i, j});\n dist[i][j] = 0;\n }\n }\n }\n\n // 若全海或全陆,直接返回 -1\n if (q.empty() || (int)q.size() == n * n) return -1;\n\n int ans = -1;\n int dirs[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};\n\n // 多源 BFS\n while (!q.empty()) {\n auto [x, y] = q.front(); q.pop();\n for (auto& d : dirs) {\n int nx = x + d[0], ny = y + d[1];\n if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue;\n if (dist[nx][ny] != -1) continue; // 访问过\n dist[nx][ny] = dist[x][y] + 1; // 最近陆地距离\n ans = max(ans, dist[nx][ny]);\n q.push({nx, ny});\n }\n }\n return ans;\n }\n };\n ```\n\n#### 时间复杂度\n\n* 时间:每个格子最多入队一次,四邻检查常数次,整体 **O(N²)**。\n\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263627488","body":"#### Main Idea\n\n1. **线性决策(相邻不能同抢)**\n\n * 到第 `i` 间房时只有两种选择:\n\n * **不抢它**:收益等于前一间的最佳收益 `dp[i-1]`\n * **抢它**:收益等于“到 i-2 的最佳收益 + 本屋金额” → `dp[i-2] + nums[i]`\n * 所以转移式:`dp[i] = max(dp[i-1], dp[i-2] + nums[i])`\n2. **初值与边界**\n\n * 空数组 → 答案 `0`\n * `dp[0] = nums[0]`\n * `dp[1] = max(nums[0], nums[1])`(如果存在)\n3. **滚动变量优化空间**\n\n * 只依赖 `i-1` 和 `i-2`,用两个变量就够了:\n\n * `prev2` 表示 `dp[i-2]`,`prev1` 表示 `dp[i-1]`\n * 新值 `cur = max(prev1, prev2 + nums[i])`,随后前移指针\n\n#### 动态规划(滚动变量,O(1) 空间)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int rob(vector& nums) {\n if (nums.empty()) return 0;\n int n = nums.size();\n if (n == 1) return nums[0];\n\n int prev2 = 0; // dp[i-2]\n int prev1 = 0; // dp[i-1]\n for (int x : nums) {\n int cur = max(prev1, prev2 + x);\n prev2 = prev1;\n prev1 = cur;\n }\n return prev1;\n }\n};\n```\n\n#### 时间复杂度\n\n* **时间**:`O(n)`(单次线性扫描)\n* **空间**:`O(1)`(滚动变量),如需恢复路径则 `O(n)` 用于记录选择","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3284142988","body":"#### Main idea\n\n**把局面想成“还差多少 + 已用过哪些数”**\n\n- 每次你从公共池里挑一个数,目标值就相应减少;被挑过的数以后都不能再用。\n- 于是每一步其实就是在“还差的分数”和“哪些数已被拿走”的组合之间转换。\n\n**当前能赢的充要条件**\n\n- 如果你现在能直接拿到一个数,使得**累计和立刻达到/超过目标**,你马上赢。\n- 否则,你希望找到一个数字,让对手接下来面对的局面是**必输局**。\n 换句话说:**存在**一个选择能把对手“送进死局”,那你这一步就是必赢;\n 如果**所有**选择都会把对手“送进稳赢局”,那你这一步就是必输。\n\n**两条简单但很有用的剪枝**\n\n- **总和不够就别想了**:如果 1 到 `maxChoosableInteger` 的总和都达不到目标,先手必输。\n- **目标非正直接赢**:如果目标本来就 ≤ 0(或被前人操作减到 ≤ 0),先手已满足条件,直接判赢。\n\n**记住算过的局面,别重复思考(记忆化)**\n\n- 同一组“已用过的数字 + 还差多少”的局面,赢或输的结论是固定的。\n- 把每个局面的输赢结果记下来,后面再遇到就直接用,避免在相同分支上反复推演。\n\n**直觉理解(以示例 1 为例)**\n\n- `max=10, 目标=11`:无论先手先拿哪个数 `x`,后手都能立刻拿到 `11-x`(且该数仍在 1..10 且未被用),直接结束游戏。\n- 所以先手无解——这就是“把对手送进稳赢局”在反方向上的体现。\n\n#### Implementation(cpp)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n bool canIWin(int maxChoosableInteger, int desiredTotal) {\n if (desiredTotal <= 0) return true;\n\n int n = maxChoosableInteger;\n int sum = n * (n + 1) / 2;\n if (sum < desiredTotal) return false; // 全拿都不够,必输\n\n // 2^n 状态;-1=未知,0=必败,1=必胜\n vector memo(1 << n, -1);\n return dfs(0, desiredTotal, n, memo);\n }\n\nprivate:\n // mask: 已用集合(第 i 位表示数字 i+1 是否已用)\n // remain: 距离目标还差多少\n bool dfs(int mask, int remain, int n, vector& memo) {\n char &res = memo[mask];\n if (res != -1) return res;\n\n // 枚举当前可选的每个数 i\n for (int i = 1; i <= n; ++i) {\n int bit = 1 << (i - 1);\n if (mask & bit) continue; // 已用,跳过\n if (i >= remain) return res = 1; // 直接到达/超过目标,当前玩家赢\n // 若选 i 之后对手必败,则当前必胜\n if (!dfs(mask | bit, remain - i, n, memo)) return res = 1;\n }\n return res = 0; // 所有选择都会让对手必胜 => 当前必败\n }\n};\n\n```\n\n#### 复杂度\n\nO(n · 2^n)","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3306753472","body":"#### Main Idea\n\n1. **把“最少删除”转化为“最多保留”**\n\n * 经典区间调度:**按右端点升序**排序,**尽可能先选结束早的区间**,就能在不重叠前提下**保留最多**的区间。\n * 需要移除的最小数量 = `总数 n - 能保留的最大不重叠数量 keep`。\n\n2. **为什么按右端点排是最优的**\n\n * 选更早结束的区间,给后面的区间留下**更多起始空间**,不比选结束晚的更差。\n * 可用“**交换论证**”:若最优解里某一步没有选最早结束者,换成结束更早的,不减少可选余地,解仍最优。\n\n3. **边界与定义(开闭性)**\n\n * 本题规定:端点相同只**接触不重叠**(`[1,2]` 与 `[2,3]` 可共存),因此判断不重叠条件是 `start >= lastEnd`。\n * 允许负数坐标;`1 <= n <= 1e5`,需 `O(n log n)` 排序 + `O(n)` 一次扫描。\n\n---\n\n#### 贪心(按右端点排序)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int eraseOverlapIntervals(vector>& intervals) {\n if (intervals.empty()) return 0;\n\n // 1) 按 end 升序排\n sort(intervals.begin(), intervals.end(),\n [](const vector& a, const vector& b){\n if (a[1] != b[1]) return a[1] < b[1];\n return a[0] < b[0];\n });\n\n // 2) 贪心选择:尽量保留更多不重叠区间\n int keep = 0;\n int lastEnd = INT_MIN; // 当前已选集合的最后一个区间的 end\n for (auto &it : intervals) {\n int s = it[0], e = it[1];\n if (s >= lastEnd) { // 与上一个选择不重叠(端点相接也可)\n ++keep;\n lastEnd = e;\n }\n }\n return (int)intervals.size() - keep; // 最少删除 = 总数 - 最多保留\n }\n};\n```\n\n---\n\n#### 等价实现(按左端点排序的“原地计数删谁”)\n\n* 也可以**按起点升序**,一遍扫描:\n\n * 若当前 `s < prevEnd` 发生**重叠** ⇒ 必须删一个;\n * **删谁?** 删右端点更大的那个(保留 `end` 更小者),将 `prevEnd = min(prevEnd, e)`。\n * 计数 `remove++`。\n* 与前法等价,常用于不想单独计“keep”的写法。\n\n```cpp\nint eraseOverlapIntervals(vector>& intervals) {\n if (intervals.empty()) return 0;\n sort(intervals.begin(), intervals.end()); // 默认按 start,再按 end\n\n int remove = 0;\n int prevEnd = intervals[0][1];\n for (int i = 1; i < (int)intervals.size(); ++i) {\n int s = intervals[i][0], e = intervals[i][1];\n if (s < prevEnd) { // 重叠了,需要删一个\n ++remove;\n prevEnd = min(prevEnd, e); // 删 end 较大的那个,保留更早结束\n } else {\n prevEnd = e; // 不重叠,正常推进\n }\n }\n return remove;\n}\n```\n\n#### 复杂度\n\n* 排序 `O(n log n)`,单扫 `O(n)`;总 `O(n log n)`。\n* 额外空间 `O(1)`(除了排序)。\n\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3332731592","body":"#### Main Idea\n\n1. **字母映射到孩子指针(26 叉树)**\n\n * 每个结点保存 `children[26]` 与 `isEnd`。\n * `insert(word)`:从根逐字符走,若孩子不存在就新建;末结点标记 `isEnd = true`。\n * `search(word)`:逐字符走,若中途缺结点则 `false`;走完返回末结点 `isEnd`。\n * `startsWith(prefix)`:逐字符走,若中途缺结点则 `false`;都能走到则 `true`(无需 `isEnd`)。\n\n2. **正确性与边界**\n\n * 仅小写字母 → 直接用 `idx = c - 'a'`。\n * `search` 必须要求完整单词结束处 `isEnd == true`,否则只是前缀命中。\n * 空间按需分配:只有路径上用到的结点才创建。\n\n\n---\n\n#### 实现(C++,指针版)\n\n```cpp\n#include \nusing namespace std;\n\nstruct TrieNode {\n bool isEnd = false;\n TrieNode* ch[26];\n TrieNode() : isEnd(false) {\n memset(ch, 0, sizeof(ch));\n }\n};\n\nclass Trie {\npublic:\n Trie() { root = new TrieNode(); }\n\n // 插入单词\n void insert(const string& word) {\n TrieNode* p = root;\n for (char c : word) {\n int idx = c - 'a';\n if (!p->ch[idx]) p->ch[idx] = new TrieNode();\n p = p->ch[idx];\n }\n p->isEnd = true;\n }\n\n // 完整匹配\n bool search(const string& word) {\n TrieNode* p = walk(word);\n return p && p->isEnd;\n }\n\n // 前缀匹配\n bool startsWith(const string& prefix) {\n return walk(prefix) != nullptr;\n }\n\nprivate:\n TrieNode* root;\n\n // 沿字符串行走,走不到返回空\n TrieNode* walk(const string& s) {\n TrieNode* p = root;\n for (char c : s) {\n int idx = c - 'a';\n if (!p->ch[idx]) return nullptr;\n p = p->ch[idx];\n }\n return p;\n }\n};\n```\n#### 复杂度\n\n * 设字符串长度为 `L`:\n\n * `insert / search / startsWith` 都是 **O(L)**。\n * 空间:创建的结点数 ≤ 所有插入字符串长度之和。\n\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3357108848","body":"#### Main idea\n\n**后序递归 + 就地剪枝**\n\n* “要保留的节点”必须满足:自己是 1,或者**子树里至少有一个 1**。\n* 等价地说:当一个节点值为 0,且**左右子树都被剪成空**,这个节点也应被删除。\n* 因此用**后序遍历**:先递归处理左右子树,把不含 1 的子树返回成 `nullptr`;回来后再判断当前节点是否也应被删。\n\n**判定规则(在回溯处)**\n\n* `root->left = prune(left)`,`root->right = prune(right)`;\n* 若 `root->val==0 && root->left==nullptr && root->right==nullptr` → 返回 `nullptr`(整棵以 root 为根的子树都不含 1)。\n* 否则返回 `root`。\n\n这保证了每个节点只访问一次,且删除顺序从叶到根,不会误留“全 0 链”。\n\n#### Implementation(cpp)\n\n```cpp\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\n\nclass Solution {\npublic:\n TreeNode* pruneTree(TreeNode* root) {\n if (!root) return nullptr;\n\n root->left = pruneTree(root->left);\n root->right = pruneTree(root->right);\n\n // 若当前为0且左右都为空 => 该节点所在子树不含1,剪掉\n if (root->val == 0 && !root->left && !root->right) {\n return nullptr;\n }\n return root;\n }\n};\n```\n\n#### 复杂度\n\n* 时间:`O(n)`,每个节点访问一次。\n* 空间:`O(h)`,递归栈深度(`h` 为树高,最坏 `O(n)`,平均 `O(log n)`)。","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null],"leohongyi":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3076771871","body":"【Day 1】989. 数组形式的整数加法\nmain idea 从最低位开始加,如果还有进位,将其添加到结果前面 使用逆序遍历 range(len(num) - 1, -1, -1) 从数组的最后一个元素(最低位)开始\ndivmod(num[i] + k, 10) 计算当前位置的数字与 k 相加后的结果,返回商和余数 如果处理完数组中所有位后仍有进位(k > 0)\n从 k 中提取最低位数字,并插入到数组最前面\n继续处理 k 的下一位,直到 k 变为 0\n余数 num[i] 保存在当前位置\n商 k 作为进位传递给下一个更高位\n整体时间复杂度为 O(max(n, log k))。\ncode\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n for i in range(len(num) - 1, -1, -1):\n k, num[i] = divmod(num[i] + k, 10)\n \n while k > 0:\n k, digit = divmod(k, 10)\n num.insert(0, digit)\n return num\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077014132","body":"main idea:\n创建 ret 数组,长度为len(s)\n再次遍历s的过程中,我们需要判断当满足以下两点条件时,指针 p 右移一位\np小于arr最大下标\n前下标i 到 p + 1的绝对距离比到 p 的绝对距离小\n每次将 p - i 的绝对距离添加至 ret[i] 中\n\n def shortestToChar(self, s: str, c: str) -> List[int]:\n ret, p, arr = [], 0, [i for i in range(len(s)) if s[i] == c]\n for i, j in enumerate(s):\n if p < len(arr) - 1 and abs(arr[p] - i) > abs(arr[p + 1] - i):\n p += 1\n ret.append(abs(arr[p] - i))\n return ret\nTime Complexity: O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082831029","body":"使用数组的栈结构,self.top作为栈顶指针\n进出栈分别通过简单的数组赋值与读取进行操作\nincrement函数通过一个循环进行赋值操作\nclass CustomStack:\n\n def __init__(self, maxSize: int):\n self.stack = [0]*maxSize\n self.top = -1\n\n def push(self, x: int) -> None:\n if self.top < len(self.stack) - 1:\n self.top += 1\n self.stack[self.top] = x\n\n def pop(self) -> int:\n if self.top is -1:\n return self.top\n else:\n self.top -= 1\n return self.stack[self.top+1]\n \n\n def increment(self, k: int, val: int) -> None:\n for i in range(min(k, self.top + 1)):\n self.stack[i] += val\n\n\n\nTime complexity: O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3092615113","body":"算法步骤:\n利用current string, current number 记录所有不同的括号层级内的string和num;\n使用stk来记录之前的数字和前置str;推荐先push num, 后push str 至 stack;\nO(n)\n代码:\nclass Solution:\n def decodeString(self, s: str) -> str:\n cur_str, cur_num = \"\", \"\"\n stk = []\n for c in s:\n if c.isdigit():\n cur_num += c\n elif c == '[':\n stk.append(cur_str)\n stk.append(cur_num)\n cur_str, cur_num = \"\", \"\"\n elif c == ']':\n cur_str *= int(stk.pop())\n cur_str = stk.pop() + cur_str\n else:\n cur_str += c\n return cur_str\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092624509","body":"算法设计\n加入队尾 push() : 将数字 val 加入栈 A 即可。\n获取队首元素 peek() :\n当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。\n否则,当 A 为空: 即两个栈都为空,无元素,因此返回 -1 。\n否则: 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。\n弹出队首元素 pop() :\n执行 peek() ,获取队首元素。\n弹出 B 的栈顶元素。\n队列判空 empty() : 当栈 A 和 B 都为空时,队列为空。\n\nclass MyQueue:\n\n def __init__(self):\n self.A, self.B = [], []\n\n def push(self, x: int) -> None:\n self.A.append(x)\n\n def pop(self) -> int:\n peek = self.peek()\n self.B.pop()\n return peek\n\n def peek(self) -> int:\n if self.B: return self.B[-1]\n if not self.A: return -1\n # 将栈 A 的元素依次移动至栈 B\n while self.A:\n self.B.append(self.A.pop())\n return self.B[-1]\n def empty(self) -> bool:\n return not self.A and not self.B\n\n\n# Your MyQueue object will be instantiated and called as such:\n# obj = MyQueue()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.peek()\n# param_4 = obj.empty()\n时间复杂度: push(), empty() 函数的时间复杂度为 O(1) ;peek() , pop() 函数在 N 次队首元素删除操作中总共需完成 N 个元素的倒序,均摊时间复杂度为 O(1) 。\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3105379844","body":"main: 如果当前元素大于或者等于maxx,入栈, 更新最大值maxx\n如果当前元素小于栈顶元素,循环弹出栈顶元素,直到当前元素大于或等于栈顶元素,注意不用将当前元素入栈!!不过要再将maxx压入栈,因为刚刚pop时肯定把maxx弹出栈了\n\n。class Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n maxx, stk = arr[0], [arr[0]]\n for i in range(1, len(arr)):\n if arr[i] >= maxx:\n maxx = arr[i]\n stk.append(arr[i])\n else:\n while stk and stk[-1] > arr[i]:\n stk.pop()\n stk.append(maxx)\n return len(stk)\n 时间复杂度O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3111913253","body":"找到尾结点 形成环形链表\n尾结点移动length - k 步 有移动k步 == 左移length - k 步\n找到头结点 断开头尾链接\n\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:\n if not head or not head.next:\n return head\n tail = head\n length = 1\n while tail.next:\n length += 1\n tail = tail.next\n tail.next = head\n\n k = k % length\n for _ in range(length - k):\n tail = tail.next\n \n head = tail.next\n tail.next = None\n return head\n ","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3111983736","body":"先交换以node3为头结点的链表 \nnode1指向地柜返回的链表头\n把node2指向node1\n返回node2 作为交换完成的链表头结点\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if head is None or head.next is None:\n return head\n node1 = head\n node2 = head.next\n node3 = node2.next\n\n node1.next = self.swapPairs(node3)\n node2.next = node1\n\n return node2\n ","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dmax1314":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3082278662","body":"1. 第一个想法是数组转换数字然后相加再转换回去\n时间和空间复杂度都应该是O(n)\n```python\nfrom typing import List\n\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n # 1. 数组 -> 字符串 -> 数字\n # 首先将列表中的每个数字转换为字符串,然后拼接成一个完整的字符串\n # [1, 2, 0, 0] -> [\"1\", \"2\", \"0\", \"0\"] -> \"1200\"\n s = \"\".join(map(str, num))\n \n num_val = int(s)\n \n # 2. 数字相加\n result_val = num_val + k\n \n # 3. 数字 -> 字符串 -> 数组\n # 将结果数字转换回字符串\n # 1234 -> \"1234\"\n result_s = str(result_val)\n \n # 将结果字符串中的每个字符转换回整数,并放入列表中\n # \"1234\" -> [\"1\", \"2\", \"3\", \"4\"] -> [1, 2, 3, 4]\n result_array = [int(digit) for digit in result_s]\n \n return result_array\n```\n但是似乎换其他的语言会溢出\n2. 第二个想法就是模拟加法操作,从个位数加起,关键问题在于处理进位\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n result = []\n carry = 0\n i = len(num) - 1 # 指向 num 的最后一位\n \n while i >= 0 or k > 0 or carry > 0:\n digit = carry # 初始化为进位\n \n if i >= 0: # 如果 num 中还有数字\n digit += num[i]\n i -= 1\n \n if k > 0: # 如果 k 中还有数字\n digit += k % 10\n k //= 10 # 整个 k 除以 10\n \n # 处理进位\n result.append(digit % 10)\n carry = digit // 10\n \n result.reverse() # 因为是从个位到十位添加的,最后需要反转\n return result # 返回结果\n```\n这里是要反转的 我一开始忘了这个事情,因为数组把个位的和放在了第一位和实际数字反过来了\n时间复杂度: O(max(N, M)),其中 N 是 num 的长度,M 是 k 的数字长度。我们需要遍历这两个数的每一位。\n空间复杂度: O(max(N, M)),用于存储结果数组。\n\n---\n在看lc题解的时候发现一个很有趣的模板可能以后会用到\n ```\nwhile ( A 没完 || B 没完)\n A 的当前位\n B 的当前位\n\n 和 = A 的当前位 + B 的当前位 + 进位carry\n\n 当前位 = 和 % 10;\n 进位 = 和 / 10;\n\n判断还有进位吗\n```\n>作者:lilyunoke\n>链接:https://leetcode.cn/problems/add-to-array-form-of-integer/solutions/570659/989-ji-zhu-zhe-ge-jia-fa-mo-ban-miao-sha-8y9r/\n>来源:力扣(LeetCode)\n>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n\n稍微改了一下得到一个python加法模板,\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n n = len(num)\n res = []\n i = n - 1\n s = 0\n carry = 0\n while i >= 0 or k != 0:\n x = num[i] if i >= 0 else 0\n y = k % 10 if k != 0 else 0\n\n s = x + y + carry\n carry = s // 10\n k //= 10\n\n i -= 1\n res.insert(0, s % 10)\n\n if carry != 0:\n res.insert(0, carry)\n return res\n```\n据说这个模板还可以用到[2](https://leetcode.com/problems/add-two-numbers/description/),[165](https://leetcode.com/problems/compare-version-numbers/)和[809](https://leetcode.com/problems/expressive-words/)这周末抽空可以做一下","onTime":false},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3086540520","body":"# 第四天\n构造栈结构,利用先入后出的特性来实现括号匹配\n大概做法就是\n1. 使用栈来存放数字、字符以及中间结果。\n2. 遇到数字时,解析出完整的k值(可能是多位数)。\n3. 遇到开括号 `[` 时,将当前构建的字符串入栈,重置字符串。\n4. 遇到闭括号 `]` 时,出栈,形成一个新的字符串并重复生成。\n5. 最终合并所有字符串返回结果。\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n stack = [] # 初始化栈\n current_num = 0 # 当前数字\n current_str = '' # 当前构建的字符串\n\n for char in s:\n if char.isdigit(): # 如果是数字\n current_num = current_num * 10 + int(char) # 处理多位数\n elif char == '[': # 遇到左括号\n stack.append(current_str) # 存储当前字符串\n stack.append(current_num) # 存储当前数字\n current_str = '' # 重置字符串\n current_num = 0 # 重置数字\n elif char == ']': # 遇到右括号\n num = stack.pop() # 弹出数字\n prev_str = stack.pop() # 弹出前一个字符串\n current_str = prev_str + current_str * num # 生成新的字符串\n else:\n current_str += char # 累加字符\n\n return current_str # 返回解码后的字符串\n```\n时间复杂度是 O(n),其中 n 是字符串 s 的长度。每个字符都被处理一次。\n空间复杂度是 O(n),在最坏情况下,栈可能会存储所有字符和数字。\n\n---\n读了题解发现还存在递归法,也就是用[]来决定递归的开头和结束\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n def dfs(s,i):\n res,multi='',0\n while i str:\n def dfs(s, i):\n res, multi = \"\", 0\n while i < len(s):\n if '0' <= s[i] <= '9':\n multi = multi * 10 + int(s[i])\n elif s[i] == '[':\n i, tmp = dfs(s, i + 1)\n res += multi * tmp\n multi = 0\n elif s[i] == ']':\n return i, res\n else:\n res += s[i]\n i += 1\n return res\n return dfs(s,0)\n```\n时间复杂度是 O(n),其中 n 是字符串 s 的长度。每个字符都被处理一次。\n空间复杂度是 O(n),在最坏情况下,递归调用栈可能会存储所有字符和数字。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091499578","body":"用两个模拟栈的队列来实现栈的基本操作。一个用于添加尾部元素,另一个用于弹出头部元素。即一个近栈stack in和一个出栈stack out。\n```python\nclass MyQueue:\n\n def __init__(self):\n \"\"\"\n in主要负责push,out主要负责pop\n \"\"\"\n self.stack_in = []\n self.stack_out = []\n\n\n def push(self, x: int) -> None:\n \"\"\"\n 有新元素进来,就往in里面push\n \"\"\"\n self.stack_in.append(x)\n\n\n def pop(self) -> int:\n \"\"\"\n Removes the element from in front of queue and returns that element.\n \"\"\"\n if self.empty():\n return None\n \n if self.stack_out:\n return self.stack_out.pop()\n else:\n for i in range(len(self.stack_in)):\n self.stack_out.append(self.stack_in.pop())\n return self.stack_out.pop()\n\n\n def peek(self) -> int:\n \"\"\"\n Get the front element.\n \"\"\"\n ans = self.pop()\n self.stack_out.append(ans)\n return ans\n\n\n def empty(self) -> bool:\n \"\"\"\n 只要in或者out有元素,说明队列不为空\n \"\"\"\n return not (self.stack_in or self.stack_out)\n```\n时间复杂度:\n- `push` 操作的时间复杂度是 O(1),因为我们只是将元素添加到 `stack_in` 的末尾。\n- `pop` 和 `peek` 操作的平均时间复杂度是 O(1),但在最坏情况下(当 `stack_out` 为空时),需要将 `stack_in` 中的所有元素转移到 `stack_out`,这需要 O(n) 的时间,其中 n 是 `stack_in` 中的元素数量。然而,这种情况不会频繁发生,因此平均时间复杂度仍然是 O(1)。\n- `empty` 操作的时间复杂度是 O(1),因为我们只是检查两个栈是否为空。\n\n空间复杂度是 O(n),其中 n 是队列中的元素数量,因为我们需要存储所有元素在两个栈中。\n\n但是我有个问题,不知道为什么用lc自己的time complexity分析出来是O(n)的时间和空间复杂度,可能是因为lc的分析是基于最坏情况的分析?","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094285074","body":"题目的核心是找到最多的分块数量,使得将每个块独立排序后,拼接起来的结果与整个数组排序后的结果相同。\n\n第一个想法是利用排序后的性质。一个块可以被成功分割的条件是:块内所有元素的原数组最大值,小于等于它右边所有元素的最小值。如果满足这个条件,那么这个块排序后,所有元素就都会在它们最终应该在的位置的左边。\n\n为了实现这个想法,我们可以预处理两个数组:\n\n- max_of_left[i]:表示原数组 arr[0...i] 中的最大值。\n- min_of_right[i]:表示原数组 arr[i...n-1] 中的最小值。\n\n然后遍历数组,如果在 i 位置,满足 max_of_left[i] <= min_of_right[i+1],就说明我们可以在 i 和 i+1 之间切一刀。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n n = len(arr)\n if n <= 1:\n return 1\n\n # 1. 计算从左到右每个位置的最大值\n max_of_left = [0] * n\n max_of_left[0] = arr[0]\n for i in range(1, n):\n max_of_left[i] = max(max_of_left[i-1], arr[i])\n\n # 2. 计算从右到左每个位置的最小值\n min_of_right = [0] * n\n min_of_right[n-1] = arr[n-1]\n for i in range(n-2, -1, -1):\n min_of_right[i] = min(min_of_right[i+1], arr[i])\n\n # 3. 遍历查找可以分割的点\n # 如果 max_of_left[i] <= min_of_right[i+1],说明 arr[0...i] 的所有元素\n # 都小于等于 arr[i+1...n-1] 的所有元素,可以切分\n chunks = 0\n for i in range(n - 1):\n if max_of_left[i] <= min_of_right[i+1]:\n chunks += 1\n\n # 总块数 = 分割点数量 + 1\n return chunks + 1\n```\n时间复杂度:O(N),其中 N 是数组的长度。我们需要三次独立的 O(N) 遍历。\n空间复杂度:O(N),用于存储 max_of_left 和 min_of_right 两个辅助数组。\n\n---\n在看题解的时候,发现了一个更巧妙的解法,虽然时间复杂度稍高,但是代码非常简洁。它的思路是比较原数组和排序后数组的元素和。\n\n如果 arr[0...i] 的元素和等于 sorted_arr[0...i] 的元素和,这意味着 arr[0...i] 中的元素集合和 sorted_arr[0...i] 中的元素集合是完全相同的(只是顺序不同)。因为 sorted_arr[0...i] 包含了整个数组中最小的 i+1 个元素,所以 arr[0...i] 也必然包含了这 i+1 个最小元素。这就保证了 arr[0...i] 中的任意元素都小于等于 arr[i+1...n-1] 中的任意元素,因此可以在 i 处进行分割。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n sorted_arr = sorted(arr)\n \n sum_arr = 0\n sum_sorted = 0\n chunks = 0\n \n for i in range(len(arr)):\n sum_arr += arr[i]\n sum_sorted += sorted_arr[i]\n \n if sum_arr == sum_sorted:\n chunks += 1\n \n return chunks\n```\n时间复杂度:O(N log N),瓶颈在于对数组的排序。\n\n空间复杂度:O(N),用于存储排序后的数组副本。\n\n还有一个基于单调栈的解法,时间复杂度可以做到 O(N)。\n\n思路是遍历数组,用一个栈来维护每个块的最大值。\n\n1. 如果当前元素 num 大于或等于栈顶元素,说明 num 可以自己形成一个新的块(或者加入前一个块且不影响排序性),直接将 num 入栈。\n2. 如果当前元素 num 小于栈顶元素,说明 num 必须和前面的块合并,直到栈顶元素小于或等于 num。在合并过程中,需要记录被弹出的那些块中的最大值 head,因为这个 head 将成为合并后新块的最大值,然后将 head 入栈。\n\n最终栈的大小就是块的数量。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n stack = []\n for num in arr:\n if not stack or num >= stack[-1]:\n stack.append(num)\n else:\n # 当前元素num比栈顶小,需要合并\n head = stack.pop()\n # 持续弹出所有大于num的元素\n while stack and stack[-1] > num:\n stack.pop()\n # 将原先这些块的最大值head作为新块的代表入栈\n stack.append(head)\n return len(stack)\n```\n\n时间复杂度:O(N),因为每个元素最多入栈和出栈一次。\n\n空间复杂度:O(N),在最坏的情况下(例如数组本身有序),栈的大小会等于数组长度。\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112533354","body":"双指针\n1. 创建两个指针 pA 和 pB,分别指向两个链表的头节点 headA 和 headB。\n2. 同时向前移动这两个指针,pA 每次走一步,pB 每次也走一步。\n3. 核心操作:如果 pA 指针走到了链表 A 的末尾(即 pA 变为 None),则将它重定向到链表 B 的头节点 headB。同样,如果 pB 指针走到了链表 B 的末尾,则将它重定向到链表 A 的头节点 headA。\n4. 两个指针最终会在相交点相遇。如果两个链表不相交,它们会同时在路径的最后变为 None,此时循环结束。\n\n```python\nclass Solution:\n def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:\n if not headA or not headB:\n return None\n\n pA = headA\n pB = headB\n\n # 当 pA 和 pB 相等时循环终止(可能是在交点,也可能同为 None)\n while pA is not pB:\n # 如果pA走到头,就让他从headB开始走;否则,pA正常往下走\n pA = headB if pA is None else pA.next\n # 如果pB走到头,就让他从headA开始走;否则,pB正常往下走\n pB = headA if pB is None else pB.next\n \n # 返回相遇点\n return pA\n```\n时间复杂度:O(m+n)。在最坏的情况下(例如,两个链表不相交),每个指针都需要遍历两个链表的总长度。\n空间复杂度:O(1)。只使用了两个额外的指针,没有使用其他数据结构。","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121201700","body":"为了实现一个支持 O(1) 时间复杂度的查找插入和删除,可以用hash map去记录key和value之间的映射关系。但是hash map是无序的,没有办法记录各项的使用顺序,可以一个双向链表来记录使用顺序。这样就可以在插入和删除的时候,快速地调整链表的顺序。\n\n```python\nclass DLinkedNode:\n def __init__(self, key=0, value=0):\n self.key = key\n self.value = value\n self.prev = None\n self.next = None\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.cache = dict()\n self.capacity = capacity\n # 使用伪头部和伪尾部节点,简化边界条件处理\n self.head = DLinkedNode()\n self.tail = DLinkedNode()\n self.head.next = self.tail\n self.tail.prev = self.head\n\n def _add_to_head(self, node: DLinkedNode):\n # 将节点添加到头部\n node.prev = self.head\n node.next = self.head.next\n self.head.next.prev = node\n self.head.next = node\n\n def _remove_node(self, node: DLinkedNode):\n # 从链表中删除一个节点\n node.prev.next = node.next\n node.next.prev = node.prev\n\n def _move_to_head(self, node: DLinkedNode):\n # 将一个存在的节点移动到头部\n self._remove_node(node)\n self._add_to_head(node)\n\n def get(self, key: int) -> int:\n if key not in self.cache:\n return -1\n \n node = self.cache[key]\n # 访问过后,变为最近使用,移动到头部\n self._move_to_head(node)\n return node.value\n\n def put(self, key: int, value: int) -> None:\n if key in self.cache:\n # 如果 key 存在,更新值并移动到头部\n node = self.cache[key]\n node.value = value\n self._move_to_head(node)\n else:\n # 如果 key 不存在\n if len(self.cache) == self.capacity:\n # 缓存已满,淘汰最久未使用的节点(尾部节点)\n removed_node = self.tail.prev\n self._remove_node(removed_node)\n # 不要忘了从哈希表中也删除\n del self.cache[removed_node.key]\n\n # 创建新节点并添加到头部\n new_node = DLinkedNode(key, value)\n self._add_to_head(new_node)\n self.cache[key] = new_node\n```\n时间复杂度:get 和 put 操作都是 O(1)。所有操作都是哈希表查找和链表头尾操作的组合。\n空间复杂度:O(capacity),因为哈希表和双向链表最多存储 capacity 个元素。","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3132881592","body":"DFS - 递归\n这道题的结构天然适合使用递归来解决。我们可以定义一个函数,该函数接收一个节点和从根到该节点父节点所构成的数字。\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n \n def dfs(node: Optional[TreeNode], current_path_sum: int) -> int:\n if not node:\n return 0\n \n # 计算到达当前节点的路径代表的数字\n new_sum = current_path_sum * 10 + node.val\n \n # 如果是叶子节点,返回当前路径的数字\n if not node.left and not node.right:\n return new_sum\n \n # 如果不是叶子节点,返回左右子树的路径数字之和\n else:\n return dfs(node.left, new_sum) + dfs(node.right, new_sum)\n\n return dfs(root, 0)\n```\n时间复杂度:O(N),其中 N 是树中节点的数量。我们需要访问每个节点一次。\n空间复杂度:O(H),其中 H 是树的高度。这部分空间用于递归调用栈。在最坏的情况下(树退化成链表),空间复杂度为 O(N);在最好的情况下(完全二叉树),空间复杂度为 O(log N)。\n\n---\n\nDFS - 迭代\n> 递归可能导致的栈溢出问题(在树极深的情况下),我们可以将递归转换为迭代\n\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n \n total_sum = 0\n stack = [(root, root.val)] # 栈中存储 (节点, 到达该节点的路径数值)\n\n while stack:\n node, current_number = stack.pop()\n\n # 如果是叶子节点,将路径数值加入总和\n if not node.left and not node.right:\n total_sum += current_number\n\n # 将右子节点压栈\n if node.right:\n stack.append((node.right, current_number * 10 + node.right.val))\n \n # 将左子节点压栈\n if node.left:\n stack.append((node.left, current_number * 10 + node.left.val))\n \n return total_sum\n```\n时间复杂度:O(N),每个节点入栈和出栈一次。\n空间复杂度:O(H),栈在最坏情况下存储 H 个节点,H 是树的高度。与递归版本类似,最好情况 O(log N),最坏情况 O(N)。\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134942374","body":"因为题目中提到了**行**,我们可以用bfs一行一行地处理树的节点\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\nimport collections\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n \n queue = collections.deque([root])\n bottom_left_val = 0\n \n while queue:\n # 当前层的节点数量\n level_size = len(queue)\n \n # 每一层的第一个节点就是该层的最左侧节点\n # 我们只需要记录它,然后继续遍历\n bottom_left_val = queue[0].val\n \n # 遍历当前层的所有节点\n for _ in range(level_size):\n node = queue.popleft()\n \n # 将下一层的节点加入队列\n if node.left:\n queue.append(node.left)\n if node.right:\n queue.append(node.right)\n \n return bottom_left_val\n```\n时间复杂度:O(N),其中 N 是树中节点的总数。因为每个节点都会入队和出队一次。\n空间复杂度:O(W),其中 W 是树的最大宽度。在最坏的情况下(一个完整的二叉树),队列的大小可以达到 N/2。\n\n---\n当然dfs也是可以做的,要记录目前为止发现的最深层级max_depth和最深层级最左边节点的值result_val,先左后右地进行递归\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n self.max_depth = -1 # 记录最大深度,初始化为-1\n self.result_val = 0 # 记录结果值\n \n def dfs(node: Optional[TreeNode], current_depth: int):\n if not node:\n return\n \n # 如果当前深度大于已记录的最大深度\n # 说明我们第一次到达这个新深度,且由于先序遍历的顺序,这一定是该层最左的节点\n if current_depth > self.max_depth:\n self.max_depth = current_depth\n self.result_val = node.val\n \n # 必须先遍历左子树,再遍历右子树\n dfs(node.left, current_depth + 1)\n dfs(node.right, current_depth + 1)\n \n dfs(root, 0)\n return self.result_val\n```\n时间复杂度:O(N),因为我们仍然需要访问树中的每一个节点。\n空间复杂度:O(H),其中 H 是树的高度。这部分空间是递归调用栈所占用的。最坏情况下,树呈链状,空间复杂度为 O(N)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3146236433","body":"```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n def dfs(node):\n if not node:\n res.append(\"null\")\n return\n res.append(str(node.val))\n dfs(node.left)\n dfs(node.right)\n \n dfs(root)\n return \",\".join(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n if not data:\n return None\n \n # 使用列表模拟一个队列,方便 pop(0)\n node_list = data.split(',')\n \n def build_tree():\n val = node_list.pop(0)\n if val == \"null\":\n return None\n \n node = TreeNode(int(val))\n node.left = build_tree()\n node.right = build_tree()\n return node\n \n return build_tree()\n```\n复杂度 空间和时间都是 O(N)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3141867802","body":"坐标记录 + 排序\n为每一个节点确定其坐标 (row, col),并记录下 (row, col, val) 这个三元组。最后BFS即可(DFS应该也行)\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import List, Optional\nimport collections\n\nclass Solution:\n def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:\n if not root:\n return []\n \n # 1. 遍历与记录\n # 使用 BFS 遍历树,记录每个节点的 (col, row, val)\n nodes_info = []\n queue = collections.deque([(root, 0, 0)]) # (node, row, col)\n \n while queue:\n node, row, col = queue.popleft()\n nodes_info.append((col, row, node.val))\n \n if node.left:\n queue.append((node.left, row + 1, col - 1))\n if node.right:\n queue.append((node.right, row + 1, col + 1))\n \n # 2. 排序\n # 对记录下来的节点信息进行排序\n # Python 的元组排序默认按元素顺序比较,完美符合题目要求\n nodes_info.sort()\n \n # 3. 分组\n # 将排序后的结果按列分组\n result_map = collections.OrderedDict()\n for col, row, val in nodes_info:\n if col not in result_map:\n result_map[col] = []\n result_map[col].append(val)\n \n return list(result_map.values())\n```\n时间复杂度:O(N log N)。\nBFS 遍历需要 O(N) 的时间,其中 N 是节点数。nodes_info.sort() 是整个算法的瓶颈,对 N 个元素排序需要 O(N log N) 的时间。最后的分组步骤需要 O(N) 的时间。\n因此,总时间复杂度为 O(N log N)。\n\n空间复杂度:O(N)。\nBFS 的队列在最坏情况下需要存储 O(W) 个节点,W 是树的最大宽度。nodes_info 列表需要存储所有 N 个节点的信息,因此需要 O(N) 的空间。result_map 也需要 O(N) 的空间来存储所有节点的值。\n因此,总空间复杂度为 O(N)。\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146235205","body":"```python\nfrom typing import List, Set\n\nclass Solution:\n def generateParenthesis(self, n: int) -> List[str]:\n # 使用列表来模拟dp数组,每个元素是一个哈希集合\n dp: List[Set[str]] = [set() for _ in range(n + 1)]\n \n # 基础情况:0对括号只有一种组合,即空字符串\n dp[0].add(\"\")\n \n # 从1对括号开始,迭代到n对\n for i in range(1, n + 1):\n # 遍历所有可能的分割点 j\n for j in range(i):\n # A 部分有 j 对括号,B 部分有 i-1-j 对\n list_p = dp[j]\n list_q = dp[i - 1 - j]\n \n # 组合 p 和 q\n for p in list_p:\n for q in list_q:\n # 使用哈希集合 dp[i] 自动去重\n dp[i].add(f\"({p}){q}\")\n \n return list(dp[n])\n```\n复杂度好像有点难算 看看大家有没有什么想法 我再算一算","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3147359265","body":"首先想到的是26字母那道题一样开一个数组然后建一个数组索引转换hash map去做 但是我不清楚是不是升序 所以要用min和max 那这样的效果肯定很差 内存会超 结果没想到居然能过\n```python\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n if not nums:\n return []\n \n # -----------------------------------------------------------------\n # 步骤 1: 使用“数组哈希”(直接寻址法)统计频率\n # -----------------------------------------------------------------\n \n # a. 找到数值范围以确定数组大小\n min_val = min(nums)\n max_val = max(nums)\n \n # b. 定义偏移量,将所有数值映射到数组的非负索引\n offset = -min_val\n \n # c. 创建计数数组\n count_array_size = max_val - min_val + 1\n count_array = [0] * count_array_size\n \n # d. 遍历原数组,完成计数\n for num in nums:\n # 将 num 通过偏移量映射到数组索引\n index = num + offset\n count_array[index] += 1\n\n # -----------------------------------------------------------------\n # 步骤 2: 使用桶排序来找到前 K 个高频元素\n # -----------------------------------------------------------------\n\n # a. 创建桶,桶的索引代表频率\n # 桶的数量是 len(nums) + 1,因为一个元素的频率不可能超过总数\n buckets = [[] for _ in range(len(nums) + 1)]\n\n # b. 遍历计数数组,将元素放入对应频率的桶中\n for i in range(count_array_size):\n freq = count_array[i]\n if freq > 0:\n # 将索引 i 转换回原始数字\n num = i - offset\n buckets[freq].append(num)\n\n # -----------------------------------------------------------------\n # 步骤 3: 从后往前收集结果\n # -----------------------------------------------------------------\n \n result = []\n # 从最高频率的桶开始遍历\n for i in range(len(buckets) - 1, 0, -1):\n # 如果当前频率的桶中有元素\n if buckets[i]:\n # 将这个桶里的所有元素加入结果集\n result.extend(buckets[i])\n \n # 如果结果集大小已经足够,可以提前退出\n if len(result) >= k:\n break\n \n # 返回前 k 个元素,如果最后一个桶加入了多余元素,用切片保证只返回k个\n return result[:k]\n```\n---\n然后我想到遍历数组 建一个hash map(元素,频率) 然后按频率降序排序提出来前k个\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n # 1. 使用 collections.Counter 快速统计频率,O(N)\n freq_map = collections.Counter(nums)\n \n # 2. 对哈希表按值(频率)进行排序\n # sorted 函数的时间复杂度是 O(M log M),其中 M 是不同元素的数量\n # M <= N,所以最坏是 O(N log N)\n sorted_items = sorted(freq_map.items(), key=lambda item: item[1], reverse=True)\n \n # 3. 提取前 k 个元素\n result = [item[0] for item in sorted_items[:k]]\n \n return result\n```\n空间复杂度:O(N)\n时间复杂度:O(NlogN)。其中 N 是数组 nums 的长度。瓶颈在于排序那一步,即使只有 M 个独立元素,在最坏情况下 M 可能等于 N。这个复杂度不满足题目进阶要求。\n\n---\n可以看到关键问题在于排序,想办法避免排序 我就可以用最小堆来做\n维护一个最小的heapq 按频率存入 如果堆的大小超过k了就把频率最低的pop out就行\n```python\nimport collections\nimport heapq\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n # 1. 统计频率,O(N)\n freq_map = collections.Counter(nums)\n \n # 2. 维护一个大小为 k 的最小堆,O(M log k),M是不同元素的数量\n min_heap = []\n for num, freq in freq_map.items():\n # Python的heapq是最小堆,所以我们存入(频率, 数字)\n # 这样堆会根据频率排序\n heapq.heappush(min_heap, (freq, num))\n if len(min_heap) > k:\n heapq.heappop(min_heap) # pop out频率最小的元素\n \n # 3. 提取结果\n # 此时堆中的k个元素就是频率最高的k个\n result = [item[1] for item in min_heap]\n return result\n```\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3156822202","body":"双指针滑动窗口\n```python\nclass Solution:\n def lengthOfLongestSubstring(self, s: str) -> int:\n # 哈希表存储 {字符: 最后出现的位置索引}\n char_map = {}\n max_len = 0\n left = 0 # 窗口的左边界\n \n # right 是窗口的右边界,不断向右移动\n for right in range(len(s)):\n char = s[right]\n \n # 如果当前字符已经存在于哈希表中,并且其位置在当前窗口内\n if char in char_map and char_map[char] >= left:\n # 遇到重复字符,收缩窗口\n # 将左边界移动到重复字符上一次出现位置的下一个位置\n left = char_map[char] + 1\n \n # 更新字符的最新位置\n char_map[char] = right\n \n # 更新最大长度\n current_len = right - left + 1\n max_len = max(max_len, current_len)\n \n return max_len\n```\n时间复杂度:O(N)。left 和 right 两个指针都只会从头到尾遍历字符串一次,每个字符最多被访问两次。\n\n空间复杂度:O(k),其中 k 是字符串中不同字符的数量。在最坏的情况下(所有字符都不同),空间复杂度为 O(N)。如果字符集有限(例如 ASCII 码共 128 个),则空间复杂度为常数 O(128)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3156831483","body":"这道题和上一题的区别一个是子字符串(3)一个是子序列(30)\n解法还是双指针滑动窗口 只不过需要改造一下,现在要独立扫描word_len 次\n即\n>第一次扫描:从索引 0 开始,窗口每次移动 word_len,检查的子串是 s[0...], s[word_len...], s[2*word_len...] ...\n第二次扫描:从索引 1 开始,窗口每次移动 word_len,检查的子串是 s[1...], s[1+word_len...], s[1+2*word_len...] ...\n\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def findSubstring(self, s: str, words: List[str]) -> List[int]:\n if not s or not words:\n return []\n\n word_len = len(words[0])\n num_words = len(words)\n total_len = word_len * num_words\n words_freq = collections.Counter(words)\n result = []\n\n # 我们需要进行 word_len 次扫描\n for i in range(word_len):\n left = i # 当前扫描的窗口左边界\n seen = collections.Counter() # 当前窗口内单词的频率\n count = 0 # 当前窗口内有效单词的数量\n\n # 窗口右边界以 word_len 为步长滑动\n for j in range(i, len(s) - word_len + 1, word_len):\n word = s[j : j + word_len]\n \n if word in words_freq:\n seen[word] += 1\n count += 1\n \n # 如果一个单词的数量超了,就从左边收缩窗口\n while seen[word] > words_freq[word]:\n left_word = s[left : left + word_len]\n seen[left_word] -= 1\n count -= 1\n left += word_len\n \n # 如果窗口内单词数量正好,说明找到了一个解\n if count == num_words:\n result.append(left)\n # 为了继续搜索,将窗口最左边的单词移出\n left_word = s[left : left + word_len]\n seen[left_word] -= 1\n count -= 1\n left += word_len\n\n else:\n # 如果遇到的单词不在 words 列表中,则当前窗口作废\n # 直接将左边界移动到这个坏单词的后面\n seen.clear()\n count = 0\n left = j + word_len\n \n return result\n```\n时间复杂度O(N),N是字符串s的长度\n空间复杂度O(ML),M是words列表里的单词数量 L是每个单词长度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3161453831","body":"```python\nfrom typing import List\n\nclass Solution:\n def minSubarray(self, nums: List[int], p: int) -> int:\n n = len(nums)\n # 1. 同余定理:计算目标余数\n target_rem = sum(nums) % p\n \n # 如果总和已经能被 p 整除,无需移除\n if target_rem == 0:\n return 0\n \n # 2. 哈希表:存储 {余数: 最后一次出现的索引}\n # 初始化 {0: -1} 来处理从开头开始的子数组\n rem_map = {0: -1}\n min_len = n # 初始化为一个最大值\n \n # 3. 前缀和:用一个变量 current_sum 动态计算\n current_sum = 0\n \n for i, num in enumerate(nums):\n current_sum += num\n current_rem = current_sum % p\n \n # 计算需要寻找的配对余数\n needed_rem = (current_rem - target_rem + p) % p\n \n # 如果找到了配对\n if needed_rem in rem_map:\n prev_index = rem_map[needed_rem]\n # 更新最短长度\n min_len = min(min_len, i - prev_index)\n \n # 更新当前余数的最新索引\n rem_map[current_rem] = i\n \n # 如果 min_len 没有被更新过,或者更新后的值等于n(意味着要移除整个数组)\n # 则说明找不到合适的“真”子数组\n return min_len if min_len < n else -1\n```\n时间复杂度:O(N),因为我们只遍历了数组一次。\n空间复杂度:O(min(N,p)),因为哈希表中最多存储 p 个不同的余数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3169922808","body":"双指针\n```python\nfrom typing import Optional\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\n\nclass Solution:\n def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n # 初始化快慢指针\n slow = head\n fast = head\n \n # 当快指针没有走到链表末尾时\n while fast and fast.next:\n # 慢指针走一步\n slow = slow.next\n # 快指针走两步\n fast = fast.next.next\n \n # 当循环结束时,慢指针正好在中间位置\n return slow\n```\n时间复杂度:O(N)。虽然有两个指针,但我们只对链表进行了一次单向遍历。\n空间复杂度:O(1)。只使用了两个额外的指针变量,没有使用额外的存储空间。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169886502","body":"双指针/快慢指针\n快的去遍历 慢的维护只出现一次的元素\n```python\nfrom typing import List\n\nclass Solution:\n def removeDuplicates(self, nums: List[int]) -> int:\n # 如果数组为空,直接返回 0\n if not nums:\n return 0\n \n # slow 指针指向下一个将要被赋值的、新的不重复元素的位置。\n # nums[0] 默认是第一个不重复的元素,所以 slow 从 1 开始。\n slow = 1\n \n # fast 指针从第二个元素开始,遍历整个数组\n for fast in range(1, len(nums)):\n if nums[fast] != nums[fast - 1]:\n nums[slow] = nums[fast]\n slow += 1\n \n return slow","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173197055","body":"我们可以用单调队列(双端队列 (deque))来维护窗口内的“候选最大值”,使得获取当前最大值的操作是 O(1) 的\n>双端队列 (deque)\n队列中存储的是数组元素的索引,而不是元素本身。\n队列中的索引所对应的 nums 数组中的值,是从头到尾单调递减的。\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n n = len(nums)\n if n * k == 0:\n return []\n \n # 单调队列,存储的是元素的索引\n # 队列中的索引对应的 nums 值是单调递减的\n deque = collections.deque()\n result = []\n\n for i in range(n):\n # 1. 维护单调性:移除队尾所有小于当前值的元素\n while deque and nums[deque[-1]] <= nums[i]:\n deque.pop()\n \n # 2. 当前元素索引入队\n deque.append(i)\n \n # 3. 维护窗口大小:移除已经滑出窗口的队头元素\n if deque[0] <= i - k:\n deque.popleft()\n \n # 4. 记录结果:当窗口完全形成后开始记录\n if i >= k - 1:\n # 队头元素永远是当前窗口的最大值\n result.append(nums[deque[0]])\n \n return result\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3187054447","body":"```python\nfrom typing import List\n\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n # 使用一个数组记录每个人的信任差额\n trust_scores = [0] * (n + 1)\n \n for a, b in trust:\n trust_scores[a] -= 1 # 信任别人,分数-1\n trust_scores[b] += 1 # 被人信任,分数+1\n \n # 寻找分数为 n-1 的法官\n for i in range(1, n + 1):\n if trust_scores[i] == n - 1:\n return i\n \n return -1\n```\n时间复杂度: O(n + m), m为trust列表长度\n空间复杂度: O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3187045338","body":"这道题的本质是判断一个图是否为二分图 (Bipartite Graph)。\n n 个人看作是图的 n 个节点 (Vertex),每一对 dislike关系 [a, b] 看作是连接节点 a 和 b 的一条无向边 (Edge)。\n判断由人和他们之间的“不喜欢”关系构成的图,是否是一个二分图。\nDFS着色\n```python\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:\n # 1. 构建图的邻接表\n graph = [[] for _ in range(n + 1)]\n for u, v in dislikes:\n graph[u].append(v)\n graph[v].append(u)\n \n # 2. 创建 colors 数组,0:未着色, 1:颜色A, -1:颜色B\n colors = [0] * (n + 1)\n \n # 3. 遍历所有节点\n for i in range(1, n + 1):\n # 如果节点未被着色,从它开始进行DFS\n if colors[i] == 0:\n if not self.dfs(i, 1, colors, graph):\n return False\n \n return True\n\n def dfs(self, node: int, color: int, colors: List[int], graph: List[List[int]]) -> bool:\n # 给当前节点染色\n colors[node] = color\n \n # 遍历所有邻居\n for neighbor in graph[node]:\n # 如果邻居颜色与当前节点相同,产生冲突\n if colors[neighbor] == color:\n return False\n # 如果邻居未被染色,对其进行DFS\n if colors[neighbor] == 0:\n # 给邻居染上相反的颜色\n if not self.dfs(neighbor, -color, colors, graph):\n return False\n \n return True\n```\nBFS着色\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:\n # 1. 构建图的邻接表\n graph = [[] for _ in range(n + 1)]\n for u, v in dislikes:\n graph[u].append(v)\n graph[v].append(u)\n \n # 2. 创建 colors 数组\n colors = [0] * (n + 1)\n \n # 3. 遍历所有节点\n for i in range(1, n + 1):\n if colors[i] == 0: # 未被染色,开始BFS\n queue = collections.deque([i])\n colors[i] = 1 # 染上颜色A\n \n while queue:\n node = queue.popleft()\n # 遍历邻居\n for neighbor in graph[node]:\n # 如果邻居颜色与当前节点相同,冲突\n if colors[neighbor] == colors[node]:\n return False\n # 如果邻居未染色,染上相反颜色并入队\n if colors[neighbor] == 0:\n colors[neighbor] = -colors[node]\n queue.append(neighbor)\n \n return True\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3187051602","body":"双层拓扑排序 关键在于排序的规则\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:\n \n # 1. 数据预处理:为没有团队的项目分配新团队ID\n new_group_id = m\n for i in range(n):\n if group[i] == -1:\n group[i] = new_group_id\n new_group_id += 1\n \n num_groups = new_group_id\n\n # 2. 构建项目图和团队图及其入度数组\n item_graph = [[] for _ in range(n)]\n item_indegree = [0] * n\n group_graph = [[] for _ in range(num_groups)]\n group_indegree = [0] * num_groups\n\n for i in range(n):\n for prev_item in beforeItems[i]:\n # 项目图依赖\n item_graph[prev_item].append(i)\n item_indegree[i] += 1\n \n # 如果属于不同团队,则产生团队图依赖\n if group[prev_item] != group[i]:\n group_graph[group[prev_item]].append(group[i])\n group_indegree[group[i]] += 1\n\n # 3. 通用的拓扑排序函数\n def topological_sort(graph, indegree):\n num_nodes = len(graph)\n queue = collections.deque([i for i in range(num_nodes) if indegree[i] == 0])\n sorted_order = []\n while queue:\n u = queue.popleft()\n sorted_order.append(u)\n for v in graph[u]:\n indegree[v] -= 1\n if indegree[v] == 0:\n queue.append(v)\n \n return sorted_order if len(sorted_order) == num_nodes else []\n\n # 4. 执行两次拓扑排序\n item_order = topological_sort(item_graph, item_indegree)\n group_order = topological_sort(group_graph, group_indegree)\n\n if not item_order or not group_order:\n return []\n\n # 5. 合并结果\n # a. 将排好序的项目按团队分组\n items_by_group = collections.defaultdict(list)\n for item in item_order:\n items_by_group[group[item]].append(item)\n \n # b. 根据团队顺序,拼接项目\n final_result = []\n for group_id in group_order:\n final_result.extend(items_by_group[group_id])\n \n return final_result\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3193081347","body":"模拟\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n # 初始化坐标\n x, y = 0, 0\n \n # 遍历每一步\n for move in moves:\n if move == 'U':\n y += 1\n elif move == 'D':\n y -= 1\n elif move == 'L':\n x -= 1\n elif move == 'R':\n x += 1\n \n # 检查最终位置是否为原点\n return x == 0 and y == 0\n```\n或者直接看字符串里面是否满足U==D, L==R\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n # Python 的 count() 方法让这个思路的实现非常简洁\n # 检查向上和向下的步数是否相等\n vertical_balance = (moves.count('U') == moves.count('D'))\n \n # 检查向左和向右的步数是否相等\n horizontal_balance = (moves.count('L') == moves.count('R'))\n \n return vertical_balance and horizontal_balance\n```\n两个复杂度是一样的\n时间复杂度:O(N)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193084373","body":"排序 + 最小堆\nmin_heap存放已到达但未执行的任务(processingTime, original_index) 按照时间、索引排序\n```python\nimport heapq\nfrom typing import List\n\nclass Solution:\n def getOrder(self, tasks: List[List[int]]) -> List[int]:\n # 1. 数据预处理:附加原始索引并按入队时间排序\n # tasks_with_indices 的格式: [[enqueueTime, processingTime, original_index], ...]\n tasks_with_indices = sorted(\n [(tasks[i][0], tasks[i][1], i) for i in range(len(tasks))]\n )\n \n result_order = []\n min_heap = [] # 优先队列,存储 (processingTime, original_index)\n \n task_pointer = 0 # 指向下一个要检查的任务\n current_time = 0 # 当前时间\n \n # 当还有任务未处理或未入队时,循环继续\n while task_pointer < len(tasks) or min_heap:\n \n # 如果CPU空闲且没有任务在等待,快进到下一个任务的到达时间\n if not min_heap and current_time < tasks_with_indices[task_pointer][0]:\n current_time = tasks_with_indices[task_pointer][0]\n\n # 2. 将所有已到达的任务加入最小堆\n while task_pointer < len(tasks) and tasks_with_indices[task_pointer][0] <= current_time:\n enqueue_time, process_time, original_index = tasks_with_indices[task_pointer]\n heapq.heappush(min_heap, (process_time, original_index))\n task_pointer += 1\n \n # 3. 从堆中取出最优任务执行\n if min_heap:\n process_time, original_index = heapq.heappop(min_heap)\n current_time += process_time\n result_order.append(original_index)\n \n return result_order\n```\n复杂度:假设N个任务,那么时间复杂度是O(NlogN)有排序造成的,空间是O(N) tasks列表和min_heap都需要O(N)的空间","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3204406944","body":"a->c,需要len(a) - a中c的个数\nb->c需要len(b) - b中c的个数\n我们需要考虑len(a) + len(b) - (a中c的个数 + b中c的个数)\n此外还可以优化一下\n如果a= c 的字符。\nb 中需要改变的,是那些 < c 的字符。\na>=b同理\n```python\nimport collections\n\nclass Solution:\n def minCharacters(self, a: str, b: str) -> int:\n n, m = len(a), len(b)\n freq_a = collections.Counter(a)\n freq_b = collections.Counter(b)\n\n # --- 计算条件 3 的最小代价 ---\n # 代价 = 总长度 - 两个字符串中某个字符的最大总频次\n max_combined_freq = 0\n for i in range(26):\n char = chr(ord('a') + i)\n max_combined_freq = max(max_combined_freq, freq_a[char] + freq_b[char])\n \n cost3 = n + m - max_combined_freq\n\n # --- 计算条件 1 (a < b) 和 条件 2 (b < a) 的最小代价 ---\n cost1 = float('inf') # a < b\n cost2 = float('inf') # b < a\n \n # 使用前缀/后缀和的思想来优化计数\n a_lt_count = 0 # a 中 < 当前分界线的字符数\n b_lt_count = 0\n \n # 遍历所有 25 个可能的分界线 ('b' 到 'z')\n for i in range(25):\n char = chr(ord('a') + i)\n a_lt_count += freq_a[char]\n b_lt_count += freq_b[char]\n \n # 分界线是 char_next = chr(ord('a') + i + 1)\n # 条件 1 (a < char_next, b >= char_next):\n # - a 中要改的是 >= char_next 的, 即 (n - a_lt_count)\n # - b 中要改的是 < char_next 的, 即 b_lt_count\n current_cost1 = (n - a_lt_count) + b_lt_count\n cost1 = min(cost1, current_cost1)\n \n # 条件 2 (b < char_next, a >= char_next):\n # - b 中要改的是 >= char_next 的, 即 (m - b_lt_count)\n # - a 中要改的是 < char_next 的, 即 a_lt_count\n current_cost2 = (m - b_lt_count) + a_lt_count\n cost2 = min(cost2, current_cost2)\n\n return min(cost1, cost2, cost3)\n```\n时间复杂度:O(N+M),其中 N 和 M 分别是两个字符串的长度。\n空间复杂度:O(1),大小为 26 的频率表\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3208576782","body":"堆排序\n```python\nclass Solution:\n def sortArray(self, nums: List[int]) -> List[int]:\n def heapify(nums, n, i):\n largest = i\n left = 2 * i + 1\n right = 2 * i + 2\n\n if left < n and nums[left] > nums[largest]:\n largest = left\n if right < n and nums[right] > nums[largest]:\n largest = right\n if largest != i:\n nums[i], nums[largest] = nums[largest], nums[i]\n heapify(nums, n, largest)\n\n n = len(nums)\n for i in range(n // 2 - 1, -1, -1):\n heapify(nums, n, i)\n\n for i in range(n - 1, 0, -1):\n nums[i], nums[0] = nums[0], nums[i]\n heapify(nums, i, 0)\n```\n时间复杂度:O(NlogN)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3208555582","body":"二分\n```python\nclass Solution:\n def mySqrt(self, x: int) -> int:\n\n if x == 0:\n return 0\n \n # 定义二分查找的左右边界\n left, right = 0, x\n ans = 0\n \n while left <= right:\n # 计算中间值\n mid = left + (right - left) // 2\n \n # 避免 mid 为 0 的情况,或者直接判断 mid * mid\n if mid == 0:\n left = mid + 1\n continue\n \n # 比较 mid 的平方与 x\n # 为了防止 mid * mid 溢出(在某些语言中),可以写成 mid <= x / mid\n if mid * mid > x:\n # mid 太大,搜索左半部分\n right = mid - 1\n else:\n # mid 是一个可能的答案,尝试寻找更大的\n ans = mid\n left = mid + 1\n \n return ans\n```\n时间复杂度:O(logN)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208553626","body":"二分查找\n```python\nclass Solution:\n def firstBadVersion(self, n: int) -> int:\n left, right = 1, n\n \n while left < right:\n mid = left + (right - left) // 2\n \n if isBadVersion(mid):\n # 如果 mid 是坏的,那第一个坏版本在 [left, mid] 区间内\n # 我们不能排除 mid,所以 right = mid\n right = mid\n else:\n # 如果 mid 是好的,那第一个坏版本在 [mid + 1, right] 区间内\n left = mid + 1\n \n return left\n```\n时间复杂度:O(logN)\n空间复杂度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3222475353","body":"排除法\n排除掉卡片的正面和背面是同一个数字 X的卡片\n```python\nfrom typing import List\n\nclass Solution:\n def flipgame(self, fronts: List[int], backs: List[int]) -> int:\n # 1. 找出所有“不可能的”数字\n impossible_nums = set()\n for i in range(len(fronts)):\n if fronts[i] == backs[i]:\n impossible_nums.add(fronts[i])\n \n # 2. 寻找最小的“好”数字\n min_good_num = float('inf')\n found_good_num = False\n \n # 遍历所有出现过的数字\n all_nums = fronts + backs\n \n for num in all_nums:\n # 如果这个数字不是“不可能的”\n if num not in impossible_nums:\n found_good_num = True\n min_good_num = min(min_good_num, num)\n \n # 3. 返回结果\n return min_good_num if found_good_num else 0\n```\n时间复杂度:O(N),其中 N 是卡片的数量。\n空间复杂度:O(N)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3222461055","body":"二分 + DFS/BFS\n```python\nfrom typing import List\n\nclass Solution:\n def swimInWater(self, grid: List[List[int]]) -> int:\n n = len(grid)\n left, right = grid[0][0], n * n - 1\n ans = right\n\n def is_possible(t):\n # 检查在时间 t 是否能从 (0,0) 到达 (n-1, n-1)\n if grid[0][0] > t:\n return False\n \n stack = [(0, 0)]\n visited = {(0, 0)}\n \n while stack:\n r, c = stack.pop()\n if r == n - 1 and c == n - 1:\n return True\n \n for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:\n nr, nc = r + dr, c + dc\n if 0 <= nr < n and 0 <= nc < n and (nr, nc) not in visited and grid[nr][nc] <= t:\n visited.add((nr, nc))\n stack.append((nr, nc))\n return False\n\n while left <= right:\n mid = left + (right - left) // 2\n if is_possible(mid):\n ans = mid\n right = mid - 1\n else:\n left = mid + 1\n \n return ans\n```\n时间复杂度:O($n^2logn$)\n空间复杂度:O($n^2$)\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222456504","body":"Sliding Window\n维护一个固定大小为 k 的窗口,在字符串上滑动。当窗口向右移动一格时,只需要考虑移出窗口的字符和移入窗口的字符对元音数量的影响即可。\n```python\nfrom typing import List\n\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n vowels = {'a', 'e', 'i', 'o', 'u'}\n \n # 1. 初始化:计算第一个窗口的元音数\n current_vowels = 0\n for i in range(k):\n if s[i] in vowels:\n current_vowels += 1\n \n max_vowels = current_vowels\n \n # 2. 滑动窗口\n # 从第 k 个字符开始,模拟窗口向右滑动\n for i in range(k, len(s)):\n # a. 处理新移入的字符 s[i]\n if s[i] in vowels:\n current_vowels += 1\n \n # b. 处理被移出的字符 s[i-k]\n if s[i-k] in vowels:\n current_vowels -= 1\n \n # c. 更新最大值\n max_vowels = max(max_vowels, current_vowels)\n \n return max_vowels\n```\n时间复杂度:O(N)\n空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3232274052","body":"动态规划 + 滑动窗口\n定义 dp[i] 为:爱丽丝最终得分恰好为 i 的概率,最后要计算$\\sum_i=k^n dp[i]$,dp[0] = 1\n```python\nclass Solution:\n def new21Game(self, n: int, k: int, maxPts: int) -> float:\n # 如果 k=0,开始就是 >=k,游戏直接结束,得分为0,概率为1\n if k == 0:\n return 1.0\n \n # dp[i] 表示得到分数 i 的概率\n dp = [0.0] * (n + 1)\n dp[0] = 1.0\n \n # window_sum 维护一个大小为 maxPts 的滑动窗口内 dp 值的和\n window_sum = 1.0\n result = 0.0\n \n for i in range(1, n + 1):\n # 计算 dp[i]\n dp[i] = window_sum / maxPts\n \n # 如果 i < k,dp[i] 会对后续的 dp 值产生贡献,加入窗口\n if i < k:\n window_sum += dp[i]\n \n # 如果 i >= k,这是一个最终得分,累加到结果中\n # 注意:题目求的是 <= n 的概率,而 dp 数组只到 n,所以循环内累加即可\n if i >= k:\n result += dp[i]\n \n # 如果 i >= maxPts,需要将滑出窗口的 dp 值减去\n if i >= maxPts:\n window_sum -= dp[i - maxPts]\n \n return result\n```\n时间复杂度:O(n)。我们只对 dp 数组进行了一次遍历。\n空间复杂度:O(n)。用于存储 dp 数组。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3232278119","body":"滑动窗口 + 字符频率统计\n```python\nfrom typing import List\n\nclass Solution:\n def findAnagrams(self, s: str, p: str) -> List[int]:\n s_len, p_len = len(s), len(p)\n \n # 边缘情况:如果 s 比 p 短,不可能找到异位词\n if s_len < p_len:\n return []\n \n result = []\n # 使用大小为 26 的数组作为频率统计表\n p_counts = [0] * 26\n s_window_counts = [0] * 26\n \n # 1. & 2. 初始化 p 的频率表和 s 的第一个窗口的频率表\n for i in range(p_len):\n p_counts[ord(p[i]) - ord('a')] += 1\n s_window_counts[ord(s[i]) - ord('a')] += 1\n \n # 3. 第一次比较\n if p_counts == s_window_counts:\n result.append(0)\n \n # 4. 滑动窗口\n for i in range(p_len, s_len):\n # a. 移入新字符\n s_window_counts[ord(s[i]) - ord('a')] += 1\n # b. 移出旧字符\n s_window_counts[ord(s[i - p_len]) - ord('a')] -= 1\n \n # c. 再次比较\n if p_counts == s_window_counts:\n # 当前窗口的起始索引是 i - p_len + 1\n result.append(i - p_len + 1)\n \n return result\n```\n时间复杂度:O(textlen(s)+textlen(p))\n空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235951126","body":"用一个 right 指针不断地扩展窗口,直到窗口内的子串满足了“包含 t 中所有字符”的条件。一旦窗口满足条件,就记录下这个“可行解”,然后开始移动 left 指针,收缩窗口\n```python\nimport collections\n\nclass Solution:\n def minWindow(self, s: str, t: str) -> str:\n # need 存储 t 中字符的需求数量\n need = collections.Counter(t)\n # window 存储当前窗口中字符的数量\n window = collections.Counter()\n\n left, right = 0, 0\n valid = 0 # 记录 window 中有多少字符已经满足了 need 的要求\n \n # 记录最小覆盖子串的起始索引和长度\n start = 0\n min_len = float('inf')\n\n while right < len(s):\n # c 是将移入窗口的字符\n c = s[right]\n right += 1\n \n # 扩展窗口\n if c in need:\n window[c] += 1\n if window[c] == need[c]:\n valid += 1\n \n # 判断左侧窗口是否要收缩\n while valid == len(need):\n # 在这里更新最小覆盖子串\n if right - left < min_len:\n start = left\n min_len = right - left\n\n # d 是将移出窗口的字符\n d = s[left]\n left += 1\n \n # 收缩窗口\n if d in need:\n if window[d] == need[d]:\n valid -= 1\n window[d] -= 1\n\n # 返回最小覆盖子串,如果 min_len 还是初始值,说明没有找到\n return \"\" if min_len == float('inf') else s[start : start + min_len]\n```\n时间复杂度: O(len(s)+len(t))\n空间复杂度: O(N), N是字符集的大小","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3244023262","body":"dfs\n```python\nfrom typing import List\n\nclass Solution:\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n if not grid:\n return 0\n \n rows, cols = len(grid), len(grid[0])\n max_area = 0\n \n def dfs(r, c):\n # 边界条件检查 & 终止条件 (遇到水或已访问过的陆地)\n if not (0 <= r < rows and 0 <= c < cols and grid[r][c] == 1):\n return 0\n \n # 将当前单元格标记为已访问 (沉岛)\n grid[r][c] = 0\n \n # 当前单元格面积为 1,并递归探索四个方向\n return (1 + dfs(r + 1, c) +\n dfs(r - 1, c) +\n dfs(r, c + 1) +\n dfs(r, c - 1))\n\n # 遍历整个网格\n for r in range(rows):\n for c in range(cols):\n if grid[r][c] == 1:\n current_area = dfs(r, c)\n max_area = max(max_area, current_area)\n \n return max_area\n```\n时间复杂度O(MN)\n空间复杂度最坏O(MN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3251910064","body":"Multi-Source BFS\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxDistance(self, grid: List[List[int]]) -> int:\n n = len(grid)\n queue = collections.deque()\n \n # 1. 初始化:将所有陆地加入队列\n for r in range(n):\n for c in range(n):\n if grid[r][c] == 1:\n queue.append((r, c))\n \n # 边缘情况:如果全是陆地或全是海洋\n if len(queue) == 0 or len(queue) == n * n:\n return -1\n \n distance = -1\n # 2. 多源 BFS\n while queue:\n distance += 1\n # 遍历当前层的所有节点\n for _ in range(len(queue)):\n r, c = queue.popleft()\n \n # 探索四个方向的邻居\n for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:\n nr, nc = r + dr, c + dc\n \n if 0 <= nr < n and 0 <= nc < n and grid[nr][nc] == 0:\n grid[nr][nc] = 1 # 标记为已访问\n queue.append((nr, nc))\n \n return distance\n```\n时间复杂度:O(N^2)\n空间复杂度:O(N^2)\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251914219","body":"模拟+bfs\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n \n total_candies = 0\n \n # 我们拥有的、但未打开的盒子\n my_closed_boxes = set()\n # 可以打开并处理的盒子队列\n queue = collections.deque()\n\n # 初始化\n for box_idx in initialBoxes:\n if status[box_idx] == 1:\n queue.append(box_idx)\n else:\n my_closed_boxes.add(box_idx)\n\n while queue:\n box_idx = queue.popleft()\n \n # 1. 拿糖果\n total_candies += candies[box_idx]\n \n # 2. 拿钥匙,并用新钥匙尝试打开已有的盒子\n for key in keys[box_idx]:\n status[key] = 1 \n if key in my_closed_boxes:\n queue.append(key)\n my_closed_boxes.remove(key)\n \n # 3. 拿新盒子\n for contained_box in containedBoxes[box_idx]:\n if status[contained_box] == 1:\n queue.append(contained_box)\n else:\n my_closed_boxes.add(contained_box)\n \n return total_candies\n```\n时间复杂度: O(盒子数+钥匙数+内涵盒子数)\n\n空间复杂度: O(盒子数)。最坏情况下要存储所有盒子的信息。\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260205356","body":"dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n```python\nclass Solution:\n def minCostClimbingStairs(self, cost: List[int]) -> int:\n n = len(cost)\n dp = [0] * (n + 1)\n \n # dp[0] 和 dp[1] 默认为 0,因为可以从这两级开始\n \n # 从第 2 级台阶开始,应用转移方程\n for i in range(2, n + 1):\n dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n \n return dp[n]\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3276673110","body":"dp[i] = max(nums[i-1] + dp[i-2], dp[i-1])\n\n```python\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n n = len(nums)\n if n == 0: return 0\n if n == 1: return nums[0]\n \n dp = [0] * (n + 1)\n dp[0] = 0\n dp[1] = nums[0]\n \n for i in range(2, n + 1):\n dp[i] = max(nums[i-1] + dp[i-2], dp[i-1])\n \n return dp[n]\n```\n可以优化到只依赖前两个状态来节省内存空间\n```python\nfrom typing import List\n\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n # rob_prev 代表 dp[i-2],rob_curr 代表 dp[i-1]\n rob_prev, rob_curr = 0, 0\n \n for num in nums:\n # 计算 dp[i] = max(num + dp[i-2], dp[i-1])\n temp = max(num + rob_prev, rob_curr)\n # 更新状态,为下一次循环做准备\n rob_prev = rob_curr\n rob_curr = temp\n \n return rob_curr\n```\n时间复杂度: O(N)\n空间复杂度: O(1)\n\n\n\n\n\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3276687323","body":"dp[i] = 1 + max(dp[j]),其中 0 <= j < i 且 nums[j] < nums[i]。\n```python\nfrom typing import List\n\nclass Solution:\n def findNumberOfLIS(self, nums: List[int]) -> int:\n n = len(nums)\n if n <= 1:\n return n\n \n # lengths[i]: 以 nums[i] 结尾的 LIS 长度\n # counts[i]: 以 nums[i] 结尾的 LIS 个数\n lengths = [1] * n\n counts = [1] * n\n\n # 填充 DP 数组\n for i in range(n):\n for j in range(i):\n if nums[j] < nums[i]:\n # 情况一:发现更长的子序列\n if lengths[j] + 1 > lengths[i]:\n lengths[i] = lengths[j] + 1\n counts[i] = counts[j] # 路径数继承\n # 情况二:发现另一条同样长的子序列\n elif lengths[j] + 1 == lengths[i]:\n counts[i] += counts[j] # 路径数累加\n\n max_len = max(lengths)\n result = 0\n for i in range(n):\n if lengths[i] == max_len:\n result += counts[i]\n \n return result\n```\n时间复杂度: O(N^2)\n\n空间复杂度: O(N)\n\n","onTime":false},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3276694316","body":"dp[r][c] =骑士当前位于棋盘上 (r, c) 位置的概率\n从 (r, c) 出发,能为下一个状态 dp_curr 中的 (nr, nc) 贡献 dp_prev[r][c] / 8 的概率\ndp_curr[nr][nc]=\\sum dp(nr, nc)\n```python\nfrom typing import List\n\nclass Solution:\n def knightProbability(self, n: int, k: int, row: int, column: int) -> float:\n # dp[r][c] 表示骑士在 (r, c) 位置的概率\n dp = [[0.0] * n for _ in range(n)]\n dp[row][column] = 1.0\n \n # 骑士的8个移动方向\n moves = [(-2, -1), (-2, 1), (-1, -2), (-1, 2),\n (1, -2), (1, 2), (2, -1), (2, 1)]\n \n # 迭代 k 步\n for _ in range(k):\n # dp_next 用于存储下一步的概率分布\n dp_next = [[0.0] * n for _ in range(n)]\n \n # 遍历棋盘上所有位置\n for r in range(n):\n for c in range(n):\n # 如果当前位置有概率 > 0\n if dp[r][c] > 0:\n # 尝试8种移动\n for dr, dc in moves:\n nr, nc = r + dr, c + dc\n \n # 如果移动后的位置在棋盘内\n if 0 <= nr < n and 0 <= nc < n:\n # 将概率贡献给下一个状态\n dp_next[nr][nc] += dp[r][c] / 8.0\n \n # 用新状态覆盖旧状态\n dp = dp_next\n \n # 计算最终仍在棋盘上的总概率\n total_probability = sum(sum(row) for row in dp)\n return total_probability\n```\n时间复杂度 O(kn^2)\n空间复杂度: O(n^2)","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gjwang224":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3086564307","body":"## Code\n```cpp\nclass Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n int len = num.size()-1;\n vector returnNum;\n int tmp=0;\n \n while(k && len>=0){\n returnNum.push_back((num[len] + k%10 + tmp)%10);\n tmp = (num[len] + k%10 + tmp)/10;\n len--;\n k = k/10;\n }\n\n while(k){\n returnNum.push_back((k%10 + tmp)%10);\n tmp = (k%10 + tmp)/10;\n k = k/10;\n }\n \n while(len>=0){\n returnNum.push_back((num[len] + tmp)%10);\n tmp = (num[len] + tmp)/10;\n len--;\n }\n \n if(tmp) returnNum.push_back(tmp);\n reverse(returnNum.begin(), returnNum.end());\n return returnNum;\n }\n};","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3093190969","body":"#### C++\n``` C++\nclass Solution {\npublic:\n vector shortestToChar(string s, char c) {\n vector dis, rearr;\n for(int i = 0; i < s.size(); i++) if(s.at(i) == c) dis.push_back(i);\n for(int i = 0; i < s.size(); i++){\n int minn = 1e5+5;\n for(int j = 0; j < dis.size(); j++){\n minn = min(minn, abs(i-dis.at(j)));\n }\n rearr.push_back(minn);\n }\n return rearr;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3087031064","body":"### C++ 代码\n``` C++\nclass CustomStack {\npublic:\n int stack[1005];\n int size = -1, mS;\n CustomStack(int maxSize) {\n mS = maxSize;\n }\n \n void push(int x) {\n if(size < mS-1){\n stack[++size] = x;\n }\n }\n \n int pop() {\n if(size < 0) return -1;\n else return stack[size--];\n }\n \n void increment(int k, int val) {\n for(int i = 0; i < k; i++){\n stack[i] += val;\n }\n }\n};\n\n/**\n * Your CustomStack object will be instantiated and called as such:\n * CustomStack* obj = new CustomStack(maxSize);\n * obj->push(x);\n * int param_2 = obj->pop();\n * obj->increment(k,val);\n */\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3086899860","body":"### 思路 \n遍历整个字符串,总共有四种可能,分别是 数字 字母 左括号 右括号\n1. 数字:定义`digit`存储读取到的数字\n2. 字母:可以直接读取累加至`res`\n3. 左括号:需要将前面的`res`和`digit`分别入栈,并将其赋为0和”“\n4. 右括号:读取栈顶元素,循环拼接后,累加至`res`\n### C++ 代码\n``` C++\nclass Solution {\npublic:\n string decodeString(string s) {\n stack numStack;\n stack strStack;\n int digit=0;\n string res=\"\";\n\n for(int i = 0; i < s.size(); i++){\n if(s.at(i) >= '0' && s.at(i) <= '9'){// 数字\n digit = digit*10+s.at(i)-'0';\n } else if(s.at(i) >= 'a' && s.at(i) <= 'z'){// 字符\n res += s.at(i);\n } else if(s.at(i) == '['){// 左括号\n numStack.push(digit);\n strStack.push(res);\n res = \"\";\n digit=0;\n } else {// 右括号\n int count = numStack.top();\n numStack.pop();\n string outString = strStack.top();\n strStack.pop();\n for(int i = 0; i < count; i++) outString += res;\n res = outString;\n }\n }\n return res;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092046146","body":"#### 思路\n\n1. `push`和`empty`可以直接进行操作。\n2. `pop`和 `peek`需要得到入栈的第一个元素,可以使用一个辅助栈,对第一个栈进行出栈同时第二个栈进行入栈操作,这样第二个栈`top`得到的元素就是第一个栈入栈的第一个元素。\n\n``` C++\nclass MyQueue {\npublic:\n stack tmp;\n stack stack;\n MyQueue() {\n }\n \n void push(int x) {\n tmp.push(x);\n }\n \n int pop() {\n while(!tmp.empty()){\n stack.push(tmp.top());\n tmp.pop();\n }\n int a = stack.top();\n stack.pop();\n while(!stack.empty()){\n tmp.push(stack.top());\n stack.pop();\n }\n return a;\n }\n \n int peek() {\n while(!tmp.empty()){\n stack.push(tmp.top());\n tmp.pop();\n }\n int a = stack.top();\n while(!stack.empty()){\n tmp.push(stack.top());\n stack.pop();\n }\n return a;\n }\n \n bool empty() {\n return tmp.empty();\n }\n};\n\n/**\n * Your MyQueue object will be instantiated and called as such:\n * MyQueue* obj = new MyQueue();\n * obj->push(x);\n * int param_2 = obj->pop();\n * int param_3 = obj->peek();\n * bool param_4 = obj->empty();\n */\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094511890","body":"#### 哈希\n\n```c++\nclass Solution {\npublic:\n int maxChunksToSorted(vector& arr) {\n unordered_map ans;\n vector tmp = arr;\n sort(tmp.begin(), tmp.end());\n int cnt=0;\n for(int i = 0; i < arr.size(); i++){\n ans[arr[i]]++;\n ans[tmp[i]]--;\n if(ans[arr[i]]==0) ans.erase(arr[i]);\n if(ans[tmp[i]]==0) ans.erase(tmp[i]);\n if(ans.empty()) cnt++;\n }\n return cnt;\n }\n};\n```\n时间复杂度 nlog(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095832085","body":"#### 思路\n\n先将链表变为首尾相连循环链表,然后通过`k`找到断开位置的前一个元素,断开,返回头节点即可。\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * struct ListNode *next;\n * };\n */\nstruct ListNode* rotateRight(struct ListNode* head, int k) {\n if(head==NULL || k==0) return head;\n int len=1;\n struct ListNode * p=head;\n if(p) len=1;\n while(p->next){\n len++;\n p = p->next;\n }\n //printf(\"%d\\n\", len);\n p->next = head;\n k = k%len;\n for(int i = 0; i < len-k-1; i++){\n head = head->next;\n }\n p = head->next;\n head->next = NULL;\n return p;\n}\n```\n\n时间复杂度O(n)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3102195778","body":"#### C代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * struct ListNode *next;\n * };\n */\nstruct ListNode* swapPairs(struct ListNode* head) {\n //struct ListNode Node;\n //Node.next = head;\n //struct ListNode* tmp = &Node;\n struct ListNode* Node=(struct ListNode*)malloc(sizeof(struct ListNode));\n Node->next = head;\n struct ListNode* tmp = Node;\n while(tmp->next && tmp->next->next){\n struct ListNode* first = tmp->next;\n struct ListNode* second = tmp->next->next;\n tmp->next = second;\n first->next = second->next;\n second->next = first;\n tmp = first;\n }\n return Node->next;\n}\n```\n\n时间复杂度O(n)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3106692662","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode() : val(0), next(nullptr) {}\n * ListNode(int x) : val(x), next(nullptr) {}\n * ListNode(int x, ListNode *next) : val(x), next(next) {}\n * };\n */\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n TreeNode* sortedListToBST(ListNode* head) {\n if(head==NULL) return NULL;\n int n = 0;\n for(auto p=head; p; p=p->next){\n n++;\n }\n if(n==1) return new TreeNode(head->val);\n auto cur = head;\n for(int i = 0; i < n/2-1; i++) cur = cur->next;\n auto root = new TreeNode(cur->next->val);\n root->right = sortedListToBST(cur->next->next);\n cur->next = NULL;\n root->left = sortedListToBST(head);\n return root;\n }\n};\n```\n\n时间复杂度O(nlog(n))","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112024319","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode(int x) : val(x), next(NULL) {}\n * };\n */\nclass Solution {\npublic:\n ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {\n if(headA==NULL || headB==NULL) return NULL;\n ListNode *a = headA, *b = headB;\n while(a!=b){\n if(a == NULL) a = headB;\n a = a->next;\n if(b == NULL) b = headA;\n b = b->next;\n }\n return a;\n }\n};\n```\n\n时间复杂度O(n+m)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116982615","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode(int x) : val(x), next(NULL) {}\n * };\n */\nclass Solution {\npublic:\n ListNode *detectCycle(ListNode *head) {\n unordered_map visit;\n while(head){\n visit[head]++;\n if(visit[head]==2) return head;\n head=head->next;\n } \n return NULL;\n }\n};\n```\n\n时间复杂度O(n)\n\n空间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121297965","body":"#### C++代码\n\n- hash表: `unordered_map hash;`\n- 双向链表用来 将`Node` 根据 使用时间 进行排序。靠近左端表示最近使用,靠近右端表示较长时间没有使用。\n\n``` c\nclass LRUCache {\npublic:\n struct Node {\n int key, val;\n Node *prev, *next;\n Node(int _key, int _val): key(_key), val(_val), prev(NULL), next(NULL){}\n }*L, *R; //L头节点 R尾节点\n\n unordered_map hash;\n int n;\n\n void delete_node(Node *p){\n p->next->prev = p->prev;\n p->prev->next = p->next;\n }\n\n void insert_node(Node *p){ //链表头插入\n p->next = L->next;\n L->next->prev = p;\n p->prev = L;\n L->next = p;\n }\n\n LRUCache(int capacity) {\n n = capacity;\n L = new Node(-1, -1);\n R = new Node(-1, -1);\n L->next = R;\n R->prev = L;\n }\n \n int get(int key) {\n if(!hash.count(key)) return -1;\n else{\n auto p = hash[key];\n delete_node(p);\n insert_node(p);\n return p->val;\n }\n }\n \n void put(int key, int value) {\n if(!hash.count(key)){\n if(hash.size()==n){\n auto p = R->prev;\n delete_node(p);\n hash.erase(p->key);\n }\n auto p = new Node(key, value);\n hash[key] = p;\n insert_node(p);\n }else {\n auto p = hash[key];\n p->val = value;\n delete_node(p);\n insert_node(p);\n }\n }\n};\n\n/**\n * Your LRUCache object will be instantiated and called as such:\n * LRUCache* obj = new LRUCache(capacity);\n * int param_1 = obj->get(key);\n * obj->put(key,value);\n */\n```\n\n时间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124142122","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n int maxDepth(TreeNode* root) {\n if(root == NULL) return 0;\n return max(maxDepth(root->left), maxDepth(root->right)) + 1;\n }\n};\n```\n\n时间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125702334","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n bool isSameTree(TreeNode* p, TreeNode* q) {\n if(p==NULL && q==NULL) return true;\n else if(p==NULL && q!=NULL) return false;\n else if(p!=NULL && q==NULL) return false;\n else if(q->val != p->val) return false;\n else return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);\n }\n};\n```\n\n时间复杂度O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130752830","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n int dfs(TreeNode *root, int sum) {\n if(root == nullptr) return 0;\n int tmp = sum*10+root->val;\n if(root->left==nullptr && root->right==nullptr) return tmp;\n return dfs(root->left, tmp) + dfs(root->right, tmp);\n }\n int sumNumbers(TreeNode* root) {\n return dfs(root, 0);\n }\n};\n```\n\n时间复杂度O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135775890","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n void dfs(TreeNode* root, int height, int &curVal, int &curHeight){\n if(root==nullptr) return ;\n height++;\n dfs(root->left, height, curVal, curHeight);\n dfs(root->right, height, curVal, curHeight);\n if (height > curHeight) {\n curHeight = height;\n curVal = root->val;\n }\n }\n int findBottomLeftValue(TreeNode* root) {\n int curVal=0, curHeight=0;\n dfs(root, 0, curVal, curHeight);\n return curVal;\n }\n};\n```\n\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3139476046","body":"#### C++代码\n\n``` c\nclass Codec {\npublic:\n\n // Encodes a tree to a single string.\n void rserialize(TreeNode* root, string& str) {\n // 前序遍历(中左右,遇到空节点输入None),用逗号隔开\n if (root == NULL) str += \"None,\";\n else {\n str += to_string(root->val) + \",\";\n rserialize(root->left, str);\n rserialize(root->right, str);\n } \n }\n string serialize(TreeNode* root) {\n string ret;\n rserialize(root, ret);\n return ret;\n }\n\n // Decodes your encoded data to tree.\n\n TreeNode* rdeserialize(list& dataArray) {\n if(dataArray.front() == \"None\") {\n dataArray.erase(dataArray.begin());\n return NULL;\n }\n // 前序遍历(中左右)恢复树结构\n TreeNode* root = new TreeNode(stoi(dataArray.front()));\n dataArray.erase(dataArray.begin());\n root->left = rdeserialize(dataArray);\n root->right = rdeserialize(dataArray);\n return root;\n }\n\n TreeNode* deserialize(string data) {\n list dataArray;\n string str;\n // 添加各节点val\n // 按引用传递,按值传递会增加耗时\n for (auto& c : data) {\n if (c == ',') {\n // 以逗号作为节点分割\n dataArray.push_back(str);\n str.clear();\n } else {\n str.push_back(c);\n }\n }\n // 添加尾部节点val\n if (!str.empty()) {\n dataArray.push_back(str);\n str.clear();\n }\n return rdeserialize(dataArray);\n }\n};\n\n\n//参考链接:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/solutions/1536508/by-peaceful-thompsonfsu-8143/\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144061296","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n // 深度优先搜索函数 参数:当前节点、当前行号、当前列号、存储节点信息的map\n void dfs(TreeNode* node, int row, int col, map>>& colNodes) {\n // 若节点为空,直接返回\n if (node == nullptr) {\n return;\n }\n \n // 记录当前节点的信息:(行号, 值) 存入对应列的列表中\n colNodes[col].push_back({row, node->val});\n \n // 递归处理左子树:行号+1,列号-1\n dfs(node->left, row + 1, col - 1, colNodes);\n \n // 递归处理右子树:行号+1,列号+1\n dfs(node->right, row + 1, col + 1, colNodes);\n }\n\n // 自定义比较函数:用于对同一列的节点进行排序\n static bool compareNodes(const pair& a, const pair& b) {\n // 若行号相同,按节点值从小到大排序\n if (a.first == b.first) {\n return a.second < b.second;\n }\n // 否则按行号从小到大排序\n return a.first < b.first;\n }\n\n vector> verticalTraversal(TreeNode* root) {\n // 存储列号到节点信息的映射:key=列号,value=该列所有节点的(行号, 值)\n map>> colNodes;\n \n // 深度优先遍历树,记录每个节点的位置和值\n dfs(root, 0, 0, colNodes);\n \n // 最终结果容器\n vector> result;\n \n // 遍历每一列\n for (auto& entry : colNodes) {\n // 对当前列的节点按规则排序(使用自定义比较函数)\n sort(entry.second.begin(), entry.second.end(), compareNodes);\n \n // 提取排序后的节点值,组成当前列的结果\n vector colValues;\n for (auto& node : entry.second) {\n colValues.push_back(node.second); // node.second是节点值\n }\n result.push_back(colValues);\n }\n \n return result;\n }\n};\n\n//参考链接:https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/solutions/3739810/dui-wo-lai-shuo-huan-shi-fu-za-liao-xie-iar46/\n\n```\n\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146382948","body":"#### C++代码\n\n``` c\nclass Solution {\npublic:\n vector twoSum(vector& nums, int target) {\n unordered_map hash;\n for(int i = 0; i < nums.size(); i++){\n auto iter = hash.find(target-nums[i]);\n if(iter != hash.end()) return {iter->second, i};\n hash[nums[i]] = i;\n }\n return {};\n }\n};\n```\n\n时间复杂度:O(n)\n\n空间复杂度:O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148379333","body":"#### C++\n\n``` c\nclass Solution {\npublic:\n vector topKFrequent(vector& nums, int k) {\n vector ans;\n unordered_map f;\n for(int i = 0;i < nums.size();i++) {\n f[nums[i]]++;\n }\n priority_queue, vector >, greater > > q;\n for(auto& [num, count] : f) {\n if(q.size() < k)\n q.push({count, num});\n else {\n if(q.top().first < count) {\n q.pop();\n q.push({count, num});\n }\n }\n }\n while(!q.empty()) {\n //cout<>& points) {\n int result=0;\n for(vector P : points){\n unordered_map map;\n for(vector Q : points){\n int dis = (P[0]-Q[0])*(P[0]-Q[0])+(P[1]-Q[1])*(P[1]-Q[1]);\n map[dis]++;\n }\n for(auto [a,b] : map){\n result+=b*(b-1);\n }\n }\n return result;\n }\n};\n```\n\n时间复杂度:O(n2)\n空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3154861022","body":"``` c\nclass Solution {\npublic:\n int lengthOfLongestSubstring(string s) {\n unordered_map dic;\n int i = -1, res = 0, len = s.size();\n for(int j = 0; j < len; j++) {\n if (dic.find(s[j]) != dic.end())\n i = max(i, dic.find(s[j])->second);\n dic[s[j]] = j;\n res = max(res, j - i);\n }\n return res;\n }\n};\n```\n\n时间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3158408178","body":"\n\n``` c\nclass Solution {\npublic:\n vector findSubstring(string s, vector& words) {\n unordered_map hash;\n vector res;\n int n = s.length(), m = words.size();\n if (n == 0 || m == 0)\n return res;\n int len = words[0].length(), end = n - m * len;\n if (n < m * len)\n return res;\n for (auto word : words)\n hash[word]++;\n int size = hash.size();\n for (int k = 0; k < len; k++) {\n unordered_map cur_hash;\n int satisfy = 0;\n for (int i = k, j = k; j <= n - len;) {\n string cur = s.substr(j, len);\n if (hash.find(cur) == hash.end()) {\n j = j + len;\n i = j;\n cur_hash.clear();\n satisfy = 0;\n } else {\n cur_hash[cur]++;\n if (cur_hash[cur] == hash[cur])\n satisfy++;\n else if (cur_hash[cur] > hash[cur]) {\n while (i < j && cur_hash[cur] > hash[cur]) {\n string temp = s.substr(i, len);\n i += len;\n cur_hash[temp]--;\n if (cur_hash[temp] == hash[temp] - 1)\n satisfy--;\n }\n }\n if (satisfy == size) {\n string temp = s.substr(i, len);\n cur_hash[temp]--;\n satisfy--;\n res.push_back(i);\n i = i + len;\n }\n j = j + len;\n }\n }\n }\n return res;\n }\n};\n```\n\n时间复杂度O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3163210992","body":"\n\n``` c\nclass Solution {\npublic:\n int minSubarray(vector &nums, int p) {\n int n = nums.size(), s[n + 1];\n s[0] = 0;\n for (int i = 0; i < n; i++) s[i + 1] = (s[i] + nums[i]) % p;\n int x = s[n];\n\n int ans = n;\n unordered_map last;\n for (int i = 0; i <= n; ++i) {\n last[s[i]] = i;\n auto it = last.find((s[i] - x + p) % p);\n if (it != last.end()) {\n ans = min(ans, i - it->second);\n }\n }\n return ans < n ? ans : -1;\n }\n};\n```\n\n时间复杂度O(n)\n空间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3167368429","body":"\n\n``` c\nclass Solution {\npublic:\n ListNode* middleNode(ListNode* head) {\n int len = 0;\n ListNode* p = head;\n while (p != nullptr) {\n len++;\n p = p->next;\n }\n int k = 0;\n p = head;\n while (k < len / 2) {\n k++;\n p = p->next;\n }\n return p;\n }\n};\n```\n\n时间复杂度O(n)\n空间复杂度O(1)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169793378","body":"```c\nclass Solution {\npublic:\n int removeDuplicates(vector& nums) {\n if (nums.empty()) {\n return 0;\n }\n int slow = 0;\n for (int fast = 1; fast < nums.size(); fast++) {\n if (nums[fast] != nums[slow]) {\n slow++;\n nums[slow] = nums[fast];\n }\n }\n return slow + 1;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172513759","body":"```c\n\nclass Solution {\npublic:\n int searchInsert(vector& nums, int target) {\n int n = nums.size();\n int left = 0, right = n - 1, ans = n;\n while (left <= right) {\n int mid = ((right - left) / 2) + left;\n if (target <= nums[mid]) {\n ans = mid;\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n return ans;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173606055","body":"```c\nclass Solution {\npublic:\n vector maxSlidingWindow(vector& nums, int k) {\n if(nums.size() == 0 || k == 0) return {};\n deque deque;\n vector res(nums.size() - k + 1);\n for(int j = 0, i = 1 - k; j < nums.size(); i++, j++) {\n if(i > 0 && deque.front() == nums[i - 1])\n deque.pop_front();\n while(!deque.empty() && deque.back() < nums[j])\n deque.pop_back();\n deque.push_back(nums[j]);\n if(i >= 0)\n res[i] = deque.front();\n }\n return res;\n }\n }\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178242802","body":"```c\nclass Solution {\npublic:\n int findJudge(int n, vector>& trust) {\n vector inDegrees(n + 1);\n vector outDegrees(n + 1);\n for (auto& edge : trust) {\n int x = edge[0], y = edge[1];\n ++inDegrees[y];\n ++outDegrees[x];\n }\n for (int i = 1; i <= n; ++i) {\n if (inDegrees[i] == n - 1 && outDegrees[i] == 0) {\n return i;\n }\n }\n return -1;\n }\n};\n\n```","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3213208919","body":"```C++\nclass Solution {\npublic:\n bool judgeCircle(string moves) {\n int R=0,L=0,U=0,D=0;\n for(int i = 0; i < moves.size(); i++){\n if(moves[i]=='R') R++;\n if(moves[i]=='L') L++;\n if(moves[i]=='U') U++;\n if(moves[i]=='D') D++;\n }\n if(R==L&&U==D) return true;\n else return false;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193632408","body":"```c\n\nclass Solution {\npublic:\n vector getOrder(vector>& tasks) {\n long now = 0; \n priority_queue, vector>, greater> >entry, ready;\n int size = tasks.size();\n\n for (int i = 0; i < size; ++i){\n entry.push(make_pair(tasks[i][0], i));\n }\n\n vector res;\n while(!entry.empty() or !ready.empty()){\n if (ready.empty()){\n now = entry.top().first;\n while (!entry.empty() && now == entry.top().first){ \n ready.push(make_pair(tasks[entry.top().second][1], entry.top().second));\n entry.pop();\n }\n }\n res.emplace_back(ready.top().second);\n now += ready.top().first;\n ready.pop();\n\n while(!entry.empty() && entry.top().first <= now){ \n ready.push(make_pair(tasks[entry.top().second][1], entry.top().second));\n entry.pop();\n }\n }\n\n return res;\n }\n};\n\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3213243204","body":"```C++\nclass Solution {\npublic:\n int numberOfRounds(string startTime, string finishTime) {\n // 转化为分钟\n int t0 = 60 * stoi(startTime.substr(0, 2)) + stoi(startTime.substr(3, 2));\n int t1 = 60 * stoi(finishTime.substr(0, 2)) + stoi(finishTime.substr(3, 2));\n if (t1 < t0){\n t1 += 1440;\n }\n // 第一个小于等于 finishTime 的完整对局的结束时间\n t1 = t1 / 15 * 15;\n return max(0, (t1 - t0)) / 15;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3213232703","body":"```C++\nclass Solution {\npublic:\n int minCharacters(string a, string b) {\n int n = a.size(), m = b.size();\n vector cntA(26, 0), cntB(26, 0);\n for (char c : a)\n ++cntA[c - 'a'];\n for (char c : b)\n ++cntB[c - 'a'];\n\n // 计算前缀和\n vector preA(27, 0), preB(27, 0);\n for (int i = 0; i < 26; ++i) {\n preA[i + 1] = preA[i] + cntA[i];\n preB[i + 1] = preB[i] + cntB[i];\n }\n\n int ans = INT_MAX;\n\n // 条件 1\n for (int k = 1; k < 26; ++k) {\n int costA = n - preA[k];\n int costB = preB[k];\n ans = min(ans, costA + costB);\n }\n\n // 条件 2\n for (int k = 0; k < 25; ++k) {\n int costA = preA[k + 1];\n int costB = m - preB[k + 1];\n ans = min(ans, costA + costB);\n }\n\n // 条件 3\n for (int ch = 0; ch < 26; ++ch) {\n int costA = n - cntA[ch];\n int costB = m - cntB[ch];\n ans = min(ans, costA + costB);\n }\n\n return ans;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3213189716","body":"```c++\nclass Solution {\npublic:\n vector sortArray(vector& nums) {\n if (nums.empty()) return nums;\n quickSort(nums, 0, static_cast(nums.size()) - 1);\n return nums;\n }\n\nprivate:\n void quickSort(vector& nums, int l, int r) {\n if (l >= r) return;\n int p = partition(nums, l, r);\n quickSort(nums, l, p - 1);\n quickSort(nums, p + 1, r);\n }\n\n int partition(vector& nums, int l, int r) {\n int idx = l + rand() % (r - l + 1);\n swap(nums[idx], nums[r]);\n int pivot = nums[r];\n\n int i = l - 1;\n for (int j = l; j < r; ++j) {\n if (nums[j] < pivot) {\n ++i;\n swap(nums[i], nums[j]);\n }\n }\n swap(nums[i + 1], nums[r]);\n return i + 1;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3213176894","body":"```c++\nclass Solution {\npublic:\n int mySqrt(int x) {\n int l = 0, r = x, ans=0;\n while(l<=r){\n int mid = l + (r-l)/2;\n if((long long)mid*mid<=x){\n ans = mid;\n l = mid+1;\n } else{\n //ans = mid;\n r = mid-1;\n }\n \n }\n return ans;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3213126368","body":"```c++\nclass Solution {\npublic:\n int firstBadVersion(int n) {\n int l = 1, r = n;\n while(l w;\n\n int reversePairs(vector& nums) {\n return merge_sort(nums, 0, nums.size()-1);\n }\n\n int merge_sort(vector &nums, int l, int r) {\n if(l>=r) return 0;\n int mid = l+r>>1;\n int res = merge_sort(nums, l, mid) + merge_sort(nums, mid+1, r);\n for(int i = l, j = mid+1; i <= mid; i++){\n while(j<=r && nums[j]*2ll& houses, vector& heaters) {\n for (int i = 0, j = 0; i < houses.size(); i ++ ) {\n while (j < heaters.size() && abs(heaters[j] - houses[i]) > mid)\n j ++ ;\n if (j >= heaters.size()) return false;\n }\n return true;\n }\n\n int findRadius(vector& houses, vector& heaters) {\n sort(houses.begin(), houses.end());\n sort(heaters.begin(), heaters.end());\n int l = 0, r = INT_MAX;\n while (l < r) {\n int mid = (long long)l + r >> 1;\n if (check(mid, houses, heaters)) r = mid;\n else l = mid + 1;\n }\n return r;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217486441","body":"```C++\nclass Solution {\npublic:\n bool check(vector& nums,int n,int k,int mid)\n {\n int cnt = 0;\n for(int i = 0,j = 1; i < n - 1 ; i ++)\n {\n while(j < n && nums[j] - nums[i] <= mid)\n j ++;\n cnt += j - i - 1;\n j = max(j,i + 1);\n }\n return cnt >= k;\n }\n int smallestDistancePair(vector& nums, int k)\n {\n int n = nums.size();\n sort(nums.begin(),nums.end());\n int left = 0,right = nums[n - 1] - nums[0];\n while(left < right)\n {\n int mid = (left + right) >> 1;\n if(check(nums,n,k,mid)) right = mid;\n else left = mid + 1;\n }\n return left;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3219872784","body":"```C++\nclass Solution {\npublic:\n int swimInWater(vector>& grid) {\n int m = grid.size(), n = grid[0].size();\n vector> dis(m, vector(n, INT_MAX));\n dis[0][0] = grid[0][0];\n vector> dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};\n priority_queue, vector>, greater<>> pq;\n pq.emplace(grid[0][0], 0, 0);\n while (!pq.empty()) {\n auto [d, x, y] = pq.top();\n pq.pop();\n if (x == m - 1 && y == n - 1) {\n return d;\n }\n if (d > dis[x][y]) {\n continue;\n }\n for (auto& dir : dirs) {\n int nx = x + dir[0], ny = y + dir[1];\n if (nx >= 0 && nx < m && ny >= 0 && ny < n) {\n int nd = max(d, grid[nx][ny]);\n if (nd < dis[nx][ny] ) {\n dis[nx][ny] = nd;\n pq.emplace(nd, nx, ny);\n }\n }\n }\n }\n return -1;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3223228330","body":"```C++\nclass Solution {\npublic:\n bool pd(char a){\n if(a == 'a'||a == 'e'||a == 'i'||a == 'o'||a == 'u') return true;\n return false;\n }\n int maxVowels(string s, int k) {\n int count = 0, cnt=0;\n int l = 0, r = k-1;\n for(int i = 0; i <= r; i++) if(pd(s.at(i))) count++;\n cnt = count;\n if(s.size() == k) return count;\n while(++r != s.size()){\n if(pd(s.at(l))) count--;\n if(pd(s.at(r))) count++;\n l++;\n cnt = max(cnt, count);\n }\n return cnt;\n }\n};\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243929010","body":"```C++\nclass Solution {\npublic:\n int getArea(vector>& grid, int i, int j) {\n if (i == grid.size() || i < 0)\n return 0;\n else if (j == grid[0].size() || j < 0)\n return 0;\n if (grid[i][j] == 1) {\n grid[i][j] = 0;\n return 1 + getArea(grid, i + 1, j) + getArea(grid, i - 1, j) +\n getArea(grid, i, j + 1) + getArea(grid, i, j - 1);\n }\n return 0;\n }\n int maxAreaOfIsland(vector>& grid) {\n int maxArea = 0;\n int area = 0;\n for (int i = 0; i < grid.size(); i++) {\n for (int j = 0; j < grid[0].size(); j++) {\n if (grid[i][j] == 1) {\n area = getArea(grid, i, j);\n maxArea = maxArea > area ? maxArea : area;\n }\n }\n }\n return maxArea;\n }\n};\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3268602696","body":"```C++\nclass Solution {\npublic:\n int longestCommonSubsequence(string text1, string text2) {\n int n = (int)text1.size(), m = (int)text2.size();\n vector dp(m + 1, 0);\n for (int i = 1; i <= n; ++i) {\n int prev = 0; // 相当于 dp[i-1][j-1]\n for (int j = 1; j <= m; ++j) {\n int tmp = dp[j];\n if (text1[i - 1] == text2[j - 1]) dp[j] = prev + 1;\n else dp[j] = max(dp[j], dp[j - 1]);\n prev = tmp;\n }\n }\n return dp[m];\n }\n};\n\n```\n时间复杂度O(n*m)\n空间复杂度O(min(n,m))","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290572491","body":"```C++\nclass Solution {\npublic:\n int coinChange(vector& coins, int amount) {\n vector dp(amount+1,INT_MAX);\n dp[0]=0;\n for(int i=0;i addToArrayForm(int[] num, int k) {\n int n = num.length, carry = 0, i = n - 1;\n List res = new ArrayList<>();\n \n while (i >= 0 || k > 0 || carry > 0) {\n int kDigit = k % 10;\n k /= 10;\n int sum = i >= 0 ? carry + kDigit + num[i] : carry + kDigit;\n res.add(sum % 10);\n carry = sum >= 10 ? 1 : 0;\n --i;\n }\n \n Collections.reverse(res);\n return res;\n }\n}\n```\n\n## Complexity Analysis\nTime: `O(2*max(N, log(K)))`\n* Given a number `K`, its length will be `O(log_{2}(K))`, the time complexity depends on the length of `N` and `K`, whichever is longer.\n* Notice we want to insert digits at the end of the array and then reverse it after we finish the addition (reverse takes `O(res.size())`). If we insert at the head of array, then it will take `O(n^2)` of time.\n\nSpace: `O(1)`, as we didn't use additional spaces except the return array.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077454608","body":"#### Main Idea\nThe problem asks for the shortest distance from each character in a string s to a given character c. Since c may appear multiple times, we must compute the shortest distance to any occurrence of c for each index.\n\nThe key idea is to perform two passes over the string:\n\nLeft-to-right pass: Calculate distance from the nearest c to the left.\n\nRight-to-left pass: Refine the distance by checking for any closer c on the right.\n\nBy using two passes, we can efficiently compute the minimal distance to the nearest c for each character.\n\n#### Code\n\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n int n = s.length();\n int[] dist = new int[n];\n Arrays.fill(dist, Integer.MAX_VALUE);\n for (int i = 0; i < n; ++i) {\n if (s.charAt(i) == c) {\n dist[i] = 0;\n } else if (i > 0 && dist[i - 1] < Integer.MAX_VALUE) {\n dist[i] = dist[i - 1] + 1;\n }\n }\n\n for (int i = n - 1; i >= 0; --i) {\n if (i < n - 1 && dist[i + 1] != Integer.MAX_VALUE) {\n dist[i] = Math.min(dist[i], dist[i + 1] + 1);\n }\n }\n\n return dist;\n }\n}\n```\n\n#### Complexity\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082949045","body":"## Main Idea\nA stack can be implemented with an array, but usually we only have access to stack top due to encapsulation, while we can actually access/modify any elements in the array internally.\n\nWe can implement the stack API with `array`:\n* `push()`: append at the end of array (`O(1)`)\n* `pop()`: remove the end of array (`O(1)`)\n* `increment()`: use a for loop to increment `array[0:k]` (`O(k)`).\n\n### Optimization. Range Update && Lazy Evaluation\nNotice the time complexity of `increment()` is too high due to range update, and we can use a difference array to optimize it.\n\nAlso we don't really care about the values of elements until we `pop` them, so we can evaluate them when we pop them out of the stack.\n\n## Code\n```java\nclass CustomStack {\n private Deque stack;\n private int[] arr;\n public CustomStack(int maxSize) {\n stack = new ArrayDeque<>();\n arr = new int[maxSize];\n }\n \n public void push(int x) {\n if (stack.size() < arr.length) {\n stack.push(x);\n } \n }\n \n public int pop() {\n if (stack.isEmpty()) {\n return -1;\n }\n int index = stack.size() - 1, ret = stack.pop() + arr[index];\n if (index > 0) {\n arr[index - 1] += arr[index];\n }\n arr[index] = 0;\n return ret;\n }\n \n public void increment(int k, int val) {\n k = Math.min(k - 1, stack.size() - 1);\n if (k >= 0) {\n arr[k] += val;\n }\n }\n}\n```\n## Complexity Analysis\nTime: `O(1)` for all operations\nSpace: `O(n)` as we used 2 arrays.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087312725","body":"### Main Idea\n\nStoring everything in one stack will lead to so many pushes/pops, so we can use two stacks, one stack for string, one stack for number.\n\nIterate the input string:\n\n* If `str[i]` is a number, parse the number, push that number to number stack, and push current string to string stack, then empty the string to start over.\n* If `str[i]` is a closed bracket, then we pop the number stack to get `count`, pop the string stack to get `str`, then append the current string with `count` times to the `str`.\n* Else, append the character to current string.\n\n### Code\n\n* Java\n\n```java\nclass Solution {\n public String decodeString(String s) {\n int n = s.length();\n Deque strStack = new ArrayDeque<>();\n Deque numStack = new ArrayDeque<>();\n StringBuilder sb = new StringBuilder();\n \n for (int i = 0; i < n; i++) {\n if (Character.isDigit(s.charAt(i))) {\n int j = i + 1;\n while (Character.isDigit(s.charAt(j))) {\n j++;\n }\n int count = Integer.parseInt(s.substring(i, j));\n numStack.push(count);\n strStack.push(sb);\n sb = new StringBuilder();\n i = j - 1;\n } else if (s.charAt(i) == ']') {\n int count = numStack.pop();\n StringBuilder top = strStack.isEmpty() ? new StringBuilder() : strStack.pop();\n while (count-- > 0) {\n top.append(sb);\n }\n sb = top;\n } else {\n if (s.charAt(i) != '[') {\n sb.append(s.charAt(i));\n }\n }\n }\n \n return sb.toString();\n }\n}\n```\n\n### Complexity Analysis\n\nTime: `O(max(k) * n)`, each digit will be pushed/popped at most `max(k)` times","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092141722","body":"## Main Idea\nWe can use `stack1` as the input stack, and `stack2` as the output stack. \n\n* `push()`: Push to `stack1`, so this new element will be on the stack top of `stack1` (which is the end of our queue).\n* `pop()` and `peek()`: Since we use `stack2` as our output stack, when we call `pop()` or `peek()`:\n* If `stack2` is empty, we want to move all elements from `stack1` to `stack2`, and their order will be reversed, so the bottom of `stack1` will be the top of `stack2`, which is the head of our queue.\n* If not, then we have access to the top of `stack2` already.\n\n## Code\n\n```java\nclass MyQueue {\n Deque stack1;\n Deque stack2;\n \n public MyQueue() {\n stack1 = new ArrayDeque<>();\n stack2 = new ArrayDeque<>();\n }\n \n public void push(int x) {\n stack1.push(x);\n }\n \n public int pop() {\n if (stack2.isEmpty()) {\n move();\n }\n return stack2.pop();\n }\n \n public int peek() {\n if (stack2.isEmpty()) {\n move();\n }\n \n return stack2.peek();\n }\n \n public boolean empty() {\n return stack1.isEmpty() && stack2.isEmpty();\n }\n \n private void move() {\n while (!stack1.isEmpty()) {\n stack2.push(stack1.pop());\n }\n }\n}\n```\n## Complexity Analysis\nTime:\n* `push()`: `O(1)`\n* `pop()` and `peek()`: \n\t* The **worst case** of `pop()` and `peek()` will be `O(n)`, where we have to move all elements from `stack1` to `stack2`.\n\t* **Amortized Analysis**: Say we have `n` elements in `stack1`, and `0` elements in `stack2`, and we want to call `pop()` or `peek()` `n` times. The first call will take `n` operations to move all elements from `stack2` to `stack1`. But after the first call we will have at least `n - 1` elemetns in `stack2`, which makes the next `n - 1` calls `O(1)`. So the amrotized time will be `O(n + 1 + 1 +...+1 / n) = O((2n-1)/n) = O(1)`.\n\nSpace: `O(1)`, the two stacks are given and we didn't use any extra spaces.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3093992695","body":"### Main Idea\nFor chunks `[c1, c2, c3, ..., cn]`, we have to maintain the property: `max(ci) <= min(cj)` if `i < j`. So we can create a monotonously increasing stack `stack` to **keep track of the max value for each previous chunk**. \n\nIf `arr[i] >= stack.peek()`, we can greedily create a new chunk and `stack.push(arr[i])`. Else, we need to find the previous chunk with max value smaller or equal to `arr[i]`, say `ck`, and we need to merge all the chunks `[c_k+1, ... c_cur]` with `arr[i]`.\n\nTo merge chunks, we can just pop all the max values representing those chunks off the stack, and push back the max among them (in our case, it will be stack top cuz this stack is increasing) as the max of the new chunk. \n\nFinally the size of the stack will be the number of chunks.\n### Code\n```java\nclass Solution {\n public int maxChunksToSorted(int[] arr) {\n int n = arr.length;\n Deque stack = new ArrayDeque<>();\n for (int num : arr) {\n int max = num;\n while (!stack.isEmpty() && stack.peek() > num) {\n max = Math.max(max, stack.pop());\n }\n stack.push(max);\n }\n return stack.size();\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095444824","body":"\n### Main Idea\n1. Find the length of the linked list. If `length == 0`, return `head`.\n2. If `k >= n`, then we can do `k = k % n` which doesn't affect the final result but reduce the number of rotations.\n3. Use two pointers to traverse the linked list to find the last kth element and its previous node.\n4. Modify the linked list.\n\n\n### Code\n```java\nclass Solution {\n public ListNode rotateRight(ListNode head, int k) {\n int n = getLength(head);\n if (n == 0) return head;\n k %= n;\n \n // Find the last kth element as new head\n ListNode fast = head, slow = head;\n for (int i = 0; i < k; ++i) {\n fast = fast.next;\n }\n \n while (fast.next != null) {\n fast = fast.next;\n slow = slow.next;\n }\n \n fast.next = head;\n ListNode newHead = slow.next;\n slow.next = null;\n return newHead;\n \n }\n \n private int getLength(ListNode head) {\n int len = 0;\n while (head != null) {\n ++len;\n head = head.next;\n }\n return len;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(1)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100701991","body":"### Main Idea\n1. If the current list has length smaller than 2, don't need to swap.\n2. Else, recursivly swap the list `head.next.next`, and the swap function should return the `next` node.\n3. Swap the current 2 nodes, `newHead = head.next`, `newHead.next = head` and `head.next = next`.\n\n### Code\n```java\nclass Solution {\n public ListNode swapPairs(ListNode head) {\n if (head == null || head.next == null) return head;\n ListNode next = swapPairs(head.next.next);\n ListNode newHead = head.next;\n newHead.next = head;\n head.next = next;\n return newHead;\n }\n}\n```\n\n### Complexity Analysis\n* Time: `O(n)`\n* Space: `O(n)` for the recursive call.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109183645","body":"### Main Idea\n1. Define `inOrder(int i, int j)` to be the problem of the converting `list[i:j]` to BST.\n2. Base case: if `i > j`, return `null`.\n3. Calculate `mid = i + (j - i) / 2`, left subtree will be `inOrder(i, mid - 1)`, and then we create our root with the current node `cur`, then the next node to create will be `cur.next`, and we build the right sutree with `inOrder(mid + 1, j)`.\n\n### Code\n```java\nclass Solution {\n private ListNode cur;\n public TreeNode sortedListToBST(ListNode head) {\n if (head == null) return null;\n cur = head;\n int n = getLength(head);\n return inOrder(0, n - 1);\n }\n\n private TreeNode inOrder(int l, int r) {\n if (l > r) return null;\n int m = l + (r - l) / 2;\n TreeNode left = inOrder(l, m - 1);\n TreeNode root = new TreeNode(cur.val);\n cur = cur.next;\n TreeNode right = inOrder(m + 1, r);\n root.left = left;\n root.right = right;\n return root;\n }\n\n private int getLength(ListNode head) {\n int cnt = 0;\n while (head != null) {\n head = head.next;\n ++cnt;\n }\n return cnt;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(logn)` for recursive calls.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112278406","body":"Say the length of `a_1` to `a_i` is `a`, `b_1` to `b_i` is `b`, and `c_1` to `c_n` is `c`. If there is no interseciton, then `c = 0`. And `a + b = b + a`. If there is an intersection, then `a + c + b = b + c + a`, and the two pointers will meet at the intersection point.\n```\npublic ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n ListNode h1 = headA, h2 = headB;\n while (h1 != h2) {\n\n h1 = h1 == null ? headB : h1.next;\n h2 = h2 == null ? headA : h2.next;\n }\n return h1; \n }\n```\n\nSo we can just go over both linked list once, and switch the pointers.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3118087746","body":"### Main Idea\nDefine two pointers `fast` and `slow`, each iteration, `fast` moves 2 steps forward while `slow` moves 1 step. If there is a cycle, then `fast` will equals `slow` eventually, and if not, we will exit the loop.\n\nIf a cycle is detected, we need to find the starting point. \n\n```\nfast = 2 * slow\n\nfast = l + n1 * c + t\nslow = l + n2 * c + t\n\n\nl + n1 * c + t = 2 * l + 2 * n2 * c + 2 * t\nl = n1 * c - 2 * n2 * c = c * (n1 - 2 * n2) = n' * c - t\n```\n\n```\n L\n-------- ----I-----\n | | D\n ----------\n```\n### Code\n```java\npublic class Solution {\n public ListNode detectCycle(ListNode head) {\n if (head == null) return null;\n ListNode fast = head, slow = head;\n while (fast != null && fast.next != null) {\n fast = fast.next.next;\n slow = slow.next;\n if (fast == slow) {\n while (slow != head) {\n slow = slow.next;\n head = head.next;\n }\n return head;\n }\n }\n return null;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(1)`","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3126063970","body":"### Main Idea\n* Base case 1, both `p` and `q` are `null`, return `true`.\n* Base case 2, else if either of them is `null` or their values are not equal, return `false`.\n* Recursive case: both left and right subtrees are equal.\n\n### Code\n```java\nclass Solution {\n public boolean isSameTree(TreeNode p, TreeNode q) {\n if (p == null && q == null) {\n return true;\n } else if (p == null || q == null || p.val != q.val) {\n return false;\n }\n return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n }\n}\n```\n\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(h) = O(n)`","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136827599","body":"### Main Idea\nThis problem is asking for the leftmost node of the last layer, and when it comes to traversal by layer, BFS comes in handy.\n\nIn a standard BFS algorithm, we use a queue to keep track of the nodes on each layer, we just need to modify the algorithm to record the first node of the current layer, and if we exit the loop from the current layer, that means this is the last layer, and the node we recorded will be the one we want to find.\n\n### Code\n```java\nclass Solution {\n public int findBottomLeftValue(TreeNode root) {\n Queue q = new ArrayDeque<>();\n q.offer(root);\n int res = 0;\n while (!q.isEmpty()) {\n res = q.peek().val;\n int size = q.size();\n for (int i = 0; i < size; ++i) {\n TreeNode n = q.poll();\n if (n.left != null) q.offer(n.left);\n if (n.right != null) q.offer(n.right);\n }\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144871038","body":"### main Idea\n1. We store `Pair` in our pq, where `TreeNode` is the node and `int[]` is its coordinate.\n2. Since we want to maintain the row order, we compare pairs by their row order, smaller row has higher priority.\n3. If row numbers are the same, we compare values, since we don't really care about the order we process columns each row.\n4. Use a map that maps `col` to `list` to store the node values.\n\n\n### Code\n* Java\n\n```java\nclass Solution {\n public List> verticalTraversal(TreeNode root) {\n // column -> list\n Map> map = new HashMap<>();\n PriorityQueue> queue = new PriorityQueue<>((p1, p2) -> {\n int loc1[] = p1.getValue();\n int loc2[] = p2.getValue();\n if (loc1[0] == loc2[0]) {\n return p1.getKey().val - p2.getKey().val;\n } else {\n return loc1[0] - loc2[0];\n }\n });\n queue.offer(new Pair(root, new int[] {0, 0}));\n while (!queue.isEmpty()) {\n int size = queue.size();\n for (int i = 0; i < size; ++i) {\n Pair p = queue.poll();\n TreeNode node = p.getKey();\n int loc[] = p.getValue();\n List list = map.getOrDefault(loc[1], new ArrayList<>());\n list.add(node.val);\n map.put(loc[1], list);\n if (node.left != null) {\n queue.offer(new Pair(node.left, new int[] {loc[0] + 1, loc[1] - 1}));\n }\n\n if (node.right != null) {\n queue.offer(new Pair(node.right, new int[] {loc[0] + 1, loc[1] + 1}));\n }\n }\n }\n\n List> res = new ArrayList<>();\n for (int i = -1000; i <= 1000; ++i) {\n if (map.containsKey(i)) {\n res.add(map.get(i));\n }\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(nlogn)`\nSpace: `O(n)`","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162435845","body":"```java\nclass Solution {\n public int minSubarray(int[] nums, int p) {\n int n = nums.length;\n long arraySum = Arrays.stream(nums).asLongStream().sum(); \n int targetRemainder = (int) (arraySum % p);\n if (targetRemainder == 0) {\n return 0;\n } else if (arraySum < p) {\n return -1;\n }\n \n Map remainderToIndex = new HashMap<>();\n remainderToIndex.put(0, -1);\n \n long preSum = 0;\n int minLen = Integer.MAX_VALUE;\n for (int i = 0; i < n; ++i) {\n preSum += nums[i];\n int remainder = (int) (preSum % p);\n int remainderToCheck = (int) (remainder - targetRemainder);\n if (remainderToCheck < 0) {\n remainderToCheck += p;\n }\n \n if (remainderToIndex.containsKey(remainderToCheck)) {\n int index = remainderToIndex.get(remainderToCheck);\n minLen = Math.min(minLen, i - index);\n }\n \n remainderToIndex.put(remainder, i);\n }\n \n return minLen >= n ? -1 : minLen;\n }\n}\n\n/*\n [3, 1, 4, 2], p = 6\n \n arraySum = 10, targetRemainder = 4\n \n preSum = 3,\n\n [3, 1, 4, 2] = 10\n \n [0, 3, 4, 8, 10]\n \n [7, ]\n \n Sum: 9 p=6\n \n a mod b = (a + b) mod b\n \n (S_j - S_i) mod p == sum mod p\n \n \n x mod p = a\n y mod p = b\n \n (x - y) mod p = a - b (if a >= b)\n a - b + p (if a < b)\n*/\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182362544","body":"## Method 1. BFS\n### Main Idea\nBasically, this problem is asking if we can mark the graph with 2 colors, where adjacent vertices can't have the same color.\n\nSo we can apply BFS to traverse the graph, say we mark a vertex `v` with color 1, then we have to mark all its neighbors with color 2. If any of them was marked color 1, then we know it's impossible to mark the graph with 2 colors, so we can return `false`.\n\nIf no such contradictions found, that means the graph can be 2-colored, so return `true`.\n### Code\n* Java\n\n```java\nclass Solution {\n public boolean possibleBipartition(int n, int[][] dislikes) {\n List[] graph = new ArrayList[n + 1];\n for (int i = 0; i <= n; ++i) graph[i] = new ArrayList<>();\n \n for (int[] edge : dislikes) {\n graph[edge[0]].add(edge[1]);\n graph[edge[1]].add(edge[0]);\n }\n \n int[] colors = new int[n + 1];\n for (int i = 1; i <= n; ++i) {\n if (colors[i] != 0) continue;\n Queue q = new ArrayDeque<>();\n q.offer(i);\n colors[i] = 1;\n while (!q.isEmpty()) {\n int size = q.size();\n while (size-- > 0) {\n int v = q.poll(), c = colors[v];\n for (int nei : graph[v]) {\n if (colors[nei] == c) return false;\n if (colors[nei] != 0) continue;\n colors[nei] = -1 * c;\n q.offer(nei);\n }\n }\n }\n }\n return true;\n }\n}\n```\n### Complexity Analysis\nTime: `O(E + V)`\n\nSpace: `O(E + V)`","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204204644","body":"```java\nclass Solution {\n public int mySqrt(int x) {\n int left = 0, right = x;\n\n while (left < right - 1) {\n int mid = left + (right - left) / 2;\n long midSquare = 1l * mid * mid;\n if (midSquare == x) {\n return mid;\n } else if (midSquare < x) {\n left = mid;\n } else {\n right = mid - 1;\n }\n }\n long rightSqaure = 1l * right * right;\n return rightSqaure > x ? left : right;\n }\n}\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222726555","body":"```java\nclass Solution {\n public int maxVowels(String s, int k) {\n String vowels = \"aeiou\";\n int n = s.length(), l = 0, r = 0, res = 0, cnt = 0;\n while (r < n) {\n while (r < n && r - l < k) {\n if (vowels.indexOf(s.charAt(r)) != -1) {\n ++cnt;\n }\n ++r;\n }\n\n res = Math.max(res, cnt);\n if (vowels.indexOf(s.charAt(l)) != -1) {\n --cnt;\n }\n ++l;\n }\n\n return res;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243695565","body":"```java\nclass Solution {\n public int maxAreaOfIsland(int[][] grid) {\n int m = grid.length, n = grid[0].length;\n int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};\n \n int ret = 0;\n for (int i = 0; i < m; i++) {\n for (int j = 0; j < n; j++) {\n if (grid[i][j] == 0) {\n continue;\n }\n \n Queue queue = new ArrayDeque<>();\n queue.offer(new int[] {i, j});\n grid[i][j] = 0;\n int area = 1;\n while (!queue.isEmpty()) {\n int[] loc = queue.poll();\n for (int[] dir : dirs) {\n int x = loc[0] + dir[0], y = loc[1] + dir[1];\n if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == 0) {\n continue;\n }\n queue.offer(new int[] {x, y});\n grid[x][y] = 0;\n area++;\n }\n }\n \n ret = Math.max(ret, area);\n }\n }\n \n return ret;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269054068","body":"## Method 1. DP + Count\n### Main Idea\nSimilar to the DP solution of the LIS problem, but we also need to count how many shorter subsequences contribute to each subsequence ending at index `i`.\n\nSo we define `dp[i][0]` to be the max len of subsequence ending at `i`, and `dp[i][1]` to be the number of shorter subsequences contributing to \n### Code\n* Java\n\n```java\nclass Solution {\n public int findNumberOfLIS(int[] nums) {\n int n = nums.length, res = 0, max = 0;\n // \n int[][] dp = new int[n][2];\n \n for (int i = 0; i < n; ++i) {\n dp[i][0] = 1;\n int cnt = 1;\n for (int j = 0; j < i; ++j) {\n if (nums[i] > nums[j]) {\n if (dp[j][0] + 1 > dp[i][0]) {\n dp[i][0] = dp[j][0] + 1;\n cnt = dp[j][1];\n } else if (dp[j][0] + 1 == dp[i][0]) {\n cnt += dp[j][1];\n }\n }\n }\n \n if (dp[i][0] > max) {\n max = dp[i][0];\n res = cnt;\n } else if (dp[i][0] == max) {\n res += cnt;\n }\n dp[i][1] = cnt;\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n^2)`\n\nSpace: `O(n)`","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3295757426","body":"```java\nclass Solution {\n public int change(int amount, int[] coins) {\n int n = coins.length;\n int[] dp1 = new int[amount + 1], dp2 = new int[amount +1];\n for (int i = 0; i < n; i++) {\n for (int j = 0; j <= amount; j++) {\n if (i == 0 || j == 0) {\n if (j % coins[i] == 0) {\n dp2[j] = 1;\n }\n continue;\n }\n \n if (j - coins[i] >= 0) {\n dp2[j] = dp1[j] + dp2[j - coins[i]];\n } else {\n dp2[j] = dp1[j];\n }\n }\n \n int[] tmp = dp1;\n dp1 = dp2;\n dp2 = tmp;\n }\n return dp1[amount];\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322650611","body":"```java\nclass Solution {\n public int[] singleNumber(int[] nums) {\n int xor = 0;\n for (int num : nums) {\n xor ^= num;\n }\n \n\n int rightmostBit = xor & (-xor);\n \n int num1 = 0, num2 = 0;\n for (int num : nums) {\n if ((num & rightmostBit) != 0) {\n num1 ^= num;\n } else {\n num2 ^= num;\n }\n }\n \n return new int[]{num1, num2};\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"suukii":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mirrors-cl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xqy97":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jakkiabc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyoneday":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chouqin99":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhaogeg111":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawnhu23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ye2222":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uyplayer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guixian001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"serena9":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"junzmer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hx-code":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"admu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xxiaomm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pgquestions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eldinzhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiangwenzhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawnwu6688":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tomtao626":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aiweng1981":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richard-lime":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"acoada":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"duanyaqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ccslience":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaiykk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cachezhou0617":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangtuo1999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cytrue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyryan-web":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"naomiwufzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuajingliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miss1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"johnxizhao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"incipe-win":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"revisegoal":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckysq999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dereklisdr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"perfqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mryao1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"likeyousmile":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhg1992":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liquanluo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aq666888":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"samlu-ecnu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhongxiangxiang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hatorimain":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"neado":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaojunjun1110":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wxleah":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunl1ght":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kerrhl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"orangejuz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flyzenr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"c1f2h3":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dlm001128":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuxy94":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aconcert":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"linjunhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hyqqq22":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yibenxiao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elon-lau":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nowkizzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gsgtgyb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"irenia111":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"suiyi8760":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"saltychess":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rabbit2010520":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ellie-wu05":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yopming":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckytwj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzz607":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zoulufeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xxoojs":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"okkband":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wyz999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hacker90":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ricjli":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luhaoling":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flaming-cl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gelxgx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gaominghao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jessie725":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lsunxh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lanceli424":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qycoder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qilin88":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hengheng-yun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"smz1995":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"size-of":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"moyuanhua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"9vivian88":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guxuehua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kirosola":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"biscuit279":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maoting":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"youzhaing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jawn-ha":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hanwangxxx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dujt-x":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"degndaixingqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gzgzgzgzgzgz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gentleman-goodman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xinyi-arch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zenwangzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"andyyxw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fourierhai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yangz001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mannnn6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"haoyangxie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chjillout":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wenjialu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mhcn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"coconutice":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jackgaoyuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xingzhan0312":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yufeng727":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fontendart":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yingchehu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cobayaz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tomato-tomato":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xfliudx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"djd28176":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xilutian":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xy147":[null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091443042","body":"### js代码\n```JavaScript\n\nvar MyQueue = function() {\n this.inStack = [];\n this.outStack = [];\n};\nMyQueue.prototype.push = function(x) {\n this.inStack.push(x);\n};\n\nMyQueue.prototype.pop = function() {\n if (!this.outStack.length) {\n this.in2out();\n }\n return this.outStack.pop();\n};\n\nMyQueue.prototype.peek = function() {\n if (!this.outStack.length) {\n this.in2out();\n }\n return this.outStack[this.outStack.length - 1];\n};\n\nMyQueue.prototype.empty = function() {\n return this.outStack.length === 0 && this.inStack.length === 0;\n};\n\nMyQueue.prototype.in2out = function() {\n while (this.inStack.length) {\n this.outStack.push(this.inStack.pop());\n }\n};\n\n```\n\n### 复杂度分析\n时间复杂度:O(1)\n空间复杂度:O(n)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3120847716","body":"```\nclass ListNode {\n constructor(key, value) {\n this.key = key\n this.value = value\n this.next = null\n this.prev = null\n }\n}\n\nclass LRUCache {\n constructor(capacity) {\n this.capacity = capacity\n this.hash = {}\n this.count = 0\n this.dummyHead = new ListNode()\n this.dummyTail = new ListNode()\n this.dummyHead.next = this.dummyTail\n this.dummyTail.prev = this.dummyHead\n }\n\n get(key) {\n let node = this.hash[key]\n if (node == null) return -1\n this.moveToHead(node)\n return node.value\n }\n\n put(key, value) {\n let node = this.hash[key]\n if (node == null) {\n if (this.count == this.capacity) {\n this.removeLRUItem()\n }\n let newNode = new ListNode(key, value)\n this.hash[key] = newNode\n this.addToHead(newNode)\n this.count++\n } else {\n node.value = value\n this.moveToHead(node)\n }\n }\n\n moveToHead(node) {\n this.removeFromList(node)\n this.addToHead(node)\n }\n \n removeFromList(node) {\n let temp1 = node.prev\n let temp2 = node.next\n temp1.next = temp2\n temp2.prev = temp1\n }\n\n addToHead(node) {\n node.prev = this.dummyHead\n node.next = this.dummyHead.next\n this.dummyHead.next.prev = node\n this.dummyHead.next = node\n }\n\n removeLRUItem() {\n let tail = this.popTail()\n delete this.hash[tail.key]\n this.count--\n }\n\n popTail() {\n let tail = this.dummyTail.prev\n this.removeFromList(tail)\n return tail\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146107002","body":"```const twoSum = (nums, target) => {\n const prevNums = {};\n\n for (let i = 0; i < nums.length; i++) {\n const curNum = nums[i];\n const targetNum = target - curNum;\n const targetNumIndex = prevNums[targetNum];\n if (targetNumIndex !== undefined) {\n return [targetNumIndex, i];\n } else {\n prevNums[curNum] = i;\n }\n }\n}```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3167532564","body":"### js代码\n```JavaScript\nvar middleNode = function(head) {\n let slow = fast = head\n while(fast && fast.next){\n slow = slow.next\n fast = fast.next.next\n }\n return slow\n};\n\n```\n\n### 复杂度分析\n时间复杂度:O(N)\n空间复杂度:O(1)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190926614","body":"### js代码\n```JavaScript\nvar judgeCircle = function(moves) {\n return moves.split('L').length === moves.split('R').length && moves.split('U').length === moves.split('D').length\n};\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"itsjacob":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shunanch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yppah-eb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"raychenlei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"woshichuanqilz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"willuuu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"christina-soda":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jia98shanliang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"user-vannnn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tobepellucid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"johnvsd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yueza":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawyuan97":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"victorhuang99":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cusanity":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jay-xzj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shiradaone":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xinyue-ma":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"taojin1992":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joyce94":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"steven72574":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tian-pengfei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"asuka1h":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaowangcoding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"james0608":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaneyang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"azl397985856":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whgsh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chengfengfengwang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bulingbulingbuling":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"c2tr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eden-ye":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"codingtrains":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"starorbiting":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mo-xiaoxiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"passengersa":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073445770","body":"思维:\n1、将数组num和k转换为字符,\n2、使用BigInt方法相加\n3、最后使用将相加得到转换为数字数组\n时间复杂度:O(n)\n代码:\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function (num, k) {\n let numStr = num.join('')\n let sum = BigInt(numStr) + BigInt(k)\n return sum.toString().split('').map(Number)\n};","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084084442","body":"时间复杂度:O(n)\n代码:\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.maxSize = maxSize;\n this.stack = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.stack.length < this.maxSize) {\n this.stack.push(x);\n }\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.stack.length === 0) {\n return -1;\n }\n return this.stack.pop();\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n const len = this.stack.length;\n const count = Math.min(k, len);\n for (let i = 0; i < count; i++) {\n this.stack[i] += val;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097108121","body":"思路:\n首先,计算链表的长度 n。\n接着,将 k 对 n 取模,因为旋转 n 次后链表会回到原来的状态,所以取模可以避免不必要的旋转操作。\n然后,找到新的链表头节点和尾节点。新的链表头节点是原链表中第 n - k 个节点,新的链表尾节点是原链表的最后一个节点。\n最后,将原链表的尾节点连接到原链表的头节点,形成一个环形链表,再从新的链表头节点处断开,得到旋转后的链表。\n时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表两次,第一次计算链表的长度,第二次找到新的链表头节点的前一个节点。\n代码:\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n // 定义链表节点类\nclass ListNode {\n constructor(val = 0, next = null) {\n this.val = val;\n this.next = next;\n }\n}\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n if (!head || !head.next) return head;\n\n // 计算链表的长度\n let n = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n n++;\n }\n\n // 对 k 取模\n k %= n;\n\n // 如果 k 为 0,说明不需要旋转,直接返回原链表\n if (k === 0) return head;\n\n // 找到新的链表头节点的前一个节点\n let newTail = head;\n for (let i = 0; i < n - k - 1; i++) {\n newTail = newTail.next;\n }\n\n // 新的链表头节点\n let newHead = newTail.next;\n\n // 断开原链表,形成新的链表\n newTail.next = null;\n tail.next = head;\n\n return newHead; \n};\n\n// 辅助函数:将数组转换为链表\nfunction arrayToList(arr) {\n if (arr.length === 0) return null;\n let head = new ListNode(arr[0]);\n let current = head;\n for (let i = 1; i < arr.length; i++) {\n current.next = new ListNode(arr[i]);\n current = current.next;\n }\n return head;\n}\n\n// 辅助函数:将链表转换为数组\nfunction listToArray(head) {\n let result = [];\n let current = head;\n while (current) {\n result.push(current.val);\n current = current.next;\n }\n return result;\n}","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shellylcooper":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"testplm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tom-zhouch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"skylarxu214":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"taihui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huaxueguakele":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yang-chenyu104":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mlking15":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"-3":[],"cyonline":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rzhao010":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zywang0":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jetery":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"klspta":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bookyue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jancerwu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"buer1121":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ceramickitten":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gg925407590":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alyenor":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chenming-cao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ggohem":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dark-volute":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ronething":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jmastella":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"paopaohua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dd2001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mayloveless":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuexi001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nineis7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"abby-xu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gsw9818":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaomingshixiaotang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"snmyj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flipn9":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wabw1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xqmmy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"a-pricity":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sclihuiming":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"amazeding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"astrking":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tzuikuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ringo1597":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brucezhang-utf-8":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luanxing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"moin-jer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lihua1997":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cuizezhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xuanaxuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tiandao043":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"restlessbreeze":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ruikiwi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huiminren":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"saitochen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wtdcai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"albert556":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wuxiaoshawn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zrtch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhuzhu096":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whoam-challenge":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weisday":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"syh-coder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaaller":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kyrie96521":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cavecrypto":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cxgbro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erjian96":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"a-polarbear":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alexno1no2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yetfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhiyuanpeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bwspsu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"arinzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mdge":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allenfeng666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yin02":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elsa-zhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"asur4s":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"littlesugarman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhihaowan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"apockira":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guowei0223":[null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077086971","body":"```\n首先需要找到所有c出现的index,存在c_index list里为后续的pointer搜索做好准备\npointer = 0 定义好pointer的起点\n遍历s,在c_index的范围内,对比pointer和pointer + 1 和s中各个位置的绝对距离,如果发现pointer和s的距离大于pointer +1,那么说明s的index已经走到了离pointer+1更近的距离,那么这时候我们更新pointer,+ 1, 指到下一个c_index中c的位置。\nres.append()c_index中pointer和s中index的距离\n\nclass Solution:\n def shortestToChar(self, s: str, c: str) -> List[int]:\n c_index = []\n for i in range(len(s)):\n if s[i] == c:\n c_index.append(i)\n pointer = 0\n res = []\n for i in range(len(s)):\n if pointer < len(c_index) -1:\n if abs(i-c_index[pointer])> abs(i-c_index[pointer+1]):\n pointer += 1\n res.append(abs(i-c_index[pointer]))\n return res\n\n因为用了指针,所以时间复杂度 O(n)。 空间复杂度 O(n)。 \n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087516204","body":"```\n使用栈的经典题型。遇见数字就num*10 + item处理。 遇见【 左括号说明要开始处理括号内部,用stack先存好之前已经处理的结果,遇见】后括号说明括号完成,则需要stack。pop()出保存的结果加上括号里的内容。是字母的话,则res+ item更新括号内信息。\n空间复杂度 O(n)\n时间复杂度 O(n)\n\nclass Solution:\n def decodeString(self, s: str) -> str:\n res = \"\"\n stack = []\n num = 0\n for item in s:\n if item.isdigit():\n num = num * 10 + int(item)\n elif item == \"[\":\n stack.append([num, res])\n num = 0\n res = \"\"\n elif item == \"]\":\n pre_num, pre_res = stack.pop()\n res = pre_res + pre_num * res\n else:\n res += item\n return res\n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3101341120","body":"还是链表的老套路,设置一个dummy head。 判断cur.next and cur.next.next: 是否存在,存在了再进行下一步。\n用tmp,tmp1 来保存cur。next和cur.next.next.next。 然后我们开始进行交换步骤。\n\n```\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n dummy_head = ListNode(next =head)\n cur = dummy_head\n while cur.next and cur.next.next:\n temp = cur.next\n temp1 = cur.next.next.next\n cur.next = cur.next.next\n cur.next.next = temp\n temp.next = temp1\n cur = cur.next.next\n return dummy_head.next\n\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125611734","body":"可以利用bfs的方法解决。 把每个点放入queue中,然后popleft()两个node进行比较。\n\n```\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if not p and not q:\n return True\n if not p or not q:\n return False\n \n que = deque([p,q])\n \n while que:\n cur1 = que.popleft()\n cur2 = que.popleft()\n if not cur1 and not cur2:\n continue\n\n if not cur1 or not cur2 or cur1.val != cur2.val:\n return False\n \n que.append(cur1.left)\n que.append(cur2.left)\n que.append(cur1.right)\n que.append(cur2.right)\n return True\n\n```\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148705374","body":"```\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n ans = 0\n for x1, y1 in points:\n cnt = defaultdict(int)\n for x2, y2 in points:\n d2 = (x1 - x2) ** 2 + (y1 - y2) ** 2\n ans += cnt[d2] * 2\n cnt[d2] += 1\n return ans\n\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuqianyang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sj941127":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zjsuper":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yongxi-zhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"darwintk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"h-steven":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mischaqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wurongronga":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miduoliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyshenzhengkang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"y4h2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yoco323":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"forschers":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shanshuiqiankun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"annabellhyx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hwfrankfung":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"frederickfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huibinny":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ggmybro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"myleetcodejourney":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"want2333":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"staringwhere":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allenfeng8":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ryanbaiyansong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dou-yu-xuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hyxupup":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cs12300":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chiehw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aesir-idun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaldsk12":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hxj2001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"for123s":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzhilin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yfu6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mengsixing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"import-ant":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joriscai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangqianqian202301":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"airwalkers":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhumengcheng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kofzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"leonalhq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hjy-u":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"csthaha":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zepherust":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"feefeefee":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hughlin07":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huizsh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chanceyliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hshen11":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"horace7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangzh0114":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dragonfcl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huifeng248":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sarah11qing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"el1as7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zcytm3000":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pangjiadai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xb798298436":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ywang525":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"limbo42":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dorapocket":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zoeyzyzyzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jasonqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lp1506947671":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"texamc2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joemonkeylee":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"northseacoder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dominique9898":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wl678":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"meisgithub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sye9286":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fuku-l":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kangliqi1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richardtaok":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chocolate-emperor":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lydia61":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangjiahuan17":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"seanutf":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangyong-hub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erquaner":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiujingxukong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"x1aox1a":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"drinkmorekaik":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dinjufen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuzmt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"munmust":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yan-jie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hktangshuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zpbc007":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"linlizzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"krabbejing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"firehaosky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chao-cc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jinjin680":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cruiseyugh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"quieter2018":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jadeliu13":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaoq777":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiangyanlineu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuxiner":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yufanzh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"franciszq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kangqinsen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"manwzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jerry9926":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"soso1105":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pkuphy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhenya-zhu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wty9sky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"skyoct":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bingzxy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaodingc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jyjsunny":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aoxiangw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"enrilwang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aswrise":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aneureka":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ljqchlsw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jingyuzhou123":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dianlandu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jameswangxin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhenxied":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nuozhouzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shin-guid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bochengwan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kyo-tom":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uratora":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guitarys":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sosdogecoin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zol013":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lrwhc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wwewwt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cyk1337":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangyu1131":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"diana21170648":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"61hhh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"quaaaaaack":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"acy925":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bi9potato":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guangsizhongbin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhaoygcq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"catkathy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yqycs":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhuxinyu-znb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"freesan44":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mo660":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sencc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"randong22":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"beginner-jamji":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yzhyzhyzh123":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunstrongchina":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dongzegithub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"metsystem":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miller-em":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dorian-byte":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yizhewill":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qiaojunch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhouliuhuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"beanza":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kingxiaozhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ygnauh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wzbwzt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"iambigchen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weiboshi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"master-guang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jennyjgao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangjay408":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chang-you":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rocjemaintiendrai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ainfinitedz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"christ36":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hengistchan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huiyingc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"andyli4":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"momogir":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jamjid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"freeroo2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ycan253":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"laurallalala":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"danielyan86":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rennzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"larscheng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qingkediguo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"adfvcdxv":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"javajianghu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chloe-c11":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"verkru":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eggeggliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dr-kkk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jinhma":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"emergence23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"0christ1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"junru281":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joe-the-plumber":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jsaki":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"witerth":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ludwig-ll":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luster-lyl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"smallppgirl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"realduxy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"awilekong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wwz223":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangjinzhepro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"atom-set":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"coderxiaowq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hillsonziqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alexzhang-mini":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xil324":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bordergong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hawkins-hjq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cathyshang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"greyqt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yanglimbo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rao-qianlin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dtjk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"martina001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lxy1108":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"franklinsworld666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brainlds":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huamulanyyds":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eclairs46":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maike-hps":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sanjiu81":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qinmengx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yashuning":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luzhaofeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lizhao-liu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yukibei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hermione666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yyyyytc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zin-next":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pandapls":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jackinai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"godkun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dadahui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"akxuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fightforcoding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jialigogogo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"celestexiong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zjy-debug":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"peggyhao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sleepydog25":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"edwineo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"panfx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liudi9047":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allanli-lhh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xchen172":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qiaoeve":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tangyi23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shangjiaw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tongxw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"haodongwang1995":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuichicx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qunshanhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hebingliang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"baiqz":[null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092397229","body":"\n### 思路:\n通过元素在栈之间的转移来模拟队列的先进先出。\n\n\n```python\nclass MyQueue:\n \"\"\"使用两个栈实现的队列类\"\"\"\n\n def __init__(self):\n # 初始化两个栈:stack_in 用于入队操作,stack_out 用于出队操作\n self.stack_in = []\n self.stack_out = []\n\n def push(self, x: int) -> None:\n \"\"\"将元素 x 添加到队列的尾部\n 直接将元素压入 stack_in\n \"\"\"\n self.stack_in.append(x)\n\n def pop(self) -> int:\n \"\"\"移除并返回队列头部的元素\n 1. 如果 stack_out 为空,将 stack_in 中的所有元素弹出并压入 stack_out\n 2. 这样能确保元素以先进先出的顺序出栈\n 3. 弹出 stack_out 的栈顶元素\n \"\"\"\n if not self.stack_out:\n while self.stack_in:\n self.stack_out.append(self.stack_in.pop())\n return self.stack_out.pop()\n\n def peek(self) -> int:\n \"\"\"返回队列头部的元素,但不删除它\n 复用 pop 方法获取队首元素,然后将其压回 stack_out 以保持队列状态不变\n \"\"\"\n res = self.pop()\n self.stack_out.append(res)\n return res\n\n def empty(self) -> bool:\n \"\"\"检查队列是否为空\n 当且仅当两个栈都为空时,队列为空\n \"\"\"\n return not (self.stack_in or self.stack_out)\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaogaoddd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tuuna":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lxy12l":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chxbilly":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sentiy-hub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fea1220":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wtbkevin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"awenbocc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hallcia":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huzhipeng-hu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tongtz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lindo146":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"heye0507":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lmw6412036":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/1#issuecomment-3072932165","body":"@azl397985856 需要建day1啦","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3076893308","body":"## 思路1\n\n枚举每个普通字符,分别找到其左侧,右侧**最近**特殊字符的位置,求出距离,并取最小值。\n\n1. 预处理每个特殊字符的位置,保存至数组data;\n2. 枚举每个普通字符,在data中查找其左侧,右侧**最近**特殊字符的位置,求出距离,并取最小值。查找过程用可以**二分**实现,也可以用\n **单个指针记录最后一次位置**实现;\n3. 返回结果。\n\n## 思路1代码\n\n```javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function (s, c) {\n let n = s.length, data = [];\n for (let i = 0; i < n; i++) {\n if (s[i] === c) data.push(i);\n }\n\n // 双指针\n // left 左侧最近的c索引\n // right 右侧最近的c索引 right = left + 1\n let left = -1, right = -1, m = data.length;\n let ans = new Array(n).fill(0);\n for (let i = 0; i < n; i++) {\n let char = s[i];\n if (char === c) continue;\n\n let ldis = Infinity, rdis = Infinity;\n // 在data中寻找左侧最近的c索引\n // left 指针移动的条件:data[left + 1] < i,确保data[left] 是在i的左侧,距离i更近\n while (left + 1 < m && data[left + 1] < i) left++;\n if (left >= 0) ldis = i - data[left];\n \n right = left + 1;\n if (right < m) rdis = data[right] - i;\n ans[i] = Math.min(ldis, rdis);\n }\n return ans;\n };\n```\n\n## 思路1复杂度分析\n\n- 时间复杂度:O(n + m),n为字符串s的长度,m为data的长度,遍历字符串s2次,left也只是从左往右移动一次,为O(m),所以总的时间复杂度为O(n + m)。\n- 空间复杂度:O(m),m为data的长度,不考虑返回值的话,需要一个额外的长度为m的数组来保存c的位置,所以空间复杂度为O(m);考虑返回值,需要一个额外的长度为n的数组来保存结果,间复杂度为O(n)。\n\n---\n\n## 思路2\n\n也可以枚举每个特殊字符c的位置,处理c往左、往右能覆盖的普通字符,记录每个普通字符的最小值即可。\n\n1. 预处理每个特殊字符的位置,保存至数组data;\n2. 从左往右遍历data,处理每个特殊字符c左侧的普通字符的距离,保存至数组答案ans;可以使用思路1单指针记录最后一个位置的方式,降低时间复杂度;具体可以看代码;\n3. 从右往左遍历data,处理每个特殊字符c右侧的普通字符的距离,与答案ans对应位置比较,取最小值;\n4. 返回答案ans。\n\n## 思路2代码\n```javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function (s, c) {\n let n = s.length, data = [], ans = new Array(n).fill(Infinity);\n for (let i = 0; i < n; i++) {\n if (s[i] === c) {\n ans[i] = 0;\n data.push(i);\n }\n }\n\n const m = data.length;\n\n // 从左往右遍历\n let left = 0;//从左往右开始,第一个普通字符的索引\n for (let j of data) {\n while (left < n && s[left] === c) left++;\n while (left < n && s[left] !== c && left < j) {\n // console.log('处理left',left,j);\n ans[left] = Math.min(ans[left], j - left);\n left++;\n }\n }\n\n // 从右往左遍历\n let right = n - 1;// 从右往左开始,第一个普通字符的索引\n for (let i = m - 1; i >= 0; i--) {\n let j = data[i];\n while (right >= 0 && s[right] === c) right--;\n while (right >= 0 && s[right] !== c && right > j) {\n ans[right] = Math.min(ans[right], right - j);\n right--;\n }\n }\n return ans;\n };\n```\n## 思路2复杂度分析\n\n- 时间复杂度:O(n + m),n为字符串s的长度,遍历字符串s1次,遍历data两次,left、right也只是各移动一次,所以总的时间复杂度为O(n + m)。\n- 空间复杂度:O(m),m为data的长度,不考虑返回值的话,需要一个额外的长度为m的数组来保存c的位置,所以空间复杂度为O(m);考虑返回值,需要一个额外的长度为n的数组来保存结果,间复杂度为O(n)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082655797","body":"## 思路1\n这是一个典型的栈设计题,数据规模不大的情况下,按照常规操作即可。可以使用数组或链表来存储。\n## 代码1\n```javascript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.data = []\n this.maxSize = maxSize;\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if(this.data.length < this.maxSize) this.data.push(x);\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if(this.data.length === 0) return -1;\n return this.data.pop(); \n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n let n = this.data.length;\n for(let i = 0;i < k;i++){\n if(i < n) this.data[i] += val;\n else break;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n## 复杂度分析1\n* 时间复杂度:O(n*k)。n表示操作次数。插入和删除的时间复杂度都是O(1),每次increment都要遍历数组,时间复杂度是O(k);所以总的复杂度为O(n*k)。\n* 空间复杂度:O(n)。n为maxSize。\n---\n## 思路2\n如果k较大,increment是个非常耗时的操作,所以我们需要优化increment的操作。\n优化思路:increment是批量更新的,可以用差分数组来实现。但是又要支持高效的查询与删除操作,所以可以用树状数组来维护这个差分数组。\n## 代码2\n```javascript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function (maxSize) {\n this.cnt = 0;\n this.data = new Array(maxSize + 1).fill(0);\n this.maxSize = maxSize;\n};\n\n/**\n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function (x) {\n if (this.cnt === this.maxSize) return;\n this.cnt++;\n this.update(this.cnt - 1, x);\n if(this.cnt <= this.maxSize - 1) this.update(this.cnt, -x);\n //console.log('push ',x,this.data);\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function () {\n if(this.cnt === 0) return -1;\n let ans = this.query(this.cnt - 1);\n this.update(this.cnt - 1, -ans);\n if(this.cnt <= this.maxSize - 1) this.update(this.cnt,ans);\n this.cnt--;\n //console.log('pop ',ans,this.data);\n return ans;\n};\n\n/**\n * @param {number} k\n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function (k, val) {\n if(this.cnt === 0) return;\n this.update(0, val);\n let r = Math.min(k,this.maxSize,this.cnt);\n if(r <= this.maxSize - 1) this.update(r,-val);\n};\n\n\nCustomStack.prototype.query = function (i) {\n i = i + 1;\n let ans = 0;\n while (i) {\n ans += this.data[i];\n i -= this.lowbit(i);\n }\n return ans;\n}\n\nCustomStack.prototype.update = function (i, val) {\n i = i + 1;\n while (i <= this.maxSize) {\n this.data[i] += val;\n i += this.lowbit(i);\n }\n}\n\n\nCustomStack.prototype.lowbit = function (i) {\n return i & (-i);\n}\n\n/**\n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n\n```\n\n## 复杂度分析2\n* 时间复杂度:O(n*log(maxSize))。n表示操作次数。插入、删除、批量更新的时间复杂度都是O(log(maxSize));所以总的复杂度为O(n*log(maxSize))。\n* 空间复杂度:O(n)。n为maxSize。\n---\n## 思路3\n有没有保持插入,删除O(1),批量更新O(1)的算法呢?官方题解给出了一个懒删除的技巧。小伙伴们可以尝试一下。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087040795","body":"## 思路一:栈\n这是一个典型的括号匹配问题,可以用栈来解决。 \n步骤:\n1. 创建一个栈sStack,栈顶元素标示当前答案,初始元素为空字符串;\n2. 创建一个栈nStack,存储需要重复的数字k;\n3. 声明一个全局变量num,用来记录数字。遍历字符串:\n 1. 如果当前字符为数字,追加到num中;\n 2. 如果当前字符为左括号,将num压入栈nStack,将一个新的空字符串压入栈sStack,并清空num。**遇到左括号表示要开启新一轮的字符串重复过程,因此数字栈压入需要重复的数字k,字符串栈压入一个空字符串来存储本轮重复过程产生的答案**;\n 3. 如果当前字符为字母,追加到栈sStack的栈顶元素中;\n 4. 如果当前字符为右括号,取出栈sStack的栈顶元素s,取出栈nStack的栈顶元素k,s重复k次;并追加到栈sStack的栈顶元素中。**遇到右括号表示本轮重复过程结束,因此将栈sStack的栈顶元素重复k次,并追加到栈sStack的栈顶元素中,继续前一轮的重复**。\n 5. 最后栈sStack的栈顶元素即为结果。\n## 代码一\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n let sStack = [''],nStack = [],n = s.length;\n let num = 0;\n for(let i = 0;i < n;i++){\n let c = s[i];\n if(/\\d/.test(c)) num = num * 10 + Number(c);\n else if(c === '[') {\n nStack.push(num);\n num = 0;\n sStack.push('');\n }else if(/[a-z]/.test(c)){\n // console.log(sStack)\n sStack[sStack.length - 1] += c;\n }else{\n let s = sStack.pop(),k = nStack.pop();\n // console.log(s,k);\n if(s) s = s.repeat(k);\n sStack[sStack.length - 1] += s;\n // console.log(sStack)\n }\n }\n return sStack[0];\n };\n```\n## 复杂度分析一\n* 时间复杂度:O(n),其中n为字符串s的长度。\n* 空间复杂度:O(n),需要两个最长长度为n的栈保存答案及数字,其中n为字符串s的长度。\n--- \n## 思路二:递归\n括号匹配问题,一般可以用递归来解决。 \n步骤:\n1. 预处理字符串s,记录与每个“\\[”匹配的“\\]”的位置,保存至数组left中。\n> 预处理匹配括号位置是这类递归问题常见的技巧。\n2. 从左往右遍历字符串s: \n 1. 如果当前字符为字母,则将当前字符添加到结果res中;\n 2. 如果当前字符为数字,则将数字保存在变量num中;\n 3. 如果当前字符为左括号,递归调用f,处理\\[i + 1, left\\[i] - 1]的子串,得到的结果重复num次,并追加到结果res中;num清空;\n4. 返回res。\n\n## 代码二\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n let stack = [],n = s.length,left = new Array(n).fill(-1);\n for(let i = 0;i < n;i++){\n let c = s[i];\n if(c === '[') stack.push(i);\n else if(c === ']') left[stack.pop()] = i;\n }\n return f(0,n - 1);\n // -----------------------------------\n function f(l,r){\n let ans = '',num = 0;\n for(let i = l;i <= r;i++){\n let c = s[i];\n if(/\\d/.test(c)) num = num * 10 + Number(c);\n else if(c === '['){\n ans += f(i + 1,left[i] - 1).repeat(num);\n num = 0;\n i = left[i];\n }else if(/[a-z]/.test(c)) ans += c;\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析二\n* 时间复杂度:O(n),其中n为字符串s的长度。\n* 空间复杂度:O(n),即递归栈深度,最大为n,其中n为字符串s的长度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091479392","body":"## 思路\n1. 设计双栈,一个用于存放入队数据,一个用于存放出队数据。\n2. 各个操作的实现思路:\n 1. push:将数据压入pushData栈中。\n 2. pop:如果popData栈为空,则将pushData栈中的数据全部弹出并压入popData栈中。然后弹出popData栈的栈顶元素。\n 3. peek:同pop操作,最后一步返回popData栈的栈顶元素。 \n 4. empty:判断两个栈是否为空。 \n\n> js中可以用数组模拟栈。\n## 代码\n```javascript\nvar MyQueue = function() {\n this.pushData = []\n this.popData = [] \n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.pushData.push(x) \n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n if(this.popData.length === 0 && this.pushData.length) while(this.pushData.length) this.popData.push(this.pushData.pop());\n return this.popData.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if(this.popData.length === 0 && this.pushData.length) while(this.pushData.length) this.popData.push(this.pushData.pop());\n return this.popData[this.popData.length - 1];\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return this.pushData.length === 0 && this.popData.length === 0\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```\n## 复杂度分析\n- 时间复杂度:O(1):插入、删除、查找操作的均摊时间复杂度都是O(1)\n- 空间复杂度:O(n):栈的存储空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094576990","body":"## 思路\n比较容易的思路是,排序后,每个块和排序前元素的种类和数量完全相同,可以用哈希表或前缀和来求解。此思路的时间复杂度是O(n),空间复杂度是O(nlog(n))。 \n后来看了看题解,发现可以用单调栈或维护前后缀的思路来求解。\n\n### 排序块性质\n**我们要想划分最多的块,并且保证排序后的结果和原数组的排序结果相同,则块中的元素必须保证,块中的最大值都比右边的元素小或者相同,块中的最小值都比左边的元素大或者相同。**\n则我们维护一个前缀最大值和后缀最小值两个数组,只要前缀的最大值,小于等于后缀的最小值,则可划分(相当于给数组划一条线)。\n## 代码\n```javascript\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n let n = arr.length, prefixMax = new Array(n).fill(-Infinity),suffixMin = new Array(n).fill(Infinity);\n for(let i = 0;i < n;i++){\n prefixMax[i] = Math.max(i ? prefixMax[i - 1] : -Infinity,arr[i]);\n let j = n - 1 - i;\n suffixMin[j] = Math.min(j + 1 < n ? suffixMin[j + 1] : Infinity,arr[j]);\n }\n\n let ans = 1;\n for(let i = 0;i < n - 1;i++){\n if(prefixMax[i] <= suffixMin[i + 1]) ans++;\n }\n return ans\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(n)\n\n## 参考题解\n[https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solutions/1/zui-duo-neng-wan-cheng-pai-xu-de-kuai-by-z0wz/](https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solutions/1/zui-duo-neng-wan-cheng-pai-xu-de-kuai-by-z0wz/)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095130877","body":"## 思路\n旋转链表的本质上是将链表尾部k个节点移动到链表头部。按照这个思路步骤如下:\n1. 计算链表长度l;\n2. 如果 k % l === 0 或者 l === 0,即k为l的整数倍,或者链表为空,则不需要旋转,直接返回head;否则 k = k % l;\n3. 声明两个指针fast、slow,fast先移动k步;\n4. fast、slow同时移动,直到fast到达链表末尾;\n5. 此时:\n 1. slow的下一个节点即为新的头结点\n 2. slow.next 指向 null\n 3. fast.next 指向 head\n 4. 返回新的头结点\n\n## JavaScript代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n if(!head || k === 0) return head;\n let l = 0,curr = head;\n while(curr){\n l++;\n curr = curr.next;\n }\n k = k % l;\n if(k === 0) return head;\n let fast = head,slow = head;\n while(k){\n fast = fast.next;\n k--;\n }\n\n while(fast.next){\n fast = fast.next;\n slow = slow.next;\n }\n\n let newHead = slow.next;\n slow.next = null;\n fast.next = head;\n return newHead;\n\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中n为链表的长度。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100439586","body":"## 思路\n因为是两两交换,所以可以声明四个指针记录涉及到交换的节点,修改相关指针的next指向即可。具体步骤如下:\n1. 特判:链表为空或链表只有一个节点,直接返回原链表。\n2. 为了简化代码,声明一个哨兵节点dummy,dummy.next = head,方便统一处理。\n3. 声明指针prev,指向前一次交换后的结束节点;声明指针curr,指向本次交换的开始节点。初始值prev = dummy,curr = head,开始循环:\n 1. 循环终止条件:curr为空或者curr的下一个节点为空(即curr没有可以交换的节点了)。\n 2. 声明next指针,next = curr.next;声明nextCurr指针,nextCurr = curr.next.next;\n 3. 两两交换:curr.next = nextCurr,next.next = curr;\n 4. 重新设置头尾指向,确保下一轮循环正确执行:prev.next = next;\n 5. 重新设置prev,curr:prev = curr; curr = nextCurr;继续循环,直到循环终止条件。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n if(!head || !head.next) return head;\n const dummy = new ListNode();\n dummy.next = head;\n \n let prev = dummy,curr = dummy.next;\n while(curr && curr.next){\n let next = curr.next,nextCurr = next.next;\n curr.next = nextCurr;\n next.next = curr;\n \n prev.next = next;\n\n prev = curr;\n curr = curr.next;\n }\n\n return dummy.next;\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是链表的长度。\n- 空间复杂度:O(1),仅使用有限个指针。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105520636","body":"## 思路\n* 本题目标是将一个有序单链表(升序排列)转换为一棵高度平衡的二叉搜索树(Height Balanced Binary Search Tree)。\n* 核心思想是使用递归方式构建树,每次选择链表的中间节点作为当前子树的根节点,以保证左右子树的高度差不超过 1。\n* 利用快慢指针(slow 和 fast)找到链表的中间节点,并将链表分割为左子链表和右子链表,分别递归构建左右子树。\n* 实现步骤如下:\n 1. 递归终止条件:\n * 如果链表为空(!head),返回 null。\n * 如果只有一个节点(!head.next),直接构建一个 TreeNode 返回。\n 2. 寻找中间节点:\n * 使用快慢指针法,fast 每次走两步,slow 每次走一步,当 fast 到达末尾时,slow 正好指向中间节点。使用一个临时变量 prev 记录 slow 的前一个节点,方便后续断开连接。\n 3. 分割链表:\n * 将 slow 前面的节点作为左子链表,断开连接。\n * slow.next 作为右子链表继续递归处理。\n 4. 构建树节点:\n * 当前 slow.val 作为根节点,递归构建左右子树。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if(!head) return head;\n // display(head)\n if(!head.next) return new TreeNode(head.val);\n\n // 寻找中间节点\n let slow = head,fast = head,prev = null;\n while(fast.next && fast.next.next){\n fast = fast.next.next;\n prev = slow;\n slow = slow.next;\n }\n // 此时,slow是中间节点,slow.next是右子树的根\n let next = slow.next;\n if(prev) prev.next = null;\n slow.next = null;\n\n const root = new TreeNode(slow.val);\n root.left = sortedListToBST(prev ? head : null);\n root.right = sortedListToBST(next);\n return root;\n};\n\nfunction display(head){\n let ans = [],p = head;\n while(p){\n ans.push(p.val);\n p = p.next;\n }\n console.log('处理的树:',ans)\n}\n```\n## 复杂度分析\n* 时间复杂度:O(n log n)\n * 每一层递归都需要遍历链表的一半来找中间节点(O(n)),递归深度为 log n,因此总时间复杂度为 O(n log n)。\n* 空间复杂度:O(log n)\n * 主要是递归调用栈的空间,取决于树的高度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111762311","body":"## 思路\n- 定义两个指针 `pA` 和 `pB`,分别从 `headA` 和 `headB` 开始遍历。\n- 当 `pA` 和 `pB` 不相遇时,它们会继续向前移动:\n - 如果 `pA` 到达末尾 (`null`),则跳转到 `headB`。\n - 如果 `pB` 到达末尾 (`null`),则跳转到 `headA`。\n- 这样,两个指针最终会在相交点相遇,或者同时到达末尾 (`null`),从而退出循环。\n- 返回 `pA`,即相交节点或 `null`。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function (headA, headB) {\n let pA = headA, pB = headB;\n while (pA !== pB) {\n pA = pA ? pA.next : headB;\n pB = pB ? pB.next : headA;\n }\n return pA;\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n + m),其中 n 和 m 分别为链表 headA 和 headB 的长度。\n- 空间复杂度:O(1),只使用了两个指针变量,没有额外的空间。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116200386","body":"## 思路\n- 首先处理边界情况:如果head为空,直接返回\n- 快慢指针同时遍历链表,快指针每次走两步,慢指针每次走一步\n- 当两指针相遇时停止第一阶段\n- 如果fast为null,说明无环,返回null\n- 将slow重置为head,两个指针以相同速度继续移动直到相遇\n- 相遇点即为环的起始节点\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n if(!head) return head;\n let slow = head,fast = head;\n while(fast){\n fast = fast.next;\n if(fast) fast = fast.next;\n\n slow = slow.next;\n\n if(slow === fast) break;\n }\n\n if(!fast) return fast;\n\n slow = head;\n\n while(slow !== fast){\n slow = slow.next;\n fast = fast.next;\n }\n\n return slow\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3125594702","body":"## LRU Cache 算法思路分析\n\nLRU (Least Recently Used) 缓存是一种常用的缓存淘汰策略,当缓存满时,会优先淘汰最近最少使用的元素。\n\n### 核心数据结构\n\n1. **双向链表**:维护元素的访问顺序,头部是最近最少使用的元素,尾部是最近使用的元素\n2. **哈希表(Map)**:提供O(1)时间复杂度的元素查找\n\n### 主要操作实现\n\n#### 1. 初始化\n- 设置缓存容量\n- 初始化当前元素计数器\n- 创建哈希表存储键值对\n- 创建虚拟头节点和尾节点,方便操作\n\n#### 2. 获取元素get\n- 如果元素不存在,返回-1\n- 如果元素存在:\n - 将该节点从当前位置删除\n - 将该节点插入到链表尾部(标记为最近使用)\n - 返回节点值\n\n#### 3. 插入/更新元素put\n- **新元素插入**:\n - 如果缓存已满,删除链表头部节点(最近最少使用的元素)\n - 创建新节点并添加到哈希表\n - 将新节点插入链表尾部\n- **更新元素**:\n - 更新节点值\n - 将节点从当前位置删除并移到链表尾部\n\n#### 4. 辅助方法\n- insertToTail:将节点插入链表尾部\n- deleteFromHead:删除链表头部节点\n- deleteNode:删除指定节点\n\n## 代码\n```javascript\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.cnt = 0;\n this.map = new Map();\n this.head = new DoubleNode();\n this.tail = new DoubleNode();\n this.head.next = this.tail;\n this.tail.prev = this.head; \n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n // console.log('get',key)\n \n if(this.map.has(key) === false) return -1;\n let node = this.map.get(key);\n\n this.deleteNode(node);\n \n this.insertToTail(node);\n // this.map.set(key,node);\n \n // this.display();\n\n return node.val;\n};\n\n/** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\nLRUCache.prototype.put = function(key, value) {\n if(this.map.has(key) === false){// 插入操作\n let node = new DoubleNode(key,value);\n if(this.cnt === this.capacity) this.deleteFromHead(); \n else this.cnt++\n this.map.set(key,node);\n this.insertToTail(node);\n }else{\n let node = this.map.get(key);\n node.val = value;\n\n this.deleteNode(node);\n\n this.insertToTail(node);\n // this.map.set(key,node);\n }\n\n // console.log('put',key,value);\n // this.display();\n};\n\nLRUCache.prototype.insertToTail = function(node){\n let prev = this.tail.prev;\n \n prev.next = node;\n node.next = this.tail;\n \n this.tail.prev = node;\n node.prev = prev;\n}\n\nLRUCache.prototype.deleteFromHead = function(){\n let node = this.head.next;\n let next = node.next;\n \n this.head.next = next;\n next.prev = this.head;\n\n this.map.delete(node.key);\n}\n\nLRUCache.prototype.deleteNode = function(node){\n let prev = node.prev,next = node.next;\n prev.next = next;\n next.prev = prev;\n\n node.prev = null;\n node.next = null;\n\n // this.map.delete(node.key);\n}\n\nLRUCache.prototype.display = function(){\n let k = this.cnt,p = this.head.next;\n let ans = []\n while(k){\n ans.push(p.key + '=>' + p.val);\n k--;\n p = p.next;\n }\n console.log(ans);\n}\n\nfunction DoubleNode(key,val){\n this.key = key;\n this.val = val;\n this.next = null;\n this.prev = null;\n}\n\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```\n## 复杂度分析\n### 时间复杂度\n- get操作:O(1)\n- put操作:O(1)\n\n### 空间复杂度\n- O(capacity),需要存储最多capacity个元素\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123739061","body":"## 思路\n\n使用了递归的思想来解决问题:\n\n1. **基础情况(Base Case)**:如果当前节点为空(`!root`),则返回深度0,因为空节点没有深度。\n\n2. **递归关系(Recursive Relation)**:\n - 分别计算左子树和右子树的最大深度:`maxDepth(root.left)` 和 `maxDepth(root.right)`\n - 取两者中的较大值:`Math.max(maxDepth(root.left), maxDepth(root.right))`\n - 加上当前节点的1层高度:`+1`\n\n### 算法执行过程\n\n1. 对于任意节点,先递归计算其左子树的最大深度\n2. 再递归计算其右子树的最大深度\n3. 比较左右子树的深度,取较大值\n4. 将较大值加1(代表当前节点所在的层),作为以当前节点为根的子树的最大深度\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if(!root) return 0;\n return Math.max(maxDepth(root.left),maxDepth(root.right))+1;\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n),其中n是二叉树的节点数。因为需要遍历每个节点一次。\n- **空间复杂度**:O(h),其中h是二叉树的高度。这是由于递归调用栈的深度,最坏情况下(完全不平衡的树)可能达到O(n),最好情况下(完全平衡的树)为O(log n)。\n\n这是一个典型的分治算法应用,将问题分解为更小的子问题(左右子树的深度),然后合并结果得到最终答案。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125568669","body":"## 代码思路分析\n\n这是一个经典的二叉树递归问题,采用深度优先搜索(DFS)的方式解决:\n\n1. **基本情况处理**:\n - 如果两个节点都为null,则认为相同,返回true\n - 如果其中一个节点为null,另一个不是,则不同,返回false\n\n2. **递归比较**:\n - 比较当前节点的值是否相等\n - 递归比较左子树是否相同\n - 递归比较右子树是否相同\n - 只有当值相等且左右子树都相同时,才返回true\n\n## 代码实现\n\n```javascript\nvar isSameTree = function(p, q) {\n // 如果两个节点都为空,则相同\n if(p===null && q===null) return true;\n // 如果只有一个节点为空,则不同\n if(p===null) return false;\n if(q===null) return false;\n // 比较当前节点值,并递归比较左右子树\n return p.val===q.val && isSameTree(p.left,q.left) && isSameTree(p.right,q.right);\n};\n```\n\n\n## 复杂度分析\n\n- **时间复杂度**:O(min(m,n)),其中m和n分别是两个二叉树的节点数。在最坏情况下,需要遍历两个树中所有节点。\n- **空间复杂度**:O(min(m,n)),递归调用的层数最多为较小树的高度,最坏情况下为O(min(m,n))。\n\n这个算法通过递归方式同时遍历两棵树的相同位置节点,并比较它们的值是否相等,从而判断两棵树是否完全相同。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130348089","body":"## 思路\n\n### 核心思路\n- 使用深度优先搜索(DFS)遍历二叉树\n- 在遍历过程中维护从根节点到当前节点形成的数字\n- 当到达叶节点时,将形成的数字加到结果中\n\n### 具体实现\n\n1. **函数定义与参数**:\n - `sumNumbers(root, prev = 0)` 接收当前节点 `root` 和之前形成的数字 `prev`\n - `prev` 参数有默认值 0,用于累积从根到当前节点的数字\n\n2. **边界条件处理**:\n ```javascript\n if(!root) return 0;\n ```\n\n - 如果当前节点为空,返回 0\n\n3. **数字累积**:\n ```javascript\n prev = prev * 10 + root.val;\n ```\n\n - 将当前节点值添加到路径数字中\n - 通过 `prev * 10 + root.val` 实现数字的逐位构建\n\n4. **叶节点判断**:\n ```javascript\n if(!root.left && !root.right) return prev;\n ```\n\n - 如果当前节点是叶节点(无左右子节点),返回累积的数字\n\n5. **递归处理**:\n ```javascript\n return sumNumbers(root.left,prev) + sumNumbers(root.right,prev);\n ```\n\n - 分别递归处理左右子树\n - 将左右子树的结果相加返回\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root,prev = 0) {\n if(!root) return 0;\n prev = prev * 10 + root.val;\n if(!root.left && !root.right) return prev;\n return sumNumbers(root.left,prev) + sumNumbers(root.right,prev);\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n),其中 n 是二叉树的节点数,需要遍历每个节点一次\n- **空间复杂度**:O(h),其中 h 是二叉树的高度,主要是递归调用栈的空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134622736","body":"## 思路\n\n### 1. 核心思想\n使用深度优先搜索(DFS)遍历二叉树,记录每一层最左边的节点值。\n\n### 2. 关键实现点\n\n- **层级记录**:通过 `level` 参数跟踪当前节点所在的层级\n- **每层只记录一次**:利用 `level === left.length` 条件确保每层只记录第一个访问的节点值\n- **先左后右遍历**:先遍历左子树再遍历右子树,保证每层第一个访问的是最左边的节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let left = [];\n dfs(root,0)\n return left[left.length - 1];\n // ----------------------\n function dfs(root,level){\n if(!root) return;\n if(level === left.length) left.push(root.val);\n dfs(root.left,level + 1);\n dfs(root.right,level + 1);\n }\n};\n```\n## 优化后的代码\n优化思路:没必要用数组保存整个左侧值,只需要记录左侧值第一次出现即可\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let left = 0,ans;\n dfs(root,0)\n return ans;\n // ----------------------\n function dfs(root,level){\n if(!root) return;\n if(level === left) {\n left++;\n ans = root.val;\n }\n dfs(root.left,level + 1);\n dfs(root.right,level + 1);\n }\n};\n```\n\n\n## 复杂度分析\n- **时间复杂度**:O(n),其中 n 是二叉树的节点数,需要遍历每个节点一次\n- **空间复杂度**:O(h),其中 h 是二叉树的高度,主要是递归调用栈的空间开销","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138308014","body":"## 思路\n\n### 1. 序列化 (`serialize`)\n- 使用前序遍历(根-左-右)遍历二叉树\n- 对于每个节点:\n - 如果节点为空,将 `null` 添加到结果数组\n - 如果节点不为空,将节点值添加到结果数组,然后递归处理左右子树\n- 最后将数组转换为 JSON 字符串返回\n\n### 2. 反序列化 (`deserialize`)\n- 将 JSON 字符串解析为数组\n- 使用递归方式重建二叉树:\n - 按顺序读取数组元素\n - 如果当前元素是 `null`,返回 `null`\n - 如果当前元素不是 `null`,创建新节点,并递归构建左右子树\n - 利用前序遍历的特点,按顺序处理就能重建原来的树结构\n\n## 关键特点\n\n1. **前序遍历**:保证了根节点在子节点之前被处理,便于重建时确定父子关系\n2. **空节点标记**:用 `null` 标记空节点,确保能完全还原树的结构\n3. **递归实现**:两个函数都使用递归方式实现,代码简洁清晰\n\n## 示例说明\n\n假设有一棵二叉树:\n```\n 1\n / \\\n 2 3\n / \\\n 4 5\n```\n\n\n- 序列化结果:`[1,2,null,null,3,4,null,null,5,null,null]`\n- 反序列化时按此顺序重建树结构\n\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n let ans = [];\n dfs(root);\n return JSON.stringify(ans);\n // -----------------\n function dfs(root){\n if(!root){\n ans.push(null);\n return;\n }\n ans.push(root.val);\n dfs(root.left);\n dfs(root.right);\n }\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n let arr = JSON.parse(data),i = 0;\n //console.log(arr);\n return dfs();\n // if(arr.length === 0) return null;\n // ---------------------\n function dfs(){\n let node;\n // console.log(i,arr[i]);\n if(arr[i] === null) node = null;\n else node = new TreeNode(arr[i]);\n i++;\n if(node) {\n node.left = dfs();\n node.right = dfs();\n }\n return node;\n }\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```\n\n## 复杂度分析\n- 时间复杂度:序列化和反序列化的时间复杂度都是 O(n),其中 n 是二叉树的节点数。\n- 空间复杂度:考虑到返回值的话,序列化和反序列化的空间复杂度都是 O(n),其中 n 是二叉树的节点数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3141895435","body":"## 思路\n\n### 具体实现步骤\n\n1. **数据结构选择**\n - 使用一个大小为2001的数组 cols 每个元素是一个优先队列 `PriorityQueue`\n - 优先队列用于处理同一列中节点的排序问题\n\n2. **排序规则**\n - 主要按行号 row 排序(上到下)\n - 行号相同时按节点值 `node.val` 排序\n\n3. **DFS遍历**\n - 通过 dfs 函数遍历整个二叉树\n - 将每个节点按其列号存入对应的优先队列中\n - 列号通过 `col + 1000` 映射到数组索引,处理负数列号\n\n4. **结果构建**\n - 遍历 cols 数组,跳过空队列\n - 从每个非空队列中依次取出元素,构建每列的结果\n - 按列顺序组合成最终结果\n\n## 关键点\n\n- **坐标系统**:以根节点为原点(0,0),向左列号减1,向右列号加1,向下行号加1\n- **偏移处理**:通过 `col + 1000` 将可能的负数列号映射到正数索引\n- **排序逻辑**:同一位置优先按行排序,其次按值排序\n\n这种方法确保了垂直遍历的正确顺序。\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n let cols = new Array(2000 + 1).fill(0).map(()=>new PriorityQueue((a,b)=>{\n if(a[0] !== b[0]) return a[0] - b[0];\n return a[2] - b[2];\n }));\n\n dfs(root,0,0);\n let ans = [];\n for(let i = 0;i <= 2000;i++){\n let data = cols[i];\n if(data.size() === 0) continue;\n let temp = []\n while(data.size()) temp.push(data.dequeue()[2]);\n ans.push(temp);\n }\n return ans;\n\n // --------------------------------\n function dfs(node,row,col){\n if(!node) return;\n cols[col + 1000].enqueue([row,col,node.val]);\n dfs(node.left,row + 1,col - 1);\n dfs(node.right,row + 1,col + 1);\n }\n \n};\n```\n\n## 复杂度分析\n\n### 时间复杂度\n\n1. **初始化阶段**\n - 创建大小为2001的数组并初始化优先队列:O(2001) = O(1)\n\n2. **DFS遍历阶段**\n - 对每个节点执行一次 dfs 调用\n - 假设树有 N 个节点,则 DFS 总共执行 N 次\n - 每次 enqueue 操作在优先队列中的时间复杂度为 O(log M),其中 M 是队列中元素个数\n - 最坏情况下,所有节点都在同一列,M 最大为 N\n - 因此 DFS 阶段时间复杂度为 O(N log N)\n\n3. **结果构建阶段**\n - 遍历2001个位置的数组:O(2001) = O(1)\n - 从优先队列中 dequeue 所有元素:每个元素 dequeue 一次,总共 N 个元素\n - 每次 dequeue 操作为 O(log M)\n - 总时间复杂度为 O(N log N)\n\n**总时间复杂度:O(N log N)**,其中 N 是二叉树中节点的数量\n\n### 空间复杂度\n\n1. **存储结构**\n - cols 数组:大小固定为 2001,每个元素是一个优先队列\n - 所有优先队列总共存储 N 个节点信息:O(N)\n - 每个节点信息是一个包含3个元素的数组:O(1) 每节点\n\n2. **递归调用栈**\n - dfs 函数的递归深度最多为树的高度 H\n - 在最坏情况下(树退化为链表),H = N\n - 平均情况下,对于平衡二叉树,H = log N\n\n3. **结果数组**\n - ans 数组存储最终结果:O(N)\n\n**总空间复杂度:O(N)**,其中 N 是二叉树中节点的数量\n\n### 总结\n\n- **时间复杂度:O(N log N)**\n- **空间复杂度:O(N)**\n\n其中 N 为二叉树的节点总数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146457266","body":"## 思路:\n\n1. **使用哈希表存储已遍历元素**:\n - 创建一个空对象 [map](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\454\\2.js#L5-L5) 作为哈希表\n - 用于存储已经遍历过的元素值和其对应的索引\n\n2. **一次遍历查找**:\n - 遍历数组中的每个元素 `nums[i]`,记为 [a](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\1.js#L14-L14)\n - 计算目标差值 `b = target - a`\n - 检查 `b` 是否已经在哈希表中存在\n - 如果存在,说明找到了两个数,它们的和等于目标值,直接返回这两个数的索引 `[map[b], i]`\n - 如果不存在,将当前元素 [a](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\1.js#L14-L14) 和它的索引 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 存入哈希表,继续遍历\n\n### 算法优势:\n1. **时间复杂度优化**:从暴力解法的 O(n²) 降低到 O(n)\n2. **空间换时间**:使用额外的哈希表存储,换取查找时间的优化\n3. **一次遍历**:只需要遍历一次数组就能得到结果\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n let map = {}\n for(let i = 0;i < nums.length;i++){\n let a = nums[i],b = target - a;\n if(map[b] !== undefined) return [map[b],i];\n map[a] = i;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是数组的长度。\n- 空间复杂度:O(n),哈希表 map 的大小为 n。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3146924002","body":"## 思路\n### 主要步骤:\n\n1. **统计频次**:使用 [map](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题04.01.节点间通路/main.js#L13-L13) 对象统计每个数字在数组中出现的频次\n ```javascript\n let map = {};\n for(let i of nums) map[i] = (map[i] || 0) + 1;\n ```\n\n\n2. **维护大小为 K 的最小堆**:使用最小堆来保存频率最高的 K 个元素\n ```javascript\n let q = new MinPriorityQueue(v=>v[1]); // 基于元素出现频次的优先队列\n ```\n\n\n遍历统计结果,将元素和其频次作为数组加入堆中,当堆的大小超过 K 时,移除堆顶(即当前堆中频次最低的元素):\n ```javascript\n for(let key in map){\n q.enqueue([+key,map[key]]);\n if(q.size() > k) q.dequeue();\n }\n ```\n\n\n3. **构建结果数组**:依次从堆中取出元素,因为是最小堆,所以频次低的先出堆,最终得到的就是频次最高的 K 个元素\n ```javascript\n let ans = [];\n while(q.size()){\n ans.push(q.dequeue()[0]);\n }\n ```\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function(nums, k) {\n let q = new MinPriorityQueue(v=>v[1]);\n let map = {};\n for(let i of nums) map[i] = (map[i] || 0) + 1;\n for(let key in map){\n q.enqueue([+key,map[key]]);\n if(q.size() > k) q.dequeue();\n } \n let ans = [];\n while(q.size()){\n ans.push(q.dequeue()[0]);\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(N log K),其中 N 是数组的长度\n- 空间复杂度:O(N),用于存储频次映射表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148902680","body":"## 思路\n\n### 1. 数据结构选择\n- 使用 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 数组存储每个点到其他点的距离统计\n- `map[i]` 是一个 Map,记录第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 个点到其他各点的距离及出现次数\n\n### 2. 核心逻辑\n- **距离计算**:遍历所有点对,计算两点间距离的平方(避免开根号运算)\n- **距离统计**:将每对点的距离信息分别记录到两个点的统计中\n- **结果计算**:对于每个点,如果到其他点有相同距离的点超过1个,则可以组成回旋镖\n\n### 3. 关键步骤详解\n\n```javascript\n// 计算两点间距离的平方\nfunction calc(i,j){\n let a = Math.abs(points[i][0] - points[j][0]),b = Math.abs(points[i][1] - points[j][1]);\n return a * a + b * b;\n}\n```\n这段代码计算两个点之间的欧几里得距离的平方,使用平方避免浮点运算。\n\n```javascript\n// 统计每个点到其他点的距离\nfunction addMap(i,dis){\n let m = map[i];\n m.set(dis,(m.get(dis) || 0) + 1);\n}\n```\n将距离信息记录到对应点的统计Map中。\n\n### 4. 结果计算原理\n\n对于每个点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6),如果存在 `v` 个点与它距离相同(`v>1`),则可以从这 `v` 个点中选择 2 个点与点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 组成回旋镖,选择方式有 `v*(v-1)` 种。\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} points\n * @return {number}\n */\nvar numberOfBoomerangs = function(points) {\n let n = points.length;\n if(n < 3) return 0;\n let map = new Array(n).fill(0).map(()=>new Map());\n for(let i = 0;i < n;i++){\n for(let j = i + 1;j < n;j++){\n let dis = calc(i,j);\n addMap(i,dis);\n addMap(j,dis);\n }\n }\n let ans = 0;\n for(let i = 0;i < n;i++){\n for(let [k,v] of map[i]){\n if(v <= 1) continue;\n ans += v * (v - 1);\n }\n }\n\n return ans;\n\n \n\n\n // ------------------------------\n function calc(i,j){\n let a = Math.abs(points[i][0] - points[j][0]),b = Math.abs(points[i][1] - points[j][1]);\n return a * a + b * b;\n }\n\n function addMap(i,dis){\n let m = map[i];\n m.set(dis,(m.get(dis) || 0) + 1);\n\n }\n};\n```\n\n## 算法复杂度\n- 时间复杂度:O(n²)\n- 空间复杂度:O(n²)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3152979976","body":"## 思路\n\n### 核心思想\n使用**滑动窗口**(Sliding Window)技术配合**哈希表**来解决这个问题。\n\n### 关键变量说明\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31): 滑动窗口的左边界\n- [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6): 滑动窗口的右边界(循环变量)\n- [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5): 用于记录窗口内每个字符出现的次数\n- `ans`: 记录最长无重复子串的长度\n\n### 算法步骤\n\n1. **初始化**:设置左边界 `l = 0`,创建字符计数的 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5),初始化结果 `ans = 0`\n\n2. **扩展窗口**:使用 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 从左到右遍历字符串,逐步扩展窗口右边界\n\n3. **处理重复字符**:\n - 当遇到重复字符时(`map.has(c)` 为 true),不断右移左边界 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31)\n - 移动过程中减少对应字符的计数,如果计数为0则从 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 中删除\n - 直到窗口中不再包含当前字符为止\n\n4. **更新结果**:\n - 计算当前窗口长度 `i - l + 1`\n - 与历史最大值比较,更新 `ans`\n\n5. **维护窗口状态**:将当前字符加入 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 并增加其计数\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n let l = 0, map = new Map(),n = s.length,ans = 0;\n for(let i = 0;i < n;i++){\n let c = s[i]\n while(map.has(c)){\n map.set(s[l],map.get(s[l]) - 1);\n if(map.get(s[l]) === 0) map.delete(s[l]);\n l++;\n }\n // console.log(l,i,s.slice(l,i + 1));\n ans = Math.max(i - l + 1,ans);\n map.set(c,(map.get(c) || 0 ) + 1)\n }\n return ans;\n};\n```\n\n\n## 复杂度分析\n- **时间复杂度**: O(n),其中 n 是字符串长度,每个字符最多被访问两次\n- **空间复杂度**: O(min(m,n)),其中 m 是字符集大小","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3157255368","body":"## 思路\n\n### 1. 建立单词频次映射\n```javascript\nlet map = new Map();\nwords.forEach((word,i)=>{\n map.set(word,(map.get(word) || 0) + 1);\n});\n```\n\n- 使用 `Map` 统计 `words` 数组中每个单词的出现次数\n- 处理 `words` 中可能存在重复单词的情况\n\n### 2. 初始化参数\n```javascript\nlet n = s.length,m = words.length,k = words[0].length,l = k * m;\n```\n\n- [n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6): 字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- `m`: 单词数组的长度\n- `k`: 每个单词的长度(题目保证所有单词等长)\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31): 所有单词连接后的总长度\n\n### 3. 遍历可能的起始位置\n```javascript\nfor(let i = 0;i <= n - l;i++){}\n```\n\n- 只需检查到 `n - l` 位置,因为更后面不可能容纳完整的连接串\n\n### 4. 检查每个窗口\n```javascript\nlet j = i,result = new Map(),total = 0;\nwhile(j < i + l){\n let c = s.slice(j,j + k);\n if(map.has(c) === false) break;\n let found = false;\n result.set(c,(result.get(c) || 0) + 1);\n if(result.get(c) <= map.get(c)) found = true;\n if(found === false) break;\n j += k;\n total++;\n}\n```\n\n- 从位置 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 开始,每次取长度为 `k` 的子串进行匹配\n- 使用 `result` 记录当前窗口中各单词的出现次数\n- 如果遇到不在 `words` 中的单词或某个单词出现次数超过要求,则提前终止\n- `total` 记录成功匹配的单词数\n\n### 5. 判断结果\n```javascript\nif(total === m) ans.push(i);\n```\n\n- 当成功匹配的单词数等于 `words` 长度时,说明找到了一个有效子串\n\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n let map = new Map();\n words.forEach((word,i)=>{\n map.set(word,(map.get(word) || 0) + 1);\n });\n let n = s.length,m = words.length,k = words[0].length,l = k * m;\n if(n < l) return [];\n let ans = [];\n for(let i = 0;i <= n - l;i++){\n let j = i,result = new Map(),total = 0;\n while(j < i + l){\n // console.log('check',s.slice(i,i + m * k));\n let c = s.slice(j,j + k);\n if(map.has(c) === false) break;\n let found = false;\n result.set(c,(result.get(c) || 0) + 1);\n if(result.get(c) <= map.get(c)) found = true;\n if(found === false) break;\n j += k;\n total++;\n }\n if(total === m) ans.push(i); \n }\n return ans;\n};\n```\n## 复杂度分析\n### 时间复杂度\n- 外层循环: O(n - l)\n- 内层循环: O(m)\n- 总体复杂度: O((n - l) × m)\n### 空间复杂度\nO(n):存储单词频次映射和结果数组\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162347437","body":"## 思路\n\n使用前缀和 + 哈希表的方法,基于以下数学原理:\n\n1. 如果总和 `totalSum % p = delta`,我们需要找到一个子数组,其和模 `p` 也等于 `delta`\n2. 这样删除该子数组后,剩余元素和就能被 `p` 整除\n\n## 代码步骤分析\n\n### 1. 前缀和计算\n```javascript\nlet n = nums.length, sum = new Array(n + 1).fill(0);\nfor(let i = 0; i < n; i++) sum[i + 1] = sum[i] + nums[i];\n```\n\n- 构建前缀和数组 `sum`,其中 `sum[i]` 表示前 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 个元素的和\n- `sum[0] = 0`,`sum[i] = nums[0] + nums[1] + ... + nums[i-1]`\n\n### 2. 计算目标余数\n```javascript\nlet delta = sum[n] % p;\nif(delta === 0) return 0;\n```\n\n- `sum[n]` 是所有元素的总和\n- `delta` 是总和对 `p` 的余数\n- 如果 `delta` 为 0,说明总和已能被 `p` 整除,返回 0\n\n### 3. 寻找最短子数组\n```javascript\nlet ans = Infinity;\nlet map = new Map();\nfor(let i = 0; i <= n; i++){\n let b = sum[i], a = (b % p - delta % p + p) % p;\n map.set(b % p, i);\n if(map.has(a)) ans = Math.min(ans, i - map.get(a));\n}\n```\n\n\n关键数学关系:\n- 对于子数组 `nums[j...i-1]`,其和为 `sum[i] - sum[j]`\n- 我们希望 `(sum[i] - sum[j]) % p = delta`\n- 即 `sum[i] % p = (sum[j] + delta) % p`\n- 变形得:`sum[j] % p = (sum[i] % p - delta) % p`\n\n具体实现:\n- `b = sum[i]`:当前前缀和\n- `a = (b % p - delta % p + p) % p`:需要找到的前缀和余数\n- 用 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 记录每个余数值最后一次出现的位置\n- 如果找到对应的余数 [a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27),则更新最短长度\n\n### 4. 返回结果\n```javascript\nreturn ans === n ? -1 : ans;\n```\n\n- 如果最短长度等于数组长度,说明需要删除整个数组,返回 -1\n- 否则返回找到的最短子数组长度\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar minSubarray = function(nums, p) {\n let n = nums.length,sum = new Array(n + 1).fill(0);\n for(let i = 0;i < n;i++) sum[i + 1] = sum[i] + (nums[i]);\n // p = BigInt(p);\n let delta = sum[n] % p;\n if(delta === 0) return 0;\n let ans = Infinity;\n let map = new Map();\n for(let i = 0;i <= n;i++){\n let b = sum[i],a = (b % p - delta % p + p) % p;\n map.set(b % p,i);\n if(map.has(a)) ans = Math.min(ans,i - map.get(a));\n }\n return ans === n ? -1 : ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),只需遍历一次数组\n- 空间复杂度:O(n),用于存储前缀和数组和哈希表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166424389","body":"\n## 思路\n使用了经典的**快慢指针**(龟兔赛跑)算法。\n\n1. **双指针技巧**:\n - `slow` 指针每次移动一步\n - `fast` 指针每次移动两步\n - 当 `fast` 到达链表末尾时,`slow` 正好在中间位置\n\n## 代码执行流程\n\n- **初始化**:两个指针 `slow` 和 `fast` 都指向链表头节点 [head](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题02.04.分割链表\\main.js#L50-L50)\n- **循环条件**:`while (fast && fast.next)` 确保 `fast` 可以安全地移动两步\n- **指针移动**:\n - `fast` 连续移动两步:`fast = fast.next; fast = fast.next;`\n - `slow` 移动一步:`slow = slow.next;`\n- **返回结果**:当循环结束时,`slow` 指向中间节点\n\n## 处理奇偶数节点的情况\n\n- **奇数个节点**:返回正中间的节点\n- **偶数个节点**:返回第二个中间节点(如链表有4个节点,则返回第3个节点)\n\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n let slow = head,fast = head;\n while(fast && fast.next){\n fast = fast.next;\n fast = fast.next;\n slow = slow.next;\n }\n return slow;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是链表的节点数。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169628215","body":"## 思路\n\n1. 使用双指针技术:\n - [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 指针(慢指针):指向不重复序列的最后一个元素位置\n - [i](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题08.07.无重复字符串的排列组合/main.js#L9-L22) 指针(快指针):用于遍历整个数组\n\n2. 初始化:\n - [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 从 0 开始,表示第一个元素肯定是要保留的\n - [i](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题08.07.无重复字符串的排列组合/main.js#L9-L22) 从 1 开始遍历\n\n3. 核心逻辑:\n - 当 `nums[i] > nums[r]` 时,说明找到了一个新的不重复元素\n - 此时将 [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 向前移动一位,并将 `nums[i]` 与 `nums[r]` 交换\n - 由于数组是排序的,所以只需要比较大小就能判断是否是新元素\n\n4. 返回值:\n - 返回 [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) + 1,即不重复元素的个数\n\n### 示例演示:\n\n假设数组为 [0, 0, 1, 1, 2, 2]:\n\n1. 初始:r = 0, i = 1,nums[1] = 0, nums[0] = 0,不满足 `nums[i] > nums[r]`\n2. i = 2,nums[2] = 1, nums[0] = 0,满足 `nums[2] > nums[0]`,r 变为 1,交换 nums[2] 和 nums[1]\n - 数组变为 [0, 1, 0, 1, 2, 2],r = 1\n3. i = 3,nums[3] = 1, nums[1] = 1,不满足 `nums[i] > nums[r]`\n4. i = 4,nums[4] = 2, nums[1] = 1,满足 `nums[4] > nums[1]`,r 变为 2,交换 nums[4] 和 nums[2]\n - 数组变为 [0, 1, 2, 1, 0, 2],r = 2\n5. i = 5,nums[5] = 2, nums[2] = 2,不满足 `nums[i] > nums[r]`\n6. 结束,返回 r + 1 = 3\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n let n = nums.length,r = 0;\n for(let i = 1;i < n;i++){\n if(nums[i] > nums[r]) {\n r++;\n swap(i,r);\n }\n //console.log(nums);\n }\n return r + 1;\n // ------------------------\n function swap(i,j){\n [nums[i],nums[j]] = [nums[j],nums[i]]\n }\n};\n```\n\n### 复杂度分析:\n\n- 时间复杂度:O(n),只需要遍历一次数组\n- 空间复杂度:O(1),只使用了常数级别的额外空间\n- 利用了数组已经排序的特性,通过比较大小判断是否重复\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172297646","body":"## 思路\n经典的二分查找算法,用于在有序数组中找到目标值的插入位置\n1. **初始化变量**:\n - `n`:数组长度\n - `l`:左边界,初始为0\n - `r`:右边界,初始为n-1\n - `ans`:结果位置,初始为n(表示插入到数组末尾)\n\n2. **二分查找逻辑**:\n - 使用标准二分查找模板,当`l <= r`时继续查找\n - `mid = (l + r) >> 1`:计算中间位置(相当于除以2取整)\n - 关键判断:`if(nums[mid] >= target)`\n - 如果中间元素大于等于目标值,说明目标值应该在左半部分(包括mid位置)\n - 更新`ans = mid`,并将右边界移动到`mid - 1`\n - 否则,目标值在右半部分,将左边界移动到`mid + 1`\n\n3. **返回结果**:\n - 返回找到的插入位置`ans`\n\n### 特殊情况处理\n\n- 如果target小于所有元素,ans保持为0(正确位置)\n- 如果target大于所有元素,ans保持为n(数组长度,正确位置)\n- 如果target等于某个元素,ans为该元素的索引\n- 如果target介于两个元素之间,ans为较大元素的位置\n\n这个实现非常优雅,通过一个变量ans记录可能的答案,避免了在循环外再进行额外判断,使得代码简洁且易于理解。\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let n = nums.length;\n let l = 0, r = n - 1,ans = n;\n while(l <= r){\n let mid = (l + r) >> 1;\n if(nums[mid] >= target){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n};\n```\n\n### 复杂度分析\n\n1. **时间复杂度**:O(log n),典型的二分查找时间复杂度\n2. **空间复杂度**:O(1),只使用了常数级别的额外空间\n3. **核心思想**:寻找第一个大于等于target的元素位置","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173065451","body":"## 思路\n\n这段代码使用**单调队列**(双端队列)来解决滑动窗口最大值问题,时间复杂度为 O(n)。\n\n### 实现步骤\n\n1. **数据结构选择**\n - 使用 `q` 数组作为双端队列,存储数组元素的**索引**\n - 队列中保持索引对应的值**单调递减**的特性\n\n2. **维护单调性**\n ```javascript\n while(q.length && back() < nums[i]) q.pop();\n q.push(i);\n ```\n\n - 在每次添加新元素前,移除队尾所有小于当前元素的索引\n - 这样保证队首始终是当前窗口的最大值索引\n\n3. **窗口处理**\n ```javascript\n if(i >= k - 1){\n ans.push(nums[q[0]]); // 队首即为窗口最大值\n if(i - q[0] + 1 === k) q.shift(); // 移除窗口外的元素\n }\n ```\n\n - 当达到窗口大小时开始记录结果\n - 及时移除超出窗口范围的索引\n\n### 关键技巧\n\n- 存储索引而非值,便于判断元素是否在窗口范围内\n- 利用单调性快速获取窗口最大值(队首元素)\n- 通过索引差值判断元素是否需要移出窗口\n\n### 缺陷\n在javascript中,使用数组模拟双端队列,队首出队、入队的时间复杂度均为O(n),性能较差,可以考虑手动实现一个双端队列,例如使用双向链表,优化性能。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar maxSlidingWindow = function(nums, k) {\n let q = [],n = nums.length;\n let ans = [];\n for(let i = 0;i < n;i++){\n while(q.length && back() < nums[i]) q.pop();\n q.push(i);\n if(i >= k - 1){\n ans.push(nums[q[0]]);\n if(i - q[0] + 1 === k) q.shift();\n }\n }\n return ans;\n // ------------------------\n function back(){\n return nums[q[q.length - 1]];\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是数组的长度。单调队列的维护时间复杂度为 O(n),窗口处理时间复杂度为 O(n),因此总时间复杂度为 O(n)。\n- 空间复杂度:O(n),单调队列最多存储 n 个元素,因此空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3177500710","body":"## 思路\n\n### 1. 数据结构设计\n- 使用两个数组 `ind` 和 `outd` 分别记录每个人的入度和出度\n- 数组长度为 `n+1` 是为了方便使用1到n的索引对应人编号\n\n### 2. 统计过程\n```javascript\nfor(let [a,b] of trust){\n outd[a]++; // a相信别人,出度+1\n ind[b]++; // b被别人相信,入度+1\n}\n```\n\n- 遍历信任关系数组,统计每个人的入度和出度\n\n### 3. 法官判断\n```javascript\nfor(let i = 1;i <= n;i++){\n if(outd[i] === 0 && ind[i] === n - 1) return i;\n}\n```\n\n- 遍历所有人,寻找满足条件的人:\n - `outd[i] === 0`:不相信任何人\n - `ind[i] === n - 1`:被其他所有人相信\n\n这是典型的图论中利用入度出度解决问题的方法。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n let ind = new Array(n + 1).fill(0),// 入度\n outd = new Array(n + 1).fill(0);// 出度\n for(let [a,b] of trust){\n outd[a]++;\n ind[b]++;\n }\n for(let i = 1;i <= n;i++){\n if(outd[i] === 0 && ind[i] === n - 1) return i;\n }\n return -1;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(T + N),其中T是信任关系数,N是人数\n- 空间复杂度:O(N),用于存储入度和出度数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182022991","body":"## 思路\n\n### 1. 图的构建\n- 使用邻接表`g`存储不喜欢关系\n- 对于每一对`[a,b]`,在[a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27)的邻接表中添加`b`,在`b`的邻接表中添加[a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27)\n- 这样构建出一个无向图,表示不喜欢关系\n\n### 2. 二分图判断\n- 使用染色法判断是否为二分图\n- `color`数组记录每个节点的颜色状态:\n - `0`表示未染色\n - `1`表示第一组\n - `2`表示第二组\n\n### 3. DFS遍历\n- 遍历所有节点,对未染色节点开始DFS\n- [f(i, val)](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)函数:\n - 将节点[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)染成颜色[val](file://E:\\其他项目\\algorithm_exercises\\libs\\LinkedList.js#L34-L34)\n - 遍历[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)的所有邻居节点`j`\n - 如果邻居`j`已有颜色且与[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)相同,返回`false`\n - 如果邻居`j`未染色,递归将其染成相反颜色\n - 所有情况满足则返回`true`\n\n### 4. 核心逻辑\n- 主函数中遍历所有节点,对未染色节点调用[f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)函数\n- 如果任何一次调用返回`false`,说明无法二分,返回`false`\n- 全部成功则返回`true`\n\n这是典型的二分图判定问题,通过图的遍历和染色来解决。\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nvar possibleBipartition = function(n, dislikes) {\n let g = new Array(n + 1).fill(0).map(()=>[]);\n for(let [a,b] of dislikes){\n g[a].push(b);\n g[b].push(a);\n }\n let color = new Array(n + 1).fill(0);\n for(let i = 1;i <= n;i++){\n if(color[i] === 0 && !f(i,1)) return false;\n }\n return true;\n\n // ------------------------\n function f(i,val){\n color[i] = val;\n for(let j of g[i]){\n if(color[j] && color[j] === val) return false;\n if(!color[j] && !f(j,val === 1 ? 2 : 1)) return false; \n }\n return true;\n }\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n + dislikes.length) - 线性时间复杂度\n- 空间复杂度:O(n + dislikes.length) - 主要用于存储图结构和递归栈","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186678361","body":"## 主要思路\n\n### 1. 预处理阶段\n- **处理未分配项目**:将 `group[i] === -1` 的项目分配给新的虚拟组\n- **构建组内项目映射**:建立 `groupItems` 数组,记录每个组包含的项目\n\n### 2. 构建依赖图\n- **项目依赖图** (`itemG`):记录项目间的依赖关系\n- **小组依赖图** (`groupG`):记录小组间的依赖关系\n- **计算入度**:\n - `inID`:每个项目的入度\n - `inGD`:每个小组的入度\n\n### 3. 双层拓扑排序\n- **组间拓扑排序**:先对小组进行拓扑排序\n- **组内拓扑排序**:对每个小组内的项目进行拓扑排序\n\n## 关键函数分析\n\n### 主函数流程\n```javascript\n// 初始化和构建图结构\n// ...\n\n// 组间拓扑排序\nfor(let i = 0;i <= m;i++){\n if(inGD[i] === 0) qG.enqueue(i);\n}\nwhile(qG.size()){\n let i = qG.dequeue();\n getItemsFromGroup(i); // 处理组内项目\n // 更新小组依赖\n}\n```\n\n\n### 组内拓扑排序函数 `getItemsFromGroup`\n```javascript\nfunction getItemsFromGroup(g){\n // 对特定组内的项目进行拓扑排序\n // 只处理组内依赖关系\n}\n```\n\n## 核心思想\n采用**分层拓扑排序**策略:\n1. 先确保小组间的依赖关系满足\n2. 再确保每个小组内部的项目依赖关系满足\n3. 通过双层 BFS 实现完整的排序逻辑\n\n这种解法有效地将复杂的依赖关系分解为两个相对简单的拓扑排序问题。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n for(let i = 0;i < n;i++){\n if(group[i] === -1) group[i] = m++;\n }\n\n let groupItems = new Array(m).fill(0).map(()=>[]);\n for(let i = 0;i < n;i++){\n groupItems[group[i]].push(i);\n }\n\n\n\n let itemG = new Array(n).fill(0).map(()=>[]);// 项目依赖关系建图\n let groupG = new Array(m).fill(0).map(()=>new Set());// 小组依赖关系建图\n let inID = new Array(n).fill(0);//每个项目的入度\n let inGD = new Array(m).fill(0);//每个小组的入度\n beforeItems.forEach((prevs,curr)=>{\n inID[curr] += prevs.length;\n for(let prev of prevs) {\n itemG[prev].push(curr);\n let u = group[prev],v = group[curr];\n if(u === v) continue;\n if(groupG[u].has(v)) continue;\n groupG[u].add(v);\n inGD[v]++;\n }\n });\n\n //console.log('小组依赖',groupG,groupItems);\n\n let ans = [],qG = new Queue();\n\n\n for(let i = 0;i <= m;i++){\n if(inGD[i] === 0) qG.enqueue(i);\n }\n while(qG.size()){\n let i = qG.dequeue();\n getItemsFromGroup(i);\n for(let j of groupG[i]){\n inGD[j]--;\n if(inGD[j] === 0) qG.enqueue(j);\n }\n }\n return ans.length === n ? ans : [];\n\n // ---------------------------------\n function getItemsFromGroup(g){\n let items = groupItems[g];\n let qI = new Queue();\n for(let i of items){\n if(inID[i] === 0) qI.enqueue(i);\n }\n while(qI.size()){\n let i = qI.dequeue();\n ans.push(i);\n for(let j of itemG[i]){\n inID[j]--;\n if(inID[j] === 0 && group[j] === g) qI.enqueue(j);\n }\n }\n }\n\n };\n```\n## 复杂度分析\n- **时间复杂度**:O(n + m + |beforeItems|) - 每个项目和依赖关系只被处理一次\n- **空间复杂度**:O(n + m) - 存储图结构和队列","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190382685","body":"## 思路\n没啥好说的,模拟就完了\n## 代码\n```javascript\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let x = 0,y = 0;\n for(let move of moves){\n if(move === 'U') x--;\n else if(move === 'D') x++;\n else if(move === 'L') y--;\n else y++;\n } \n return x === 0 && y === 0\n};\n```\n## 复杂度分析\n- 时间复杂度O(n)\n- 空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193453621","body":"## 思路\n\n### 主要步骤:\n\n1. **数据预处理**:\n - 将原始任务数组 [enqueueTime, processingTime] 扩展为 [enqueueTime, processingTime, index],保留原始索引信息\n - 按照入队时间(enqueueTime)对任务进行排序\n\n2. **使用优先队列**:\n - 创建一个优先队列,排序规则是:\n - 首先按处理时间(processingTime)升序排列\n - 如果处理时间相同,则按下标(index)升序排列\n\n3. **任务处理逻辑**:\n - 初始化结果数组和当前时间点(end)\n - 当还有未处理任务或优先队列不为空时:\n - 如果优先队列为空,将当前时间点更新为下一个任务的入队时间\n - 将所有在当前时间点之前或刚好到达的未处理任务加入优先队列\n - 从优先队列中取出优先级最高的任务执行\n - 更新当前时间点(加上该任务的处理时间)\n - 将该任务的原始索引加入结果数组\n\n### 关键点解释:\n\n- **优先队列的作用**:确保在可执行的任务中,总是选择处理时间最短的任务执行(最短作业优先调度算法)\n- **时间管理**:通过 [end] 变量追踪当前时间点,确保任务按时间顺序被考虑\n- **边界处理**:当优先队列为空时,直接跳转到下一个任务的入队时间,避免不必要的循环\n\n## 代码\n```javascript\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n let data = [],n = tasks.length;\n // 按任务入队时间排序,同时不丢失下标信息。\n tasks.forEach((v,i)=>data.push([...v,i])); \n data.sort((a,b)=>a[0] - b[0]);\n // 优先队列,优先级为:先按任务时长,再按下标\n let i = 0,q = new PriorityQueue((a,b)=>{\n if(a[1] !== b[1]) return a[1] - b[1];\n return a[2] - b[2];\n });\n\n let ans = [],end = 0;\n while(i < n || q.size()){\n if(q.size() === 0) end = Math.max(end,data[i][0]);\n while(i < n && data[i][0] <= end) q.enqueue(data[i++]);\n let [_,p,index] = q.dequeue();\n ans.push(index);\n end += p;\n }\n return ans;\n};\n```\n\n## 复杂度分析\n### 时间复杂度:\n- 排序:O(n log n)\n- 优先队列操作:每个任务最多入队和出队一次,每次操作 O(log n)\n- 总体复杂度:O(n log n)\n### 空间复杂度:\n- 需要一个优先队列及一个数组保存数据,空间复杂度为 O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194152066","body":"## 思路\n\n### 主要函数功能\n\n1. [numberOfRounds](file:///E:/力扣刷题/algorithm_exercises/.md#L4-L13) - 主函数,计算从登录到登出之间的完整游戏回合数\n2. [parseTime](file:///E:/力扣刷题/algorithm_exercises/.md#L16-L18) - 辅助函数,将时间字符串解析为小时和分钟\n3. [calc](file:///E:/力扣刷题/algorithm_exercises/.md#L20-L37) - 核心计算函数,计算两个时间之间的回合数\n\n### 解题思路\n\n1. **时间解析**:首先将登录时间和登出时间解析为小时和分钟的数组\n2. **跨天处理**:如果登出时间早于登录时间,说明跨越了午夜,需要在登出时间上加24小时\n3. **回合计算**:\n - 将登录时间向上取整到最近的15分钟倍数(下一回合开始时间)\n - 计算登出时间和登录时间之间的15分钟间隔数\n - 如果结果为负数,则返回0\n\n### 代码细节\n\n```javascript\n// 时间取整逻辑\nif(m1 <= 0) m1 = 0;\nelse if(m1 <= 15) m1 = 15;\nelse if(m1 <= 30) m1 = 30;\nelse if(m1 <= 45) m1 = 45;\nelse {\n m1 = 0;\n h1++;\n}\n```\n\n这个逻辑将登录时间向上取整到下一个回合开始时间(每15分钟为一个回合)。\n\n```javascript\nlet ans = Math.floor((h2 * 60 + m2 - (h1 * 60 + m1)) / 15);\n```\n这行代码计算两个时间点之间有多少个完整的15分钟时间段。\n\n## 代码\n```javascript\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n let [h1,m1] = parseTime(loginTime),[h2,m2] = parseTime(logoutTime);\n if(h1 < h2 || h1 === h2 && m1 < m2) return calc(h1,m1,h2,m2);\n return calc(h1,m1,h2 + 24,m2);\n // -------------------------\n function parseTime(time){\n return time.split(':').map(v=>Number(v));\n }\n\n function calc(h1,m1,h2,m2){\n if(m1 <= 0) m1 = 0;\n else if(m1 <= 15) m1 = 15;\n else if(m1 <= 30) m1 = 30;\n else if(m1 <= 45) m1 = 45;\n else {\n m1 = 0;\n h1++;\n }\n // console.log(h1,m1,h2,m2)\n let ans = Math.floor((h2 * 60 + m2 - (h1 * 60 + m1)) / 15);\n if(ans < 0) return 0;\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(1),因为解析时间和计算都是常数时间操作。\n- 空间复杂度:O(1),因为只使用了常数个变量。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3195140726","body":"## 思路\n\n### 主函数 `minCharacters`\n- 通过比较三种情况的最小值来得到最终答案:\n - `altb(a,b)`: 使 a 中所有字符 < b 中所有字符需要的操作数\n - `altb(b,a)`: 使 b 中所有字符 < a 中所有字符需要的操作数\n - `aeqb(a,b)`: 使两个字符串都由同一字符组成需要的操作数\n\n### 辅助函数分析\n\n1. **`altb(a,b)` 函数**\n - 遍历分割点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) (1-25,对应字符 'b'-'z')\n - 计算需要修改的字符数:\n - [a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27) 中所有 ≥ i 的字符都需要修改\n - `b` 中所有 < i 的字符都需要修改\n - 返回最小操作数\n\n2. **`aeqb(a,b)` 函数**\n - 统计两个字符串中各字符出现次数\n - 找到出现频率最高的字符\n - 将其他所有字符都修改为该字符即为最少操作数\n\n3. **`getCharValue` 函数**\n - 将字符转换为对应的数值 (a=0, b=1, ..., z=25)\n\n## 代码\n```javascript\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n return Math.min(altb(a,b),altb(b,a),aeqb(a,b));\n // --------------------------------------\n function altb(a,b){\n let ans = Infinity;\n for(let i = 1;i < 26;i++){\n let temp = 0;\n for(let c of a) if(getCharValue(c) >= i) temp++;\n for(let c of b) if(getCharValue(c) < i) temp++;\n ans = Math.min(ans,temp);\n }\n return ans;\n }\n\n function aeqb(a,b){\n let data = new Array(26).fill(0);\n for(let c of a) data[getCharValue(c)]++;\n for(let c of b) data[getCharValue(c)]++;\n let max = data.reduce((a,b)=>Math.max(a,b),0);\n return a.length + b.length - max;\n }\n\nfunction getCharValue(char){\n return char.charCodeAt(0) - 'a'.charCodeAt(0);\n }\n};\n```\n\n\n## 复杂度分析\n- 时间复杂度:O((m+n)×26) = O(m+n),其中 m 和 n 分别是字符串 a 和 b 的长度\n- 空间复杂度:O(1),只使用了固定大小的额外空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199063845","body":"## 思路\n使用**三路快排(Three-way QuickSort)**的实现,主要通过以下步骤完成排序:\n1. **选择基准值(pivot)**:使用 `viot` 函数选择一个合适的基准值\n2. **分区操作(partition)**:将数组分为三部分:小于基准值、等于基准值、大于基准值\n3. **递归排序**:对小于和大于基准值的两个子数组递归进行快排\n\n## 关键函数分析\n\n### 1. 主排序函数 `quickSort`\n```javascript\nfunction quickSort(l,r){\n if(l >= r) return;\n let i = viot(l,r); // 选择基准值位置\n if(r - l === 1) return;\n if(i !== l) swap(i,l); // 将基准值移到最左边\n let [low,up] = partition(l,r); // 三路分区\n quickSort(l,low - 1); // 递归排序小于基准值的部分\n quickSort(up + 1,r); // 递归排序大于基准值的部分\n}\n```\n\n\n### 2. 基准值选择 `viot`\n```javascript\nfunction viot(l,r){\n // 选择左、中、右三个元素作为候选\n let a = nums[l], c = nums[r];\n let mid = (l + r) >> 1, b = nums[mid];\n \n // 通过比较这三个值选择一个较优的基准值位置\n // 实现了三数取中法的思想\n}\n```\n\n\n### 3. 三路分区 [partition](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题02.04.分割链表\\main.js#L15-L48)\n```javascript\nfunction partition(i,j){\n let viot = nums[i], l = i - 1, r = j + 1;\n for(let k = i; k < r; k++){\n let c = nums[k];\n if(c > viot){\n r--;\n swap(k,r);\n k--; // 交换后需要重新检查当前位置\n }else if(c < viot){\n l++;\n swap(k,l);\n }\n // c === viot 时,元素保持在中间区域\n }\n return [l + 1, r - 1]; // 返回等于基准值的区间边界\n}\n```\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function(nums) {\n quickSort(0,nums.length - 1);\n return nums;\n // -------------------------\n function quickSort(l,r){\n if(l >= r) return;\n // console.log(l,r,nums);\n // 找基准值位置\n let i = viot(l,r);\n if(r - l === 1) return;\n if(i !== l) swap(i,l);\n // console.log('viot',nums[l]);\n let [low,up] = partition(l,r);\n // console.log(mid,nums);\n quickSort(l,low - 1);\n quickSort(up + 1,r);\n }\n\n function partition(i,j){\n let viot = nums[i],l = i - 1,r = j + 1;\n for(let k = i;k < r;k++){\n let c = nums[k];\n if(c > viot){\n r--;\n swap(k,r);\n k--;\n }else if(c < viot){\n l++;\n swap(k,l);\n }\n }\n return [l + 1,r - 1];\n }\n\n function viot(l,r){\n let a = nums[l],c = nums[r];\n if(a > c){\n swap(l,r);\n a = nums[l];\n c = nums[r];\n }\n if(r - l === 1) return;\n let mid = (l + r) >> 1,b = nums[mid];\n // if(a === c && a === b) return l;\n if(a === c) return a < b ? l : mid;\n if(b === a || b === c) return l;\n else if(b < a) return l;\n else if(b > a && b < c) return mid;\n return r;\n }\n\n function swap(l,r){\n [nums[l],nums[r]] = [nums[r],nums[l]];\n }\n };\n```\n\n## 复杂度分析\n- **三路快排**:能够很好地处理有重复元素的数组,将相等元素聚集在一起\n- **优化的基准值选择**:使用三数取中法减少最坏情况的发生\n- **原地排序**:不需要额外的存储空间\n- **时间复杂度**:平均 O(n log n),最坏 O(n²)\n- **空间复杂度**:O(log n)(递归调用栈)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204104013","body":"## 思路\n\n### 2. 初始化变量\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31):二分查找的左边界,初始值为 `0`。\n- `r`:二分查找的右边界,初始值为 `x`。\n- `ans`:用于记录当前找到的满足条件的最大整数平方根,初始值为 `0`。\n\n### 3. 二分查找过程\n- 循环条件为 `l <= r`,表示在左边界小于等于右边界时继续查找。\n- 计算中间值 `mid`:\n ```javascript\n let mid = l + ((r - l) >> 1);\n ```\n\n 这里使用了位运算 `>> 1` 来代替除以 `2` 的操作,目的是提高计算效率。\n- 判断逻辑:\n - 如果 `mid * mid <= x`,说明 `mid` 可能是答案,但还可能有更大的值满足条件,因此更新 `ans = mid` 并将左边界右移:`l = mid + 1`。\n - 否则,说明 `mid` 太大,需要将右边界左移:`r = mid - 1`。\n\n### 4. 返回结果\n- 最终返回 `ans`,即找到的满足条件的最大整数平方根。\n\n\n## 代码\n```javascript\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n let l = 0,r = x,ans = 0;\n while(l <= r){\n let mid = l + ((r - l) >> 1);\n if(mid * mid <= x){\n ans = mid\n l = mid + 1;\n }else{\n r = mid - 1;\n }\n }\n return ans;\n};\n```\n### 复杂度分析\n- 时间复杂度为 `O(log x)`,因为采用了二分查找策略。\n- 空间复杂度为 `O(1)`,只使用了常数级别的额外空间。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208885502","body":"## 思路\n\n### 1. 二分查找策略\n- 使用 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31) 和 `r` 维护搜索区间 `[1, n]`\n- 通过 `mid = l + ((r - l) >> 1)` 计算中点,避免整数溢出\n- 根据 `isBadVersion(mid)` 的结果调整搜索区间\n\n### 2. 搜索逻辑\n- 如果 `isBadVersion(mid)` 返回 `true`(当前版本是错误的):\n - 记录当前版本为候选答案 `ans = mid`\n - 在左半区间继续搜索 `r = mid - 1`\n- 如果返回 `false`(当前版本是正确的):\n - 在右半区间继续搜索 `l = mid + 1`\n\n\n\n## 代码\n```javascript\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let l = 1,r = n,ans = 1;\n while(l <= r){\n let mid = l + ((r - l) >> 1);\n if(isBadVersion(mid)){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n };\n};\n```\n## 复杂度分析\n- 时间复杂度:O(log n)\n- 空间复杂度:O(1)\n- 通过不断缩小区间范围,最终找到第一个错误版本","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3213065724","body":"## 思路\n\n1. **归并排序框架**:使用分治思想,将数组不断二分,递归处理左右两部分\n2. **关键逻辑**:在合并两个有序数组时,统计满足 `nums[i] > 2 * nums[j]` 条件的翻转对数量\n\n## 代码结构分析\n\n### 主函数 `reversePairs`\n- 初始化变量和临时数组\n- 调用 `sort` 函数进行归并排序\n- 返回统计结果 `ans`\n\n### 排序函数 `sort`\n- 标准的归并排序递归结构\n- 将数组 `[l, r]` 分为 `[l, mid]` 和 `[mid+1, r]` 两部分\n- 递归排序后调用 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 合并\n\n### 合并函数 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37)\n包含两个主要步骤:\n\n1. **统计翻转对**:\n ```javascript\n if(nums[i] / 2 > nums[j]){\n ans += mid - i + 1;\n j++;\n }else i++;\n ```\n\n - 利用左右两部分已排序的特性\n - 当 `nums[i] > 2 * nums[j]` 时,说明从 `i` 到 `mid` 的所有元素都与 `nums[j]` 构成翻转对\n\n2. **标准归并**:\n - 将两个有序数组合并为一个有序数组\n - 使用 `temp` 数组作为临时存储\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n let n = nums.length,ans = 0;\n let temp = new Array(n);\n sort(0,n - 1);\n return ans;\n // -----------------------\n function sort(l,r){\n if(l >= r) return;\n let mid = (l + r) >> 1;\n sort(l,mid);\n sort(mid + 1,r);\n merge(l,r,mid);\n }\n\n function merge(left,right,mid){\n let i = left,j = mid + 1,p = left;\n while(i <= mid && j <= right){\n if(nums[i] / 2 > nums[j]){\n ans += mid - i + 1;\n j++;\n }else i++;\n }\n\n i = left;\n j = mid + 1;\n while(i <= mid || j <= right){\n if(j > right || i <= mid && nums[i] < nums[j]) temp[p++] = nums[i++];\n else temp[p++] = nums[j++];\n }\n\n for(let i = left;i <= right;i++) nums[i] = temp[i];\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n)\n- 空间复杂度:O(n)\n- 利用归并排序过程中数组局部有序的特性,高效统计翻转对\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216251902","body":"\n## 思路\n\n1. **排序处理**:\n - 首先对供暖器数组进行排序,这样便于后续的二分查找操作。\n\n2. **边界处理**:\n - 在供暖器数组的两端分别添加`-Infinity`和`Infinity`,这样可以简化边界条件的处理,避免在查找过程中需要特殊判断边界情况。\n\n3. **核心算法**:\n - 对每个房屋,通过[egt](file:///E:/力扣刷题/algorithm_exercises/91天学算法/day40/.md#L22-L33)函数找到第一个大于等于该房屋位置的供暖器位置\n - 然后比较该房屋与前一个供暖器和后一个供暖器的距离,取较小值作为该房屋所需的最小加热半径\n - 在所有房屋所需的最小加热半径中取最大值,就是能覆盖所有房屋的最小加热半径\n\n4. **二分查找优化**:\n - [egt](file:///E:/力扣刷题/algorithm_exercises/91天学算法/day40/.md#L22-L33)函数使用二分查找来快速定位第一个大于等于目标值的供暖器位置,时间复杂度从O(n)降低到O(log n)\n\n## 具体实现细节\n\n- `heaters[j] - house`表示房屋到右边最近供暖器的距离\n- `house - heaters[i]`表示房屋到左边最近供暖器的距离\n- `Math.min(heaters[j] - house, house - heaters[i])`得到该房屋需要的最小加热半径\n- `Math.max(ans, r)`维护所有房屋中需要的最大加热半径\n\n## 代码\n```javascript\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n const compare = (a,b) => a - b;\n heaters.sort(compare);\n heaters.push(Infinity);\n heaters.unshift(-Infinity);\n let ans = -Infinity;\n for(let house of houses){\n let j = egt(house),i = j - 1;\n r = Math.min(heaters[j] - house,house - heaters[i]);\n ans = Math.max(ans,r);\n }\n return ans;\n // -------------------------\n function egt(target){\n let l = 0,r = heaters.length - 1,ans = r + 1;\n while(l <= r){\n let mid = (l + r) >> 1\n if(heaters[mid] >= target){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(mlogn + nlogn),其中m是房屋数量。排序的时间复杂度为O(nlogn),二分查找的时间复杂度为O(logn),因此总时间复杂度为O(nlogn + mlogn)。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217776735","body":"## 思路\n\n使用了**二分搜索 + 双指针**的方法来解决问题:\n\n### 1. 排序\n```javascript\nnums.sort((a,b) => a - b);\n```\n\n首先对数组进行排序,这样可以方便后续计算距离和使用双指针技巧。\n\n### 2. 二分搜索框架\n```javascript\nlet n = nums.length;\nlet r = nums[n - 1] - nums[0], l = 0, ans = 0;\nwhile(l <= r){\n let mid = (l + r) >> 1;\n let cnt = calc(mid);\n if(cnt >= k){\n ans = mid;\n r = mid - 1;\n } else {\n l = mid + 1;\n }\n}\n```\n\n这里使用二分搜索来查找第k小的距离:\n- 搜索范围是 `[0, max_distance]`,其中 `max_distance = nums[n-1] - nums[0]`\n- 对于每个中间值 `mid`,计算有多少个数对的距离小于等于 `mid`\n- 如果数量大于等于 `k`,说明第k小的距离可能就是 `mid` 或者比 `mid` 更小\n- 如果数量小于 `k`,说明第k小的距离一定比 `mid` 更大\n\n### 3. 计算函数 calc\n```javascript\nfunction calc(mid){\n let l = 0, r = -1, ans = 0;\n while(l < n){\n while(r + 1 < n && nums[r + 1] - nums[l] <= mid) r++;\n if(r >= l) ans += r - l;\n l++;\n }\n return ans\n}\n```\n\n这个函数使用双指针技巧计算有多少个数对的距离小于等于给定值 [mid](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\462\\2.js#L20-L20):\n- 外层循环固定左指针 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\461\\3.js#L34-L34)\n- 内层循环移动右指针 `r`,直到 `nums[r] - nums[l] > mid`\n- 此时对于固定的 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\461\\3.js#L34-L34),有 `r - l` 个数对的距离小于等于 [mid](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\462\\2.js#L20-L20)\n- 累加所有可能的数对数量\n\n\n\n## 举例说明\n\n以 `nums = [1,3,1]`, `k = 1` 为例:\n1. 排序后:`[1,1,3]`\n2. 距离范围:`[0, 2]`\n3. 二分搜索过程:\n - `mid = 1`,计算距离 <= 1 的数对有 1 个(`(1,1)`)\n - 因为 1 >= k(1),所以 `ans = 1`,继续搜索左半部分\n - `mid = 0`,计算距离 <= 0 的数对有 1 个(`(1,1)`)\n - 因为 1 >= k(1),所以 `ans = 0`\n4. 返回结果 0\n\n这个解法非常巧妙地结合了二分搜索和双指针技巧,避免了直接计算所有数对距离的 O(n²) 复杂度。\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a,b) => a - b);\n let n = nums.length;\n let r = nums[n - 1] - nums[0],l = 0,ans = 0;\n while(l <= r){\n let mid = (l + r) >> 1;\n let cnt = calc(mid);\n if(cnt >= k){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n // ----------------------\n function calc(mid){\n let l = 0,r = -1,ans = 0;\n while(l < n){\n while(r + 1 < n && nums[r + 1] - nums[l] <= mid) r++;\n if(r >= l) ans += r - l;\n l++;\n }\n return ans\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n + n log D),其中 n 是数组长度,D 是最大距离\n - 排序需要 O(n log n)\n - 二分搜索需要 log D 次,每次调用 calc 函数需要 O(n)\n- 空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218701829","body":"## 思路\n\n1. **使用优先队列的BFS**:\n - 采用 `MinPriorityQueue` 实现 Dijkstra 算法变体\n - 每个元素存储 `[行, 列, 高度]`,按高度排序\n\n2. **状态表示**:\n - `vis` 数组标记已访问的格子,防止重复访问\n - `ans` 记录到达当前位置所需的最大高度(即所需最低水位)\n\n3. **搜索过程**:\n - 从起点 `(0,0)` 开始,每次选择高度最低的相邻格子\n - 更新所需最低水位为路径上遇到的最大高度\n - 直到到达终点 `(n-1,n-1)`\n\n## 关键步骤\n\n- **初始化**:标记起点已访问,将起点加入优先队列\n- **主循环**:不断取出队列中高度最低的位置\n- **更新答案**:记录路径上的最大高度值\n- **探索邻居**:向四个方向扩展未访问的邻居节点\n- **终止条件**:到达右下角时结束搜索\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n let n = grid.length,vis = new Array(n).fill(0).map(()=>new Array(n).fill(0));\n vis[0][0] = 1;\n const q = new MinPriorityQueue(v=>v[2]);\n q.enqueue([0,0,grid[0][0]]);\n let ans = 0;\n const direction = [[0,1],[1,0],[0,-1],[-1,0]];\n while(q.size()){\n let [i,j,t] = q.dequeue();\n ans = Math.max(ans,t);\n if(i === n - 1 && j === n - 1) break;\n for(let d of direction){\n let x = d[0] + i,y = d[1] + j;\n if(x >= 0 && x < n && y >= 0 && y < n){\n if(vis[x][y]) continue;\n vis[x][y] = 1;\n q.enqueue([x,y,grid[x][y]]);\n }\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n²logn),其中 n 是矩阵的边长。\n- 空间复杂度:O(n²),用于存储 vis 数组和优先队列。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222257413","body":"## 思路\n\n使用**滑动窗口**(Sliding Window)技术来解决这个问题,通过维护一个固定大小为 `k` 的窗口来遍历整个字符串。\n\n## 关键变量说明\n\n- `r`: 右指针,初始化为 -1\n- [n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6): 字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- `ans`: 记录找到的最大元音字母数\n- `total`: 当前窗口内元音字母的总数\n- [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6): 左指针,表示窗口的起始位置\n\n## 算法流程\n\n1. **外层循环**:[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 从 0 到 `n-k`,表示窗口的左边界\n ```javascript\n for(let i = 0; i <= n - k; i++)\n ```\n\n\n2. **扩展窗口**:使用 `while` 循环将右指针 `r` 向右扩展,直到窗口大小达到 `k`\n ```javascript\n while(r + 1 < n && r - i + 1 < k){\n r++;\n if(isYuanYin(s[r])) total++;\n }\n ```\n\n - 条件 `r + 1 < n` 确保不越界\n - 条件 `r - i + 1 < k` 确保窗口大小不超过 `k`\n - 每次扩展时检查新加入的字符是否为元音,并更新 `total`\n\n3. **更新最大值**:比较当前窗口的元音数量与历史最大值\n ```javascript\n ans = Math.max(ans, total);\n ```\n\n\n4. **收缩窗口**:移动左指针前,如果当前左边界字符是元音,则从总数中减去\n ```javascript\n if(isYuanYin(s[i])) total--;\n ```\n\n\n## 辅助函数\n\n```javascript\nfunction isYuanYin(c){\n return ['a','e','i','o','u'].includes(c);\n}\n```\n\n用于判断字符是否为元音字母。\n\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n let r = -1, n = s.length,ans = 0,total = 0;\n for(let i = 0;i <= n - k;i++){\n while(r + 1 < n && r - i + 1 < k){\n r++;\n if(isYuanYin(s[r])) total++;\n }\n ans = Math.max(ans,total);\n if(isYuanYin(s[i])) total--;\n }\n return ans;\n // -------------------------\n function isYuanYin(c){\n return ['a','e','i','o','u'].includes(c);\n }\n };\n```\n## 复杂度分析\n\n- 时间复杂度:O(n),其中 n 是字符串长度,每个字符最多被访问两次\n- 空间复杂度:O(1),只使用了常数额外空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3227100052","body":"## 思路\n\n### 核心技巧\n- 维护一个大小为maxPts的滑动窗口\n- 使用`sum`变量维护当前窗口内所有可能结果的概率和\n- 通过`sum -= r`和`sum += dp[i]`维护窗口滑动\n\n### 1. 边界条件处理\n```javascript\nif(0 >= k) return 0 <= n ? 1 : 0;\n```\n\n- 当目标分数`k`为0或负数时,游戏一开始就结束\n- 如果[n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6)非负,则概率为1,否则为0\n\n### 2. 初始化阶段\n```javascript\nlet sum = 0;\nfor(let i = k;i < k + maxPts;i++){\n if(i <= n) sum += 1;\n}\n```\n\n- 计算从刚好达到`k`分开始,可能到达的最高分数范围`[k, k+maxPts-1]`中满足≤n的数目\n- 这些状态的概率都是1(因为游戏结束)\n\n### 3. 动态规划倒推\n```javascript\nlet j = k + maxPts - 1, r = j <= n ? 1 : 0;\nlet dp = new Array(k).fill(0);\nfor(let i = k - 1;i >= 0;i--){\n dp[i] = sum / maxPts;\n sum -= r;\n sum += dp[i];\n j--;\n if(j >= k) r = j <= n ? 1 : 0;\n else r = dp[j];\n}\n```\n\n\n- 从`k-1`分开始倒推到0分\n- `dp[i]`表示从[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)分开始游戏获胜的概率\n- 状态转移方程:`dp[i] = (dp[i+1] + dp[i+2] + ... + dp[i+maxPts]) / maxPts`\n- 使用滑动窗口优化:维护`sum`为窗口内所有概率之和\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n if(0 >= k) return 0 <= n ? 1 : 0;\n \n let sum = 0;\n for(let i = k;i < k + maxPts;i++){\n if(i <= n) sum += 1;\n }\n let j = k + maxPts - 1, r = j <= n ? 1 : 0;\n let dp = new Array(k).fill(0);\n for(let i = k - 1;i >= 0;i--){\n dp[i] = sum / maxPts;\n sum -= r;\n sum += dp[i];\n j--;\n if(j >= k) r = j <= n ? 1 : 0;\n else r = dp[j];\n }\n return dp[0];\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(k + maxPts),其中k为`k`的取值范围\n- 空间复杂度:O(k)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3231026577","body":"## 思路\n\n1. **滑动窗口 + 字符频次统计**\n - 使用两个长度为26的数组(`pMap` 和 `sMap`)分别统计模式串 `p` 和当前窗口内子串的字符频次\n - 通过滑动窗口在 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 中寻找与 `p` 字符频次完全相同的子串\n\n2. **算法流程**\n - 首先调用 `getPmap()` 统计 `p` 中各字符出现次数\n - 初始化滑动窗口左右边界 `l=0, r=-1`\n - 在每次循环中:\n - 扩展右边界直到窗口大小等于 `p` 的长度\n - 比较当前窗口字符频次与 `p` 的字符频次是否相同\n - 如果相同,则将左边界位置加入结果数组\n - 移动左边界,更新窗口字符频次\n\n## 关键函数说明\n\n- `getPmap()`: 统计模式串 `p` 中每个字符的出现次数\n- `equal(arr1, arr2)`: 比较两个字符频次数组是否完全相同\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nvar findAnagrams = function(s, p) {\n const pMap = new Array(26).fill(0),k = p.length;\n getPmap();\n let ans = []\n let n = s.length,l = 0,r = -1,sMap = new Array(26).fill(0);\n while(l <= n - k){\n while(r + 1 < n && r - l + 1 < k){\n r++;\n let c = s[r]\n sMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;\n }\n if(equal(pMap,sMap)) ans.push(l);\n let c = s[l++];\n sMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]--;\n }\n return ans;\n // --------------------------------------------------------\n function getPmap(){\n for(let c of p){\n pMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;\n }\n }\n function equal(arr1,arr2){\n for(let i = 0;i < 26;i++){\n if(arr1[i] !== arr2[i]) return false;\n }\n return true;\n }\n };\n```\n## 复杂度分析\n\n- 时间复杂度:O(n),其中 n 是字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- 空间复杂度:O(1),只使用了固定大小的数组存储字符频次","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235816649","body":"## 思路\n\n### 核心思想\n- 使用**滑动窗口**技术\n- 维护一个动态窗口 `[l, r]`,通过双指针扩展和收缩窗口\n- 统计窗口内字符频次,确保包含 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中所有字符及其所需数量\n\n### 主要步骤\n\n1. **初始化阶段**\n - `tMap`:统计字符串 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中各字符出现次数\n - `LIMIT`:记录 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中不同字符的数量\n - `sMap`:统计当前窗口中各字符出现次数\n - `total`:记录窗口中已满足数量要求的字符种类数\n\n2. **滑动窗口主循环**\n - 外层循环移动左指针 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31)\n - 内层循环扩展右指针 `r`,直到窗口包含 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的所有字符\n - 当窗口满足条件时,尝试更新最优解\n\n3. **结果更新**\n - 使用 `check` 函数比较当前窗口与历史最优解\n - 选择更短的子串,长度相同时选择字典序更小的\n\n### check函数作用\n用于比较两个子串,选择更优的结果:\n- 优先选择长度更短的子串\n- 长度相同时选择字典序更小的\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nvar minWindow = function(s, t) {\n let tMap = {},ans = '';\n for(let c of t) tMap[c] = (tMap[c] || 0) + 1;\n const LIMIT = Object.keys(tMap).length;\n let n = s.length,l = 0,r = -1,total = 0,sMap = {};\n while(l < n){\n while(r + 1 < n && total < LIMIT){\n r++;\n let c = s[r];\n sMap[c] = (sMap[c] || 0) + 1;\n if(sMap[c] === tMap[c]) total++;\n }\n if(total === LIMIT){\n let tmp = s.slice(l,r + 1);\n if(check(tmp)) ans = tmp;\n }\n let c = s[l];\n if(sMap[c] === tMap[c]) total--;\n sMap[c]--;\n l++;\n }\n return ans;\n // ------------------------\n function check(tmp){\n if(ans === '') return true;\n if(tmp.length < ans.length) return true;\n if(tmp.length > ans.length) return false;\n for(let i = 0;i < tmp.length;i++){\n let a = tmp.charCodeAt(i),b = ans.charCodeAt(i);\n if(a < b) return true;\n if(a === b) continue;\n if(a > b) return false;\n }\n return false;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是字符串 [s](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的长度。\n- 空间复杂度:O(t),其中 t 是字符串 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的字符串种类。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/50#issuecomment-3238889944","body":"## 思路\n\n1. **前缀和与后缀和预处理**:\n - [preSum](file:///E:/力扣刷题/algorithm_exercises/周赛/458/2.js#L10-L10)数组存储从左端开始的前缀和\n - [sufSum](file:///E:/力扣刷题/algorithm_exercises/周赛/458/2.js#L15-L15)数组存储从右端开始的后缀和\n\n2. **核心思想**:\n - 我们需要从两端取k张卡牌,可以是左边取i张,右边取k-i张(i从0到k)\n - 通过预处理的前缀和与后缀和数组,可以快速计算任意数量卡牌的点数和\n\n3. **遍历所有可能的组合**:\n - 遍历i从0到k,表示从左边取i张卡牌\n - 对应从右边取k-i张卡牌\n - 计算总和并更新最大值\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} cardPoints\n * @param {number} k\n * @return {number}\n */\nvar maxScore = function(cardPoints, k) {\n let n = cardPoints.length;\n const preSum = new Array(n + 1).fill(0),sufSum = new Array(n + 1).fill(0);\n for(let i = 0;i < n;i++){\n preSum[i + 1] = preSum[i] + cardPoints[i];\n sufSum[i + 1] = sufSum[i] + cardPoints[n - i - 1];\n }\n let ans = -Infinity;\n for(let i = 0;i <= k;i++){\n ans = Math.max(ans,preSum[i] + sufSum[k - i]);\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(n+k),\n- 空间复杂度是O(n),其中n是数组长度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3239927488","body":"## 代路\n\n采用预计算和枚举的方法来解决问题:\n\n1. **预计算 *<60* 以内每个数字的二进制1的个数**:\n ```javascript\n const CNT = new Array(60).fill(0);\n for(let i = 0;i <= 59;i++){\n let n = i,t = 0;\n while(n){\n if(n & 1) t++;\n n >>= 1;\n }\n CNT[i] = t;\n }\n ```\n\n\n2. **枚举小时和分钟的分配**:\n ```javascript\n for(let i = 0;i <= 4;i++){\n let j = turnedOn - i;\n if(j > 6) continue;\n // ...\n }\n ```\n\n 这里将turnedOn个LED灯分为两部分:i个给小时部分,j个给分钟部分。由于小时最多由4个LED表示,分钟最多由6个LED表示,所以i最多为4,j最多为6。\n\n3. **获取符合条件的小时和分钟**:\n 通过`getHour(cnt)`和`getM(cnt)`函数获取二进制中恰好有cnt个1的小时数和分钟数。\n\n4. **组合时间**:\n 将符合条件的小时和分钟组合成时间字符串,格式为`H:MM`。\n\n## 代码优点\n\n1. **预计算优化**:提前计算所有0-59数字的二进制1的个数,避免重复计算\n2. **分离关注点**:将获取小时和分钟的逻辑分别封装在独立函数中\n3. **合理的边界处理**:考虑到小时(0-11)和分钟(0-59)的范围限制\n4. **正确的格式化**:分钟数始终显示为两位数\n\n\n## 代码\n```javascript\nconst CNT = new Array(60).fill(0);\nfor(let i = 0;i <= 59;i++){\n let n = i,t = 0;\n while(n){\n if(n & 1) t++;\n n >>= 1;\n }\n CNT[i] = t;\n}\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n let ans = []\n for(let i = 0;i <= 4;i++){\n let j = turnedOn - i;\n if(j > 6) continue;\n for(let h of getHour(i)){\n for(let m of getM(j)){\n ans.push(`${h}:${m}`)\n }\n }\n }\n return ans;\n\n // ------------------------------\n function getHour(cnt){\n let ans = [];\n for(let i = 0;i <= 11;i++){\n if(CNT[i] === cnt) ans.push(i);\n }\n return ans\n }\n\n function getM(cnt){\n let ans = [];\n for(let i = 0;i <= 59;i++){\n if(CNT[i] === cnt) ans.push(i < 10 ? '0' + i : i);\n }\n return ans\n }\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(1),因为小时和分钟的范围是固定的(12*60种组合)\n- **空间复杂度**:O(1),只使用了固定大小的额外空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240725656","body":"\n## 思路\n\n### 1. 位运算优化\n- 使用位运算来表示和检查约束条件:\n - `colSet`:记录已被占用的列\n - `pieSet`:记录已被占用的主对角线(撇)\n - `naSet`:记录已被占用的副对角线(捺)\n\n### 2. 对角线编号\n- 主对角线(撇):用 `i + j` 编号\n- 副对角线(捺):用 `i - j + N` 编号(确保非负)\n\n### 3. DFS 回溯过程\n- 逐行放置皇后(第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 行)\n- 对每行的每一列 `j` 检查是否可放置:\n - 通过位运算检查列、主对角线、副对角线是否冲突\n- 若无冲突则放置皇后并更新状态,递归处理下一行\n- 回溯时撤销状态更改\n\n### 4. 位操作技巧\n- `(x >> k) & 1`:检查第 k 位是否为 1\n- `x ^= (1 << k)`:翻转第 k 位(设置或取消占用)\n\n当成功放置完所有 n 行皇后时,返回 1(找到一种方案),最终统计所有可行方案数。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let colSet = 0,N = 2 * n - 1,pieSet = 0,naSet = 0;\n return dfs(0);\n // -------------------\n function dfs(i){\n if(i === n) return 1;\n let ans = 0;\n for(let j = 0;j < n;j++){\n let col = j,pie = i + j,na = (i - j + N) % N;\n if(((colSet >> col) & 1) || ((pieSet >> pie) & 1) ||((naSet >> na) & 1)) continue;\n colSet ^= (1 << col);\n pieSet ^= (1 << pie);\n naSet ^= (1 << na);\n ans += dfs(i + 1);\n colSet ^= (1 << col);\n pieSet ^= (1 << pie);\n naSet ^= (1 << na);\n }\n return ans;\n }\n};\n```\n## 复杂度分析\n- 时间复杂度:O(N!),其中 N 为输入的行数。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243912780","body":"## 思路\n\n1. **初始化**:\n - 获取网格的行数(m)和列数(n)\n - 创建访问标记数组vis,避免重复访问\n - 初始化最大面积ans为0\n\n2. **遍历网格**:\n - 遍历每个格子,如果当前格子是0(海洋)或已被访问,则跳过\n - 否则,从当前位置开始进行BFS搜索整个岛屿\n\n3. **BFS搜索**:\n - 使用队列实现广度优先搜索\n - 从起始点开始,向四个方向扩展\n - 对于每个有效的相邻陆地格子(值为1且未访问),标记为已访问并加入队列\n - 统计当前岛屿的面积\n\n4. **更新结果**:\n - 每次BFS完成后,比较当前岛屿面积和已知最大面积,保留较大值\n\n## 具体实现细节\n\n- 使用Queue数据结构实现BFS\n- 四个方向数组dirs用于简化方向处理\n- vis数组防止重复访问同一格子\n- 边界检查确保不越界\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n let m = grid.length,n = grid[0].length;\n let ans = 0;\n let vis = new Array(m).fill(0).map(()=>new Array(n).fill(0));\n for(let i = 0;i < m;i++){\n for(let j = 0;j = 0 && r < m && c >= 0 && c < n){\n if(grid[r][c] === 0) continue;\n if(vis[r][c]) continue;\n vis[r][c] = 1;\n q.enqueue([r,c]);\n }\n }\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(m×n)\n- 空间复杂度是O(m×n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247579876","body":"## 思路\n\n这是一个典型的多源BFS(广度优先搜索)问题。代码采用逆向思维,不是从海洋格子找最近的陆地,而是从所有陆地格子出发,向外扩展到海洋格子,计算每个海洋格子到最近陆地的距离。\n\n## 算法步骤\n\n1. 初始化一个与原网格同样大小的距离矩阵`dis`,所有值初始化为无穷大\n2. 遍历原网格,将所有陆地格子(值为1)的坐标和距离0加入队列,作为BFS的起点\n3. 使用BFS遍历:\n - 从队列中取出一个位置\n - 如果当前位置的距离小于记录的距离,则更新距离\n - 如果当前位置是海洋,则更新最大距离\n - 向四个方向扩展,将合法的海洋格子加入队列\n4. 返回找到的最大距离,如果不存在海洋或陆地则返回-1\n\n## 代码\n\n```javascript\nvar maxDistance = function(grid) {\n let n = grid.length;\n // 创建一个距离矩阵,初始化为无穷大\n let dis = new Array(n).fill(0).map(()=>new Array(n).fill(Infinity));\n let q = new Queue();\n \n // 将所有陆地格子(值为1)作为BFS的起始点\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(grid[i][j] === 0) continue;\n q.enqueue([i,j,0]); // [行, 列, 距离]\n }\n }\n\n // 四个方向的移动:右、下、左、上\n const dirs = [[0,1],[1,0],[0,-1],[-1,0]];\n let ans = -Infinity;\n \n // BFS遍历\n while(q.size()){\n let [i,j,d] = q.dequeue();\n \n // 如果当前距离大于等于已记录的距离,则跳过\n if(d >= dis[i][j]) continue;\n \n // 更新当前位置的距离\n dis[i][j] = d;\n \n // 如果当前位置是海洋(值为0),更新最大距离\n if(grid[i][j] === 0) ans = Math.max(ans,dis[i][j]);\n \n // 向四个方向扩展\n for(let [x,y] of dirs.map(v=>[v[0] + i,v[1] + j])){\n // 检查边界\n if(x < 0 || x >= n || y < 0 || y >= n) continue;\n // 如果是陆地则跳过\n if(grid[x][y] === 1) continue;\n // 如果新距离大于等于已记录距离则跳过\n if(d + 1 >= dis[x][y]) continue;\n // 将新位置加入队列\n q.enqueue([x,y,d + 1]);\n }\n }\n \n // 返回结果,如果没找到海洋格子则返回-1\n return ans === -Infinity ? -1 : ans === Infinity ? -1 : ans; \n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n²),每个格子最多被访问一次\n- 空间复杂度:O(n²),需要存储距离矩阵和队列\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251721463","body":"## 问题理解\n\n这个问题是一个图遍历问题,涉及以下概念:\n- 有n个盒子,每个盒子可能包含糖果、钥匙和内部盒子\n- 某些盒子是打开的(status[i] = 1),某些是关闭的(status[i] = 0)\n- 只有拿到钥匙才能打开关闭的盒子\n- 初始时有一些盒子(initialBoxes)\n- 目标是获得尽可能多的糖果\n\n## 思路\n\n### 1. 初始化阶段\n```javascript\nlet n = status.length, ans = 0,\nhas_key = new Array(n).fill(0),\nhas_box = new Array(n).fill(0);\n```\n\n- `n`: 盒子总数\n- `ans`: 最终获得的糖果总数\n- `has_key`: 标记是否拥有某个盒子的钥匙\n- `has_box`: 标记是否拥有某个盒子\n\n### 2. 设置初始状态\n```javascript\nfor(let i = 0; i < n; i++) if(status[i]) has_key[i] = 1;\nfor(let i of initialBoxes) has_box[i] = 1;\n```\n\n- 将所有本来就是打开状态的盒子(status[i] = 1)标记为拥有钥匙\n- 将初始拥有的盒子标记为已拥有\n\n### 3. DFS遍历获取糖果\n```javascript\nlet vis = new Array(n).fill(0);\nfor(let i of initialBoxes){\n if(has_box[i] && has_key[i] && !vis[i]) dfs(i);\n}\n```\n\n- `vis`: 标记盒子是否已经访问过\n- 对于每个初始盒子,如果既拥有盒子又有钥匙且未访问过,则进行DFS\n\n### 4. DFS函数实现\n```javascript\nfunction dfs(i){\n ans += candies[i]; // 收集当前盒子的糖果\n vis[i] = 1; // 标记为已访问\n for(let j of keys[i]){ // 遍历当前盒子中的钥匙\n has_key[j] = 1; // 获得钥匙\n if(has_box[j] && !vis[j]) dfs(j); // 如果拥有对应盒子且未访问,则继续DFS\n }\n for(let j of containedBoxes[i]){ // 遍历当前盒子中的内部盒子\n has_box[j] = 1; // 获得盒子\n if(has_key[j]&& !vis[j]) dfs(j); // 如果拥有对应钥匙且未访问,则继续DFS\n }\n}\n```\n\n\n## 算法流程总结\n\n1. **初始化状态**:记录每个盒子的初始状态(是否打开)和初始拥有的盒子\n2. **深度优先搜索**:从初始盒子开始,只有当同时拥有盒子和钥匙时才能打开盒子\n3. **收集资源**:打开盒子后获得糖果、钥匙和内部盒子\n4. **继续探索**:利用新获得的钥匙或盒子继续打开新的盒子\n5. **避免重复**:使用vis数组确保每个盒子只被访问一次\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n let n = status.length,ans = 0,\n has_key = new Array(n).fill(0),\n has_box = new Array(n).fill(0);\n for(let i = 0;i < n;i++) if(status[i]) has_key[i] = 1;\n for(let i of initialBoxes) has_box[i] = 1;\n let vis = new Array(n).fill(0);\n for(let i of initialBoxes){\n if(has_box[i] && has_key[i] && !vis[i]) dfs(i);\n }\n return ans;\n // ----------------------------------------\n function dfs(i){\n ans += candies[i];\n vis[i] = 1;\n for(let j of keys[i]){\n has_key[j] = 1;\n if(has_box[j] && !vis[j]) dfs(j);\n }\n for(let j of containedBoxes[i]){\n has_box[j] = 1;\n if(has_key[j]&& !vis[j]) dfs(j);\n }\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度为O(N + E),其中N是盒子数量,E是钥匙和内部盒子的总数。\n- 空间复杂度为O(N)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3257477257","body":"\n## 思路\n\n1. **坐标系统设定**:\n - 为每个节点分配坐标,根节点为原点(0, 0)\n - 向左子树移动时,列坐标减1;向右子树移动时,列坐标加1\n - 行坐标随着深度增加而增加(向下为正方向)\n\n2. **DFS遍历收集信息**:\n - 使用深度优先搜索遍历所有节点\n - 记录每个节点的值、行坐标、列坐标\n\n3. **自定义排序**:\n - 按列坐标升序排列(从左到右)\n - 列相同时按行坐标升序(从上到下)\n - 行列都相同时按节点值升序\n\n4. **分组输出**:\n - 将相同列坐标的节点值归为一组\n - 每组构成结果数组中的一个子数组\n\n## 代码:\n\n```javascript\nvar verticalTraversal = function(root) {\n let ans = [] // 存储[节点值, 行, 列]信息\n \n // DFS遍历,收集每个节点的值和坐标\n dfs(root,0,0);\n \n // 自定义排序:先按列,再按行,最后按值\n ans.sort((a,b)=>a[2] - b[2] || a[1] - b[1] || a[0] - b[0]);\n \n let col = Infinity, res = [];\n // 按列分组,将相同列的节点值组成子数组\n for(let [v,r,c] of ans){\n if(col === c) res[res.length - 1].push(v);\n else{\n res.push([v]);\n col = c;\n }\n }\n return res;\n \n // 辅助函数:深度优先遍历并记录坐标\n function dfs(root,row,col){\n if(!root) return;\n ans.push([root.val,row,col]);\n dfs(root.left,row + 1,col - 1) // 左子树:行+1,列-1\n dfs(root.right,row + 1,col + 1) // 右子树:行+1,列+1\n }\n};\n```\n## 复杂度分析\n### 时间复杂度:\n- DFS遍历:O(N),N为节点数\n- 排序:O(N log N)\n- 分组:O(N)\n- 总体:O(N log N)\n\n### 空间复杂度:\n- 存储信息:O(N)\n- 递归栈:O(H),H为树高度\n- 总体:O(N)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260240769","body":"\n\n## 思路\n\n使用了动态规划的思想,并进行了空间优化:\n\n## 具体分析\n\n1. **状态定义**:\n - `prevprev` 表示到达第 i-2 个位置的最小花费\n - `prev` 表示到达第 i-1 个位置的最小花费\n - `curr` 表示到达当前位置的最小花费\n\n2. **状态转移方程**:\n - `curr = v + Math.min(prevprev, prev)`\n - 其中 v 是当前位置的花费(顶部为0)\n\n3. **优化点**:\n - 使用滚动数组优化空间复杂度,从O(n)降到O(1)\n - 只保存前两个状态值,而不是整个dp数组\n\n4. **边界处理**:\n - 当 i < n 时,v = cost[i](正常台阶费用)\n - 当 i = n 时,v = 0(到达楼顶,没有费用)\n - 最后的返回值根据数组长度做了特殊处理\n\n\n这是一个经典的空间优化动态规划解法,通过只保留必要的状态值来减少空间使用。\n## 代码\n```javascript\nvar minCostClimbingStairs = function(cost) {\n let n = cost.length,\n prevprev = cost[0], // 表示到达第0个台阶的最小花费\n prev = cost[1], // 表示到达第1个台阶的最小花费\n curr;\n \n // 从第2个台阶开始遍历到楼梯顶部\n for(let i = 2;i <= n;i++){\n let v = 0;\n // 当i[1,1]);\n```\n\n\n1. 创建一个二维DP数组`dp`,其中`dp[i][0]`表示以`nums[i]`结尾的最长递增子序列的长度,`dp[i][1]`表示以`nums[i]`结尾的最长递增子序列的个数。\n2. 初始时,每个元素自身构成一个长度为1的递增子序列,所以都初始化为`[1,1]`。\n\n```javascript\n for(let i = 1; i < n; i++){\n for(j = i - 1; j >= 0; j--){\n if(nums[i] > nums[j]){\n if(dp[j][0] + 1 > dp[i][0]){\n dp[i][0] = dp[j][0] + 1;\n dp[i][1] = dp[j][1];\n }else if(dp[j][0] + 1 === dp[i][0]){\n dp[i][1] += dp[j][1];\n }\n }\n }\n }\n```\n\n\n3. 对于每个位置[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6),遍历它之前的所有位置`j`:\n - 如果`nums[i] > nums[j]`,说明可以将`nums[i]`接在以`nums[j]`结尾的递增子序列后面\n - 如果通过`j`得到的子序列长度(`dp[j][0] + 1`)比当前记录的长度(`dp[i][0]`)更长,则更新长度和数量\n - 如果长度相等,则将通过`j`得到的子序列数量加到当前的数量上\n\n```javascript\n let ans = 0, max = -Infinity;\n for(let [len,cnt] of dp){\n if(len > max){\n max = len;\n ans = cnt;\n }else if(max === len){\n ans += cnt;\n }\n }\n return ans;\n```\n\n\n4. 最后遍历整个DP数组,找出最长的递增子序列长度,并累加所有具有该长度的子序列的数量。\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findNumberOfLIS = function(nums) {\n let n = nums.length,dp = new Array(n).fill(0).map(()=>[1,1]);\n for(let i = 1;i < n;i++){\n for(j = i - 1;j >= 0;j--){\n if(nums[i] > nums[j]){\n if(dp[j][0] + 1 > dp[i][0]){\n dp[i][0] = dp[j][0] + 1;\n dp[i][1] = dp[j][1];\n }else if(dp[j][0] + 1 === dp[i][0]){\n dp[i][1] += dp[j][1];\n }\n }\n }\n }\n let ans = 0,max = -Infinity;\n for(let [len,cnt] of dp){\n if(len > max){\n max = len;\n ans = cnt;\n }else if(max === len){\n ans += cnt;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(n²),\n- 空间复杂度是O(n)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269148142","body":"\n## 思路\n\n### 1. 问题定义\n最长公共子序列是找出两个字符串中最长的共同子序列(不要求连续,但要保持相对顺序)。\n\n### 2. 动态规划状态定义\n```javascript\nlet m = text1.length, n = text2.length, dp = new Array(m).fill(0).map(() => new Array(n).fill(0));\n```\n\n创建一个二维数组 `dp[i][j]`,表示 `text1[0...i]` 和 `text2[0...j]` 的最长公共子序列长度。\n\n### 3. 初始化边界条件\n```javascript\nif(text1[0] === text2[0]) dp[0][0] = 1;\n\nfor(let i = 1;i < m;i++) {\n dp[i][0] = text1[i] === text2[0] ? 1 : dp[i - 1][0];\n}\nfor(let i = 1;i < n;i++) {\n dp[0][i] = text1[0] === text2[i] ? 1 : dp[0][i - 1];\n}\n```\n\n- 首先处理两个字符串的第一个字符,如果相同则 `dp[0][0] = 1`\n- 分别初始化第一列和第一行:\n - 如果当前字符匹配,则值为1\n - 否则继承前一个位置的值\n\n### 4. 状态转移方程\n```javascript\nfor(let i = 1;i < m;i++){\n for(let j = 1;j < n;j++){\n if(text1[i] === text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;\n else dp[i][j] = Math.max(\n dp[i - 1][j],\n dp[i][j - 1],\n dp[i - 1][j - 1]\n );\n }\n}\n```\n\n对于每个位置 `(i,j)`:\n- 如果 `text1[i] === text2[j]`,说明当前字符匹配,则 `dp[i][j] = dp[i-1][j-1] + 1`\n- 否则取三种情况的最大值:\n - `dp[i-1][j]`:text1[0...i-1] 与 text2[0...j] 的LCS长度\n - `dp[i][j-1]`:text1[0...i] 与 text2[0...j-1] 的LCS长度\n - `dp[i-1][j-1]`:text1[0...i-1] 与 text2[0...j-1] 的LCS长度\n\n### 5. 返回结果\n```javascript\nreturn dp[m - 1][n - 1];\n```\n\n返回 `dp[m-1][n-1]` 即为两个完整字符串的最长公共子序列长度。\n\n\n## 代码\n```javascript\n/**\n * @param {string} text1\n * @param {string} text2\n * @return {number}\n */\nvar longestCommonSubsequence = function(text1, text2) {\n let m = text1.length,n = text2.length,dp = new Array(m).fill(0).map(() => new Array(n).fill(0));\n if(text1[0] === text2[0]) dp[0][0] = 1;\n\n for(let i = 1;i < m;i++) {\n dp[i][0] = text1[i] === text2[0] ? 1 : dp[i - 1][0];\n }\n for(let i = 1;i < n;i++) {\n dp[0][i] = text1[0] === text2[i] ? 1 : dp[0][i - 1];\n }\n for(let i = 1;i < m;i++){\n for(let j = 1;j < n;j++){\n if(text1[i] === text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;\n else dp[i][j] = Math.max(\n dp[i - 1][j],\n dp[i][j - 1],\n dp[i - 1][j - 1]\n );\n }\n }\n return dp[m - 1][n - 1];\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(m×n),其中 m 和 n 分别是两个字符串的长度\n- 空间复杂度:O(m×n),用于存储 dp 数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273217746","body":"## 思路\n使用了组合数学的方法来解决不同路径问题:\n\n1. **问题转换**:\n - 机器人需要从左上角走到右下角,总共需要向右走 (n-1) 步,向下走 (m-1) 步\n - 总共需要走 (m-1)+(n-1) = m+n-2 步\n - 问题转化为:在这 m+n-2 步中,如何选择 m-1 步向下走(或 n-1 步向右走)\n\n2. **数学公式**:\n - 这是一个组合问题,答案是 C(m+n-2, m-1) 或 C(m+n-2, n-1)\n - 组合数公式:C(n,k) = n! / (k! * (n-k)!)\n - 为了避免计算阶乘导致的溢出,代码采用了逐步相乘的方式\n\n3. **实现细节**:\n - `k = m + n - 2` 表示总步数\n - `t = m - 1` 表示需要选择的步数(向下走的步数)\n - 通过循环计算组合数,每次将 `k/t` 的值乘到结果中,并递减 k 和 t\n - 最后使用 `Math.round()` 是为了处理浮点数计算可能产生的精度误差\n\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} m\n * @param {number} n\n * @return {number}\n */\nvar uniquePaths = function(m, n) {\n let k = m + n - 2;\n if(k === 0) return 1;\n let t = Math.min(m - 1,n - 1), ans = 1;\n while (t){\n ans *= k / t;\n k--;\n t--;\n }\n return Math.round(ans);\n};\n```\n\n## 复杂度分析\n- 时间复杂度为 O(min(m,n)),\n- 空间复杂度为 O(1)。\n相比动态规划方法,这种方法更加高效。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3277237117","body":"## 思路\n\n### 问题理解\n1. 骑士按照象棋规则移动(日字形,8个方向)\n2. 骑士从 (row, column) 位置开始\n3. 骑士进行 K 次随机移动\n4. 求骑士最终仍在棋盘上的概率\n\n### 解决方案\n使用记忆化递归(动态规划):\n\n1. **状态定义**:f(i, j, k) 表示骑士在位置 (i, j) 并且还能移动 k 步时,在棋盘上的概率\n\n2. **边界条件**:\n - 当 k = 0 时,如果位置在棋盘内则返回 1,否则返回 0\n - 当位置超出棋盘边界时,返回 0\n\n3. **状态转移**:\n - 对于骑士的 8 个可能移动方向,递归计算每个方向移动后的情况\n - 结果为所有可能移动结果的平均值(除以 8)\n\n4. **记忆化优化**:\n - 使用 memo 三维数组存储已经计算过的结果,避免重复计算\n\n## 代码\n\n```javascript\nvar knightProbability = function(n, k, row, column) {\n // 骑士的8个移动方向\n const dirs = [[1,2],[2,1],[1,-2],[2,-1],[-1,2],[-2,1],[-1,-2],[-2,-1]];\n \n // 记忆化数组,存储 (i,j,k) 状态下的结果\n const memo = new Array(n + 1).fill(0).map(()=>{\n return new Array(n + 1).fill(0).map(()=>{\n return new Array(k + 1).fill(-1);\n })\n })\n \n // 调用递归函数\n return f(row, column, k);\n \n function f(i, j, k) {\n // 基础情况:没有移动次数了\n if (k === 0) return i >= 0 && i < n && j >= 0 && j < n ? 1 : 0;\n \n // 超出边界\n if (i < 0 || i >= n || j < 0 || j >= n) return 0;\n \n // 已经计算过该状态\n if (memo[i][j][k] !== -1) return memo[i][j][k];\n \n let ans = 0;\n // 遍历8个方向\n for (let d of dirs) {\n let x = d[0] + i, y = d[1] + j;\n ans += f(x, y, k - 1);\n }\n \n // 每个方向的概率是 1/8,所以取平均值\n memo[i][j][k] = ans / 8;\n return ans / 8;\n } \n};\n```\n\n\n### 复杂度分析\n- 时间复杂度:O(N²×K),因为有 N×N 个位置和 K 步\n- 空间复杂度:O(N²×K),用于存储记忆化数组\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3283550644","body":"## 思路\n\n### 1. 初始判断\n```javascript\nif((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;\n```\n\n首先计算所有可选数字的总和,如果总和小于目标值,则无论如何都无法达到目标,返回false。\n\n### 2. 核心递归函数f\n```javascript\nfunction f(type,total,state){}\n```\n\n- `type`: 当前玩家类型(0表示我方,1表示对方)\n- `total`: 剩余需要达到的目标值\n- `state`: 用位掩码表示的已选择数字状态\n\n### 3. 记忆化搜索\n使用`memo`来存储已经计算过的状态结果,避免重复计算。通过`query`和[add](file://E:\\其他项目\\algorithm_exercises\\9.js#L13-L21)函数来操作这个多层Map结构。\n\n### 4. 状态转移\n对于每个未选择的数字:\n- 如果选择该数字可以直接获胜(`i + 1 >= total`),则当前玩家获胜\n- 否则,递归调用[f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)计算对手在新状态下的结果\n- 如果存在一种选择使得对手必败,则当前玩家必胜\n\n### 5. 博弈论思想\n这是一个典型的极小化极大算法应用:\n- 当前玩家希望找到至少一种选择使得对手必败(返回false)\n- 如果所有选择都导致对手必胜(都返回false),则当前玩家必败\n\n## 代码\n```javascript\n/**\n * @param {number} maxChoosableInteger\n * @param {number} desiredTotal\n * @return {boolean}\n */\nvar canIWin = function(maxChoosableInteger, desiredTotal) {\n let memo = new Map();\n if((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;\n return f(0,desiredTotal,0);\n // -------------------------------\n function f(type,total,state){\n let params = [state];\n if(query(params) !== -1) return query(params);\n let ans = false;\n for(let i = 0;i < maxChoosableInteger;i++){\n if(state & (1 << i)) continue;\n if(i + 1 >= total) {\n ans = true;\n break;\n }\n let a = f(type === 0 ? 1 : 0,total - i - 1, state | (1 << i));\n if(a === false) {\n ans = true;\n break;\n }\n }\n add(params,ans)\n return ans;\n }\n\n function query(params){\n let ans = memo;\n for(let param of params){\n if(ans.has(param) === false) return -1;\n ans = ans.get(param);\n }\n return ans;\n }\n\n function add(params,val){\n let m = memo,n = params.length, rest = params.slice(0,n - 1),last = params[n - 1];\n for(let param of rest){\n if(m.has(param) === false) m.set(param,new Map());\n m = m.get(param);\n }\n m.set(last,val);\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:$O(n*2^{n})$\n- 空间复杂度:$O(n)$","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3287375518","body":"## 思路\n\n\n1. **预处理**:\n - 计算数组总和,如果为奇数则直接返回false\n - 确定目标值target为总和的一半\n\n2. **初始化DP数组**:\n - dp[j]表示是否可以用数组中的元素组成和为j的子集\n - 初始时只考虑第一个元素nums[0],只有当j等于nums[0]时才为true\n\n3. **状态转移**:\n - 对于每个元素nums[i],更新dp数组\n - 从target到0逆序遍历,避免重复使用同一元素\n - 状态转移方程:`dp[j] = dp[j] || dp[j - nums[i]]`\n - 要么不使用当前元素,保持原来的状态dp[j]\n - 要么使用当前元素,前提是dp[j - nums[i]]为true\n\n4. **返回结果**:\n - 如果dp[target]为true,表示可以组成和为target的子集,返回true\n - 否则返回false\n\n\n## 代码\n```javascript\nvar canPartition = function(nums) {\n // 获取数组长度和总和\n let n = nums.length,sum = nums.reduce((a,b)=>a + b,0);\n \n // 如果总和是奇数,则无法分成两个相等的子集\n if(sum & 1) return false;\n \n // 目标是找到和为总和一半的子集\n const target = sum / 2;\n \n // 创建dp数组,dp[j]表示是否可以用前面的数字组成和为j的子集\n const dp = new Array(target + 1).fill(false);\n \n // 初始化:第一个数字能否组成和为j的子集\n for(let j = 0;j <= target;j++) dp[j] = nums[0] === j;\n \n // 从第二个数字开始遍历\n for(let i = 1;i < n;i++){\n // 从target到0逆序遍历(避免重复使用同一元素)\n for(let j = target;j >= 0;j--){\n // 状态转移方程:\n // dp[j] = dp[j] || dp[j - nums[i]]\n // 要么之前就能组成j,要么使用当前数字nums[i]组成j\n dp[j] = dp[j] || (j - nums[i] >= 0 ? dp[j - nums[i]] : false);\n }\n }\n \n // 返回是否能组成和为target的子集\n return dp[target];\n};\n```\n\n## 时间和空间复杂度\n\n- 时间复杂度:O(n × target),其中n是数组长度,target是数组元素和的一半\n- 空间复杂度:O(target),只使用了一维dp数组\n\n这是一个经典的0-1背包问题的应用,通过动态规划解决了分割等和子集问题。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289197873","body":"\n## 思路\n\n\n1. **递归函数 [f(i, total)](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\2.js#L16-L29)**:\n - [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 表示当前处理到数组中的第 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素\n - [total](file://E:\\力扣刷题\\algorithm_exercises\\双周赛\\165\\3.js#L5-L5) 表示前 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素通过添加 '+' 或 '-' 符号后得到的总和\n - 函数返回从第 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素开始到最后一个元素,能够得到目标值的方案数\n\n2. **边界条件**:\n - 当 `i === n` 时,表示已经处理完所有元素,如果 `total === target` 则找到一种有效方案,返回 1,否则返回 0\n\n3. **状态转移**:\n - 对于当前元素 `nums[i]`,可以选择加上它或减去它\n - 所以递归调用 `f(i+1, total-nums[i]) + f(i+1, total+nums[i])`\n\n4. **记忆化优化**:\n - 使用 [memo](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\430\\2.js#L7-L7) 数组存储已经计算过的状态,避免重复计算\n - `memo[i][total + abs_sum]` 中使用 `total + abs_sum` 是为了避免负数索引\n\n## 代码亮点\n\n1. 计算 `abs_sum` 来确定可能的和的范围,这样可以正确地映射负数到数组索引\n2. 使用记忆化递归避免重复计算,提高效率\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar findTargetSumWays = function(nums, target) {\n let n = nums.length;\n let abs_sum = nums.reduce((prev,curr)=>{\n if(curr >= 0) return curr + prev;\n return prev - curr;\n },0)\n // console.log(abs_sum);\n let memo = new Array(n + 1).fill(0).map(()=>new Array(2 * abs_sum + 1).fill(-1));\n return f(0,0);\n // ---------------------------\n function f(i,total){\n if(i === n) return target === total ? 1 : 0;\n let t = memo[i][total + abs_sum];\n // console.log(i,target,target + abs_sum,t);\n if(t !== -1) return t;\n let ans = f(i + 1,total - nums[i]) + f(i + 1,total + nums[i]);\n memo[i][total + abs_sum] = ans; \n return ans;\n }\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n × S),其中 n 是数组长度,S 是数组元素绝对值之和\n- **空间复杂度**:O(n × S),主要由 memo 数组占用","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290259438","body":"## 思路\n\n这是一个典型的完全背包问题:\n1. **状态定义**:`dp[i][j]` 表示使用前 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 种硬币凑成金额 `j` 所需的最少硬币数\n2. **状态转移**:对于第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 种硬币,我们有两种选择:\n - 不使用该硬币:`dp[i-1][j]`\n - 使用该硬币:`1 + dp[i][j-coins[i-1]]`(因为硬币可以重复使用,所以是`dp[i]`而不是`dp[i-1]`)\n3. **边界条件**:`dp[0][0] = 0`,表示不使用任何硬币凑成金额0需要0个硬币\n## 代码\n\n```javascript\nvar coinChange = function(coins, amount) {\n let n = coins.length;\n // 创建二维DP数组,dp[i][j]表示使用前i种硬币凑成金额j的最少硬币数\n let dp = new Array(n + 1).fill(0).map(()=>new Array(amount + 1).fill(Infinity));\n // 初始状态:使用0种硬币凑成金额0需要0个硬币\n dp[0][0] = 0;\n \n // 遍历每种硬币\n for(let i = 1; i <= n; i++){\n // 遍历所有可能的金额\n for(let j = 0; j <= amount; j++){\n // 状态转移方程:\n // 1. 不使用第i种硬币:dp[i - 1][j]\n // 2. 使用第i种硬币:1 + dp[i][j - coins[i - 1]] (前提是j - coins[i - 1] >= 0)\n dp[i][j] = Math.min(\n dp[i - 1][j],\n j - coins[i - 1] >= 0 ? 1 + dp[i][j - coins[i - 1]] : Infinity\n );\n }\n }\n \n // 返回结果,如果为无穷大说明无法凑成,返回-1\n return dp[n][amount] === Infinity ? -1 : dp[n][amount]\n};\n```\n\n## 时间和空间复杂度\n- 时间复杂度:O(n × amount),其中 n 是硬币种类数\n- 空间复杂度:O(n × amount)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3295404263","body":"## 思路\n\n### 状态定义\n\n- `dp[i][j]` 表示使用前 i 种硬币凑成金额 j 的组合数\n\n### 初始化\n\n- `dp[0][0] = 1`:使用 0 种硬币凑成金额 0 的方法数为 1(即什么都不选)\n\n### 状态转移方程\n\n对于第 i 种硬币(面值为 c):\n\n- `dp[i][j] = dp[i-1][j] + (j-c >= 0 ? dp[i][j-c] : 0)`\n- 其中:\n - `dp[i-1][j]`:不使用第 i 种硬币,仅使用前 i-1 种硬币凑成金额 j 的组合数\n - `dp[i][j-c]`:使用第 i 种硬币,即在凑成金额 j-c 的基础上再加一个第 i 种硬币\n\n### 关键点\n\n1. 这是一个\"完全背包\"问题:每种硬币可以使用无限次\n2. 使用的是二维DP,其中行代表硬币种类,列代表金额\n3. 转移方程中 `dp[i][j-c]`(而非 `dp[i-1][j-c]`)体现了每种硬币可重复使用的特性\n\n## 代码\n\n```javascript\n/**\n * @param {number} amount\n * @param {number[]} coins\n * @return {number}\n */\nvar change = function (amount, coins) {\n let n = coins.length, dp = new Array(n + 1).fill(0).map(() => new Array(amount + 1).fill(0));\n dp[0][0] = 1;\n for (let i = 1; i <= n; i++) {\n let c = coins[i - 1]\n for (let j = 0; j <= amount; j++) dp[i][j] = dp[i - 1][j] + (j - c >= 0 ? dp[i][j - c] : 0);\n }\n return dp[n][amount];\n };\n```\n### 时间和空间复杂度\n\n- 时间复杂度:O(n × amount),其中 n 是硬币种类数\n- 空间复杂度:O(n × amount)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3300884457","body":"## 思路\n\n1. **排序策略**:将孩子贪心值数组`g`和饼干尺寸数组[s](file://E:\\其他项目\\algorithm_exercises\\1.js)都按降序排列\n2. **贪心策略**:用最大的饼干去满足贪心值最大的孩子(即最难以满足的孩子)\n3. **双指针遍历**:使用两个指针分别遍历孩子和饼干数组\n4. **匹配逻辑**:如果当前饼干能满足当前孩子,则两个指针都前进;否则只移动孩子指针(尝试用同一块饼干满足贪心值更低的孩子)\n\n这种从最大到最小的分配方式体现了贪心思想:优先满足需求大的孩子,这样能保证整体效果最优。\n\n## 代码\n```javascript\n/**\n * @param {number[]} g\n * @param {number[]} s\n * @return {number}\n */\nvar findContentChildren = function(g, s) {\n const compare = (a,b)=>b - a;\n g.sort(compare);\n s.sort(compare);\n let i = 0,j = 0,m = g.length,n = s.length;\n let ans = 0;\n while(i < m && j < n){\n if(s[j] >= g[i]){\n ans++;\n j++;\n i++;\n }else i++;\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度为O(m log m + n log n),主要消耗在排序上,\n- 空间复杂度为O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3305173933","body":"\n## 思路\n\n贪心策略是:**尽可能选择结束时间早的区间,这样能为后续区间留出更多空间**。\n\n\n1. **按结束时间排序**:\n ```javascript\n intervals.sort((a,b)=>a[1] - b[1]);\n ```\n\n 将所有区间按照结束时间升序排列,优先考虑结束早的区间。\n\n2. **贪心选择**:\n ```javascript\n let lastEnd = -Infinity;\n for(let [s,e] of intervals){\n if(s >= lastEnd) {\n ans++;\n lastEnd = e;\n }\n }\n ```\n\n 遍历排序后的区间,如果当前区间的开始时间不早于上一个选中区间的结束时间,就选择这个区间。这确保了选中的区间互不重叠。\n\n3. **计算结果**:\n ```javascript\n return n - ans;\n ```\n\n 返回总区间数减去可以保留的区间数,即需要移除的区间数。\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} intervals\n * @return {number}\n */\nvar eraseOverlapIntervals = function(intervals) {\n intervals.sort((a,b)=>a[1] - b[1]);\n let ans = 0,n = intervals.length;\n let lastEnd = -Infinity;\n for(let [s,e] of intervals){\n if(s >= lastEnd) {\n ans++;\n lastEnd = e;\n }\n }\n return n - ans;\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n),主要消耗在排序上\n- 空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3312499521","body":"## 思路-:动态规划\n\n1. **问题目标**:判断是否能从数组的第一个位置跳到最后一个位置\n2. **解法**:使用动态规划从后往前推导\n3. **状态定义**:`dp[i]` 表示从位置 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 是否能到达最后一个位置\n4. **状态转移**:\n - 从倒数第二个位置开始往前推导\n - 对于每个位置 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22),检查能否通过跳跃到达后续的某个可达位置\n - 如果能跳到某个 `dp[j]` 为 `true` 的位置,则 `dp[i]` 也为 `true`\n\n```javascript\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canJump = function(nums) {\n let n = nums.length, dp = new Array(n).fill(false);\n dp[n - 1] = true;\n \n // 从倒数第二个位置开始向前遍历\n for(let i = n - 2; i >= 0; i--){\n let steps = nums[i];\n \n // 检查从当前位置 i 能否跳到某个可达的位置\n for(let delta = 1; delta <= steps && i + delta < n; delta++){\n let j = i + delta;\n if(dp[j]) {\n dp[i] = true;\n break;\n }\n }\n }\n \n return dp[0];\n};\n```\n\n\n## 思路总结\n\n1. **初始化**:创建一个布尔数组 [dp](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\467\\3.js#L22-L22),长度与输入数组相同,所有元素初始化为 `false`\n2. **边界条件**:最后一个位置默认为 `true`(已经在最后一个位置了)\n3. **状态转移**:从倒数第二个位置开始,对每个位置检查:\n - 根据当前位置的值,确定可以跳跃的步数范围\n - 在这个范围内,检查是否存在某个可达的位置(`dp[j]` 为 `true`)\n - 如果存在,则当前位置也是可达的\n4. **结果**:返回 `dp[0]`,即从起始位置是否可达\n\n## 复杂度分析\n这是一种典型的动态规划解法,\n- 时间复杂度为 O(n²),\n- 空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/71#issuecomment-3314420253","body":"## 思路:\n\n1. **状态定义**:`dp[i]` 表示由 i 个不同节点能构成的不同二叉搜索树的数量\n\n2. **状态转移方程**:\n - 对于 i 个节点,我们可以让其中任意一个节点 j (1 ≤ j ≤ i) 作为根节点\n - 当节点 j 作为根时:\n - 左子树包含比 j 小的 j-1 个节点,能构成 `dp[j-1]` 种不同的二叉搜索树\n - 右子树包含比 j 大的 i-j 个节点,能构成 `dp[i-j]` 种不同的二叉搜索树\n - 根据乘法原理,以 j 为根的二叉搜索树总数为 `dp[j-1] * dp[i-j]`\n - 遍历所有可能的根节点,将结果累加得到 `dp[i]`\n\n3. **边界条件**:\n - `dp[0] = 1`:空树也算一种情况\n - `dp[1] = 1`:只有一个节点时,只能构成一种二叉搜索树\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar numTrees = function(n) {\n // 创建dp数组,dp[i]表示由i个不同节点能构成的不同二叉搜索树的数量\n let dp = new Array(n + 1).fill(0);\n \n // 边界条件:0个节点可以构成1棵空树,1个节点只能构成1种二叉搜索树\n dp[0] = 1;\n dp[1] = 1;\n \n // 计算2到n个节点能构成的不同二叉搜索树数量\n for(let i = 2; i <= n; i++){\n // 对于i个节点,尝试让每个节点作为根节点\n for(let j = 1; j <= i; j++){\n // 当第j个节点作为根时:\n // 左子树有j-1个节点,可以构成dp[j-1]种不同的二叉搜索树\n // 右子树有i-j个节点,可以构成dp[i-j]种不同的二叉搜索树\n // 根据乘法原理,以j为根的二叉搜索树数量为dp[j-1] * dp[i-j]\n dp[i] += dp[j - 1] * dp[i - j]\n }\n }\n \n // 返回n个节点能构成的不同二叉搜索树数量\n return dp[n]\n};\n```\n\n\n\n\n\n## 复杂度分析\n- 时间复杂度为 O(n²),\n- 空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3315877464","body":"\n## 思路\n\n使用了**最小优先队列**来解决合并K个有序链表的问题,这是一种非常高效的解决方案。\n\n### 核心思想\n\n1. **使用最小优先队列维护所有链表的头部节点**:\n - 将K个链表的头节点都放入最小优先队列中\n - 优先队列会根据节点值进行排序,确保队首始终是最小值节点\n\n2. **逐步构建结果链表**:\n - 每次从优先队列中取出值最小的节点\n - 将该节点连接到结果链表末尾\n - 如果该节点还有后续节点,则将后续节点加入优先队列\n\n3. **重复过程直到优先队列为空**:\n - 当优先队列为空时,说明所有节点都已处理完毕\n\n### 代码详解\n\n```javascript\nvar mergeKLists = function(lists) {\n // 创建虚拟头节点,便于操作\n let dummy = new ListNode(), dh = dummy;\n \n // 创建最小优先队列,比较函数是基于节点值\n let q = new MinPriorityQueue(v => v.val);\n \n // 将所有非空链表的头节点加入优先队列\n for(let i = 0; i < lists.length; i++) \n if(lists[i]) q.enqueue(lists[i]);\n \n // 当优先队列不为空时继续处理\n while(q.size()){\n // 取出值最小的节点\n let n = q.dequeue();\n \n // 将该节点连接到结果链表\n dh.next = n;\n dh = dh.next;\n \n // 如果该节点有后续节点,将其加入优先队列\n if(n.next) q.enqueue(n.next);\n }\n \n // 返回合并后的链表\n return dummy.next;\n};\n```\n\n\n## 复杂度分析\n\n1. **时间复杂度优化**:\n - 时间复杂度为 O(N log K),其中 N 是所有节点总数,K 是链表数量\n\n2. **空间复杂度**:\n - 空间复杂度为 O(K),只需要存储K个链表的头部节点\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/73#issuecomment-3322038797","body":"## 思路:\n\n1. **分治思想**:\n - 将问题分解为两个子问题:分别处理奇数和偶数\n - `oushu = n >> 1` 计算偶数的个数(相当于 n/2 的整数部分)\n - `jishu = n - oushu` 计算奇数的个数\n\n2. **递归处理**:\n - `l1 = beautifulArray(jishu)` 递归生成奇数个数对应的漂亮数组\n - `l2 = beautifulArray(oushu)` 递归生成偶数个数对应的漂亮数组\n\n3. **映射构造**:\n - 对于奇数部分:`for(let i of l1) ans.push(2 * i - 1)` 将每个元素映射为奇数\n - 对于偶数部分:`for(let i of l2) ans.push(2 * i)` 将每个元素映射为偶数\n\n4. **核心思想**:\n - 通过将数组分为奇数和偶数两部分,确保不会在奇数和偶数之间形成等差数列\n - 因为如果一个数是奇数,另一个是偶数,那么它们的平均数不可能是整数,也就不可能在数组中找到第三个数构成等差数列\n\n## 关键点:\n\n- 基础情况:当 n=1 时,直接返回 [1]\n- 使用位运算 `>>` 实现整数除法,提高效率\n- 通过分别处理奇数和偶数部分,巧妙地避免了等差数列的形成\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number[]}\n */\nvar beautifulArray = function(n) {\n if(n === 1) return [1];\n let oushu = n >> 1,jishu = n - oushu;\n let l1 = beautifulArray(jishu),l2 = beautifulArray(oushu);\n let ans = [];\n for(let i of l1) ans.push(2 * i - 1);\n for(let i of l2) ans.push(2 * i);\n return ans\n};\n```\n\n## 复杂度分析\n- 时间复杂度为 O(n log n)。\n- 空间复杂度为 O(n log n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322078023","body":"## 思路:\n\n1. **异或运算的性质**:\n - 相同数字异或结果为0:`a ^ a = 0`\n - 任何数字与0异或等于自身:`a ^ 0 = a`\n - 异或运算满足交换律和结合律\n\n2. **第一步:计算所有数字的异或结果**:\n ```javascript\n let xor = 0;\n nums.forEach(n=>xor = xor ^ n);\n ```\n\n 这一步得到的是两个只出现一次的数字的异或结果,因为出现两次的数字都会相互抵消。\n\n3. **第二步:找到区分两个目标数字的位**:\n ```javascript\n let type = xor & (-xor);\n ```\n\n 这一步很关键,通过 `xor & (-xor)` 找到 `xor` 中最右边的1位。这个位必定在两个目标数字中一个为1,一个为0,因为只有这样它们的异或结果才会是1。\n\n4. **第三步:根据该位将数组分为两组**:\n ```javascript\n let a = 0, b = 0;\n for(let num of nums){\n if(type & num) a = a ^ num; // 该位为1的数字分为一组\n else b ^= num; // 该位为0的数字分为一组\n }\n ```\n\n 通过这种方式,将两个目标数字分到不同的组中,而相同的数字由于该位相同会被分到同一组,在组内异或后会被抵消,最终每组只剩下各自的目标数字。\n\n## 复杂度分析\n\n- 时间复杂度是 O(n),\n- 空间复杂度是 O(1),非常高效。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar singleNumber = function(nums) {\n let xor = 0;\n nums.forEach(n=>xor = xor ^ n);\n let type = xor & (-xor);\n let a = 0,b = 0;\n for(let num of nums){\n if(type & num) a = a ^ num;\n else b ^= num;\n }\n return [a,b];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3326222352","body":"## 思路\n\n1. `let n = 1 << (nums.length)`:通过左移运算计算出子集的总数。对于长度为n的数组,其子集总数为2^n。这里使用位运算`1 << nums.length`等价于2的nums.length次方。\n\n2. 外层循环`for(let i = 0;i < n;i++)`:遍历从0到2^n-1的每个数字,每个数字代表一个子集。\n\n3. 对于每个数字i(用变量j来操作):\n - 使用`j & 1`检查j的最低位是否为1\n - 如果是1,则将nums[k]加入当前子集temp中\n - 然后将j右移一位(`j >>= 1`),检查下一位\n - 同时k递增,指向nums中的下一个元素\n\n4. 内层while循环结束后,将生成的子集temp添加到结果数组ans中。\n\n## 复杂度分析\n使用位运算生成所有子集的方法,\n- 时间复杂度为O(n*2^n),\n- 空间复杂度为O(n*2^n)。\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[][]}\n */\nvar subsets = function(nums) {\n let n = 1 << (nums.length),ans = [];\n for(let i = 0;i < n;i++){\n let temp = [],j = i,k = 0;\n while(j){\n if(j & 1) temp.push(nums[k]);\n j >>= 1;\n k++;\n }\n ans.push(temp);\n }\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3331626491","body":"## 思路\n\n1. **TrieNode(Trie节点)**\n - `isEnd`:标记该节点是否为某个单词的结尾\n - `children`:大小为26的数组,存储指向子节点的指针(对应26个小写字母)\n\n2. **辅助函数**\n - `getCharIndex(c)`:将字符转换为其在字母表中的索引(0-25)\n\n### 1. 初始化(`Trie`构造函数)\n- 创建一个根节点 `root`,作为整个Trie树的起点\n\n### 2. 插入单词(`insert`方法)\n- 从根节点开始,逐字符遍历要插入的单词\n- 对于每个字符:\n - 计算其在字母表中的索引\n - 如果对应子节点不存在,则创建新节点\n - 移动到该子节点\n- 遍历完所有字符后,将最后一个节点标记为单词结尾(`isEnd = true`)\n\n### 3. 搜索单词(`search`方法)\n- 从根节点开始,逐字符遍历要搜索的单词\n- 对于每个字符:\n - 计算索引并检查对应子节点是否存在\n - 如果不存在,返回 `false`\n - 如果存在,移动到该子节点\n- 遍历完所有字符后,检查最后一个节点是否为单词结尾(`isEnd`为`true`)\n\n### 4. 前缀匹配(`startsWith`方法)\n- 与`search`类似,但不检查最后一个节点是否为单词结尾\n- 只要能完整遍历前缀中的所有字符,就返回`true`\n\n## 时间复杂度\n- 插入和搜索操作的时间复杂度均为O(m),其中m为单词或前缀的长度\n\n## 空间复杂度\n- O(ALPHABET_SIZE × N × M),其中N为插入的单词数,M为平均单词长度\n\n## 代码\n```javascript\nfunction TrieNode(){\n this.isEnd = false;\n this.children = new Array(26);\n}\n\nfunction getCharIndex(c){\n return c.charCodeAt(0) - 'a'.charCodeAt(0);\n}\n\nvar Trie = function() {\n this.root = new TrieNode();\n};\n\n/** \n * @param {string} word\n * @return {void}\n */\nTrie.prototype.insert = function(word) {\n let root = this.root;\n for(let c of word){\n let i = getCharIndex(c);\n if(!root.children[i]) root.children[i] = new TrieNode();\n root = root.children[i];\n }\n root.isEnd = true;\n};\n\n/** \n * @param {string} word\n * @return {boolean}\n */\nTrie.prototype.search = function(word) {\n let root = this.root;\n for(let c of word){\n let i = getCharIndex(c);\n if(!root.children[i]) return false;\n root = root.children[i];\n }\n return root.isEnd;\n};\n\n/** \n * @param {string} prefix\n * @return {boolean}\n */\nTrie.prototype.startsWith = function(prefix) {\n let root = this.root;\n for(let c of prefix){\n let i = getCharIndex(c);\n if(!root.children[i]) return false;\n root = root.children[i];\n }\n return !!root\n};\n\n/** \n * Your Trie object will be instantiated and called as such:\n * var obj = new Trie()\n * obj.insert(word)\n * var param_2 = obj.search(word)\n * var param_3 = obj.startsWith(prefix)\n */\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3336492052","body":"## 思路\n\n### 1. TrieNode 结构\n- `TrieNode` 是一个前缀树节点结构。\n- 每个节点包含:\n - `value`: 当前节点对应的值总和。\n - [end](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14): 标记该节点是否为某个单词的结尾。\n - `children`: 长度为26的数组,存储子节点(对应字母a-z)。\n\n### 2. MapSum 类\n- 使用前缀树(Trie)和哈希表(Map)实现键值映射与前缀求和功能。\n- `root`: Trie树的根节点。\n- [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5): 存储已插入的键值对。\n\n## 核心方法\n\n### insert(key, val)\n- 插入或更新键值对:\n - 如果键已存在,更新所有相关节点的值(先减去旧值,再加上新值)。\n - 如果是新键,则在Trie中创建路径,并在路径上的每个节点累加值。\n - 最后更新哈希表中的键值对。\n\n### sum(prefix)\n- 查询指定前缀的所有键值总和:\n - 遍历前缀,在Trie中查找对应的节点。\n - 若找不到完整前缀则返回0。\n - 返回前缀末尾节点的 `value` 值(即以该前缀开头的所有键的值总和)。\n\n## 工具函数\n\n### getCharIndex(char)\n- 将字符转换为其在字母表中的索引(0-25)。\n\n\n\n\n## 代码\n```javascript\nfunction TrieNode(){\n this.value = 0;\n this.end = false;\n this.children = new Array(26);\n}\n\nfunction getCharIndex(a){return a.charCodeAt(0) - 'a'.charCodeAt(0)}\nvar MapSum = function() {\n this.root = new TrieNode();\n this.map = new Map();\n};\n\n/** \n * @param {string} key \n * @param {number} val\n * @return {void}\n */\nMapSum.prototype.insert = function(key, val) {\n if(this.map.has(key)){\n let root = this.root;\n for(let c of key){\n let i = getCharIndex(c);\n root.children[i].value -= this.map.get(key);\n root.children[i].value += val;\n root = root.children[i];\n }\n }else{\n let root = this.root;\n for(let c of key){\n let i = getCharIndex(c);\n if(!root.children[i]) root.children[i] = new TrieNode();\n root = root.children[i];\n root.value += val;\n }\n root.end = true;\n }\n this.map.set(key,val);\n};\n\n/** \n * @param {string} prefix\n * @return {number}\n */\nMapSum.prototype.sum = function(prefix) {\n let root = this.root;\n let ans = 0\n for(let c of prefix){\n let i = getCharIndex(c);\n if(!root.children[i]) return 0;\n root = root.children[i];\n }\n return root.value;\n};\n\n/** \n * Your MapSum object will be instantiated and called as such:\n * var obj = new MapSum()\n * obj.insert(key,val)\n * var param_2 = obj.sum(prefix)\n */\n```\n\n\n## 复杂度分析\n- 时间复杂度:O(n),n位单词的长度。\n- 空间复杂度:O(m * n),m为单词个数,n为单词长度。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/78#issuecomment-3340984021","body":"## 算法思路\n\n1. **构建 Trie 树**:\n - 将 `smalls` 数组中的所有字符串插入到 Trie 树中\n - 每个节点记录是否为单词结尾([end](file://E:\\力扣刷题\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14) 标志)以及对应的索引位置([i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22))\n\n2. **搜索过程**:\n - 遍历 `big` 字符串的每个位置作为起始点\n - 对每个起始点,使用 [dfs](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\465\\2.js#L9-L25) 函数在 Trie 树中进行匹配\n - 当匹配到完整单词时,将起始位置记录到对应的结果数组中\n\n3. **Trie 树结构**:\n - `TrieNode`:包含 [end](file://E:\\力扣刷题\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14) 标志、子节点数组和索引 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22)\n - `Trie`:提供插入方法,将单词和其索引存储到树中\n\n## 关键函数分析\n\n- **`multiSearch` 主函数**:\n - 初始化 Trie 树并插入所有 smalls 单词\n - 遍历 big 字符串每个位置进行搜索\n\n- **[dfs](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\465\\2.js#L9-L25) 辅助函数**:\n - 从当前 Trie 节点继续匹配字符\n - 找到匹配单词时记录位置信息\n\n## 时间复杂度\n\n- **构建 Trie**:O(∑|smalls[i]|),即所有 smalls 字符串长度之和\n- **搜索过程**:O(|big| × max_match_length)\n - 外层循环遍历 `big` 字符串:O(|big|)\n - 每次 dfs 最坏情况遍历到最长匹配:O(max_match_length)\n- **总体复杂度**:O(∑|smalls[i]| + |big| × max_match_length)\n\n## 空间复杂度\n\n- **Trie 树存储**:O(∑|smalls[i]| × 26) = O(∑|smalls[i]|)\n- **结果数组**:O(∑结果数量)\n- **总体空间复杂度**:O(∑|smalls[i]| + 结果数量)\n\n## 代码\n```javascript\n/**\n * @param {string} big\n * @param {string[]} smalls\n * @return {number[][]}\n */\nvar multiSearch = function(big, smalls) {\n let trie = new Trie(),n = smalls.length;\n for(let i = 0;i < n;i++) trie.insert(smalls[i],i);\n let ans = new Array(n).fill(0).map(()=>[]);\n for(let i = 0;i < big.length;i++){\n let root = trie.root;\n let c = big[i],j = getCharIndex(c);\n if(!root.children[j]) continue;\n dfs(root,i,i);\n }\n\n return ans;\n\n // --------------------------\n function dfs(root,index,j){\n if(index === big.length) return;\n let c = big[index],i = getCharIndex(c);\n if(!root.children[i]) return;\n root = root.children[i];\n if(root.end) ans[root.i].push(j);\n dfs(root,index + 1,j);\n }\n};\n\n\n\n\nfunction Trie(){\n this.root = new TrieNode();\n}\n\nTrie.prototype.insert = function(word,i){\n let root = this.root;\n for(let c of word){\n let j = getCharIndex(c);\n if(!root.children[j]) root.children[j] = new TrieNode();\n root = root.children[j]\n }\n root.i = i;\n root.end = true;\n}\n\n\nfunction TrieNode(){\n this.end = false;\n this.children = new Array(26);\n this.i = -1;\n}\n\nfunction getCharIndex(c){\n return c.charCodeAt(0) - 'a'.charCodeAt(0);\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/79#issuecomment-3342189359","body":"## 思路\n\n1. **并查集初始化**:\n - 创建一个长度为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6) 的数组 [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17),其中 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6) 是城市数量\n - 初始化时,每个城市都指向自己,即 `f[i] = i`,表示每个城市初始时都是独立的集合\n\n2. **连接城市**:\n - 遍历 `isConnected` 矩阵,对于每一对相连的城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 和 `j`\n - 调用 [merge(i, j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28) 函数将它们合并到同一个集合中\n\n3. **并查集操作**:\n - [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24) 函数:查找城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 所属集合的根节点,并进行路径压缩优化\n - [merge(i, j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28) 函数:将城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 和 `j` 所在的集合合并\n\n## 关键点分析\n\n- **路径压缩**:在 [find](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\2.js#L26-L29) 函数中使用了 `f[i] = find(f[i])` 来压缩路径,提高查找效率\n- **集合合并**:每次成功合并两个不同的集合时,省份数量 [ans](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6) 减一\n- **初始值**:[ans](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6) 初始化为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6),表示最坏情况下每个城市都是一个独立省份\n\n## 代码\n```javascript\n/**\n * @param {number[][]} isConnected\n * @return {number}\n */\nvar findCircleNum = function(isConnected) {\n let n = isConnected.length,f = new Array(n).fill(0).map((_,i)=>i);\n let ans = n;\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(isConnected[i][j]) merge(i,j);\n }\n }\n return ans;\n // ------------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n let fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n ans--;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n^2),其中 n 是城市数量\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/80#issuecomment-3344661787","body":"## 思路\n\n1. **并查集初始化**\n - 使用并查集(Union-Find)数据结构来管理节点连接关系\n - [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17) 数组存储每个节点的父节点,初始时每个节点的父节点是自身\n - [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 数组存储每个连通分量的大小,初始时每个分量大小为1\n\n2. **构建连通分量**\n - 遍历 `graph` 矩阵,对于每条边 `graph[i][j]`,将节点 i 和 j 合并到同一连通分量中\n - 通过 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 函数实现节点合并,并更新连通分量大小\n\n3. **统计初始感染节点**\n - 使用 `initialMap` 统计每个连通分量中有多少个初始感染节点\n - 通过 [find](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\2.js#L26-L29) 函数找到每个初始感染节点所属的连通分量\n\n4. **选择最优移除节点**\n - 遍历所有初始感染节点,寻找满足以下条件的节点:\n - 所在连通分量只有1个初始感染节点(否则移除该节点无法减少传播)\n - 能够拯救最多节点的连通分量\n - 如果拯救数量相同,选择索引最小的节点\n\n5. **边界情况处理**\n - 如果所有初始感染节点所在的连通分量都包含多个感染节点,则返回 `initial` 中的最小索引\n\n## 关键函数\n\n- [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24): 查找节点 i 的根节点(带路径压缩优化)\n- [merge(i,j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28): 合并节点 i 和 j 所在的连通分量\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} graph\n * @param {number[]} initial\n * @return {number}\n */\nvar minMalwareSpread = function(graph, initial) {\n let n = graph.length;\n let f = new Array(n).fill(0).map((_,i)=>i);\n let s = new Array(n).fill(1);\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(graph[i][j]) merge(i,j);\n }\n }\n\n\n let initialMap = new Map();\n for(let i of initial){\n let fi = find(i);\n initialMap.set(fi,initialMap.has(fi) ? initialMap.get(fi) + 1 : 1);\n }\n let ans = n,max = 0;\n for(let i of initial){\n let fi = find(i);\n if(initialMap.get(fi) > 1) continue;\n if(s[fi] > max || s[fi] === max && i < ans) {\n max = s[fi];\n ans = i\n }\n }\n\n return ans === n ? initial.reduce((prev,curr)=>Math.min(prev,curr),n) : ans;\n\n\n\n // -----------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n let fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n s[fj] += s[fi];\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n^2),\n- 空间复杂度:O(n),其中 n 是节点数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/81#issuecomment-3349592362","body":"\n\n## 思路\n\n1. **并查集数据结构**:\n - 使用数组 [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17) 实现并查集,初始化时每台计算机的父节点是自身\n - [size](file://E:\\其他项目\\algorithm_exercises\\libs\\Stack.js#L19-L21) 记录当前连通分量的数量,初始为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6)\n\n2. **可行性判断**:\n - 如果连接数 `cnt` 小于 `n-1`,则无法连接所有计算机,返回 `-1`\n\n3. **连通分量合并**:\n - 遍历所有连接关系,通过 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 函数合并对应的计算机\n - 每次成功合并都会减少连通分量数量\n\n4. **结果计算**:\n - 最终需要的操作次数等于连通分量数减一(`size - 1`)\n\n## 关键函数\n\n- [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24):查找计算机 [i](file://E:\\其他项目\\algorithm_exercises\\周赛\\469\\2.js#L23-L23) 所在集合的根节点(带路径压缩优化)\n- [merge(i,j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28):合并计算机 [i](file://E:\\其他项目\\algorithm_exercises\\周赛\\469\\2.js#L23-L23) 和 `j` 所在的集合\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} connections\n * @return {number}\n */\nvar makeConnected = function(n, connections) {\n const cnt = connections.length;\n if(cnt < n - 1) return -1;\n const f = new Array(n).fill(0).map((_,i)=>i);\n let size = n;\n for(let [i,j] of connections) merge(i,j);\n return size - 1;\n\n // ----------------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n const fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n size--;\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(m×α(n)),其中 m 是连接数,α 是阿克曼函数的反函数\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3354314699","body":"## 思路\n\n使用**后序遍历**的方式递归处理二叉树,删除所有值为0的叶子节点及其所属的全0子树。\n\n## 具体实现分析\n\n1. **基础情况处理**\n - `if(!root) return root;` - 空节点直接返回\n - `if(root && !root.left && !root.right) return root.val === 0 ? null : root;` - 叶子节点判断:如果是值为0的叶子节点则删除\n\n2. **递归处理**\n - `let l = pruneTree(root.left), r = pruneTree(root.right);` - 递归处理左右子树\n - 处理后的左右子树结果保存在 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\468\\2.js#L7-L7) 和 [r](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\447\\1.js#L31-L31) 中\n\n3. **当前节点判断**\n - `if(!l && !r && root.val === 0) return null;` - 如果左右子树都被删除且当前节点值为0,则删除当前节点\n - 否则更新当前节点的左右子树引用并返回当前节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {TreeNode}\n */\nvar pruneTree = function(root) {\n if(!root) return root;\n if(root && !root.left && !root.right) return root.val === 0 ? null : root;\n\n let l = pruneTree(root.left),r = pruneTree(root.right);\n if(!l && !r && root.val === 0) return null;\n root.left = l;\n root.right = r;\n return root;\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**: O(n),需要访问每个节点一次\n- **空间复杂度**: O(h),h为树的高度,递归调用栈的深度\n- **关键点**: 后序遍历确保了从叶子节点开始处理,逐步向上删除符合条件的节点","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/83#issuecomment-3358681420","body":"## 思路\n\n- 使用**回溯算法**(Backtracking)来遍历所有可能的组合\n- 对于每个元素,有两种选择:选择它(可重复选择)或不选择它\n\n## 代码结构分析\n\n1. **初始化**\n - [ans](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\436\\2.js#L7-L7):存储所有符合条件的组合结果\n - `result`:存储当前正在构建的组合\n - [n](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\437\\2.js#L5-L5):`candidates` 数组的长度\n\n2. **递归函数 [f(i, target)](file://E:\\力扣刷题\\algorithm_exercises\\19.js#L10-L17)**\n - [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22):当前考虑的元素索引\n - [target](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\453\\1.js#L8-L8):剩余需要达到的目标值\n\n3. **递归终止条件**\n - `target === 0`:找到一个有效组合,将其加入结果集\n - `i === n || target < 0`:超出数组范围或目标值为负,直接返回\n\n4. **递归逻辑**\n - **选择当前元素**:如果 `target >= candidate`,将当前元素加入 `result`,然后递归调用 [f(i, target - candidate)](file://E:\\力扣刷题\\algorithm_exercises\\19.js#L10-L17)(注意这里是 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 而不是 `i+1`,允许重复选择同一元素)\n - **不选择当前元素**:递归调用 [f(i + 1, target)](file://E:\\力扣刷题\\algorithm_exercises\\19.js#L10-L17),考虑下一个元素\n\n## 关键特点\n\n- 通过 [f(i, target - candidate)](file://E:\\力扣刷题\\algorithm_exercises\\19.js#L10-L17) 而不是 `f(i + 1, target - candidate)` 实现元素的重复使用\n- 使用 `result.push()` 和 `result.pop()` 维护当前组合状态,体现回溯思想\n\n## 代码\n```javascript\n/**\n * @param {number[]} candidates\n * @param {number} target\n * @return {number[][]}\n */\nvar combinationSum = function(candidates, target) {\n let ans = [],n = candidates.length;\n let result = []\n f(0,target);\n return ans;\n // ----------------------------\n function f(i,target){\n if(target === 0) {\n ans.push([...result]);\n return\n }\n if(i === n || target < 0) return;\n\n let candidate = candidates[i];\n\n if(target >= candidate){\n result.push(candidate);\n f(i,target - candidate);\n result.pop();\n } \n\n f(i + 1,target);\n } \n};\n```\n\n## 时间复杂度分析\n\n- **最坏情况时间复杂度**: `O(N^(T/M))`\n - 其中 `N` 是 `candidates` 数组的长度\n - `T` 是目标值 [target](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\453\\1.js#L8-L8)\n - `M` 是 `candidates` 中的最小值\n - 在最坏情况下,递归树的深度为 `T/M`,每层最多有 `N` 个分支\n\n- **实际时间复杂度**: 会比上述上界小很多,因为剪枝操作(`target < 0`时提前返回)会减少大量无效搜索\n\n## 空间复杂度分析\n\n- **递归栈空间**: `O(T/M)`\n - 最坏情况下递归深度为 `T/M`(当一直选择最小元素时)\n\n- **存储结果空间**: `O(K × X)`\n - `K` 是平均每个组合的长度\n - `X` 是符合条件的组合数量\n - 这部分空间用于存储最终结果 [ans](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\436\\2.js#L7-L7)\n\n- **临时存储空间**: `O(T/M)`\n - 用于存储当前路径 `result` 的最大长度\n\n因此,总体空间复杂度为 `O(T/M + K × X)`。","onTime":true},null,null,null,null,null,null,null,null,null,null,null],"haoyuliaocurb":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073435345","body":"```\n// Time Complexity: O(max(num.length, k))\n// Space Complexity: O(max(num.length, k))\n\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(num, k) {\n const num1 = num;\n const num2 = String(k).split('').map(v => Number(v));\n const sum = [];\n\n for (let i = 0; i < Math.max(num1.length, num2.length); i += 1) {\n const s = (num1[num1.length - 1 - i] ?? 0) + (num2[num2.length - 1 - i] ?? 0) + (sum[i] ?? 0);\n\n sum[i] = s % 10;\n sum[i + 1] = (s - (s % 10)) / 10;\n }\n\n if (sum[sum.length - 1] === 0) sum.pop();\n sum.reverse();\n\n return sum;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078842293","body":"【解題方向】\n\n第一想法:對於每一個 s[i] 都遍歷一次找最近的 c,Time Complexity 為 O(n^2) \n\n第二想法:先遍歷一遍 s 找到所有的 c,然後從所有的 c 開始向兩邊走\n\t=> 不過想到如何記錄狀態就覺得太複雜,而且可能最糟情況還是 Time Complexity 為 O(n^2) \n\n第三想法:看了提示,想到正向遍歷、反向遍歷一次,記錄 s[i] 與左右兩邊的 c 的最小距離\n\t=> 由於題目保證至少有一個 s 中至少有一個 c,對於每個 s[i],其左或右必然會有一個 c\n\n【程式碼】\n```\n// Time Complexity: O(n), n = s.length;\n// Space Complexity: O(n), n = s.length;\n\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const chars = s.split('');\n const res = new Array(chars.length).fill(Infinity);\n\n let leftTargetCharIndex = -1;\n for (let i = 0; i < chars.length; i += 1) {\n if (chars[i] === c) leftTargetCharIndex = i;\n if (leftTargetCharIndex > -1) {\n res[i] = Math.min(res[i], Math.abs(leftTargetCharIndex - i));\n }\n }\n\n let rightTargetCharIndex = -1;\n for (let i = chars.length - 1; i > -1; i -= 1) {\n if (chars[i] === c) rightTargetCharIndex = i;\n if (rightTargetCharIndex > -1) {\n res[i] = Math.min(res[i], Math.abs(rightTargetCharIndex - i));\n }\n }\n\n return res;\n};\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089452516","body":"1. 第一個直覺是用 recursion 來解題,不過過程中會遇到很多 edge case 沒有考慮到而 error thrown\n2. 後來改用 stack 來實踐,也很清楚,不過需要搞懂什麼應該被放進 stack,以及 pop and push 的時機\n\n```\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * Recursive version of decodeString\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const helper = (str, index) => {\n let result = '';\n let num = 0;\n \n while (index < str.length) {\n const char = str[index];\n \n if (char >= '0' && char <= '9') {\n num = num * 10 + parseInt(char);\n index++;\n } else if (char === '[') {\n // Recursively decode the content inside brackets\n const [decodedStr, newIndex] = helper(str, index + 1);\n result += decodedStr.repeat(num);\n num = 0; // Reset number after using it\n index = newIndex;\n } else if (char === ']') {\n // End of current bracket section - return result and current index\n return [result, index + 1];\n } else {\n // Regular character\n result += char;\n index++;\n }\n }\n \n return [result, index];\n };\n \n return helper(s, 0)[0];\n};\n\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let currentStr = '';\n let currentNum = 0;\n \n for (let i = 0; i < s.length; i++) {\n const char = s[i];\n \n if (char >= '0' && char <= '9') {\n currentNum = currentNum * 10 + parseInt(char);\n } else if (char === '[') {\n // Push current state to stack\n stack.push([currentStr, currentNum]);\n currentStr = '';\n currentNum = 0;\n } else if (char === ']') {\n // Pop from stack and decode\n const [prevStr, num] = stack.pop();\n currentStr = prevStr + currentStr.repeat(num);\n } else {\n // Regular character\n currentStr += char;\n }\n }\n \n return currentStr;\n};\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091467280","body":"透過第二個 stack 倒轉第一個 in-stack 的順序,以達到 FIFO 的效果\n```\n// Time Complexity: O(1) for push, pop, peek, empty;\n// Space Complexity: O(n)\n\nclass MyQueue {\n constructor() {\n this.inStack = [];\n this.outStack = [];\n }\n\n /** \n * @param {number} x\n * @return {void}\n */\n push(x) {\n this.inStack.push(x);\n }\n\n /**\n * @return {number}\n */\n pop() {\n if (!this.outStack.length) {\n this.pushToOutStack();\n }\n\n return this.outStack.pop();\n }\n\n /**\n * @return {number}\n */\n peek() {\n if (!this.outStack.length) {\n this.pushToOutStack();\n }\n\n return this.outStack[this.outStack.length - 1];\n }\n\n /**\n * @return {boolean}\n */\n empty() {\n return this.peek() === undefined;\n }\n\n pushToOutStack() {\n while (this.inStack.length) {\n this.outStack.push(this.inStack.pop());\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094426027","body":"// Time Complexity: O(n);\n// Space Complexity: O(n);\n\n```\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const sortedArr = [...arr].sort((a, b) => a - b);\n let counts = {};\n let chunkAmount = 0;\n\n for (let i = 0; i < arr.length; i += 1) {\n counts[arr[i]] = (counts[arr[i]] ?? 0) + 1;\n counts[sortedArr[i]] = (counts[sortedArr[i]] ?? 0) - 1;\n\n if (Object.values(counts).every((value) => value === 0)) {\n chunkAmount += 1;\n }\n }\n\n return chunkAmount;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095908728","body":"```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\nvar rotateRight = function (head, k) {\n if (!head || !head.next) return head;\n\n let length = 0;\n let cur = head;\n\n while (cur) {\n cur = cur.next;\n length += 1;\n }\n\n k = k % length;\n let left = head;\n let right = head;\n\n while (right.next) {\n if (k <= 0) left = left.next;\n right = right.next;\n k -= 1;\n }\n\n right.next = head; // Handle the case when left and right point to the same node.\n let res = left.next;\n left.next = null;\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3102283858","body":"建立一個 dummy 連結在 head 之前,便可以將 head 當作中間節點處理。每次互換節點會牽涉四個節點,pre, cur, next, next.next,其中 pre 的初始值為 dummy,因此在每個迴圈保證有值,而真正要互換的 cur, next,其兩有值為 while 迴圈繼續的必要條件,next.next 為 null 則沒關係。\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n const dummy = { val: 0, next: head };\n\n let pre = dummy;\n let cur = pre.next;\n let next = cur?.next;\n\n while (cur && next) {\n pre.next = next;\n cur.next = next.next;\n next.next = cur;\n\n [pre, cur, next] = [cur, cur.next, cur.next?.next];\n }\n\n return dummy.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105649705","body":"# 想法\n轉換成 Height Balanced Binary Search Tree 會需要進行 Binary Search,考慮到單向鏈錶不方便直接存取 node,因此直接將鏈錶轉成數組,並直接以數組配合 Binary Search 遞迴建立樹。\n\n```\n\n// Time Complexity: O(n);\n// Space Complexity: O(n);\n\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if (head === null) return null;\n\n const dummy = new ListNode(0, head);\n const arr = [];\n\n let tail = dummy;\n\n while (tail) {\n const next = tail.next;\n next && arr.push(next.val);\n tail = next;\n }\n\n const inner = (l, r) => {\n if (l > r) return null;\n if (l === r) return new TreeNode(arr[r]);\n\n const m = Math.ceil((l + r) / 2);\n\n return new TreeNode(arr[m], inner(l, m - 1), inner(m + 1, r));\n };\n\n return inner(0, arr.length - 1);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112936097","body":"## 思考方向\n### 雙指針\n用兩個指針分別從 headA, headB 開始走,走到盡頭換到另一個 head。過程中若指向同一個點則為兩鏈錶的交點,若皆遍歷一遍後無交點,則兩鏈錶無相交。\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function(headA, headB) {\n let pointerA = headA;\n let pointerB = headB;\n let switchCounts = 0;\n\n while (switchCounts < 3) {\n if (pointerA === pointerB) return pointerA;\n\n if (pointerA?.next) {\n pointerA = pointerA.next;\n } else {\n switchCounts += 1;\n pointerA = headB;\n }\n\n if (pointerB?.next) {\n pointerB = pointerB.next;\n } else {\n switchCounts += 1;\n pointerB = headA;\n }\n }\n\n return null;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116343077","body":"## 解題方向\n- 快慢指針法\n\n## Edge Cases\n- 當快指針走到 null 代表沒有環\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n let fast = head;\n let slow = head;\n\n do {\n if (fast === null) return null;\n\n fast = fast?.next?.next ?? null;\n slow = slow?.next ?? null;\n } while (fast !== slow);\n\n fast = head;\n\n while (fast !== slow) {\n fast = fast?.next ?? null;\n slow = slow?.next ?? null;\n }\n\n return fast;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121584769","body":"## 解題方向\n- 看到 FISO 的第一個想法是用 Queue,搭配 hash 也可以達到 get O(1) 的要求,不過 put 更新既有的值,就沒辦法 O(1)。\n若是 put 更新既有的值要 O(1),還是需要使用鏈表。\n- 中間有一度 debug 卡關,主要是原本在 put 時無論如何都先把既有的 node 刪掉再新增,但這可能造成一些 state 更新上的錯誤,後來簡化為直接移動 node 才 AC。\n\n```\n// Time Complexity: O(1) for LRUCache.prototype.get, put\n// Space Complexity: O(n)\n\nfunction ListNode(key, val) {\n this.key = key;\n this.val = val;\n this.next = null;\n this.pre = null;\n }\n\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.length = 0;\n this.head = new ListNode();\n this.tail = new ListNode();\n this.head.next = this.tail;\n this.tail.pre = this.head;\n this.map = {};\n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n const node = this.map[key];\n\n if (node !== undefined) {\n this.appendToTail(this.remove(node));\n return node.val\n };\n\n return -1;\n};\n\n/** \n * @param {number} key \n * @param {number} val\n * @return {void}\n */\nLRUCache.prototype.put = function(key, val) {\n const node = this.map[key];\n\n if (node !== undefined) {\n node.val = val;\n this.appendToTail(this.remove(node));\n } else {\n if (this.length === this.capacity) {\n const old = this.head.next;\n delete this.map[old.key];\n this.length -= 1;\n this.remove(old);\n }\n\n const node = new ListNode(key, val);\n this.map[key] = node;\n this.length += 1;\n this.appendToTail(node);\n }\n};\n\nLRUCache.prototype.appendToTail = function(node) {\n if (node.pre) node.pre.next = node.next;\n if (node.next) node.next.pre = node.pre;\n this.tail.pre.next = node;\n node.pre = this.tail.pre;\n node.next = this.tail;\n this.tail.pre = node;\n}\n\nLRUCache.prototype.remove = function(node) {\n node.pre.next = node.next;\n node.next.pre = node.pre;\n node.pre = null;\n node.next = null;\n\n return node;\n}\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123752698","body":"## 解題方向\n### DFS\n- 需注意當 helper 的 params root 為 null 時,應回傳 0\n\n```\n// Time Complexity: O(n), n for numbers of nodes.\n// Space Complexity: O(h), h for the max depth of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n const helper = (root) => {\n if (!root) return 0;\n if (!root.left && !root.right) return 1;\n return Math.max(helper(root.left), helper(root.right)) + 1;\n };\n\n return helper(root);\n};\n```\n\n### Layer Iteration\n- 由於 stack 的起始值就有一個 root node,因此要先處理 root 為 null 的狀況\n\n```\n// Time Complexity: O(n), n for numbers of nodes.\n// Space Complexity: O(w), w for the max numbers of nodes in the same layer of tree.\n\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if (!root) return 0;\n\n const stack = [{ node: root, depth: 1 }];\n let maxDepth = 0;\n\n while (stack.length) {\n const { node, depth } = stack.shift();\n if (node.left) stack.push({ node: node.left, depth: depth + 1 });\n if (node.right) stack.push({ node: node.right, depth: depth + 1 });\n maxDepth = Math.max(maxDepth, depth);\n }\n\n return maxDepth;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125050709","body":"## 解題方向\n- 須理解兩棵樹一樣的意思是,其遍歷的結果會一樣,又題目有提到左右節點位置不同也不行,因此可以用多個遍歷結果來確認,或者可以將中間的空節點印出。可優化空間是不需要若於遍歷過程比較兩棵樹的節點,就不需要儲存遍歷結果。\n\n```javascript\n// Time Complexity: O(m + n), m, n are numbers of two tree nodes respectively.\n// Space Complexity: O(m + n)\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} p\n * @param {TreeNode} q\n * @return {boolean}\n */\nvar isSameTree = function(p, q) {\n const iterate = (root) => {\n const arr = [];\n const stack = [root];\n\n while (stack.length) {\n const node = stack.shift();\n\n arr.push(node?.val);\n\n if (node?.left || node?.right) {\n stack.push(node?.left);\n stack.push(node?.right);\n }\n }\n\n return arr;\n };\n\n return JSON.stringify(iterate(p)) === JSON.stringify(iterate(q));\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3131156971","body":"## 解題方向\n- 需要計算所有從 root 走到 leaf 的路線,這可以用 Recursion 來完成(回溯)\n- 用一個數字來紀錄 state:增加位數為「runningNumber * 10 + node.val」,減去位數為「Math.floor(runningNumber / 10)」\n\n```javascript\n// Time Complexity: O(n), n is the number of the tree nodes\n// Space Complexity: O(d), d is the depth of the tree\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root) {\n let sum = 0;\n let runningNumber = 0;\n\n const inner = (root) => {\n if (root) {\n runningNumber = runningNumber * 10 + root.val;\n\n if (!root.left && !root.right) {\n sum += runningNumber;\n } else {\n inner(root.left);\n inner(root.right);\n }\n\n runningNumber = Math.floor(runningNumber / 10);\n }\n };\n\n inner(root);\n\n return sum;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134845036","body":"## 解題方向\n- 可以使用 DFS 或 BFS 來解題\n- DFS 記錄最深深度的第一個節點數值,深度可作為參數於每次遞迴時傳遞\n- BFS 紀錄每層第一個節點數值\n- 題目保證 root 一定不為 null\n\n### DFS\n```javascript\n// Time Complexity: O(n), n is the number of tree nodes.\n// Space Complexity: O(d), d is the max depth of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let maxDepth = 0;\n let res = null;\n\n const dfs = (root, depth) => {\n if (depth > maxDepth) {\n maxDepth = depth;\n res = root.val;\n }\n\n root.left && dfs(root.left, depth + 1);\n root.right && dfs(root.right, depth + 1);\n };\n\n dfs(root, 1);\n\n return res;\n};\n```\n\n### BFS\n```javascript\n// Time Complexity: O(n), n is the number of tree nodes.\n// Space Complexity: O(w), w is the max width of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n const stack = [[root]];\n let res = null;\n\n while (stack.length) {\n const nodes = stack.pop();\n\n res = nodes[0].val;\n\n const nextNodes = [];\n\n for (const node of nodes) {\n node.left && nextNodes.push(node.left);\n node.right && nextNodes.push(node.right);\n }\n\n nextNodes.length && stack.push(nextNodes);\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138426787","body":"## 解題方向\n* 使用 DNS 前序遍歷,在 deserialize 時透過遞迴建立樹會較 BFS 容易。\n* 使用原生的 JSON.stringify and JSON.parse 來轉換 array 及 string\n* 優化方向:優化 Space Complexity 至 O(h),h 為樹的高度\n * 能直接產生 serialized string 而非在最後轉化\n * 一邊 deserialize 需要的 string 部分,而不需要在一開始開一個 array 儲存\n\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n// Time Complexity: O(n), n is number of tree nodes.\n// Space Complexity: O(n), n is number of tree nodes.\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n const preOrder = [];\n const dns = (root) => {\n preOrder.push(root?.val);\n if (root) {\n dns(root.left);\n dns(root.right);\n }\n };\n dns(root);\n\n return JSON.stringify(preOrder);\n};\n\n// Time Complexity: O(n), n is number of tree nodes.\n// Space Complexity: O(n), n is number of tree nodes.\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n const preOrder = JSON.parse(data);\n\n if (preOrder[0] === null || preOrder[0] === undefined) return preOrder[0];\n\n const createNode = () => {\n const val = preOrder.shift();\n\n if (val === null) return null;\n\n const node = new TreeNode(val);\n node.left = createNode();\n node.right = createNode();\n return node;\n };\n\n return createNode();\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144639245","body":"## 解題方向\n- 不一樣的遍歷方式會有差嗎? => 由於打算取值後再排序,因此沒差\n- 如何儲存最後的輸出最省力 => 用 hashmap\n\n```javascript\n// Time Complexity: O(nlogn), n is the number of tree.\n// Space Complexity: O(n), n is the number of tree.\n\n// /**\n// * Definition for a binary tree node.\n// * function TreeNode(val, left, right) {\n// * this.val = (val===undefined ? 0 : val)\n// * this.left = (left===undefined ? null : left)\n// * this.right = (right===undefined ? null : right)\n// * }\n// */\n// /**\n// * @param {TreeNode} root\n// * @return {number[][]}\n// */\nvar verticalTraversal = function(root) {\n const map = {};\n\n const traverse = (root, row, col) => {\n if (!root) return;\n\n if (!map[col]) {\n map[col] = [];\n }\n\n map[col].push([row, root.val]);\n traverse(root.left, row + 1, col - 1);\n traverse(root.right, row + 1, col + 1);\n };\n\n traverse(root, 0, 0);\n\n const keys = Object.keys(map).sort((a, b) => a - b);\n\n const res = keys.map((k) => {\n const arr = map[k];\n\n return arr.sort(([rowA, valA], [rowB, valB]) => {\n if (rowA === rowB) return valA - valB;\n return rowA - rowB;\n }).map(([,val]) => val);\n });\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146092009","body":"## 解題方向\n- 遍歷 nums 時使用 hashmap 來記錄曾出現過的數字及其 index,並看 hashmap 是否記錄 target - nums[i] 是否曾出現過\n- 可以特別注意題目要求同個元素不能被使用兩次,所以應將配對到的元素移出 hashmap(不過因為題目也說只有一組數字為答案,所以不做也沒關係)\n\n```javascript\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(1) \n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n const map = {};\n const res = [];\n\n for (let i = 0; i < nums.length; i += 1) {\n const num = nums[i];\n\n if (map[target - num] !== undefined) {\n res.push(i, map[target - num]);\n delete map[target - num];\n } else {\n map[num] = i;\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3146907342","body":"## 解法\n- 第一個想法是遍歷後得到 num 與其 frequency 的 hashmap,將其轉成 array 後排序並取前 k 者\n- 看了題解後可優化部分是,由於題目允許回傳值不需要依據 frequency 排序,因此可將原解法 sort 的部分改成 quick selection,將平均時間複查度從 O(nlogn) 將至 O(n)\n```javascript\n// Time Complexity: O(nlogn), n is nums.length.\n// Space Complexity: O(n), n is nums.length.\n\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function (nums, k) {\n const map = {};\n\n for (const num of nums) {\n map[num] = (map[num] ?? 0) + 1;\n }\n\n return Object.entries(map)\n .sort(([numA, freqA], [numB, freqB]) => {\n return freqB - freqA;\n })\n .filter((_, i) => i < k)\n .map(([num]) => Number(num));\n};\n```\n\n## 解法\n- 找 max frequent num\n- 回傳 left, right index range\n- 需要考慮當兩個 num frequency 相等時,應保留 range 較小者!\n```javascript\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(n), n is nums.length.\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findShortestSubArray = function (nums) {\n let maxFreqNum = nums[0];\n const map = {};\n\n for (let i = 0; i < nums.length; i += 1) {\n const num = nums[i];\n const { freq, left, right } = map[num] ?? { freq: 0, left: i, right: i };\n map[num] = {\n freq: freq + 1,\n left: i < left ? i : left,\n right: i > right ? i : right,\n };\n\n if (map[num].freq > map[maxFreqNum].freq) {\n maxFreqNum = num;\n } else if (map[num].freq === map[maxFreqNum].freq) {\n if (\n map[num].right - map[num].left <\n map[maxFreqNum].right - map[maxFreqNum].left\n ) {\n maxFreqNum = num;\n }\n }\n }\n\n const { left, right } = map[maxFreqNum];\n\n return right - left + 1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149617346","body":"```javascript\n// Time Complexity: O(n^2), n is points.length.\n// Space Complexity: O(n), n is points.length.\n\n/**\n * @param {number[][]} points\n * @return {number}\n */\nfunction numberOfBoomerangs(points) {\n const n = points.length;\n let ans = 0;\n \n for (let i = 0; i < n; i++) {\n const distanceMap = {};\n \n for (let j = 0; j < n; j++) {\n const dist = Math.pow(points[i][0] - points[j][0], 2) + Math.pow(points[i][1] - points[j][1], 2);\n distanceMap[dist] = (distanceMap[dist] ?? 0) + 1;\n }\n \n for (const count of Object.values(distanceMap)) {\n ans += count * (count - 1);\n }\n }\n \n return ans;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153048738","body":"## 解法\n- 經典的滑動視窗題目,與用 hashmap 紀錄字元的出現次數,並於迴圈中判斷下個字元是否已出現過,無則加入,有則刪除。\n- 需要特別注意\n- (1) 迴圈的邊界條件應為 right < s.length - 1,不然會讓 right 跑到 s.length\n- (2) 應先刪掉 map[s[left]] 再 left++\n\n```javascript\n// Time Complexity: O(n), n is s.length.\n// Space Complexity: O(m), m is types of characters in s.\n\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n if (!s.length) return 0;\n \n const chars = new Map();\n chars.set(s[0], 1);\n\n let max = 1;\n let left = 0;\n let right = 0;\n\n while (right < s.length - 1) {\n const cond = !chars.has(s[right + 1]);\n if (!chars.has(s[right + 1])) {\n right++;\n chars.set(s[right], 1);\n } else {\n chars.delete(s[left]);\n left++;\n }\n\n const number = right - left + 1;\n if (number > max) max = number;\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160434225","body":"## 解法\n- 一開始分析方向錯了,以為每個 substring 間不可重疊\n- 之後想到的是用 hashmap 存可能 substring 的結果,再遍歷一次,但是時間複雜度為階乘\n- 最後則是直接遍歷,再驗證 substring 是否正確,然而需考慮 words 的 element 是否會重複\n\n```javascript\n// Time Complexity: O(n * m * k), n is s.length, m is words[0].length, k is words.lenght.\n// Space Complexity: O(m).\n\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n const defaultMap = (() => {\n const m = {};\n for (const word of words) {\n m[word] = (m[word] ?? 0) + 1;\n }\n return m;\n })();\n let map = JSON.parse(JSON.stringify(defaultMap));\n const wordLength = words[0].length;\n const substringLength = wordLength * words.length;\n\n const validate = (substring) => {\n let cur = 0;\n map = JSON.parse(JSON.stringify(defaultMap));\n\n while (cur < substring.length) {\n const target = substring.substring(cur, cur + wordLength);\n if (map[target]) {\n map[target] -= 1;\n cur += wordLength;\n } else return false;\n }\n\n return true;\n };\n\n const res = []\n\n for (let i = 0; i < s.length - substringLength + 1; i++) {\n const substring = s.substring(i, i + substringLength);\n if (validate(substring)) res.push(i);\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3164019442","body":"## 解法\n- 一開始漏看了連續短數組的條件,之後想到暴力法,也有個感覺優化必定涉及數學技巧,因此直接看題解\n- 需要理解兩個技巧:負數取模 floorMod 和 map.set(0, -1) 以處理欲從 sum[i] - sum[j] 計算 i 至 j 範圍時,當 j 為 0 遇到的計算問題\n\n```javasciprt\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(min(n, k))\n\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar floorMod = function (a, b) {\n return ((a % b) + b) % b;\n};\n\nfunction minSubarray(nums, k) {\n var map = new Map();\n map.set(0, -1);\n var res = nums.length;\n var target = 0;\n var currSum = 0;\n for (let i = 0; i < nums.length; i++) {\n target += nums[i];\n }\n target = target % k;\n if (target === 0) return 0;\n for (let i = 0; i < nums.length; i++) {\n currSum = (nums[i] + currSum) % k;\n\n var prevSum = floorMod(currSum - target, k);\n if (map.has(prevSum)) {\n res = Math.min(res, i - map.get(prevSum));\n }\n map.set(currSum, i);\n }\n return res === nums.length ? -1 : res;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168248088","body":"## 解法\n- 窮舉前面的例子就可以得到規律:先處理只有一個 node 的 edge case,當 fast.next?.next 不為 null,即存在下下個 node 的情況下移動快慢指針,不然慢指針的下個 node 即是中間節點。\n```javascript\n// 1 => 1\n\n// 1, 2 => 2 => slow 1, fast 2\n// 1, 2, 3 => 2 => slow 1, fast 2\n\n// 1, 2, 3, 4 => 3 => slow 2, fast 4\n// 1, 2, 3, 4, 5 => 3 => slow 2, fast 4\n\n// 1, 2, 3, 4, 5, 6 => 4\n// 1, 2, 3, 4, 5, 6, 7 => 4\n\n// 1, 2, 3, 4, 5, 6, 7, 8 => 5\n// 1, 2, 3, 4, 5, 6, 7, 8, 9 => 5\n```\n\n```javascript\n// Time Complexity: O(n), n is linked list length,\n// Space Complexity: O(1)\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n if (!head.next) return head;\n\n let slow = head;\n let fast = head.next;\n\n while (fast.next?.next) {\n slow = slow.next;\n fast = fast.next.next;\n };\n\n return slow.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170547569","body":"## 解法\n- 一開始沒注意到 Space Complexity O(1) 的要求,因此用 map 來記錄曾遍歷過的數字,並使用 nums.splice 來原地刪除重複元素\n- 若限制 Space Complexity 為 O(1),則需要如題解用快慢指針來做\n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n let slow = 0;\n let fast = 0;\n\n while (fast < nums.length) {\n if (nums[fast] !== nums[slow]) {\n slow++;\n nums[slow] = nums[fast];\n }\n \n fast++;\n }\n\n return slow + 1;\n};\n\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n const map = {};\n let res = 0;\n let i = nums.length - 1;\n\n while (i >= 0) {\n const num = nums[i];\n\n if (map[num]) {\n nums.splice(i, 1);\n } else {\n map[num] = 1;\n res += 1;\n };\n\n i--;\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172259657","body":"## 解法\n- 經典的二分查找,需注意沒有找到 target 的 edge case\n\n```javascript\n// Time Complexity: O(logn), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let l = 0;\n let r = nums.length - 1;\n let m = -1;\n\n while (l <= r) {\n m = l + Math.floor((r - l) / 2);\n\n if (nums[m] === target) return m;\n else if (nums[m] > target) r = m - 1;\n else l = m + 1;\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173778506","body":"## 解法\n- 第一泡茶的確是暴力解,之後會想到 max heap,但每次 push 仍需要耗費 O(logn)\n- 有想過使用 monotonic stack 來做,但卡沒仔細想就覺得可能無法正確排除 sliding window 外的元素而作罷,而這其實可以靠題解中的 shift 來完成,又因為不是嚴格遞增棧,所以遇到相等數值時,前者仍會被保留,而確保 shift 的操作都是正確的\n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(k)\n\nvar maxSlidingWindow = function (nums, k) {\n const res = [];\n const dequeue = new Dequeue([]);\n\n for (let i = 0; i < k - 1; i++) {\n dequeue.push(nums[i]);\n }\n\n for (let i = k - 1; i < nums.length; i++) {\n dequeue.push(nums[i]);\n res.push(dequeue.max());\n dequeue.shift(nums[i - k + 1]);\n }\n\n return res;\n};\n\nclass Dequeue {\n constructor(nums) {\n this.list = nums; // Should be implemented as a linked list to make time complexity of dequeue.shift() as O(1).\n }\n\n push(val) {\n const nums = this.list;\n\n while (nums[nums.length - 1] < val) {\n nums.pop();\n }\n\n nums.push(val);\n }\n\n shift(val) {\n let nums = this.list;\n\n if (nums[0] === val) {\n nums.shift();\n }\n }\n\n max() {\n return this.list[0];\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178234382","body":"## 解法\n- 第一泡茶,可以透過紀錄一個人信任及被信任的人數來解題。其中可以不斷紀錄目前被信任人數最高者方便最後判斷是否為法官\n- 看了題解後發現可以用圖來解,之後補上\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n const trustFroms = new Array(n).fill(0);\n const trustTos = new Array(n).fill(0);\n let maybeJudge = { index: 0, trustTo: 0 };\n\n for (const t of trust) {\n const [from, to] = [t[0] - 1, t[1] - 1];\n trustFroms[from]++;\n trustTos[to]++;\n if (trustTos[to] > maybeJudge.trustTo) maybeJudge = { index: to, trustTo: trustTos[to] };\n }\n\n if (maybeJudge.trustTo === n - 1) {\n if (trustFroms[maybeJudge.index] === 0) return maybeJudge.index + 1;\n }\n\n return -1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3184149014","body":"```javascript\n// Time Complexity: O(v + e)\n// Space Complexity: O(v + e)\n\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nconst possibleBipartition = (n, dislikes) => {\n const graph = new Array(n + 1).fill().map(() => new Array())\n const colors = new Array(n + 1).fill(-1);\n\n for (const [a, b] of dislikes) {\n graph[a].push(b);\n graph[b].push(a);\n }\n\n const dfs = (cur, color = 0) => {\n colors[cur] = color;\n\n for (const nxt of graph[cur]) {\n if (colors[nxt] !== -1 && colors[nxt] === color) return false;\n if (colors[nxt] === -1 && !dfs(nxt, color ^ 1)) return false;\n }\n\n return true;\n };\n\n for (let i = 0; i < n + 1; i++) {\n if (colors[i] === -1 && !dfs(i, 0)) return false;\n }\n\n return true;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186799518","body":"```javascript\n// Time Complexity: O(n + e), e is sum of beforeItems.flat().length\n// Space Complexity: O(n + e)\n\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n const topologicalSort = (items, indegree, neighbors) => {\n const queue = [];\n const result = [];\n \n for (const item of items) {\n if (indegree[item] === 0) {\n queue.push(item);\n }\n }\n \n while (queue.length > 0) {\n const current = queue.shift();\n result.push(current);\n \n const currentNeighbors = neighbors[current] || [];\n for (const neighbor of currentNeighbors) {\n indegree[neighbor]--;\n if (indegree[neighbor] === 0) {\n queue.push(neighbor);\n }\n }\n }\n \n return result;\n };\n \n let maxGroupId = m;\n for (let item = 0; item < n; item++) {\n if (group[item] === -1) {\n group[item] = maxGroupId;\n maxGroupId++;\n }\n }\n \n const itemIndegree = Array.from({length: n}, () => 0);\n const groupIndegree = Array.from({length: maxGroupId}, () => 0);\n const itemNeighbors = Array.from({length: n}, () => []);\n const groupNeighbors = Array.from({length: maxGroupId}, () => []);\n const groupItems = Array.from({length: maxGroupId}, () => []);\n \n for (let item = 0; item < n; item++) {\n groupItems[group[item]].push(item);\n }\n \n for (let item = 0; item < n; item++) {\n const dependencies = beforeItems[item] || [];\n \n for (const dependency of dependencies) {\n if (group[dependency] !== group[item]) {\n groupIndegree[group[item]]++;\n groupNeighbors[group[dependency]].push(group[item]);\n } else {\n itemIndegree[item]++;\n itemNeighbors[dependency].push(item);\n }\n }\n }\n \n const groups = Array.from({length: maxGroupId}, (_, i) => i);\n const sortedGroups = topologicalSort(groups, groupIndegree, groupNeighbors);\n \n if (sortedGroups.length !== maxGroupId) {\n return [];\n }\n \n const result = [];\n \n for (const groupId of sortedGroups) {\n const items = groupItems[groupId];\n const sorteditems = topologicalSort(items, itemIndegree, itemNeighbors);\n \n if (sorteditems.length !== items.length) {\n return [];\n }\n \n result.push(...sorteditems);\n }\n \n return result;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190479297","body":"```javascript\n// Time Complexity: O(n), n is moves.length\n// Space Complexity: O(1)\n\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let [x, y] = [0, 0];\n\n for (let i = 0; i < moves.length; i++) {\n const action = moves.substring(i, i + 1);\n if (action === 'R') x++;\n if (action === 'L') x--;\n if (action === 'U') y++;\n if (action === 'D') y--;\n }\n\n return x === 0 && y === 0;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193447956","body":"## 題解\n- 一開始使用 Array + Sort 的方法實作,不過由於 Time Complexity 為 O(n^2logn),在資料量 1 <= n <= 10^5 的條件下,會沒辦法 AC\n- 需要將資料結構改成 Min Heap 來降低時間複雜度\n\n```javascript\n// Min Heap\n// Time Complexity: O(nlogn)\n// Space Complexity: O(logn)\n\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function (tasks) {\n const indices = Array.from({ length: tasks.length }, (_, i) => i);\n\n indices.sort((a, b) => { return tasks[a][0] - tasks[b][0] });\n\n const minHeap = new PriorityQueue((a, b) => {\n if (tasks[a][1] !== tasks[b][1]) {\n return tasks[a][1] - tasks[b][1];\n }\n return a - b;\n });\n\n const res = [];\n let time = 0;\n let i = 0;\n\n while (!minHeap.isEmpty() || i < tasks.length) {\n while (i < tasks.length && tasks[indices[i]][0] <= time) {\n minHeap.enqueue(indices[i]);\n i++;\n }\n\n if (minHeap.size() === 0) {\n time = tasks[indices[i]][0];\n } else {\n const nextIndex = minHeap.dequeue();\n time += tasks[nextIndex][1];\n res.push(nextIndex);\n }\n }\n\n return res;\n};\n\n// Array + Sort\n// Time Complexity: O(n^2logn)\n// Space Complexity: O(n)\n\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n tasks = tasks.map((t, i) => [...t, i]);\n tasks.sort((a, b) => a[0] === b[0] ? a[2] - b[2] : a[0] - b[0]);\n\n let i = 0;\n let curTime = 0;\n const queue = [];\n const res = [];\n\n while (i < tasks.length || queue.length) {\n while (i < tasks.length && tasks[i][0] <= curTime) {\n queue.push(tasks[i]);\n queue.sort((a, b) => a[1] === b[1] ? a[2] - b[2] : a[1] - b [1]);\n i++;\n }\n\n if (!queue.length) {\n curTime = tasks[i][0];\n } else {\n const curTask = queue.shift();\n res.push(curTask[2]);\n curTime += curTask[1];\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194091917","body":"```javascript\n// Time Complexity: O(1)\n// Space Complexity: O(1)\n\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n const getMinSum = (time, carry) => {\n let [hour, min] = time.split(':').map(s => Number(s));\n const remainer = min % 15;\n const q = (min - remainer) / 15;\n\n if (!carry) {\n return (hour * 60) + min;\n } else if (remainer && carry === 'ceil') {\n return (hour * 4 + q + 1) * 15;\n } else {\n return (hour * 4 + q) * 15;\n }\n };\n\n let [loginMinSum, logoutMinSum] = [getMinSum(loginTime, 'ceil'), getMinSum(logoutTime, 'floor')];\n\n if (getMinSum(loginTime) > getMinSum(logoutTime)) {\n logoutMinSum += 24 * 60;\n }\n\n return Math.max((logoutMinSum - loginMinSum) / 15, 0)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3196057927","body":"## 題解\n- 原本想針對三種狀況,直接找 a 和 b 中最符合的 char 來做計算,但會發現很多 edge case 要考量,要一直修正\n- 看題解之後,在有限的解空間中(頂多常數 26),枚舉的確是一個簡單、可讀性更好的做法\n\n```javascript\n// Time Complexity: O(n + m), n is a.length, m is b.length\n// Space Complexity: O(26)\n\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n const createCounter = (str) => {\n const counter = {};\n\n for (let i = 0; i < 26; i++) {\n counter[String.fromCharCode(97 + i)] = 0;\n }\n\n for (const char of str) {\n counter[char]++;\n }\n return counter;\n };\n \n const ca = createCounter(a);\n const cb = createCounter(b);\n\n const greaterCost = (ca, cb) => {\n let ans = Infinity;\n\n for (let i = 1; i < 26; i++) {\n let count = 0;\n \n for (let j = 0; j < i; j++) {\n count += ca[String.fromCharCode(97 + j)];\n }\n \n for (let j = i; j < 26; j++) {\n count += cb[String.fromCharCode(97 + j)];\n }\n ans = Math.min(ans, count);\n }\n return ans;\n };\n \n const equalCost = (ca, cb) => {\n let ans = Infinity;\n for (let i = 0; i < 26; i++) {\n const char = String.fromCharCode(97 + i);\n ans = Math.min(ans, a.length + b.length - ca[char] - cb[char]);\n }\n return ans;\n };\n \n return Math.min(\n greaterCost(ca, cb),\n greaterCost(cb, ca),\n equalCost(ca, cb)\n );\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199125049","body":"## 題解\n- 直覺就是用快速排序來做,不過實踐上,這次發現 partition 有兩種方法可以做:hoarePartition、lomutoPartition。其中 lomutoPartition 普遍認為較簡單,但因為交換數值的次數較多,會遇到 TLE,因此此題需用 hoarePartition 來做。\n\n```javascript\nconst lomutoPartition = (nums, left, right) => {\n const pivot = nums[right];\n let i = left - 1;\n\n for (let j = left; j < right; j++) {\n if (nums[j] <= pivot) {\n i++;\n [nums[i], nums[j]] = [nums[j], nums[i]];\n }\n }\n\n i++;\n [nums[i], nums[right]] = [nums[right], nums[i]];\n\n return i;\n};\n\nconst hoarePartition = (nums, left, right) => {\n const p = left + ((right - left) >>> 1);\n const pivot = nums[p];\n let [i, j] = [left, right];\n\n while (i <= j) {\n while (nums[i] < pivot) i++;\n while (nums[j] > pivot) j--;\n if (i <= j) {\n [nums[i], nums[j]] = [nums[j], nums[i]];\n i++;\n j--;\n }\n }\n\n return [i, j];\n};\n\nconst quickSort = (nums, left, right) => {\n // if (left < right) {\n // const p = lomutoPartition(nums, left, right);\n // quickSort(nums, left, p - 1);\n // quickSort(nums, p + 1, right);\n // }\n\n if (left < right) {\n const [i, j] = hoarePartition(nums, left, right);\n quickSort(nums, left, j);\n quickSort(nums, i, right);\n }\n};\n\n// Time Complexity: O(nlogn), n is nums.length\n// Space Complexity: O(logn)\n\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function (nums) {\n quickSort(nums, 0, nums.length - 1);\n return nums;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204182883","body":"```javascript\n// Time Complexity: O(logn)\n// Space Complexity: O(1)\n\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n let res = 0;\n let l = 0;\n let r = x;\n\n while (l <= r) {\n const m = l + ((r - l) >>> 2);\n\n if (m * m > x) {\n r = m - 1;\n } else {\n res = m;\n l = m + 1;\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3209343494","body":"## 題解\n- 可以將這題轉化成「尋找最左邊符合條件者」,即可套入模板\n\n```javascript\n// Time Complexity: O(logn)\n// Space Complexity: O(1)\n\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let [l, r] = [1, n];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 2);\n\n if (isBadVersion(m)) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n };\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3212999531","body":"## 題解\n- 二分:對於每一個元素前者排序,並找到大於 a * 2 者(重複 a * 2 的右界)。需注意是,應在每次加入新元素時,直接尋找其應該插入的位置,而非將整個陣列排序,不然會 TLE。\n\n```javascript\nclass SortedList {\n constructor() {\n this.arr = [];\n }\n\n bisectRight(target) {\n let [l, r] = [0, this.arr.length - 1];\n\n while (l <= r) {\n const mid = l + ((r - l) >>> 1);\n\n if (this.arr[mid] <= target) {\n l = mid + 1;\n } else {\n r = mid - 1;\n }\n }\n\n return l;\n }\n \n push(value) {\n const pos = this.bisectRight(value);\n this.arr.splice(pos, 0, value);\n }\n \n get length() {\n return this.arr.length;\n }\n}\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n const sortedRunningNums = new SortedList();\n sortedRunningNums.push(nums[0]);\n let ans = 0;\n\n for (let i = 1; i < nums.length; i++) {\n ans += (i - sortedRunningNums.bisectRight(nums[i] * 2));\n sortedRunningNums.push(nums[i]);\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216534944","body":"## 題解\n- 依序遍歷 houses,尋找每個 house 與 heater 最近距離,最大者為答案。其中尋找最近距離的實踐,可以使用 bisectRight 來做\n\n```javascript\n// Time Complexity: O(nlog m + mlog m), n is houses.length, m is heaters.length\n// Space Complexity: O(1)\n\nconst getHouseHeaterMinDistance = (house, heaters) => {\n if (heaters.length === 0) return Infinity;\n if (heaters.length === 1) return Math.abs(house - heaters[0]);\n\n let [l, r] = [0, heaters.length - 1];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (house === heaters[m]) {\n return 0;\n } else if (house > heaters[m]) {\n l = m + 1;\n } else {\n r = m - 1;\n };\n }\n\n const leftDistance = l === 0 ? Infinity : house - heaters[l - 1];\n const rightDistance = r === heaters.length - 1 ? Infinity : heaters[l] - house;\n\n return Math.min(leftDistance, rightDistance);\n};\n\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n heaters.sort((a, b) => a - b);\n\n let maxRadius = 0;\n\n for (const house of houses) {\n const minDistance = getHouseHeaterMinDistance(house, heaters);\n maxRadius = Math.max(maxRadius, minDistance);\n }\n\n return maxRadius;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217908480","body":"## 題解\n- 計數二分經典的題目,排序後解空間為 0 至 nums[lnums.ength - 1] - nums[0]\n\n```javascript\n// Time Complexity: O(nlogn)\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a, b) => a - b);\n\n const countDistanceNotGreaterThan = (maxDistance) => {\n let count = 0;\n let l = 0;\n\n for (let r = 1; r < nums.length; r++) {\n while (nums[r] - nums[l] > maxDistance) {\n l++;\n }\n\n count += r - l;\n }\n\n return count;\n };\n\n let [l, r] = [0, nums[nums.length - 1] - nums[0]];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (countDistanceNotGreaterThan(m) >= k) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218836123","body":"## 題解\n- 用二分在解空間 [0, maxElevation] 中尋找答案,對於每個可能的 m,再 dns 尋找可能路徑\n- 需注意因為 dns 時多了 grid[ni][nj] <= elevation 的條件,不需重置 visited[i][j],因為就算從其他點進來該點,依舊會沒辦法繼續走下去,與尋找所有路徑的 dns 略有不同\n\n```javascript\n// Time Complexity: O(n^2logn)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n const n = grid.length;\n\n const maxElevation = (() => {\n let e = 0;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n e = Math.max(e, grid[i][j]);\n }\n }\n return e;\n })();\n\n const canReachBottomRight = (elevation) => {\n const visited = Array.from({ length: n}).map(() => Array.from({ length: n }).map(() => false));\n\n const dns = (i, j) => {\n if (i === n - 1 && j === n - 1) return true;\n\n visited[i][j] = true;\n\n const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];\n\n for (const [di, dj] of directions) {\n const ni = i + di;\n const nj = j + dj;\n\n if (ni >= 0 && ni < n && nj >= 0 && nj < n) {\n if (!visited[ni][nj] && grid[ni][nj] <= elevation) {\n if (dns(ni, nj)) return true;\n }\n }\n }\n\n // visited[i][j] = false;\n\n return false;\n };\n\n if (grid[0][0] <= elevation) return dns(0, 0);\n else return false;\n };\n\n let l = 0;\n let r = maxElevation;\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (canReachBottomRight(m)) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222489820","body":"## 題解\n- 典型的 sliding window 題型\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(1)\n\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n const vowel = 'aeiou';\n let l = 0;\n let r = 0;\n let cur = 0;\n let max = cur;\n\n while (r < s.length) {\n if (vowel.includes(s.charAt(r))) cur++;\n r++;\n\n if (r - l > k) {\n if (vowel.includes(s.charAt(l))) cur--;\n l++;\n }\n\n max = Math.max(max, cur);\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3226683449","body":"```javascript\n// Time Complexity: O(k + maxPts)\n// Space Complexity: O(k + maxPts)\n\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n const dp = Array.from({ length: k + maxPts }).map(() => 0);\n let sum = 0;\n\n for (let i = k; i < k + maxPts; i++) {\n if (i <= n) dp[i] = 1;\n sum += dp[i];\n }\n\n for (let j = k - 1; j >= 0; j--) {\n dp[j] = sum / maxPts;\n sum -= dp[j + maxPts];\n sum += dp[j];\n }\n\n return dp[0];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3234016259","body":"```javascript\n// Time Complexity: O(n), n is s.length\n// Space COmplexity: O(1)\n\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nfunction findAnagrams(s, p) {\n function arraysEqual(arr1, arr2) {\n for (let i = 0; i < 26; i++) {\n if (arr1[i] !== arr2[i]) return false;\n }\n return true;\n }\n\n const result = [];\n const sLen = s.length;\n const pLen = p.length;\n \n if (sLen < pLen) return result;\n \n const pCount = new Array(26).fill(0);\n const windowCount = new Array(26).fill(0);\n \n for (let i = 0; i < pLen; i++) {\n pCount[p.charCodeAt(i) - 97]++;\n }\n \n let left = 0;\n \n for (let right = 0; right < sLen; right++) {\n const rightIndex = s.charCodeAt(right) - 97;\n windowCount[rightIndex]++;\n \n if (right - left + 1 > pLen) {\n const leftIndex = s.charCodeAt(left) - 97;\n windowCount[leftIndex]--;\n left++;\n }\n \n if (right - left + 1 === pLen) {\n if (arraysEqual(windowCount, pCount)) {\n result.push(left);\n }\n }\n }\n \n return result;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3237104151","body":"```javascript\n// Time Complexity: O(n + m), n is s.length, m is t.length\n// Space Complexity: O(k), k is different char count in t\n\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nfunction minWindow(s, t) {\n let l = 0;\n const counter = {};\n const N = s.length;\n const ct = {};\n \n for (let char of t) {\n ct[char] = (ct[char] || 0) + 1;\n }\n \n let k = 0;\n let ret = Infinity;\n let ans = \"\";\n \n for (let r = 0; r < N; r++) {\n counter[s[r]] = (counter[s[r]] || 0) + 1;\n \n if (s[r] in ct && counter[s[r]] === ct[s[r]]) {\n k++;\n }\n \n while (k === Object.keys(ct).length) {\n if (r - l + 1 < ret) {\n ans = s.substring(l, r + 1);\n ret = r - l + 1;\n }\n \n counter[s[l]]--;\n if (s[l] in ct && counter[s[l]] === ct[s[l]] - 1) {\n k--;\n }\n l++;\n }\n }\n \n return ans;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3239924106","body":"```javascript\n// Time Complexity: O(1)\n// Space Complexity: O(1)\n\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n const countBits = (num) => {\n let count = 0;\n while (num) {\n count += num & 1;\n num >>= 1;\n }\n return count;\n };\n\n const res = [];\n\n for (let hour = 0; hour < 12; hour++) {\n for (let minute = 0; minute < 60; minute++) {\n if ((countBits(hour) + countBits(minute)) === turnedOn) {\n const formattedMinute = minute < 10 ? `0${minute}` : `${minute}`\n res.push(`${hour}:${formattedMinute}`);\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240825737","body":"```javascript\n// Time Complexity: O(n!)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n\n const backtrack = (row, cols, dias1, dias2) => {\n if (row === n) {\n count++;\n return;\n }\n\n let availablePostions = ((1 << n) - 1) & (~(cols | dias1 | dias2));\n\n while (availablePostions) {\n const position = availablePostions & (-availablePostions);\n availablePostions &= availablePostions - 1;\n\n backtrack(\n row + 1,\n cols | position,\n (dias1 | position) << 1,\n (dias2 | position) >> 1,\n );\n }\n };\n\n backtrack(0, 0, 0, 0);\n\n return count;\n};\n\n// Time Complexity: O(n!)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n const cols = new Array(n).fill(false);\n const dias1 = new Array(2 * n - 1).fill(false); // row - col\n const dias2 = new Array(2 * n - 1).fill(false); // row + col\n\n const backtrack = (row) => {\n if (row === n) {\n count++;\n return;\n }\n\n for (let col = 0; col < n; col++) {\n const d1 = row - col + n - 1;\n const d2 = row + col;\n\n if (cols[col] || dias1[d1] || dias2[d2]) continue;\n\n cols[col] = dias1[d1] = dias2[d2] = true;\n backtrack(row + 1);\n cols[col] = dias1[d1] = dias2[d2] = false;\n }\n };\n\n backtrack(0);\n\n return count;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245083899","body":"## 題解\n- 遍歷每個 (i, j) 進行 dfs,遇到邊界或 grid[i][j] === 0 者即返回 0,反之則返回 1 加四個方向 dns 的結果\n- 優化:訪問過者可將原 grid[i][j] 改成 0,如此便不需要重新宣告一個空間來存取\n\n```javascript\n// Time Complexity: O(m * n)\n// Space Complexity: O(m * n)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n const [m, n] = [grid.length, grid[0].length];\n const direction = [[1, 0], [-1, 0], [0, 1], [0, -1]];\n let max = 0;\n\n const dfs = (x, y) => {\n if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y]) {\n grid[x][y] = 0;\n\n let area = 1;\n\n for (const [dx, dy] of direction) {\n area += dfs(x + dx, y + dy);\n }\n\n return area;\n }\n\n return 0;\n };\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n max = Math.max(max, dfs(i, j));\n }\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249843138","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nfunction maxDistance(grid) {\n const n = grid.length;\n const queue = [];\n \n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n queue.push([i, j, 0]);\n }\n }\n }\n \n if (queue.length === 0 || queue.length === n * n) {\n return -1;\n }\n \n const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];\n let maxDist = 0;\n \n while (queue.length > 0) {\n const [x, y, dist] = queue.shift();\n maxDist = Math.max(maxDist, dist);\n \n for (const [dx, dy] of directions) {\n const nx = x + dx;\n const ny = y + dy;\n \n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] === 0) {\n grid[nx][ny] = 1;\n queue.push([nx, ny, dist + 1]);\n }\n }\n }\n \n return maxDist;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251291240","body":"```javascript\n// Time Complexity: O(n + k), n is candies.length, k is number of keys\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n const boxes = new Set(initialBoxes);\n const q = [];\n \n for (const i of boxes) {\n if (status[i]) {\n q.push(i);\n }\n }\n \n for (let idx = 0; idx < q.length; idx++) {\n const i = q[idx];\n \n for (const j of containedBoxes[i]) {\n boxes.add(j);\n if (status[j]) {\n q.push(j);\n }\n }\n \n for (const j of keys[i]) {\n if (status[j] === 0 && boxes.has(j)) {\n q.push(j);\n }\n status[j] = 1;\n }\n }\n \n return q.reduce((sum, i) => sum + candies[i], 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3258808498","body":"```javascript\n// Time Complexity: O(nlogn), n is the number of tree.\n// Space Complexity: O(n), n is the number of tree.\n\n// /**\n// * Definition for a binary tree node.\n// * function TreeNode(val, left, right) {\n// * this.val = (val===undefined ? 0 : val)\n// * this.left = (left===undefined ? null : left)\n// * this.right = (right===undefined ? null : right)\n// * }\n// */\n// /**\n// * @param {TreeNode} root\n// * @return {number[][]}\n// */\nvar verticalTraversal = function(root) {\n const map = {};\n\n const traverse = (root, row, col) => {\n if (!root) return;\n\n if (!map[col]) {\n map[col] = [];\n }\n\n map[col].push([row, root.val]);\n traverse(root.left, row + 1, col - 1);\n traverse(root.right, row + 1, col + 1);\n };\n\n traverse(root, 0, 0);\n\n const keys = Object.keys(map).sort((a, b) => a - b);\n\n const res = keys.map((k) => {\n const arr = map[k];\n\n return arr.sort(([rowA, valA], [rowB, valB]) => {\n if (rowA === rowB) return valA - valB;\n return rowA - rowB;\n }).map(([,val]) => val);\n });\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3262161616","body":"## 題解\n- 重點是找到 dp 的關鍵核心 d[i] = Math.min(d[i - 1] + cost[i], d[i - 2] + cost[i]);\n- 需注意 cost[i] 為空值的情況\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} cost\n * @return {number}\n */\nvar minCostClimbingStairs = function(cost) {\n const n = cost.length;\n const d = [];\n\n d[0] = cost[0];\n d[1] = Math.min(d[0] + cost[1], cost[1]);\n\n for (let i = 2; i <= n; i++) {\n const c = cost[i] ?? 0;\n d[i] = Math.min(d[i - 1] + c, d[i - 2] + c);\n }\n\n return d[n];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263843103","body":"## 解題\n- 一樣需要去辨認 dp 的關係式,d[i] = Math.max(d[i - 1], d[i - 2] + nums[i])\n- 需要特別注意 n 為 1, 2 的 edge case \n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar rob = function(nums) {\n const n = nums.length;\n\n if (n === 1) return nums[0];\n if (n === 2) return Math.max(nums[0], nums[1]);\n\n const d = [];\n\n d[0] = nums[0];\n d[1] = Math.max(nums[0], nums[1]);\n\n for (i = 2; i < n; i++) {\n d[i] = Math.max(d[i - 1], d[i - 2] + nums[i])\n }\n\n return d[n - 1];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3266927805","body":"```javascript\n// Time Complexity: O(n^2), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findNumberOfLIS = function(nums) {\n const n = nums.length;\n const dp = Array(n).fill(null).map(() => [1, 1]);\n let longest = 1;\n \n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n if (nums[j] > nums[i]) {\n if (dp[i][0] + 1 > dp[j][0]) {\n dp[j][0] = dp[i][0] + 1;\n dp[j][1] = dp[i][1];\n longest = Math.max(longest, dp[j][0]);\n } else if (dp[i][0] + 1 === dp[j][0]) {\n dp[j][1] += dp[i][1];\n }\n }\n }\n }\n \n return dp.reduce((sum, [length, count]) => {\n return length === longest ? sum + count : sum;\n }, 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3270111521","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n)\n\n/**\n * @param {string} text1\n * @param {string} text2\n * @return {number}\n */\nvar longestCommonSubsequence = function(text1, text2) {\n const [n, m] = [text1.length, text2.length];\n const dp = Array.from({ length: n + 1 }).map(() => new Array(m + 1).fill(0));\n let res = 0;\n\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n if (text1.charAt(i - 1) === text2.charAt(j - 1)) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n res = Math.max(res, dp[i][j]);\n } else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273250794","body":"## 題解\n- dp 的遞增式為 `d[i][j] = d[i - 1][j] + d[i][j - 1];`,意思是,dp[i][j] 表示能到達該格子的路線數量,其為 d[i - 1][j] 和 d[i][j - 1] 的總和(從其左或其上格子來)\n- 其中需注意當 i 或 j 為 0,即最上或最左列的格子,其 d[i][j] 值為 1,因為只可能從其上或其左格子而來\n\n```javascript\n// Time Complexity: O(m * n)\n// Space Complexity: O(m * n)\n\n/**\n * @param {number} m\n * @param {number} n\n * @return {number}\n */\nvar uniquePaths = function(m, n) {\n const d = Array.from({ length: m }).map(() => new Array(n).fill(1));\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (i !== 0 && j !== 0) {\n d[i][j] = d[i - 1][j] + d[i][j - 1];\n }\n }\n }\n\n return d[m - 1][n - 1];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3279921315","body":"```javascript\n// Time Complexity: O(n^2 * k)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} row\n * @param {number} column\n * @return {number}\n */\nvar knightProbability = function(n, k, row, column) {\n let dp = Array.from({ length: n }, () => new Array(n).fill(0));\n const directions = [[2, 1], [1, 2], [-1, 2], [-2, 1], [-2, -1], [-1, -2], [1, -2], [2, -1]];\n\n dp[row][column] = 1;\n\n for (let step = 0; step < k; step++) {\n let dpTemp = Array.from({ length: n }, () => new Array(n).fill(0));\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n for (const [dx, dy] of directions) {\n const [px, py] = [i - dx, j - dy];\n\n if (px >= 0 && px < n && py >= 0 && py < n) {\n dpTemp[i][j] += dp[px][py] * 0.125;\n }\n }\n }\n }\n\n dp = dpTemp;\n }\n\n let sumProp = 0;\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n sumProp += dp[i][j];\n }\n }\n\n return sumProp;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3285364984","body":"```javascript\n/**\n * @param {number} maxChoosableInteger\n * @param {number} desiredTotal\n * @return {boolean}\n */\nvar canIWin = function(maxChoosableInteger, desiredTotal) {\n if (maxChoosableInteger >= desiredTotal) {\n return true;\n }\n \n const totalSum = (maxChoosableInteger * (maxChoosableInteger + 1)) / 2;\n if (totalSum < desiredTotal) {\n return false;\n }\n \n const memo = new Map();\n \n const dfs = (used, currentSum) => {\n if (memo.has(used)) {\n return memo.get(used);\n }\n \n for (let i = 1; i <= maxChoosableInteger; i++) {\n const bit = 1 << (i - 1);\n \n if ((used & bit) === 0) {\n if (currentSum + i >= desiredTotal) {\n memo.set(used, true);\n return true;\n }\n \n if (!dfs(used | bit, currentSum + i)) {\n memo.set(used, true);\n return true;\n }\n }\n }\n \n memo.set(used, false);\n return false;\n };\n \n return dfs(0, 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3288487076","body":"```javascript\n// Time Complexity: O(n * k), n is nums.length, k is sum of nums / 2\n// Space Complexity: O(n * k)\n\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canPartition = function (nums) {\n let sum = nums.reduce((acc, num) => acc + num, 0);\n\n if (sum % 2) return false;\n else sum = sum / 2;\n\n const dp = Array.from(nums).map(() => Array.from({ length: sum + 1 }).fill(false));\n\n for (let i = 0; i < nums.length; i++) {\n dp[i][0] = true;\n }\n\n for (let i = 0; i < dp.length - 1; i++) {\n for (let j = 0; j < dp[0].length; j++) {\n dp[i + 1][j] = j - nums[i] >= 0 ? dp[i][j] || dp[i][j - nums[i]] : dp[i][j];\n }\n }\n\n return dp[nums.length - 1][sum];\n};\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289632643","body":"```javascript\n// Time Complexity: O(n * k), n is nums.length, k is sum of nums\n// Space Complexity: O(k)\n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar findTargetSumWays = function(nums, target) {\n const total = nums.reduce((sum, num) => sum + num, 0);\n \n if (Math.abs(target) > total || (total + target) % 2 !== 0) {\n return 0;\n }\n \n const sum = (total + target) / 2;\n const dp = new Array(sum + 1).fill(0);\n dp[0] = 1;\n \n for (const num of nums) {\n for (let j = sum; j >= num; j--) {\n dp[j] += dp[j - num];\n }\n }\n \n return dp[sum];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3292845699","body":"```javascript\n/**\n * @param {number[]} coins\n * @param {number} amount\n * @return {number}\n */\nvar coinChange = function(coins, amount) {\n const dp = new Array(amount + 1).fill(Infinity);\n\n dp[0] = 0;\n\n for (i = 1; i <= amount; i += 1) {\n for (const coin of coins) {\n if (i - coin >= 0 && dp[i - coin] !== Infinity) {\n dp[i] = Math.min(dp[i - coin] + 1, dp[i]);\n }\n }\n }\n\n return dp[amount] === Infinity ? -1 : dp[amount];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3297467048","body":"```javascript\n// Time Complexity: O(n * m), n is amount, m is coins.length\n// Space Complexity: O(n)\n\n/**\n * @param {number} amount\n * @param {number[]} coins\n * @return {number}\n */\nvar change = function(amount, coins) {\n const dp = new Array(amount + 1).fill(0);\n dp[0] = 1;\n\n for (const coin of coins) {\n for (let i = coin; i <= amount; i++) {\n dp[i] += dp[i - coin];\n }\n }\n \n return dp[amount];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3303059077","body":"## 題解\n- 先排序,以 g[j] 為主,遍歷符合的 s[i]\n```javascript\n// Time Complexity: O(nlogn + mlogm), n is g.length, m is s.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} g\n * @param {number[]} s\n * @return {number}\n */\nvar findContentChildren = function(g, s) {\n g.sort((a, b) => a - b);\n s.sort((a, b) => a - b);\n\n let [i, j] = [0, 0];\n let ans = 0;\n\n while (i < s.length && j < g.length) {\n if (s[i] >= g[j]) {\n ans++;\n j++;\n }\n\n i++;\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3307711246","body":"```javascript\n// Time Complexity: O(nlogn)\n// Space Complexity: O(1)\n\n/**\n * @param {number[][]} intervals\n * @return {number}\n */\nfunction eraseOverlapIntervals(intervals) {\n if (intervals.length <= 1) return 0;\n \n intervals.sort((a, b) => a[1] - b[1]);\n \n let count = 0;\n let end = intervals[0][1];\n \n for (let i = 1; i < intervals.length; i++) {\n if (intervals[i][0] < end) {\n count++;\n } else {\n end = intervals[i][1];\n }\n }\n \n return count;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3311687568","body":"```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canJump = function (nums) {\n let max = 0;\n\n for (let i = 0; i < nums.length; i++) {\n if (max < i) return false;\n\n max = Math.max(nums[i] + i, max);\n }\n\n return max >= nums.length - 1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/71#issuecomment-3314986282","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nconst memories = {};\nvar numTrees = function(n) {\n if (memories[n] !== undefined) return memories[n];\n if (n <= 1) return 1;\n\n let ans = 0;\n\n for (let i = 1; i <= n; i++) {\n ans += numTrees(i - 1) * numTrees(n - i);\n }\n\n memories[n] = ans;\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316043984","body":"```javascript\n// Time Complexity: O(nlogk), n is total number of nodes across all lists, k is number of lists\n// Space Complexity: O(1)\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode[]} lists\n * @return {ListNode}\n */\nvar mergeKLists = function(lists) {\n if (!lists || lists.length === 0) return null;\n \n while (lists.length > 1) {\n let mergedLists = [];\n \n for (let i = 0; i < lists.length; i += 2) {\n let l1 = lists[i];\n let l2 = i + 1 < lists.length ? lists[i + 1] : null;\n mergedLists.push(mergeTwoLists(l1, l2));\n }\n \n lists = mergedLists;\n }\n \n return lists[0];\n};\n\nfunction mergeTwoLists(l1, l2) {\n let dummy = new ListNode(0);\n let current = dummy;\n \n while (l1 && l2) {\n if (l1.val <= l2.val) {\n current.next = l1;\n l1 = l1.next;\n } else {\n current.next = l2;\n l2 = l2.next;\n }\n current = current.next;\n }\n \n current.next = l1 || l2;\n return dummy.next;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3324003764","body":"```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar singleNumber = function(nums) {\n let bitmask = 0;\n\n for (let n of nums) {\n bitmask ^= n;\n }\n\n bitmask &= -bitmask;\n\n const ans = [0, 0];\n\n for (let n of nums) {\n if ((n & bitmask) === 0) ans[0] ^= n;\n else ans[1] ^= n;\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3327535650","body":"```javascript\n// Time Complexity: O(n * 2^n)\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number[][]}\n */\nfunction subsets(nums) {\n const result = [];\n \n function backtrack(start, current) {\n result.push([...current]);\n \n for (let i = start; i < nums.length; i++) {\n current.push(nums[i]);\n backtrack(i + 1, current);\n current.pop();\n }\n }\n \n backtrack(0, []);\n return result;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3338173897","body":"```javascript\n// Time Complexity\n// - insert: O(k), k is key.length\n// - searchValue: O(k), k is key.length\n// - sum: O(p), p is prefix.length\n\n// Space Complexity: O(n * m), n is the number of unique keys inserted, m is the average length of the keys\n\nclass MapSum {\n constructor() {\n this.root = new TrieNode();\n }\n \n insert(key, val) {\n let temp = this.root;\n \n let oldVal = this.searchValue(key);\n \n for (let i = 0; i < key.length; i++) {\n if (temp.children[key.charCodeAt(i) - 97] == null)\n temp.children[key.charCodeAt(i) - 97] = new TrieNode();\n \n temp = temp.children[key.charCodeAt(i) - 97];\n \n temp.count = temp.count - oldVal + val;\n }\n \n temp.val = val;\n temp.isWord = true;\n }\n\n searchValue(key) {\n let temp = this.root;\n for (let i = 0; i < key.length; i++) {\n if (temp.children[key.charCodeAt(i) - 97] == null)\n return 0;\n \n temp = temp.children[key.charCodeAt(i) - 97];\n }\n \n return temp.isWord ? temp.val : 0;\n }\n\n sum(prefix) {\n let temp = this.root;\n \n for (let i = 0; i < prefix.length; i++) {\n if (temp.children[prefix.charCodeAt(i) - 97] == null)\n return 0;\n \n temp = temp.children[prefix.charCodeAt(i) - 97];\n }\n \n return temp.count;\n }\n}\n\nclass TrieNode {\n constructor() {\n this.count = 0;\n this.children = new Array(26);\n this.isWord = false;\n this.val = 0;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/78#issuecomment-3341802963","body":"```javascript\n// Time Complexity: O(n*m + b*b + n)\n// - Building Trie: O(n*m) where n = number of smalls, m = average length of smalls\n// - Searching: O(b*b) where b = length of big string (worst case: check every position against every possible substring)\n// - Converting result: O(n)\n\n// Space Complexity: O(n*m + n*k)\n// - Trie storage: O(n*m) for storing all small strings\n// - Result storage: O(n*k) where k = average number of matches per small string\n\n\nclass Node {\n constructor() {\n this.children = new Array(26).fill(null);\n this.isWord = false;\n this.id = 0;\n }\n}\n\nclass Solution {\n constructor() {\n this.root = new Node();\n }\n\n multiSearch(big, smalls) {\n const n = smalls.length;\n const res = Array(n).fill().map(() => []);\n \n for (let i = 0; i < smalls.length; i++) {\n this.insert(smalls[i], i);\n }\n\n for (let i = 0; i < big.length; i++) {\n let tmp = this.root;\n\n for (let j = i; j < big.length; j++) {\n if (tmp.children[big.charCodeAt(j) - 97] === null) {\n break;\n }\n\n tmp = tmp.children[big.charCodeAt(j) - 97];\n\n if (tmp.isWord) {\n res[tmp.id].push(i);\n }\n }\n }\n\n const ret = new Array(n);\n\n for (let i = 0; i < n; i++) {\n ret[i] = new Array(res[i].length);\n for (let j = 0; j < ret[i].length; j++) {\n ret[i][j] = res[i][j];\n }\n }\n\n return ret;\n }\n\n insert(word, id) {\n let tmp = this.root;\n\n for (let i = 0; i < word.length; i++) {\n if (tmp.children[word.charCodeAt(i) - 97] === null) {\n tmp.children[word.charCodeAt(i) - 97] = new Node();\n }\n\n tmp = tmp.children[word.charCodeAt(i) - 97];\n }\n\n tmp.isWord = true;\n tmp.id = id;\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wutxuan":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073568207","body":"第一次思路:将num数组转换为int数字A,计算A+K,将A+K结果转换为List类型,但没有观察数据范围,导致int类型溢出,没有通过全部样例\n第二次思路:从后往前,逐位相加K%10,直到遍历完全部数组,再判断K是否还有,通过全部样例\n第三次思路:看完题解后,学习到了可以将k和某一位看作一个整体,不用每次计算k%10,而是k+num[i]","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078154786","body":"第一次思路:遍历每个字符,在每个字符上向左向右移动,直到找到字符c,继续遍历下一个字符,但想到时间复杂度一定很高,因此继续想其他方法\n\n第二次思路:先遍历字符串,用List先记录每个字符c的索引。然后遍历字符串每个字符,计算这个字符的位置距离List中位置的最小距离,通过全部用例,时间复杂度O(N*K) N为字符串长度,K为c在字符串中出现的次数\n\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n List indexList = new ArrayList<>();\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == c){\n indexList.add(i);\n }\n }\n\n int[] res = new int[s.length()];\n Arrays.fill(res,10001);\n for(int i = 0;i < res.length;i++){\n for(int index : indexList){\n res[i] = Math.min(res[i],Math.abs(i - index));\n }\n \n }\n return res;\n }\n}\n\n```\n第三次思路:看完题解后,学习到了两次遍历求解,从左到右记录每个字符左侧最近的字符c的距离,记为left数组,从右到左记录每个字符右侧最近的字符c的距离,记为right数组。再遍历一遍整个字符串,在left数组和right数组中取最小值为最终结果。在代码实现时,省去了记录right数组再比较,而是直接比较。时间复杂度O(N)\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n int index = -s.length();\n int[] left = new int[s.length()];\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == c){\n index = i;\n }\n left[i] = i - index;\n }\n\n index = 2 * s.length();\n for(int i = s.length() - 1;i >= 0;i--){\n if(s.charAt(i) == c){\n index = i;\n }\n left[i] = Math.min(left[i],index - i);\n }\n return left;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3083567541","body":"因为要设计的栈有最大长度,因此使用数组来模拟栈。否则使用栈或List来模拟。\n使用数组模拟:使用一个指针变量,指向当前栈顶。入栈时,val存入栈顶处,指针++,出栈时,指针- -,返回栈顶元素。实现inc函数时,只需要对数组中0-k位置的数每个+val即可。通过全部样例\n```java\nclass CustomStack {\n int size = 0; // 指向第一个空位置\n int[] arr;\n\n public CustomStack(int maxSize) {\n arr = new int[maxSize];\n }\n \n public void push(int x) {\n if(size < arr.length){\n arr[size] = x;\n size++;\n }\n }\n \n public int pop() {\n if(size > 0){\n size--;\n return arr[size];\n }else{\n return -1;\n }\n }\n \n public void increment(int k, int val) {\n int cut = Math.min(k,size);\n\n for(int i = 0;i < cut;i++){\n arr[i] += val;\n }\n }\n}\n```\n\n看完题解后学会了前缀和方法:- 因为每次的increment函数都会对栈底[0,k]的数据val操作,而是否val操作了只有在pop时才会体现。所以我们可以通过一个数组incremental记录每个val,即第i位置下面的元素都要加incremental[i]。在pop第i个数的时候加上它需要加的所有val,即incremental[i]。 所以increment函数只需要维护incremental数组。但要记得记得pop后,incremental函数用过的地方要清零,并且得累加到前面一位\n\n```java\nclass CustomStack {\n\n Stack stack;\n int[] incremental;\n\n public CustomStack(int maxSize) {\n stack = new Stack();\n incremental = new int[maxSize];\n }\n \n public void push(int x) {\n if(stack.size() < incremental.length){\n stack.push(x);\n }\n }\n \n public int pop() {\n int cut = stack.size() - 1;\n if(cut < 0) return -1;\n\n int res = stack.pop() + incremental[cut];\n\n if(cut > 0){\n incremental[cut-1] += incremental[cut]; \n }\n incremental[cut] = 0;\n return res;\n\n }\n \n public void increment(int k, int val) {\n int cut = Math.min(k,stack.size())-1;\n if(cut >= 0){\n incremental[cut] += val;\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089071815","body":"看到有括号,需要对括号匹配,则优先想到栈。遍历字符串,当遇到非】字符时,全部入栈。当遇到】字符时,开始向回看,取出字符c,构成字符串s。再向回看,取出数字x,重复x次字符串s得到字符串ss,再将ss入栈,继续遍历,直到遍历结束。\n \n最后得到的栈,就是存储了最终解码后的字符串。取出栈后记得反转字符串\n```java\nclass Solution {\n public String decodeString(String s) {\n Stack stack = new Stack<>();\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == ']'){\n StringBuilder sb = new StringBuilder();\n StringBuilder count = new StringBuilder();\n\n while(!stack.isEmpty() && stack.peek() != '['){\n sb.append(stack.pop());\n } \n sb.reverse();\n stack.pop();\n while(!stack.isEmpty() && stack.peek() >= '0' && stack.peek() <= '9'){\n count.append(stack.pop());\n }\n count.reverse();\n int t = Integer.valueOf(count.toString());\n StringBuilder res = new StringBuilder();\n res.repeat(sb,t);\n\n for(char c : res.toString().toCharArray()){\n stack.push(c);\n }\n \n }else{\n stack.push(s.charAt(i));\n }\n }\n StringBuilder re = new StringBuilder();\n while(!stack.isEmpty()){\n re.append(stack.pop());\n }\n re.reverse();\n return re.toString();\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3095194789","body":"- push操作:输入栈入栈\n- pop操作:如果输出栈不为空,则直接输出输出栈的元素。如果输出栈为空,则把输入栈的数据全部导入到输出栈中\n- peek操作:如果输出栈不为空,则直接peek输出栈的元素。如果输出栈为空,则把输入栈的数据全部导出到输入栈中\n```java\nclass MyQueue {\n Stack stackIn;\n Stack stackOut;\n\n public MyQueue() {\n stackIn = new Stack<>();\n stackOut = new Stack<>();\n }\n \n public void push(int x) {\n stackIn.push(x);\n }\n \n public int pop() {\n refresh();\n return stackOut.pop();\n }\n \n public int peek() {\n refresh();\n return stackOut.peek();\n }\n \n public boolean empty() {\n return stackIn.isEmpty() && stackOut.isEmpty();\n }\n\n public void refresh(){\n if(!stackOut.isEmpty()){\n return;\n }\n while(!stackIn.isEmpty()){\n stackOut.push(stackIn.pop());\n }\n }\n}\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094513644","body":"想象成将原始数组和排序后的数组并列排在一起,切一刀。如果这刀的左侧两个数组的数字出现的频次相同,那么右侧的频次也一定相同。这里就是一个分割点。\n继续向右,有同样情况就切一刀。直到走到最后,一定会切最后一刀。记录的每一个分割点,就是分的组数。\n```java\nclass Solution {\n public int maxChunksToSorted(int[] arr) {\n Map map = new HashMap<>();\n int[] sortedArr = new int[arr.length];\n for(int i = 0;i < arr.length;i++){\n sortedArr[i] = arr[i];\n }\n Arrays.sort(sortedArr);\n\n int res = 0;\n for(int i = 0;i < arr.length;i++){\n map.put(arr[i],map.getOrDefault(arr[i],0) + 1);\n if(map.get(arr[i]) == 0){\n map.remove(arr[i]);\n }\n map.put(sortedArr[i],map.getOrDefault(sortedArr[i],0) - 1);\n if(map.get(sortedArr[i]) == 0){\n map.remove(sortedArr[i]);\n }\n if(map.isEmpty()){\n res++;\n }\n }\n return res;\n }\n}\n```\n因为存在sort排序,时间复杂度O(NlogN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095217604","body":"先将链表连成一个环,再找到需要断开的位置断开即可\n```java\nclass Solution {\n public ListNode rotateRight(ListNode head, int k) {\n if(head == null) return null;\n ListNode dummy = head;\n int count = 1;\n while(dummy.next != null){\n count++;\n dummy = dummy.next;\n }\n dummy.next = head;\n\n k = k % count;\n dummy = head;\n count = count - k;\n for(int i = 1;i < count;i++){\n dummy = dummy.next;\n }\n ListNode res = dummy.next;\n dummy.next = null;\n return res;\n }\n}\n```\n\n因为遍历了链表,时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100949135","body":"因为要交换两个节点,所以需要记录两个节点+两个节点前的节点+两个节点后的节点,一共四个节点。分别用cur,one,two,three记录\n交换完后,cur指向下一组需要交换节点的前一个节点\n```java\nclass Solution {\n public ListNode swapPairs(ListNode head) {\n ListNode dummy = new ListNode(0);\n dummy.next = head;\n ListNode cur = dummy;\n ListNode one = null;\n ListNode two = null;\n ListNode three = null;\n while(cur.next != null && cur.next.next != null)\n {\n one = cur.next;\n two = cur.next.next;\n three = cur.next.next.next;\n cur.next = two;\n cur.next.next = one;\n cur.next.next.next = three;\n cur = cur.next.next;\n }\n return dummy.next;\n }\n}\n```\n遍历了链表,时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105789931","body":"考验的是二分查找和分治构建二叉树,中间大小的数构成root根节点,左侧的数组部分分治构成左节点,右侧的数组部分分治构成右节点。这里用的是链表,只需要额外增加一些链表的操作(getMid函数)。也可以将链表转化为数组,再构造,查找起来就很快。以空间换时间\n```java\nclass Solution {\n public TreeNode sortedListToBST(ListNode head) {\n ListNode dummy = head;\n int end = 0;\n while(head != null){\n end++;\n head = head.next;\n }\n\n return dfs(dummy,0,end);\n }\n\n public TreeNode dfs(ListNode head,int start,int end){\n if(start >= end) return null;\n int mid = start + (end - start) / 2;\n ListNode midNode = getMid(head,mid);\n TreeNode node = new TreeNode(midNode.val);\n node.left = dfs(head,start,mid);\n node.right = dfs(head,mid+1,end);\n\n return node;\n }\n \n public ListNode getMid(ListNode head,int mid){\n while(mid > 0){\n mid--;\n head = head.next;\n }\n return head;\n }\n}\n```\n时间复杂度O(NlogN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111943009","body":"两个指针从head出发同时往前移动,当某一个指针指向null的时候,使其指向另一个head。直至两个指针相遇,该节点为相遇节点。直到相遇,第一个指针走了A+C+B的路程,另一个指针走了B+C+A的路程\n```java\npublic class Solution {\n public ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n ListNode A = headA;\n ListNode B = headB;\n while(A != B)\n {\n if(A == null) A = headB;\n else A = A.next;\n if(B == null) B = headA;\n else B = B.next;\n }\n return A;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116973002","body":"- 判断是否有环:两个快慢指针分别从头节点出发,慢指针一次走一格,快指针一次走两个,如果有环,则二者一定会在环内相遇,如果没环,则快指针会先到达null处。可以类比于跑步,跑得快的会套跑的慢的一圈\n- 判断环入口:快指针和慢指针相遇的时候,慢指针走了x+y步,快指针走了x+y+n*(y+z)步骤,n为圈数,大于等于1,如图所示,图片节选自代码随想录。因为快指针是慢指针的两倍速,所以2x+2y=x+y+n*(y+z)。化简后发现当n=1时,x=z,当n大于1时,x=z+(n-1)(y+z)。也就是说,头节点到环入口的距离等于z或z+多圈。因此,用两个指针,一个从头节点出发,一个从相遇节点出发,最终一定会相遇在环入口,无论第二个指针在环里绕了多少圈\n```java\npublic class Solution {\n public ListNode detectCycle(ListNode head) {\n ListNode fast = head;\n ListNode slow = head;\n while(fast != null && fast.next != null)\n {\n slow = slow.next;\n fast = fast.next.next;\n if(slow == fast){\n ListNode index1 = head;\n ListNode index2 = slow;\n while(index1 != index2)\n {\n index1 = index1.next;\n index2 = index2.next;\n }\n return index1;\n }\n }\n return null;\n }\n}\n```\n时间复杂度O(N) 空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121046113","body":"Java可以使用LinkedHashMap实现LRU,内置的函数就可以实现按插入顺序排列的hashmap,手动实现LinkedHashMap代码如下:\n```java\npublic class LRUCache {\n class DLinkedNode {\n int key;\n int value;\n DLinkedNode prev;\n DLinkedNode next;\n public DLinkedNode() {}\n public DLinkedNode(int _key, int _value) {key = _key; value = _value;}\n }\n\n private Map cache = new HashMap();\n private int size;\n private int capacity;\n private DLinkedNode head, tail;\n\n public LRUCache(int capacity) {\n this.size = 0;\n this.capacity = capacity;\n head = new DLinkedNode();\n tail = new DLinkedNode();\n head.next = tail;\n tail.prev = head;\n }\n\n public int get(int key) {\n DLinkedNode node = cache.get(key);\n if (node == null) {\n return -1;\n }\n moveToHead(node);\n return node.value;\n }\n\n public void put(int key, int value) {\n DLinkedNode node = cache.get(key);\n if (node == null) {\n DLinkedNode newNode = new DLinkedNode(key, value);\n cache.put(key, newNode);\n addToHead(newNode);\n ++size;\n if (size > capacity) {\n DLinkedNode tail = removeTail();\n cache.remove(tail.key);\n --size;\n }\n }\n else {\n node.value = value;\n moveToHead(node);\n }\n }\n\n private void addToHead(DLinkedNode node) {\n node.prev = head;\n node.next = head.next;\n head.next.prev = node;\n head.next = node;\n }\n\n private void removeNode(DLinkedNode node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n }\n\n private void moveToHead(DLinkedNode node) {\n removeNode(node);\n addToHead(node);\n }\n\n private DLinkedNode removeTail() {\n DLinkedNode res = tail.prev;\n removeNode(res);\n return res;\n }\n}\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123845190","body":"递归,每一层返回max(左子树深度,右子树深度)+1\n```java\nclass Solution {\n public int maxDepth(TreeNode root) {\n if (root == null) {\n return 0;\n }\n int leftDepth = maxDepth(root.left);\n int rightDepth = maxDepth(root.right);\n return Math.max(leftDepth, rightDepth) + 1;\n }\n}\n```\n层序遍历,使用队列。每遍历一层,深度+1,直到遍历到最下面一层\n\n```java\nclass Solution {\n public int maxDepth(TreeNode root) {\n if(root == null) return 0;\n Queue queue = new LinkedList<>();\n queue.add(root);\n int depth = 0;\n while(!queue.isEmpty())\n {\n int size = queue.size();\n for(int i = 0;i < size;i++){\n TreeNode node = queue.poll();\n if(node.left != null) queue.add(node.left);\n if(node.right != null) queue.add(node.right);\n }\n depth++;\n }\n\n return depth;\n }\n}\n```\n时间复杂度O(N) N为二叉树节点个数","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125223416","body":"先判断当前两个节点是否相同,如果不同,直接返回false。如果相同无法得出最终结论,需要递归进入下一层继续判断子树\n```java\nclass Solution {\n public boolean isSameTree(TreeNode p, TreeNode q) {\n if(p == null && q != null) return false;\n if(p != null && q == null) return false;\n if(p == null && q == null) return true;\n if(p.val != q.val) return false;\n\n boolean l = isSameTree(p.left,q.left);\n boolean r = isSameTree(p.right,q.right);\n\n return l && r;\n }\n}\n```\n时间复杂度O(N) N为树的节点数量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130457949","body":"回溯维护一个List,当递归到叶子节点时,List中保存的数字就是一路从root到当前根节点的所有数字。使用StringBbuilder拼接所有数字,即是当前路径表示的数字\n\n```java\nclass Solution {\n List path = new ArrayList<>();\n int res = 0;\n public int sumNumbers(TreeNode root) {\n path.add(root.val);\n recursion(root);\n return res;\n }\n\n public void recursion(TreeNode root){\n if(root.left == null && root.right == null){\n StringBuilder sb = new StringBuilder();\n for(int num : path){\n sb.append(num);\n }\n res += Integer.parseInt(sb.toString());\n return;\n }\n\n if(root.left != null){\n path.add(root.left.val);\n recursion(root.left);\n path.remove(path.size() - 1);\n }\n\n if(root.right != null){\n path.add(root.right.val);\n recursion(root.right);\n path.remove(path.size() - 1);\n }\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134853681","body":"层序遍历,记录每一层的最左侧的值,不断覆盖变量,最终记录的是最深一层的最左侧的值\n```java\nclass Solution {\n public int findBottomLeftValue(TreeNode root) {\n Queue queue = new LinkedList<>();\n queue.add(root);\n int res = 0;\n while(!queue.isEmpty())\n {\n int size = queue.size();\n for(int i = 0;i < size;i++){\n TreeNode node = queue.poll();\n if(i == 0){\n res = node.val;\n }\n if(node.left != null) queue.add(node.left);\n if(node.right != null) queue.add(node.right);\n }\n }\n\n return res;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138992061","body":"序列化时:前序遍历记录每个节点用逗号分开,空节点记为#\n反序列化:将序列化结果以逗号分开,存储进队列,用队列递归构造树\n```java\npublic class Codec {\n StringBuilder sb = new StringBuilder();\n int count = 1;\n\n public String serialize(TreeNode root) {\n if(root == null){\n sb.append(\"#\").append(\",\");\n return sb.toString();\n }\n\n sb.append(root.val).append(\",\");\n serialize(root.left);\n serialize(root.right);\n return sb.toString();\n }\n\n public TreeNode deserialize(String data) {\n Queue queue = new LinkedList<>();\n String[] pre = data.split(\",\");\n for(String s : pre){\n queue.offer(s);\n }\n return build(queue);\n }\n\n public TreeNode build(Queue queue){\n if(queue.isEmpty()) return null;\n String rootStringVal = queue.poll();\n if(rootStringVal.equals(\"#\")) return null;\n int rootVal = Integer.parseInt(rootStringVal);\n \n TreeNode root = new TreeNode(rootVal);\n root.left = build(queue);\n root.right = build(queue);\n\n return root;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3142198278","body":"遍历二叉树,记录一个三元组,分别表示列、行和节点的值。再按照要求进行排序,列升序,行升序,值升序。最后按规则放入List\n```java\nclass Solution {\n public List> verticalTraversal(TreeNode root) {\n List nodes = new ArrayList();\n dfs(root, 0, 0, nodes);\n Collections.sort(nodes, new Comparator() {\n public int compare(int[] tuple1, int[] tuple2) {\n if (tuple1[0] != tuple2[0]) {\n return tuple1[0] - tuple2[0];\n } else if (tuple1[1] != tuple2[1]) {\n return tuple1[1] - tuple2[1];\n } else {\n return tuple1[2] - tuple2[2];\n }\n }\n });\n List> ans = new ArrayList>();\n int size = 0;\n int lastcol = Integer.MIN_VALUE;\n for (int[] tuple : nodes) {\n int col = tuple[0], row = tuple[1], value = tuple[2];\n if (col != lastcol) {\n lastcol = col;\n ans.add(new ArrayList());\n size++;\n }\n ans.get(size - 1).add(value);\n }\n return ans;\n }\n\n public void dfs(TreeNode node, int row, int col, List nodes) {\n if (node == null) {\n return;\n }\n nodes.add(new int[]{col, row, node.val});\n dfs(node.left, row + 1, col - 1, nodes);\n dfs(node.right, row + 1, col + 1, nodes);\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146508830","body":"先将数组中所有值和其对应索引存入hashmap,再遍历一遍数组,如果遍历到的num对应的target-num在map中,即是找到的两个索引。注意要避免一个数算两次\n```java\nclass Solution {\n public int[] twoSum(int[] nums, int target) {\n Map map = new HashMap<>();\n for(int i = 0;i < nums.length;i++){\n map.put(nums[i],i);\n }\n\n for(int i = 0;i < nums.length;i++){\n if(map.containsKey(target - nums[i]) && map.get(target - nums[i]) != i){\n int[] res = new int[2];\n res[0] = i;\n res[1] = map.get(target - nums[i]);\n return res;\n }\n }\n return null;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148286271","body":"遍历数组,先用hashmap记录每个数字出现的次数。用优先队列定义好排序规则,将map中的内容放入优先队列中,再按照要求从队列中取\n```java\nclass Solution {\n public int[] topKFrequent(int[] nums, int k) {\n Map map = new HashMap<>();\n for(int num : nums){\n map.put(num,map.getOrDefault(num,0)+1);\n }\n PriorityQueue p = new PriorityQueue<>((a,b) -> (b[1]-a[1]));\n for(Map.Entry m : map.entrySet()){\n p.add(new int[]{m.getKey(),m.getValue()});\n }\n int[] result = new int[k];\n for(int i = 0;i < k;i++){\n result[i] = p.poll()[0];\n }\n return result;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149131512","body":"二层遍历,第一层遍历i,第二层遍历,使用map记录每个元组与第一层的i的距离dis出现的次数time。最终由i组成的回旋镖数量为time*(time-1)\n```java\nclass Solution {\n public int numberOfBoomerangs(int[][] points) {\n int res = 0;\n for(int[] a : points){\n Map map = new HashMap<>();\n for(int[] b : points){\n int dis = (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]);\n map.put(dis,map.getOrDefault(dis,0) + 1);\n }\n for(int key : map.keySet()){\n int val = map.get(key);\n res += val * (val - 1);\n }\n }\n return res;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153104469","body":"滑动窗口,定义left指针和right指针,两个指针窗口内即是符合题目要求的子串。不断向右移right指针,如果窗口内的子串不符合题目要求了,就右移left指针缩小窗口直到符合题目要求。\n在遍历过程中,记录窗口长度最大值\n使用hashSet判断窗口内是否符合题目要求\n```java\nclass Solution {\n public int lengthOfLongestSubstring(String s) {\n Set set = new HashSet<>();\n int left = 0;\n int res = 0;\n for(int right = 0;right < s.length();right++){\n char c = s.charAt(right);\n while(set.contains(c)){\n set.remove(s.charAt(left));\n left++;\n }\n\n set.add(c);\n res = Math.max(res,right - left + 1); \n }\n return res;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3157250607","body":"滑动窗口\n```java\nclass Solution {\n public List findSubstring(String s, String[] words) {\n int wordLen = words[0].length(); \n int windowLen = wordLen * words.length; \n\n Map targetCnt = new HashMap<>();\n for (String w : words) {\n targetCnt.put(w,targetCnt.getOrDefault(w,0) + 1);\n }\n\n List ans = new ArrayList<>();\n for (int start = 0; start < wordLen; start++) {\n Map cnt = new HashMap<>();\n int overload = 0;\n for (int right = start + wordLen; right <= s.length(); right += wordLen) {\n String inWord = s.substring(right - wordLen, right);\n if (cnt.getOrDefault(inWord, 0).equals(targetCnt.getOrDefault(inWord, 0))) {\n overload++;\n }\n cnt.merge(inWord, 1, Integer::sum); \n\n int left = right - windowLen;\n if (left < 0) { \n continue;\n }\n if (overload == 0) {\n ans.add(left);\n }\n\n String outWord = s.substring(left, left + wordLen);\n cnt.merge(outWord, -1, Integer::sum); \n if (cnt.get(outWord).equals(targetCnt.getOrDefault(outWord, 0))) {\n overload--;\n }\n }\n }\n\n return ans;\n }\n}\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162563860","body":"前缀和\n```java\nclass Solution {\n public int minSubarray(int[] nums, int p) {\n int n = nums.length;\n int[] s = new int[n + 1];\n for (int i = 0; i < n; i++) {\n s[i + 1] = (s[i] + nums[i]) % p;\n }\n int x = s[n];\n if (x == 0) {\n return 0; \n }\n\n int ans = n;\n Map last = new HashMap<>();\n for (int i = 0; i <= n; i++) {\n last.put(s[i], i);\n int j = last.getOrDefault((s[i] - x + p) % p, -n);\n ans = Math.min(ans, i - j);\n }\n return ans < n ? ans : -1;\n }\n}\n\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170443755","body":"双指针,慢指针用于存数字,快指针用于检验数字是否重复\n```java\nclass Solution {\n public int removeDuplicates(int[] nums) {\n if(nums.length == 1) return 1;\n int slow = 0;\n for(int fast = 1;fasttarget){\n right = middle;\n }else if(nums[middle] queue;\n public MyQueue(){\n queue = new LinkedList<>();\n } \n\n public void add(int val){\n while(!queue.isEmpty() && val > queue.getLast()){\n queue.removeLast();\n }\n queue.add(val);\n }\n\n public void poll(int val){\n if(queue.peek() == val){\n queue.poll();\n }\n }\n\n public int max(){\n return queue.peek();\n }\n}\n```\n时间复杂度O(nlogn)\n优先队列插入的复杂度是logn","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3177951924","body":"两个数组计算每个人的入度和出度\n```java\nclass Solution {\n public int findJudge(int n, int[][] trust) {\n int[] inDegrees = new int[n + 1];\n int[] outDegrees = new int[n + 1];\n for (int[] edge : trust) {\n int x = edge[0], y = edge[1];\n ++inDegrees[y];\n ++outDegrees[x];\n }\n for (int i = 1; i <= n; ++i) {\n if (inDegrees[i] == n - 1 && outDegrees[i] == 0) {\n return i;\n }\n }\n return -1;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182597716","body":"染色法,如果染色过程冲突,则无法实现、返回false\n```java\nclass Solution {\n boolean[] visited;\n boolean[] color;\n boolean flag = false;\n public boolean possibleBipartition(int n, int[][] dislikes) {\n List[] graph = build(dislikes,n);\n visited = new boolean[graph.length];\n color = new boolean[graph.length];\n for(int i = 1;i < graph.length;i++){\n if(visited[i] == false){\n traverse(graph,i);\n }\n }\n return !flag;\n }\n\n public List[] build(int[][] dislikes,int n){\n List[] graph = new List[n + 1];\n for(int i = 0;i < n + 1;i++){\n graph[i] = new LinkedList<>();\n }\n\n for(int[] edge : dislikes){\n int x = edge[0];\n int y = edge[1];\n graph[x].add(y);\n graph[y].add(x);\n }\n return graph;\n }\n\n public void traverse(List[] graph,int s){\n if(flag) return;\n visited[s] = true;\n for(int x : graph[s]){\n if(visited[x] == false){\n color[x] = !color[s];\n traverse(graph,x);\n }else{\n if(color[x] == color[s]) flag = true;\n }\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186848399","body":"拓扑排序\n```java\nclass Solution {\n public int[] sortItems(int n, int m, int[] group, List> beforeItems) {\n List> groupItem = new ArrayList>();\n for (int i = 0; i < n + m; ++i) {\n groupItem.add(new ArrayList());\n }\n\n // 组间和组内依赖图\n List> groupGraph = new ArrayList>();\n for (int i = 0; i < n + m; ++i) {\n groupGraph.add(new ArrayList());\n }\n List> itemGraph = new ArrayList>();\n for (int i = 0; i < n; ++i) {\n itemGraph.add(new ArrayList());\n }\n\n // 组间和组内入度数组\n int[] groupDegree = new int[n + m];\n int[] itemDegree = new int[n];\n \n List id = new ArrayList();\n for (int i = 0; i < n + m; ++i) {\n id.add(i);\n }\n\n int leftId = m;\n // 给未分配的 item 分配一个 groupId\n for (int i = 0; i < n; ++i) {\n if (group[i] == -1) {\n group[i] = leftId;\n leftId += 1;\n }\n groupItem.get(group[i]).add(i);\n }\n // 依赖关系建图\n for (int i = 0; i < n; ++i) {\n int curGroupId = group[i];\n for (int item : beforeItems.get(i)) {\n int beforeGroupId = group[item];\n if (beforeGroupId == curGroupId) {\n itemDegree[i] += 1;\n itemGraph.get(item).add(i); \n } else {\n groupDegree[curGroupId] += 1;\n groupGraph.get(beforeGroupId).add(curGroupId);\n }\n }\n }\n\n // 组间拓扑关系排序\n List groupTopSort = topSort(groupDegree, groupGraph, id); \n if (groupTopSort.size() == 0) {\n return new int[0];\n }\n int[] ans = new int[n];\n int index = 0;\n // 组内拓扑关系排序\n for (int curGroupId : groupTopSort) {\n int size = groupItem.get(curGroupId).size();\n if (size == 0) {\n continue;\n }\n List res = topSort(itemDegree, itemGraph, groupItem.get(curGroupId));\n if (res.size() == 0) {\n return new int[0];\n }\n for (int item : res) {\n ans[index++] = item;\n }\n }\n return ans;\n }\n\n public List topSort(int[] deg, List> graph, List items) {\n Queue queue = new LinkedList();\n for (int item : items) {\n if (deg[item] == 0) {\n queue.offer(item);\n }\n }\n List res = new ArrayList();\n while (!queue.isEmpty()) {\n int u = queue.poll(); \n res.add(u);\n for (int v : graph.get(u)) {\n if (--deg[v] == 0) {\n queue.offer(v);\n }\n }\n }\n return res.size() == items.size() ? res : new ArrayList();\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190861492","body":"模拟机器人移动\n```java\nclass Solution {\n public boolean judgeCircle(String moves) {\n int x = 0, y = 0;\n int length = moves.length();\n for (int i = 0; i < length; i++) {\n char move = moves.charAt(i);\n if (move == 'U') {\n y--;\n } else if (move == 'D') {\n y++;\n } else if (move == 'L') {\n x--;\n } else if (move == 'R') {\n x++;\n }\n }\n return x == 0 && y == 0;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193745750","body":"模拟\n```java\nclass Solution {\n public int[] getOrder(int[][] ts) {\n int n = ts.length;\n // 将 ts 转存成 nts,保留任务编号\n int[][] nts = new int[n][3];\n for (int i = 0; i < n; i++) nts[i] = new int[]{ts[i][0], ts[i][1], i};\n // 根据任务入队时间进行排序\n Arrays.sort(nts, (a,b)->a[0]-b[0]);\n // 根据题意,先按照「持续时间」排序,再根据「任务编号」排序\n PriorityQueue q = new PriorityQueue<>((a,b)->{\n if (a[1] != b[1]) return a[1] - b[1];\n return a[2] - b[2];\n });\n int[] ans = new int[n];\n for (int time = 1, j = 0, idx = 0; idx < n; ) {\n \t// 如果当前任务可以添加到「队列」中(满足入队时间)则进行入队\n while (j < n && nts[j][0] <= time) q.add(nts[j++]);\n if (q.isEmpty()) {\n\t // 如果当前「队列」没有任务,直接跳到下个任务的入队时间\n time = nts[j][0];\n } else {\n \t// 如果有可执行任务的话,根据优先级将任务出队(记录下标),并跳到该任务完成时间点\n int[] cur = q.poll();\n ans[idx++] = cur[2];\n time += cur[1];\n }\n }\n return ans;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194379645","body":"转化为分钟\n```java\nclass Solution {\n public int numberOfRounds(String loginTime, String logoutTime) {\n int loginHour = Integer.parseInt(loginTime.substring(0, 2));\n int loginMinute = Integer.parseInt(loginTime.substring(3));\n int logoutHour = Integer.parseInt(logoutTime.substring(0, 2));\n int logoutMinute = Integer.parseInt(logoutTime.substring(3));\n int loginTotalMinute = loginHour * 60 + loginMinute;\n int logoutTotalMinute = logoutHour * 60 + logoutMinute;\n if (loginTotalMinute > logoutTotalMinute) {\n logoutTotalMinute += 1440;\n }\n if (loginTotalMinute % 15 != 0) {\n loginTotalMinute += 15 - loginTotalMinute % 15;\n }\n logoutTotalMinute -= logoutTotalMinute % 15;\n return Math.max((logoutTotalMinute - loginTotalMinute) / 15, 0);\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3195332635","body":"分别模拟三个情况\n```java\nclass Solution {\n public int minCharacters(String a, String b) {\n int n = a.length(), m = b.length(), ans = 0x3f3f3f3f;\n int[] c1 = new int[26], c2 = new int[26];\n for (char c : a.toCharArray()) c1[c - 'a']++;\n for (char c : b.toCharArray()) c2[c - 'a']++;\n for (int i = 0; i < 26 && ans != 0; i++) {\n // 3\n int ca = n - c1[i], cb = m - c2[i];\n ans = Math.min(ans, ca + cb);\n if (i == 0) continue;\n int r1 = 0, r2 = 0;\n // 1\n for (int j = i; j < 26; j++) r1 += c1[j];\n for (int j = 0; j < i; j++) r1 += c2[j];\n // 2\n for (int j = i; j < 26; j++) r2 += c2[j];\n for (int j = 0; j < i; j++) r2 += c1[j];\n ans = Math.min(ans, Math.min(r1, r2));\n }\n return ans;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199298563","body":"归并排序\n\n```java\nclass Solution {\n public int[] sortArray(int[] nums) {\n sort(nums,0,nums.length - 1);\n return nums;\n }\n\n public void sort(int[] nums,int start,int end){\n if(start >= end) return;\n int p = para(nums,start,end);\n\n sort(nums,start,p - 1);\n sort(nums,p + 1,end);\n }\n\n public int para(int[] nums,int l,int h){\n\n int x = nums[l];\n int i = l,j = h;\n while(i < j)\n {\n while(i < j && nums[j] >= x) j--;\n if(i < j) nums[i++] = nums[j];\n\n while(i < j && nums[i] < x) i++;\n if(i < j) nums[j--] = nums[i];\n }\n\n nums[i] = x;\n return i;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204106258","body":"二分查找\n```java\nclass Solution {\n public int mySqrt(int x) {\n if(x == 0) return 0;\n if(x == 1) return 1;\n int left = 0;\n int right = x;\n while(left < right)\n {\n int middle = left + (right - left) / 2;\n if(middle > x / middle){\n right = middle;\n }else if(middle < x / middle){\n left = middle + 1;\n }else{\n return middle;\n }\n }\n if(right == x / right){\n return right;\n }else{\n return right - 1;\n }\n\n \n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208985528","body":"二分查找\n```java\npublic class Solution extends VersionControl {\n public int firstBadVersion(int n) {\n int left = 1, right = n;\n while (left < right) { \n int mid = left + (right - left) / 2; \n if (isBadVersion(mid)) {\n right = mid; \n } else {\n left = mid + 1; \n }\n }\n return left;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3213255556","body":"```java\nclass Solution {\n public int reversePairs(int[] nums) {\n if (nums.length == 0) {\n return 0;\n }\n return reversePairsRecursive(nums, 0, nums.length - 1);\n }\n\n public int reversePairsRecursive(int[] nums, int left, int right) {\n if (left == right) {\n return 0;\n } else {\n int mid = (left + right) / 2;\n int n1 = reversePairsRecursive(nums, left, mid);\n int n2 = reversePairsRecursive(nums, mid + 1, right);\n int ret = n1 + n2;\n\n // 首先统计下标对的数量\n int i = left;\n int j = mid + 1;\n while (i <= mid) {\n while (j <= right && (long) nums[i] > 2 * (long) nums[j]) {\n j++;\n }\n ret += j - mid - 1;\n i++;\n }\n\n // 随后合并两个排序数组\n int[] sorted = new int[right - left + 1];\n int p1 = left, p2 = mid + 1;\n int p = 0;\n while (p1 <= mid || p2 <= right) {\n if (p1 > mid) {\n sorted[p++] = nums[p2++];\n } else if (p2 > right) {\n sorted[p++] = nums[p1++];\n } else {\n if (nums[p1] < nums[p2]) {\n sorted[p++] = nums[p1++];\n } else {\n sorted[p++] = nums[p2++];\n }\n }\n }\n for (int k = 0; k < sorted.length; k++) {\n nums[left + k] = sorted[k];\n }\n return ret;\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216192351","body":"```java\nclass Solution {\n public int findRadius(int[] houses, int[] heaters) {\n int ans = 0;\n Arrays.sort(heaters);\n for (int house : houses) {\n int i = binarySearch(heaters, house);\n int j = i + 1;\n int leftDistance = i < 0 ? Integer.MAX_VALUE : house - heaters[i];\n int rightDistance = j >= heaters.length ? Integer.MAX_VALUE : heaters[j] - house;\n int curDistance = Math.min(leftDistance, rightDistance);\n ans = Math.max(ans, curDistance);\n }\n return ans;\n }\n\n public int binarySearch(int[] nums, int target) {\n int left = 0, right = nums.length - 1;\n if (nums[left] > target) {\n return -1;\n }\n while (left < right) {\n int mid = (right - left + 1) / 2 + left;\n if (nums[mid] > target) {\n right = mid - 1;\n } else {\n left = mid;\n }\n }\n return left;\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"falsity":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073705405","body":"# 思路\n\n从低位往高位计算, 每次计算保留进位数据,本位留下余数\n\n```python\nclass Solution(object):\n def addToArrayForm(self, num, k):\n \"\"\"\n :type num: List[int]\n :type k: int\n :rtype: List[int]\n \"\"\"\n result = []\n i = len(num) - 1\n while i >=0 or k > 0:\n if i >= 0:\n k += num[i]\n i -= 1\n result.append(k % 10)\n k = k // 10\n return result[::-1]\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3079013152","body":"# 【Day 2】821. 字符的最短距离\n\n## 思路\n\n先遍历一遍获取c的位置列表, 再遍历每个位置计算最近的距离\n\n```python\nclass Solution(object):\n def shortestToChar(self, s, c):\n \"\"\"\n :type s: str\n :type c: str\n :rtype: List[int]\n \"\"\"\n locations = []\n result = []\n for i, char in enumerate(s):\n if char == c:\n locations.append(i)\n \n for i in range(len(s)):\n shortest = min(abs(i - location) for location in locations)\n result.append(shortest)\n return result\n```\n\n时间复杂度: O(n*m), m为字符c出现次数,最差为O(n^2)\n\n空间复杂度: O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084580543","body":"**【Day 3】1381. 设计一个支持增量操作的栈**\n\n*** 思路***\n\n用数组模拟栈\n\n```python\nclass CustomStack(object):\n\n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def __init__(self, maxSize):\n \"\"\"\n :type maxSize: int\n \"\"\"\n self.stack = [0] * maxSize\n self.top = -1\n \n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n if self.top < len(self.stack) - 1:\n self.top += 1\n self.stack[self.top] = x\n \n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if self.top == -1:\n return -1\n value = self.stack[self.top]\n self.top -= 1\n return value\n \n # 时间复杂度: O(k)\n # 空间复杂度: O(n)\n def increment(self, k, val):\n \"\"\"\n :type k: int\n :type val: int\n :rtype: None\n \"\"\"\n lim = min(k, self.top + 1)\n for i in range(lim):\n self.stack[i] += val\n \n\n\n# Your CustomStack object will be instantiated and called as such:\n# obj = CustomStack(maxSize)\n# obj.push(x)\n# param_2 = obj.pop()\n# obj.increment(k,val)\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089882117","body":"**【Day 4】394. 字符串解码**\n\n**思路**\n\n参照[Krahets的字符串解码题解](https://leetcode.cn/problems/decode-string/solutions/19447/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd/)中的辅助栈解法,利用栈来存储每一层[]中的字符串和需要重复的次数逐层拼接字符串,最后得到结果.\n\n**代码**\n\n```python\nclass Solution(object):\n def decodeString(self, s):\n \"\"\"\n :type s: str\n :rtype: str\n \"\"\"\n stack, res, multi = [], \"\", 0\n for c in s:\n if c == '[':\n stack.append([multi, res])\n res, multi = \"\", 0\n elif c == ']':\n cur_multi, last_res = stack.pop()\n res = last_res + cur_multi * res\n elif '0' <= c <= '9':\n multi = multi * 10 + int(c)\n else:\n res += c\n return res \n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(N)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092420487","body":"**【Day 5】232. 用栈实现队列**\n\n**思路**\n\n利用栈先进后出的性质,通过stack1完成元素的倒序放置,再将stack1的元素放入stack2中,前面的元素就放在了栈顶. 此时经过两次入栈出栈的操作stack2中的元素就满足了先进先出的要求.\n\n但是要注意以下问题:\n\n1. 只有在stack2中元素为空时才能将stack1中的元素放入stack2中,这样才能保证有序性\n2. 遍历list元素要使用while, 不能用for,否则会有元素被跳过\n\n**代码**\n\n```python\nclass MyQueue(object):\n\n def __init__(self):\n self.stack1, self.stack2 = [], []\n \n\n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n self.stack1.append(x)\n \n\n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n res = self.peek()\n return self.stack2.pop()\n \n\n def peek(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if self.stack2:\n return self.stack2[-1]\n elif self.stack1:\n while self.stack1:\n self.stack2.append(self.stack1.pop())\n return self.stack2[-1]\n else:\n return -1\n \n\n def empty(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n return not self.stack1 and not self.stack2\n \n\n\n# Your MyQueue object will be instantiated and called as such:\n# obj = MyQueue()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.peek()\n# param_4 = obj.empty()\n```\n\n**复杂度分析**\n\n时间复杂度: push, empty 是O(1), pop, peek是O(N)\n空间复杂度: O(N)\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097331008","body":"**【Day 7】61. 旋转链表**\n\n**思路**\n\nk可能会大于链表长度导致循环遍历链表. 所以真实的旋转偏移是k%n,n为链表长度. 使用双指针找到需要断开的节点位置,将链表进行断开和重新拼接即可得到结果\n\n```pyth\nclass Solution(object):\n def rotateRight(self, head, k):\n \"\"\"\n :type head: Optional[ListNode]\n :type k: int\n :rtype: Optional[ListNode]\n \"\"\"\n if k == 0 or not head or not head.next:\n return head\n\n node = head\n l = 0\n while node:\n l += 1\n node = node.next\n \n if k % l == 0:\n return head\n k = k % l\n slow = fast = head\n for i in range(k):\n fast = fast.next\n \n while fast.next:\n slow = slow.next\n fast = fast.next\n\n new_head = slow.next\n slow.next = None\n fast.next = head\n return new_head\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103411213","body":"**【Day 8】24. 两两交换链表中的节点**\n\n**思路**\n\n类似于反转链表, 用两个指针来对链表指向进行修改,唯一的区别是cur需要间隔一个进行遍历,而不是逐个遍历\n\n```python\nclass Solution(object):\n def swapPairs(self, head):\n \"\"\"\n :type head: Optional[ListNode]\n :rtype: Optional[ListNode]\n \"\"\"\n dummy = ListNode()\n dummy.next = head\n pre = dummy\n cur = head\n while cur and cur.next:\n nxt = cur.next\n cur.next = nxt.next\n nxt.next = cur\n pre.next = nxt\n pre = cur\n cur = cur.next\n \n return dummy.next\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109176294","body":"**【Day 9】109. 有序链表转换二叉搜索树**\n\n**思路**\n\n首先获取链表的长度,再根据二叉树的中序遍历方式递归构建BST, 根节点的值在遍历完左子树后刚好移动了m次到达中间节点,即根节点位置\n\n\n\n```python\nclass Solution:\n def sortedListToBST(self, head: Optional[ListNode]) -> Optional[TreeNode]:\n def getLength(head: ListNode) -> int:\n count = 0\n while head:\n count += 1\n head = head.next\n return count\n\n def buildBST(left: int, right: int) -> TreeNode:\n if left > right:\n return None\n m = (left + right) // 2\n root = TreeNode()\n left_node = buildBST(left, m - 1)\n nonlocal head\n root.val = head.val\n head = head.next\n \n right_node = buildBST(m+1, right)\n root.left = left_node\n root.right = right_node\n return root\n\n l = getLength(head)\n return buildBST(0, l - 1)\n```\n\n**复杂度分析**\n\n时间复杂度: O(n)\n空间复杂度: O(log n)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3122088595","body":"**【Day 12】146. LRU 缓存机制**\n\n**思路**\n\n`get` 和 `put` 必须以 `O(1)` 的平均时间复杂度运行, 说明需要使用到map. 需要记录关键字使用过的顺序需要使用到链表\n\nget方法需要查询map, 如果key存在则返回值,如果不存在则返回-1. 查询完成后,需要把该节点移动到队首(删除后再插入队首)\n\nput方法需要先查询map容量,如果容量已满,需要通过list找到队尾元素删除, 并将新元素插入队首\n\nnode需要知道前后节点,所以使用双向链表,map和node之间建立映射方便查询数据\n\n\n\n需要的内部函数: 删除元素, 将元素插入队首\n\n```python\nclass LRUCache:\n class Node:\n def __init__(self, key: int, val: int):\n self.key = key\n self.val = val\n self.pre = pre\n self.next = next\n\n def __init__(self, capacity: int):\n self.capacity = capacity\n self.dummy = self.Node(-1, -1)\n self.dummy.pre = self.dummy\n self.dummy.next = self.dummy\n self.map = {}\n\n def add_node_to_head(self, node: Node):\n node.pre = self.dummy\n node.next = self.dummy.next\n self.dummy.next.pre = node\n self.dummy.next = node\n\n def remove_node(self, node: Node):\n node.pre.next = node.next\n node.next.pre = node.pre\n\n def get(self, key: int) -> int:\n if key not in self.map:\n return -1\n\n node = self.map[key]\n self.remove_node(node)\n self.add_node_to_head(node)\n return node.val\n\n def put(self, key: int, value: int) -> None:\n if key in self.map:\n node = self.map[key]\n node.val = value\n self.remove_node(node)\n self.add_node_to_head(node)\n return\n\n new_node = self.Node(key, value)\n self.map[key] = new_node\n self.add_node_to_head(new_node)\n\n if len(self.map) > self.capacity:\n tail = self.dummy.pre\n del self.map[tail.key]\n self.remove_node(tail)\n\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124440801","body":"**【Day 13】104. 二叉树的最大深度**\n\n**思路**\n\n二叉树的最大深度为max(左子树深度, 右子树深度) + 1, 这就变成了一个递归问题\n\n```python\nclass Solution(object):\n def maxDepth(self, root):\n \"\"\"\n :type root: Optional[TreeNode]\n :rtype: int\n \"\"\"\n if root is None:\n return 0\n if root is not None and root.left is None and root.right is None:\n return 1\n return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1\n\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127200969","body":"**【Day 14】100. 相同的树**\n\n**思路**\n\n相同的树一定根节点相同,并且左子树和右子树都相同, 可以进行递归判断所有子树是否相同\n\n```python\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if p is None or q is None:\n return p is q\n \n if p.val == q.val:\n return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)\n else:\n return False\n```\n\n**复杂度分析**\n\n时间复杂度: O(min(m,n)) m为p节点个数,n为q节点个数\n空间复杂度: O(min(m,n)) m为p节点个数,n为q节点个数","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136787502","body":"**【Day 16】513. 找树左下角的值**\n\n**思路**\n\n从右往左层序遍历,最后一个节点就是左下角的点\n\n```python\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n q = deque([root])\n while q:\n node = q.popleft()\n if node.right: q.append(node.right)\n if node.left: q.append(node.left)\n return node.val\n```\n\n**复杂度分析**\n\n时间复杂度: O(n) \n空间复杂度: O(n)\n\n","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3151014729","body":"**【Day 21】447. 回旋镖的数量**\n\n**思路**\n\n首先计算距离相等的点的数量,在计算相同距离点之间的排列组合数量\n\n```python\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n res = 0\n n = len(points)\n if n < 3:\n return 0\n \n for i in range(n):\n x0, y0 = points[i]\n dist_count = {}\n \n for j in range(n):\n if i == j:\n continue\n \n x1, y1 = points[j]\n dx = x1 - x0\n dy = y1 - y0\n dist_sq = dx * dx + dy * dy\n \n dist_count[dist_sq] = dist_count.get(dist_sq, 0) + 1\n \n for cnt in dist_count.values():\n res += cnt * (cnt - 1)\n \n return res\n```\n\n时间复杂度: O(n ^ 2)\n\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3175046868","body":"**【Day 28】239. 滑动窗口最大值**\n\n```python\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n n = len(nums)\n if n == 0 or k == 0:\n return []\n \n res = []\n q = deque() \n for i in range(n):\n while q and q[0] < i - k + 1:\n q.popleft()\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n if i >= k - 1:\n res.append(nums[q[0]])\n return res\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3179722453","body":"\n\n```python\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n in_list = [0] * (n + 1)\n out_list = [0] * (n + 1)\n for i in trust:\n in_list[i[1]] += 1\n out_list[i[0]] += 1\n\n for i in range(1, n+1):\n if in_list[i] == n - 1 and out_list[i] == 0:\n return i\n\n return -1\n```\n\n时间复杂度: O(n + m), m为trust列表长度\n\n空间复杂度: O(n)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194443006","body":"```python\nclass Solution:\n def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:\n start = 60 * int(loginTime[:2]) + int(loginTime[3:])\n end = 60 * int(logoutTime[:2]) + int(logoutTime[3:])\n if start > end:\n end += 24 * 60\n start = math.ceil(start / 15) * 15\n end = end // 15 * 15\n return max(0, (end - start) // 15)\n```\n\n时间复杂度: O(1)\n\n空间复杂度: O(1)\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3200900420","body":"快排\n```java\n class Solution {\n public int[] sortArray(int[] nums) {\n quickSort(nums, 0, nums.length - 1);\n return nums;\n }\n\n private void quickSort(int[] nums, int low, int high){\n if(low < high){\n int mid = partition(nums, low, high);\n quickSort(nums, low, mid - 1);\n quickSort(nums, mid + 1, high);\n }\n }\n\n private int partition(int[] nums, int low, int high){\n int pivot = low + (int) (Math.random() * (high - low + 1));\n swap(nums, pivot, low);\n int i = low, j = low + 1;\n while (j <= high){\n if(nums[j] < nums[low]){\n swap(nums, j, ++i);\n }\n j++;\n }\n swap(nums, low, i);\n return i;\n }\n\n private void swap(int[] nums, int i, int j){\n int tmp = nums[i];\n nums[i] = nums[j];\n nums[j] = tmp;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3224529913","body":"思路: 采用定长滑动窗口的做法, 先初始化定长窗口,再移动更新结果\n\n```python\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n ans = count = 0\n vowels = set(['a', 'e', 'i', 'o', 'u'])\n chars = list(s)\n n = len(chars)\n left = right = 0\n while right < k:\n if chars[right] in vowels:\n count += 1\n right += 1\n ans = count\n while right < n:\n if chars[right] in vowels:\n count += 1\n if chars[left] in vowels:\n count -= 1\n ans = max(count, ans)\n left += 1\n right += 1\n return ans\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3228513919","body":"\n\n```java\nclass Solution {\n public double new21Game(int n, int k, int maxPts) {\n if( k > n){\n return 0;\n }\n if((k == 0 && n >= 0) && n > k + maxPts){\n return 1;\n }\n\n int len = k + maxPts;\n double[] dp = new double[len];\n double sum = 0;\n\n for(int i = k; i < len && i <= n; i++){\n dp[i] = 1;\n sum++;\n }\n\n for(int i = k - 1; i >= 0; i--){\n dp[i] = sum / maxPts;\n sum = sum - dp[i + maxPts] + dp[i];\n }\n return dp[0];\n }\n}\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(n)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3240213950","body":"**\n\n```python\nclass Solution:\n def readBinaryWatch(self, turnedOn: int) -> List[str]:\n ans = []\n for h in range(12):\n for m in range(60):\n if bin(h).count('1') + bin(m).count('1') == turnedOn:\n ans.append(f\"{h}:{m:02d}\")\n \n return ans\n```\n\n时间复杂度: O(1)\n\n空间复杂度: O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245665636","body":"\n\n```python\nclass Solution:\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n # 时间复杂度: O(mn)\n # 空间复杂度: O(mn)\n ans = 0\n m, n = len(grid), len(grid[0])\n\n def dfs(i: int, j: int) -> int:\n count = 1\n grid[i][j] = 0\n for x, y in (i-1, j), (i+1, j), (i, j-1), (i, j+1):\n if 0<= x < m and 0 <= y < n and grid[x][y]:\n count += dfs(x, y)\n return count\n\n for i, row in enumerate(grid):\n for j, x in enumerate(row):\n if x:\n ans = max(ans, dfs(i, j))\n\n return ans\n \n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3253854706","body":"\n```python\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n # 时间复杂度: O(n)\n # 空间复杂度: O(n)\n ans = 0\n q = initialBoxes\n while q:\n p = []\n for i in q:\n if status[i] == 0:\n p.append(i)\n continue\n ans += candies[i]\n for key in keys[i]:\n status[key] = 1\n for c in containedBoxes[i]:\n p.append(c)\n if p == q or not p:\n break\n q = p\n return ans\n```","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3271174778","body":"\n\n```java\nclass Solution {\n public int longestCommonSubsequence(String text1, String text2) {\n # 时间复杂度: O(mn)\n # 空间复杂度: O(mn)\n int m = text1.length(), n = text2.length();\n int[][] dp = new int[m+1][n+1];\n for (int i = 1; i <= m; i++) {\n char c1 = text1.charAt(i - 1);\n for (int j = 1; j <= n; j++) {\n char c2 = text2.charAt(j - 1);\n if (c1 == c2){\n dp[i][j] = dp[i - 1][j-1] + 1;\n }else{\n dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);\n }\n\n }\n }\n return dp[m][n];\n }\n}\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3275118967","body":"时间复杂度: O(m * n)\n\n空间复杂度: ~~O(n)~~ 题解指正行列可以交换, 所以为O(min(m, n))\n\n```python\nclass Solution:\n def uniquePaths(self, m: int, n: int) -> int:\n f = [1] * n\n\n for i in range(1, m):\n for j in range(1, n):\n f[j] += f[j - 1]\n return f[n - 1]\n \n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289638493","body":"```python\nclass Solution:\n def findTargetSumWays(self, nums: List[int], target: int) -> int:\n # 时间复杂度: O(n * target)\n # 空间复杂度: O(n * target)\n @cache\n def dfs(i: int, c: int) -> int:\n if i < 0:\n return 1 if c == 0 else 0\n \n return dfs(i - 1, c - nums[i]) + dfs(i - 1, c + nums[i])\n \n return dfs(len(nums) - 1, target)\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3298968000","body":"```python\nclass Solution:\n def change(self, amount: int, coins: List[int]) -> int:\n \t# 时间复杂度(n * amount)\n # 空间复杂度(amount)\n f = [1] + [0] * amount\n for x in coins:\n for c in range(x, amount + 1):\n f[c] += f[c - x]\n return f[-1]\n```","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316065059","body":"```python\nclass Solution:\n def mergeTwoLists(self, list1:Optional[ListNode], list2:Optional[ListNode]) -> Optional[ListNode]:\n cur = dummy = ListNode()\n while list1 and list2:\n if list1.val < list2.val:\n cur.next = list1\n list1 = list1.next\n else:\n cur.next = list2\n list2 = list2.next\n cur = cur.next\n cur.next = list1 if list1 else list2\n return dummy.next\n\n def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:\n # 时间复杂度: O(L * logm) m 为 lists 的长度,L 为所有链表的长度之和\n # 空间复杂度: O(1)\n m = len(lists)\n if m == 0:\n return None\n step = 1\n while step < m:\n for i in range(0, m - step, step * 2):\n lists[i] = self.mergeTwoLists(lists[i], lists[i + step])\n step *= 2\n return lists[0]\n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3334653673","body":"思路: 用Node来创建一个树, 每个node下面可以存下一个字母的node, 并且每个node有个end标志位,用来表示单词结尾\n\n```python\nclass Node:\n __slots__ = \"son\", \"end\"\n\n def __init__(self):\n self.son = {}\n self.end = False\n\n\nclass Trie:\n def __init__(self):\n self.root = Node()\n\n # 时间复杂度: O(n)\n def insert(self, word: str) -> None:\n cur = self.root\n for c in word:\n if c not in cur.son:\n cur.son[c] = Node()\n cur = cur.son[c]\n cur.end = True\n\n # 时间复杂度: O(n)\n def find(self, word: str) -> int:\n cur = self.root\n for c in word:\n if c not in cur.son:\n return 0\n cur = cur.son[c]\n return 2 if cur.end else 1\n \n # 时间复杂度: O(n)\n def search(self, word: str) -> bool:\n return self.find(word) == 2\n\n # 时间复杂度: O(n)\n def startsWith(self, prefix: str) -> bool:\n return self.find(prefix) != 0\n```\n\n空间复杂度: O(m * n) m为insert次数, n为单词长度","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuetong3yu":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073754281","body":"```js\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(nums, k) {\n let str1 = '', str2 = String(k)\n for(let i = 0; i < nums.length; i++) {\n str1 += nums[i];\n }\n // swap to make sure str1 is longer than str2\n if (str1.length < str2.length) {\n const t = str1;\n str1 = str2;\n str2 = t;\n }\n const res = new Array(str1.length).fill(0);\n let p1 = str1.length - 1, p2 = str2.length - 1;\n while(p1 >= 0) {\n res[p1] = Number(str1[p1]) + Number(str2[p2] ?? 0);\n p1 --, p2 --;\n }\n const len = res.length\n let need_shift = false\n for (let i = len - 1; i >= 0; i--) {\n if (res[i] >= 10) {\n if (i === 0) {\n need_shift = true\n } else {\n res[i - 1] = res[i - 1] + 1;\n }\n res[i] = res[i] % 10\n }\n }\n if (need_shift) res.unshift(1)\n return res;\n};\n```\n\n尝试了几个不同的方法。。。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078802551","body":"模拟题意AC,但感觉第二遍 for 循环没必要循环整个 indexes 数组,indexes 数组是天然有序的,应该可以用双指针优化\n\n```js\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const indexes = []\n for(let i = 0; i < s.length; i++) {\n if (s[i] === c) indexes.push(i);\n }\n const res = [];\n for(let i = 0; i < s.length; i++) {\n let min = Infinity\n for(let j = 0; j < indexes.length; j++) {\n min = Math.min(min, Math.abs(i - indexes[j]));\n }\n res.push(min)\n }\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082104676","body":"思路一直接模拟题意,increment 操作循环遍历一遍让元素自增:\n\n```js\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.stack = []\n this.size = 0\n this.maxSize = maxSize\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.size === this.maxSize) return;\n this.stack.push(x);\n this.size ++\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.size === 0) return -1\n const res = this.stack.pop();\n this.size --\n return res;\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n for(let i = 0; i < this.size;i ++) {\n if (i < k) {\n this.stack[i] += val;\n }\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n---\n\n\n思路二使用一个 hashmap 维护自增量,只有在 pop 操作的时候才去运算:\n\n```js\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.stack = []\n this.size = 0\n this.maxSize = maxSize\n this.map = {}\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.size === this.maxSize) return;\n this.stack.push(x);\n this.size ++\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.size === 0) return -1\n const inc = this.map[this.size - 1] || 0;\n const res = this.stack.pop();\n // update inc\n if (inc) {\n this.map[this.size - 1] = 0;\n this.map[this.size - 2] = this.map[this.size - 2] ? this.map[this.size - 2] + inc : inc;\n }\n this.size --\n\n return res + inc;\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n const key = Math.min(k - 1, this.size - 1);\n this.map[key] = this.map[key] ? this.map[key] + val : val;\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n🥲 结果跑出来只打败了 18% 的人,应该是题目给的数据量量太小了 <= 1000,操作 hashmap 的 cost 超过了循环 stack 的时间,不如方法一暴力循环。。。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089570929","body":"用栈秒了\n\n```js\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let i = 0;\n while(i < s.length) {\n const char = s[i];\n if (char !== ']') {\n stack.push(char)\n i ++\n } else {\n let repeatStr = ''\n while(stack[stack.length - 1] !== '[') {\n const new_char = stack.pop();\n repeatStr = new_char + repeatStr;\n }\n // pop '['\n stack.pop()\n // get number \n let repeat_times = ''\n while(/[0-9]/.test(stack[stack.length - 1])) {\n repeat_times = stack.pop() + repeat_times\n }\n repeat_times = Number(repeat_times)\n stack.push(repeatStr.repeat(repeat_times));\n i ++\n }\n }\n let res = ''\n while(stack.length) {\n res = stack.pop() + res;\n }\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091373955","body":"思路:用两个栈模拟操作,在 peek 的时候出第二个栈的顶部即可\n\n\n```js\nvar MyQueue = function() {\n this.a = [];\n this.b = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.a.push(x);\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n this.peek();\n return this.b.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if (this.b.length) {\n return this.b[this.b.length - 1]\n } else {\n while(this.a.length) {\n this.b.push(this.a.pop())\n }\n return this.peek()\n }\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return !this.a.length && !this.b.length\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094511265","body":"用了一个简单的前缀和 AC 了,时间复杂度也是 NlogN\n\n```js\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const sorted_arr = [...arr].sort((a, b) => a - b);\n let count_a = count_b = res = 0;\n\n for(let i = 0; i < arr.length;i ++) {\n count_a += sorted_arr[i];\n count_b += arr[i];\n\n if (count_a === count_b) res ++ \n }\n\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3096927980","body":"```js\nvar rotateRight = function(head, k) {\n if (!head || !head.next || k === 0) return head;\n\n // Count the length of the list\n let length = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n length++;\n }\n\n // Normalize k\n k %= length;\n if (k === 0) return head;\n\n // Find the new tail: (length - k - 1)th node\n let newTail = head;\n for (let i = 0; i < length - k - 1; i++) {\n newTail = newTail.next;\n }\n\n // Rotate\n let newHead = newTail.next;\n newTail.next = null;\n tail.next = head;\n\n return newHead;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100186608","body":"考察交换链表节点的基本操作,需要注意的是“什么时候使用 dummy 节点”的技巧。我的理解是在需要涉及到头节点操作的时候,就创建 dummy 节点。比如这一题 - 交换头两个节点的时候就会涉及到头节点的变更。\n\n\n```js\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n const dummy = new ListNode(null, head);\n let p = dummy;\n while(p.next && p.next.next) {\n const p1 = p.next, p2 = p.next.next;\n p.next = p2;\n p1.next = p2.next;\n p2.next = p1;\n p = p1\n }\n return dummy.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3108866758","body":"Same solution with Problem108. But this problem is giving List instead plain array. So will need to use the trick of two pointers to get the mid node of a Single List.\n\n```js\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if (!head) return null\n return helper(head, null)\n\n function helper(head, tail) {\n if (head === tail) return null;\n let fast = head;\n let slow = head;\n while(fast !== tail && fast.next !== tail) {\n fast = fast.next.next;\n slow = slow.next;\n }\n const root = new TreeNode(slow.val);\n root.left = helper(head, slow);\n root.right = helper(slow.next, tail);\n return root\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111667789","body":"A small trick here is `pa !== pb` and `return pa`. For negative scenarios, if given Lists were not intersected, then one of the Lists must be pointing to `null`, and then returning `null` is expected answer. \n\n```js\nvar getIntersectionNode = function(headA, headB) {\n let pa = headA, pb = headB;\n while(pa !== pb) {\n pa = pa ? pa.next : headB;\n pb = pb ? pb.next : headA;\n }\n return pa\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3115364562","body":"Find the intersection node first, and move the slow pointer to the head, and slowly move both of the pointers till they meet each other(can be proved)\n\n```js\nvar detectCycle = function(head) {\n if (!head) return head;\n let fast = head, slow = head;\n // step1: find the intersection node\n while(fast && fast.next) {\n fast = fast.next.next;\n slow = slow.next;\n // step2: find the entry of the cycle\n if (fast === slow) {\n slow = head;\n while(fast !== slow) {\n fast = fast.next\n slow = slow.next\n }\n return slow;\n }\n }\n return null;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3120830111","body":"In JS, we need to build a double linked list data structure by our own. The rest of the logic is quite straight forward - which use hashmap to save key-node, and use linked list to store access frequency. \n\n```js\nclass DoubleLinkedListNode {\n constructor(key, value) {\n this.key = key;\n this.value = value;\n this.prev = null;\n this.next = null;\n }\n}\n\nclass LRUCache {\n constructor(capacity) {\n this.capacity = capacity;\n this.usedSpace = 0;\n\n this.hashmap = {};\n this.dummyHead = new DoubleLinkedListNode(null, null);\n this.dummyTail = new DoubleLinkedListNode(null, null);\n this.dummyHead.next = this.dummyTail;\n this.dummyTail.prev = this.dummyHead;\n }\n\n _isFull() {\n return this.usedSpace === this.capacity;\n }\n _addToHead(node) {\n const currentHead = this.dummyHead.next;\n\n node.next = currentHead;\n node.prev = this.dummyHead;\n currentHead.prev = node;\n this.dummyHead.next = node;\n\n return node;\n }\n _removeNode(node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n node.next = null\n node.prev = null\n return node\n }\n\n get(key) {\n if (this.hashmap[key] !== undefined) {\n const node = this.hashmap[key];\n this._addToHead(this._removeNode(node));\n return node.value\n } else {\n return -1\n }\n }\n put(key, value) {\n if (this.hashmap[key] !== undefined) {\n const node = this.hashmap[key];\n node.value = value;\n this._addToHead(this._removeNode(node))\n } else {\n if (this._isFull()) {\n const nodeNeedToEvict = this.dummyTail.prev;\n delete this.hashmap[nodeNeedToEvict.key];\n this._removeNode(nodeNeedToEvict);\n this.usedSpace --\n }\n const node = new DoubleLinkedListNode(key, value);\n this.hashmap[key] = node;\n this._addToHead(node);\n this.usedSpace ++\n }\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123671763","body":"Easy\n\n```js\nvar maxDepth = function(root) {\n if (!root) return 0\n return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3124879038","body":"DFS\n\n```js\nvar isSameTree = function(p, q) {\n if (!p && !q) return true\n if (!p || !q) return false\n return p.val === q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130312988","body":"DFS will be much simpler. BFS will need to pass a lot of context(params) into helper function which I don't like and not maintainable as well.\n\n\n```js\nvar sumNumbers = function(root) {\n const res = [];\n dfs(root, '')\n return res.reduce((prev, cur) => prev + cur, 0);\n\n\n function dfs(node, str) {\n if (!node.left && !node.right) {\n res.push(+`${str}${node.val}`);\n return;\n }\n if (node.left) dfs(node.left, `${str}${node.val}`);\n if (node.right) dfs(node.right, `${str}${node.val}`);\n } \n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135220392","body":"Using BFS when accessing the first in the queue, that's the leftest node. And because BFS is looping thru by level, so the last time going thru the queue is the most bottom level. \n\n```js\nvar findBottomLeftValue = function(root) {\n const queue = [root];\n let min = null;\n while(queue.length) {\n const size = queue.length;\n for(let i = 0; i < size; i++) {\n const node = queue.shift();\n if (i === 0) min = node.val\n \n\n if (node.left) queue.push(node.left);\n if (node.right) queue.push(node.right);\n }\n }\n return min;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138261960","body":"Can use either `DFS` or `BFS` to solve the problem. DFS is more simple to me: \n\n```js\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n let res = [];\n function dfs(node) {\n if (!node) {\n res.push('null');\n return;\n }\n res.push(String(node.val));\n dfs(node.left)\n dfs(node.right)\n }\n dfs(root);\n console.log(res.join(','))\n return res.join(',')\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n const datas = data.split(',');\n let i = 0;\n return dfs()\n\n function dfs() {\n const char = datas[i];\n if (char === 'null') {\n i ++\n return null\n }\n const node = new TreeNode(+char);\n i ++\n node.left = dfs()\n node.right = dfs()\n return node;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144933267","body":"Use BFS to save the row and column as index, and then sort these indexes. I think the complexity of this problem is how to mange those keys, 2 dimensions keys are quite intricate. \n\nRuntime complexity: O(nlogn), looping over the nodes is O(n), and using `sort` functions are O(nlogn), the bottle neck is sorting functions\nMemory complexity: O(n), use a hashmap to store all nodes\n\n```js\nvar verticalTraversal = function(root) {\n const map = {}\n const queue = [{\n node: root,\n col: 0,\n }];\n let row = 0;;\n while(queue.length) {\n const size = queue.length;\n for(let i = 0; i < size; i++) {\n const cur = queue.shift();\n const node = cur.node;\n if (map[cur.col]?.[row] === undefined) {\n map[cur.col] = {\n ...map[cur.col],\n [row]: [node.val]\n }\n } else {\n map[cur.col][row].push(node.val);\n }\n if (node.left) queue.push({\n node: node.left, \n col: cur.col - 1,\n })\n if (node.right) queue.push({\n node: node.right,\n col: cur.col + 1\n })\n }\n row ++\n }\n const orderByColumn = Object.entries(map).sort(([key1, _], [key2, __]) => Number(key1) - Number(key2));\n const flatternByColumn = orderByColumn.map(i => {\n const column = i[1];\n const arr = [];\n Object.entries(column).sort(([row1], [row2]) => row1 - row2).forEach(([_row, nodes]) => {\n const orderedNodes = nodes.sort((a, b) => a - b);\n arr.push(...orderedNodes)\n })\n return arr\n })\n return flatternByColumn\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146516199","body":"```js\nvar twoSum = function(nums, target) {\n const map = {}\n for(let i = 0; i < nums.length; i ++) {\n const num = nums[i];\n const diff = target - num\n if (map[diff] !== undefined) {\n return [map[diff], i];\n } else {\n map[num] = i;\n }\n }\n return [-1, -1]\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148419003","body":"```js\nvar topKFrequent = function(nums, k) {\n const map = {};\n for(let i = 0; i < nums.length; i++) {\n map[nums[i]] = map[nums[i]] ? map[nums[i]] + 1 : 1;\n }\n const maxCnt = Math.max(...Object.values(map));\n\n const buckets = Array.from({length: maxCnt + 1}, () => []);\n for(let [num, count] of Object.entries(map)) {\n buckets[count].push(num);\n }\n\n const res = [];\n for(let i = maxCnt; i >= 0 && res.length < k; i--) {\n res.push(...buckets[i])\n }\n \n return res.map(i => +i)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149124973","body":"Using brute force at the beginning, and didn't think of can use map to reduce runtime: \n\n```js\nvar numberOfBoomerangs = function(points) {\n let res = 0;\n let map = {}\n for(let [x1, y1] of points) {\n map = {}\n for(let [x2, y2] of points) {\n const distance = (x1 - x2) ** 2 + (y1 - y2) ** 2;\n const count = map[distance] ?? 0;\n res += count * 2;\n map[distance] = count + 1 \n }\n }\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3155367267","body":"Two pointers classic problem (sliding window): \n\n```js\nvar lengthOfLongestSubstring = function(s) {\n let left = 0, right = 0, res = 0\n const window = {};\n while(right < s.length) {\n const right_char = s[right ++];\n window[right_char] = window[right_char] ? window[right_char] + 1 : 1;\n while (window[right_char] > 1) {\n let remove_char = s[left ++];\n window[remove_char] --;\n }\n res = Math.max(right - left, res);\n }\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160227870","body":"so hard: \n\n\n```js\nvar findSubstring = function(s, words) {\n\n const wordLen = words[0].length;\n const numWords = words.length;\n const totalLen = wordLen * numWords;\n const n = s.length;\n const res = [];\n\n if (n < totalLen) return [];\n\n const wordCount = new Map();\n for (let word of words) {\n wordCount.set(word, (wordCount.get(word) || 0) + 1);\n }\n\n // we loop over wordLen offsets\n for (let offset = 0; offset < wordLen; offset++) {\n let left = offset, count = 0;\n const seen = new Map();\n\n for (let right = offset; right + wordLen <= n; right += wordLen) {\n const word = s.slice(right, right + wordLen);\n\n if (wordCount.has(word)) {\n seen.set(word, (seen.get(word) || 0) + 1);\n count++;\n\n // we shrink window if word is overused\n while (seen.get(word) > wordCount.get(word)) {\n const leftWord = s.slice(left, left + wordLen);\n seen.set(leftWord, seen.get(leftWord) - 1);\n left += wordLen;\n count--;\n }\n\n // Valid window\n if (count === numWords) {\n res.push(left);\n const firstWord = s.slice(left, left + wordLen);\n seen.set(firstWord, seen.get(firstWord) - 1);\n left += wordLen;\n count--;\n }\n } else {\n seen.clear();\n count = 0;\n left = right + wordLen;\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3164450266","body":"```js\nvar minSubarray = function(nums, p) {\n let totalSum = nums.reduce((a, b) => a + b, 0);\n\n // Find the remainder when total sum is divided by p\n let rem = totalSum % p;\n if (rem === 0) return 0; // If the remainder is 0, no subarray needs to be removed\n\n let prefixMod = new Map();\n prefixMod.set(0, -1); // Initialize to handle full prefix\n let prefixSum = 0;\n let minLength = nums.length;\n\n for (let i = 0; i < nums.length; i++) {\n prefixSum += nums[i];\n let currentMod = prefixSum % p;\n let targetMod = (currentMod - rem + p) % p;\n\n if (prefixMod.has(targetMod)) {\n minLength = Math.min(minLength, i - prefixMod.get(targetMod));\n }\n\n prefixMod.set(currentMod, i);\n }\n\n return minLength === nums.length ? -1 : minLength;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168150001","body":"```js\nvar middleNode = function(head) {\n if (!head || !head.next) return head;\n let fast = head, slow = head;\n while(fast && fast.next) {\n fast = fast.next.next;\n slow = slow.next\n } \n return slow;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170748221","body":"```js\nvar removeDuplicates = function(nums) {\n let fast = 0, slow = 0;\n while(fast < nums.length) {\n if (nums[slow] !== nums[fast]) {\n nums[++slow] = nums[fast];\n }\n fast ++\n }\n return slow + 1\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172646559","body":"Binary Search\n\n```js\nvar searchInsert = function(nums, target) {\n let left = 0, right = nums.length;\n while(left < right) {\n const mid = left + Math.floor((right - left) / 2);\n if (nums[mid] >= target) {\n right = mid\n } else {\n left = mid + 1\n }\n }\n return left;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173319860","body":" Too long to put down DeQueue implementation in JS. Don't think this will be asked in an interview: \n\n```js\nvar maxSlidingWindow = function (nums, k) {\n const res = [];\n const dequeue = new Dequeue([]);\n // 前 k - 1 个数入队\n for (let i = 0; i < k - 1; i++) {\n dequeue.push(nums[i]);\n }\n\n // 滑动窗口\n for (let i = k - 1; i < nums.length; i++) {\n dequeue.push(nums[i]);\n res.push(dequeue.max());\n dequeue.shift(nums[i - k + 1]);\n }\n return res;\n};\n\nclass Dequeue {\n constructor(nums) {\n this.list = nums;\n }\n\n push(val) {\n const nums = this.list;\n // 保证数据从队头到队尾递减\n while (nums[nums.length - 1] < val) {\n nums.pop();\n }\n nums.push(val);\n }\n\n // 队头出队\n shift(val) {\n let nums = this.list;\n if (nums[0] === val) {\n // 这里的js实现shift()理论上复杂度应该是O(k), 就不去真实实现一个O(1)出队的队列了,意思到位即可\n nums.shift();\n }\n }\n\n max() {\n return this.list[0];\n }\n}\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3179501468","body":"```js\nvar findJudge = function (n, trust) {\n const count = new Array(n + 1).fill(0);\n for (const edge of trust) {\n const x = edge[0];\n const y = edge[1];\n count[y]++;\n count[x]--;\n }\n for (let i = 1; i <= n; ++i) {\n if (count[i] === n - 1) {\n return i;\n }\n }\n return -1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3184086046","body":"```js\nvar possibleBipartition = function(N, dislikes) {\n const graph = [...Array(N+1)].map(() => []);\n const visited = Array(N+1).fill(false);\n const color = Array(N+1).fill(0);\n\n for(let [u, v] of dislikes) {\n graph[u].push(v);\n graph[v].push(u);\n }\n\n for(let i = 1; i <= N; i++) {\n if(!colorNodes(i)) return false;\n }\n return true;\n\n function colorNodes(node) {\n if(visited[node]) return true;\n const currColor = new Set([1, 2]);\n\n\t\t// remove colors used by neighbors\n for(let child of graph[node]) {\n if(color[child] === 1) currColor.delete(1);\n if(color[child] === 2) currColor.delete(2);\n }\n\n\t\t// no color is available return false\n if(currColor.size === 0) return false;\n\t\t\n\t\t// assign the smallest available color\n color[node] = Math.min(...currColor);\n visited[node] = true; \n\n for(let child of graph[node]) {\n if(!colorNodes(child)) return false; \n }\n return true;\n }\n};\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"stonehl":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073791924","body":"C++代码:\n`class Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n vector res;\n int n = num.size();\n for (int i=n-1; i>=0; --i) {\n int sum = num[i] + k % 10;\n k /= 10;\n if (sum >= 10) {\n k++;\n sum -= 10;\n }\n res.push_back(sum);\n }\n for (; k > 0; k /= 10) {\n res.push_back(k % 10);\n }\n reverse(res.begin(), res.end());\n return res;\n }\n};`","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097159903","body":"### 思路:\n1. 异常情况判断;\n2. 统计链表长度, 同时将链表的收尾相连;\n3. 将k对链表长度取余,余数为0表示刚好旋转了链表长度的整数倍,链表节点位置不变;\n4. 新的链表头节点是原链表中第 n - k 个节点。\n### C++代码\n```\nclass Solution {\npublic:\n ListNode* rotateRight(ListNode* head, int k) {\n if (head == nullptr || head->next == nullptr || k == 0)\n return head;\n int count = 1; // 用来统计链表长度\n ListNode* tmp = head;\n while (tmp->next != nullptr) {\n count++;\n tmp = tmp->next; // 滑动到链表尾部\n }\n k %= count;\n //如果刚好是链表长度的倍数,则不进行旋转\n if (k == 0)\n return head;\n tmp->next = head;\n // \n for (int i=0; i < count - k; i++) {\n tmp = tmp->next;\n }\n ListNode* newHead = tmp->next;\n tmp->next = nullptr;\n return newHead;\n }\n};\n```\n### 时间复杂度\nO(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103550594","body":"### 思路:\n使用递归的方法解题\n1. 找递归终止条件,当链表为空或链表只有一个元素时,没法交换,终止递归,返回当前节点;\n2. 每一次递归需要返回的值是交换后的子链表的头节点;\n\n### 代码:\n```\nclass Solution {\npublic:\n ListNode* swapPairs(ListNode* head) {\n if (head == nullptr || head->next == nullptr) {\n return head;\n }\n ListNode* next = head->next;\n head->next = swapPairs(next->next);\n next->next = head;\n return next;\n }\n};\n\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127754666","body":"### 思路:\n使用深度优先搜索的方法,\n1. 先找返回条件, 如果两个节点都为空,则返回true;\n2. 如果两个节点都不为空,并且这两个节点的值相等则分别递归判断这两个节点的左子树和右子树的值是否相等,如果相等,则返回true, 否则返回false。\n\n### 代码:\n```\nclass Solution {\npublic:\n bool isSameTree(TreeNode* p, TreeNode* q) {\n if(p==nullptr && q==nullptr) {\n return true;\n }\n if (p && q && (p->val == q->val)) {\n return isSameTree(p->right, q->right) && isSameTree(p->left, q->left);\n }\n return false;\n\n }\n};\n```\n### 复杂度分析:\n时间复杂度O(N),N为两棵树节点的最小值","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3151160755","body":"### 思路:\n将每个距离的出现次数记录在哈希表中,然后遍历哈希表,计算并累加回旋镖的个数。\n\n### 代码:\n```\nclass Solution {\npublic:\n int numberOfBoomerangs(vector>& points) {\n int n = points.size();\n int res = 0;\n if (n < 3)\n return res;\n\n int ans = 0;\n for (auto &p : points) {\n unordered_map cnt;\n for (auto &q : points) {\n int dis = (p[0] - q[0]) * (p[0] - q[0]) + (p[1] - q[1]) * (p[1] - q[1]);\n ++cnt[dis];\n }\n for (auto &[_, m] : cnt) {\n ans += m * (m - 1);\n }\n }\n return ans;\n\n }\n};\n```\n时间复杂度:O(n2)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3174960911","body":"### 思路:\n使用双端队列来维护滑动窗口内的最大值\n### 代码:\n```\nclass Solution {\npublic:\n vector maxSlidingWindow(vector& nums, int k) {\n deque q;\n int n = nums.size();\n vector res;\n for(int i = 0; i < n; i++) {\n if(q.size() && i - q.front() >= k)\n q.pop_front();\n while(q.size() && nums[q.back()] <= nums[i]) q.pop_back();\n q.push_back(i);\n if(i >= k - 1) {\n res.push_back(nums[q.front()]);\n }\n }\n return res;\n }\n};\n```\n### 复杂度:\n时间复杂度:O(n)","onTime":true},null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3201130868","body":"### 思路:\n基数排序\n### 代码:\n```\nclass Solution {\npublic:\n vector sortArray(vector& nums) {\n const int NUM = 50000;\n int arr[NUM*10+10];\n bzero(arr,sizeof(arr));\n for(int&num:nums){\n num+=NUM;\n arr[num]+=1;\n }\n int cur = 0;\n for(int i = 0;i<(NUM*10+10);++i){\n int tmp = arr[i];\n while(tmp--){\n nums[cur++] = i-NUM;\n }\n }\n return nums;\n }\n};\n```\n### 时间复杂度: O(N)","onTime":true},null,null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3234026083","body":"### 思路:\n1. 先统计t中每个字符出现的次数;\n2. 初始化左右指针,以及记录答案的变量;\n3. 右指针移动,更新计数。如果当前字符是t中的字符(即计数大于0),则减小cntT;\n4. 当cntT为0时,说明当前窗口包含了t的所有字符,然后尝试移动左指针缩小窗口;\n5. 在缩小窗口时,如果移除了t中的字符,则增加cntT,并更新答案;\n6. 最后根据是否找到答案返回相应的子串。\n### 代码:\n```\nclass Solution {\npublic:\n string minWindow(string s, string t) {\n vector cnt(128, 0);\n for (char c : t) {\n cnt[c]++;\n }\n \n int l = 0, r = 0, ansL = 0, ansR = 0, ans = INT_MAX, cntT = t.length();\n \n while (r < s.length()) {\n if (cnt[s[r]]-- > 0) {\n cntT--;\n }\n r++;\n \n while (cntT == 0) {\n if (r - l < ans) {\n ans = r - l;\n ansL = l;\n ansR = r;\n }\n if (cnt[s[l]]++ == 0) {\n cntT++;\n }\n l++;\n }\n }\n \n return ans == INT_MAX ? \"\" : s.substr(ansL, ansR - ansL);\n }\n};\n```\n### 时间复杂度:O(n)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245701951","body":"### 思路:\n1. 初始化标记数组 visited,避免重复访问;\n2. 遍历每个格子,使用DFS搜索整个岛屿。\n\n### 代码:\n```\nclass Solution {\nprivate:\n int count;\n int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向\n void dfs(vector>& grid, vector>& visited, int x, int y) {\n for (int i = 0; i < 4; i++) {\n int nextx = x + dir[i][0];\n int nexty = y + dir[i][1];\n if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过\n if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的\n\n visited[nextx][nexty] = true;\n count++;\n dfs(grid, visited, nextx, nexty);\n }\n }\n }\n\npublic:\n int maxAreaOfIsland(vector>& grid) {\n int n = grid.size(), m = grid[0].size();\n vector> visited = vector>(n, vector(m, false));\n\n int result = 0;\n for (int i = 0; i < n; i++) {\n for (int j = 0; j < m; j++) {\n if (!visited[i][j] && grid[i][j] == 1) {\n count = 1;\n visited[i][j] = true;\n dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true\n result = max(result, count);\n }\n }\n }\n return result;\n }\n};\n```\n### 时间复杂度: O(MN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249613575","body":"### 思路:\n使用多源广度优先搜索,先找到所有陆地放入队列,然后从陆地开始向外搜索,最后被触及的海洋就是离所有陆地最远的海洋。\n### 代码:\n```\nclass Solution {\npublic:\n int maxDistance(vector>& grid) {\n int n = grid.size();\n vector> directions = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};\n queue> q;\n \n for (int i = 0; i < n; i++) {\n for (int j = 0; j < n; j++) {\n if (grid[i][j] == 1) {\n q.push({i, j});\n }\n }\n }\n \n // 如果全是海洋或者全是陆地\n if (q.empty() || q.size() == n * n) return -1;\n \n int distance = -1;\n \n // 2. 多源 BFS\n while (!q.empty()) {\n int size = q.size();\n distance++;\n \n for (int s = 0; s < size; s++) {\n auto [x, y] = q.front();\n q.pop();\n \n for (auto [dx, dy] : directions) {\n int nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] == 0) {\n grid[nx][ny] = 1; // 标记为已访问(变为陆地)\n q.push({nx, ny});\n }\n }\n }\n }\n \n return distance;\n }\n};\n```\n### 时间复杂度: O(N²)","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3271218211","body":"### 代码:\n```\nclass Solution {\npublic:\n int longestCommonSubsequence(string text1, string text2) {\n int m = text2.length();\n vector f(m + 1);\n for (char x : text1) {\n for (int j = 0, pre = 0; j < m; j++) {\n int tmp = f[j + 1];\n f[j + 1] = x == text2[j] ? pre + 1 : max(f[j + 1], f[j]);\n pre = tmp;\n }\n }\n return f[m];\n }\n};\n```\n### 时间复杂度:O(nm)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289595360","body":"\n### 代码:\n```\nclass Solution {\npublic:\n int findTargetSumWays(vector& nums, int target) {\n int s = reduce(nums.begin(), nums.end()) - abs(target);\n if (s < 0 || s % 2) {\n return 0;\n }\n\n int m = s / 2; // 背包容量\n int n = nums.size();\n vector memo(n, vector(m + 1, -1)); // -1 表示没有计算过\n\n // lambda 递归函数\n auto dfs = [&](this auto&& dfs, int i, int c) -> int {\n if (i < 0) {\n return c == 0;\n }\n int& res = memo[i][c]; // 注意这里是引用\n if (res != -1) { // 之前计算过\n return res;\n }\n if (c < nums[i]) {\n return res = dfs(i - 1, c); // 只能不选\n }\n return res = dfs(i - 1, c) + dfs(i - 1, c - nums[i]); // 不选 + 选\n };\n\n return dfs(n - 1, m);\n }\n};\n```\n时间复杂度:O(nm)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316013499","body":"### 代码:\n```\nclass Solution {\npublic:\n ListNode* mergeKLists(vector& lists) {\n auto cmp = [](const ListNode* a, const ListNode* b) {\n return a->val > b->val; // 最小堆\n };\n priority_queue, decltype(cmp)> pq;\n for (auto head : lists) {\n if (head) {\n pq.push(head); // 把所有非空链表的头节点入堆\n }\n }\n\n ListNode dummy{}; // 哨兵节点,作为合并后链表头节点的前一个节点\n auto cur = &dummy;\n while (!pq.empty()) { // 循环直到堆为空\n auto node = pq.top(); // 剩余节点中的最小节点\n pq.pop();\n if (node->next) { // 下一个节点不为空\n pq.push(node->next); // 下一个节点有可能是最小节点,入堆\n }\n cur->next = node; // 把 node 添加到新链表的末尾\n cur = cur->next; // 准备合并下一个节点\n }\n return dummy.next; // 哨兵节点的下一个节点就是新链表的头节点\n }\n};\n```\n### 时间复杂度:\nO(Llogm),其中 m 为 lists 的长度,L 为所有链表的长度之和。","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuyuanzhang118":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074090351","body":"## 算法思路分析\n\n这是一个将数组形式的整数与普通整数相加的算法,采用了模拟手工加法的思路:\n\n### 核心思路\n1. **从右到左逐位相加**:模拟手工加法,从最低位开始处理\n2. **处理进位**:当两位数字相加结果 ≥ 10 时,产生进位\n3. **处理不同长度**:通过 `num[len-1] || 0` 处理数组已遍历完的情况\n4. **逆序构建结果**:由于是从低位到高位计算,最后需要反转数组\n\n```JavaScript\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(num, k) {\n let res = []\n let len = num.length\n let carry = 0\n while(len > 0 || k > 0) {\n let a = num[len - 1] || 0\n let b = k % 10\n let sum = a + b + carry\n res.push(sum % 10)\n carry = sum >= 10 ? 1 : 0\n len--\n k = Math.floor(k / 10)\n }\n if (carry) {\n res.push(1)\n }\n return res.reverse()\n};\n```\n\n### 时间复杂度\n**O(max(N, log K))**\n- N 是数组 `num` 的长度\n- log K 是整数 k 的位数\n- 循环次数取决于较长的那个数\n\n### 空间复杂度\n**O(max(N, log K))**\n- 结果数组 `res` 的长度最多为 max(N, log K) + 1\n- 其他变量占用常数空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3079209775","body":"## 算法思路分析\n核心思想:双向遍历\n\n这个算法使用了一种巧妙的双向遍历方法来解决问题:\n\n1. 第一次遍历(从左到右) :\n \n - 记录每个位置到其左边最近字符c的距离\n - 使用变量 prev 记录上一个字符c的位置\n - 对于每个位置i,距离为 i - prev\n2. 第二次遍历(从右到左) :\n \n - 计算每个位置到其右边最近字符c的距离\n - 与第一次遍历的结果取最小值,得到最终答案\n - 对于每个位置i,距离为 prev - i\n\n## 代码\n```Javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const n = s.length;\n const answer = new Array(n).fill(Infinity);\n \n // 第一次遍历:从左到右,记录每个位置到左边最近字符c的距离\n let prev = -Infinity;\n for (let i = 0; i < n; i++) {\n if (s[i] === c) {\n prev = i;\n }\n answer[i] = i - prev;\n }\n \n // 第二次遍历:从右到左,更新每个位置到右边最近字符c的距离\n prev = Infinity;\n for (let i = n - 1; i >= 0; i--) {\n if (s[i] === c) {\n prev = i;\n }\n answer[i] = Math.min(answer[i], prev - i);\n }\n \n return answer;\n};\n```\n\n## 复杂度分析\n\n时间复杂度:O(n)\n- 需要遍历字符串两次,每次遍历都是O(n)\n- 总时间复杂度为O(n) + O(n) = O(n)\n- 这是最优的时间复杂度,因为至少需要访问每个字符一次\n\n空间复杂度:O(n)\n- 需要创建一个长度为n的结果数组 answer\n- 除了结果数组外,只使用了常数个额外变量( prev , i , n )\n- 如果不计算返回值所需的空间,额外空间复杂度为O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084609047","body":"### 算法设计思路\n\n**核心数据结构:**\n- 使用数组 `stack` 作为底层存储结构\n- 使用 `maxSize` 记录栈的最大容量\n- 数组索引 0 为栈底,数组末尾为栈顶\n\n### 代码\n\n```JavaScript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.maxSize = maxSize;\n this.stack = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.stack.length < this.maxSize) {\n this.stack.push(x);\n }\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.stack.length === 0) {\n return -1;\n }\n return this.stack.pop();\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n // 对栈底的k个元素进行增量操作\n // 如果栈中元素总数小于k,则对所有元素进行增量操作\n const elementsToIncrement = Math.min(k, this.stack.length);\n for (let i = 0; i < elementsToIncrement; i++) {\n this.stack[i] += val;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n### 时间复杂度分析\n\n| 方法 | 时间复杂度 | 分析 |\n|------|------------|------|\n| **构造函数** | O(1) | 仅初始化两个变量 |\n| **push(x)** | O(1) | 数组末尾添加元素,均摊时间复杂度为 O(1) |\n| **pop()** | O(1) | 数组末尾删除元素 |\n| **increment(k, val)** | O(min(k, n)) | 需要遍历栈底的 k 个元素,n 为当前栈大小 |\n\n### 空间复杂度分析\n\n| 方面 | 空间复杂度 | 分析 |\n|------|------------|------|\n| **整体空间** | O(maxSize) | 最坏情况下数组存储 maxSize 个元素 |\n| **辅助空间** | O(1) | 除了存储栈元素外,只使用常数额外空间 |\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3092430277","body":"### 算法思路分析\n\n**核心思想:使用栈处理嵌套结构**\n\n这是一个典型的括号匹配问题,需要处理嵌套的编码结构。算法的关键在于:\n1. **识别模式** - `k[encoded_string]` 表示重复 k 次\n2. **处理嵌套** - 可能存在多层嵌套,如 `3[a2[c]]`\n3. **状态管理** - 需要记录当前的数字、字符串和历史状态\n\n**算法步骤:**\n1. 遍历字符串的每个字符\n2. 遇到数字:累积构建重复次数(支持多位数)\n3. 遇到 `[`:将当前状态(字符串和数字)压入栈,重置当前状态\n4. 遇到 `]`:从栈中弹出之前的状态,重复当前字符串并拼接\n5. 遇到字母:直接添加到当前字符串\n\n### 代码实现\n\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let currentNum = 0;\n let currentStr = '';\n \n for (let i = 0; i < s.length; i++) {\n const char = s[i];\n \n if (char >= '0' && char <= '9') {\n // 构建数字(可能是多位数)\n currentNum = currentNum * 10 + parseInt(char);\n } else if (char === '[') {\n // 遇到左括号,将当前状态入栈\n stack.push([currentStr, currentNum]);\n currentStr = '';\n currentNum = 0;\n } else if (char === ']') {\n // 遇到右括号,出栈并重复字符串\n const [prevStr, num] = stack.pop();\n currentStr = prevStr + currentStr.repeat(num);\n } else {\n // 普通字符,直接添加到当前字符串\n currentStr += char;\n }\n }\n \n return currentStr;\n};\n```\n\n### 复杂度分析\n\n**时间复杂度:O(n + m)**\n- n:输入字符串长度\n- m:输出字符串长度\n- 每个字符最多被处理一次\n- 字符串重复操作的总时间与最终输出长度成正比\n\n**空间复杂度:O(n + m)**\n- **栈空间**:O(d) - d 为最大嵌套深度,最坏情况 O(n)\n- **字符串存储**:O(m) - 存储中间结果和最终结果\n- **总空间**:O(n + m)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092434643","body":"## 核心算法思路\n\n使用两个栈实现队列:\n- `inStack`: 用于接收新元素的输入\n- `outStack`: 用于输出元素\n\n当需要 pop 或 peek 时,如果 outStack 为空,就将 inStack 中的所有元素转移到 outStack 中,这样就实现了先入先出的特性。\n\n## 代码实现\n\n```javascript\n\nvar MyQueue = function() {\n this.inStack = []; // 用于输入的栈\n this.outStack = []; // 用于输出的栈\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.inStack.push(x);\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n if (this.outStack.length === 0) {\n // 将inStack中的所有元素转移到outStack\n while (this.inStack.length > 0) {\n this.outStack.push(this.inStack.pop());\n }\n }\n return this.outStack.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if (this.outStack.length === 0) {\n // 将inStack中的所有元素转移到outStack\n while (this.inStack.length > 0) {\n this.outStack.push(this.inStack.pop());\n }\n }\n return this.outStack[this.outStack.length - 1];\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return this.inStack.length === 0 && this.outStack.length === 0;\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```\n\n## 复杂度分析\n\n**时间复杂度**:\n- push: O(1)\n- pop: 均摊 O(1)\n- peek: 均摊 O(1) \n- empty: O(1)\n\n**空间复杂度**: O(n)\n\n**均摊 O(1) 的原理**:虽然单次 pop 或 peek 操作在最坏情况下可能需要 O(n) 时间,但每个元素最多只会被转移一次,所以 n 个操作的总时间复杂度为 O(n),均摊下来每个操作为 O(1)。\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094581867","body":"## 算法思路\n- 关键观察:如果前缀[0...i]的最大值 ≤ 后缀[i+1...n-1]的最小值,则可以在位置i处分块\n- 这保证了前面块的所有元素都不大于后面块的任何元素,分别排序后连接仍然有序\n\n## 代码\n```javascript\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const n = arr.length;\n if (n <= 1) return n;\n \n // 计算前缀最大值数组\n const prefixMax = new Array(n);\n prefixMax[0] = arr[0];\n for (let i = 1; i < n; i++) {\n prefixMax[i] = Math.max(prefixMax[i-1], arr[i]);\n }\n \n // 计算后缀最小值数组\n const suffixMin = new Array(n);\n suffixMin[n-1] = arr[n-1];\n for (let i = n-2; i >= 0; i--) {\n suffixMin[i] = Math.min(suffixMin[i+1], arr[i]);\n }\n \n let chunks = 1; // 至少有一个分块\n \n // 检查每个可能的分块点\n for (let i = 0; i < n-1; i++) {\n // 如果前缀最大值 <= 后缀最小值,可以在i处分块\n if (prefixMax[i] <= suffixMin[i+1]) {\n chunks++;\n }\n }\n \n return chunks;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 需要三次遍历数组\n- 空间复杂度:O(n) - 需要两个额外数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097244383","body":"## 核心思路 :\n- 计算链表长度并找到尾节点\n- 优化k值避免重复旋转\n- 找到新的尾节点(第length-k个节点)\n- 重新连接:断开新尾节点与新头节点,原尾节点连接原头节点\n\n## 代码:\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n // 边界情况处理\n if (!head || !head.next || k === 0) {\n return head;\n }\n \n // 1. 计算链表长度并找到尾节点\n let length = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n length++;\n }\n \n // 2. 优化k值,避免不必要的旋转\n k = k % length;\n if (k === 0) {\n return head;\n }\n \n // 3. 找到新的尾节点(从头开始第length-k个节点)\n let newTail = head;\n for (let i = 0; i < length - k - 1; i++) {\n newTail = newTail.next;\n }\n \n // 4. 新的头节点是新尾节点的下一个节点\n let newHead = newTail.next;\n \n // 5. 断开连接并重新连接\n newTail.next = null; // 断开新尾节点与新头节点的连接\n tail.next = head; // 原尾节点连接到原头节点\n \n return newHead;\n};\n```\n\n## 复杂度分析 :\n- 时间复杂度 :O(n) - 需要遍历链表计算长度和找到切分点\n- 空间复杂度 :O(1) - 只使用常数个额外变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103625610","body":"## 算法思路\n- 虚拟头节点技巧: 简化边界条件处理\n- 三指针法: prev, first, second 精确控制交换过程\n- 原地交换: 只修改指针,不创建新节点\n- 边界处理: 空链表和单节点的特殊情况\n\n## 代码实现\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n // 边界情况:空链表或只有一个节点\n if (!head || !head.next) {\n return head;\n }\n \n // 创建虚拟头节点,简化操作\n let dummy = new ListNode(0);\n dummy.next = head;\n let prev = dummy;\n \n // 当存在至少两个节点时进行交换\n while (prev.next && prev.next.next) {\n // 定义要交换的两个节点\n let first = prev.next;\n let second = prev.next.next;\n \n // 执行交换操作\n // 步骤:prev -> first -> second -> ... \n // 变为:prev -> second -> first -> ...\n prev.next = second;\n first.next = second.next;\n second.next = first;\n \n // 移动prev指针到已交换的第二个节点(现在是first)\n prev = first;\n }\n \n return dummy.next;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) \n- 空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109219828","body":"## 算法思路\n- 算法的核心思想是利用有序链表的特性:\n- 选择中间节点作为根节点,保证树的平衡性\n- 递归地将左半部分构建为左子树,右半部分构建为右子树\n- 最优解使用中序遍历的特性,避免重复遍历链表\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n // 计算链表长度\n function getLength(head) {\n let length = 0;\n while (head) {\n length++;\n head = head.next;\n }\n return length;\n }\n \n const length = getLength(head);\n let current = head;\n \n // 中序遍历构建BST\n function buildBST(start, end) {\n if (start > end) return null;\n \n const mid = Math.floor((start + end) / 2);\n \n // 先构建左子树\n const left = buildBST(start, mid - 1);\n \n // 创建根节点(当前链表节点)\n const root = new TreeNode(current.val);\n current = current.next;\n \n // 再构建右子树\n const right = buildBST(mid + 1, end);\n \n root.left = left;\n root.right = right;\n \n return root;\n }\n \n return buildBST(0, length - 1);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 每个节点只访问一次\n- 空间复杂度:O(log n) - 仅递归栈深度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3117083288","body":"## 算法思路\n双指针法 :让两个指针分别从两个链表头部开始遍历,当指针到达链表末尾时跳转到另一个链表的头部。这样可以消除两个链表的长度差异,如果有交点,两个指针会在交点相遇;如果没有交点,两个指针最终都会变成 null。\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function(headA, headB) {\n // 如果任一链表为空,直接返回null\n if (!headA || !headB) {\n return null;\n }\n \n // 双指针法:让两个指针分别遍历两个链表\n // 当指针到达链表末尾时,跳转到另一个链表的头部\n // 这样可以消除长度差,如果有交点,两指针会在交点相遇\n let pA = headA;\n let pB = headB;\n \n // 当两个指针不相等时继续遍历\n while (pA !== pB) {\n // 如果pA到达末尾,跳转到headB;否则继续下一个节点\n pA = pA === null ? headB : pA.next;\n // 如果pB到达末尾,跳转到headA;否则继续下一个节点\n pB = pB === null ? headA : pB.next;\n }\n \n // 返回交点(如果没有交点,两指针都会变成null)\n return pA;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(m + n),其中 m 和 n 分别是两个链表的长度。每个指针最多遍历两个链表一次。\n- 空间复杂度 :O(1),只使用了两个指针变量,没有使用额外的数据结构。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3117100989","body":"## 算法思路\n- 第一阶段 :使用快慢指针检测是否有环\n- 慢指针每次移动1步,快指针每次移动2步\n- 如果有环,快慢指针必定会相遇\n- 第二阶段 :找到环的起始节点\n- 基于数学原理:从头节点到环入口的距离等于从相遇点到环入口的距离\n- 将一个指针重置到头节点,两指针同速移动直到相遇\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n // 边界情况:空链表或只有一个节点且无环\n if (!head || !head.next) {\n return null;\n }\n \n // 第一阶段:使用快慢指针检测是否有环\n let slow = head;\n let fast = head;\n \n // 快指针每次走两步,慢指针每次走一步\n while (fast && fast.next) {\n slow = slow.next;\n fast = fast.next.next;\n \n // 如果快慢指针相遇,说明存在环\n if (slow === fast) {\n break;\n }\n }\n \n // 如果没有环,返回null\n if (!fast || !fast.next) {\n return null;\n }\n \n // 第二阶段:找到环的起始节点\n // 将一个指针重置到头节点,两个指针同时以相同速度移动\n // 它们相遇的地方就是环的起始节点\n slow = head;\n while (slow !== fast) {\n slow = slow.next;\n fast = fast.next;\n }\n \n return slow; // 返回环的起始节点\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 最多遍历链表两次\n- 空间复杂度 :O(1) - 只使用常数个额外变量,满足进阶要求","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3124469572","body":"## 算法思路\n这个LRU(Least Recently Used)缓存实现采用了 哈希表 + 双向链表 的经典设计模式:\n数据结构组合 :\n - Map :用于O(1)时间复杂度的键值查找\n - 双向链表:用于维护访问顺序,支持O(1)的插入和删除操作\n - 虚拟头尾节点:简化边界条件处理\n\n## 代码\n```javascript\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.cache = new Map(); // 使用Map存储键值对\n this.head = {}; // 虚拟头节点\n this.tail = {}; // 虚拟尾节点\n this.head.next = this.tail;\n this.tail.prev = this.head;\n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n if (!this.cache.has(key)) {\n return -1;\n }\n \n // 存在则将节点移到链表头部(表示最近使用)\n const node = this.cache.get(key);\n this.removeFromList(node);\n this.addToHead(node);\n \n return node.value;\n};\n\n/** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\nLRUCache.prototype.put = function(key, value) {\n // 如果已存在,先删除旧节点\n if (this.cache.has(key)) {\n const oldNode = this.cache.get(key);\n this.removeFromList(oldNode);\n this.cache.delete(key);\n }\n \n // 创建新节点并添加到头部\n const newNode = { key, value, prev: null, next: null };\n this.cache.set(key, newNode);\n this.addToHead(newNode);\n \n // 如果超出容量,删除尾部节点(最久未使用)\n if (this.cache.size > this.capacity) {\n const tailNode = this.tail.prev;\n this.removeFromList(tailNode);\n this.cache.delete(tailNode.key);\n }\n};\n\n// 辅助方法:将节点添加到链表头部\nLRUCache.prototype.addToHead = function(node) {\n node.next = this.head.next;\n node.prev = this.head;\n this.head.next.prev = node;\n this.head.next = node;\n};\n\n// 辅助方法:从链表中删除节点\nLRUCache.prototype.removeFromList = function(node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n};\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```\n\n## 复杂度分析\n- 时间复杂度:O(1)\n- 空间复杂度:O(capacity)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124496973","body":"## 算法思路\n使用广度优先搜索(BFS)的方法来计算二叉树的最大深度:\n- 初始化 :如果根节点为空,直接返回0\n- 队列存储 :使用队列存储节点和对应的深度信息,初始将根节点和深度1入队\n- 层序遍历 :通过队列进行层序遍历,每次取出队首元素\n- 深度更新 :更新最大深度值,并将当前节点的左右子节点(如果存在)连同深度+1一起入队\n- 返回结果 :遍历完成后返回记录的最大深度\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if (!root) return 0;\n let queue = [[root, 1]];\n let maxDepth = 0;\n\n while (queue.length > 0) {\n let [node, depth] = queue.shift();\n if (node) {\n maxDepth = Math.max(maxDepth, depth);\n if (node.left) queue.push([node.left, depth + 1]);\n if (node.right) queue.push([node.right, depth + 1]);\n }\n }\n\n return maxDepth;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 O(n) ,其中n是二叉树中节点的总数\n- 空间复杂度 O(w) ,其中w是二叉树的最大宽度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3126191127","body":"## 算法思路\n使用递归的深度优先搜索(DFS)方法:\n- 基本情况 :如果两个节点都为空,返回 true\n- 边界情况 :如果只有一个节点为空,返回 false\n- 值比较 :如果两个节点的值不相等,返回 false\n- 递归检查 :同时检查左子树和右子树是否相同\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} p\n * @param {TreeNode} q\n * @return {boolean}\n */\nvar isSameTree = function(p, q) {\n if (p === null && q === null) {\n return true;\n }\n if (p === null || q === null || p.val !== q.val) {\n return false;\n }\n return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(min(m, n)),其中 m 和 n 分别是两棵树的节点数。在最坏情况下需要遍历较小树的所有节点。\n- 空间复杂度 :O(min(m, n)),递归调用栈的深度取决于树的高度。在完全平衡的树中为 O(log(min(m, n))),在完全不平衡的树中为 O(min(m, n))。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3133136375","body":"## 算法思路\n这是一个典型的二叉树深度优先搜索(DFS)问题。核心思想是:\n- 从根节点开始,沿着每条路径向下遍历\n- 在遍历过程中,将当前路径形成的数字逐步构建(当前数字 = 之前数字 × 10 + 当前节点值)\n- 当到达叶节点时,将该路径形成的完整数字加入总和\n- 递归处理左右子树,最终返回所有路径数字的总和\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root) {\n // 深度优先搜索函数\n function dfs(node, currentSum) {\n // 如果节点为空,返回0\n if (!node) {\n return 0;\n }\n \n // 计算当前路径的数字:之前的数字*10 + 当前节点值\n currentSum = currentSum * 10 + node.val;\n \n // 如果是叶节点(没有左右子树),返回当前路径形成的数字\n if (!node.left && !node.right) {\n return currentSum;\n }\n \n // 递归计算左右子树的路径数字之和\n return dfs(node.left, currentSum) + dfs(node.right, currentSum);\n }\n \n return dfs(root, 0);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) ,其中 n 是二叉树中节点的数量,需要访问每个节点一次\n- 空间复杂度:O(h) ,其中 h 是二叉树的高度,递归调用栈的深度等于树的高度\n - 最坏情况(完全不平衡的树):O(n)\n - 最好情况(完全平衡的树):O(log n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136794752","body":"## 算法思路\n广度优先搜索(BFS)\n- 使用层序遍历,从右到左遍历每一层\n- 通过队列实现,先添加右子节点再添加左子节点\n- 最后访问到的节点就是最底层最左边的节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n // 使用层序遍历(BFS)从右到左遍历每一层\n // 最后访问到的节点就是最底层最左边的节点\n let queue = [root];\n let result = root.val;\n \n while (queue.length > 0) {\n let levelSize = queue.length;\n \n // 遍历当前层的所有节点\n for (let i = 0; i < levelSize; i++) {\n let node = queue.shift();\n result = node.val; // 更新结果为当前节点值\n \n // 先添加右子节点,再添加左子节点\n // 这样在同一层中,左边的节点会后被访问到\n if (node.right) {\n queue.push(node.right);\n }\n if (node.left) {\n queue.push(node.left);\n }\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),需要遍历所有节点\n- 空间复杂度:O(w),w为树的最大宽度(队列空间)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3140223821","body":"## 算法思路\n序列化过程 :\n- 采用前序遍历(根-左-右)的方式遍历二叉树\n- 空节点用 'null' 字符串表示\n- 所有节点值用逗号连接成字符串\n- 前序遍历的优势是根节点总在最前面,便于重构\n\n反序列化过程 :\n- 将字符串按逗号分割成数组\n- 使用递归按前序遍历顺序重构二叉树\n- 维护索引指针依次处理数组元素\n- 遇到 'null' 返回空节点,否则创建新节点并递归构建左右子树\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n const result = [];\n \n function preorder(node) {\n if (node === null) {\n result.push('null');\n return;\n }\n \n result.push(node.val.toString());\n preorder(node.left);\n preorder(node.right);\n }\n \n preorder(root);\n return result.join(',');\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n if (!data || data === 'null') {\n return null;\n }\n \n const values = data.split(',');\n let index = 0;\n \n function buildTree() {\n if (index >= values.length || values[index] === 'null') {\n index++;\n return null;\n }\n \n const node = new TreeNode(parseInt(values[index]));\n index++;\n \n node.left = buildTree();\n node.right = buildTree();\n \n return node;\n }\n \n return buildTree();\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```\n\n## 复杂度分析\n时间复杂度 :\n- 序列化:O(n) - 需要访问每个节点一次\n- 反序列化:O(n) - 需要处理每个序列化值一次\n\n空间复杂度 :\n- 序列化:O(n) - 递归栈深度最坏情况为O(n),结果数组大小为O(n)\n- 反序列化:O(n) - 递归栈深度最坏情况为O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3148418818","body":"## 算法思路\n- DFS遍历 :使用深度优先搜索遍历二叉树,记录每个节点的坐标(row, col)和值\n- 坐标规则 :根据题目要求,左子节点坐标为(row+1, col-1),右子节点坐标为(row+1, col+1)\n- 分组排序 :将节点按列索引分组,对每列内的节点先按行排序,同行按值排序\n- 结果输出 :按列索引从小到大的顺序返回垂序遍历结果\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n if (!root) return [];\n \n // 存储节点信息:[row, col, val]\n const nodes = [];\n \n // DFS遍历,记录每个节点的坐标和值\n function dfs(node, row, col) {\n if (!node) return;\n \n nodes.push([row, col, node.val]);\n \n // 左子节点:row+1, col-1\n dfs(node.left, row + 1, col - 1);\n // 右子节点:row+1, col+1\n dfs(node.right, row + 1, col + 1);\n }\n \n // 从根节点开始遍历,根节点坐标为(0, 0)\n dfs(root, 0, 0);\n \n // 按列索引分组\n const columnMap = new Map();\n for (const [row, col, val] of nodes) {\n if (!columnMap.has(col)) {\n columnMap.set(col, []);\n }\n columnMap.get(col).push([row, val]);\n }\n \n // 获取所有列索引并排序\n const columns = Array.from(columnMap.keys()).sort((a, b) => a - b);\n \n const result = [];\n for (const col of columns) {\n const columnNodes = columnMap.get(col);\n // 对每列内的节点排序:先按行排序,同行按值排序\n columnNodes.sort((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按行排序\n }\n return a[1] - b[1]; // 同行按值排序\n });\n \n // 提取值\n result.push(columnNodes.map(node => node[1]));\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n log n),其中n是节点数,主要消耗在排序操作\n- 空间复杂度 :O(n),用于存储节点信息和分组数据","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3148426517","body":"## 算法思路\n- 使用哈希表存储已遍历的数值和索引\n- 对每个数值计算其配对数值,在哈希表中O(1)时间查找\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n // 创建哈希表,key为数值,value为索引\n const map = new Map();\n \n for (let i = 0; i < nums.length; i++) {\n // 计算当前数值需要配对的数值\n const complement = target - nums[i];\n \n // 在哈希表中查找配对数值\n if (map.has(complement)) {\n // 找到配对,返回两个索引\n return [map.get(complement), i];\n }\n \n // 将当前数值和索引存入哈希表\n map.set(nums[i], i);\n }\n \n return []; // 题目保证有解,这里不会执行到\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148432520","body":"## 算法思路\n采用桶排序的思想来实现:\n- 频率统计 :使用哈希表统计每个元素的出现频率\n- 桶排序 :创建频率桶,桶的索引表示频率,桶中存储具有该频率的元素\n- 结果收集 :从最高频率的桶开始遍历,收集前k个元素\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function(nums, k) {\n // 步骤1: 统计频率\n const freqMap = new Map();\n for (const num of nums) {\n freqMap.set(num, (freqMap.get(num) || 0) + 1);\n }\n \n // 步骤2: 创建频率桶\n // 桶的索引表示频率,桶中存储具有该频率的元素\n const buckets = new Array(nums.length + 1).fill(null).map(() => []);\n \n for (const [num, freq] of freqMap) {\n buckets[freq].push(num);\n }\n \n // 步骤3: 从高频率到低频率收集前k个元素\n const result = [];\n for (let i = buckets.length - 1; i >= 0 && result.length < k; i--) {\n if (buckets[i].length > 0) {\n result.push(...buckets[i]);\n }\n }\n \n // 返回前k个元素\n return result.slice(0, k);\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 满足题目要求的优于O(n log n)\n- 统计频率:O(n)\n- 创建桶并填充:O(n)\n- 收集结果:O(n)\n\n- 空间复杂度 :O(n)\n- 哈希表:O(n)\n- 桶数组:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3153115326","body":"## 算法思路\n- 核心思想 :枚举每个点作为回旋镖的中心点i\n- 距离计算 :计算中心点到所有其他点的欧式距离(使用距离平方避免开方运算)\n- 哈希统计 :使用Map统计相同距离的点的数量\n- 组合计算 :如果有n个点到中心点距离相同,可形成n×(n-1)个回旋镖\n- 顺序考虑 :回旋镖(i,j,k)和(i,k,j)是不同的,需要考虑j和k的顺序\n\n## 代码\n```javascript\n/**\n * @param {number[][]} points\n * @return {number}\n */\nvar numberOfBoomerangs = function(points) {\n let count = 0;\n \n // 遍历每个点作为回旋镖的中心点i\n for (let i = 0; i < points.length; i++) {\n // 使用Map记录从点i到其他点的距离及对应的点的数量\n const distanceMap = new Map();\n \n // 计算点i到其他所有点的距离\n for (let j = 0; j < points.length; j++) {\n if (i !== j) {\n // 计算欧式距离的平方(避免开方运算,提高效率)\n const distance = getDistanceSquared(points[i], points[j]);\n \n // 记录该距离对应的点的数量\n distanceMap.set(distance, (distanceMap.get(distance) || 0) + 1);\n }\n }\n \n // 对于每个距离,如果有n个点,则可以形成n*(n-1)个回旋镖\n // 因为回旋镖(i,j,k)中j和k的顺序是有意义的\n for (const [distance, pointCount] of distanceMap) {\n if (pointCount >= 2) {\n count += pointCount * (pointCount - 1);\n }\n }\n }\n \n return count;\n};\n\n/**\n * 计算两点间欧式距离的平方\n * @param {number[]} point1 \n * @param {number[]} point2 \n * @return {number}\n */\nfunction getDistanceSquared(point1, point2) {\n const dx = point1[0] - point2[0];\n const dy = point1[1] - point2[1];\n return dx * dx + dy * dy;\n}\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n²) - 外层循环n次,内层循环n-1次\n- 空间复杂度 :O(n) - 最坏情况下Map存储n-1个不同距离","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153126755","body":"## 算法思路\n- 滑动窗口技术 :使用双指针 left 和 right 构成滑动窗口\n- 哈希表优化 :记录每个字符最后出现的位置\n- 动态调整 :遇到重复字符时,将左指针移动到重复字符的下一个位置\n- 实时更新 :持续更新最大长度\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n if (s.length === 0) return 0;\n \n let left = 0; // 滑动窗口左指针\n let maxLength = 0; // 记录最大长度\n let charMap = new Map(); // 哈希表:字符 -> 最后出现的索引\n \n for (let right = 0; right < s.length; right++) {\n const char = s[right];\n \n // 如果字符已存在且在当前窗口内,移动左指针\n if (charMap.has(char) && charMap.get(char) >= left) {\n left = charMap.get(char) + 1;\n }\n \n // 更新字符的最新位置\n charMap.set(char, right);\n \n // 更新最大长度\n maxLength = Math.max(maxLength, right - left + 1);\n }\n \n return maxLength;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 每个字符最多被访问两次\n- 空间复杂度 :O(min(m,n)) - m是字符集大小,n是字符串长度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3158322222","body":"## 算法思路\n- 滑动窗口 + 哈希表 :避免生成所有排列组合,直接在原字符串上滑动匹配\n- 分层遍历 :由于words中所有单词长度相同,按单词长度为步长进行遍历\n- 频次匹配 :使用哈希表记录words中单词频次,滑动窗口中维护当前单词频次\n- 智能重置 :遇到不在words中的单词时,直接重置窗口位置\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n if (!s || !words || words.length === 0) return [];\n \n const wordLen = words[0].length;\n const totalLen = wordLen * words.length;\n const result = [];\n \n // 创建words的频次映射\n const wordCount = new Map();\n for (const word of words) {\n wordCount.set(word, (wordCount.get(word) || 0) + 1);\n }\n \n // 对于每个可能的起始位置(0到wordLen-1),使用滑动窗口\n for (let i = 0; i < wordLen; i++) {\n let left = i;\n let right = i;\n let validWords = 0;\n const windowCount = new Map();\n \n while (right + wordLen <= s.length) {\n // 扩展右边界,添加新单词\n const rightWord = s.substring(right, right + wordLen);\n right += wordLen;\n \n if (wordCount.has(rightWord)) {\n windowCount.set(rightWord, (windowCount.get(rightWord) || 0) + 1);\n if (windowCount.get(rightWord) <= wordCount.get(rightWord)) {\n validWords++;\n }\n \n // 如果窗口大小超过目标长度,收缩左边界\n while (right - left > totalLen) {\n const leftWord = s.substring(left, left + wordLen);\n left += wordLen;\n \n if (wordCount.has(leftWord)) {\n if (windowCount.get(leftWord) <= wordCount.get(leftWord)) {\n validWords--;\n }\n windowCount.set(leftWord, windowCount.get(leftWord) - 1);\n }\n }\n \n // 检查是否找到有效的串联子串\n if (validWords === words.length && right - left === totalLen) {\n result.push(left);\n }\n } else {\n // 遇到不在words中的单词,重置窗口\n windowCount.clear();\n validWords = 0;\n left = right;\n }\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n × m),其中n是字符串s的长度,m是单词长度\n- 外层循环m次(每个可能的起始偏移)\n- 内层每个字符最多被访问2次(加入和移出窗口)\n\n- 空间复杂度 :O(k),其中k是words数组的长度\n- 主要用于存储单词频次的哈希表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162949952","body":"## 算法思路\n- 数学原理 :如果数组总和 sum % p = remainder ,需要找到一个子数组,其和也等于 remainder ,移除后剩余部分就能被p整除\n- 技术方案 :使用前缀和 + 哈希表来高效查找目标子数组\n- 关键公式 : prefixSum[i] % p = (prefixSum[j] % p - remainder + p) % p\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar minSubarray = function(nums, p) {\n // 计算数组总和\n const totalSum = nums.reduce((sum, num) => sum + num, 0);\n \n // 如果总和已经能被p整除,不需要移除任何元素\n const remainder = totalSum % p;\n if (remainder === 0) {\n return 0;\n }\n \n // 使用哈希表记录前缀和的余数及其对应的索引\n const prefixMap = new Map();\n prefixMap.set(0, -1); // 初始化,前缀和为0时索引为-1\n \n let prefixSum = 0;\n let minLength = nums.length; // 初始化为数组长度(最坏情况)\n \n for (let i = 0; i < nums.length; i++) {\n prefixSum += nums[i];\n const currentRemainder = prefixSum % p;\n \n // 我们需要找到一个前缀和,使得当前前缀和减去它等于remainder\n // 即:currentRemainder - targetRemainder = remainder (mod p)\n // 所以:targetRemainder = (currentRemainder - remainder + p) % p\n const targetRemainder = (currentRemainder - remainder + p) % p;\n \n if (prefixMap.has(targetRemainder)) {\n const prevIndex = prefixMap.get(targetRemainder);\n const subarrayLength = i - prevIndex;\n minLength = Math.min(minLength, subarrayLength);\n }\n \n // 更新当前前缀和余数的索引\n prefixMap.set(currentRemainder, i);\n }\n \n // 如果最小长度等于数组长度,说明无法找到合适的子数组\n return minLength === nums.length ? -1 : minLength;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 只需要遍历数组一次,哈希表操作为O(1)\n- 空间复杂度 :O(min(n, p)) - 哈希表最多存储min(n, p)个不同的余数","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166733694","body":"## 算法思路\n使用 快慢指针 (Floyd's Tortoise and Hare Algorithm)技术:\n- 设置两个指针:慢指针每次移动一步,快指针每次移动两步\n- 当快指针到达链表末尾时,慢指针恰好位于链表的中间位置\n- 对于偶数长度的链表,返回第二个中间节点\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n // 使用快慢指针法(Floyd's Tortoise and Hare Algorithm)\n // 慢指针每次移动一步,快指针每次移动两步\n // 当快指针到达链表末尾时,慢指针正好在中间位置\n \n let slow = head; // 慢指针\n let fast = head; // 快指针\n \n // 当快指针和快指针的下一个节点都不为空时继续循环\n while (fast !== null && fast.next !== null) {\n slow = slow.next; // 慢指针移动一步\n fast = fast.next.next; // 快指针移动两步\n }\n \n // 当循环结束时,slow指针指向中间节点\n // 如果链表长度为奇数,slow指向唯一的中间节点\n // 如果链表长度为偶数,slow指向第二个中间节点\n return slow;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 需要遍历链表一次,其中n是链表的长度\n- 空间复杂度:O(1) - 只使用了两个额外的指针变量,不随输入规模增长","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3172634872","body":"## 算法思路\n- 双指针技术 :使用 slow 指针指向当前不重复元素的位置, fast 指针遍历数组\n- 原地修改 :当发现不重复元素时,将其复制到 slow+1 位置\n- 利用排序特性 :由于数组已排序,相同元素必然相邻,只需比较相邻元素\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n // 边界情况:空数组或只有一个元素\n if (nums.length <= 1) {\n return nums.length;\n }\n \n // slow指针指向当前不重复元素的位置\n let slow = 0;\n \n // fast指针遍历数组,从第二个元素开始\n for (let fast = 1; fast < nums.length; fast++) {\n // 如果当前元素与前一个不重复元素不同\n if (nums[fast] !== nums[slow]) {\n // 将slow指针向前移动一位\n slow++;\n // 将当前不重复元素复制到slow位置\n nums[slow] = nums[fast];\n }\n // 如果相同,fast继续向前,slow保持不变\n }\n \n // 返回不重复元素的个数(slow指向最后一个不重复元素的索引)\n return slow + 1;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 只需遍历数组一次\n- 空间复杂度 :O(1) - 只使用常数额外空间,符合原地修改要求","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172638327","body":"## 算法思路\n- 二分查找核心思想 :通过比较中间元素与目标值,每次排除一半搜索空间\n- 查找逻辑 :如果找到目标值返回索引,否则返回应插入的位置\n- 关键实现 :循环结束时left指针就是插入位置\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let left = 0;\n let right = nums.length - 1;\n \n // 二分查找\n while (left <= right) {\n // 计算中间位置,避免整数溢出\n let mid = Math.floor(left + (right - left) / 2);\n \n if (nums[mid] === target) {\n // 找到目标值,返回索引\n return mid;\n } else if (nums[mid] < target) {\n // 目标值在右半部分\n left = mid + 1;\n } else {\n // 目标值在左半部分\n right = mid - 1;\n }\n }\n \n // 没找到目标值,left就是应该插入的位置\n return left;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(log n) - 满足题目要求,每次迭代将搜索范围缩小一半\n- 空间复杂度 :O(1) - 只使用常数级别的额外变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3174034461","body":"## 算法思路\n使用双端队列维护一个单调递减的队列,队列中存储数组元素的索引:\n\n- 队首始终是当前窗口的最大值索引\n- 移除超出窗口范围的元素\n- 维护单调性:移除队尾所有小于等于当前元素的索引\n- 当窗口形成时,队首就是最大值\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar maxSlidingWindow = function(nums, k) {\n if (!nums || nums.length === 0 || k <= 0) {\n return [];\n }\n \n const result = [];\n const deque = []; // 存储数组索引的双端队列\n \n for (let i = 0; i < nums.length; i++) {\n // 移除队列中超出窗口范围的元素\n while (deque.length > 0 && deque[0] <= i - k) {\n deque.shift();\n }\n \n // 维护单调递减队列:移除队尾所有小于当前元素的索引\n while (deque.length > 0 && nums[deque[deque.length - 1]] <= nums[i]) {\n deque.pop();\n }\n \n // 将当前元素索引加入队尾\n deque.push(i);\n \n // 当窗口大小达到k时,开始记录结果\n if (i >= k - 1) {\n result.push(nums[deque[0]]); // 队首是当前窗口最大值\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 每个元素最多进队列和出队列各一次\n- 空间复杂度 :O(k) - 队列最多存储k个元素","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178188012","body":"## 算法思路:\n- 使用度数统计法,将问题转化为图论中的入度和出度计算\n- 法官的特征:不信任任何人(出度=0)+ 被所有其他人信任(入度=n-1)\n- 通过计算每个人的\"信任度\"(入度-出度)来找到法官\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n // 特殊情况:只有一个人且没有信任关系,那么这个人就是法官\n if (n === 1 && trust.length === 0) {\n return 1;\n }\n \n // 初始化信任度数组,trustScore[i] = 入度 - 出度\n const trustScore = new Array(n + 1).fill(0);\n \n // 遍历所有信任关系\n for (const [a, b] of trust) {\n trustScore[a]--; // a信任别人,出度+1,所以信任度-1\n trustScore[b]++; // b被信任,入度+1,所以信任度+1\n }\n \n // 查找信任度为n-1的人(法官候选人)\n for (let i = 1; i <= n; i++) {\n if (trustScore[i] === n - 1) {\n return i;\n }\n }\n \n // 没有找到法官\n return -1;\n};\n```\n\n## 算法复杂度分析\n- 时间复杂度: O(E + n)\n- 遍历trust数组:O(E),其中E是信任关系数量\n- 查找法官:O(n)\n\n- 空间复杂度: O(n)\n- 需要额外的信任度数组存储每个人的统计信息","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182100538","body":"## 算法思路\n这是一个经典的二分图判断问题。核心思想是:\n\n- 将问题转化为图着色问题\n- 构建无向图,其中dislikes数组中的每一对表示图中的一条边\n- 使用DFS图着色算法判断是否能用两种颜色给所有节点着色\n- 如果相邻节点都能着不同颜色,则可以分成两组\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nvar possibleBipartition = function(n, dislikes) {\n // 构建邻接表表示图\n const graph = new Array(n + 1).fill(null).map(() => []);\n for (const [a, b] of dislikes) {\n graph[a].push(b);\n graph[b].push(a);\n }\n \n // 用于记录每个节点的颜色,0表示未着色,1和-1表示两种不同的颜色\n const colors = new Array(n + 1).fill(0);\n \n // DFS着色函数\n const dfs = (node, color) => {\n colors[node] = color;\n \n // 遍历所有邻接节点\n for (const neighbor of graph[node]) {\n if (colors[neighbor] === 0) {\n // 如果邻接节点未着色,给它着相反的颜色\n if (!dfs(neighbor, -color)) {\n return false;\n }\n } else if (colors[neighbor] === color) {\n // 如果邻接节点已经着色且颜色相同,说明不能构成二分图\n return false;\n }\n }\n return true;\n };\n \n // 遍历所有节点,处理可能存在的多个连通分量\n for (let i = 1; i <= n; i++) {\n if (colors[i] === 0) {\n if (!dfs(i, 1)) {\n return false;\n }\n }\n }\n \n return true;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(V + E),其中V是节点数量(n个人),E是边的数量(dislikes数组长度)\n- 空间复杂度 :O(V + E),主要用于邻接表存储、颜色数组和DFS递归栈","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186630947","body":"## 算法思路分析:\n这是一个双层拓扑排序问题\n- 首先需要对小组进行拓扑排序,确保依赖的小组在前面\n- 然后对每个小组内的项目进行拓扑排序\n- 最后按小组顺序合并结果\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n // 为没有小组的项目分配虚拟小组ID\n let groupId = m;\n for (let i = 0; i < n; i++) {\n if (group[i] === -1) {\n group[i] = groupId++;\n }\n }\n \n // 构建小组图和项目图\n const groupGraph = new Array(groupId).fill(0).map(() => []);\n const groupIndegree = new Array(groupId).fill(0);\n const itemGraph = new Array(n).fill(0).map(() => []);\n const itemIndegree = new Array(n).fill(0);\n \n // 构建依赖关系图\n const groupEdges = new Set(); // 用于去重小组间的边\n \n for (let i = 0; i < n; i++) {\n for (const beforeItem of beforeItems[i]) {\n const beforeGroup = group[beforeItem];\n const currentGroup = group[i];\n \n // 项目依赖关系\n itemGraph[beforeItem].push(i);\n itemIndegree[i]++;\n \n // 小组依赖关系(只有当项目属于不同小组时)\n if (beforeGroup !== currentGroup) {\n const edgeKey = `${beforeGroup}->${currentGroup}`;\n if (!groupEdges.has(edgeKey)) {\n groupEdges.add(edgeKey);\n groupGraph[beforeGroup].push(currentGroup);\n groupIndegree[currentGroup]++;\n }\n }\n }\n }\n \n // 拓扑排序函数\n function topologicalSort(graph, indegree) {\n const queue = [];\n const result = [];\n \n // 找到所有入度为0的节点\n for (let i = 0; i < indegree.length; i++) {\n if (indegree[i] === 0) {\n queue.push(i);\n }\n }\n \n while (queue.length > 0) {\n const node = queue.shift();\n result.push(node);\n \n // 更新相邻节点的入度\n for (const neighbor of graph[node]) {\n indegree[neighbor]--;\n if (indegree[neighbor] === 0) {\n queue.push(neighbor);\n }\n }\n }\n \n return result.length === graph.length ? result : [];\n }\n \n // 对小组进行拓扑排序\n const sortedGroups = topologicalSort(groupGraph, [...groupIndegree]);\n if (sortedGroups.length === 0) {\n return []; // 小组间存在循环依赖\n }\n \n // 对项目进行拓扑排序\n const sortedItems = topologicalSort(itemGraph, [...itemIndegree]);\n if (sortedItems.length === 0) {\n return []; // 项目间存在循环依赖\n }\n \n // 按小组分类项目\n const groupToItems = new Map();\n for (const item of sortedItems) {\n const itemGroup = group[item];\n if (!groupToItems.has(itemGroup)) {\n groupToItems.set(itemGroup, []);\n }\n groupToItems.get(itemGroup).push(item);\n }\n \n // 按小组顺序合并结果\n const result = [];\n for (const groupId of sortedGroups) {\n if (groupToItems.has(groupId)) {\n result.push(...groupToItems.get(groupId));\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n时间复杂度:O(n + E)\n- 构建图:O(E),E为所有依赖关系总数\n- 小组拓扑排序:O(V_g + E_g)\n- 项目拓扑排序:O(V_i + E_i)\n- 结果合并:O(n)\n\n空间复杂度:O(n + E + m)\n- 图存储:O(n + E)\n- 入度数组:O(n + m)\n- 辅助数据结构:O(n + m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3191484423","body":"## 算法思路\n机器人要回到原点(0,0),必须满足两个条件:\n- 向左移动的次数 = 向右移动的次数\n- 向上移动的次数 = 向下移动的次数\n\n## 代码\n```javascript\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let x = 0, y = 0; // 当前坐标\n \n for (let move of moves) {\n switch (move) {\n case 'L':\n x--;\n break;\n case 'R':\n x++;\n break;\n case 'U':\n y++;\n break;\n case 'D':\n y--;\n break;\n }\n }\n \n return x === 0 && y === 0;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n),其中n是moves字符串的长度,需要遍历一次字符串\n- 空间复杂度 :O(1),只使用了常数个额外变量,不随输入规模变化","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3194108225","body":"## 算法思路\n- 预处理 :为每个任务添加原始索引,按进入时间排序\n- 模拟执行 :使用最小堆维护可执行任务队列,按执行时间最短优先、索引最小优先的规则选择任务\n- 时间管理 :CPU空闲时直接跳转到下一个任务的进入时间,避免无效等待\n\n## 代码\n```javascript\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n const n = tasks.length;\n \n // 为每个任务添加原始索引,然后按进入时间排序\n const taskWithIndex = tasks.map((task, index) => [task[0], task[1], index]);\n taskWithIndex.sort((a, b) => a[0] - b[0]); // 按enqueueTime排序\n \n const result = [];\n // 优先队列:按执行时间升序,相同时按索引升序\n const availableTasks = new MinHeap((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按processingTime升序\n }\n return a[1] - b[1]; // 按originalIndex升序\n });\n \n let currentTime = 0;\n let taskIndex = 0; // 指向下一个要加入队列的任务\n \n while (result.length < n) {\n // 将所有在当前时间或之前进入队列的任务加入可执行队列\n while (taskIndex < n && taskWithIndex[taskIndex][0] <= currentTime) {\n const [enqueueTime, processingTime, originalIndex] = taskWithIndex[taskIndex];\n availableTasks.push([processingTime, originalIndex]);\n taskIndex++;\n }\n \n if (availableTasks.size() === 0) {\n // CPU空闲,直接跳到下一个任务的进入时间\n if (taskIndex < n) {\n currentTime = taskWithIndex[taskIndex][0];\n }\n } else {\n // 从可执行任务中选择执行时间最短的(相同时选择索引最小的)\n const [processingTime, originalIndex] = availableTasks.pop();\n result.push(originalIndex);\n currentTime += processingTime;\n }\n }\n \n return result;\n};\n\n// 最小堆实现\nclass MinHeap {\n constructor(compareFn) {\n this.heap = [];\n this.compare = compareFn || ((a, b) => a - b);\n }\n \n push(val) {\n this.heap.push(val);\n this.bubbleUp(this.heap.length - 1);\n }\n \n pop() {\n if (this.heap.length === 0) return undefined;\n if (this.heap.length === 1) return this.heap.pop();\n \n const top = this.heap[0];\n this.heap[0] = this.heap.pop();\n this.bubbleDown(0);\n return top;\n }\n \n size() {\n return this.heap.length;\n }\n \n bubbleUp(index) {\n while (index > 0) {\n const parentIndex = Math.floor((index - 1) / 2);\n if (this.compare(this.heap[index], this.heap[parentIndex]) >= 0) break;\n \n [this.heap[index], this.heap[parentIndex]] = [this.heap[parentIndex], this.heap[index]];\n index = parentIndex;\n }\n }\n \n bubbleDown(index) {\n while (true) {\n let minIndex = index;\n const leftChild = 2 * index + 1;\n const rightChild = 2 * index + 2;\n \n if (leftChild < this.heap.length && \n this.compare(this.heap[leftChild], this.heap[minIndex]) < 0) {\n minIndex = leftChild;\n }\n \n if (rightChild < this.heap.length && \n this.compare(this.heap[rightChild], this.heap[minIndex]) < 0) {\n minIndex = rightChild;\n }\n \n if (minIndex === index) break;\n \n [this.heap[index], this.heap[minIndex]] = [this.heap[minIndex], this.heap[index]];\n index = minIndex;\n }\n }\n}\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n log n)\n - 排序:O(n log n)\n - 堆操作:每个任务最多进出堆一次,总计O(n log n)\n- 空间复杂度 :O(n)\n - 存储任务信息、最小堆和结果数组","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194111949","body":"## 算法核心思路\n- 1.时间转换 :将 \"HH:MM\" 格式转换为分钟数便于计算\n- 2.对局编号计算 :\n - 开始时间: Math.ceil(minutes / 15) 确保只计算完整参与的对局\n - 结束时间: Math.floor(minutes / 15) 确保只计算完整参与的对局\n- 3.分情况处理 :\n - 同一天:结束时间对局编号 - 开始时间对局编号\n - 跨夜:(96 - 开始时间对局编号) + 结束时间对局编号\n\n## 代码\n```javascript\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n // 将时间字符串转换为分钟数\n function timeToMinutes(time) {\n const [hours, minutes] = time.split(':').map(Number);\n return hours * 60 + minutes;\n }\n \n const startMinutes = timeToMinutes(loginTime);\n const endMinutes = timeToMinutes(logoutTime);\n \n // 如果结束时间早于开始时间,说明跨越了午夜\n if (endMinutes < startMinutes) {\n // 跨夜情况:从开始时间到午夜 + 从午夜到结束时间\n // 计算从开始时间到午夜能完成的对局数\n const roundsBeforeMidnight = 96 - Math.ceil(startMinutes / 15);\n // 计算从午夜到结束时间能完成的对局数\n const roundsAfterMidnight = Math.floor(endMinutes / 15);\n return roundsBeforeMidnight + roundsAfterMidnight;\n } else {\n // 同一天情况\n // 能完成的对局数 = 结束时间所在的对局编号 - 开始时间所在的对局编号\n const result = Math.floor(endMinutes / 15) - Math.ceil(startMinutes / 15);\n return Math.max(0, result); // 确保不返回负数\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(1) - 所有操作都是常数时间的数学计算\n- 空间复杂度 :O(1) - 只使用固定数量的变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3197064559","body":"## 算法思路\n- 1.统计字符频率\n- 2.条件三:变成同一个字母\n- 3.条件一 & 条件二:字母严格大小比较\n- 4.综合最优解\n\n## 代码\n```javascript\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n let n = a.length, m = b.length;\n\n let freqA = new Array(26).fill(0);\n let freqB = new Array(26).fill(0);\n\n for (let ch of a) freqA[ch.charCodeAt(0) - 97]++;\n for (let ch of b) freqB[ch.charCodeAt(0) - 97]++;\n\n // 前缀和\n let prefixA = new Array(27).fill(0);\n let prefixB = new Array(27).fill(0);\n for (let i = 0; i < 26; i++) {\n prefixA[i+1] = prefixA[i] + freqA[i];\n prefixB[i+1] = prefixB[i] + freqB[i];\n }\n\n // 条件三:相同字母\n let ops3 = Infinity;\n for (let i = 0; i < 26; i++) {\n ops3 = Math.min(ops3, n + m - (freqA[i] + freqB[i]));\n }\n\n // 条件一 & 二\n let ops1 = Infinity, ops2 = Infinity;\n for (let c = 0; c < 25; c++) { // 0~24,分割点\n // a < b\n ops1 = Math.min(ops1, (n - prefixA[c+1]) + prefixB[c+1]);\n // b < a\n ops2 = Math.min(ops2, (m - prefixB[c+1]) + prefixA[c+1]);\n }\n\n return Math.min(ops1, ops2, ops3);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n + m)\n- 空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199072283","body":"## 算法思路\n- 1.将数组构建为一个 最大堆(heapify)\n 最大堆性质:父节点值 ≥ 子节点值。\n- 2.交换堆顶(最大值)和堆尾元素,把最大值放到最终位置。\n- 3.缩小堆的范围(长度减 1),重新 heapify。\n- 4.重复步骤 2–3,直到整个数组有序。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function(nums) {\n let n = nums.length;\n\n // 建堆(从最后一个非叶子节点开始向下调整)\n for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {\n heapify(nums, n, i);\n }\n\n // 不断取出堆顶(最大值)放到数组末尾\n for (let i = n - 1; i > 0; i--) {\n // 交换堆顶和堆尾\n [nums[0], nums[i]] = [nums[i], nums[0]];\n // 调整剩余部分\n heapify(nums, i, 0);\n }\n\n return nums;\n};\n\n// 调整为最大堆\nfunction heapify(arr, heapSize, root) {\n let largest = root;\n let left = 2 * root + 1;\n let right = 2 * root + 2;\n\n if (left < heapSize && arr[left] > arr[largest]) {\n largest = left;\n }\n\n if (right < heapSize && arr[right] > arr[largest]) {\n largest = right;\n }\n\n if (largest !== root) {\n [arr[root], arr[largest]] = [arr[largest], arr[root]];\n heapify(arr, heapSize, largest);\n }\n}\n```\n\n## 复杂度分析\n- 时间复杂度\n建堆:O(n)\n每次取出最大值并 heapify:O(log n),共 n 次\n总计:O(n log n)\n- 空间复杂度\n堆排序在原数组上操作,只需要 O(1) 额外空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204787436","body":"## 算法思路:\n- 平方根一定在 1 ~ x/2 之间(除了 0 和 1 特殊处理)。\n- 用二分查找,比较 mid * mid 与 x。\n- 如果等于就直接返回。\n- 如果小于,就把 mid 作为候选答案,继续往右找。\n- 如果大于,就往左缩。\n\n## 代码\n```javascript\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n if (x < 2) return x; // 0 -> 0, 1 -> 1\n\n let left = 1, right = Math.floor(x / 2), ans = 0;\n while (left <= right) {\n let mid = Math.floor((left + right) / 2);\n let square = mid * mid;\n\n if (square === x) {\n return mid;\n } else if (square < x) {\n ans = mid; // mid 可能是答案\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 O(log n)\n- 空间复杂度 O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3209498631","body":"## 算法思路\n- 设定搜索区间 [1, n]。\n- 取中点 mid = Math.floor((left + right) / 2)。\n- 调用 isBadVersion(mid):\n- 如果是坏的(true),说明答案在 左边或就是 mid,更新 right = mid。\n- 如果不是坏的(false),说明答案在 右边,更新 left = mid + 1。\n- 循环直到 left == right,此时 left 就是第一个坏版本。\n\n## 代码\n```javascript\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let left = 1, right = n;\n while (left < right) {\n let mid = Math.floor((left + right) / 2);\n if (isBadVersion(mid)) {\n // mid 可能是第一个坏版本,所以不能跳过它\n right = mid;\n } else {\n // mid 不是坏的,第一个坏版本在右边\n left = mid + 1;\n }\n }\n return left; // 或者 right,二者相等\n };\n};\n```\n\n## 复杂度分析\n- 时间复杂度:每次二分区间缩小一半,最多调用 isBadVersion O(log n) 次。\n- 空间复杂度:我们只用到了几个变量,额外空间复杂度是 O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3214357168","body":"## 算法思路\n- 1.分治思想(归并排序)\n- 把数组分为两半,分别统计左半部分和右半部分的翻转对数量。\n- 在合并的时候,再统计「跨左右两部分」的翻转对数量。\n- 2.跨区间统计方法\n- 假设左半部分是 left[],右半部分是 right[],它们都是有序的。\n- 对于每个 left[i],我们需要统计右边有多少个 right[j] 满足left[i]>2×right[j]\n- 因为 right[] 已经排序,可以用一个指针 双指针扫描,避免嵌套循环。\n- 3.合并排序\n- 统计完跨区间的翻转对数量后,把两个有序数组合并,递归回溯。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n if (!nums || nums.length === 0) return 0;\n\n const mergeSort = (arr, left, right) => {\n if (left >= right) return 0;\n\n let mid = Math.floor((left + right) / 2);\n let count = mergeSort(arr, left, mid) + mergeSort(arr, mid + 1, right);\n\n // 统计跨区间翻转对\n let j = mid + 1;\n for (let i = left; i <= mid; i++) {\n while (j <= right && arr[i] > 2 * arr[j]) {\n j++;\n }\n count += (j - (mid + 1));\n }\n\n // 合并两个有序数组\n let temp = [];\n let p1 = left, p2 = mid + 1;\n while (p1 <= mid && p2 <= right) {\n if (arr[p1] <= arr[p2]) {\n temp.push(arr[p1++]);\n } else {\n temp.push(arr[p2++]);\n }\n }\n while (p1 <= mid) temp.push(arr[p1++]);\n while (p2 <= right) temp.push(arr[p2++]);\n\n for (let i = 0; i < temp.length; i++) {\n arr[left + i] = temp[i];\n }\n\n return count;\n };\n\n return mergeSort(nums, 0, nums.length - 1);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(nlogn)\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3218651000","body":"## 算法思路\n\n- 排序\n- 对 houses 和 heaters 进行排序,方便二分查找。\n- 二分查找\n- 对于每个房屋 h,在 heaters 中二分查找,找到最接近 h 的供暖器位置。\n- 计算 |h - heater_left| 和 |h - heater_right| 的最小值。\n- 得到该房屋的最小供暖距离。\n- 取最大值\n- 遍历所有房屋,取最小距离的最大值。\n\n## 代码\n```javascript\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n houses.sort((a, b) => a - b);\n heaters.sort((a, b) => a - b);\n\n let radius = 0;\n\n for (let house of houses) {\n // 二分查找\n let left = 0, right = heaters.length - 1;\n while (left <= right) {\n let mid = Math.floor((left + right) / 2);\n if (heaters[mid] < house) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n // left 是第一个 >= house 的位置\n let dist1 = (left < heaters.length) ? Math.abs(heaters[left] - house) : Infinity;\n let dist2 = (right >= 0) ? Math.abs(heaters[right] - house) : Infinity;\n\n let nearest = Math.min(dist1, dist2);\n radius = Math.max(radius, nearest);\n }\n\n return radius;\n};\n```\n\n## 复杂度分析\n- 排序\n- houses 排序:O(n log n)\n- heaters 排序:O(m log m)\n- 二分查找\n- 每个房屋做一次二分:O(log m)\n- 共 n 个房屋:O(n log m)\n- 总时间复杂度:O(nlogn+mlogm+nlogm)\n- 空间复杂度:O(1)(除了排序外,常数额外空间)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3218659174","body":"## 排序数组\n- 先对 nums 排序。这样数对距离 = 两个数的差,可以利用单调性。\n- 二分查找答案\n- 距离范围:最小值 0,最大值 max(nums) - min(nums)。\n- 设二分中间值为 mid,问题转化为:\n- 数组中有多少对数对距离 ≤ mid。\n- 双指针统计 ≤ mid 的数对数量\n- 排序后数组 nums 单调递增。\n- 用两个指针 i、j:\n- 固定右端点 j,向左找满足 nums[j] - nums[i] <= mid 的最小 i。\n- 那么从 i 到 j-1 的所有元素都和 j 构成合法数对,总数是 j - i。\n- 整个过程是 O(n)。\n- 二分逻辑\n- 如果 ≤ mid 的数对数目 ≥ k,说明答案可能更小,右边界收缩。\n- 否则说明距离太小,左边界右移。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a, b) => a - b);\n\n // 统计差值 <= mid 的数对个数\n function countPairs(mid) {\n let count = 0;\n let i = 0;\n for (let j = 0; j < nums.length; j++) {\n while (nums[j] - nums[i] > mid) {\n i++;\n }\n count += j - i;\n }\n return count;\n }\n\n let left = 0, right = nums[nums.length - 1] - nums[0];\n while (left < right) {\n let mid = Math.floor((left + right) / 2);\n if (countPairs(mid) >= k) {\n right = mid; // 答案可能是 mid 或更小\n } else {\n left = mid + 1;\n }\n }\n return left;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 排序:O(n log n)\n- 二分查找:查找范围是 max(nums) - min(nums),最大 1e6,二分次数约 log(1e6) ≈ 20。\n- 每次 countPairs:O(n)(双指针扫描一遍)。\n- 总复杂度:O(n log n + n log W),其中 W = max(nums) - min(nums)。对 n = 1e4,完全可行。\n- 空间复杂度\n- 只用了常数级变量,O(1)(不算排序)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218668542","body":"## 算法思路\n- 二分 + BFS/DFS\n- 时间范围是 [max(grid[0][0], grid[n-1][n-1]), n^2-1]。\n- 二分水位 mid,检查是否能在 mid 水位下从 (0,0) 到 (n-1,n-1)。\n- 如果可以,则收缩右边界,否则收缩左边界。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n const n = grid.length;\n const directions = [[1,0],[-1,0],[0,1],[0,-1]];\n \n // 检查是否能在水位 t 下到达终点\n function canReach(t) {\n if (grid[0][0] > t) return false;\n const visited = Array.from({length: n}, () => Array(n).fill(false));\n const queue = [[0,0]];\n visited[0][0] = true;\n\n while (queue.length > 0) {\n const [x, y] = queue.shift();\n if (x === n-1 && y === n-1) return true;\n for (const [dx, dy] of directions) {\n const nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n &&\n !visited[nx][ny] && grid[nx][ny] <= t) {\n visited[nx][ny] = true;\n queue.push([nx, ny]);\n }\n }\n }\n return false;\n }\n\n // 二分查找最小可行水位\n let low = Math.max(grid[0][0], grid[n-1][n-1]);\n let high = n * n - 1;\n let ans = high;\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (canReach(mid)) {\n ans = mid;\n high = mid - 1; // 尝试更小的水位\n } else {\n low = mid + 1;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- BFS 最多访问 n^2 个格子,复杂度 O(n^2)。\n- 二分查找 范围大小约为 n^2,二分次数 O(log(n^2)) = O(log n)。\n- 总时间复杂度:O(n^2 log n)。\n- 空间复杂度:需要 visited 数组 O(n^2)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3226685252","body":"## 核心思路\n- 滑动窗口(Sliding Window)\n- 定义元音集合\n- vowels = new Set(['a','e','i','o','u'])\n- 初始化窗口\n- 先统计前 k 个字符里元音的数量 count。\n- 这就是第一个窗口的元音数。\n- 滑动窗口\n- 从 i = k 开始,窗口向右滑动:\n- 移除窗口最左边的字符(如果它是元音则 count--)。\n- 加入窗口最右边的字符(如果它是元音则 count++)。\n- 每次更新最大值 maxCount = Math.max(maxCount, count)。\n- 提前终止\n- 如果 maxCount === k,说明某个窗口里全是元音,直接返回结果(不可能更大了)。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n const vowels = new Set(['a', 'e', 'i', 'o', 'u']);\n let count = 0, maxCount = 0;\n\n // 初始化前 k 个字符\n for (let i = 0; i < k; i++) {\n if (vowels.has(s[i])) count++;\n }\n maxCount = count;\n\n // 滑动窗口\n for (let i = k; i < s.length; i++) {\n if (vowels.has(s[i - k])) count--; // 移除最左边\n if (vowels.has(s[i])) count++; // 加入最右边\n maxCount = Math.max(maxCount, count);\n if (maxCount === k) return k; // 提前终止\n }\n\n return maxCount;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 初始化前 k 个字符统计需要 O(k)。\n- 然后遍历整个字符串一次 O(n)。\n- 总体复杂度:O(n)。\n- 空间复杂度:\n- 仅使用一个集合 Set 存元音,空间 O(1)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3226702074","body":"## 思路分析\n- 边界情况\n- 如果 k == 0:Alice 一开始就停,不抽牌,分数是 0。如果 0 <= n,返回 1;否则返回 0。\n- 如果 n >= k - 1 + maxPts:Alice 不可能超过 n,因为最大分数就是 k-1 + maxPts。此时概率是 1。\n- 动态规划建模\n- 定义 dp[i] = 从分数 i 出发,Alice 最终分数不超过 n 的概率。\n- 最终答案是 dp[0]。\n- 如果 i >= k:表示 Alice 已经停了。\n- 如果 i <= n:返回 1(安全)。\n- 否则返回 0(爆掉)。\n- 如果 i < k:Alice 会继续抽。\n- 优化:滑动窗口\n- 用一个变量 windowSum 维护滑动和,就能做到 O(n)。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n // 速返:一开始就停;或最高可能分也不超过 n\n if (k === 0 || n >= k - 1 + maxPts) return 1.0;\n\n const dp = new Array(n + 1).fill(0.0);\n // 终止区间:达到/超过 k 后立即停;在 [k, n] 内都是成功状态\n for (let i = k; i <= n; i++) dp[i] = 1.0;\n\n // 初始窗口和:dp[k]..dp[k+maxPts-1],这些里面只有 <= n 的是 1\n let windowSum = Math.min(n - k + 1, maxPts);\n\n // 从后往前做滑动平均\n for (let i = k - 1; i >= 0; i--) {\n dp[i] = windowSum / maxPts;\n // 更新窗口:加上新放入的 dp[i],减去滑出窗口的 dp[i + maxPts](越界视为 0)\n windowSum += dp[i] - (i + maxPts <= n ? dp[i + maxPts] : 0);\n // 也可写成:windowSum += dp[i] - (dp[i + maxPts] ?? 0);\n }\n return dp[0];\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 只遍历了一次数组,每个状态 O(1) 计算。\n- 时间复杂度:O(n)\n- 空间复杂度\n- 需要一个 dp 数组大小为 O(n)。\n- 也可以优化成 O(maxPts)(因为只依赖一个窗口)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3231363055","body":"## 算法思路\n- 核心观察\n- 一个字符串的异位词就是 字符相同但顺序不同 的字符串。\n- 如果子串和 p 的 字符频率统计完全相同,那么它就是一个异位词。\n- 滑动窗口\n- 用两个数组(或哈希表)存放字符频率:\n- pCount 记录 p 中各字符出现次数。\n- sCount 记录当前窗口(长度等于 p.length)的各字符出现次数。\n- 每次窗口滑动:\n- 移入一个字符,更新 sCount。\n- 移出一个字符,更新 sCount。\n- 如果 sCount 和 pCount 相等,则记录当前窗口起始位置。\n- 优化比较\n- 不需要每次都完整比较两个数组(O(26))。\n- 但因为字符集仅 26 个,比较成本很小,可以直接比较数组,整体复杂度依旧可接受。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nvar findAnagrams = function(s, p) {\n let res = [];\n let m = p.length, n = s.length;\n if (n < m) return res;\n\n // 频次数组,26个小写字母\n let pCount = new Array(26).fill(0);\n let sCount = new Array(26).fill(0);\n\n // 统计 p 的频率\n for (let ch of p) {\n pCount[ch.charCodeAt(0) - 97]++;\n }\n\n // 初始化第一个窗口\n for (let i = 0; i < m; i++) {\n sCount[s.charCodeAt(i) - 97]++;\n }\n\n // 比较初始窗口\n if (sCount.join() === pCount.join()) res.push(0);\n\n // 滑动窗口\n for (let i = m; i < n; i++) {\n sCount[s.charCodeAt(i) - 97]++; // 加入右边字符\n sCount[s.charCodeAt(i - m) - 97]--; // 移出左边字符\n\n if (sCount.join() === pCount.join()) {\n res.push(i - m + 1);\n }\n }\n\n return res;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 初始化统计频率:O(m)\n- 滑动窗口遍历 s:O(n)\n- 每次比较频率数组:O(26) = O(1)\n- 总复杂度:O(n + m)\n- 空间复杂度\n- 两个长度为 26 的数组:O(26) ≈ O(1)\n- 结果数组存储下标,最坏情况 O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3236034367","body":"## 算法思路\n- 核心思想:滑动窗口\n- 我们在字符串 s 上维护一个动态窗口 [left, right)。\n- 用 need 记录字符串 t 中每个字符需要的次数。\n- 用 window 记录当前窗口中每个字符出现的次数。\n- 不断扩展 right 指针,直到窗口内满足 t 的要求。\n- 然后收缩 left,尽量缩小窗口,直到不满足要求为止。\n- 在满足要求的情况下,更新最小子串。\n- 满足条件的判断\n- 我们可以维护一个 valid 变量,表示窗口中满足 need 的字符种类数。\n- 当 valid === need.size 时,说明窗口包含了所有需要的字符。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nvar minWindow = function(s, t) {\n let need = new Map();\n let window = new Map();\n\n for (let c of t) {\n need.set(c, (need.get(c) || 0) + 1);\n }\n\n let left = 0, right = 0;\n let valid = 0;\n let start = 0, len = Infinity;\n\n while (right < s.length) {\n let c = s[right];\n right++;\n if (need.has(c)) {\n window.set(c, (window.get(c) || 0) + 1);\n if (window.get(c) === need.get(c)) {\n valid++;\n }\n }\n\n // 收缩左边界\n while (valid === need.size) {\n if (right - left < len) {\n start = left;\n len = right - left;\n }\n let d = s[left];\n left++;\n if (need.has(d)) {\n if (window.get(d) === need.get(d)) {\n valid--;\n }\n window.set(d, window.get(d) - 1);\n }\n }\n }\n\n return len === Infinity ? \"\" : s.substr(start, len);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 每个字符最多被左右指针访问一次,所以是 O(m + n),其中 m = s.length, n = t.length。\n- 空间复杂度:\n- 哈希表 need 和 window 至多包含全部字符,大小为 O(Σ),Σ 是字符集大小(对英文就是 O(26) 或 O(52) 或 O(128))。\n- 所以空间复杂度 O(Σ)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/50#issuecomment-3247555036","body":"## 算法思路\n- 一共要拿 k 张牌,可以从数组两端取。\n- 等价于:我们留下 n - k 张牌(连续子数组),这些是不能拿的。\n- 因此,最大得分 = 总和 - 最小的长度为 (n - k) 的子数组的和。\n- 先计算数组总和 total。\n- 如果 k == n,那就直接返回 total。\n- 否则,使用滑动窗口大小为 (n - k),找到 最小窗口和。\n- 答案就是 total - min_window_sum。\n\n## 代码\n```javascript\n/**\n * @param {number[]} cardPoints\n * @param {number} k\n * @return {number}\n */\nvar maxScore = function(cardPoints, k) {\n const n = cardPoints.length;\n const total = cardPoints.reduce((a, b) => a + b, 0);\n \n // 特殊情况:拿所有卡牌\n if (k === n) return total;\n \n const windowSize = n - k;\n // 初始化窗口和\n let windowSum = 0;\n for (let i = 0; i < windowSize; i++) {\n windowSum += cardPoints[i];\n }\n let minWindowSum = windowSum;\n \n // 滑动窗口\n for (let i = windowSize; i < n; i++) {\n windowSum += cardPoints[i] - cardPoints[i - windowSize];\n minWindowSum = Math.min(minWindowSum, windowSum);\n }\n \n return total - minWindowSum;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 计算总和 O(n)\n- 滑动窗口遍历一次数组 O(n)\n- 总复杂度 O(n)\n- 空间复杂度:\n- 只用常数级变量存储 O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3247564267","body":"## 算法思路\n- 枚举所有可能的小时和分钟\n- 小时范围:0–11\n- 分钟范围:0–59\n- 总共 12 × 60 = 720 种组合。\n- 统计二进制表示中 1 的个数\n- bitCount(h) + bitCount(m) == turnedOn 才是合法解。\n- 其中 bitCount(x) 表示数字 x 的二进制中 1 的数量。\n- 格式化输出\n- 小时 h 直接转成字符串(不能有前导零)。\n- 分钟 m 必须是两位数,若小于 10 需在前面补 0。\n\n## 代码\n```javascript\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n const res = [];\n // 遍历所有可能的时间\n for (let h = 0; h < 12; h++) {\n for (let m = 0; m < 60; m++) {\n // 检查是否满足亮灯数量\n if (bitCount(h) + bitCount(m) === turnedOn) {\n // 格式化分钟(必须两位数)\n const time = `${h}:${m.toString().padStart(2, '0')}`;\n res.push(time);\n }\n }\n }\n return res;\n};\n\n// 计算二进制数中 1 的个数\nfunction bitCount(num) {\n let count = 0;\n while (num > 0) {\n count += num & 1;\n num >>= 1;\n }\n return count;\n}\n```\n\n## 复杂度分析\n- 外层遍历所有 12 × 60 = 720 种时间组合 → O(720) ≈ O(1) (常数级,最多 720 次)。\n- 每次计算 bitCount(h) 和 bitCount(m),\n- h < 12(最多 4 bit),m < 60(最多 6 bit),所以计算一次 bitCount 的复杂度 ≤ 10。\n- 总复杂度依然是常数级。\n- 时间复杂度:O(1) (严格来说是 O(720×10),但近似常数)\n- 空间复杂度:O(1) (除返回结果外仅使用常量存储)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3247575227","body":"## 算法思路(回溯法)\n- 逐行放置:从第 0 行开始,尝试在每一列放置皇后。\n- 约束检查:放置前,检查当前列和对角线是否已有皇后。\n- 列冲突:用一个集合 cols 记录已占用的列。\n- 主对角线冲突:行号 - 列号 相同的点在同一主对角线上,用 diag1 集合。\n- 副对角线冲突:行号 + 列号 相同的点在同一副对角线上,用 diag2 集合。\n- 递归搜索:如果当前行放置成功,递归尝试下一行。\n- 回溯:如果无法继续,撤销放置,尝试下一个位置。\n- 统计解法数:当所有行都成功放置皇后时,计数 +1。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n const cols = new Set(); // 记录已占用的列\n const diag1 = new Set(); // 记录主对角线 (row - col)\n const diag2 = new Set(); // 记录副对角线 (row + col)\n\n function backtrack(row) {\n if (row === n) { \n count++;\n return;\n }\n for (let col = 0; col < n; col++) {\n if (cols.has(col) || diag1.has(row - col) || diag2.has(row + col)) {\n continue; // 冲突,不能放\n }\n // 选择\n cols.add(col);\n diag1.add(row - col);\n diag2.add(row + col);\n\n backtrack(row + 1);\n\n // 回溯\n cols.delete(col);\n diag1.delete(row - col);\n diag2.delete(row + col);\n }\n }\n\n backtrack(0);\n return count;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 每行必须放置一个皇后,因此每一行尝试 n 种列的可能性。\n- 在冲突检测 O(1) 的情况下,最坏情况回溯树的大小接近 O(n!)。\n- 实际上,由于剪枝(冲突检测),复杂度会远小于 n!,但仍然是 指数级。\n- 时间复杂度:O(n!) (上界)。\n- 空间复杂度:\n- cols、diag1、diag2 最多各存储 n 个元素。\n- 递归栈深度最大为 n。\n- 空间复杂度:O(n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3247583590","body":"## 算法思路\n- 遍历整个网格,当遇到值为 1 的格子时,说明找到了新的岛屿。\n- 使用 DFS(深度优先搜索)或 BFS(广度优先搜索)来扩展整个岛屿,计算其面积,并更新最大值。\n- 为避免重复计算,我们要将访问过的格子标记为 0(淹没)或使用 visited 数组。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n let m = grid.length, n = grid[0].length;\n let maxArea = 0;\n\n function dfs(i, j) {\n // 边界条件\n if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] === 0) {\n return 0;\n }\n // 标记访问过\n grid[i][j] = 0;\n let area = 1;\n // 四个方向\n area += dfs(i + 1, j);\n area += dfs(i - 1, j);\n area += dfs(i, j + 1);\n area += dfs(i, j - 1);\n return area;\n }\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n maxArea = Math.max(maxArea, dfs(i, j));\n }\n }\n }\n\n return maxArea;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 遍历整个矩阵,每个元素最多被访问一次(因为访问后会被置为 0)。\n- 每个格子在 DFS 中的递归调用也是 O(1)(最多 4 次相邻扩展)。\n- 总时间复杂度: O(m * n)\n- 空间复杂度:\n- 递归栈的深度,最坏情况是整个矩阵都是 1,即 O(m * n)。\n- 如果用 BFS + 队列,也需要 O(m * n) 的空间。\n- 空间复杂度: O(m * n)(递归栈 / 队列空间)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247593268","body":"## 算法思路\n- 使用多源 BFS(广度优先搜索)来解决。\n- 找到所有陆地格子,放入队列(多源 BFS 起点)。\n- 从陆地开始向外扩展,遇到海洋格子时更新它的距离。\n- 记录 BFS 扩展到的最大层数,即最大距离。\n- 最后如果没有海洋或没有陆地,返回 -1。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxDistance = function(grid) {\n const n = grid.length;\n const directions = [[1,0],[-1,0],[0,1],[0,-1]];\n const queue = [];\n\n // 1. 把所有陆地加入队列\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n queue.push([i, j]);\n }\n }\n }\n\n // 如果全是海洋或者全是陆地\n if (queue.length === 0 || queue.length === n * n) return -1;\n\n let distance = -1;\n\n // 2. 多源 BFS\n while (queue.length > 0) {\n let size = queue.length;\n distance++; // 每一层扩展一次\n for (let s = 0; s < size; s++) {\n const [x, y] = queue.shift();\n for (let [dx, dy] of directions) {\n const nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] === 0) {\n grid[nx][ny] = 1; // 标记为已访问(变为陆地)\n queue.push([nx, ny]);\n }\n }\n }\n }\n\n return distance;\n};\n```\n\n## 复杂度分析\n- BFS 遍历整个网格,每个格子最多入队一次。\n- 时间复杂度:O(n^2)\n- 空间复杂度(队列 + 访问标记):O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3270177258","body":"## 思路\n- 一开始手上有一些 初始盒子,目标是最大化能获得的糖果数。关键点是:\n- 盒子可能是 开着的(status[i] = 1)或者 关着的(status[i] = 0)。\n- 你只有在盒子开着时,才能取走里面的糖果。\n- 打开盒子后,你可能获得 钥匙,可以解锁更多盒子。\n- 打开盒子后,你可能获得 更多盒子,这些盒子可能要等钥匙解锁才能用。\n- 所以整个过程就是一个 BFS / 队列模拟,类似 “不断解锁和探索”的过程。\n\n## 代码\n```javascript\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n let n = status.length;\n let res = 0;\n\n let haveKey = new Set();\n let haveBox = new Set(initialBoxes);\n let visited = new Array(n).fill(false);\n\n let queue = [...initialBoxes];\n\n while (queue.length > 0) {\n let box = queue.shift();\n if (visited[box]) continue;\n\n // 如果箱子是锁着的且没钥匙 -> 跳过\n if (status[box] === 0 && !haveKey.has(box)) continue;\n\n // 打开箱子\n visited[box] = true;\n res += candies[box];\n\n // 获得钥匙\n for (let k of keys[box]) {\n if (!haveKey.has(k)) {\n haveKey.add(k);\n // 如果之前已经有这个盒子但是打不开,现在可以打开了\n if (haveBox.has(k) && !visited[k]) {\n queue.push(k);\n }\n }\n }\n\n // 获得新的盒子\n for (let b of containedBoxes[box]) {\n if (!haveBox.has(b)) haveBox.add(b);\n if ((status[b] === 1 || haveKey.has(b)) && !visited[b]) {\n queue.push(b);\n }\n }\n }\n\n return res;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 每个盒子最多被处理一次,O(n)。\n- 钥匙和 containedBoxes 总长度之和最多 O(n)。\n- 所以总 时间复杂度 = O(n)。\n- 空间复杂度分析\n- visited / haveKey / haveBox 都是 O(n)。\n- 队列最多 O(n)。\n- 所以 空间复杂度 = O(n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3270189042","body":"/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? 0 : val)\n * this.left = (left===undefined ? null : left)\n * this.right = (right===undefined ? null : right)\n * }\n */\n/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n if (!root) return [];\n \n // 存储节点信息:[row, col, val]\n const nodes = [];\n \n // DFS遍历,记录每个节点的坐标和值\n function dfs(node, row, col) {\n if (!node) return;\n \n nodes.push([row, col, node.val]);\n \n // 左子节点:row+1, col-1\n dfs(node.left, row + 1, col - 1);\n // 右子节点:row+1, col+1\n dfs(node.right, row + 1, col + 1);\n }\n \n // 从根节点开始遍历,根节点坐标为(0, 0)\n dfs(root, 0, 0);\n \n // 按列索引分组\n const columnMap = new Map();\n for (const [row, col, val] of nodes) {\n if (!columnMap.has(col)) {\n columnMap.set(col, []);\n }\n columnMap.get(col).push([row, val]);\n }\n \n // 获取所有列索引并排序\n const columns = Array.from(columnMap.keys()).sort((a, b) => a - b);\n \n const result = [];\n for (const col of columns) {\n const columnNodes = columnMap.get(col);\n // 对每列内的节点排序:先按行排序,同行按值排序\n columnNodes.sort((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按行排序\n }\n return a[1] - b[1]; // 同行按值排序\n });\n \n // 提取值\n result.push(columnNodes.map(node => node[1]));\n }\n \n return result;\n};","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ariana850409":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074225557","body":"思維:\n以十進位的相加方式,將 k 拆解成字串,從個位數開始與 num 相加,最後再處理一次 num 的進位\n\n代碼:\n```\nclass Solution(object):\n def addToArrayForm(self, num, k):\n k = str(k)\n for i in range(-1, -(len(k)+1), -1):\n number = int(k[i])\n if abs(i) > len(num):\n num.insert(0, number)\n else:\n num[i] = num[i] + number\n\n for i in range(-1, -(len(num)+1), -1):\n temp = num[i]\n if temp >= 10:\n num[i] = temp - 10\n if abs(i-1) > len(num):\n num.insert(0, 1)\n else:\n num[i-1] += 1\n\n return num\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078087647","body":"思維:\n先找出所有符合字符 c 的 index,再判斷字符串 s 中每個字符跟要拿來比較的 index 的最短距離\n\n代碼:\n```\nclass Solution:\n def shortestToChar(self, s: str, c: str) -> List[int]:\n target = []\n for i, char in enumerate(s):\n if char == c:\n target.append(i)\n\n res = []\n t = 0\n for i in range(len(s)):\n tar = target[t]\n if i < tar:\n res.append(tar-i)\n elif i == tar:\n res.append(0)\n elif t+1 >= len(target):\n res.append(i-tar)\n else:\n next_tar = target[t+1]\n res.append(min(i-tar, next_tar-i))\n if i == next_tar:\n t += 1\n return res\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3083166293","body":"思維一:單純依照題義用最直接的想法來實作各函式,increment 用遍歷去直接改變列表中的值\n\n代碼:\n```python\nclass CustomStack:\n def __init__(self, maxSize: int):\n self.maxSize = maxSize\n self.stack = []\n \n def push(self, x: int) -> None:\n if if len(self.stack) < self.maxSize:\n self.stack.append(x)\n\n def pop(self) -> int:\n if not self.stack:\n return -1\n return self.stack.pop()\n \n def increment(self, k: int, val: int) -> None:\n k = min(k, len(self.stack))\n for i in range(k):\n self.stack[i] += val\n```\n時間複雜度:push, pop: O(1) / increment: O(N)\n\n空間複雜度:O(N)\n\n-----\n思維二:優化 increment 的時間複雜度,將 increment value 另存在一個列表,等 pop 時才判斷需加多少值\n\n代碼:\n```python\nclass CustomStack:\n def __init__(self, maxSize: int):\n self.maxSize = maxSize\n self.stack = []\n self.inc = [0] * maxSize\n \n def push(self, x: int) -> None:\n if not len(self.stack) >= self.maxSize:\n self.stack.append(x)\n\n def pop(self) -> int:\n if not self.stack:\n return -1\n inc_idx = len(self.stack)-1\n inc_val = self.inc[inc_idx]\n if inc_idx > 0:\n self.inc[inc_idx-1] += inc_val\n self.inc[inc_idx] = 0\n return self.stack.pop() + inc_val\n \n def increment(self, k: int, val: int) -> None:\n k = min(k, len(self.stack))\n if k > 0:\n self.inc[k-1] += val\n```\n時間複雜度:push, pop, increment: O(1)\n\n空間複雜度:O(N)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087613442","body":"思維:使用兩個 stack 模擬進入與退出重複區塊的過程,每遇到 [ 就壓入當下狀態,遇到 ] 就彈出並拼接,逐步建立出完整的解碼字串\n\n代碼:\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n cnt_stack = []\n str_stack = []\n cnt = ''\n temp = ''\n for c in s:\n if c.isdigit():\n cnt += c\n elif c == '[':\n cnt_stack.append(int(cnt))\n str_stack.append(temp)\n cnt = ''\n temp = ''\n elif c == ']':\n times = cnt_stack.pop()\n prev_str = str_stack.pop()\n temp = prev_str + temp * times\n else:\n temp += c\n\n return temp\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091473302","body":"思維一:以暴力解的方式在 peek 或 pop 的操作時,用另一個陣列依序存目前 stack pop 出來的所有元素,操作結果後再依序新增回去,時間及空間複雜度皆為 O(N)(無實作)
\n思維二:使用兩個 stack 來操作存取,當有 peek 或 pop 的操作時,從 out_stack 拿取,判斷 out_stack 為空時再一次性的把當前 in_stack 的所有元素倒進 out_stack\n\n代碼:\n```python\nclass MyQueue(object):\n\n def __init__(self):\n self.in_stack = []\n self.out_stack = []\n \n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n self.in_stack.append(x)\n \n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack.pop()\n \n def peek(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack[-1]\n \n def empty(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n return not (self.in_stack + self.out_stack)\n```\n時間複雜度:O(1) (Amortized)\n\n空間複雜度:O(N)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3096165781","body":"思維:\n1. 空串列直接回傳\n2. 先計算鏈結長度 length\n3. 把 k 對 length 取餘,因為旋轉 length 次等於沒動\n4. 用兩個指針 slow 和 fast 找到新的頭 new_head 的位置\n5. 將鏈結斷開重新連接,完成旋轉\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode(object):\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution(object):\n def rotateRight(self, head, k):\n \"\"\"\n :type head: Optional[ListNode]\n :type k: int\n :rtype: Optional[ListNode]\n \"\"\"\n if not head: \n return head\n\n length = 1\n temp = head\n while temp.next:\n length += 1\n temp = temp.next\n\n slow, fast = head, head\n for _ in range(k % length):\n if fast.next:\n fast = fast.next\n else:\n fast = head\n\n if slow == fast: \n return head\n\n while fast.next:\n slow = slow.next\n fast = fast.next\n\n new_head = slow.next\n slow.next = None\n fast.next = head\n return new_head\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100848058","body":"思維:先處理無需交換的情況,透過一個 dummy 節點統一處理頭節點與後續節點的交換邏輯,每次迴圈交換一對相鄰節點,並用 pre 將已處理區與未處理區銜接起來,最後回傳 dummy 的下一個節點作為新鏈表的頭\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if not head or not head.next:\n return head\n\n left = head\n right = head.next\n dummy = ListNode(None, head)\n pre = dummy\n while right:\n left.next = right.next\n right.next = left\n pre.next = right\n pre = left\n left = left.next\n right = left.next if left else None\n\n return dummy.next\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109165432","body":"思維:有想到要計算遞迴的中心點,但一開始解不出來,參考官方題解的思路加上畫圖後思路有比較清晰\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode(object):\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution(object):\n def sortedListToBST(self, head):\n \"\"\"\n :type head: Optional[ListNode]\n :rtype: Optional[TreeNode]\n \"\"\"\n if not head:\n return head\n\n pre, slow, fast = None, head, head\n while fast and fast.next:\n fast = fast.next.next\n pre = slow\n slow = slow.next\n if pre:\n pre.next = None\n\n node = TreeNode(slow.val)\n if slow == fast:\n return node\n \n node.left = self.sortedListToBST(head)\n node.right = self.sortedListToBST(slow.next)\n return node\n```\n時間複雜度:O(NlogN)\n\n空間複雜度:O(logN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112948103","body":"思維:\n1. 使用兩個指標 a 和 b,分別從 headA 和 headB 開始走。\n2. 每當指標走到自己 linked list 的結尾時,跳到另一條 linked list 的頭部繼續走。\n3. 最終:
\n a. 若兩條 list 有交點,a 和 b 會在同一個節點交會(因為走過的總長度相同)。
\n b. 若沒有交點,a 和 b 都會變成 None,同時結束迴圈。\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, x):\n# self.val = x\n# self.next = None\n\nclass Solution:\n def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:\n a, b = headA, headB\n a_switch, b_switch = False, False\n \n while a and b:\n if a == b:\n return a\n\n a = a.next if a.next else None\n if not a and not a_switch:\n a = headB\n a_switch = True\n \n b = b.next if b.next else None\n if not b and not b_switch:\n b = headA\n b_switch = True\n\n return None\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3114228960","body":"思維:使用快慢指針來偵測是否有環存在,若有找到相遇點的話,把 fast 指針重新指向 head 後找環的起點,兩個指針 slow 和 fast 都改成一次走一步,再次相遇時就是環的起始節點\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, x):\n# self.val = x\n# self.next = None\n\nclass Solution:\n def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if not head or not head.next:\n return None\n\n slow, fast = head, head\n while fast:\n slow = slow.next\n fast = fast.next.next if fast.next else None\n if slow and slow == fast:\n fast = head \n while fast != slow:\n fast = fast.next\n slow = slow.next\n return fast\n\n return None\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3122031171","body":"思維:使用雙向鏈表搭配 Hash Map 實作 LRU Cache,讓每次的 get 和 put 操作都能在 O(1) 時間內完成。最近使用的節點會被移到鏈表頭部,當容量超過時,就從尾部刪除最久未使用的節點。\n\n代碼:\n```python\nclass ListNode:\n def __init__(self, key, value):\n self.key = key\n self.val = value\n self.next = None\n self.pre = None\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.capacity = capacity\n self.length = 0\n self.head = ListNode(None, None)\n self.tail = ListNode(None, None)\n self.head.next = self.tail\n self.tail.pre = self.head\n self.map = {}\n\n def _add_to_head(self, key: int, value: int):\n node = ListNode(key, value)\n node.next = self.head.next\n self.head.next = node\n node.next.pre = node\n node.pre = self.head\n self.map[key] = node\n self.length += 1\n\n def _remove_from_tail(self, key: int):\n remove_key = self.tail.pre.key\n self.tail.pre = self.tail.pre.pre\n self.tail.pre.next = self.tail\n self.map.pop(remove_key)\n self.length -= 1\n\n def _move_node_to_head(self, node: ListNode):\n node.pre.next = node.next\n node.next.pre = node.pre\n self.head.next.pre = node\n node.pre = self.head\n node.next = self.head.next\n self.head.next = node\n \n def get(self, key: int) -> int:\n if key in self.map:\n node = self.map[key]\n self._move_node_to_head(node)\n return self.map[key].val\n return -1\n \n def put(self, key: int, value: int) -> None:\n node = self.map.get(key)\n if node:\n self._move_node_to_head(node)\n node.val = value\n else:\n if self.length >= self.capacity:\n self._remove_from_tail(key) \n self._add_to_head(key, value)\n```\n時間複雜度:O(1)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124493359","body":"思維:DFS,透過遞迴分別計算左右子樹的最大深度,然後回傳較大的一邊再加 1(代表當前節點這一層),最終得到整棵樹的最大深度。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def maxDepth(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n return max(self.maxDepth(root.left), self.maxDepth(root.right))+1\n```\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127762191","body":"思維:DFS,透過遞歸比對兩棵樹的每個對應節點是否完全一樣,一層層往下檢查,直到整棵樹都比對完或中途不符合就結束。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if not p and not q:\n return True\n \n if p and q and p.val == q.val:\n res_left = self.isSameTree(p.left, q.left)\n res_right = self.isSameTree(p.right, q.right)\n return res_left and res_right\n\n return False\n```\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3133090654","body":"思維:DFS,透過遞歸保存當前數字的狀態,每走到下一層就把目前的 current_num 乘上 10 再加上當前節點的值,當走到葉子節點時就可以回傳目前這條路徑的數字,最後把左右子樹的 dfs 結果加總起來。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n def dfs(node, current_num):\n if not node:\n return 0\n current_num = current_num * 10 + node.val\n if not node.left and not node.right:\n return current_num\n return dfs(node.left, current_num) + dfs(node.right, current_num)\n return dfs(root, 0)\n```\n時間複雜度:O(N)\n\n空間複雜度:O(d) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135855226","body":"思維一:BFS,使用廣度優先搜尋一層層遍歷二元樹節點,並記錄每一層最先遇到的節點。每當進入新的一層,就更新目前儲存的節點為該層最左側的節點。最終回傳的是最底層最左邊那個節點的值。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n q = deque()\n res = (root,0)\n q.append((root,0))\n while q:\n node, level = q.popleft()\n cur_level = res[1]\n if level > cur_level:\n res = (node, level)\n\n if node.left:\n q.append((node.left, level+1))\n if node.right:\n q.append((node.right, level+1))\n\n return res[0].val\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(w) (max width of tree)\n\n---------\n思維二:DFS,使用深度優先搜尋遍歷整顆樹,每當遇到更深層的節點,就更新目前記錄的最左邊節點值,最終返回的是整棵樹最深層最左邊的節點值。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n def dfs(node, cur_depth, leftmost, depthest):\n if cur_depth > depthest:\n leftmost = node.val\n depthest = cur_depth\n\n if node.left:\n leftmost, depthest = dfs(node.left, cur_depth+1, leftmost, depthest)\n if node.right:\n leftmost, depthest = dfs(node.right, cur_depth+1, leftmost, depthest)\n return leftmost, depthest\n\n leftmost, depthest = dfs(root, 1, root.val, 1)\n return leftmost\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max height of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3140470104","body":"思維一:DFS
\nserialize: 使用 前序遍歷(DFS) 將樹的結構與節點值轉成 list,再轉為 JSON 字串,None 用來記錄空節點保證可逆。
\ndeserialize: 根據前序順序,遇到 None 表示空節點,遞迴還原出整棵樹的結構。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n def dfs(node):\n if not node:\n res.append(None)\n return\n\n res.append(node.val)\n dfs(node.left)\n dfs(node.right)\n\n dfs(root)\n return json.dumps(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n data = deque(json.loads(data))\n def dfs(data):\n val = data.popleft()\n if val is None:\n return\n\n node = TreeNode(val)\n node.left = dfs(data)\n node.right = dfs(data)\n return node\n \n return dfs(data)\n\n# Your Codec object will be instantiated and called as such:\n# ser = Codec()\n# deser = Codec()\n# ans = deser.deserialize(ser.serialize(root))\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)\n\n-----------------\n\n思維二:BFS
\nserialize:利用 BFS(層序遍歷)將每層節點值與空位(None)一起寫入 list,最後轉成 JSON 字串。
\ndeserialize:讀回字串後同樣使用 BFS,按順序建立節點並接上左右子節點,重建出原始二叉樹。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n queue = deque([root])\n while queue:\n node = queue.popleft()\n if node:\n res.append(node.val)\n queue.append(node.left)\n queue.append(node.right)\n else:\n res.append(None)\n\n return json.dumps(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n data = deque(json.loads(data))\n root_val = data.popleft()\n if root_val is None:\n return None\n \n root = TreeNode(root_val)\n queue = deque([root])\n while queue:\n node = queue.popleft()\n if data:\n left_val = data.popleft()\n right_val = data.popleft()\n if left_val is not None:\n left_node = TreeNode(left_val)\n node.left = left_node\n queue.append(left_node)\n if right_val is not None:\n right_node = TreeNode(right_val)\n node.right = right_node\n queue.append(right_node)\n\n return root\n\n# Your Codec object will be instantiated and called as such:\n# ser = Codec()\n# deser = Codec()\n# ans = deser.deserialize(ser.serialize(root))\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148593193","body":"思維:\n1. 對每個點 i 當作中心,計算它與所有其他點的距離\n2. 用 distance_map 統計,有多少個點與 i 的距離相同(也就是距離為 d 的點出現了幾次)\n3. 如果某個距離出現了 count 次(基本上就是超過一次的次數才會被納入計算),就能組出 count * (count - 1) 種 (j, k) boomerang(因為 (j, k), (k, j) 視為兩種組合,(count - 1) 為要扣掉已經放在前一個位置的元素)\n4. 最後把所有距離的組合數加總起來即可\n\n代碼:\n```python\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n res = 0\n for i, x in enumerate(points):\n distance_map = defaultdict(int)\n for j, y in enumerate(points):\n if i != j:\n distance_map[(y[0] - x[0])**2 + (y[1] - x[1])**2] += 1\n\n for count in distance_map.values():\n res += count * (count-1)\n\n return res\n```\n時間複雜度:O(N^2)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153175756","body":"思維:\n1. 使用雙指針 left 和 right 維護一個「不含重複字元的滑動視窗」\n2. 不斷將 right 指向的字元加入 seen\n3. 一旦發現重複字元,就從 left 開始依序從 seen 移除字元,直到這個重複字元被清掉\n4. 每次 right 移動後,更新視窗大小 right - left,維護一個最大值 max_str\n\n代碼:\n```python\nclass Solution:\n def lengthOfLongestSubstring(self, s: str) -> int:\n max_str = 0\n left = 0\n right = 0\n seen = set()\n while right < len(s):\n while s[right] in seen:\n seen.remove(s[left])\n left += 1\n seen.add(s[right])\n right += 1\n max_str = max(max_str, right-left)\n return max_str\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k) (k for number of character types)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160705635","body":"思維:\n1. 多組偏移掃描:使用 i in range(word_len) 對字串做「分組」掃描,防止錯過合法起始點\n2. 滑動視窗掃描:每次從 j 開始擷取一個單字(長度 word_len),如果這個字在 words 裡,放進 window_counter,若某個單字超出次數,移動 left(左指針)來縮小視窗,如果視窗內剛好有 word_count 個單字,加入結果\n3. 如果不是合法單字,清空 window_counter,重設 count 和 left(下一次從這個位置繼續)\n\n代碼:\n```python\nclass Solution:\n def findSubstring(self, s: str, words: List[str]) -> List[int]:\n word_len = len(words[0])\n word_count = len(words)\n total_len = word_len * word_count\n target_counter = Counter(words)\n res = []\n\n for i in range(word_len):\n left = i\n window_counter = Counter()\n count = 0\n\n for j in range(i, len(s) - word_len + 1, word_len):\n word = s[j:j+word_len]\n if word in target_counter:\n window_counter[word] += 1\n count += 1\n\n while window_counter[word] > target_counter[word]:\n left_word = s[left:left+word_len]\n window_counter[left_word] -= 1\n count -= 1\n left += word_len\n\n if count == word_count:\n res.append(left)\n\n else:\n window_counter.clear()\n count = 0\n left = j + word_len\n\n return res\n```\n時間複雜度:O(N × W) (N is length of s, W is length of words)\n\n空間複雜度:O(W)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166506559","body":"思維:使用快慢指標 (two pointers) 技巧,設兩個指標 slow 和 fast 同時指向鏈表頭,每次 slow 走一步、fast 走兩步,當 fast 到達鏈表尾時,slow 正好在中間節點。\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n\n return slow \n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172494360","body":"思維:使用雙指針來實行二分搜尋法,設定左右邊界取中間位置\n1. 如果 nums[mid] == target,直接回傳 mid(找到目標)。\n2. 如果 nums[mid] > target,代表目標在左半邊,更新 right = mid - 1。\n3. 如果 nums[mid] < target,代表目標在右半邊,更新 left = mid + 1。\n4. 迴圈結束後(left > right),left 就是目標應插入的位置。\n\n代碼:\n```python\nclass Solution:\n def searchInsert(self, nums: List[int], target: int) -> int:\n left = 0\n right = len(nums)-1\n while left <= right:\n mid = (left+right)//2\n if nums[mid] == target:\n return mid\n elif nums[mid] > target:\n right = mid-1\n else:\n left = mid+1\n return left\n```\n時間複雜度:O(logN)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173687770","body":"思維:使用單調遞減隊列來維護視窗內最大值的 index\n1. 前 k 個元素先初始化隊列:維持隊列的遞減性,每次新來的元素會移除尾部比它小的元素,q[0] 永遠是最大值的 index\n2. 接下來從 k 到結尾,維持單調性並移除過期元素:新元素進來時維持單調隊列,移除滑出視窗的 index,每次把 nums[q[0]](視窗最大值)加入結果\n\n代碼:\n```python\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n res = []\n q = deque()\n for i in range(k):\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n res.append(nums[q[0]])\n\n for i in range(k, len(nums)):\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n while q[0] <= i-k:\n q.popleft()\n res.append(nums[q[0]])\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178842909","body":"思維:\n1. 使用兩個表分別紀錄信任他人及被信任的計數\n2. 之後尋找一個人 x,滿足:trusted_tables[x] == n - 1(被其他人信任)以及 trust_tables[x] == 0:(自己沒信任任何人)\n3. 若找到這樣的人,回傳他的編號;否則回傳 -1\n\n代碼:\n```python\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n if n == 1:\n return 1\n\n trust_tables = defaultdict(int)\n trusted_tables = defaultdict(int)\n for [trust_a, trust_b] in trust:\n trust_tables[trust_a] += 1\n trusted_tables[trust_b] += 1\n\n for trusted_person, trusted_ticket in trusted_tables.items():\n if trusted_ticket == n-1 and trust_tables[trusted_person] == 0:\n return trusted_person\n return -1\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3188960333","body":"思維:\n1. 把沒群組的 item 分配新的唯一群組:這樣後面只需處理群組 id,不用特別分支處理 -1。\n2. 建立 item graph:由 prev -> curr(prev 必須在 curr 前面)。\n3. 建立 group graph:當 prev 與 curr 屬不同群組時,建立 g_prev -> g_curr 的依賴邊;用 set 避免重複邊。\n4. 對 group graph 做拓撲排序:得出 group 的一個合法順序;若有 cycle,無解回 []。\n5. 對 item graph 做拓撲排序:得出 items 在全域上的合法相對順序(若有 cycle,無解回 [])。\n6. 把 items 按 item_order 分桶到對應 group,再按 group_order 串接:同 group items 會連在一起且保持 item 之間的依賴。\n\n代碼:\n```python\nclass Solution:\n def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:\n new_group_id = m\n for i in range(n):\n if group[i] == -1:\n group[i] = new_group_id\n new_group_id += 1\n total_groups = new_group_id\n\n item_adj = [[] for _ in range(n)]\n item_indeg = [0] * n\n\n group_adj = [[] for _ in range(total_groups)]\n group_indeg = [0] * total_groups\n\n added_group_edges = set()\n\n for curr in range(n):\n for prev in beforeItems[curr]:\n item_adj[prev].append(curr)\n item_indeg[curr] += 1\n\n g_prev = group[prev]\n g_curr = group[curr]\n if g_prev != g_curr:\n if (g_prev, g_curr) not in added_group_edges:\n added_group_edges.add((g_prev, g_curr))\n group_adj[g_prev].append(g_curr)\n group_indeg[g_curr] += 1\n\n def topo_sort(num_nodes, adj, indeg):\n q = deque([i for i in range(num_nodes) if indeg[i] == 0])\n order = []\n while q:\n u = q.popleft()\n order.append(u)\n for v in adj[u]:\n indeg[v] -= 1\n if indeg[v] == 0:\n q.append(v)\n if len(order) == num_nodes:\n return order\n else:\n return []\n\n group_order = topo_sort(total_groups, group_adj, group_indeg[:])\n if not group_order:\n return []\n\n item_order = topo_sort(n, item_adj, item_indeg[:])\n if not item_order:\n return []\n\n items_by_group = defaultdict(list)\n for item in item_order:\n items_by_group[group[item]].append(item)\n\n result = []\n for g in group_order:\n result.extend(items_by_group[g])\n\n return result\n```\n時間複雜度:O(n + E)\n\n空間複雜度:O(n + m + E)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3191064414","body":"思維:依照題意模擬路徑\n\n代碼:\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n spot = [0, 0]\n for move in moves:\n if move == 'R':\n spot[0] += 1\n elif move == 'L':\n spot[0] -= 1\n elif move == 'U':\n spot[1] += 1\n else:\n spot[1] -= 1\n \n return spot == [0, 0]\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194164140","body":"思維:\n1. 解析登入、登出時間(時、分),如果登出時間早於登入時間,代表跨過午夜就加 24 小時。\n2. 重新計算登入時間:向上取整到最近的 15 分鐘倍數(因為要等到下一個完整的 15 分鐘才算開始一局)。\n3. 重新計算登出時間:向下取整到最近的 15 分鐘倍數(因為超過的部分不算完整一局)。\n4. 計算完整局數,如果結果為負數則返回 0。\n\n這裡用 (logout_hour-login_hour)*4 - login_minute/15 + logout_minute/15 直接換算成以「15 分鐘為單位」的差距。\n\n代碼:\n```python\nclass Solution:\n def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:\n login_hour, login_minute = map(int, loginTime.split(':'))\n logout_hour, logout_minute = map(int, logoutTime.split(':'))\n if logout_hour < login_hour or logout_hour == login_hour and logout_minute < login_minute:\n logout_hour += 24\n\n login_hour, login_minute = self.narrow_down_time(login_hour, login_minute, True)\n logout_hour, logout_minute = self.narrow_down_time(logout_hour, logout_minute, False)\n\n return max(0, int((logout_hour-login_hour)*4 - login_minute/15 + logout_minute/15))\n\n def narrow_down_time(self, login_hour: int, login_minute: int, is_login: bool):\n if is_login:\n login_minute = ceil(login_minute/15) * 15\n if login_minute == 60:\n login_hour += 1\n login_minute = 0\n else:\n login_minute = floor(login_minute/15) * 15\n\n return login_hour, login_minute\n```\n時間複雜度:O(1)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3196258303","body":"思維:\n1. 函式 compare_less(a_counter, b_counter):模擬條件 1、2,對所有可能分界點 ch(從 'b' 到 'z')進行遍歷
\n讓 a 的所有字母 < ch,讓 b 的所有字母 ≥ ch,使用 prefix sum 避免重複運算,計算出最少需要修改的字元數\n2. 函式 compare_distinct(a_counter, b_counter):模擬條件 3,讓兩字串變成同一種字母
\n對所有字母出現次數總和 Counter 做合併,找出現次數最多的字母後,將其餘字母通通改成這個字母,修改次數 = 總數量 - 該字母出現次數\n3. 分別計算三個條件需要的修改次數,回傳三者中的最小值\n\n代碼:\n```python\nclass Solution:\n def minCharacters(self, a: str, b: str) -> int:\n a_counter = Counter(ord(ch) for ch in a)\n b_counter = Counter(ord(ch) for ch in b)\n\n goal_a = self.compare_less(a_counter, b_counter)\n goal_b = self.compare_less(b_counter, a_counter)\n goal_c = self.compare_distinct(a_counter, b_counter)\n return min(goal_a, goal_b, goal_c)\n\n def compare_less(self, a_counter, b_counter):\n a_freq = [0] * 26\n b_freq = [0] * 26\n for k, v in a_counter.items():\n a_freq[k - ord('a')] = v\n for k, v in b_counter.items():\n b_freq[k - ord('a')] = v\n\n a_prefix = list(itertools.accumulate(a_freq))\n b_prefix = list(itertools.accumulate(b_freq))\n move = float('inf')\n for ch in range(1, 26):\n move_a = a_prefix[25] - a_prefix[ch-1]\n move_b = b_prefix[ch-1]\n move = min(move, move_a + move_b)\n return move\n\n def compare_distinct(self, a_counter, b_counter):\n all_counter = a_counter + b_counter\n most_key = max(all_counter, key=all_counter.get)\n total = sum(all_counter.values())\n return total - all_counter[most_key]\n```\n時間複雜度:O(n+m)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3201266614","body":"思維:先把所有數字用 heappush 丟進最小堆,維護「父節點 ≤ 子節點」,接著每次 heappop 拿走堆頂(最小值),直到堆空,收集出來的數列 res 就是升序排序。\n\n代碼:\n```python\nclass Solution:\n def sortArray(self, nums: List[int]) -> List[int]:\n min_heap = []\n res = []\n for num in nums:\n self.heappush(min_heap, num)\n\n while min_heap:\n res.append(self.heappop(min_heap))\n\n return res\n \n def heappush(self, h, x):\n h.append(x)\n i = len(h)-1\n\n while i > 0:\n p = (i - 1) // 2\n if h[i] < h[p]:\n h[i], h[p] = h[p], h[i]\n i = p\n else:\n break\n\n def heappop(self, h):\n last = h.pop()\n if not h:\n return last\n root = h[0]\n h[0] = last\n i = 0\n n = len(h)\n while True:\n left = 2*i + 1\n right = 2*i + 2\n if left >= n:\n break\n\n child = left\n if right < n and h[right] < h[left]:\n child = right\n if h[child] < h[i]:\n h[i], h[child] = h[child], h[i]\n i = child\n else:\n break\n return root\n```\n時間複雜度:O(n log n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204542831","body":"思維:使用二分搜尋法,對於 x ≥ 2 的情況,設定搜尋範圍為 [1, x // 2],如果 mid^2 太大,就向左縮小範圍,如果太小,就向右移動範圍,當搜尋結束(left > right)時,right 就是最接近但不超過 √x 的整數\n\n代碼:\n```python\nclass Solution:\n def mySqrt(self, x: int) -> int:\n if x < 2:\n return x\n \n left, right = 1, x // 2\n while left <= right:\n mid = (left + right) // 2\n if mid * mid == x:\n return mid\n elif mid * mid > x:\n right = mid - 1\n else:\n left = mid + 1\n\n return right\n```\n時間複雜度:O(log x)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3211104911","body":"思維:使用二分搜尋法,如果 mid 是壞的:可能是答案,但還要往左找,right = mid - 1,如果 mid 是好的:答案一定在右邊,left = mid + 1,最後 left 會停在第一個壞版本的位置。\n\n代碼:\n```python\nclass Solution:\n def firstBadVersion(self, n: int) -> int:\n left, right = 1, n\n while left <= right:\n mid = (left + right) // 2\n if isBadVersion(mid):\n right = mid - 1\n else:\n left = mid + 1\n return left\n```\n時間複雜度:O(log n)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216087383","body":"思維:\n1. 先對加熱器位置排序,才能用二分搜尋快速找到每個房子最近的加熱器\n2. 遍歷每個房子,使用二分搜尋找到第一個 heaters[mid] 大於等於當前 house 的位置(也就是最接近右邊的加熱器)\n3. 再往回看一個位置 heaters[r],也就是最接近左邊的加熱器\n4. 比較左右加熱器距離,選擇較小者\n5. 更新最大加熱半徑(最小距離中的最大值)\n\n代碼:\n```python\nclass Solution:\n def findRadius(self, houses: List[int], heaters: List[int]) -> int:\n res = 0\n heaters.sort()\n \n for house in houses:\n l, r = 0, len(heaters) - 1\n while l <= r:\n mid = (l + r) // 2\n if house <= heaters[mid]:\n r = mid - 1\n else:\n l = mid + 1\n\n l_res, r_res = inf, inf\n if 0 <= l <= len(heaters)-1:\n l_res = abs(heaters[l] - house)\n if 0 <= r <= len(heaters)-1:\n r_res = abs(heaters[r] - house)\n\n res = max(res, min(l_res, r_res))\n\n return res\n```\n時間複雜度:O(M log M + N log M) (M for length of heaters, N for length of houses)\n\n空間複雜度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3223499698","body":"思維:先初始化前 k 個字元中有多少母音,用滑動視窗維持長度為 k 的區間往右滑動,每次移動一格,視窗左邊出去一個字元、右邊進來一個字元,如果左邊移出的是母音即減 1,如果右邊移入的是母音即加 1,並且更新最大值,直到滑到最後一格為止\n\n代碼:\n```python\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n vowels = set('aeiou')\n count = sum(1 for c in s[:k] if c in vowels)\n max_count = count\n\n for i in range(k, len(s)):\n if s[i-k] in vowels:\n count -= 1\n if s[i] in vowels:\n count += 1\n max_count = max(max_count, count)\n\n return max_count\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3227824002","body":"思維:\n1. 邊界判斷:若 k == 0,不會抽牌,分數永遠是 0,且一定 ≤ n,直接回傳 1.0。若 n ≥ k + maxPts - 1,最多只能拿到 k - 1 + maxPts 分,而這些都 ≤ n,直接回傳 1.0\n2. 初始化:建立一個長度 n + 1 的 dp 陣列,dp[i] 表示拿到 i 分的機率,設定 dp[0] = 1.0(初始在 0 分),window_sum = 1.0 表示 dp[0] 的值,res = 0.0,用來累加最終結果(分數 ≥ k 的機率)\n3. 進入迴圈,從 i = 1 到 n:使用滑動視窗平均法計算 dp[i] = window_sum / maxPts,如果 i < k 代表還會繼續抽牌 → 將 dp[i] 加入 window_sum,影響後續機率,如果 i ≥ k,代表不能再抽牌了 → 將 dp[i] 加入 res,因為這是可能的最終分數\n4. 維護滑動視窗:若 i - maxPts ≥ 0,將前方的 dp[i - maxPts] 從 window_sum 中扣除,保持視窗大小為 maxPts\n5. 迴圈結束後,回傳累積的結果:回傳 res,即所有停在 k 到 n 分的總機率\n\n代碼:\n```python\nclass Solution:\n def new21Game(self, n: int, k: int, maxPts: int) -> float:\n if k == 0 or n >= k + maxPts - 1:\n return 1\n \n dp = [0.0] * (n + 1)\n dp[0] = 1.0\n window_sum = 1.0\n res = 0.0\n\n for i in range(1, n + 1):\n dp[i] = window_sum / maxPts\n if i < k:\n window_sum += dp[i]\n else:\n res += dp[i]\n\n if i - maxPts >= 0:\n window_sum -= dp[i-maxPts]\n\n return res\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3232431244","body":"思維:透過固定長度為 len(p) 的滑動視窗掃過整個字串 s,用 Counter 統計當前視窗的字元分佈\n1. 初始化兩個 Counter:target 記錄 p 的字元分佈,cur 動態維護視窗內的字元分佈\n2. 向右移動右指標 r 更新 cur,每次移動後如果 cur == target,代表此視窗是一個 anagram,res 加入 l\n3. 視窗長度若達到 len(p),就縮左邊,如果左邊的字元也在 p 中,從 cur 中減一,移動左指標 l,確保視窗長度維持為 len(p)\n\n代碼:\n```python\nclass Solution:\n def findAnagrams(self, s: str, p: str) -> List[int]:\n res = []\n target = Counter(p)\n cur = Counter()\n l, r = 0, 0\n\n while r < len(s):\n if s[r] in p:\n cur[s[r]] += 1\n \n if cur == target:\n res.append(l)\n\n r += 1\n if r - l >= len(p):\n if s[l] in p:\n cur[s[l]] -= 1\n l += 1\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235535873","body":"思維:\n1. 使用 target 記錄 t 中每個字元需要出現幾次,required 為需要達成的字元種類數,formed 表示目前有多少種字元達到目標需求\n2. 用滑動視窗 [l, r] 掃過 s\n3. 視窗內使用 cur 統計目前出現的字元次數\n4. 每當 formed == required(即目前視窗內已滿足所有字元需求),就嘗試更新最短子字串\n5. 然後移動左指標 l,直到不再滿足條件,再往右擴張 r\n\n代碼:\n```python\nclass Solution:\n def minWindow(self, s: str, t: str) -> str:\n if not s or not t or len(t) > len(s):\n return ''\n\n res = ''\n target = Counter(t)\n cur = Counter()\n required = len(target)\n formed = 0\n l = 0\n\n for r in range(len(s)):\n char = s[r]\n if char in target:\n cur[char] += 1\n if cur[char] == target[char]:\n formed += 1\n\n while formed == required:\n window = s[l:r+1]\n if not res or len(window) < len(res):\n res = window\n\n if s[l] in target:\n cur[s[l]] -= 1\n if cur[s[l]] < target[s[l]]:\n formed -= 1\n l += 1\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3241211135","body":"思維:\n1. 每一層遞迴代表一個 row(橫列),每一層嘗試在該 row 的每一個 col(直行)上放一個 Q\n2. 使用三個集合記錄不能放的位置(剪枝):used_cols:欄位不能重複、used_diag1:↘ 對角線(row - col)不能重複、used_diag2:↙ 對角線(row + col)不能重複\n3. 如果當前格子合法:將當前 col 與對角線加入對應集合,進入下一 row 繼續放皇后\n4. 如果成功放到第 n 行,代表一種合法放法,count += 1\n5. 每個回合結束後回溯:移除當前狀態,嘗試下一個 col\n\n代碼:\n```python\nclass Solution:\n def totalNQueens(self, n: int) -> int:\n count = 0\n\n def backtracking(row, used_cols, used_diag1, used_diag2):\n if row == n:\n nonlocal count \n count += 1\n return\n\n for col in range(n):\n if col in used_cols or row - col in used_diag1 or row + col in used_diag2:\n continue\n \n used_cols.add(col)\n used_diag1.add(row - col)\n used_diag2.add(row + col)\n\n backtracking(row + 1, used_cols, used_diag1, used_diag2)\n\n used_cols.remove(col)\n used_diag1.remove(row - col)\n used_diag2.remove(row + col)\n\n backtracking(0, set(), set(), set())\n\n return count\n```\n時間複雜度:O(n!)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3244207256","body":"思維:深度優先搜尋(DFS)\n1. 初始化變數: seen 避免重複拜訪相同格子、max_area記錄最大島嶼面積\n2. 走過整張地圖: 雙層 for loop,遍歷每一格 (i, j)\n3. 找到新的島嶼起點就 DFS: 如果是還沒拜訪過的陸地,就從這裡開始 DFS,算面積,回傳面積後更新 max_area\n4. DFS 拜訪所有相連陸地: 每次進來的 (row, col) 都會標記為已拜訪,area = 1 表示這一格自己先算進面積\n5. 遞迴搜尋上下左右的相連格子: 檢查鄰近 4 格是否可以繼續走,遞迴地累加 area\n6. DFS 結束後回傳這座島的面積\n\n代碼:\n```python\nclass Solution:\n direction = [(1, 0), (-1, 0), (0, 1), (0, -1)]\n\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n seen = set()\n max_area = 0\n for i in range(len(grid)):\n for j in range(len(grid[0])):\n if grid[i][j] == 1 and (i, j) not in seen:\n area = self.dfs(i, j, seen, grid)\n max_area = max(max_area, area)\n \n return max_area\n\n def dfs(self, row, col, seen, grid):\n seen.add((row, col))\n area = 1\n for dx, dy in self.direction:\n x, y = row + dx, col + dy\n if 0 <= x < len(grid) and 0 <= y < len(grid[0]) and grid[x][y] == 1 and (x, y) not in seen:\n area += self.dfs(x, y, seen, grid)\n \n return area\n```\n時間複雜度:O(m × n)\n\n空間複雜度:O(m × n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249687017","body":"思維:多源 BFS\n1. 把所有的陸地格(值為 1)當作起點,加入 queue 中\n2. 先判斷若陸地為空(全是水)或全是陸地,回傳 -1\n3. BFS 擴展每一層水格:每次從 queue 拿一個格子出來,對四個方向進行探索,如果是水(值為 0),就更新它為「距離 = 前一格 + 1」,並將它加入 queue,等下繼續擴展\n4. 最後回傳最大距離 -1:因為初始的陸地值是 1,所以水格的距離是從 2 開始計算,因此真正的距離 = 格子值 - 1\n\n代碼:\n```python\nclass Solution:\n def maxDistance(self, grid: List[List[int]]) -> int:\n q = deque()\n for i in range(len(grid)):\n for j in range(len(grid[0])):\n if grid[i][j] == 1:\n q.append((i, j))\n \n if not q or len(q) == len(grid) * len(grid):\n return -1\n\n directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]\n max_dist = 0\n while q:\n x, y = q.popleft()\n for dx, dy in directions:\n nx = x + dx\n ny = y + dy\n if 0 <= nx < len(grid) and 0 <= ny < len(grid[0]) and grid[nx][ny] == 0:\n grid[nx][ny] = grid[x][y] + 1\n q.append((nx, ny))\n max_dist = max(max_dist, grid[nx][ny])\n\n return max_dist - 1\n```\n時間複雜度:O(n^2)\n\n空間複雜度:O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251575584","body":"思維:\n1. 把初始擁有箱子(initialBoxes)能打開的箱子(status = 1)加入 queue\n2. 使用 queue 處理可以打開的箱子,如果已經處理過的話則跳過\n3. 開箱拿糖果後,處理新拿到的箱子鑰匙,把鑰匙對應到已擁有且未開啟過的 box 加入 queue\n4. 處理新拿到的箱子,如果箱子可以直接打開或擁有鑰匙就加進 queue,否則放進 own_boxes 等待日後有拿到 key 再打開\n5. 整個流程直到 queue 為空,表示目前已經沒能力再開更多箱子了,回傳總糖果數量\n\n代碼:\n```python\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n own_boxes = set(initialBoxes)\n own_keys = set()\n visited = set()\n q = deque()\n total_candies = 0\n\n for box in initialBoxes:\n if status[box] == 1:\n q.append(box)\n \n while q:\n box = q.popleft()\n if box in visited:\n continue\n\n total_candies += candies[box]\n visited.add(box)\n \n for key in keys[box]:\n own_keys.add(key)\n if key in own_boxes and key not in visited:\n q.append(key)\n\n for new_box in containedBoxes[box]:\n own_boxes.add(new_box)\n if (status[new_box] == 1 or new_box in own_keys) and new_box not in visited:\n q.append(new_box) \n\n return total_candies\n```\n時間複雜度:O(n+k)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3256863525","body":"思維:\n1. 廣度優先搜尋 (BFS) 遍歷樹,使用 deque 從 root 開始,記錄每個節點的座標\n2. 收集節點資訊,每個節點存成 (x, y, val),加入 nodes 列表\n3. 排序節點,按照題目規則排序:y(由左到右),x(由上到下),val(同位置時數字小的先)\n4. 按列分組,掃描排序後的 nodes,根據 y 值變化劃分列表\n5. 回傳結果,res 即 vertical order traversal 的輸出。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:\n nodes = []\n q = deque([(root, 0, 0)])\n while q:\n node, x, y = q.popleft()\n nodes.append((x, y, node.val))\n if node.left:\n q.append((node.left, x+1, y-1))\n if node.right:\n q.append((node.right, x+1, y+1))\n\n nodes.sort(key=lambda x: (x[1], x[0], x[2]))\n res = []\n cur_y = None\n for _, y, val in nodes:\n if y != cur_y:\n res.append([val])\n cur_y = y\n else:\n res[-1].append(val)\n\n return res\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260998230","body":"思維:\n1. 定義狀態 dp[i] 表示「到達第 i 階的最小花費」\n2. 每次要到達第 i 階,有兩種方式:從第 i-1 階踩一階上來 → 花費 = dp[i-1] + cost[i-1] or 從第 i-2 階踩兩階上來 → 花費 = dp[i-2] + cost[i-2]\n3. 所以取較小值 dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n4. 我們要到達頂樓 = len(cost),因此答案是 dp[-1](即 dp[len(cost)])\n\n代碼:\n```python3\nclass Solution:\n def minCostClimbingStairs(self, cost: List[int]) -> int:\n dp = [0] * (len(cost) + 1)\n for i in range(2, len(cost) + 1):\n dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n\n return dp[-1]\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263817074","body":"思維:\n1. 如果只有一間房子,直接回傳 nums[0]\n2. 初始化 dp 陣列,建立一個長度與 nums 相同的陣列 dp,dp[i] 表示考慮到第 i 間房子時,選擇偷這間房子,能得到的最大金額\n3. 填入前兩個房子:如果 i < 2,直接偷這間房子\n4. 狀態轉移(從 i=2 開始),偷第 i 間房的前提是不能偷相鄰的,所以考慮搭配 i-2 或搭配 i-3 的最佳解\n5. 最後答案一定是偷到倒數第 1 間(dp[-1])或倒數第 2 間(dp[-2]),取最大值\n\n代碼:\n```python\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n if len(nums) == 1:\n return nums[0]\n\n dp = [0] * len(nums)\n for i, num in enumerate(nums):\n if i < 2:\n dp[i] = num\n else:\n dp[i] = max(dp[i-2] + num, dp[i-3] + num)\n\n return max(dp[-1], dp[-2])\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3264481892","body":"思維:\n1. dp[i]: 表示以 nums[i] 結尾的 LIS 最長長度、count[i]: 表示有多少組 LIS 長度等於 dp[i] 是以 nums[i] 結尾的\n2. 對每個 i,檢查它前面的每個 j,如果 nums[j] < nums[i],則可以將 nums[i] 接在 nums[j] 後面\n3. 如果接在 j 後面可以讓序列更長(dp[j] + 1 > dp[i]),則更新 dp[i] = dp[j] + 1,並且把組數設為 count[i] = count[j]\n4. 如果接在 j 後面剛好等長(dp[j] + 1 == dp[i]),則表示找到另一條一樣長的走法,所以把組數加進來 count[i] += count[j]\n5. 最後找出所有 dp[i] == max_len 的位置,把它們對應的 count[i] 加總起來\n\n代碼:\n```python\nclass Solution:\n def findNumberOfLIS(self, nums: List[int]) -> int:\n n = len(nums)\n dp = [1] * n\n count = [1] * n\n\n for i in range(n):\n for j in range(i):\n if nums[j] < nums[i]:\n if dp[j] + 1 > dp[i]:\n dp[i] = dp[j] + 1\n count[i] = count[j]\n elif dp[j] + 1 == dp[i]:\n count[i] += count[j]\n\n max_len = max(dp)\n return sum(c for i, c in enumerate(count) if dp[i] == max_len)\n```\n時間複雜度:O(n^2)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269134596","body":"思維:\n1. 設 dp[i][j] = text1[:i] 與 text2[:j] 的最長共同子序列長度\n2. 如果其中一個字串長度為 0 → LCS = 0,所以 dp[0][*] 和 dp[*][0] 全部設為 0\n3. 如果 text1[i-1] == text2[j-1],這個字元可以加入 LCS → dp[i][j] = dp[i-1][j-1] + 1\n4. 否則這個字元不能同時出現在 LCS,只能丟掉其中一個字元,取兩種情況最大值 → dp[i][j] = max(dp[i-1][j], dp[i][j-1])\n5. 回傳 dp[-1][-1](表格右下角)就是最終答案\n\n代碼:\n```python\nclass Solution:\n def longestCommonSubsequence(self, text1: str, text2: str) -> int:\n m = len(text1)\n n = len(text2)\n dp = [[0]*(n+1) for _ in range(m+1)]\n \n for i in range(1, m+1):\n for j in range(1, n+1):\n if text1[i-1] == text2[j-1]:\n dp[i][j] = dp[i-1][j-1] + 1\n else:\n dp[i][j] = max(dp[i-1][j], dp[i][j-1])\n\n return dp[-1][-1]\n```\n時間複雜度:O(m * n)\n\n空間複雜度:O(m * n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273520377","body":"思維:\n1. 機器人從左上角走到右下角,只能往下或往右,所以每個格子的路徑數 = 從上方來的路徑數 + 從左方來的路徑數\n2. 狀態定義:dp[i][j] = 從起點 (0,0) 到 (i,j) 的路徑數\n3. 初始化所有路徑都是 1,主要是第一行、第一列只能直走一條路徑因此都是 1\n4. dp[i][j] 的路徑數就等於 dp[i−1][j] (從上方來的路徑數) + dp[i][j−1] (從左方來的路徑數)\n5. 最後答案取右下角 dp[m-1][n-1]\n\n代碼:\n```python\nclass Solution:\n def uniquePaths(self, m: int, n: int) -> int:\n dp = [[1] * n for _ in range(m)]\n for i in range(1, m):\n for j in range(1, n):\n dp[i][j] = dp[i-1][j] + dp[i][j-1]\n \n return dp[m-1][n-1]\n```\n時間複雜度:O(m * n)\n\n空間複雜度:O(m * n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3278614246","body":"思維:\n1. 狀態定義:dp[r][c] = 騎士在走了 t 步之後,位於 (r,c) 的機率\n2. 初始化:t=0 時,起點 (row, column) 的機率 = 1.0,其他位置 = 0.0\n3. 狀態轉移:從 (r,c) 出發,分散到 8 個可能位置。每一個合法位置的機率 += dp[r][c] / 8\n4. 重複 k 次:每一步產生新的棋盤機率分佈,並用新的棋盤機率更新 dp 陣列\n5. 回傳答案:把整個棋盤上機率加總,就是騎士還在棋盤上的總機率\n\n代碼:\n```python\nclass Solution:\n def knightProbability(self, n: int, k: int, row: int, column: int) -> float:\n dp = [[0.0] * n for _ in range(n)]\n dp[row][column] = 1.0\n positions = [(-1, 2), (-1, -2), (-2, 1), (-2, -1), (1, 2), (1, -2), (2, 1), (2, -1)]\n\n for i in range(k):\n next_dp = [[0.0] * n for _ in range(n)]\n for r in range(n):\n for c in range(n):\n if dp[r][c] > 0:\n for dr, dc in positions:\n nr, nc = r + dr, c + dc\n if 0 <= nr < n and 0 <= nc < n:\n next_dp[nr][nc] += dp[r][c] / 8.0\n dp = next_dp \n\n return sum(sum(row) for row in dp)\n```\n時間複雜度:O(k * n^2)\n\n空間複雜度:O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3285759121","body":"思維:\n1. 如果 1+2+…+max < desiredTotal → 永遠湊不到目標 → return False\n2. 如果 desiredTotal ≤ maxChoosableInteger → 先手一次就贏 → return True\n3. 用 bitmask mask 記錄哪些數字已被選過,用 remain 記錄距離目標還差多少\n4. 遞迴判斷 (dfs) 嘗試每一個未被選過的數字 num\n5. 如果 num ≥ remain → 我馬上贏 → return True,否則進入新狀態 (new_mask, remain-num),讓對手繼續\n6. 如果對手在新狀態輸(dfs 回 False)→ 我必勝 → return True\n7. 如果沒有任何選擇能讓我贏 → return False\n\n代碼:\n```python\nclass Solution:\n def canIWin(self, maxChoosableInteger: int, desiredTotal: int) -> bool: \n total_sum = (1 + maxChoosableInteger) * maxChoosableInteger / 2\n if total_sum < desiredTotal:\n return False\n if desiredTotal <= maxChoosableInteger:\n return True\n \n @lru_cache(None)\n def dfs(mask, remain):\n for num in range(1, maxChoosableInteger + 1):\n if not mask & (1 << (num-1)):\n if num >= remain:\n return True\n new_mask = mask | (1 << (num-1))\n if not dfs(new_mask, remain - num):\n return True\n return False\n\n return dfs(0, desiredTotal)\n```\n時間複雜度:O(m * 2^m)\n\n空間複雜度:O(2^m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3287665138","body":"思維:\n1. 如果 nums 的總和是奇數,不可能分成兩組相等 → return False\n2. 否則,目標和 = 總和 / 2\n3. 狀態定義:dp[i][j] = 是否可以用前 i 個數字湊出和 j\n4. 初始化:dp[0][0] = True(不用任何數字就能湊出 0),dp[0][j>0] = False(不用數字不可能湊出正數)\n5. 若 j < nums[i-1] → 這個數太大,不能用因此只能 → dp[i][j] = dp[i-1][j]\n6. 若 j ≥ nums[i-1] → 可以選用或不用這個數 → dp[i][j] = dp[i-1][j] or dp[i-1][j - nums[i-1]]\n7. 最後看 dp[n][target],如果 True → 代表能找到一個子集和 = target → 表示 nums 可分成兩組\n\n代碼:\n```python\nclass Solution:\n def canPartition(self, : List[int]) -> bool:\n if sum(nums) % 2 > 0:\n return False\n target = sum(nums) // 2\n\n dp = [[False] * (target + 1) for _ in range(len(nums) + 1)]\n dp[0][0] = True\n for i in range(1, len(nums) + 1):\n for j in range(target + 1):\n if j < nums[i-1]:\n dp[i][j] = dp[i-1][j]\n else:\n dp[i][j] = dp[i-1][j] or dp[i-1][j-nums[i-1]]\n\n return dp[len(nums)][target]\n```\n時間複雜度:O(n * m) (n for length of nums, m for target)\n\n空間複雜度:O(n * m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289413390","body":"思維:\n1. 要找能不能在 nums 前加上 + 或 -,最後湊成 target,等價於找一個子集,使總和 = (sum(nums)+target)/2 = p\n2. 如果 abs(target) > sum → 超過總和,必然無解,如果 sum + target 是奇數 → p 不是整數,也必然無解\n3. 狀態定義:dp[j] = 方法數,表示能湊出和為 j 的子集數量\n4. 初始化:dp[0] = 1 → 空集合能湊出 0 的方法只有 1 種\n5. 狀態轉移:遍歷每個數字 num,倒序更新,如果能湊出 j-num,再加上 num 就能湊出 j\n6. 答案回傳 dp[p],也就是湊出和為 p 的方法數\n\n代碼:\n```python\nclass Solution:\n def findTargetSumWays(self, nums: List[int], target: int) -> int:\n if abs(target) > sum(nums) or (sum(nums) + target) % 2 > 0:\n return 0\n\n p = (sum(nums) + target) // 2\n dp = [0] * (p + 1)\n dp[0] = 1\n for i in range(len(nums)):\n for j in range(p, nums[i]-1, -1):\n dp[j] += dp[j-nums[i]]\n\n return dp[p]\n``` \n時間複雜度:O(n * p) \n\n空間複雜度:O(p)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290383887","body":"思維:\n1. 初始化建立 dp 陣列,長度為 amount+1,全部設成無窮大 inf,代表一開始不可達\n2. 設 dp[0] = 0,表示湊 0 元不需要硬幣\n3. 外層金額 i 從 1 跑到 amount,內層對每個硬幣 coin 嘗試\n4. 如果 i - coin >= 0,表示可用這枚硬幣,更新 dp[i] = min(dp[i], dp[i - coin] + 1) (選湊出 i 元的最少硬幣數,看最後一枚硬幣選哪個面額)\n5. 回傳答案如果 dp[amount] 還是 inf,代表不可達回傳 -1,否則回傳 dp[amount]\n\n代碼:\n```python\nclass Solution:\n def coinChange(self, coins: List[int], amount: int) -> int:\n dp = [inf] * (amount + 1)\n dp[0] = 0\n for i in range(1, amount+1):\n for coin in coins:\n if i - coin >= 0:\n dp[i] = min(dp[i], dp[i - coin]+1)\n \n return dp[amount] if dp[amount] != inf else -1\n```\n時間複雜度:O(m × n) (m for amount, n for length of coins)\n\n空間複雜度:O(m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3299125872","body":"思維:\n1. 昨天的題目需考慮排列數(考慮順序),今天的題目僅需考慮組合數(不考慮順序)\n2. 定義 dp[i] = 湊出金額 i 的 組合數\n3. dp[0] = 1:湊出 0 元只有一種方式,什麼都不拿,其餘 dp[i] = 0,表示一開始還沒有任何組合\n4. 外層迴圈:逐一考慮硬幣 coin,內層迴圈:從金額 coin 開始到 amount 逐步更新\n5. dp[i] += dp[i - coin]:若要湊出金額 i,可以先用一個 coin,剩下的 i - coin 由之前的組合補上\n6. 避免重複排列,因為外層是硬幣,每一種硬幣只能在自己之後加入,確保順序不會被重複計算\n7. 回傳答案 dp[amount] 即為湊出總金額的組合數\n\n代碼:\n```python\nclass Solution:\n def change(self, amount: int, coins: List[int]) -> int:\n dp = [0] * (amount + 1)\n dp[0] = 1\n for coin in coins:\n for i in range(coin, amount+1):\n dp[i] += dp[i - coin]\n\n return dp[amount]\n```\n時間複雜度:O(m × n) (m for amount, n for length of coins)\n\n空間複雜度:O(m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3301195823","body":"思維:\n1. 排序貪心:把 g(貪心值)與 s(餅乾大小)都排序\n2. 從大的開始配對:i 指向最大餅乾,j 指向最難滿足的小孩\n3. 若 s[i] >= g[j],就把這片大餅乾給這個小孩,否則,去嘗試滿足下一個(較不貪心)孩子\n5. 結束條件:任一方用完即停止,輸出成功配對數 res\n\n代碼:\n```python\nclass Solution:\n def findContentChildren(self, g: List[int], s: List[int]) -> int:\n g.sort()\n s.sort()\n i = len(s)-1\n j = len(g)-1\n res = 0\n \n while i >= 0 and j >= 0:\n if s[i] >= g[j]:\n res += 1\n i -= 1\n j -= 1\n\n return res\n```\n時間複雜度:O(nlogn+mlogm) (sorting)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3305048523","body":"思維:\n1. 先依 start 排序,若 start 相同則依 end 排序\n2. 用 prev_end 記錄上一次保留的區間結束\n3. 遍歷:如果當前區間 cur_start < prev_end → 代表重疊\n4. 若 cur_end < prev_end → 保留更早結束的區間(更新 prev_end)\n5. 不管怎樣,重疊就要刪掉一個,res += 1\n6. 否則(不重疊) → 更新 prev_end = cur_end\n7. 回傳刪除數量\n\n代碼:\n```python\nclass Solution:\n def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:\n intervals = sorted(intervals)\n prev_end = intervals[0][1]\n res = 0\n\n for i in range(1, len(intervals)):\n cur_start, cur_end = intervals[i]\n if cur_start < prev_end:\n if cur_end < prev_end:\n prev_end = cur_end\n res += 1\n else:\n prev_end = cur_end\n \n return res\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3310296356","body":"思維:\n1. 初始化設定 farthest = 0,代表目前能到達的最遠位置(初始只能到 index 0)\n2. 遍歷陣列依序檢查每個位置檢查是否可達:i = 當前所在索引,step = 在這個位置能往前跳的最大步數\n3. 如果 i > farthest,表示這個位置已經超過了之前能到的最遠範圍 → 代表根本走不到這裡 → 直接回傳 False\n4. 否則更新最遠範圍 farthest = max(farthest, i + step)\n5. 結束迴圈能完整跑完,代表沒有遇到無法到達的位置,直接回傳 True(一定能到達最後一格)\n\n代碼:\n```python\nclass Solution:\n def canJump(self, nums: List[int]) -> bool:\n farthest = 0\n for i, step in enumerate(nums):\n if i > farthest:\n return False\n farthest = max(farthest, i + step)\n return True\n```\n時間複雜度:O(n)\n\n空間複雜度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/73#issuecomment-3317351262","body":"思維:\n1. Base Case: n=1 → [1]、n=2 → [1,2]\n2. 把問題拆成奇數子問題 (長度 = (n+1)//2) 和偶數子問題 (長度 = n//2),避免等差數列的產生\n3. 奇數組跟偶數組內分別都是從一個更小的 beautiful array 轉換來的,本身不會產生違規的等差數列\n4. 如果一邊是奇數、一邊是偶數,它們的平均數會是小數(不是整數),但我們的陣列只包含整數,不可能命中,所以跨組之間絕對安全\n5. 奇數子問題的結果全部轉換成奇數(2*x-1)\n6. 偶數子問題的結果全部轉換成偶數(2*x)\n7. 把奇數陣列與偶數陣列串接在一起,得到長度 n 的 beautiful array\n\n代碼:\n```python\nclass Solution:\n def beautifulArray(self, n: int) -> List[int]:\n if n == 1:\n return [1]\n if n == 2:\n return [1, 2]\n\n odd_arr = [x*2 -1 for x in self.beautifulArray((n+1) // 2)]\n even_arr = [x*2 for x in self.beautifulArray(n // 2)]\n \n return odd_arr + even_arr\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322731377","body":"思維:\n1. 所有數字 XOR 一遍,因為成對的數字會抵消掉 (a ^ a = 0),最後剩下的是 xor_all = x ^ y\n2. 這裡的 x, y 就是我們要找的兩個只出現一次的數字\n3. 找到一個區分 x, y 的 bit,因為 x != y,xor_all 至少有一個 bit = 1,代表 x 和 y 在那一位不同\n4. 用 diff_bit = xor_all & (-xor_all) 取出最低 set bit (最右邊的 1)\n5. 根據這個 diff_bit 把數字分組,如果 (num & diff_bit) != 0 → 放在組 A,否則 → 放在組 B\n6. 各組再 XOR 一遍,成對數字會互相抵消,只剩下唯一的 x 或 y\n7. 最後兩組結果就是 [x, y]\n\n代碼:\n```python\nclass Solution:\n def singleNumber(self, nums: List[int]) -> List[int]:\n xor_all = 0\n for num in nums:\n xor_all ^= num\n\n diff_bit = xor_all & (-xor_all)\n\n x, y = 0, 0\n for num in nums:\n if num & diff_bit:\n x ^= num\n else:\n y ^= num\n\n return [x, y]\n```\n時間複雜度:O(n)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3326355904","body":"思維:\n1. 把長度為 n 的陣列 nums 想成有 n 個開關(bit),一個整數 mask 的二進位表示,就代表一個子集合,mask 從 0 走到 (1<> i) & 1 == 1,代表第 i 位被選中 → subset.append(nums[i]),最後把 subset 加進 res\n4. 回傳結果 res\n\n代碼:\n```python\nclass Solution:\n def subsets(self, nums: List[int]) -> List[List[int]]:\n n = len(nums)\n res = []\n for mask in range(1 << n):\n subset = []\n for i in range(n):\n if (mask >> i) & 1:\n subset.append(nums[i])\n res.append(subset)\n\n return res\n```\n時間複雜度:O(n · 2^n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3332654533","body":"思維:\n1. TrieNode 結構:children 字典,用來存放「下一個字元 → 子節點」,hasword 標記當前節點是否對應一個完整單詞\n2. Trie 主類別:insert(word) 從 root 出發逐字檢查,若不存在就新建節點,最後節點標記 hasword = True\n3. search(word) 從 root 出發逐字檢查,若遇到缺失字元,直接回傳 False,結束後檢查最後節點的 hasword,若 True 表示單詞存在\n4. startsWith(prefix) 與 search 類似,但不需檢查 hasword,只要能走到 prefix 的最後一個節點就回傳 True\n\n代碼:\n```python\nclass TrieNode:\n def __init__(self):\n self.children = {}\n self.hasword = False\n\n\nclass Trie:\n def __init__(self):\n self.head = TrieNode()\n \n def insert(self, word: str) -> None:\n cur = self.head\n for c in word:\n if c not in cur.children:\n cur.children[c] = TrieNode()\n cur = cur.children[c]\n cur.hasword = True\n\n def search(self, word: str) -> bool:\n cur = self.head\n for c in word:\n if c not in cur.children:\n return False\n cur = cur.children[c]\n\n return cur.hasword\n\n def startsWith(self, prefix: str) -> bool:\n cur = self.head\n for c in prefix:\n if c not in cur.children:\n return False\n cur = cur.children[c]\n return True\n \n\n# Your Trie object will be instantiated and called as such:\n# obj = Trie()\n# obj.insert(word)\n# param_2 = obj.search(word)\n# param_3 = obj.startsWith(prefix)\n```\n時間複雜度:O(n) (Insert, search, startsWith)\n\n空間複雜度:O(n) (Insert) / O(1) (search, startsWith)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3337545631","body":"思維:\n1. TrieNode 結構:children 存子節點,precount 紀錄該節點以下所有 key 對應值的總和(前綴總和),count 紀錄如果這裡是完整單字,記錄它的 value\n2. insert(key, val):逐字往下走,若不存在就新建節點,每走過一個節點 → precount += val(加上新值)\n3. 如果這個 key 之前沒出現過 → 直接存 count = val,如果 key 已經存在 → 先取出舊值 deduct = cur.count,再更新 count = val\n4. 最後重新走一遍 key,把前綴總和扣掉原本的舊值 precount -= deduct\n5. sum(prefix):從 root 開始逐字走 prefix,如果 prefix 路徑不存在 → 回傳 0,如果存在 → 回傳最後節點的 precount\n\n代碼:\n```python\nclass TrieNode:\n def __init__(self):\n self.children = {}\n self.precount = 0\n self.count = 0\n\nclass MapSum:\n\n def __init__(self):\n self.head = TrieNode()\n\n def insert(self, key: str, val: int) -> None:\n cur = self.head\n for c in key:\n if c not in cur.children:\n cur.children[c] = TrieNode()\n cur = cur.children[c]\n cur.precount += val\n\n if not cur.count:\n cur.count = val\n else:\n deduct = cur.count\n cur.count = val\n cur = self.head\n for c in key:\n cur = cur.children[c]\n cur.precount -= deduct\n \n\n def sum(self, prefix: str) -> int:\n cur = self.head\n for c in prefix:\n if c not in cur.children:\n return 0\n cur = cur.children[c]\n return cur.precount\n\n\n# Your MapSum object will be instantiated and called as such:\n# obj = MapSum()\n# obj.insert(key,val)\n# param_2 = obj.sum(prefix)\n```\n時間複雜度:O(n) (Insert, sum)\n\n空間複雜度:O(n) (Insert) / O(1) (sum)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3355772609","body":"思維:\n1. 任何不包含 1 的子樹應該被刪掉,若節點值是 0,且左右子樹都不存在或都被刪光,那這個節點也該刪\n2. 從下往上考慮 → 遞迴後序遍歷 (post-order),先處理左右子樹,回傳「修剪後的子樹」,再決定當前節點要不要刪除\n3. 若節點是 None,直接回傳 None\n4. 遞迴:修剪左子樹 root.left = pruneTree(root.left)、修剪右子樹 root.right = pruneTree(root.right)\n5. 判斷若 root.val == 0 且 root.left == None 且 root.right == None → 回傳 None,否則保留節點\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def pruneTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:\n if not root:\n return None\n\n root.left = self.pruneTree(root.left)\n root.right = self.pruneTree(root.right)\n\n if root.val == 0 and not root.left and not root.right:\n return None\n\n return root\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null],"zechengze":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074243047","body":"### Time complexity\nO(max(n, log₁₀(k)))\n\n### Space complexity\nO(max(n, log₁₀(k)))\n\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n ans = []\n n = len(num)\n carry = 0\n i = n - 1\n while k > 0 or i >= 0 or carry > 0:\n sum = carry\n if k > 0:\n rem = k % 10\n sum += rem\n k //= 10\n if i >= 0:\n sum += num[i]\n i -= 1\n carry = sum // 10\n ans.insert(0, sum % 10)\n return ans","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092419843","body":"使用兩個 stack:\n- in_stack: 用來接收 push\n- out_stack: 用來處理 pop 和 peek\n- 當 out_stack 為空時,將 in_stack 的所有元素彈出並倒序放入 out_stack,用來模擬 queue 的 FIFO\n\n - push:O(1)\n - pop:O(1)\n - peek:O(1)\n - empty :O(1)\n\n---\n\n### Python code\n\n```python\nclass MyQueue:\n\n def __init__(self):\n self.in_stack = []\n self.out_stack = []\n\n def push(self, x: int) -> None:\n self.in_stack.append(x)\n\n def pop(self) -> int:\n self.peek() # 確保 out_stack 有東西\n return self.out_stack.pop()\n\n def peek(self) -> int:\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack[-1]\n\n def empty(self) -> bool:\n return not self.in_stack and not self.out_stack","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109185662","body":"### 解題思路\n- 先統計整個 linked list 長度。\n- 使用遞迴,每次選擇區間的中間當作 root。\n- 左子樹遞迴後才處理當前節點。\n\n時間 O(n) 每個節點遍歷一次\n\n```python\nclass Solution:\n def sortedListToBST(self, head: ListNode) -> TreeNode:\n def getLength(node: ListNode) -> int:\n length = 0\n while node:\n length += 1\n node = node.next\n return length\n\n def buildBST(start: int, end: int) -> TreeNode:\n nonlocal head\n if start > end:\n return None\n\n mid = (start + end) // 2\n # 先建左子樹\n left = buildBST(start, mid - 1)\n\n # 再建 root(中序)\n root = TreeNode(head.val)\n head = head.next\n\n # 最後建右子樹\n root.left = left\n root.right = buildBST(mid + 1, end)\n return root\n\n length = getLength(head)\n return buildBST(0, length - 1)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124485354","body":"### 思路\n- 遞迴 DFS\n- 如果節點為空,深度為 0。\n- 遞迴左右子樹的最大深度,取最大值後 +1。\n\n---\n\n### 遞迴 DFS(Top-down)\n\n```python\nclass Solution:\n def maxDepth(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136873834","body":"### BFS(反向遍歷)\n\n- 一般 BFS 是左先入,改為右先入左後入\n- 最後訪問的節點就是最底層最左側的節點\n- 每次 `popleft()` 拿出的節點覆蓋 `leftmost`\n- 時間複雜度 : O(n)\n---\n\n```python\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n if not root:\n return None\n \n queue = deque([root])\n leftmost = None\n\n while queue:\n leftmost = queue.popleft()\n if leftmost.right:\n queue.append(leftmost.right)\n if leftmost.left:\n queue.append(leftmost.left)\n\n return leftmost.val\n","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146260024","body":"### 解題思路:哈希表(一次遍歷)\n\n1. 初始化一個空dict h\n2. 遍歷陣列 nums,對每個元素 nums[i]:\n - 計算 plus = target - nums[i]\n - 如果 plus 的值在字典中,回傳 [h[plus], i]\n - else 將 nums[i] 存入 dict 中\n\n- 時間、空間複雜度:O(n)\n\n---\n```python\nclass Solution:\n def twoSum(self, nums: List[int], target: int) -> List[int]:\n h = {}\n for i in range(len(nums)):\n plus = target - nums[i]\n if plus in h:\n return [h[plus], i]\n else:\n h[nums[i]] = i","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148509431","body":"### 解題思路:哈希表 + 排序\n\n1. 先用 dict 統計每個元素出現的次數\n2. 使用 sorted 對 dict 依據頻率降序排序\n3. 取出前 k 個 keys 回傳\n\n- 時間複雜度:O(n log n)\n\n---\n\n```python\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n h_map = {}\n for i in nums:\n if i in h_map:\n h_map[i] += 1\n else:\n h_map[i] = 1\n\n h_map = dict(sorted(h_map.items(), key=lambda x: x[1], reverse=True))\n ans = list(h_map.keys())[:k]\n return ans\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170662667","body":"## 解題思路\n陣列已排序,相同的元素一定會相鄰,因此可以使用雙指針: \n1. 設定指標 `init` 指向下個唯一值要放置的位置,初始為 1。 \n2. 從第二個元素開始遍歷,若與前一個元素不同,則將該元素放到 `init` 位置並將 `init` 加 1。 \n3. 最後 `init` 即為去重後的長度。\n\n---\n\n## 時間複雜度\n- **O(n)**:只需遍歷一次陣列。\n\n## 空間複雜度\n- **O(1)**:在原陣列上進行操作,未使用額外空間。\n\n---\n\n## 程式碼\n```python\nfrom typing import List\n\nclass Solution:\n def removeDuplicates(self, nums: List[int]) -> int:\n init = 1\n for i in range(1, len(nums)):\n if nums[i] != nums[i - 1]:\n nums[init] = nums[i]\n init += 1\n return init\n```\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182007045","body":"### 解題思路\n1. 將 `dislikes` 轉換為 **圖的鄰接表** `dislike_table`。\n2. 使用顏色標記(`BLUE = 1`, `GREEN = -1`)來表示兩組人。\n3. 對每個尚未染色的人進行 DFS:\n - 將當前人染色為某一顏色。\n - 對於他不喜歡的人,必須染成相反顏色。\n - 如果發現相鄰節點顏色與自己相同,則表示無法二分。\n4. 如果所有人都能正確染色,則回傳 `True`。\n\n---\n\n```python\nfrom collections import defaultdict\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, N: int, dislikes: List[List[int]]) -> bool:\n BLUE, GREEN = 1, -1\n \n def draw(person_id, color):\n color_of[person_id] = color\n for the_other in dislike_table[person_id]:\n if color_of[the_other] == color:\n return False\n if not color_of[the_other] and not draw(the_other, -color):\n return False\n return True\n \n if N == 1 or not dislikes:\n return True\n \n dislike_table = defaultdict(list)\n color_of = defaultdict(int)\n \n for p1, p2 in dislikes:\n dislike_table[p1].append(p2)\n dislike_table[p2].append(p1)\n \n for person_id in range(1, N + 1):\n if not color_of[person_id] and not draw(person_id, BLUE):\n return False\n \n return True","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mr-kient":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074503694","body":"### 【Day 1】989. 数组形式的整数加法\n\n#### Main Idea\n\n1. Since the length of `num` can reach 10000, a brute-force approach of adding each digit of `num` multiplied by 10^[n-i] to form a number and then adding it to K is not feasible, as it would cause an overflow.\n\n2. We can simulate manual vertical calculation by reversing the array and starting the addition from the last digit of both `num` and `k`.\n\n3. Set a global variable `ex` to determine if a carry is needed when adding each digit.\n\n > [!NOTE]\n > Remember to check if there is a carry after adding the first digit.\n\n4. If an array index exceeds the limit, treat it as 0; if `k` is shorter than `num`, treat the remaining digits of `k` as 0.\n\n\n#### Code\n\n```cpp\nclass Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n int n = num.size();\n vector res;\n int ex = 0;\n int i = n - 1;\n\n while (i >= 0 || k > 0) {\n int x = (i >= 0) ? num[i] : 0; //k可能比num长\n int y = k % 10;\n int sum = x + y + ex;\n res.push_back(sum % 10);\n ex = sum / 10;\n k /= 10;\n i--;\n }\n\n if (ex)\n res.push_back(ex);\n\n reverse(res.begin(), res.end());\n\n return res;\n }\n};\n```\n\n#### Complexity\n\n$O(Max(num.size(), log(k)))$","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3076134448","body":"### **【Day 2】821. 字符的最短距离**\n\n#### Main idea\n\n1. Two linear traversals: The first one records the distance from each `s[i]` to the previous `c` from left to right; The second time, from right to left, update the minimum distance compared to the previous distance\n2. ⚠️ Note: During the two initializations, the first initialization should be very small because there will be no appearance of `c` after traversing to the right for a long time. If the setting is not small enough, it will result in an insufficiently large distance value, which will affect the update of the correct value from right to left in the second traversal\n\n```cpp\nclass Solution {\npublic:\n vector shortestToChar(string s, char c) {\n int n = s.size();\n vector res(n, n);\n int c_id = -n;\n\n for (int i = 0; i < n; i++) {\n\n if (s[i] == c) {\n c_id = i;\n }\n res[i] = i - c_id;\n }\n\n c_id = 2 * n;\n\n for (int j = n - 1; j >= 0; j--) {\n if (s[j] == c) {\n c_id = j;\n }\n\n res[j] = min(res[j], c_id - j);\n }\n\n return res;\n }\n};\n```\n\n#### Complexity\n\nLoop twice: $O(2*s.szie())$","onTime":true},null,null,null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124415547","body":"### 【Day 13】[104. 二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/)\n\n#### Main Idea \n\n1. 首先考虑到递归即遍历二叉树的左右子树,计算每个节点的左右子树的最大深度\n\n - **递归终止条件**:如果当前节点为空,则返回0(表示当前路径长度为0)。\n - **递归逻辑**:对于当前节点,递归计算左子树的最大深度和右子树的最大深度,取较大值并加1(当前节点本身)\n - **时间复杂度**:O(n),其中n是二叉树的节点总数。每个节点被访问一次。\n\n2. DFS\n\n ```c++\n /**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\n \n class Solution {\n public:\n int maxDepth(TreeNode* root) {\n if (!root) return 0;\n \n std::stack> s;\n s.push({root, 1});\n int max_depth = 0;\n \n while (!s.empty()) {\n auto [node, depth] = s.top();\n s.pop();\n max_depth = std::max(max_depth, depth);\n \n if (node->left) {\n s.push({node->left, depth + 1});\n }\n if (node->right) {\n s.push({node->right, depth + 1});\n }\n }\n \n return max_depth;\n }\n };\n ```\n\n \n\n#### 时间复杂度\n\n要计算二叉树的最大深度,必须访问每一个节点一次,因为最长路径可能出现在任意位置。**没有比O(n)更优的时间复杂度**,因为无论如何都需要遍历所有节点以确认最长路径。","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146453148","body":"### 【Day 19】两数之和\n\n#### Main Idea\n\n1. **暴力枚举**\n - 遍历数组中的每一个元素 `nums[i]`,再对其后续所有元素 `nums[j]`(`j > i`)进行遍历,判断 `nums[i] + nums[j] == target` 时返回 `[i, j]`。\n - **时间复杂度**:O(n²),最坏情况下需要检查所有的元素对。\n2. **哈希表(一遍扫描)**\n - 利用一个哈希表 `mp` 存储 <数值 → 下标 >的映射。\n - 遍历数组,令 `complement = target - nums[i]`:\n - 如果哈希表中已存在 `complement`,说明之前遇到过这么一个数,二者之和等于 `target`,直接返回对应的下标。\n - 否则将当前元素 `nums[i]` 及其下标 `i` 存入哈希表,继续扫描。\n - **优点**:一次遍历搞定,时间和空间都最优。\n\n```c++\n#include \n#include \nusing namespace std;\n\nclass Solution {\npublic:\n vector twoSum(vector& nums, int target) {\n unordered_map mp; // 存储 已访问的数值 → 下标\n for (int i = 0; i < nums.size(); ++i) {\n int complement = target - nums[i];\n // 如果哈希表中已有 complement,则直接返回答案\n if (mp.find(complement) != mp.end()) {\n return { mp[complement], i };\n }\n // 否则将当前数及下标存入\n mp[nums[i]] = i;\n }\n return {}; // 根据题意不会走到这里\n }\n};\n```\n\n#### 时间复杂度\n\n- **哈希表解法**:O(n),只需一次遍历即可完成查找与存储操作。\n- **空间复杂度**:O(n),最坏情况下哈希表需存储 n 个元素。","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168242525","body":"Main Idea\n\n1. 快慢指针法\n\n设置两个指针 slow 和 fast,初始都指向链表头结点。\n\nfast 每次向前移动 两步,slow 每次向前移动 一步。\n\n当 fast 到达链表末尾时,slow 恰好位于链表的中间位置。\n\n由于题目要求 当有两个中间结点时返回第二个,快慢指针法天然满足这一条件:当链表长度为偶数时,fast 会先到 NULL,此时 slow 指向的就是第二个中间结点。\n\n\n\n2. 时间复杂度\n\nO(n):每个结点最多被访问一次(快指针访问 n/2 次,慢指针访问 n 次)。\n\n\n\n3. 空间复杂度\n\nO(1):只使用了两个额外指针,不需要额外的数据结构。\n\n\n\n\n\n---\n\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode() : val(0), next(nullptr) {}\n * ListNode(int x) : val(x), next(nullptr) {}\n * ListNode(int x, ListNode *next) : val(x), next(next) {}\n * };\n */\nclass Solution {\npublic:\n ListNode* middleNode(ListNode* head) {\n ListNode* slow = head;\n ListNode* fast = head;\n while (fast != nullptr && fast->next != nullptr) {\n slow = slow->next; // 慢指针走一步\n fast = fast->next->next; // 快指针走两步\n }\n return slow; // slow 即为中间结点\n }\n};\n\n\n---\n\n时间复杂度分析\n\n访问链表的所有节点至少需要一次遍历,因此 没有比 O(n) 更优的时间复杂度。\n\n快慢指针法通过一次遍历同时得到中间节点,避免了额外的存储或两次遍历,比先统计长度再走一半更高效。\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3188424726","body":"#### Main Idea\n\n1. **把未分组项目“补组”**:对 `group[i] == -1` 的项目,给它们分配新的组号(从 `m` 开始递增),这样每个项目都有归属组,最终组的总数记为 `G`。\n2. **两层拓扑排序(Group 拓扑 + Item 拓扑)**:\n\n * **项目层图**:对每条依赖 `u ∈ beforeItems[v]`,连边 `u → v`,统计项目入度。\n * **组层图**:若 `group[u] != group[v]`,再在组图里连边 `group[u] → group[v]`,统计组入度。\n * **先对项目图做一次拓扑排序(得到全局项目顺序)**,再对组图做一次拓扑排序(得到组顺序)。\n3. **按组拼接**:将“项目拓扑序”按照其组别分桶(保持项目拓扑中的相对顺序),再按“组拓扑序”依次把每个桶拼接起来即为答案。\n4. **不可行判定**:任一拓扑排序失败(存在环)则返回空数组。\n\n* **关键点**:跨组依赖只影响组与组的先后关系(由组图保证),组内项目的详细先后由项目图保证。用“两层图”可同时满足“组块相邻”和“依赖有序”。\n\n---\n\n2. **实现**\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n vector sortItems(int n, int m, vector& group, vector>& beforeItems) {\n // 1) 给未分组的项目分配新组号\n int gid = m;\n for (int i = 0; i < n; ++i) {\n if (group[i] == -1) group[i] = gid++;\n }\n int G = gid; // 组总数\n\n // 2) 建立项目图 & 组图\n vector> itemAdj(n), groupAdj(G);\n vector itemIn(n, 0), groupIn(G, 0);\n\n for (int v = 0; v < n; ++v) {\n for (int u : beforeItems[v]) {\n itemAdj[u].push_back(v);\n itemIn[v]++;\n if (group[u] != group[v]) {\n groupAdj[group[u]].push_back(group[v]);\n groupIn[group[v]]++;\n }\n }\n }\n\n // 通用 Kahn 拓扑\n auto topo = [](const vector>& adj, vector indeg) -> vector {\n int N = (int)adj.size();\n queue q;\n for (int i = 0; i < N; ++i) if (indeg[i] == 0) q.push(i);\n vector order;\n order.reserve(N);\n while (!q.empty()) {\n int x = q.front(); q.pop();\n order.push_back(x);\n for (int y : adj[x]) {\n if (--indeg[y] == 0) q.push(y);\n }\n }\n if ((int)order.size() != N) return {}; // 有环\n return order;\n };\n\n // 3) 分别对 项目图、组图 做拓扑排序\n vector itemOrder = topo(itemAdj, itemIn);\n if (itemOrder.empty()) return {};\n vector groupOrder = topo(groupAdj, groupIn);\n if (groupOrder.empty()) return {};\n\n // 4) 按项目拓扑序分桶到各组里,保持项目相对次序\n vector> bucket(G);\n for (int x : itemOrder) bucket[group[x]].push_back(x);\n\n // 5) 按组拓扑序拼接\n vector ans;\n ans.reserve(n);\n for (int g : groupOrder) {\n for (int x : bucket[g]) ans.push_back(x);\n }\n return ans;\n }\n};\n```\n\n#### 时间复杂度\n\n* 建图与两次拓扑排序总计 **O(n + E)**,其中 `E = Σ |beforeItems[i]|`。\n* 额外空间用于邻接表、入度数组与分桶,均为 **O(n + E + G)**。\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3205439203","body":"#### Main Idea\n\n1. **线性扫描 (超时)**\n - 从 0 开始向上遍历整数 `i`。\n - 检查 `i * i` 的值。当第一次出现 `i * i > x` 时,那么 `i-1` 就是我们要求的平方根的整数部分。\n - **注意**:`i * i` 的计算可能会导致整数溢出。为避免此问题,应将判断条件改为 `i > x / i`。\n - **缺点**:当 `x` 非常大时,循环次数过多,会导致执行超时,无法通过所有测试用例。\n\n2. **二分查找**\n - `x` 的平方根一定在 `[0, x]` 这个区间内。\n - 我们可以将问题转化为:**在一个有序的范围内(`0` 到 `x`),寻找最大的整数 `k`,使得 `k² <= x`**。\n - 这正是二分查找的经典应用场景。设置搜索区间的左右边界 `left` 和 `right`,计算中间值 `mid`:\n - 如果 `mid² <= x`,说明 `mid` 是一个可能的解,但我们还想尝试更大的值,因此记录当前解,并在右半部分继续搜索:`ans = mid`, `left = mid + 1`。\n - 如果 `mid² > x`,说明 `mid` 太大了,解一定在左半部分,因此缩小搜索范围:`right = mid - 1`。\n - **优点**:每次都将搜索范围减半,时间复杂度低,效率极高。\n\n```c++\nclass Solution {\npublic:\n int mySqrt(int x) {\n if (x == 0) {\n return 0;\n }\n\n int left = 1, right = x;\n int ans = 0;\n\n while (left <= right) {\n int mid = left + (right - left) / 2;\n\n // 为防止 mid * mid 溢出,使用除法来判断\n // mid <= x / mid 等价于 mid * mid <= x\n if (mid <= x / mid) {\n ans = mid; // mid 是一个可能的解\n left = mid + 1; // 尝试在右侧寻找更大的解\n } else {\n right = mid - 1; // mid 太大,到左侧去寻找\n }\n }\n return ans;\n }\n};\n```\n\n#### 时间复杂度\n\n- **二分查找解法**:O(log n),其中 n 为输入值 `x`。二分查找每次都将搜索空间减半,因此时间复杂度是对数级别的。\n- **空间复杂度**:O(1),解法只使用了常数个额外变量,与输入 `x` 的大小无关。","onTime":true},null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3237241808","body":"#### Main Idea\n\n1. 滑动窗口 + 计数\n\n - 用两个计数器统计字符需求:`need[c]` 表示目标串 `t` 中每个字符需要的数量,`have[c]` 表示当前窗口中已有的数量。\n - 扩张右端:右指针 `r` 逐步右移,把字符加入窗口,并在 `have[c]` 达到 `need[c]` 时,更新已满足的种类数 `formed`。\n - 收缩左端:当窗口已满足 `t` 的全部字符需求(`formed == required`,其中 `required` 为 `t` 中不同字符的个数)时,尽量左移 `l` 缩小窗口并更新最优答案。\n - 唯一性:题目保证若存在答案则唯一,我们只需在收缩时维护最短长度即可。\n\n ```cpp\n #include \n using namespace std;\n \n class Solution {\n public:\n string minWindow(string s, string t) {\n if (t.empty() || s.size() < t.size()) return \"\";\n \n // 统计目标需求\n vector need(128, 0), have(128, 0);\n int required = 0; // 需要满足的不同字符的种类数\n for (char c : t) {\n if (need[c] == 0) required++;\n need[c]++;\n }\n \n int formed = 0; // 当前窗口中已满足 need 的种类数\n int bestLen = INT_MAX, bestL = 0;\n int l = 0;\n \n for (int r = 0; r < (int)s.size(); ++r) {\n char cr = s[r];\n have[cr]++;\n \n // 当某字符数量刚好达到需求,更新 formed\n if (need[cr] > 0 && have[cr] == need[cr]) {\n formed++;\n }\n \n // 若已满足所有字符需求,尽量收缩左端\n while (formed == required) {\n if (r - l + 1 < bestLen) {\n bestLen = r - l + 1;\n bestL = l;\n }\n char cl = s[l];\n have[cl]--;\n // 收缩导致某字符不足,formed 减一\n if (need[cl] > 0 && have[cl] < need[cl]) {\n formed--;\n }\n l++;\n }\n }\n \n return bestLen == INT_MAX ? \"\" : s.substr(bestL, bestLen);\n }\n };\n ```\n\n#### 时间复杂度\n\n双指针各自只右移且不回退,整体 **O(m + n)**;计数数组为常数空间。","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240735616","body":"#### Main Idea\n\n1. **逐行放置**\n - 每一行选择一个不与已放皇后冲突的列。冲突规则:同列、主对角线(r−c)、次对角线(r+c)。\n - **递归终止**:当行号 `row == n`,说明已成功放置 n 个皇后,计数 +1。\n - **选择与撤销**:在当前行尝试所有合法列,递归下一行,回退继续尝试。\n2. **位运算优化**\n - 用 n 位二进制位掩码表示列与对角线占用:\n - `cols`:哪些列被占。\n - `diag1`:主对角线占用(相当于下一行左移一位)。\n - `diag2`:次对角线占用(相当于下一行右移一位)。\n - 可放置位置:`bits = ~(cols | diag1 | diag2) & mask`,其中 `mask = (1<> 1`。\n\n#### 回溯 + 位运算\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int totalNQueens(int n) {\n int mask = (1 << n) - 1;\n return dfs(0, 0, 0, 0, mask, n);\n }\n\nprivate:\n // row: 当前行号;cols/diag1/diag2:占用掩码;mask:仅保留 n 位\n int dfs(int row, int cols, int diag1, int diag2, int mask, int n) {\n if (row == n) return 1;\n\n int count = 0;\n int bits = (~(cols | diag1 | diag2)) & mask; // 当前行可放置的位置集合\n\n while (bits) {\n int p = bits & -bits; // 取最低位可行位置\n bits -= p; // 移除该位置\n\n count += dfs(row + 1,\n cols | p,\n ((diag1 | p) << 1) & mask, // 主对角线左移并截断\n (diag2 | p) >> 1, // 次对角线右移\n mask, n);\n }\n return count;\n }\n};\n```\n\n#### 时间复杂度\n\n- **时间**:回溯搜索的上界接近 **O(n!)**,但位运算将冲突判断降为 O(1) 常数,n ≤ 9 时非常快。\n- **空间**:**O(n)**(递归深度 n,掩码为常数额外空间)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247569627","body":"#### Main Idea\n\n1. BFS(从所有陆地同时出发)\n\n * 把所有值为 `1` 的格子(陆地)一起入队,距离视作 0;像海浪一样一圈圈向外扩散。\n * 第一次被扩散到的海洋格子的距离,就是它到最近陆地的最短曼哈顿距离。\n * 最后被访问到的海洋格子的距离即为答案。\n * **边界**:若全为陆地或全为海洋,返回 `-1`。\n\n2. 实现\n\n ```cpp\n #include \n using namespace std;\n\n class Solution {\n public:\n int maxDistance(vector>& grid) {\n int n = grid.size();\n queue> q;\n vector> dist(n, vector(n, -1));\n\n // 把所有陆地入队,距离置 0\n for (int i = 0; i < n; ++i) {\n for (int j = 0; j < n; ++j) {\n if (grid[i][j] == 1) {\n q.push({i, j});\n dist[i][j] = 0;\n }\n }\n }\n\n // 若全海或全陆,直接返回 -1\n if (q.empty() || (int)q.size() == n * n) return -1;\n\n int ans = -1;\n int dirs[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};\n\n // 多源 BFS\n while (!q.empty()) {\n auto [x, y] = q.front(); q.pop();\n for (auto& d : dirs) {\n int nx = x + d[0], ny = y + d[1];\n if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue;\n if (dist[nx][ny] != -1) continue; // 访问过\n dist[nx][ny] = dist[x][y] + 1; // 最近陆地距离\n ans = max(ans, dist[nx][ny]);\n q.push({nx, ny});\n }\n }\n return ans;\n }\n };\n ```\n\n#### 时间复杂度\n\n* 时间:每个格子最多入队一次,四邻检查常数次,整体 **O(N²)**。\n\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263627488","body":"#### Main Idea\n\n1. **线性决策(相邻不能同抢)**\n\n * 到第 `i` 间房时只有两种选择:\n\n * **不抢它**:收益等于前一间的最佳收益 `dp[i-1]`\n * **抢它**:收益等于“到 i-2 的最佳收益 + 本屋金额” → `dp[i-2] + nums[i]`\n * 所以转移式:`dp[i] = max(dp[i-1], dp[i-2] + nums[i])`\n2. **初值与边界**\n\n * 空数组 → 答案 `0`\n * `dp[0] = nums[0]`\n * `dp[1] = max(nums[0], nums[1])`(如果存在)\n3. **滚动变量优化空间**\n\n * 只依赖 `i-1` 和 `i-2`,用两个变量就够了:\n\n * `prev2` 表示 `dp[i-2]`,`prev1` 表示 `dp[i-1]`\n * 新值 `cur = max(prev1, prev2 + nums[i])`,随后前移指针\n\n#### 动态规划(滚动变量,O(1) 空间)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int rob(vector& nums) {\n if (nums.empty()) return 0;\n int n = nums.size();\n if (n == 1) return nums[0];\n\n int prev2 = 0; // dp[i-2]\n int prev1 = 0; // dp[i-1]\n for (int x : nums) {\n int cur = max(prev1, prev2 + x);\n prev2 = prev1;\n prev1 = cur;\n }\n return prev1;\n }\n};\n```\n\n#### 时间复杂度\n\n* **时间**:`O(n)`(单次线性扫描)\n* **空间**:`O(1)`(滚动变量),如需恢复路径则 `O(n)` 用于记录选择","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3284142988","body":"#### Main idea\n\n**把局面想成“还差多少 + 已用过哪些数”**\n\n- 每次你从公共池里挑一个数,目标值就相应减少;被挑过的数以后都不能再用。\n- 于是每一步其实就是在“还差的分数”和“哪些数已被拿走”的组合之间转换。\n\n**当前能赢的充要条件**\n\n- 如果你现在能直接拿到一个数,使得**累计和立刻达到/超过目标**,你马上赢。\n- 否则,你希望找到一个数字,让对手接下来面对的局面是**必输局**。\n 换句话说:**存在**一个选择能把对手“送进死局”,那你这一步就是必赢;\n 如果**所有**选择都会把对手“送进稳赢局”,那你这一步就是必输。\n\n**两条简单但很有用的剪枝**\n\n- **总和不够就别想了**:如果 1 到 `maxChoosableInteger` 的总和都达不到目标,先手必输。\n- **目标非正直接赢**:如果目标本来就 ≤ 0(或被前人操作减到 ≤ 0),先手已满足条件,直接判赢。\n\n**记住算过的局面,别重复思考(记忆化)**\n\n- 同一组“已用过的数字 + 还差多少”的局面,赢或输的结论是固定的。\n- 把每个局面的输赢结果记下来,后面再遇到就直接用,避免在相同分支上反复推演。\n\n**直觉理解(以示例 1 为例)**\n\n- `max=10, 目标=11`:无论先手先拿哪个数 `x`,后手都能立刻拿到 `11-x`(且该数仍在 1..10 且未被用),直接结束游戏。\n- 所以先手无解——这就是“把对手送进稳赢局”在反方向上的体现。\n\n#### Implementation(cpp)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n bool canIWin(int maxChoosableInteger, int desiredTotal) {\n if (desiredTotal <= 0) return true;\n\n int n = maxChoosableInteger;\n int sum = n * (n + 1) / 2;\n if (sum < desiredTotal) return false; // 全拿都不够,必输\n\n // 2^n 状态;-1=未知,0=必败,1=必胜\n vector memo(1 << n, -1);\n return dfs(0, desiredTotal, n, memo);\n }\n\nprivate:\n // mask: 已用集合(第 i 位表示数字 i+1 是否已用)\n // remain: 距离目标还差多少\n bool dfs(int mask, int remain, int n, vector& memo) {\n char &res = memo[mask];\n if (res != -1) return res;\n\n // 枚举当前可选的每个数 i\n for (int i = 1; i <= n; ++i) {\n int bit = 1 << (i - 1);\n if (mask & bit) continue; // 已用,跳过\n if (i >= remain) return res = 1; // 直接到达/超过目标,当前玩家赢\n // 若选 i 之后对手必败,则当前必胜\n if (!dfs(mask | bit, remain - i, n, memo)) return res = 1;\n }\n return res = 0; // 所有选择都会让对手必胜 => 当前必败\n }\n};\n\n```\n\n#### 复杂度\n\nO(n · 2^n)","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3306753472","body":"#### Main Idea\n\n1. **把“最少删除”转化为“最多保留”**\n\n * 经典区间调度:**按右端点升序**排序,**尽可能先选结束早的区间**,就能在不重叠前提下**保留最多**的区间。\n * 需要移除的最小数量 = `总数 n - 能保留的最大不重叠数量 keep`。\n\n2. **为什么按右端点排是最优的**\n\n * 选更早结束的区间,给后面的区间留下**更多起始空间**,不比选结束晚的更差。\n * 可用“**交换论证**”:若最优解里某一步没有选最早结束者,换成结束更早的,不减少可选余地,解仍最优。\n\n3. **边界与定义(开闭性)**\n\n * 本题规定:端点相同只**接触不重叠**(`[1,2]` 与 `[2,3]` 可共存),因此判断不重叠条件是 `start >= lastEnd`。\n * 允许负数坐标;`1 <= n <= 1e5`,需 `O(n log n)` 排序 + `O(n)` 一次扫描。\n\n---\n\n#### 贪心(按右端点排序)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int eraseOverlapIntervals(vector>& intervals) {\n if (intervals.empty()) return 0;\n\n // 1) 按 end 升序排\n sort(intervals.begin(), intervals.end(),\n [](const vector& a, const vector& b){\n if (a[1] != b[1]) return a[1] < b[1];\n return a[0] < b[0];\n });\n\n // 2) 贪心选择:尽量保留更多不重叠区间\n int keep = 0;\n int lastEnd = INT_MIN; // 当前已选集合的最后一个区间的 end\n for (auto &it : intervals) {\n int s = it[0], e = it[1];\n if (s >= lastEnd) { // 与上一个选择不重叠(端点相接也可)\n ++keep;\n lastEnd = e;\n }\n }\n return (int)intervals.size() - keep; // 最少删除 = 总数 - 最多保留\n }\n};\n```\n\n---\n\n#### 等价实现(按左端点排序的“原地计数删谁”)\n\n* 也可以**按起点升序**,一遍扫描:\n\n * 若当前 `s < prevEnd` 发生**重叠** ⇒ 必须删一个;\n * **删谁?** 删右端点更大的那个(保留 `end` 更小者),将 `prevEnd = min(prevEnd, e)`。\n * 计数 `remove++`。\n* 与前法等价,常用于不想单独计“keep”的写法。\n\n```cpp\nint eraseOverlapIntervals(vector>& intervals) {\n if (intervals.empty()) return 0;\n sort(intervals.begin(), intervals.end()); // 默认按 start,再按 end\n\n int remove = 0;\n int prevEnd = intervals[0][1];\n for (int i = 1; i < (int)intervals.size(); ++i) {\n int s = intervals[i][0], e = intervals[i][1];\n if (s < prevEnd) { // 重叠了,需要删一个\n ++remove;\n prevEnd = min(prevEnd, e); // 删 end 较大的那个,保留更早结束\n } else {\n prevEnd = e; // 不重叠,正常推进\n }\n }\n return remove;\n}\n```\n\n#### 复杂度\n\n* 排序 `O(n log n)`,单扫 `O(n)`;总 `O(n log n)`。\n* 额外空间 `O(1)`(除了排序)。\n\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3332731592","body":"#### Main Idea\n\n1. **字母映射到孩子指针(26 叉树)**\n\n * 每个结点保存 `children[26]` 与 `isEnd`。\n * `insert(word)`:从根逐字符走,若孩子不存在就新建;末结点标记 `isEnd = true`。\n * `search(word)`:逐字符走,若中途缺结点则 `false`;走完返回末结点 `isEnd`。\n * `startsWith(prefix)`:逐字符走,若中途缺结点则 `false`;都能走到则 `true`(无需 `isEnd`)。\n\n2. **正确性与边界**\n\n * 仅小写字母 → 直接用 `idx = c - 'a'`。\n * `search` 必须要求完整单词结束处 `isEnd == true`,否则只是前缀命中。\n * 空间按需分配:只有路径上用到的结点才创建。\n\n\n---\n\n#### 实现(C++,指针版)\n\n```cpp\n#include \nusing namespace std;\n\nstruct TrieNode {\n bool isEnd = false;\n TrieNode* ch[26];\n TrieNode() : isEnd(false) {\n memset(ch, 0, sizeof(ch));\n }\n};\n\nclass Trie {\npublic:\n Trie() { root = new TrieNode(); }\n\n // 插入单词\n void insert(const string& word) {\n TrieNode* p = root;\n for (char c : word) {\n int idx = c - 'a';\n if (!p->ch[idx]) p->ch[idx] = new TrieNode();\n p = p->ch[idx];\n }\n p->isEnd = true;\n }\n\n // 完整匹配\n bool search(const string& word) {\n TrieNode* p = walk(word);\n return p && p->isEnd;\n }\n\n // 前缀匹配\n bool startsWith(const string& prefix) {\n return walk(prefix) != nullptr;\n }\n\nprivate:\n TrieNode* root;\n\n // 沿字符串行走,走不到返回空\n TrieNode* walk(const string& s) {\n TrieNode* p = root;\n for (char c : s) {\n int idx = c - 'a';\n if (!p->ch[idx]) return nullptr;\n p = p->ch[idx];\n }\n return p;\n }\n};\n```\n#### 复杂度\n\n * 设字符串长度为 `L`:\n\n * `insert / search / startsWith` 都是 **O(L)**。\n * 空间:创建的结点数 ≤ 所有插入字符串长度之和。\n\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3357108848","body":"#### Main idea\n\n**后序递归 + 就地剪枝**\n\n* “要保留的节点”必须满足:自己是 1,或者**子树里至少有一个 1**。\n* 等价地说:当一个节点值为 0,且**左右子树都被剪成空**,这个节点也应被删除。\n* 因此用**后序遍历**:先递归处理左右子树,把不含 1 的子树返回成 `nullptr`;回来后再判断当前节点是否也应被删。\n\n**判定规则(在回溯处)**\n\n* `root->left = prune(left)`,`root->right = prune(right)`;\n* 若 `root->val==0 && root->left==nullptr && root->right==nullptr` → 返回 `nullptr`(整棵以 root 为根的子树都不含 1)。\n* 否则返回 `root`。\n\n这保证了每个节点只访问一次,且删除顺序从叶到根,不会误留“全 0 链”。\n\n#### Implementation(cpp)\n\n```cpp\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\n\nclass Solution {\npublic:\n TreeNode* pruneTree(TreeNode* root) {\n if (!root) return nullptr;\n\n root->left = pruneTree(root->left);\n root->right = pruneTree(root->right);\n\n // 若当前为0且左右都为空 => 该节点所在子树不含1,剪掉\n if (root->val == 0 && !root->left && !root->right) {\n return nullptr;\n }\n return root;\n }\n};\n```\n\n#### 复杂度\n\n* 时间:`O(n)`,每个节点访问一次。\n* 空间:`O(h)`,递归栈深度(`h` 为树高,最坏 `O(n)`,平均 `O(log n)`)。","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null],"leohongyi":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3076771871","body":"【Day 1】989. 数组形式的整数加法\nmain idea 从最低位开始加,如果还有进位,将其添加到结果前面 使用逆序遍历 range(len(num) - 1, -1, -1) 从数组的最后一个元素(最低位)开始\ndivmod(num[i] + k, 10) 计算当前位置的数字与 k 相加后的结果,返回商和余数 如果处理完数组中所有位后仍有进位(k > 0)\n从 k 中提取最低位数字,并插入到数组最前面\n继续处理 k 的下一位,直到 k 变为 0\n余数 num[i] 保存在当前位置\n商 k 作为进位传递给下一个更高位\n整体时间复杂度为 O(max(n, log k))。\ncode\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n for i in range(len(num) - 1, -1, -1):\n k, num[i] = divmod(num[i] + k, 10)\n \n while k > 0:\n k, digit = divmod(k, 10)\n num.insert(0, digit)\n return num\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077014132","body":"main idea:\n创建 ret 数组,长度为len(s)\n再次遍历s的过程中,我们需要判断当满足以下两点条件时,指针 p 右移一位\np小于arr最大下标\n前下标i 到 p + 1的绝对距离比到 p 的绝对距离小\n每次将 p - i 的绝对距离添加至 ret[i] 中\n\n def shortestToChar(self, s: str, c: str) -> List[int]:\n ret, p, arr = [], 0, [i for i in range(len(s)) if s[i] == c]\n for i, j in enumerate(s):\n if p < len(arr) - 1 and abs(arr[p] - i) > abs(arr[p + 1] - i):\n p += 1\n ret.append(abs(arr[p] - i))\n return ret\nTime Complexity: O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082831029","body":"使用数组的栈结构,self.top作为栈顶指针\n进出栈分别通过简单的数组赋值与读取进行操作\nincrement函数通过一个循环进行赋值操作\nclass CustomStack:\n\n def __init__(self, maxSize: int):\n self.stack = [0]*maxSize\n self.top = -1\n\n def push(self, x: int) -> None:\n if self.top < len(self.stack) - 1:\n self.top += 1\n self.stack[self.top] = x\n\n def pop(self) -> int:\n if self.top is -1:\n return self.top\n else:\n self.top -= 1\n return self.stack[self.top+1]\n \n\n def increment(self, k: int, val: int) -> None:\n for i in range(min(k, self.top + 1)):\n self.stack[i] += val\n\n\n\nTime complexity: O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3092615113","body":"算法步骤:\n利用current string, current number 记录所有不同的括号层级内的string和num;\n使用stk来记录之前的数字和前置str;推荐先push num, 后push str 至 stack;\nO(n)\n代码:\nclass Solution:\n def decodeString(self, s: str) -> str:\n cur_str, cur_num = \"\", \"\"\n stk = []\n for c in s:\n if c.isdigit():\n cur_num += c\n elif c == '[':\n stk.append(cur_str)\n stk.append(cur_num)\n cur_str, cur_num = \"\", \"\"\n elif c == ']':\n cur_str *= int(stk.pop())\n cur_str = stk.pop() + cur_str\n else:\n cur_str += c\n return cur_str\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092624509","body":"算法设计\n加入队尾 push() : 将数字 val 加入栈 A 即可。\n获取队首元素 peek() :\n当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。\n否则,当 A 为空: 即两个栈都为空,无元素,因此返回 -1 。\n否则: 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。\n弹出队首元素 pop() :\n执行 peek() ,获取队首元素。\n弹出 B 的栈顶元素。\n队列判空 empty() : 当栈 A 和 B 都为空时,队列为空。\n\nclass MyQueue:\n\n def __init__(self):\n self.A, self.B = [], []\n\n def push(self, x: int) -> None:\n self.A.append(x)\n\n def pop(self) -> int:\n peek = self.peek()\n self.B.pop()\n return peek\n\n def peek(self) -> int:\n if self.B: return self.B[-1]\n if not self.A: return -1\n # 将栈 A 的元素依次移动至栈 B\n while self.A:\n self.B.append(self.A.pop())\n return self.B[-1]\n def empty(self) -> bool:\n return not self.A and not self.B\n\n\n# Your MyQueue object will be instantiated and called as such:\n# obj = MyQueue()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.peek()\n# param_4 = obj.empty()\n时间复杂度: push(), empty() 函数的时间复杂度为 O(1) ;peek() , pop() 函数在 N 次队首元素删除操作中总共需完成 N 个元素的倒序,均摊时间复杂度为 O(1) 。\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3105379844","body":"main: 如果当前元素大于或者等于maxx,入栈, 更新最大值maxx\n如果当前元素小于栈顶元素,循环弹出栈顶元素,直到当前元素大于或等于栈顶元素,注意不用将当前元素入栈!!不过要再将maxx压入栈,因为刚刚pop时肯定把maxx弹出栈了\n\n。class Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n maxx, stk = arr[0], [arr[0]]\n for i in range(1, len(arr)):\n if arr[i] >= maxx:\n maxx = arr[i]\n stk.append(arr[i])\n else:\n while stk and stk[-1] > arr[i]:\n stk.pop()\n stk.append(maxx)\n return len(stk)\n 时间复杂度O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3111913253","body":"找到尾结点 形成环形链表\n尾结点移动length - k 步 有移动k步 == 左移length - k 步\n找到头结点 断开头尾链接\n\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:\n if not head or not head.next:\n return head\n tail = head\n length = 1\n while tail.next:\n length += 1\n tail = tail.next\n tail.next = head\n\n k = k % length\n for _ in range(length - k):\n tail = tail.next\n \n head = tail.next\n tail.next = None\n return head\n ","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3111983736","body":"先交换以node3为头结点的链表 \nnode1指向地柜返回的链表头\n把node2指向node1\n返回node2 作为交换完成的链表头结点\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if head is None or head.next is None:\n return head\n node1 = head\n node2 = head.next\n node3 = node2.next\n\n node1.next = self.swapPairs(node3)\n node2.next = node1\n\n return node2\n ","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dmax1314":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3082278662","body":"1. 第一个想法是数组转换数字然后相加再转换回去\n时间和空间复杂度都应该是O(n)\n```python\nfrom typing import List\n\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n # 1. 数组 -> 字符串 -> 数字\n # 首先将列表中的每个数字转换为字符串,然后拼接成一个完整的字符串\n # [1, 2, 0, 0] -> [\"1\", \"2\", \"0\", \"0\"] -> \"1200\"\n s = \"\".join(map(str, num))\n \n num_val = int(s)\n \n # 2. 数字相加\n result_val = num_val + k\n \n # 3. 数字 -> 字符串 -> 数组\n # 将结果数字转换回字符串\n # 1234 -> \"1234\"\n result_s = str(result_val)\n \n # 将结果字符串中的每个字符转换回整数,并放入列表中\n # \"1234\" -> [\"1\", \"2\", \"3\", \"4\"] -> [1, 2, 3, 4]\n result_array = [int(digit) for digit in result_s]\n \n return result_array\n```\n但是似乎换其他的语言会溢出\n2. 第二个想法就是模拟加法操作,从个位数加起,关键问题在于处理进位\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n result = []\n carry = 0\n i = len(num) - 1 # 指向 num 的最后一位\n \n while i >= 0 or k > 0 or carry > 0:\n digit = carry # 初始化为进位\n \n if i >= 0: # 如果 num 中还有数字\n digit += num[i]\n i -= 1\n \n if k > 0: # 如果 k 中还有数字\n digit += k % 10\n k //= 10 # 整个 k 除以 10\n \n # 处理进位\n result.append(digit % 10)\n carry = digit // 10\n \n result.reverse() # 因为是从个位到十位添加的,最后需要反转\n return result # 返回结果\n```\n这里是要反转的 我一开始忘了这个事情,因为数组把个位的和放在了第一位和实际数字反过来了\n时间复杂度: O(max(N, M)),其中 N 是 num 的长度,M 是 k 的数字长度。我们需要遍历这两个数的每一位。\n空间复杂度: O(max(N, M)),用于存储结果数组。\n\n---\n在看lc题解的时候发现一个很有趣的模板可能以后会用到\n ```\nwhile ( A 没完 || B 没完)\n A 的当前位\n B 的当前位\n\n 和 = A 的当前位 + B 的当前位 + 进位carry\n\n 当前位 = 和 % 10;\n 进位 = 和 / 10;\n\n判断还有进位吗\n```\n>作者:lilyunoke\n>链接:https://leetcode.cn/problems/add-to-array-form-of-integer/solutions/570659/989-ji-zhu-zhe-ge-jia-fa-mo-ban-miao-sha-8y9r/\n>来源:力扣(LeetCode)\n>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n\n稍微改了一下得到一个python加法模板,\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n n = len(num)\n res = []\n i = n - 1\n s = 0\n carry = 0\n while i >= 0 or k != 0:\n x = num[i] if i >= 0 else 0\n y = k % 10 if k != 0 else 0\n\n s = x + y + carry\n carry = s // 10\n k //= 10\n\n i -= 1\n res.insert(0, s % 10)\n\n if carry != 0:\n res.insert(0, carry)\n return res\n```\n据说这个模板还可以用到[2](https://leetcode.com/problems/add-two-numbers/description/),[165](https://leetcode.com/problems/compare-version-numbers/)和[809](https://leetcode.com/problems/expressive-words/)这周末抽空可以做一下","onTime":false},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3086540520","body":"# 第四天\n构造栈结构,利用先入后出的特性来实现括号匹配\n大概做法就是\n1. 使用栈来存放数字、字符以及中间结果。\n2. 遇到数字时,解析出完整的k值(可能是多位数)。\n3. 遇到开括号 `[` 时,将当前构建的字符串入栈,重置字符串。\n4. 遇到闭括号 `]` 时,出栈,形成一个新的字符串并重复生成。\n5. 最终合并所有字符串返回结果。\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n stack = [] # 初始化栈\n current_num = 0 # 当前数字\n current_str = '' # 当前构建的字符串\n\n for char in s:\n if char.isdigit(): # 如果是数字\n current_num = current_num * 10 + int(char) # 处理多位数\n elif char == '[': # 遇到左括号\n stack.append(current_str) # 存储当前字符串\n stack.append(current_num) # 存储当前数字\n current_str = '' # 重置字符串\n current_num = 0 # 重置数字\n elif char == ']': # 遇到右括号\n num = stack.pop() # 弹出数字\n prev_str = stack.pop() # 弹出前一个字符串\n current_str = prev_str + current_str * num # 生成新的字符串\n else:\n current_str += char # 累加字符\n\n return current_str # 返回解码后的字符串\n```\n时间复杂度是 O(n),其中 n 是字符串 s 的长度。每个字符都被处理一次。\n空间复杂度是 O(n),在最坏情况下,栈可能会存储所有字符和数字。\n\n---\n读了题解发现还存在递归法,也就是用[]来决定递归的开头和结束\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n def dfs(s,i):\n res,multi='',0\n while i str:\n def dfs(s, i):\n res, multi = \"\", 0\n while i < len(s):\n if '0' <= s[i] <= '9':\n multi = multi * 10 + int(s[i])\n elif s[i] == '[':\n i, tmp = dfs(s, i + 1)\n res += multi * tmp\n multi = 0\n elif s[i] == ']':\n return i, res\n else:\n res += s[i]\n i += 1\n return res\n return dfs(s,0)\n```\n时间复杂度是 O(n),其中 n 是字符串 s 的长度。每个字符都被处理一次。\n空间复杂度是 O(n),在最坏情况下,递归调用栈可能会存储所有字符和数字。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091499578","body":"用两个模拟栈的队列来实现栈的基本操作。一个用于添加尾部元素,另一个用于弹出头部元素。即一个近栈stack in和一个出栈stack out。\n```python\nclass MyQueue:\n\n def __init__(self):\n \"\"\"\n in主要负责push,out主要负责pop\n \"\"\"\n self.stack_in = []\n self.stack_out = []\n\n\n def push(self, x: int) -> None:\n \"\"\"\n 有新元素进来,就往in里面push\n \"\"\"\n self.stack_in.append(x)\n\n\n def pop(self) -> int:\n \"\"\"\n Removes the element from in front of queue and returns that element.\n \"\"\"\n if self.empty():\n return None\n \n if self.stack_out:\n return self.stack_out.pop()\n else:\n for i in range(len(self.stack_in)):\n self.stack_out.append(self.stack_in.pop())\n return self.stack_out.pop()\n\n\n def peek(self) -> int:\n \"\"\"\n Get the front element.\n \"\"\"\n ans = self.pop()\n self.stack_out.append(ans)\n return ans\n\n\n def empty(self) -> bool:\n \"\"\"\n 只要in或者out有元素,说明队列不为空\n \"\"\"\n return not (self.stack_in or self.stack_out)\n```\n时间复杂度:\n- `push` 操作的时间复杂度是 O(1),因为我们只是将元素添加到 `stack_in` 的末尾。\n- `pop` 和 `peek` 操作的平均时间复杂度是 O(1),但在最坏情况下(当 `stack_out` 为空时),需要将 `stack_in` 中的所有元素转移到 `stack_out`,这需要 O(n) 的时间,其中 n 是 `stack_in` 中的元素数量。然而,这种情况不会频繁发生,因此平均时间复杂度仍然是 O(1)。\n- `empty` 操作的时间复杂度是 O(1),因为我们只是检查两个栈是否为空。\n\n空间复杂度是 O(n),其中 n 是队列中的元素数量,因为我们需要存储所有元素在两个栈中。\n\n但是我有个问题,不知道为什么用lc自己的time complexity分析出来是O(n)的时间和空间复杂度,可能是因为lc的分析是基于最坏情况的分析?","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094285074","body":"题目的核心是找到最多的分块数量,使得将每个块独立排序后,拼接起来的结果与整个数组排序后的结果相同。\n\n第一个想法是利用排序后的性质。一个块可以被成功分割的条件是:块内所有元素的原数组最大值,小于等于它右边所有元素的最小值。如果满足这个条件,那么这个块排序后,所有元素就都会在它们最终应该在的位置的左边。\n\n为了实现这个想法,我们可以预处理两个数组:\n\n- max_of_left[i]:表示原数组 arr[0...i] 中的最大值。\n- min_of_right[i]:表示原数组 arr[i...n-1] 中的最小值。\n\n然后遍历数组,如果在 i 位置,满足 max_of_left[i] <= min_of_right[i+1],就说明我们可以在 i 和 i+1 之间切一刀。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n n = len(arr)\n if n <= 1:\n return 1\n\n # 1. 计算从左到右每个位置的最大值\n max_of_left = [0] * n\n max_of_left[0] = arr[0]\n for i in range(1, n):\n max_of_left[i] = max(max_of_left[i-1], arr[i])\n\n # 2. 计算从右到左每个位置的最小值\n min_of_right = [0] * n\n min_of_right[n-1] = arr[n-1]\n for i in range(n-2, -1, -1):\n min_of_right[i] = min(min_of_right[i+1], arr[i])\n\n # 3. 遍历查找可以分割的点\n # 如果 max_of_left[i] <= min_of_right[i+1],说明 arr[0...i] 的所有元素\n # 都小于等于 arr[i+1...n-1] 的所有元素,可以切分\n chunks = 0\n for i in range(n - 1):\n if max_of_left[i] <= min_of_right[i+1]:\n chunks += 1\n\n # 总块数 = 分割点数量 + 1\n return chunks + 1\n```\n时间复杂度:O(N),其中 N 是数组的长度。我们需要三次独立的 O(N) 遍历。\n空间复杂度:O(N),用于存储 max_of_left 和 min_of_right 两个辅助数组。\n\n---\n在看题解的时候,发现了一个更巧妙的解法,虽然时间复杂度稍高,但是代码非常简洁。它的思路是比较原数组和排序后数组的元素和。\n\n如果 arr[0...i] 的元素和等于 sorted_arr[0...i] 的元素和,这意味着 arr[0...i] 中的元素集合和 sorted_arr[0...i] 中的元素集合是完全相同的(只是顺序不同)。因为 sorted_arr[0...i] 包含了整个数组中最小的 i+1 个元素,所以 arr[0...i] 也必然包含了这 i+1 个最小元素。这就保证了 arr[0...i] 中的任意元素都小于等于 arr[i+1...n-1] 中的任意元素,因此可以在 i 处进行分割。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n sorted_arr = sorted(arr)\n \n sum_arr = 0\n sum_sorted = 0\n chunks = 0\n \n for i in range(len(arr)):\n sum_arr += arr[i]\n sum_sorted += sorted_arr[i]\n \n if sum_arr == sum_sorted:\n chunks += 1\n \n return chunks\n```\n时间复杂度:O(N log N),瓶颈在于对数组的排序。\n\n空间复杂度:O(N),用于存储排序后的数组副本。\n\n还有一个基于单调栈的解法,时间复杂度可以做到 O(N)。\n\n思路是遍历数组,用一个栈来维护每个块的最大值。\n\n1. 如果当前元素 num 大于或等于栈顶元素,说明 num 可以自己形成一个新的块(或者加入前一个块且不影响排序性),直接将 num 入栈。\n2. 如果当前元素 num 小于栈顶元素,说明 num 必须和前面的块合并,直到栈顶元素小于或等于 num。在合并过程中,需要记录被弹出的那些块中的最大值 head,因为这个 head 将成为合并后新块的最大值,然后将 head 入栈。\n\n最终栈的大小就是块的数量。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n stack = []\n for num in arr:\n if not stack or num >= stack[-1]:\n stack.append(num)\n else:\n # 当前元素num比栈顶小,需要合并\n head = stack.pop()\n # 持续弹出所有大于num的元素\n while stack and stack[-1] > num:\n stack.pop()\n # 将原先这些块的最大值head作为新块的代表入栈\n stack.append(head)\n return len(stack)\n```\n\n时间复杂度:O(N),因为每个元素最多入栈和出栈一次。\n\n空间复杂度:O(N),在最坏的情况下(例如数组本身有序),栈的大小会等于数组长度。\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112533354","body":"双指针\n1. 创建两个指针 pA 和 pB,分别指向两个链表的头节点 headA 和 headB。\n2. 同时向前移动这两个指针,pA 每次走一步,pB 每次也走一步。\n3. 核心操作:如果 pA 指针走到了链表 A 的末尾(即 pA 变为 None),则将它重定向到链表 B 的头节点 headB。同样,如果 pB 指针走到了链表 B 的末尾,则将它重定向到链表 A 的头节点 headA。\n4. 两个指针最终会在相交点相遇。如果两个链表不相交,它们会同时在路径的最后变为 None,此时循环结束。\n\n```python\nclass Solution:\n def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:\n if not headA or not headB:\n return None\n\n pA = headA\n pB = headB\n\n # 当 pA 和 pB 相等时循环终止(可能是在交点,也可能同为 None)\n while pA is not pB:\n # 如果pA走到头,就让他从headB开始走;否则,pA正常往下走\n pA = headB if pA is None else pA.next\n # 如果pB走到头,就让他从headA开始走;否则,pB正常往下走\n pB = headA if pB is None else pB.next\n \n # 返回相遇点\n return pA\n```\n时间复杂度:O(m+n)。在最坏的情况下(例如,两个链表不相交),每个指针都需要遍历两个链表的总长度。\n空间复杂度:O(1)。只使用了两个额外的指针,没有使用其他数据结构。","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121201700","body":"为了实现一个支持 O(1) 时间复杂度的查找插入和删除,可以用hash map去记录key和value之间的映射关系。但是hash map是无序的,没有办法记录各项的使用顺序,可以一个双向链表来记录使用顺序。这样就可以在插入和删除的时候,快速地调整链表的顺序。\n\n```python\nclass DLinkedNode:\n def __init__(self, key=0, value=0):\n self.key = key\n self.value = value\n self.prev = None\n self.next = None\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.cache = dict()\n self.capacity = capacity\n # 使用伪头部和伪尾部节点,简化边界条件处理\n self.head = DLinkedNode()\n self.tail = DLinkedNode()\n self.head.next = self.tail\n self.tail.prev = self.head\n\n def _add_to_head(self, node: DLinkedNode):\n # 将节点添加到头部\n node.prev = self.head\n node.next = self.head.next\n self.head.next.prev = node\n self.head.next = node\n\n def _remove_node(self, node: DLinkedNode):\n # 从链表中删除一个节点\n node.prev.next = node.next\n node.next.prev = node.prev\n\n def _move_to_head(self, node: DLinkedNode):\n # 将一个存在的节点移动到头部\n self._remove_node(node)\n self._add_to_head(node)\n\n def get(self, key: int) -> int:\n if key not in self.cache:\n return -1\n \n node = self.cache[key]\n # 访问过后,变为最近使用,移动到头部\n self._move_to_head(node)\n return node.value\n\n def put(self, key: int, value: int) -> None:\n if key in self.cache:\n # 如果 key 存在,更新值并移动到头部\n node = self.cache[key]\n node.value = value\n self._move_to_head(node)\n else:\n # 如果 key 不存在\n if len(self.cache) == self.capacity:\n # 缓存已满,淘汰最久未使用的节点(尾部节点)\n removed_node = self.tail.prev\n self._remove_node(removed_node)\n # 不要忘了从哈希表中也删除\n del self.cache[removed_node.key]\n\n # 创建新节点并添加到头部\n new_node = DLinkedNode(key, value)\n self._add_to_head(new_node)\n self.cache[key] = new_node\n```\n时间复杂度:get 和 put 操作都是 O(1)。所有操作都是哈希表查找和链表头尾操作的组合。\n空间复杂度:O(capacity),因为哈希表和双向链表最多存储 capacity 个元素。","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3132881592","body":"DFS - 递归\n这道题的结构天然适合使用递归来解决。我们可以定义一个函数,该函数接收一个节点和从根到该节点父节点所构成的数字。\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n \n def dfs(node: Optional[TreeNode], current_path_sum: int) -> int:\n if not node:\n return 0\n \n # 计算到达当前节点的路径代表的数字\n new_sum = current_path_sum * 10 + node.val\n \n # 如果是叶子节点,返回当前路径的数字\n if not node.left and not node.right:\n return new_sum\n \n # 如果不是叶子节点,返回左右子树的路径数字之和\n else:\n return dfs(node.left, new_sum) + dfs(node.right, new_sum)\n\n return dfs(root, 0)\n```\n时间复杂度:O(N),其中 N 是树中节点的数量。我们需要访问每个节点一次。\n空间复杂度:O(H),其中 H 是树的高度。这部分空间用于递归调用栈。在最坏的情况下(树退化成链表),空间复杂度为 O(N);在最好的情况下(完全二叉树),空间复杂度为 O(log N)。\n\n---\n\nDFS - 迭代\n> 递归可能导致的栈溢出问题(在树极深的情况下),我们可以将递归转换为迭代\n\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n \n total_sum = 0\n stack = [(root, root.val)] # 栈中存储 (节点, 到达该节点的路径数值)\n\n while stack:\n node, current_number = stack.pop()\n\n # 如果是叶子节点,将路径数值加入总和\n if not node.left and not node.right:\n total_sum += current_number\n\n # 将右子节点压栈\n if node.right:\n stack.append((node.right, current_number * 10 + node.right.val))\n \n # 将左子节点压栈\n if node.left:\n stack.append((node.left, current_number * 10 + node.left.val))\n \n return total_sum\n```\n时间复杂度:O(N),每个节点入栈和出栈一次。\n空间复杂度:O(H),栈在最坏情况下存储 H 个节点,H 是树的高度。与递归版本类似,最好情况 O(log N),最坏情况 O(N)。\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134942374","body":"因为题目中提到了**行**,我们可以用bfs一行一行地处理树的节点\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\nimport collections\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n \n queue = collections.deque([root])\n bottom_left_val = 0\n \n while queue:\n # 当前层的节点数量\n level_size = len(queue)\n \n # 每一层的第一个节点就是该层的最左侧节点\n # 我们只需要记录它,然后继续遍历\n bottom_left_val = queue[0].val\n \n # 遍历当前层的所有节点\n for _ in range(level_size):\n node = queue.popleft()\n \n # 将下一层的节点加入队列\n if node.left:\n queue.append(node.left)\n if node.right:\n queue.append(node.right)\n \n return bottom_left_val\n```\n时间复杂度:O(N),其中 N 是树中节点的总数。因为每个节点都会入队和出队一次。\n空间复杂度:O(W),其中 W 是树的最大宽度。在最坏的情况下(一个完整的二叉树),队列的大小可以达到 N/2。\n\n---\n当然dfs也是可以做的,要记录目前为止发现的最深层级max_depth和最深层级最左边节点的值result_val,先左后右地进行递归\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n self.max_depth = -1 # 记录最大深度,初始化为-1\n self.result_val = 0 # 记录结果值\n \n def dfs(node: Optional[TreeNode], current_depth: int):\n if not node:\n return\n \n # 如果当前深度大于已记录的最大深度\n # 说明我们第一次到达这个新深度,且由于先序遍历的顺序,这一定是该层最左的节点\n if current_depth > self.max_depth:\n self.max_depth = current_depth\n self.result_val = node.val\n \n # 必须先遍历左子树,再遍历右子树\n dfs(node.left, current_depth + 1)\n dfs(node.right, current_depth + 1)\n \n dfs(root, 0)\n return self.result_val\n```\n时间复杂度:O(N),因为我们仍然需要访问树中的每一个节点。\n空间复杂度:O(H),其中 H 是树的高度。这部分空间是递归调用栈所占用的。最坏情况下,树呈链状,空间复杂度为 O(N)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3146236433","body":"```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n def dfs(node):\n if not node:\n res.append(\"null\")\n return\n res.append(str(node.val))\n dfs(node.left)\n dfs(node.right)\n \n dfs(root)\n return \",\".join(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n if not data:\n return None\n \n # 使用列表模拟一个队列,方便 pop(0)\n node_list = data.split(',')\n \n def build_tree():\n val = node_list.pop(0)\n if val == \"null\":\n return None\n \n node = TreeNode(int(val))\n node.left = build_tree()\n node.right = build_tree()\n return node\n \n return build_tree()\n```\n复杂度 空间和时间都是 O(N)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3141867802","body":"坐标记录 + 排序\n为每一个节点确定其坐标 (row, col),并记录下 (row, col, val) 这个三元组。最后BFS即可(DFS应该也行)\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import List, Optional\nimport collections\n\nclass Solution:\n def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:\n if not root:\n return []\n \n # 1. 遍历与记录\n # 使用 BFS 遍历树,记录每个节点的 (col, row, val)\n nodes_info = []\n queue = collections.deque([(root, 0, 0)]) # (node, row, col)\n \n while queue:\n node, row, col = queue.popleft()\n nodes_info.append((col, row, node.val))\n \n if node.left:\n queue.append((node.left, row + 1, col - 1))\n if node.right:\n queue.append((node.right, row + 1, col + 1))\n \n # 2. 排序\n # 对记录下来的节点信息进行排序\n # Python 的元组排序默认按元素顺序比较,完美符合题目要求\n nodes_info.sort()\n \n # 3. 分组\n # 将排序后的结果按列分组\n result_map = collections.OrderedDict()\n for col, row, val in nodes_info:\n if col not in result_map:\n result_map[col] = []\n result_map[col].append(val)\n \n return list(result_map.values())\n```\n时间复杂度:O(N log N)。\nBFS 遍历需要 O(N) 的时间,其中 N 是节点数。nodes_info.sort() 是整个算法的瓶颈,对 N 个元素排序需要 O(N log N) 的时间。最后的分组步骤需要 O(N) 的时间。\n因此,总时间复杂度为 O(N log N)。\n\n空间复杂度:O(N)。\nBFS 的队列在最坏情况下需要存储 O(W) 个节点,W 是树的最大宽度。nodes_info 列表需要存储所有 N 个节点的信息,因此需要 O(N) 的空间。result_map 也需要 O(N) 的空间来存储所有节点的值。\n因此,总空间复杂度为 O(N)。\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146235205","body":"```python\nfrom typing import List, Set\n\nclass Solution:\n def generateParenthesis(self, n: int) -> List[str]:\n # 使用列表来模拟dp数组,每个元素是一个哈希集合\n dp: List[Set[str]] = [set() for _ in range(n + 1)]\n \n # 基础情况:0对括号只有一种组合,即空字符串\n dp[0].add(\"\")\n \n # 从1对括号开始,迭代到n对\n for i in range(1, n + 1):\n # 遍历所有可能的分割点 j\n for j in range(i):\n # A 部分有 j 对括号,B 部分有 i-1-j 对\n list_p = dp[j]\n list_q = dp[i - 1 - j]\n \n # 组合 p 和 q\n for p in list_p:\n for q in list_q:\n # 使用哈希集合 dp[i] 自动去重\n dp[i].add(f\"({p}){q}\")\n \n return list(dp[n])\n```\n复杂度好像有点难算 看看大家有没有什么想法 我再算一算","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3147359265","body":"首先想到的是26字母那道题一样开一个数组然后建一个数组索引转换hash map去做 但是我不清楚是不是升序 所以要用min和max 那这样的效果肯定很差 内存会超 结果没想到居然能过\n```python\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n if not nums:\n return []\n \n # -----------------------------------------------------------------\n # 步骤 1: 使用“数组哈希”(直接寻址法)统计频率\n # -----------------------------------------------------------------\n \n # a. 找到数值范围以确定数组大小\n min_val = min(nums)\n max_val = max(nums)\n \n # b. 定义偏移量,将所有数值映射到数组的非负索引\n offset = -min_val\n \n # c. 创建计数数组\n count_array_size = max_val - min_val + 1\n count_array = [0] * count_array_size\n \n # d. 遍历原数组,完成计数\n for num in nums:\n # 将 num 通过偏移量映射到数组索引\n index = num + offset\n count_array[index] += 1\n\n # -----------------------------------------------------------------\n # 步骤 2: 使用桶排序来找到前 K 个高频元素\n # -----------------------------------------------------------------\n\n # a. 创建桶,桶的索引代表频率\n # 桶的数量是 len(nums) + 1,因为一个元素的频率不可能超过总数\n buckets = [[] for _ in range(len(nums) + 1)]\n\n # b. 遍历计数数组,将元素放入对应频率的桶中\n for i in range(count_array_size):\n freq = count_array[i]\n if freq > 0:\n # 将索引 i 转换回原始数字\n num = i - offset\n buckets[freq].append(num)\n\n # -----------------------------------------------------------------\n # 步骤 3: 从后往前收集结果\n # -----------------------------------------------------------------\n \n result = []\n # 从最高频率的桶开始遍历\n for i in range(len(buckets) - 1, 0, -1):\n # 如果当前频率的桶中有元素\n if buckets[i]:\n # 将这个桶里的所有元素加入结果集\n result.extend(buckets[i])\n \n # 如果结果集大小已经足够,可以提前退出\n if len(result) >= k:\n break\n \n # 返回前 k 个元素,如果最后一个桶加入了多余元素,用切片保证只返回k个\n return result[:k]\n```\n---\n然后我想到遍历数组 建一个hash map(元素,频率) 然后按频率降序排序提出来前k个\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n # 1. 使用 collections.Counter 快速统计频率,O(N)\n freq_map = collections.Counter(nums)\n \n # 2. 对哈希表按值(频率)进行排序\n # sorted 函数的时间复杂度是 O(M log M),其中 M 是不同元素的数量\n # M <= N,所以最坏是 O(N log N)\n sorted_items = sorted(freq_map.items(), key=lambda item: item[1], reverse=True)\n \n # 3. 提取前 k 个元素\n result = [item[0] for item in sorted_items[:k]]\n \n return result\n```\n空间复杂度:O(N)\n时间复杂度:O(NlogN)。其中 N 是数组 nums 的长度。瓶颈在于排序那一步,即使只有 M 个独立元素,在最坏情况下 M 可能等于 N。这个复杂度不满足题目进阶要求。\n\n---\n可以看到关键问题在于排序,想办法避免排序 我就可以用最小堆来做\n维护一个最小的heapq 按频率存入 如果堆的大小超过k了就把频率最低的pop out就行\n```python\nimport collections\nimport heapq\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n # 1. 统计频率,O(N)\n freq_map = collections.Counter(nums)\n \n # 2. 维护一个大小为 k 的最小堆,O(M log k),M是不同元素的数量\n min_heap = []\n for num, freq in freq_map.items():\n # Python的heapq是最小堆,所以我们存入(频率, 数字)\n # 这样堆会根据频率排序\n heapq.heappush(min_heap, (freq, num))\n if len(min_heap) > k:\n heapq.heappop(min_heap) # pop out频率最小的元素\n \n # 3. 提取结果\n # 此时堆中的k个元素就是频率最高的k个\n result = [item[1] for item in min_heap]\n return result\n```\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3156822202","body":"双指针滑动窗口\n```python\nclass Solution:\n def lengthOfLongestSubstring(self, s: str) -> int:\n # 哈希表存储 {字符: 最后出现的位置索引}\n char_map = {}\n max_len = 0\n left = 0 # 窗口的左边界\n \n # right 是窗口的右边界,不断向右移动\n for right in range(len(s)):\n char = s[right]\n \n # 如果当前字符已经存在于哈希表中,并且其位置在当前窗口内\n if char in char_map and char_map[char] >= left:\n # 遇到重复字符,收缩窗口\n # 将左边界移动到重复字符上一次出现位置的下一个位置\n left = char_map[char] + 1\n \n # 更新字符的最新位置\n char_map[char] = right\n \n # 更新最大长度\n current_len = right - left + 1\n max_len = max(max_len, current_len)\n \n return max_len\n```\n时间复杂度:O(N)。left 和 right 两个指针都只会从头到尾遍历字符串一次,每个字符最多被访问两次。\n\n空间复杂度:O(k),其中 k 是字符串中不同字符的数量。在最坏的情况下(所有字符都不同),空间复杂度为 O(N)。如果字符集有限(例如 ASCII 码共 128 个),则空间复杂度为常数 O(128)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3156831483","body":"这道题和上一题的区别一个是子字符串(3)一个是子序列(30)\n解法还是双指针滑动窗口 只不过需要改造一下,现在要独立扫描word_len 次\n即\n>第一次扫描:从索引 0 开始,窗口每次移动 word_len,检查的子串是 s[0...], s[word_len...], s[2*word_len...] ...\n第二次扫描:从索引 1 开始,窗口每次移动 word_len,检查的子串是 s[1...], s[1+word_len...], s[1+2*word_len...] ...\n\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def findSubstring(self, s: str, words: List[str]) -> List[int]:\n if not s or not words:\n return []\n\n word_len = len(words[0])\n num_words = len(words)\n total_len = word_len * num_words\n words_freq = collections.Counter(words)\n result = []\n\n # 我们需要进行 word_len 次扫描\n for i in range(word_len):\n left = i # 当前扫描的窗口左边界\n seen = collections.Counter() # 当前窗口内单词的频率\n count = 0 # 当前窗口内有效单词的数量\n\n # 窗口右边界以 word_len 为步长滑动\n for j in range(i, len(s) - word_len + 1, word_len):\n word = s[j : j + word_len]\n \n if word in words_freq:\n seen[word] += 1\n count += 1\n \n # 如果一个单词的数量超了,就从左边收缩窗口\n while seen[word] > words_freq[word]:\n left_word = s[left : left + word_len]\n seen[left_word] -= 1\n count -= 1\n left += word_len\n \n # 如果窗口内单词数量正好,说明找到了一个解\n if count == num_words:\n result.append(left)\n # 为了继续搜索,将窗口最左边的单词移出\n left_word = s[left : left + word_len]\n seen[left_word] -= 1\n count -= 1\n left += word_len\n\n else:\n # 如果遇到的单词不在 words 列表中,则当前窗口作废\n # 直接将左边界移动到这个坏单词的后面\n seen.clear()\n count = 0\n left = j + word_len\n \n return result\n```\n时间复杂度O(N),N是字符串s的长度\n空间复杂度O(ML),M是words列表里的单词数量 L是每个单词长度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3161453831","body":"```python\nfrom typing import List\n\nclass Solution:\n def minSubarray(self, nums: List[int], p: int) -> int:\n n = len(nums)\n # 1. 同余定理:计算目标余数\n target_rem = sum(nums) % p\n \n # 如果总和已经能被 p 整除,无需移除\n if target_rem == 0:\n return 0\n \n # 2. 哈希表:存储 {余数: 最后一次出现的索引}\n # 初始化 {0: -1} 来处理从开头开始的子数组\n rem_map = {0: -1}\n min_len = n # 初始化为一个最大值\n \n # 3. 前缀和:用一个变量 current_sum 动态计算\n current_sum = 0\n \n for i, num in enumerate(nums):\n current_sum += num\n current_rem = current_sum % p\n \n # 计算需要寻找的配对余数\n needed_rem = (current_rem - target_rem + p) % p\n \n # 如果找到了配对\n if needed_rem in rem_map:\n prev_index = rem_map[needed_rem]\n # 更新最短长度\n min_len = min(min_len, i - prev_index)\n \n # 更新当前余数的最新索引\n rem_map[current_rem] = i\n \n # 如果 min_len 没有被更新过,或者更新后的值等于n(意味着要移除整个数组)\n # 则说明找不到合适的“真”子数组\n return min_len if min_len < n else -1\n```\n时间复杂度:O(N),因为我们只遍历了数组一次。\n空间复杂度:O(min(N,p)),因为哈希表中最多存储 p 个不同的余数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3169922808","body":"双指针\n```python\nfrom typing import Optional\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\n\nclass Solution:\n def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n # 初始化快慢指针\n slow = head\n fast = head\n \n # 当快指针没有走到链表末尾时\n while fast and fast.next:\n # 慢指针走一步\n slow = slow.next\n # 快指针走两步\n fast = fast.next.next\n \n # 当循环结束时,慢指针正好在中间位置\n return slow\n```\n时间复杂度:O(N)。虽然有两个指针,但我们只对链表进行了一次单向遍历。\n空间复杂度:O(1)。只使用了两个额外的指针变量,没有使用额外的存储空间。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169886502","body":"双指针/快慢指针\n快的去遍历 慢的维护只出现一次的元素\n```python\nfrom typing import List\n\nclass Solution:\n def removeDuplicates(self, nums: List[int]) -> int:\n # 如果数组为空,直接返回 0\n if not nums:\n return 0\n \n # slow 指针指向下一个将要被赋值的、新的不重复元素的位置。\n # nums[0] 默认是第一个不重复的元素,所以 slow 从 1 开始。\n slow = 1\n \n # fast 指针从第二个元素开始,遍历整个数组\n for fast in range(1, len(nums)):\n if nums[fast] != nums[fast - 1]:\n nums[slow] = nums[fast]\n slow += 1\n \n return slow","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173197055","body":"我们可以用单调队列(双端队列 (deque))来维护窗口内的“候选最大值”,使得获取当前最大值的操作是 O(1) 的\n>双端队列 (deque)\n队列中存储的是数组元素的索引,而不是元素本身。\n队列中的索引所对应的 nums 数组中的值,是从头到尾单调递减的。\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n n = len(nums)\n if n * k == 0:\n return []\n \n # 单调队列,存储的是元素的索引\n # 队列中的索引对应的 nums 值是单调递减的\n deque = collections.deque()\n result = []\n\n for i in range(n):\n # 1. 维护单调性:移除队尾所有小于当前值的元素\n while deque and nums[deque[-1]] <= nums[i]:\n deque.pop()\n \n # 2. 当前元素索引入队\n deque.append(i)\n \n # 3. 维护窗口大小:移除已经滑出窗口的队头元素\n if deque[0] <= i - k:\n deque.popleft()\n \n # 4. 记录结果:当窗口完全形成后开始记录\n if i >= k - 1:\n # 队头元素永远是当前窗口的最大值\n result.append(nums[deque[0]])\n \n return result\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3187054447","body":"```python\nfrom typing import List\n\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n # 使用一个数组记录每个人的信任差额\n trust_scores = [0] * (n + 1)\n \n for a, b in trust:\n trust_scores[a] -= 1 # 信任别人,分数-1\n trust_scores[b] += 1 # 被人信任,分数+1\n \n # 寻找分数为 n-1 的法官\n for i in range(1, n + 1):\n if trust_scores[i] == n - 1:\n return i\n \n return -1\n```\n时间复杂度: O(n + m), m为trust列表长度\n空间复杂度: O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3187045338","body":"这道题的本质是判断一个图是否为二分图 (Bipartite Graph)。\n n 个人看作是图的 n 个节点 (Vertex),每一对 dislike关系 [a, b] 看作是连接节点 a 和 b 的一条无向边 (Edge)。\n判断由人和他们之间的“不喜欢”关系构成的图,是否是一个二分图。\nDFS着色\n```python\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:\n # 1. 构建图的邻接表\n graph = [[] for _ in range(n + 1)]\n for u, v in dislikes:\n graph[u].append(v)\n graph[v].append(u)\n \n # 2. 创建 colors 数组,0:未着色, 1:颜色A, -1:颜色B\n colors = [0] * (n + 1)\n \n # 3. 遍历所有节点\n for i in range(1, n + 1):\n # 如果节点未被着色,从它开始进行DFS\n if colors[i] == 0:\n if not self.dfs(i, 1, colors, graph):\n return False\n \n return True\n\n def dfs(self, node: int, color: int, colors: List[int], graph: List[List[int]]) -> bool:\n # 给当前节点染色\n colors[node] = color\n \n # 遍历所有邻居\n for neighbor in graph[node]:\n # 如果邻居颜色与当前节点相同,产生冲突\n if colors[neighbor] == color:\n return False\n # 如果邻居未被染色,对其进行DFS\n if colors[neighbor] == 0:\n # 给邻居染上相反的颜色\n if not self.dfs(neighbor, -color, colors, graph):\n return False\n \n return True\n```\nBFS着色\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:\n # 1. 构建图的邻接表\n graph = [[] for _ in range(n + 1)]\n for u, v in dislikes:\n graph[u].append(v)\n graph[v].append(u)\n \n # 2. 创建 colors 数组\n colors = [0] * (n + 1)\n \n # 3. 遍历所有节点\n for i in range(1, n + 1):\n if colors[i] == 0: # 未被染色,开始BFS\n queue = collections.deque([i])\n colors[i] = 1 # 染上颜色A\n \n while queue:\n node = queue.popleft()\n # 遍历邻居\n for neighbor in graph[node]:\n # 如果邻居颜色与当前节点相同,冲突\n if colors[neighbor] == colors[node]:\n return False\n # 如果邻居未染色,染上相反颜色并入队\n if colors[neighbor] == 0:\n colors[neighbor] = -colors[node]\n queue.append(neighbor)\n \n return True\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3187051602","body":"双层拓扑排序 关键在于排序的规则\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:\n \n # 1. 数据预处理:为没有团队的项目分配新团队ID\n new_group_id = m\n for i in range(n):\n if group[i] == -1:\n group[i] = new_group_id\n new_group_id += 1\n \n num_groups = new_group_id\n\n # 2. 构建项目图和团队图及其入度数组\n item_graph = [[] for _ in range(n)]\n item_indegree = [0] * n\n group_graph = [[] for _ in range(num_groups)]\n group_indegree = [0] * num_groups\n\n for i in range(n):\n for prev_item in beforeItems[i]:\n # 项目图依赖\n item_graph[prev_item].append(i)\n item_indegree[i] += 1\n \n # 如果属于不同团队,则产生团队图依赖\n if group[prev_item] != group[i]:\n group_graph[group[prev_item]].append(group[i])\n group_indegree[group[i]] += 1\n\n # 3. 通用的拓扑排序函数\n def topological_sort(graph, indegree):\n num_nodes = len(graph)\n queue = collections.deque([i for i in range(num_nodes) if indegree[i] == 0])\n sorted_order = []\n while queue:\n u = queue.popleft()\n sorted_order.append(u)\n for v in graph[u]:\n indegree[v] -= 1\n if indegree[v] == 0:\n queue.append(v)\n \n return sorted_order if len(sorted_order) == num_nodes else []\n\n # 4. 执行两次拓扑排序\n item_order = topological_sort(item_graph, item_indegree)\n group_order = topological_sort(group_graph, group_indegree)\n\n if not item_order or not group_order:\n return []\n\n # 5. 合并结果\n # a. 将排好序的项目按团队分组\n items_by_group = collections.defaultdict(list)\n for item in item_order:\n items_by_group[group[item]].append(item)\n \n # b. 根据团队顺序,拼接项目\n final_result = []\n for group_id in group_order:\n final_result.extend(items_by_group[group_id])\n \n return final_result\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3193081347","body":"模拟\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n # 初始化坐标\n x, y = 0, 0\n \n # 遍历每一步\n for move in moves:\n if move == 'U':\n y += 1\n elif move == 'D':\n y -= 1\n elif move == 'L':\n x -= 1\n elif move == 'R':\n x += 1\n \n # 检查最终位置是否为原点\n return x == 0 and y == 0\n```\n或者直接看字符串里面是否满足U==D, L==R\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n # Python 的 count() 方法让这个思路的实现非常简洁\n # 检查向上和向下的步数是否相等\n vertical_balance = (moves.count('U') == moves.count('D'))\n \n # 检查向左和向右的步数是否相等\n horizontal_balance = (moves.count('L') == moves.count('R'))\n \n return vertical_balance and horizontal_balance\n```\n两个复杂度是一样的\n时间复杂度:O(N)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193084373","body":"排序 + 最小堆\nmin_heap存放已到达但未执行的任务(processingTime, original_index) 按照时间、索引排序\n```python\nimport heapq\nfrom typing import List\n\nclass Solution:\n def getOrder(self, tasks: List[List[int]]) -> List[int]:\n # 1. 数据预处理:附加原始索引并按入队时间排序\n # tasks_with_indices 的格式: [[enqueueTime, processingTime, original_index], ...]\n tasks_with_indices = sorted(\n [(tasks[i][0], tasks[i][1], i) for i in range(len(tasks))]\n )\n \n result_order = []\n min_heap = [] # 优先队列,存储 (processingTime, original_index)\n \n task_pointer = 0 # 指向下一个要检查的任务\n current_time = 0 # 当前时间\n \n # 当还有任务未处理或未入队时,循环继续\n while task_pointer < len(tasks) or min_heap:\n \n # 如果CPU空闲且没有任务在等待,快进到下一个任务的到达时间\n if not min_heap and current_time < tasks_with_indices[task_pointer][0]:\n current_time = tasks_with_indices[task_pointer][0]\n\n # 2. 将所有已到达的任务加入最小堆\n while task_pointer < len(tasks) and tasks_with_indices[task_pointer][0] <= current_time:\n enqueue_time, process_time, original_index = tasks_with_indices[task_pointer]\n heapq.heappush(min_heap, (process_time, original_index))\n task_pointer += 1\n \n # 3. 从堆中取出最优任务执行\n if min_heap:\n process_time, original_index = heapq.heappop(min_heap)\n current_time += process_time\n result_order.append(original_index)\n \n return result_order\n```\n复杂度:假设N个任务,那么时间复杂度是O(NlogN)有排序造成的,空间是O(N) tasks列表和min_heap都需要O(N)的空间","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3204406944","body":"a->c,需要len(a) - a中c的个数\nb->c需要len(b) - b中c的个数\n我们需要考虑len(a) + len(b) - (a中c的个数 + b中c的个数)\n此外还可以优化一下\n如果a= c 的字符。\nb 中需要改变的,是那些 < c 的字符。\na>=b同理\n```python\nimport collections\n\nclass Solution:\n def minCharacters(self, a: str, b: str) -> int:\n n, m = len(a), len(b)\n freq_a = collections.Counter(a)\n freq_b = collections.Counter(b)\n\n # --- 计算条件 3 的最小代价 ---\n # 代价 = 总长度 - 两个字符串中某个字符的最大总频次\n max_combined_freq = 0\n for i in range(26):\n char = chr(ord('a') + i)\n max_combined_freq = max(max_combined_freq, freq_a[char] + freq_b[char])\n \n cost3 = n + m - max_combined_freq\n\n # --- 计算条件 1 (a < b) 和 条件 2 (b < a) 的最小代价 ---\n cost1 = float('inf') # a < b\n cost2 = float('inf') # b < a\n \n # 使用前缀/后缀和的思想来优化计数\n a_lt_count = 0 # a 中 < 当前分界线的字符数\n b_lt_count = 0\n \n # 遍历所有 25 个可能的分界线 ('b' 到 'z')\n for i in range(25):\n char = chr(ord('a') + i)\n a_lt_count += freq_a[char]\n b_lt_count += freq_b[char]\n \n # 分界线是 char_next = chr(ord('a') + i + 1)\n # 条件 1 (a < char_next, b >= char_next):\n # - a 中要改的是 >= char_next 的, 即 (n - a_lt_count)\n # - b 中要改的是 < char_next 的, 即 b_lt_count\n current_cost1 = (n - a_lt_count) + b_lt_count\n cost1 = min(cost1, current_cost1)\n \n # 条件 2 (b < char_next, a >= char_next):\n # - b 中要改的是 >= char_next 的, 即 (m - b_lt_count)\n # - a 中要改的是 < char_next 的, 即 a_lt_count\n current_cost2 = (m - b_lt_count) + a_lt_count\n cost2 = min(cost2, current_cost2)\n\n return min(cost1, cost2, cost3)\n```\n时间复杂度:O(N+M),其中 N 和 M 分别是两个字符串的长度。\n空间复杂度:O(1),大小为 26 的频率表\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3208576782","body":"堆排序\n```python\nclass Solution:\n def sortArray(self, nums: List[int]) -> List[int]:\n def heapify(nums, n, i):\n largest = i\n left = 2 * i + 1\n right = 2 * i + 2\n\n if left < n and nums[left] > nums[largest]:\n largest = left\n if right < n and nums[right] > nums[largest]:\n largest = right\n if largest != i:\n nums[i], nums[largest] = nums[largest], nums[i]\n heapify(nums, n, largest)\n\n n = len(nums)\n for i in range(n // 2 - 1, -1, -1):\n heapify(nums, n, i)\n\n for i in range(n - 1, 0, -1):\n nums[i], nums[0] = nums[0], nums[i]\n heapify(nums, i, 0)\n```\n时间复杂度:O(NlogN)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3208555582","body":"二分\n```python\nclass Solution:\n def mySqrt(self, x: int) -> int:\n\n if x == 0:\n return 0\n \n # 定义二分查找的左右边界\n left, right = 0, x\n ans = 0\n \n while left <= right:\n # 计算中间值\n mid = left + (right - left) // 2\n \n # 避免 mid 为 0 的情况,或者直接判断 mid * mid\n if mid == 0:\n left = mid + 1\n continue\n \n # 比较 mid 的平方与 x\n # 为了防止 mid * mid 溢出(在某些语言中),可以写成 mid <= x / mid\n if mid * mid > x:\n # mid 太大,搜索左半部分\n right = mid - 1\n else:\n # mid 是一个可能的答案,尝试寻找更大的\n ans = mid\n left = mid + 1\n \n return ans\n```\n时间复杂度:O(logN)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208553626","body":"二分查找\n```python\nclass Solution:\n def firstBadVersion(self, n: int) -> int:\n left, right = 1, n\n \n while left < right:\n mid = left + (right - left) // 2\n \n if isBadVersion(mid):\n # 如果 mid 是坏的,那第一个坏版本在 [left, mid] 区间内\n # 我们不能排除 mid,所以 right = mid\n right = mid\n else:\n # 如果 mid 是好的,那第一个坏版本在 [mid + 1, right] 区间内\n left = mid + 1\n \n return left\n```\n时间复杂度:O(logN)\n空间复杂度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3222475353","body":"排除法\n排除掉卡片的正面和背面是同一个数字 X的卡片\n```python\nfrom typing import List\n\nclass Solution:\n def flipgame(self, fronts: List[int], backs: List[int]) -> int:\n # 1. 找出所有“不可能的”数字\n impossible_nums = set()\n for i in range(len(fronts)):\n if fronts[i] == backs[i]:\n impossible_nums.add(fronts[i])\n \n # 2. 寻找最小的“好”数字\n min_good_num = float('inf')\n found_good_num = False\n \n # 遍历所有出现过的数字\n all_nums = fronts + backs\n \n for num in all_nums:\n # 如果这个数字不是“不可能的”\n if num not in impossible_nums:\n found_good_num = True\n min_good_num = min(min_good_num, num)\n \n # 3. 返回结果\n return min_good_num if found_good_num else 0\n```\n时间复杂度:O(N),其中 N 是卡片的数量。\n空间复杂度:O(N)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3222461055","body":"二分 + DFS/BFS\n```python\nfrom typing import List\n\nclass Solution:\n def swimInWater(self, grid: List[List[int]]) -> int:\n n = len(grid)\n left, right = grid[0][0], n * n - 1\n ans = right\n\n def is_possible(t):\n # 检查在时间 t 是否能从 (0,0) 到达 (n-1, n-1)\n if grid[0][0] > t:\n return False\n \n stack = [(0, 0)]\n visited = {(0, 0)}\n \n while stack:\n r, c = stack.pop()\n if r == n - 1 and c == n - 1:\n return True\n \n for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:\n nr, nc = r + dr, c + dc\n if 0 <= nr < n and 0 <= nc < n and (nr, nc) not in visited and grid[nr][nc] <= t:\n visited.add((nr, nc))\n stack.append((nr, nc))\n return False\n\n while left <= right:\n mid = left + (right - left) // 2\n if is_possible(mid):\n ans = mid\n right = mid - 1\n else:\n left = mid + 1\n \n return ans\n```\n时间复杂度:O($n^2logn$)\n空间复杂度:O($n^2$)\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222456504","body":"Sliding Window\n维护一个固定大小为 k 的窗口,在字符串上滑动。当窗口向右移动一格时,只需要考虑移出窗口的字符和移入窗口的字符对元音数量的影响即可。\n```python\nfrom typing import List\n\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n vowels = {'a', 'e', 'i', 'o', 'u'}\n \n # 1. 初始化:计算第一个窗口的元音数\n current_vowels = 0\n for i in range(k):\n if s[i] in vowels:\n current_vowels += 1\n \n max_vowels = current_vowels\n \n # 2. 滑动窗口\n # 从第 k 个字符开始,模拟窗口向右滑动\n for i in range(k, len(s)):\n # a. 处理新移入的字符 s[i]\n if s[i] in vowels:\n current_vowels += 1\n \n # b. 处理被移出的字符 s[i-k]\n if s[i-k] in vowels:\n current_vowels -= 1\n \n # c. 更新最大值\n max_vowels = max(max_vowels, current_vowels)\n \n return max_vowels\n```\n时间复杂度:O(N)\n空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3232274052","body":"动态规划 + 滑动窗口\n定义 dp[i] 为:爱丽丝最终得分恰好为 i 的概率,最后要计算$\\sum_i=k^n dp[i]$,dp[0] = 1\n```python\nclass Solution:\n def new21Game(self, n: int, k: int, maxPts: int) -> float:\n # 如果 k=0,开始就是 >=k,游戏直接结束,得分为0,概率为1\n if k == 0:\n return 1.0\n \n # dp[i] 表示得到分数 i 的概率\n dp = [0.0] * (n + 1)\n dp[0] = 1.0\n \n # window_sum 维护一个大小为 maxPts 的滑动窗口内 dp 值的和\n window_sum = 1.0\n result = 0.0\n \n for i in range(1, n + 1):\n # 计算 dp[i]\n dp[i] = window_sum / maxPts\n \n # 如果 i < k,dp[i] 会对后续的 dp 值产生贡献,加入窗口\n if i < k:\n window_sum += dp[i]\n \n # 如果 i >= k,这是一个最终得分,累加到结果中\n # 注意:题目求的是 <= n 的概率,而 dp 数组只到 n,所以循环内累加即可\n if i >= k:\n result += dp[i]\n \n # 如果 i >= maxPts,需要将滑出窗口的 dp 值减去\n if i >= maxPts:\n window_sum -= dp[i - maxPts]\n \n return result\n```\n时间复杂度:O(n)。我们只对 dp 数组进行了一次遍历。\n空间复杂度:O(n)。用于存储 dp 数组。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3232278119","body":"滑动窗口 + 字符频率统计\n```python\nfrom typing import List\n\nclass Solution:\n def findAnagrams(self, s: str, p: str) -> List[int]:\n s_len, p_len = len(s), len(p)\n \n # 边缘情况:如果 s 比 p 短,不可能找到异位词\n if s_len < p_len:\n return []\n \n result = []\n # 使用大小为 26 的数组作为频率统计表\n p_counts = [0] * 26\n s_window_counts = [0] * 26\n \n # 1. & 2. 初始化 p 的频率表和 s 的第一个窗口的频率表\n for i in range(p_len):\n p_counts[ord(p[i]) - ord('a')] += 1\n s_window_counts[ord(s[i]) - ord('a')] += 1\n \n # 3. 第一次比较\n if p_counts == s_window_counts:\n result.append(0)\n \n # 4. 滑动窗口\n for i in range(p_len, s_len):\n # a. 移入新字符\n s_window_counts[ord(s[i]) - ord('a')] += 1\n # b. 移出旧字符\n s_window_counts[ord(s[i - p_len]) - ord('a')] -= 1\n \n # c. 再次比较\n if p_counts == s_window_counts:\n # 当前窗口的起始索引是 i - p_len + 1\n result.append(i - p_len + 1)\n \n return result\n```\n时间复杂度:O(textlen(s)+textlen(p))\n空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235951126","body":"用一个 right 指针不断地扩展窗口,直到窗口内的子串满足了“包含 t 中所有字符”的条件。一旦窗口满足条件,就记录下这个“可行解”,然后开始移动 left 指针,收缩窗口\n```python\nimport collections\n\nclass Solution:\n def minWindow(self, s: str, t: str) -> str:\n # need 存储 t 中字符的需求数量\n need = collections.Counter(t)\n # window 存储当前窗口中字符的数量\n window = collections.Counter()\n\n left, right = 0, 0\n valid = 0 # 记录 window 中有多少字符已经满足了 need 的要求\n \n # 记录最小覆盖子串的起始索引和长度\n start = 0\n min_len = float('inf')\n\n while right < len(s):\n # c 是将移入窗口的字符\n c = s[right]\n right += 1\n \n # 扩展窗口\n if c in need:\n window[c] += 1\n if window[c] == need[c]:\n valid += 1\n \n # 判断左侧窗口是否要收缩\n while valid == len(need):\n # 在这里更新最小覆盖子串\n if right - left < min_len:\n start = left\n min_len = right - left\n\n # d 是将移出窗口的字符\n d = s[left]\n left += 1\n \n # 收缩窗口\n if d in need:\n if window[d] == need[d]:\n valid -= 1\n window[d] -= 1\n\n # 返回最小覆盖子串,如果 min_len 还是初始值,说明没有找到\n return \"\" if min_len == float('inf') else s[start : start + min_len]\n```\n时间复杂度: O(len(s)+len(t))\n空间复杂度: O(N), N是字符集的大小","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3244023262","body":"dfs\n```python\nfrom typing import List\n\nclass Solution:\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n if not grid:\n return 0\n \n rows, cols = len(grid), len(grid[0])\n max_area = 0\n \n def dfs(r, c):\n # 边界条件检查 & 终止条件 (遇到水或已访问过的陆地)\n if not (0 <= r < rows and 0 <= c < cols and grid[r][c] == 1):\n return 0\n \n # 将当前单元格标记为已访问 (沉岛)\n grid[r][c] = 0\n \n # 当前单元格面积为 1,并递归探索四个方向\n return (1 + dfs(r + 1, c) +\n dfs(r - 1, c) +\n dfs(r, c + 1) +\n dfs(r, c - 1))\n\n # 遍历整个网格\n for r in range(rows):\n for c in range(cols):\n if grid[r][c] == 1:\n current_area = dfs(r, c)\n max_area = max(max_area, current_area)\n \n return max_area\n```\n时间复杂度O(MN)\n空间复杂度最坏O(MN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3251910064","body":"Multi-Source BFS\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxDistance(self, grid: List[List[int]]) -> int:\n n = len(grid)\n queue = collections.deque()\n \n # 1. 初始化:将所有陆地加入队列\n for r in range(n):\n for c in range(n):\n if grid[r][c] == 1:\n queue.append((r, c))\n \n # 边缘情况:如果全是陆地或全是海洋\n if len(queue) == 0 or len(queue) == n * n:\n return -1\n \n distance = -1\n # 2. 多源 BFS\n while queue:\n distance += 1\n # 遍历当前层的所有节点\n for _ in range(len(queue)):\n r, c = queue.popleft()\n \n # 探索四个方向的邻居\n for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:\n nr, nc = r + dr, c + dc\n \n if 0 <= nr < n and 0 <= nc < n and grid[nr][nc] == 0:\n grid[nr][nc] = 1 # 标记为已访问\n queue.append((nr, nc))\n \n return distance\n```\n时间复杂度:O(N^2)\n空间复杂度:O(N^2)\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251914219","body":"模拟+bfs\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n \n total_candies = 0\n \n # 我们拥有的、但未打开的盒子\n my_closed_boxes = set()\n # 可以打开并处理的盒子队列\n queue = collections.deque()\n\n # 初始化\n for box_idx in initialBoxes:\n if status[box_idx] == 1:\n queue.append(box_idx)\n else:\n my_closed_boxes.add(box_idx)\n\n while queue:\n box_idx = queue.popleft()\n \n # 1. 拿糖果\n total_candies += candies[box_idx]\n \n # 2. 拿钥匙,并用新钥匙尝试打开已有的盒子\n for key in keys[box_idx]:\n status[key] = 1 \n if key in my_closed_boxes:\n queue.append(key)\n my_closed_boxes.remove(key)\n \n # 3. 拿新盒子\n for contained_box in containedBoxes[box_idx]:\n if status[contained_box] == 1:\n queue.append(contained_box)\n else:\n my_closed_boxes.add(contained_box)\n \n return total_candies\n```\n时间复杂度: O(盒子数+钥匙数+内涵盒子数)\n\n空间复杂度: O(盒子数)。最坏情况下要存储所有盒子的信息。\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260205356","body":"dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n```python\nclass Solution:\n def minCostClimbingStairs(self, cost: List[int]) -> int:\n n = len(cost)\n dp = [0] * (n + 1)\n \n # dp[0] 和 dp[1] 默认为 0,因为可以从这两级开始\n \n # 从第 2 级台阶开始,应用转移方程\n for i in range(2, n + 1):\n dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n \n return dp[n]\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3276673110","body":"dp[i] = max(nums[i-1] + dp[i-2], dp[i-1])\n\n```python\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n n = len(nums)\n if n == 0: return 0\n if n == 1: return nums[0]\n \n dp = [0] * (n + 1)\n dp[0] = 0\n dp[1] = nums[0]\n \n for i in range(2, n + 1):\n dp[i] = max(nums[i-1] + dp[i-2], dp[i-1])\n \n return dp[n]\n```\n可以优化到只依赖前两个状态来节省内存空间\n```python\nfrom typing import List\n\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n # rob_prev 代表 dp[i-2],rob_curr 代表 dp[i-1]\n rob_prev, rob_curr = 0, 0\n \n for num in nums:\n # 计算 dp[i] = max(num + dp[i-2], dp[i-1])\n temp = max(num + rob_prev, rob_curr)\n # 更新状态,为下一次循环做准备\n rob_prev = rob_curr\n rob_curr = temp\n \n return rob_curr\n```\n时间复杂度: O(N)\n空间复杂度: O(1)\n\n\n\n\n\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3276687323","body":"dp[i] = 1 + max(dp[j]),其中 0 <= j < i 且 nums[j] < nums[i]。\n```python\nfrom typing import List\n\nclass Solution:\n def findNumberOfLIS(self, nums: List[int]) -> int:\n n = len(nums)\n if n <= 1:\n return n\n \n # lengths[i]: 以 nums[i] 结尾的 LIS 长度\n # counts[i]: 以 nums[i] 结尾的 LIS 个数\n lengths = [1] * n\n counts = [1] * n\n\n # 填充 DP 数组\n for i in range(n):\n for j in range(i):\n if nums[j] < nums[i]:\n # 情况一:发现更长的子序列\n if lengths[j] + 1 > lengths[i]:\n lengths[i] = lengths[j] + 1\n counts[i] = counts[j] # 路径数继承\n # 情况二:发现另一条同样长的子序列\n elif lengths[j] + 1 == lengths[i]:\n counts[i] += counts[j] # 路径数累加\n\n max_len = max(lengths)\n result = 0\n for i in range(n):\n if lengths[i] == max_len:\n result += counts[i]\n \n return result\n```\n时间复杂度: O(N^2)\n\n空间复杂度: O(N)\n\n","onTime":false},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3276694316","body":"dp[r][c] =骑士当前位于棋盘上 (r, c) 位置的概率\n从 (r, c) 出发,能为下一个状态 dp_curr 中的 (nr, nc) 贡献 dp_prev[r][c] / 8 的概率\ndp_curr[nr][nc]=\\sum dp(nr, nc)\n```python\nfrom typing import List\n\nclass Solution:\n def knightProbability(self, n: int, k: int, row: int, column: int) -> float:\n # dp[r][c] 表示骑士在 (r, c) 位置的概率\n dp = [[0.0] * n for _ in range(n)]\n dp[row][column] = 1.0\n \n # 骑士的8个移动方向\n moves = [(-2, -1), (-2, 1), (-1, -2), (-1, 2),\n (1, -2), (1, 2), (2, -1), (2, 1)]\n \n # 迭代 k 步\n for _ in range(k):\n # dp_next 用于存储下一步的概率分布\n dp_next = [[0.0] * n for _ in range(n)]\n \n # 遍历棋盘上所有位置\n for r in range(n):\n for c in range(n):\n # 如果当前位置有概率 > 0\n if dp[r][c] > 0:\n # 尝试8种移动\n for dr, dc in moves:\n nr, nc = r + dr, c + dc\n \n # 如果移动后的位置在棋盘内\n if 0 <= nr < n and 0 <= nc < n:\n # 将概率贡献给下一个状态\n dp_next[nr][nc] += dp[r][c] / 8.0\n \n # 用新状态覆盖旧状态\n dp = dp_next\n \n # 计算最终仍在棋盘上的总概率\n total_probability = sum(sum(row) for row in dp)\n return total_probability\n```\n时间复杂度 O(kn^2)\n空间复杂度: O(n^2)","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gjwang224":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3086564307","body":"## Code\n```cpp\nclass Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n int len = num.size()-1;\n vector returnNum;\n int tmp=0;\n \n while(k && len>=0){\n returnNum.push_back((num[len] + k%10 + tmp)%10);\n tmp = (num[len] + k%10 + tmp)/10;\n len--;\n k = k/10;\n }\n\n while(k){\n returnNum.push_back((k%10 + tmp)%10);\n tmp = (k%10 + tmp)/10;\n k = k/10;\n }\n \n while(len>=0){\n returnNum.push_back((num[len] + tmp)%10);\n tmp = (num[len] + tmp)/10;\n len--;\n }\n \n if(tmp) returnNum.push_back(tmp);\n reverse(returnNum.begin(), returnNum.end());\n return returnNum;\n }\n};","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3093190969","body":"#### C++\n``` C++\nclass Solution {\npublic:\n vector shortestToChar(string s, char c) {\n vector dis, rearr;\n for(int i = 0; i < s.size(); i++) if(s.at(i) == c) dis.push_back(i);\n for(int i = 0; i < s.size(); i++){\n int minn = 1e5+5;\n for(int j = 0; j < dis.size(); j++){\n minn = min(minn, abs(i-dis.at(j)));\n }\n rearr.push_back(minn);\n }\n return rearr;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3087031064","body":"### C++ 代码\n``` C++\nclass CustomStack {\npublic:\n int stack[1005];\n int size = -1, mS;\n CustomStack(int maxSize) {\n mS = maxSize;\n }\n \n void push(int x) {\n if(size < mS-1){\n stack[++size] = x;\n }\n }\n \n int pop() {\n if(size < 0) return -1;\n else return stack[size--];\n }\n \n void increment(int k, int val) {\n for(int i = 0; i < k; i++){\n stack[i] += val;\n }\n }\n};\n\n/**\n * Your CustomStack object will be instantiated and called as such:\n * CustomStack* obj = new CustomStack(maxSize);\n * obj->push(x);\n * int param_2 = obj->pop();\n * obj->increment(k,val);\n */\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3086899860","body":"### 思路 \n遍历整个字符串,总共有四种可能,分别是 数字 字母 左括号 右括号\n1. 数字:定义`digit`存储读取到的数字\n2. 字母:可以直接读取累加至`res`\n3. 左括号:需要将前面的`res`和`digit`分别入栈,并将其赋为0和”“\n4. 右括号:读取栈顶元素,循环拼接后,累加至`res`\n### C++ 代码\n``` C++\nclass Solution {\npublic:\n string decodeString(string s) {\n stack numStack;\n stack strStack;\n int digit=0;\n string res=\"\";\n\n for(int i = 0; i < s.size(); i++){\n if(s.at(i) >= '0' && s.at(i) <= '9'){// 数字\n digit = digit*10+s.at(i)-'0';\n } else if(s.at(i) >= 'a' && s.at(i) <= 'z'){// 字符\n res += s.at(i);\n } else if(s.at(i) == '['){// 左括号\n numStack.push(digit);\n strStack.push(res);\n res = \"\";\n digit=0;\n } else {// 右括号\n int count = numStack.top();\n numStack.pop();\n string outString = strStack.top();\n strStack.pop();\n for(int i = 0; i < count; i++) outString += res;\n res = outString;\n }\n }\n return res;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092046146","body":"#### 思路\n\n1. `push`和`empty`可以直接进行操作。\n2. `pop`和 `peek`需要得到入栈的第一个元素,可以使用一个辅助栈,对第一个栈进行出栈同时第二个栈进行入栈操作,这样第二个栈`top`得到的元素就是第一个栈入栈的第一个元素。\n\n``` C++\nclass MyQueue {\npublic:\n stack tmp;\n stack stack;\n MyQueue() {\n }\n \n void push(int x) {\n tmp.push(x);\n }\n \n int pop() {\n while(!tmp.empty()){\n stack.push(tmp.top());\n tmp.pop();\n }\n int a = stack.top();\n stack.pop();\n while(!stack.empty()){\n tmp.push(stack.top());\n stack.pop();\n }\n return a;\n }\n \n int peek() {\n while(!tmp.empty()){\n stack.push(tmp.top());\n tmp.pop();\n }\n int a = stack.top();\n while(!stack.empty()){\n tmp.push(stack.top());\n stack.pop();\n }\n return a;\n }\n \n bool empty() {\n return tmp.empty();\n }\n};\n\n/**\n * Your MyQueue object will be instantiated and called as such:\n * MyQueue* obj = new MyQueue();\n * obj->push(x);\n * int param_2 = obj->pop();\n * int param_3 = obj->peek();\n * bool param_4 = obj->empty();\n */\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094511890","body":"#### 哈希\n\n```c++\nclass Solution {\npublic:\n int maxChunksToSorted(vector& arr) {\n unordered_map ans;\n vector tmp = arr;\n sort(tmp.begin(), tmp.end());\n int cnt=0;\n for(int i = 0; i < arr.size(); i++){\n ans[arr[i]]++;\n ans[tmp[i]]--;\n if(ans[arr[i]]==0) ans.erase(arr[i]);\n if(ans[tmp[i]]==0) ans.erase(tmp[i]);\n if(ans.empty()) cnt++;\n }\n return cnt;\n }\n};\n```\n时间复杂度 nlog(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095832085","body":"#### 思路\n\n先将链表变为首尾相连循环链表,然后通过`k`找到断开位置的前一个元素,断开,返回头节点即可。\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * struct ListNode *next;\n * };\n */\nstruct ListNode* rotateRight(struct ListNode* head, int k) {\n if(head==NULL || k==0) return head;\n int len=1;\n struct ListNode * p=head;\n if(p) len=1;\n while(p->next){\n len++;\n p = p->next;\n }\n //printf(\"%d\\n\", len);\n p->next = head;\n k = k%len;\n for(int i = 0; i < len-k-1; i++){\n head = head->next;\n }\n p = head->next;\n head->next = NULL;\n return p;\n}\n```\n\n时间复杂度O(n)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3102195778","body":"#### C代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * struct ListNode *next;\n * };\n */\nstruct ListNode* swapPairs(struct ListNode* head) {\n //struct ListNode Node;\n //Node.next = head;\n //struct ListNode* tmp = &Node;\n struct ListNode* Node=(struct ListNode*)malloc(sizeof(struct ListNode));\n Node->next = head;\n struct ListNode* tmp = Node;\n while(tmp->next && tmp->next->next){\n struct ListNode* first = tmp->next;\n struct ListNode* second = tmp->next->next;\n tmp->next = second;\n first->next = second->next;\n second->next = first;\n tmp = first;\n }\n return Node->next;\n}\n```\n\n时间复杂度O(n)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3106692662","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode() : val(0), next(nullptr) {}\n * ListNode(int x) : val(x), next(nullptr) {}\n * ListNode(int x, ListNode *next) : val(x), next(next) {}\n * };\n */\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n TreeNode* sortedListToBST(ListNode* head) {\n if(head==NULL) return NULL;\n int n = 0;\n for(auto p=head; p; p=p->next){\n n++;\n }\n if(n==1) return new TreeNode(head->val);\n auto cur = head;\n for(int i = 0; i < n/2-1; i++) cur = cur->next;\n auto root = new TreeNode(cur->next->val);\n root->right = sortedListToBST(cur->next->next);\n cur->next = NULL;\n root->left = sortedListToBST(head);\n return root;\n }\n};\n```\n\n时间复杂度O(nlog(n))","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112024319","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode(int x) : val(x), next(NULL) {}\n * };\n */\nclass Solution {\npublic:\n ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {\n if(headA==NULL || headB==NULL) return NULL;\n ListNode *a = headA, *b = headB;\n while(a!=b){\n if(a == NULL) a = headB;\n a = a->next;\n if(b == NULL) b = headA;\n b = b->next;\n }\n return a;\n }\n};\n```\n\n时间复杂度O(n+m)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116982615","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode(int x) : val(x), next(NULL) {}\n * };\n */\nclass Solution {\npublic:\n ListNode *detectCycle(ListNode *head) {\n unordered_map visit;\n while(head){\n visit[head]++;\n if(visit[head]==2) return head;\n head=head->next;\n } \n return NULL;\n }\n};\n```\n\n时间复杂度O(n)\n\n空间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121297965","body":"#### C++代码\n\n- hash表: `unordered_map hash;`\n- 双向链表用来 将`Node` 根据 使用时间 进行排序。靠近左端表示最近使用,靠近右端表示较长时间没有使用。\n\n``` c\nclass LRUCache {\npublic:\n struct Node {\n int key, val;\n Node *prev, *next;\n Node(int _key, int _val): key(_key), val(_val), prev(NULL), next(NULL){}\n }*L, *R; //L头节点 R尾节点\n\n unordered_map hash;\n int n;\n\n void delete_node(Node *p){\n p->next->prev = p->prev;\n p->prev->next = p->next;\n }\n\n void insert_node(Node *p){ //链表头插入\n p->next = L->next;\n L->next->prev = p;\n p->prev = L;\n L->next = p;\n }\n\n LRUCache(int capacity) {\n n = capacity;\n L = new Node(-1, -1);\n R = new Node(-1, -1);\n L->next = R;\n R->prev = L;\n }\n \n int get(int key) {\n if(!hash.count(key)) return -1;\n else{\n auto p = hash[key];\n delete_node(p);\n insert_node(p);\n return p->val;\n }\n }\n \n void put(int key, int value) {\n if(!hash.count(key)){\n if(hash.size()==n){\n auto p = R->prev;\n delete_node(p);\n hash.erase(p->key);\n }\n auto p = new Node(key, value);\n hash[key] = p;\n insert_node(p);\n }else {\n auto p = hash[key];\n p->val = value;\n delete_node(p);\n insert_node(p);\n }\n }\n};\n\n/**\n * Your LRUCache object will be instantiated and called as such:\n * LRUCache* obj = new LRUCache(capacity);\n * int param_1 = obj->get(key);\n * obj->put(key,value);\n */\n```\n\n时间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124142122","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n int maxDepth(TreeNode* root) {\n if(root == NULL) return 0;\n return max(maxDepth(root->left), maxDepth(root->right)) + 1;\n }\n};\n```\n\n时间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125702334","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n bool isSameTree(TreeNode* p, TreeNode* q) {\n if(p==NULL && q==NULL) return true;\n else if(p==NULL && q!=NULL) return false;\n else if(p!=NULL && q==NULL) return false;\n else if(q->val != p->val) return false;\n else return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);\n }\n};\n```\n\n时间复杂度O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130752830","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n int dfs(TreeNode *root, int sum) {\n if(root == nullptr) return 0;\n int tmp = sum*10+root->val;\n if(root->left==nullptr && root->right==nullptr) return tmp;\n return dfs(root->left, tmp) + dfs(root->right, tmp);\n }\n int sumNumbers(TreeNode* root) {\n return dfs(root, 0);\n }\n};\n```\n\n时间复杂度O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135775890","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n void dfs(TreeNode* root, int height, int &curVal, int &curHeight){\n if(root==nullptr) return ;\n height++;\n dfs(root->left, height, curVal, curHeight);\n dfs(root->right, height, curVal, curHeight);\n if (height > curHeight) {\n curHeight = height;\n curVal = root->val;\n }\n }\n int findBottomLeftValue(TreeNode* root) {\n int curVal=0, curHeight=0;\n dfs(root, 0, curVal, curHeight);\n return curVal;\n }\n};\n```\n\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3139476046","body":"#### C++代码\n\n``` c\nclass Codec {\npublic:\n\n // Encodes a tree to a single string.\n void rserialize(TreeNode* root, string& str) {\n // 前序遍历(中左右,遇到空节点输入None),用逗号隔开\n if (root == NULL) str += \"None,\";\n else {\n str += to_string(root->val) + \",\";\n rserialize(root->left, str);\n rserialize(root->right, str);\n } \n }\n string serialize(TreeNode* root) {\n string ret;\n rserialize(root, ret);\n return ret;\n }\n\n // Decodes your encoded data to tree.\n\n TreeNode* rdeserialize(list& dataArray) {\n if(dataArray.front() == \"None\") {\n dataArray.erase(dataArray.begin());\n return NULL;\n }\n // 前序遍历(中左右)恢复树结构\n TreeNode* root = new TreeNode(stoi(dataArray.front()));\n dataArray.erase(dataArray.begin());\n root->left = rdeserialize(dataArray);\n root->right = rdeserialize(dataArray);\n return root;\n }\n\n TreeNode* deserialize(string data) {\n list dataArray;\n string str;\n // 添加各节点val\n // 按引用传递,按值传递会增加耗时\n for (auto& c : data) {\n if (c == ',') {\n // 以逗号作为节点分割\n dataArray.push_back(str);\n str.clear();\n } else {\n str.push_back(c);\n }\n }\n // 添加尾部节点val\n if (!str.empty()) {\n dataArray.push_back(str);\n str.clear();\n }\n return rdeserialize(dataArray);\n }\n};\n\n\n//参考链接:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/solutions/1536508/by-peaceful-thompsonfsu-8143/\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144061296","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n // 深度优先搜索函数 参数:当前节点、当前行号、当前列号、存储节点信息的map\n void dfs(TreeNode* node, int row, int col, map>>& colNodes) {\n // 若节点为空,直接返回\n if (node == nullptr) {\n return;\n }\n \n // 记录当前节点的信息:(行号, 值) 存入对应列的列表中\n colNodes[col].push_back({row, node->val});\n \n // 递归处理左子树:行号+1,列号-1\n dfs(node->left, row + 1, col - 1, colNodes);\n \n // 递归处理右子树:行号+1,列号+1\n dfs(node->right, row + 1, col + 1, colNodes);\n }\n\n // 自定义比较函数:用于对同一列的节点进行排序\n static bool compareNodes(const pair& a, const pair& b) {\n // 若行号相同,按节点值从小到大排序\n if (a.first == b.first) {\n return a.second < b.second;\n }\n // 否则按行号从小到大排序\n return a.first < b.first;\n }\n\n vector> verticalTraversal(TreeNode* root) {\n // 存储列号到节点信息的映射:key=列号,value=该列所有节点的(行号, 值)\n map>> colNodes;\n \n // 深度优先遍历树,记录每个节点的位置和值\n dfs(root, 0, 0, colNodes);\n \n // 最终结果容器\n vector> result;\n \n // 遍历每一列\n for (auto& entry : colNodes) {\n // 对当前列的节点按规则排序(使用自定义比较函数)\n sort(entry.second.begin(), entry.second.end(), compareNodes);\n \n // 提取排序后的节点值,组成当前列的结果\n vector colValues;\n for (auto& node : entry.second) {\n colValues.push_back(node.second); // node.second是节点值\n }\n result.push_back(colValues);\n }\n \n return result;\n }\n};\n\n//参考链接:https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/solutions/3739810/dui-wo-lai-shuo-huan-shi-fu-za-liao-xie-iar46/\n\n```\n\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146382948","body":"#### C++代码\n\n``` c\nclass Solution {\npublic:\n vector twoSum(vector& nums, int target) {\n unordered_map hash;\n for(int i = 0; i < nums.size(); i++){\n auto iter = hash.find(target-nums[i]);\n if(iter != hash.end()) return {iter->second, i};\n hash[nums[i]] = i;\n }\n return {};\n }\n};\n```\n\n时间复杂度:O(n)\n\n空间复杂度:O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148379333","body":"#### C++\n\n``` c\nclass Solution {\npublic:\n vector topKFrequent(vector& nums, int k) {\n vector ans;\n unordered_map f;\n for(int i = 0;i < nums.size();i++) {\n f[nums[i]]++;\n }\n priority_queue, vector >, greater > > q;\n for(auto& [num, count] : f) {\n if(q.size() < k)\n q.push({count, num});\n else {\n if(q.top().first < count) {\n q.pop();\n q.push({count, num});\n }\n }\n }\n while(!q.empty()) {\n //cout<>& points) {\n int result=0;\n for(vector P : points){\n unordered_map map;\n for(vector Q : points){\n int dis = (P[0]-Q[0])*(P[0]-Q[0])+(P[1]-Q[1])*(P[1]-Q[1]);\n map[dis]++;\n }\n for(auto [a,b] : map){\n result+=b*(b-1);\n }\n }\n return result;\n }\n};\n```\n\n时间复杂度:O(n2)\n空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3154861022","body":"``` c\nclass Solution {\npublic:\n int lengthOfLongestSubstring(string s) {\n unordered_map dic;\n int i = -1, res = 0, len = s.size();\n for(int j = 0; j < len; j++) {\n if (dic.find(s[j]) != dic.end())\n i = max(i, dic.find(s[j])->second);\n dic[s[j]] = j;\n res = max(res, j - i);\n }\n return res;\n }\n};\n```\n\n时间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3158408178","body":"\n\n``` c\nclass Solution {\npublic:\n vector findSubstring(string s, vector& words) {\n unordered_map hash;\n vector res;\n int n = s.length(), m = words.size();\n if (n == 0 || m == 0)\n return res;\n int len = words[0].length(), end = n - m * len;\n if (n < m * len)\n return res;\n for (auto word : words)\n hash[word]++;\n int size = hash.size();\n for (int k = 0; k < len; k++) {\n unordered_map cur_hash;\n int satisfy = 0;\n for (int i = k, j = k; j <= n - len;) {\n string cur = s.substr(j, len);\n if (hash.find(cur) == hash.end()) {\n j = j + len;\n i = j;\n cur_hash.clear();\n satisfy = 0;\n } else {\n cur_hash[cur]++;\n if (cur_hash[cur] == hash[cur])\n satisfy++;\n else if (cur_hash[cur] > hash[cur]) {\n while (i < j && cur_hash[cur] > hash[cur]) {\n string temp = s.substr(i, len);\n i += len;\n cur_hash[temp]--;\n if (cur_hash[temp] == hash[temp] - 1)\n satisfy--;\n }\n }\n if (satisfy == size) {\n string temp = s.substr(i, len);\n cur_hash[temp]--;\n satisfy--;\n res.push_back(i);\n i = i + len;\n }\n j = j + len;\n }\n }\n }\n return res;\n }\n};\n```\n\n时间复杂度O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3163210992","body":"\n\n``` c\nclass Solution {\npublic:\n int minSubarray(vector &nums, int p) {\n int n = nums.size(), s[n + 1];\n s[0] = 0;\n for (int i = 0; i < n; i++) s[i + 1] = (s[i] + nums[i]) % p;\n int x = s[n];\n\n int ans = n;\n unordered_map last;\n for (int i = 0; i <= n; ++i) {\n last[s[i]] = i;\n auto it = last.find((s[i] - x + p) % p);\n if (it != last.end()) {\n ans = min(ans, i - it->second);\n }\n }\n return ans < n ? ans : -1;\n }\n};\n```\n\n时间复杂度O(n)\n空间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3167368429","body":"\n\n``` c\nclass Solution {\npublic:\n ListNode* middleNode(ListNode* head) {\n int len = 0;\n ListNode* p = head;\n while (p != nullptr) {\n len++;\n p = p->next;\n }\n int k = 0;\n p = head;\n while (k < len / 2) {\n k++;\n p = p->next;\n }\n return p;\n }\n};\n```\n\n时间复杂度O(n)\n空间复杂度O(1)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169793378","body":"```c\nclass Solution {\npublic:\n int removeDuplicates(vector& nums) {\n if (nums.empty()) {\n return 0;\n }\n int slow = 0;\n for (int fast = 1; fast < nums.size(); fast++) {\n if (nums[fast] != nums[slow]) {\n slow++;\n nums[slow] = nums[fast];\n }\n }\n return slow + 1;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172513759","body":"```c\n\nclass Solution {\npublic:\n int searchInsert(vector& nums, int target) {\n int n = nums.size();\n int left = 0, right = n - 1, ans = n;\n while (left <= right) {\n int mid = ((right - left) / 2) + left;\n if (target <= nums[mid]) {\n ans = mid;\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n return ans;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173606055","body":"```c\nclass Solution {\npublic:\n vector maxSlidingWindow(vector& nums, int k) {\n if(nums.size() == 0 || k == 0) return {};\n deque deque;\n vector res(nums.size() - k + 1);\n for(int j = 0, i = 1 - k; j < nums.size(); i++, j++) {\n if(i > 0 && deque.front() == nums[i - 1])\n deque.pop_front();\n while(!deque.empty() && deque.back() < nums[j])\n deque.pop_back();\n deque.push_back(nums[j]);\n if(i >= 0)\n res[i] = deque.front();\n }\n return res;\n }\n }\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178242802","body":"```c\nclass Solution {\npublic:\n int findJudge(int n, vector>& trust) {\n vector inDegrees(n + 1);\n vector outDegrees(n + 1);\n for (auto& edge : trust) {\n int x = edge[0], y = edge[1];\n ++inDegrees[y];\n ++outDegrees[x];\n }\n for (int i = 1; i <= n; ++i) {\n if (inDegrees[i] == n - 1 && outDegrees[i] == 0) {\n return i;\n }\n }\n return -1;\n }\n};\n\n```","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3213208919","body":"```C++\nclass Solution {\npublic:\n bool judgeCircle(string moves) {\n int R=0,L=0,U=0,D=0;\n for(int i = 0; i < moves.size(); i++){\n if(moves[i]=='R') R++;\n if(moves[i]=='L') L++;\n if(moves[i]=='U') U++;\n if(moves[i]=='D') D++;\n }\n if(R==L&&U==D) return true;\n else return false;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193632408","body":"```c\n\nclass Solution {\npublic:\n vector getOrder(vector>& tasks) {\n long now = 0; \n priority_queue, vector>, greater> >entry, ready;\n int size = tasks.size();\n\n for (int i = 0; i < size; ++i){\n entry.push(make_pair(tasks[i][0], i));\n }\n\n vector res;\n while(!entry.empty() or !ready.empty()){\n if (ready.empty()){\n now = entry.top().first;\n while (!entry.empty() && now == entry.top().first){ \n ready.push(make_pair(tasks[entry.top().second][1], entry.top().second));\n entry.pop();\n }\n }\n res.emplace_back(ready.top().second);\n now += ready.top().first;\n ready.pop();\n\n while(!entry.empty() && entry.top().first <= now){ \n ready.push(make_pair(tasks[entry.top().second][1], entry.top().second));\n entry.pop();\n }\n }\n\n return res;\n }\n};\n\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3213243204","body":"```C++\nclass Solution {\npublic:\n int numberOfRounds(string startTime, string finishTime) {\n // 转化为分钟\n int t0 = 60 * stoi(startTime.substr(0, 2)) + stoi(startTime.substr(3, 2));\n int t1 = 60 * stoi(finishTime.substr(0, 2)) + stoi(finishTime.substr(3, 2));\n if (t1 < t0){\n t1 += 1440;\n }\n // 第一个小于等于 finishTime 的完整对局的结束时间\n t1 = t1 / 15 * 15;\n return max(0, (t1 - t0)) / 15;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3213232703","body":"```C++\nclass Solution {\npublic:\n int minCharacters(string a, string b) {\n int n = a.size(), m = b.size();\n vector cntA(26, 0), cntB(26, 0);\n for (char c : a)\n ++cntA[c - 'a'];\n for (char c : b)\n ++cntB[c - 'a'];\n\n // 计算前缀和\n vector preA(27, 0), preB(27, 0);\n for (int i = 0; i < 26; ++i) {\n preA[i + 1] = preA[i] + cntA[i];\n preB[i + 1] = preB[i] + cntB[i];\n }\n\n int ans = INT_MAX;\n\n // 条件 1\n for (int k = 1; k < 26; ++k) {\n int costA = n - preA[k];\n int costB = preB[k];\n ans = min(ans, costA + costB);\n }\n\n // 条件 2\n for (int k = 0; k < 25; ++k) {\n int costA = preA[k + 1];\n int costB = m - preB[k + 1];\n ans = min(ans, costA + costB);\n }\n\n // 条件 3\n for (int ch = 0; ch < 26; ++ch) {\n int costA = n - cntA[ch];\n int costB = m - cntB[ch];\n ans = min(ans, costA + costB);\n }\n\n return ans;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3213189716","body":"```c++\nclass Solution {\npublic:\n vector sortArray(vector& nums) {\n if (nums.empty()) return nums;\n quickSort(nums, 0, static_cast(nums.size()) - 1);\n return nums;\n }\n\nprivate:\n void quickSort(vector& nums, int l, int r) {\n if (l >= r) return;\n int p = partition(nums, l, r);\n quickSort(nums, l, p - 1);\n quickSort(nums, p + 1, r);\n }\n\n int partition(vector& nums, int l, int r) {\n int idx = l + rand() % (r - l + 1);\n swap(nums[idx], nums[r]);\n int pivot = nums[r];\n\n int i = l - 1;\n for (int j = l; j < r; ++j) {\n if (nums[j] < pivot) {\n ++i;\n swap(nums[i], nums[j]);\n }\n }\n swap(nums[i + 1], nums[r]);\n return i + 1;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3213176894","body":"```c++\nclass Solution {\npublic:\n int mySqrt(int x) {\n int l = 0, r = x, ans=0;\n while(l<=r){\n int mid = l + (r-l)/2;\n if((long long)mid*mid<=x){\n ans = mid;\n l = mid+1;\n } else{\n //ans = mid;\n r = mid-1;\n }\n \n }\n return ans;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3213126368","body":"```c++\nclass Solution {\npublic:\n int firstBadVersion(int n) {\n int l = 1, r = n;\n while(l w;\n\n int reversePairs(vector& nums) {\n return merge_sort(nums, 0, nums.size()-1);\n }\n\n int merge_sort(vector &nums, int l, int r) {\n if(l>=r) return 0;\n int mid = l+r>>1;\n int res = merge_sort(nums, l, mid) + merge_sort(nums, mid+1, r);\n for(int i = l, j = mid+1; i <= mid; i++){\n while(j<=r && nums[j]*2ll& houses, vector& heaters) {\n for (int i = 0, j = 0; i < houses.size(); i ++ ) {\n while (j < heaters.size() && abs(heaters[j] - houses[i]) > mid)\n j ++ ;\n if (j >= heaters.size()) return false;\n }\n return true;\n }\n\n int findRadius(vector& houses, vector& heaters) {\n sort(houses.begin(), houses.end());\n sort(heaters.begin(), heaters.end());\n int l = 0, r = INT_MAX;\n while (l < r) {\n int mid = (long long)l + r >> 1;\n if (check(mid, houses, heaters)) r = mid;\n else l = mid + 1;\n }\n return r;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217486441","body":"```C++\nclass Solution {\npublic:\n bool check(vector& nums,int n,int k,int mid)\n {\n int cnt = 0;\n for(int i = 0,j = 1; i < n - 1 ; i ++)\n {\n while(j < n && nums[j] - nums[i] <= mid)\n j ++;\n cnt += j - i - 1;\n j = max(j,i + 1);\n }\n return cnt >= k;\n }\n int smallestDistancePair(vector& nums, int k)\n {\n int n = nums.size();\n sort(nums.begin(),nums.end());\n int left = 0,right = nums[n - 1] - nums[0];\n while(left < right)\n {\n int mid = (left + right) >> 1;\n if(check(nums,n,k,mid)) right = mid;\n else left = mid + 1;\n }\n return left;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3219872784","body":"```C++\nclass Solution {\npublic:\n int swimInWater(vector>& grid) {\n int m = grid.size(), n = grid[0].size();\n vector> dis(m, vector(n, INT_MAX));\n dis[0][0] = grid[0][0];\n vector> dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};\n priority_queue, vector>, greater<>> pq;\n pq.emplace(grid[0][0], 0, 0);\n while (!pq.empty()) {\n auto [d, x, y] = pq.top();\n pq.pop();\n if (x == m - 1 && y == n - 1) {\n return d;\n }\n if (d > dis[x][y]) {\n continue;\n }\n for (auto& dir : dirs) {\n int nx = x + dir[0], ny = y + dir[1];\n if (nx >= 0 && nx < m && ny >= 0 && ny < n) {\n int nd = max(d, grid[nx][ny]);\n if (nd < dis[nx][ny] ) {\n dis[nx][ny] = nd;\n pq.emplace(nd, nx, ny);\n }\n }\n }\n }\n return -1;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3223228330","body":"```C++\nclass Solution {\npublic:\n bool pd(char a){\n if(a == 'a'||a == 'e'||a == 'i'||a == 'o'||a == 'u') return true;\n return false;\n }\n int maxVowels(string s, int k) {\n int count = 0, cnt=0;\n int l = 0, r = k-1;\n for(int i = 0; i <= r; i++) if(pd(s.at(i))) count++;\n cnt = count;\n if(s.size() == k) return count;\n while(++r != s.size()){\n if(pd(s.at(l))) count--;\n if(pd(s.at(r))) count++;\n l++;\n cnt = max(cnt, count);\n }\n return cnt;\n }\n};\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243929010","body":"```C++\nclass Solution {\npublic:\n int getArea(vector>& grid, int i, int j) {\n if (i == grid.size() || i < 0)\n return 0;\n else if (j == grid[0].size() || j < 0)\n return 0;\n if (grid[i][j] == 1) {\n grid[i][j] = 0;\n return 1 + getArea(grid, i + 1, j) + getArea(grid, i - 1, j) +\n getArea(grid, i, j + 1) + getArea(grid, i, j - 1);\n }\n return 0;\n }\n int maxAreaOfIsland(vector>& grid) {\n int maxArea = 0;\n int area = 0;\n for (int i = 0; i < grid.size(); i++) {\n for (int j = 0; j < grid[0].size(); j++) {\n if (grid[i][j] == 1) {\n area = getArea(grid, i, j);\n maxArea = maxArea > area ? maxArea : area;\n }\n }\n }\n return maxArea;\n }\n};\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3268602696","body":"```C++\nclass Solution {\npublic:\n int longestCommonSubsequence(string text1, string text2) {\n int n = (int)text1.size(), m = (int)text2.size();\n vector dp(m + 1, 0);\n for (int i = 1; i <= n; ++i) {\n int prev = 0; // 相当于 dp[i-1][j-1]\n for (int j = 1; j <= m; ++j) {\n int tmp = dp[j];\n if (text1[i - 1] == text2[j - 1]) dp[j] = prev + 1;\n else dp[j] = max(dp[j], dp[j - 1]);\n prev = tmp;\n }\n }\n return dp[m];\n }\n};\n\n```\n时间复杂度O(n*m)\n空间复杂度O(min(n,m))","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290572491","body":"```C++\nclass Solution {\npublic:\n int coinChange(vector& coins, int amount) {\n vector dp(amount+1,INT_MAX);\n dp[0]=0;\n for(int i=0;i Date: Thu, 2 Oct 2025 03:02:10 +0000 Subject: [PATCH 34/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From 6f96913003fa6693be147289827c223df2efcfd9 Mon Sep 17 00:00:00 2001 From: robot Date: Thu, 2 Oct 2025 03:26:18 +0000 Subject: [PATCH 35/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index 8ad4b8d8bd..bbd485efb2 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759373622704,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759373622784},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759375578327,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759375578410},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From c4a336b2822648934467e6c7cd14a03754d2d50c Mon Sep 17 00:00:00 2001 From: robot Date: Thu, 2 Oct 2025 03:33:30 +0000 Subject: [PATCH 36/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From fb866be1baa5a86d32b50983d771614c2296b2c9 Mon Sep 17 00:00:00 2001 From: robot Date: Thu, 2 Oct 2025 04:17:07 +0000 Subject: [PATCH 37/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index bbd485efb2..c43065f3fd 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759375578327,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759375578410},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759378627821,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759378627906},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From ab73d6efc0fc9f0e13d869e4adcadf84546d677a Mon Sep 17 00:00:00 2001 From: robot Date: Thu, 2 Oct 2025 04:29:38 +0000 Subject: [PATCH 38/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From f9a2431718c1d93fcb7e0237e3ab85d366bb6466 Mon Sep 17 00:00:00 2001 From: robot Date: Thu, 2 Oct 2025 05:13:58 +0000 Subject: [PATCH 39/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index c43065f3fd..86195fcdba 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759378627821,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759378627906},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759382038107,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759382038190},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From a544c33cb7b96ac1466179b14672f176655e1bc1 Mon Sep 17 00:00:00 2001 From: robot Date: Thu, 2 Oct 2025 05:25:08 +0000 Subject: [PATCH 40/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From e622a5fd9a870435e025a8427a8b40d2e9394783 Mon Sep 17 00:00:00 2001 From: robot Date: Thu, 2 Oct 2025 06:22:41 +0000 Subject: [PATCH 41/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index 86195fcdba..0339f3a710 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759382038107,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759382038190},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759386161204,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759386161287},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From aad77c956488e109c69f62d1c91bfea7a0906ebb Mon Sep 17 00:00:00 2001 From: robot Date: Thu, 2 Oct 2025 06:37:14 +0000 Subject: [PATCH 42/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From 272257a843ce01b9152006b07092beabad4a1b4e Mon Sep 17 00:00:00 2001 From: robot Date: Thu, 2 Oct 2025 07:14:20 +0000 Subject: [PATCH 43/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index 0339f3a710..282fd26246 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759386161204,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759386161287},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759389260421,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759389260507},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From 91be0febb0a8c659a8892a725af7394035342e9b Mon Sep 17 00:00:00 2001 From: robot Date: Thu, 2 Oct 2025 07:24:15 +0000 Subject: [PATCH 44/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From a7d518fe2a840d445fdc93bde8a0a2309cd9176a Mon Sep 17 00:00:00 2001 From: robot Date: Thu, 2 Oct 2025 08:19:35 +0000 Subject: [PATCH 45/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++++++--------------------- static/meta.json | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e438e15d6..7ef18fde10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,97 +20,6 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - } } }, "@koa/cors": { @@ -3658,6 +3567,36 @@ "strip-ansi": "^7.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3681,6 +3620,21 @@ "ansi-regex": "^6.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4161,6 +4115,67 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/static/meta.json b/static/meta.json index 282fd26246..a21f0a9781 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759389260421,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759389260507},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759393175164,"lastFulllyUpdateTime":1759338822062},"checkIn":{"lastUpdateTime":1759393175247},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file From 37de3cf3b4e5efec27e40c65b5c906dd9d5c0c23 Mon Sep 17 00:00:00 2001 From: robot Date: Thu, 2 Oct 2025 08:33:24 +0000 Subject: [PATCH 46/46] commit automatically --- package-lock.json | 197 +++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef18fde10..6e438e15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,97 @@ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + } } }, "@koa/cors": { @@ -3567,36 +3658,6 @@ "strip-ansi": "^7.0.1" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3620,21 +3681,6 @@ "ansi-regex": "^6.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4115,67 +4161,6 @@ } } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",